pfrpg_tables 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/lib/pfrpg_tables/tables/attribute_modifier.rb +5 -0
- data/lib/pfrpg_tables/tables/attributes.rb +13 -0
- data/lib/pfrpg_tables/tables/bonus.rb +17 -0
- data/lib/pfrpg_tables/tables/equipment_totaler.rb +14 -0
- data/lib/pfrpg_tables/tables/feat_options.rb +28 -0
- data/lib/pfrpg_tables/tables/feat_totaler.rb +61 -0
- data/lib/pfrpg_tables/tables/feature_totaler.rb +86 -0
- data/lib/pfrpg_tables/tables/heroclasses/alchemist.rb +189 -0
- data/lib/pfrpg_tables/tables/heroclasses/arcane_archer.rb +98 -0
- data/lib/pfrpg_tables/tables/heroclasses/arcane_trickster.rb +89 -0
- data/lib/pfrpg_tables/tables/heroclasses/assassin.rb +79 -0
- data/lib/pfrpg_tables/tables/heroclasses/barbarian.rb +171 -0
- data/lib/pfrpg_tables/tables/heroclasses/bard.rb +190 -0
- data/lib/pfrpg_tables/tables/heroclasses/cavalier.rb +189 -0
- data/lib/pfrpg_tables/tables/heroclasses/cleric.rb +186 -0
- data/lib/pfrpg_tables/tables/heroclasses/dragon_disciple.rb +92 -0
- data/lib/pfrpg_tables/tables/heroclasses/druid.rb +190 -0
- data/lib/pfrpg_tables/tables/heroclasses/duelist.rb +79 -0
- data/lib/pfrpg_tables/tables/heroclasses/eldritch_knight.rb +86 -0
- data/lib/pfrpg_tables/tables/heroclasses/fighter.rb +170 -0
- data/lib/pfrpg_tables/tables/heroclasses/gunslinger.rb +189 -0
- data/lib/pfrpg_tables/tables/heroclasses/inquisitor.rb +189 -0
- data/lib/pfrpg_tables/tables/heroclasses/loremaster.rb +112 -0
- data/lib/pfrpg_tables/tables/heroclasses/magus.rb +189 -0
- data/lib/pfrpg_tables/tables/heroclasses/monk.rb +202 -0
- data/lib/pfrpg_tables/tables/heroclasses/mystic_theurge.rb +89 -0
- data/lib/pfrpg_tables/tables/heroclasses/oracle.rb +189 -0
- data/lib/pfrpg_tables/tables/heroclasses/paladin.rb +188 -0
- data/lib/pfrpg_tables/tables/heroclasses/pathfinder_chronicler.rb +79 -0
- data/lib/pfrpg_tables/tables/heroclasses/ranger.rb +313 -0
- data/lib/pfrpg_tables/tables/heroclasses/rogue.rb +168 -0
- data/lib/pfrpg_tables/tables/heroclasses/shadowdancer.rb +82 -0
- data/lib/pfrpg_tables/tables/heroclasses/sorcerer.rb +169 -0
- data/lib/pfrpg_tables/tables/heroclasses/summoner.rb +189 -0
- data/lib/pfrpg_tables/tables/heroclasses/witch.rb +189 -0
- data/lib/pfrpg_tables/tables/heroclasses/wizard.rb +189 -0
- data/lib/pfrpg_tables/tables/heroclasses.rb +4 -0
- data/lib/pfrpg_tables/tables/languages.rb +53 -0
- data/lib/pfrpg_tables/tables/level_table.rb +195 -0
- data/lib/pfrpg_tables/tables/size.rb +25 -0
- data/lib/pfrpg_tables/tables/spells/spells_per_day.rb +239 -0
- data/lib/pfrpg_tables/tables/spells.rb +28 -0
- data/lib/pfrpg_tables/tables/weapons.rb +57 -0
- data/lib/pfrpg_tables/tables.rb +10 -0
- data/lib/pfrpg_tables/version.rb +3 -0
- data/lib/pfrpg_tables.rb +8 -0
- metadata +117 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: e719c0706c1aa057990b6af96f56e8061f568447
|
4
|
+
data.tar.gz: f6468ed7d32eeb77efe442198f7168987f6e0171
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 6a7fbe01f62311a0fdd9e1dc1328e5972150330850ff4dd22333111397287b8a6c2c94f005178f30b401f0312f437ed13c1a3b761271ed82300c33da34922736
|
7
|
+
data.tar.gz: 0e52520f211256b2adcd70673347ca73260decab85379813e714d1bbc601c3c587c12c139ad87ffbd4dd84f2863b30db05f0c69d7dfe70e7f92939751357c4a2
|
@@ -0,0 +1,13 @@
|
|
1
|
+
class PfrpgTables::Tables::Attributes
|
2
|
+
def self.attributes
|
3
|
+
["STR", "DEX", "WIS", "CON", "CHA", "INT"]
|
4
|
+
end
|
5
|
+
|
6
|
+
def self.attributes_lower
|
7
|
+
attributes.map { |x| x.downcase }
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.valid_attribute?(attr)
|
11
|
+
attributes_lower.find { |x| x == attr }
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
class PfrpgTables::Tables::Bonus
|
2
|
+
def self.stackable?(bonus_name)
|
3
|
+
stackable.find { |x| x == bonus_name }
|
4
|
+
end
|
5
|
+
|
6
|
+
def self.special?(bonus_name)
|
7
|
+
special.find { |x| x == bonus_name }
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.stackable
|
11
|
+
["dodge", "initiative"]
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.special
|
15
|
+
["speed", 'damage_reduction', 'class_skill']
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
class PfrpgTables::Tables::FeatOptions
|
2
|
+
def self.get(special_type)
|
3
|
+
case special_type
|
4
|
+
when "weapons"
|
5
|
+
Weapon.all_weapon_types
|
6
|
+
when "simple_weapons"
|
7
|
+
Weapon.weapon_types('simple')
|
8
|
+
when "martial_weapons"
|
9
|
+
Weapon.weapon_types('martial')
|
10
|
+
when 'exotic_weapons'
|
11
|
+
Weapon.weapon_types('exotic')
|
12
|
+
when "magic_schools"
|
13
|
+
[
|
14
|
+
"Abjuration",
|
15
|
+
'Conjuration',
|
16
|
+
'Divination',
|
17
|
+
'Enchantment',
|
18
|
+
'Evocation',
|
19
|
+
'Illusion',
|
20
|
+
'Necromancy',
|
21
|
+
'Transmutation',
|
22
|
+
'Universalist'
|
23
|
+
]
|
24
|
+
when 'skills'
|
25
|
+
Skill.skill_list.map { |x| x.description }
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
module PfrpgTables
|
2
|
+
class FeatTotaler
|
3
|
+
attr_reader :entity, :levels
|
4
|
+
def initialize(entity)
|
5
|
+
@entity = entity
|
6
|
+
@levels = PfrpgCore::LevelParser.new(entity.level)
|
7
|
+
end
|
8
|
+
|
9
|
+
def total
|
10
|
+
return level_granted + race_granted + feature_granted + choice_granted
|
11
|
+
end
|
12
|
+
|
13
|
+
def level_granted
|
14
|
+
i = (1..levels.total).inject(0) do |sum, x|
|
15
|
+
choices = Tables::LevelTable.for_level(x)[:choices]
|
16
|
+
sum = sum + (choices.select { |c| choice_is_feat(c) }).size
|
17
|
+
end
|
18
|
+
return i
|
19
|
+
end
|
20
|
+
|
21
|
+
def race_granted
|
22
|
+
i = entity.race.bonus_choices.inject(0) do |sum, x|
|
23
|
+
sum = sum + 1 if choice_is_feat(x)
|
24
|
+
end
|
25
|
+
return i
|
26
|
+
end
|
27
|
+
|
28
|
+
def feature_granted
|
29
|
+
i = entity.class_features.inject(0) do |sum, x|
|
30
|
+
if x.respond_to? 'granted_choice'
|
31
|
+
choices = [x.granted_choice].flatten
|
32
|
+
sum += (choices.select { |c| choice_is_feat(c) }).size
|
33
|
+
end
|
34
|
+
end
|
35
|
+
return i || 0
|
36
|
+
end
|
37
|
+
|
38
|
+
def choice_granted
|
39
|
+
choices = []
|
40
|
+
lvls = @levels.parse
|
41
|
+
lvls.keys.each do |hc|
|
42
|
+
clazz = Heroclass.by_name(hc)
|
43
|
+
level = lvls[hc]
|
44
|
+
(1..level).each do |l|
|
45
|
+
clazz.bonuses_for_level(l)[:choices].each do |choice|
|
46
|
+
if (choice_is_feat(choice))
|
47
|
+
choice.npc_id = entity.id
|
48
|
+
choices << choice
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
@choose_features = choices.flatten.size
|
54
|
+
end
|
55
|
+
|
56
|
+
def choice_is_feat(choice)
|
57
|
+
choice.class.to_s['Feat'] != nil
|
58
|
+
end
|
59
|
+
|
60
|
+
end
|
61
|
+
end
|
@@ -0,0 +1,86 @@
|
|
1
|
+
module PfrpgTables
|
2
|
+
class FeatureTotaler
|
3
|
+
attr_reader :entity, :levels
|
4
|
+
def initialize(entity)
|
5
|
+
@entity = entity
|
6
|
+
@levels = PfrpgCore::LevelParser.new(entity.level)
|
7
|
+
@base_features = []
|
8
|
+
@choose_features = []
|
9
|
+
parse_features
|
10
|
+
end
|
11
|
+
|
12
|
+
def get_base_features
|
13
|
+
@base_features
|
14
|
+
end
|
15
|
+
|
16
|
+
def get_choose_features
|
17
|
+
@choose_features
|
18
|
+
end
|
19
|
+
|
20
|
+
def parse_features
|
21
|
+
choices = []
|
22
|
+
lvls = levels.parse
|
23
|
+
lvls.keys.each do |hc|
|
24
|
+
clazz = Heroclass.by_name(hc)
|
25
|
+
level = lvls[hc]
|
26
|
+
(1..level).each do |l|
|
27
|
+
class_features = clazz.bonuses_for_level(l)[:granted_features]
|
28
|
+
class_features.each do |x|
|
29
|
+
ap "Creating granted feature:"
|
30
|
+
ap "\t#{x} (#{hc})"
|
31
|
+
@base_features << ClassFeature.granted_feature(x, hc)
|
32
|
+
end
|
33
|
+
clazz.bonuses_for_level(l)[:choices].each do |choice|
|
34
|
+
if !(choice_is_feat(choice))
|
35
|
+
choice.npc_id = entity.id
|
36
|
+
choices << flatten_options(choice)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
@choose_features = choices.flatten
|
42
|
+
end
|
43
|
+
|
44
|
+
def flatten_options(feature_choice)
|
45
|
+
ap "feature chioce:"
|
46
|
+
ap feature_choice.choices[:options][0]
|
47
|
+
if feature_choice.choices[:options][0].respond_to? 'name'
|
48
|
+
new_options = feature_choice.choices[:options].map { |x| x.name }
|
49
|
+
ap "New options:"
|
50
|
+
ap new_options
|
51
|
+
feature_choice.choices[:options] = new_options
|
52
|
+
end
|
53
|
+
return feature_choice
|
54
|
+
end
|
55
|
+
|
56
|
+
def level_granted
|
57
|
+
i = (1..levels.total).inject(0) do |sum, x|
|
58
|
+
choices = Tables::LevelTable.for_level(x)[:choices]
|
59
|
+
sum = sum + (choices.select { |c| choice_is_feat(c) }).size
|
60
|
+
end
|
61
|
+
return i
|
62
|
+
end
|
63
|
+
|
64
|
+
def race_granted
|
65
|
+
race = PfrpgRaces::Race.fetch(entity.race)
|
66
|
+
i = race.bonus_choices.inject(0) do |sum, x|
|
67
|
+
sum = sum + 1 if choice_is_feat(x)
|
68
|
+
end
|
69
|
+
return i
|
70
|
+
end
|
71
|
+
|
72
|
+
def feature_granted
|
73
|
+
i = entity.class_features.inject(0) do |sum, x|
|
74
|
+
choices = x.bonus_choices
|
75
|
+
sum += (choices.select { |c| choice_is_feat(c) }).size
|
76
|
+
end
|
77
|
+
return i
|
78
|
+
end
|
79
|
+
|
80
|
+
def choice_is_feat(choice)
|
81
|
+
choice.class.to_s['Feat'] != nil
|
82
|
+
end
|
83
|
+
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
@@ -0,0 +1,189 @@
|
|
1
|
+
class PfrpgTables::Tables::Heroclasses::Wizard
|
2
|
+
def self.level_bonus(level)
|
3
|
+
bonus = nil
|
4
|
+
case level
|
5
|
+
when 1
|
6
|
+
bonus = { :base_attack_bonus => [0],
|
7
|
+
:fort_save => 0,
|
8
|
+
:ref_save => 0,
|
9
|
+
:will_save => 2,
|
10
|
+
:choices => [ ChooseArcaneBond.new, ChooseArcaneSchool.new ],
|
11
|
+
:granted_features => ["cantrips", "scribe_spell"]
|
12
|
+
}
|
13
|
+
when 2
|
14
|
+
bonus = { :base_attack_bonus => [1],
|
15
|
+
:fort_save => 0,
|
16
|
+
:ref_save => 0,
|
17
|
+
:will_save => 3,
|
18
|
+
:choices => [],
|
19
|
+
:granted_features => []
|
20
|
+
}
|
21
|
+
when 3
|
22
|
+
bonus = { :base_attack_bonus => [1],
|
23
|
+
:fort_save => 1,
|
24
|
+
:ref_save => 1,
|
25
|
+
:will_save => 3,
|
26
|
+
:choices => [],
|
27
|
+
:granted_features => []
|
28
|
+
}
|
29
|
+
when 4
|
30
|
+
bonus = { :base_attack_bonus => [2],
|
31
|
+
:fort_save => 1,
|
32
|
+
:ref_save => 1,
|
33
|
+
:will_save => 4,
|
34
|
+
:choices => [],
|
35
|
+
:granted_features => []
|
36
|
+
}
|
37
|
+
when 5
|
38
|
+
bonus = { :base_attack_bonus => [2],
|
39
|
+
:fort_save => 1,
|
40
|
+
:ref_save => 1,
|
41
|
+
:will_save => 4,
|
42
|
+
:choices => [ ChooseWizardBonusFeat.new],
|
43
|
+
:granted_features => []
|
44
|
+
}
|
45
|
+
when 6
|
46
|
+
bonus = { :base_attack_bonus => [3],
|
47
|
+
:fort_save => 2,
|
48
|
+
:ref_save => 2,
|
49
|
+
:will_save => 5,
|
50
|
+
:choices => [],
|
51
|
+
:granted_features => []
|
52
|
+
}
|
53
|
+
when 7
|
54
|
+
bonus = { :base_attack_bonus => [3],
|
55
|
+
:fort_save => 2,
|
56
|
+
:ref_save => 2,
|
57
|
+
:will_save => 5,
|
58
|
+
:granted_features => [],
|
59
|
+
:choices => []
|
60
|
+
}
|
61
|
+
when 8
|
62
|
+
bonus = { :base_attack_bonus => [4],
|
63
|
+
:fort_save => 2,
|
64
|
+
:ref_save => 2,
|
65
|
+
:will_save => 6,
|
66
|
+
:granted_features => [],
|
67
|
+
:choices => []
|
68
|
+
}
|
69
|
+
when 9
|
70
|
+
bonus = { :base_attack_bonus => [4],
|
71
|
+
:fort_save => 3,
|
72
|
+
:ref_save => 3,
|
73
|
+
:will_save => 6,
|
74
|
+
:granted_features => [],
|
75
|
+
:choices => []
|
76
|
+
}
|
77
|
+
when 10
|
78
|
+
bonus = { :base_attack_bonus => [5],
|
79
|
+
:fort_save => 3,
|
80
|
+
:ref_save => 3,
|
81
|
+
:will_save => 7,
|
82
|
+
:choices => [ ChooseWizardBonusFeat.new],
|
83
|
+
:granted_features => [],
|
84
|
+
}
|
85
|
+
when 11
|
86
|
+
bonus = { :base_attack_bonus => [5],
|
87
|
+
:fort_save => 3,
|
88
|
+
:ref_save => 3,
|
89
|
+
:will_save => 7,
|
90
|
+
:granted_features => [],
|
91
|
+
:choices => []
|
92
|
+
}
|
93
|
+
when 12
|
94
|
+
bonus = { :base_attack_bonus => [6,1],
|
95
|
+
:fort_save => 4,
|
96
|
+
:ref_save => 4,
|
97
|
+
:will_save => 8,
|
98
|
+
:granted_features => [],
|
99
|
+
:choices => []
|
100
|
+
}
|
101
|
+
when 13
|
102
|
+
bonus = { :base_attack_bonus => [6,1],
|
103
|
+
:fort_save => 4,
|
104
|
+
:ref_save => 4,
|
105
|
+
:will_save => 8,
|
106
|
+
:granted_features => [],
|
107
|
+
:choices => []
|
108
|
+
}
|
109
|
+
when 14
|
110
|
+
bonus = { :base_attack_bonus => [7,2],
|
111
|
+
:fort_save => 4,
|
112
|
+
:ref_save => 4,
|
113
|
+
:will_save => 9,
|
114
|
+
:choices => [],
|
115
|
+
:granted_features => []
|
116
|
+
}
|
117
|
+
when 15
|
118
|
+
bonus = { :base_attack_bonus => [7,2],
|
119
|
+
:fort_save => 5,
|
120
|
+
:ref_save => 5,
|
121
|
+
:will_save => 9,
|
122
|
+
:choices => [ ChooseWizardBonusFeat.new],
|
123
|
+
:granted_features => [],
|
124
|
+
}
|
125
|
+
when 16
|
126
|
+
bonus = { :base_attack_bonus => [8,3],
|
127
|
+
:fort_save => 5,
|
128
|
+
:ref_save => 5,
|
129
|
+
:will_save => 10,
|
130
|
+
:choices => [],
|
131
|
+
:granted_features => []
|
132
|
+
}
|
133
|
+
when 17
|
134
|
+
bonus = { :base_attack_bonus => [8,3],
|
135
|
+
:fort_save => 5,
|
136
|
+
:ref_save => 5,
|
137
|
+
:will_save => 10,
|
138
|
+
:granted_features => [],
|
139
|
+
:choices => []
|
140
|
+
}
|
141
|
+
when 18
|
142
|
+
bonus = { :base_attack_bonus => [9,4],
|
143
|
+
:fort_save => 6,
|
144
|
+
:ref_save => 6,
|
145
|
+
:will_save => 11,
|
146
|
+
:granted_features => [],
|
147
|
+
:choices => []
|
148
|
+
}
|
149
|
+
when 19
|
150
|
+
bonus = { :base_attack_bonus => [9,4],
|
151
|
+
:fort_save => 6,
|
152
|
+
:ref_save => 6,
|
153
|
+
:will_save => 11,
|
154
|
+
:granted_features => [],
|
155
|
+
:choices => []
|
156
|
+
}
|
157
|
+
when 20
|
158
|
+
bonus = { :base_attack_bonus => [10,5],
|
159
|
+
:fort_save => 6,
|
160
|
+
:ref_save => 6,
|
161
|
+
:will_save => 12,
|
162
|
+
:granted_features => [],
|
163
|
+
:choices => [ ChooseWizardBonusFeat.new]
|
164
|
+
}
|
165
|
+
end
|
166
|
+
bonus
|
167
|
+
end
|
168
|
+
|
169
|
+
def self.familiars
|
170
|
+
{
|
171
|
+
"Bat" => "Master gains a +3 bonus on Fly checks",
|
172
|
+
"Cat" => "Master gains a +3 bonus on Stealth checks",
|
173
|
+
"Hawk" => "Master gains a +3 bonus on sight-based and opposed Perception checks in bright light",
|
174
|
+
"Lizard" => "Master gains a +3 bonus on Climb checks",
|
175
|
+
"Monkey" => "Master gains a +3 bonus on Acrobatics checks",
|
176
|
+
"Owl" => "Master gains a +3 bonus on sight-based and opposed Perception checks in shadows or darkness",
|
177
|
+
"Rat" => "Master gains a +2 bonus on Fortitude saves",
|
178
|
+
"Raven" => "Master gains a +3 bonus on Appraise checks, Speaks one language of its Master",
|
179
|
+
"Toad" => "Master gains +3 hit points",
|
180
|
+
"Viper" => "Master gains a +3 bonus on Bluff checks",
|
181
|
+
"Weasel" => "Master gains a +2 bonus on Reflex saves"
|
182
|
+
}
|
183
|
+
end
|
184
|
+
|
185
|
+
def self.bond_objects
|
186
|
+
["amulet", "ring", "staff", "wand","weapon"]
|
187
|
+
end
|
188
|
+
end
|
189
|
+
|
@@ -0,0 +1,98 @@
|
|
1
|
+
class PfrpgTables::Tables::Heroclasses::ArcaneArcher
|
2
|
+
|
3
|
+
def self.level_bonus(level)
|
4
|
+
bonus = nil
|
5
|
+
case level
|
6
|
+
when 1
|
7
|
+
bonus = { :base_attack_bonus => [1],
|
8
|
+
:fort_save => 1,
|
9
|
+
:ref_save => 1,
|
10
|
+
:will_save => 0,
|
11
|
+
:granted_features => ["enhancearrows_magic"],
|
12
|
+
:choices => [],
|
13
|
+
:prestige_spells => 0
|
14
|
+
}
|
15
|
+
when 2
|
16
|
+
bonus = { :base_attack_bonus => [2],
|
17
|
+
:fort_save => 1,
|
18
|
+
:ref_save => 1,
|
19
|
+
:will_save => 1,
|
20
|
+
:granted_features => ["imbuearrow"],
|
21
|
+
:prestige_spells => 1
|
22
|
+
}
|
23
|
+
when 3
|
24
|
+
bonus = { :base_attack_bonus => [3],
|
25
|
+
:fort_save => 2,
|
26
|
+
:ref_save => 2,
|
27
|
+
:will_save => 1,
|
28
|
+
:granted_features => ["enhancearrows_elemental"],
|
29
|
+
:choices => [],
|
30
|
+
:prestige_spells => 1
|
31
|
+
}
|
32
|
+
when 4
|
33
|
+
bonus = { :base_attack_bonus => [4],
|
34
|
+
:fort_save => 2,
|
35
|
+
:ref_save => 2,
|
36
|
+
:will_save => 1,
|
37
|
+
:granted_features => ["seekerarrow"],
|
38
|
+
:choices => [],
|
39
|
+
:prestige_spells => 1
|
40
|
+
}
|
41
|
+
when 5
|
42
|
+
bonus = { :base_attack_bonus => [5],
|
43
|
+
:fort_save => 3,
|
44
|
+
:ref_save => 3,
|
45
|
+
:will_save => 2,
|
46
|
+
:granted_features => ["enhancearrows_distance"],
|
47
|
+
:choices => [],
|
48
|
+
:prestige_spells => 0
|
49
|
+
}
|
50
|
+
when 6
|
51
|
+
bonus = { :base_attack_bonus => [6],
|
52
|
+
:fort_save => 3,
|
53
|
+
:ref_save => 3,
|
54
|
+
:will_save => 2,
|
55
|
+
:granted_features => ["phasearrow"],
|
56
|
+
:choices => [],
|
57
|
+
:prestige_spells => 1
|
58
|
+
}
|
59
|
+
when 7
|
60
|
+
bonus = { :base_attack_bonus => [7],
|
61
|
+
:fort_save => 4,
|
62
|
+
:ref_save => 4,
|
63
|
+
:will_save => 2,
|
64
|
+
:granted_features => ["enhancearrows_elementalburst"],
|
65
|
+
:choices => [],
|
66
|
+
:prestige_spells => 1
|
67
|
+
}
|
68
|
+
when 8
|
69
|
+
bonus = { :base_attack_bonus => [8],
|
70
|
+
:fort_save => 4,
|
71
|
+
:ref_save => 4,
|
72
|
+
:will_save => 3,
|
73
|
+
:choices => [],
|
74
|
+
:granted_features => ["hailofarrows"],
|
75
|
+
:prestige_spells => 1
|
76
|
+
}
|
77
|
+
when 9
|
78
|
+
bonus = { :base_attack_bonus => [9],
|
79
|
+
:fort_save => 5,
|
80
|
+
:ref_save => 5,
|
81
|
+
:will_save => 3,
|
82
|
+
:granted_features => ["enhancearrows_aligned"],
|
83
|
+
:choices => [],
|
84
|
+
:prestige_spells => 0
|
85
|
+
}
|
86
|
+
when 10
|
87
|
+
bonus = { :base_attack_bonus => [10],
|
88
|
+
:fort_save => 5,
|
89
|
+
:ref_save => 5,
|
90
|
+
:will_save => 3,
|
91
|
+
:choices => [],
|
92
|
+
:granted_features => ["arrowofdeath"],
|
93
|
+
:prestige_spells => 1
|
94
|
+
}
|
95
|
+
end
|
96
|
+
bonus
|
97
|
+
end
|
98
|
+
end
|