@@ -5,9 +5,8 @@ import { getCardinalColor } from "../utils/colorUtils";
55import type { Burg } from "./burgs-generator" ;
66import { generateStoryJourney } from "./journey-story" ;
77import type { Route } from "./routes-generator" ;
8- import type { TransportDomain } from "./transports-generator" ;
8+ import { MAX_HOURS_PER_DAY , type TransportDomain } from "./transports-generator" ;
99
10- const DEFAULT_HOURS_PER_DAY = 8 ;
1110const COARSE_UNIT_THRESHOLD = 10 ;
1211const ON_ROAD_DISCOUNT = 0.5 ;
1312const OFF_ROAD_PENALTY = 5 ;
@@ -110,12 +109,13 @@ class JourneysModule {
110109
111110 // avgSpeed is km/h like every other stored speed, so the distance-unit ratio has to come back out
112111 const avgSpeed = movingHours > 0 ? totalDistance / movingHours / getDistanceUnitRatio ( ) : 0 ;
113- const hoursPerDay = totalDays > 0 ? totalHours / totalDays : DEFAULT_HOURS_PER_DAY ;
112+ // the rate that reproduces the per-transport day count; with nothing to divide, any rate formats "0m"
113+ const hoursPerDay = totalDays > 0 ? totalHours / totalDays : MAX_HOURS_PER_DAY ;
114114 return { totalDistance, totalHours, avgSpeed, totalDays, hoursPerDay } ;
115115 }
116116
117117 /** Readable duration, e.g. "2d 3h". Days are counted from `hoursPerDay` */
118- formatTravelTime ( hours : number , hoursPerDay = DEFAULT_HOURS_PER_DAY ) : string {
118+ formatTravelTime ( hours : number , hoursPerDay : number ) : string {
119119 const { days, hours : restHours , minutes } = this . splitTravelTime ( hours , hoursPerDay ) ;
120120
121121 if ( days >= COARSE_UNIT_THRESHOLD ) return `${ days } d` ;
@@ -126,7 +126,7 @@ class JourneysModule {
126126 }
127127
128128 /** Exact duration down to the minute, e.g. "52d 4h 9m" — for tooltips */
129- formatTravelTimeFull ( hours : number , hoursPerDay = DEFAULT_HOURS_PER_DAY ) : string {
129+ formatTravelTimeFull ( hours : number , hoursPerDay : number ) : string {
130130 const { days, hours : restHours , minutes } = this . splitTravelTime ( hours , hoursPerDay ) ;
131131
132132 const parts : string [ ] = [ ] ;
@@ -137,7 +137,8 @@ class JourneysModule {
137137 }
138138
139139 private splitTravelTime ( hours : number , hoursPerDay : number ) : { days : number ; hours : number ; minutes : number } {
140- const minutesPerDay = ( hoursPerDay > 0 ? hoursPerDay : DEFAULT_HOURS_PER_DAY ) * 60 ;
140+ // a corrupt rate must not inflate the day count, so fall back to the longest possible day
141+ const minutesPerDay = ( hoursPerDay > 0 ? hoursPerDay : MAX_HOURS_PER_DAY ) * 60 ;
141142 const totalMinutes = Number . isFinite ( hours ) && hours > 0 ? Math . round ( hours * 60 ) : 0 ;
142143 let days = Math . floor ( totalMinutes / minutesPerDay ) ;
143144 // a journey mixing transports has a fractional rate, so the remainder needs rounding to whole minutes
0 commit comments