11class RatingParser
2- token NUMBER K R H O G F S T PLUS MINUS ASTERISK SLASH PARENL PARENR BRACKETL BRACKETR AT SHARP DOLLAR TILDE
2+ token NUMBER K R H O D B G F S T Z A PLUS MINUS ASTERISK SLASH PARENL PARENR BRACKETL BRACKETR AT SHARP DOLLAR TILDE
33
44 expect 4
55
@@ -13,19 +13,27 @@ class RatingParser
1313 | H rate option
1414 {
1515 _, rate, option = val
16- raise ParseError if option.modifier_after_one_and_a_half
16+ raise ParseError if option.modifier_after_one_and_a_half or option.modifier_after_double
1717 option.modifier_after_half ||= Arithmetic::Node::Number.new (0 )
1818 modifier = option.modifier || Arithmetic::Node::Number.new (0 )
1919 result = parsed(rate, modifier.eval(@round_type), option)
2020 }
2121 | O H rate option
2222 {
2323 _, _, rate, option = val
24- raise ParseError if option.modifier_after_half
24+ raise ParseError if option.modifier_after_half or option.modifier_after_double
2525 option.modifier_after_one_and_a_half ||= Arithmetic::Node::Number.new (0 )
2626 modifier = option.modifier || Arithmetic::Node::Number.new (0 )
2727 result = parsed(rate, modifier.eval(@round_type), option)
2828 }
29+ | D B rate option
30+ {
31+ _, _, rate, option = val
32+ raise ParseError if option.modifier_after_half or option.modifier_after_one_and_a_half
33+ option.modifier_after_double ||= Arithmetic::Node::Number.new (0 )
34+ modifier = option.modifier || Arithmetic::Node::Number.new (0 )
35+ result = parsed(rate, modifier.eval(@round_type), option)
36+ }
2937
3038
3139 rate: K NUMBER
@@ -123,6 +131,22 @@ class RatingParser
123131 option.modifier_after_one_and_a_half = term
124132 result = option
125133 }
134+ | option D B
135+ {
136+ option, _, _ = val
137+ raise ParseError unless option.modifier_after_double.nil?
138+
139+ option.modifier_after_double = Arithmetic::Node::Number.new (0 )
140+ result = option
141+ }
142+ | option D B unary
143+ {
144+ option, _, _, term = val
145+ raise ParseError unless option.modifier_after_double.nil?
146+
147+ option.modifier_after_double = term
148+ result = option
149+ }
126150 | option R unary
127151 {
128152 option, _, term = val
@@ -131,6 +155,14 @@ class RatingParser
131155 option.rateup = term
132156 result = option
133157 }
158+ | option A D unary
159+ {
160+ option, _, _, term = val
161+ raise ParseError unless [:v2_5].include?(@version) && option.add_damage.nil?
162+
163+ option.add_damage = term
164+ result = option
165+ }
134166 | option G F
135167 {
136168 option, _, _ = val
@@ -155,6 +187,14 @@ class RatingParser
155187 option.tmp_fixed_val = term.to_i
156188 result = option
157189 }
190+ | option S Z NUMBER
191+ {
192+ option, _, _, term = val
193+ raise ParseError unless [:v2_5].include?(@version)
194+
195+ option.set_zero_val = term.to_i
196+ result = option
197+ }
158198 | option SHARP unary
159199 {
160200 option, _, term = val
@@ -244,11 +284,14 @@ def parsed(rate, modifier, option)
244284 p.first_modify = option.first_modify || 0
245285 p.first_modify_ssp = option.first_modify_ssp || 0
246286 p.rateup = option.rateup&.eval(@round_type) || 0
287+ p.add_damage = option.add_damage&.eval(@round_type) || 0
247288 p.greatest_fortune = option.greatest_fortune if !option.greatest_fortune.nil?
248289 p.semi_fixed_val = option.semi_fixed_val&.clamp(1 , 6 ) || 0
249290 p.tmp_fixed_val = option.tmp_fixed_val&.clamp(1 , 6 ) || 0
291+ p.set_zero_val = option.set_zero_val || 0
250292 p.modifier_after_half = option.modifier_after_half&.eval(@round_type)
251293 p.modifier_after_one_and_a_half = option.modifier_after_one_and_a_half&.eval(@round_type)
294+ p.modifier_after_double = option.modifier_after_double&.eval(@round_type)
252295 p.critical = option.critical&.eval(@round_type)&.clamp(0 , 13 ) || (p.half || p.one_and_a_half ? 13 : 10 )
253296 end
254297end
0 commit comments