|
|
@@ -66,6 +66,7 @@ const CORE_PULL_REACH := 120.0 # px beyond the outer ring
|
|
|
const POINTS_PER_BREAK := 10
|
|
|
const BREAKS_PER_COMBO_STEP := 3
|
|
|
const MAX_COMBO := 5
|
|
|
+const TWO_STAR_FACTOR := 1.75 # two stars within this many times par
|
|
|
|
|
|
# Feel
|
|
|
const SHAKE_MAX := 14.0 # px at full trauma
|
|
|
@@ -135,9 +136,16 @@ static func special_segment_share(level: int) -> float:
|
|
|
return minf(0.5, 0.06 + (level - FIRST_SPECIAL_LEVEL) * 0.0012)
|
|
|
|
|
|
|
|
|
-## Seconds to win a level within for three stars; twice that for two.
|
|
|
+## Seconds to win a level within for three stars; TWO_STAR_FACTOR times that for two.
|
|
|
+## Fitted to simulated win times so about 40-50% of wins earn three stars and 15-20%
|
|
|
+## one, from level 15 up; levels 0-10 are easy while learning. Winning runs get shorter
|
|
|
+## past level 75 (long ones there tend to end in a lost ball), so par eases back too.
|
|
|
static func par_seconds(level: int) -> float:
|
|
|
- return 60.0 + minf(60.0, level * 0.8)
|
|
|
+ if level <= 10:
|
|
|
+ return 60.0
|
|
|
+ if level <= 75:
|
|
|
+ return 60.0 + (level - 10) * 0.7
|
|
|
+ return maxf(85.0, 105.5 - (level - 75) * 0.4)
|
|
|
|
|
|
|
|
|
## Chance of a power-up drop every POWER_UP_INTERVAL seconds.
|