@@ -233,17 +233,52 @@ impl AssessCtx {
233233
234234 /// Compute the stats increment per level and assign it to self.
235235 fn compute_increment ( & mut self ) {
236- let ratio = if self . item . boss { 0.125f32 } else { 0.1 } ;
236+ let multiplier = if self . item . boss { 0.125f32 } else { 0.1 } ;
237+ let quality_ratio = self . quality as f32 / 100.0 ;
237238 self . increment = FloatStats {
238- hp : ( self . item . hp as f32 * ratio) . ceil ( ) * ( self . quality as f32 / 100.0 ) ,
239- mana : ( self . item . mana as f32 * ratio) . ceil ( ) * ( self . quality as f32 / 100.0 ) ,
240- attack : ( self . item . attack as f32 * ratio) . ceil ( ) * ( self . quality as f32 / 100.0 ) ,
241- magic : ( self . item . magic as f32 * ratio) . ceil ( ) * ( self . quality as f32 / 100.0 ) ,
242- defense : ( self . item . defense as f32 * ratio) . ceil ( ) * ( self . quality as f32 / 100.0 ) ,
243- resistance : ( self . item . resistance as f32 * ratio) . ceil ( )
244- * ( self . quality as f32 / 100.0 ) ,
245- ward : ( self . item . ward as f32 * ratio) . ceil ( ) * ( self . quality as f32 / 100.0 ) ,
246- foresight : ( self . item . foresight as f32 * ratio) . ceil ( ) * ( self . quality as f32 / 100.0 ) ,
239+ hp : increment_at (
240+ self . item . hp_affected_by_quality ,
241+ self . item . hp ,
242+ multiplier,
243+ quality_ratio,
244+ ) ,
245+ mana : increment_at (
246+ self . item . mana_affected_by_quality ,
247+ self . item . mana ,
248+ multiplier,
249+ quality_ratio,
250+ ) ,
251+ attack : increment_at (
252+ self . item . attack_affected_by_quality ,
253+ self . item . attack ,
254+ multiplier,
255+ quality_ratio,
256+ ) ,
257+ magic : increment_at (
258+ self . item . magic_affected_by_quality ,
259+ self . item . magic ,
260+ multiplier,
261+ quality_ratio,
262+ ) ,
263+ defense : increment_at (
264+ self . item . defense_affected_by_quality ,
265+ self . item . defense ,
266+ multiplier,
267+ quality_ratio,
268+ ) ,
269+ resistance : increment_at (
270+ self . item . resistance_affected_by_quality ,
271+ self . item . resistance ,
272+ multiplier,
273+ quality_ratio,
274+ ) ,
275+ ward : increment_at (
276+ self . item . ward_affected_by_quality ,
277+ self . item . ward ,
278+ multiplier,
279+ quality_ratio,
280+ ) ,
281+ foresight : increment_at ( true , self . item . foresight , multiplier, quality_ratio) ,
247282 }
248283 }
249284
@@ -398,10 +433,14 @@ fn raw_assessat_stat<T: NumCast>(
398433 }
399434
400435 let base_stat = <f32 as num:: NumCast >:: from ( base_stat) . unwrap ( ) ;
401- let final_stat = ( base_stat * quality_ratio
402- + ( base_stat * multiplier) . ceil ( ) * level as f32 * quality_ratio)
403- . ceil ( ) ;
404- <T as num:: NumCast >:: from ( final_stat) . unwrap ( )
436+ if base_stat >= 0.0 {
437+ let final_stat = ( base_stat * quality_ratio
438+ + ( base_stat * multiplier) . ceil ( ) * level as f32 * quality_ratio)
439+ . ceil ( ) ;
440+ <T as num:: NumCast >:: from ( final_stat) . unwrap ( )
441+ } else {
442+ <T as num:: NumCast >:: from ( ( base_stat + level as f32 ) * quality_ratio) . unwrap ( )
443+ }
405444}
406445
407446impl AssessatStats {
@@ -516,7 +555,7 @@ impl QualityTier {
516555 if base_bonus == 0.0 {
517556 0.0
518557 } else {
519- ( ( base_bonus / 100.0 + 1.0 ) * self . bonus_multiplier ( ) - 1.0 ) * 100.0
558+ ( ( base_bonus / 100.0 + 1.0 ) * self . bonus_multiplier ( ) - 1.0 ) * 100.0
520559 }
521560 }
522561
@@ -582,6 +621,24 @@ fn adorn_slots_at(item: &AdminItem, level: i16, quality_tier: QualityTier) -> u8
582621 }
583622}
584623
624+ /// Compute a stat level increment of an item at the given quality ratio.
625+ fn increment_at < T : NumCast + num:: Signed > (
626+ affected : bool ,
627+ base_stat : T ,
628+ multiplier : f32 ,
629+ quality_ratio : f32 ,
630+ ) -> f32 {
631+ if affected {
632+ if !base_stat. is_negative ( ) {
633+ ( <f32 as num:: NumCast >:: from ( base_stat) . unwrap ( ) * multiplier) . ceil ( ) * quality_ratio
634+ } else {
635+ 1.0 * quality_ratio
636+ }
637+ } else {
638+ 0.0
639+ }
640+ }
641+
585642/// Compute a base stat of an item at the given quality ratio.
586643fn base_stat_at < T : NumCast > ( affected : bool , base_stat : T , quality_ratio : f32 ) -> f32 {
587644 if affected {
0 commit comments