@@ -3,34 +3,23 @@ mod models;
33mod optimizer;
44mod server;
55
6- use models:: { GamePhase , OptimizerConfig , PurityOverride } ;
6+ use models:: { OptimizerConfig , PurityOverride } ;
77use std:: collections:: HashMap ;
88use std:: env;
99
1010fn apply_preset_weights ( preset_idx : usize , weights : & mut HashMap < String , f64 > ) {
11- weights. clear ( ) ;
12- match preset_idx {
13- 0 => models:: GamePhase :: Phase1 . apply_weights ( weights) ,
14- 1 => models:: GamePhase :: Phase2 . apply_weights ( weights) ,
15- 2 => models:: GamePhase :: Phase3 . apply_weights ( weights) ,
16- 3 => models:: GamePhase :: Phase4 . apply_weights ( weights) ,
17- 4 => models:: GamePhase :: Phase5 . apply_weights ( weights) ,
18- 5 => apply_collectibles_weights ( weights) ,
19- _ => { }
11+ if let Some ( preset) = models:: all_presets ( ) . get ( preset_idx) {
12+ * weights = preset. build_weights ( ) ;
2013 }
2114}
2215
23- fn apply_collectibles_weights ( weights : & mut HashMap < String , f64 > ) {
24- weights. clear ( ) ;
25- weights. insert ( "blueslug" . to_string ( ) , 0.3 ) ;
26- weights. insert ( "yellowslug" . to_string ( ) , 0.8 ) ;
27- weights. insert ( "purpleslug" . to_string ( ) , 1.2 ) ;
28- weights. insert ( "mercer" . to_string ( ) , 1.0 ) ;
29- weights. insert ( "somersloop" . to_string ( ) , 1.0 ) ;
30- weights. insert ( "harddrive" . to_string ( ) , 1.5 ) ;
31- weights. insert ( "paleberry" . to_string ( ) , 0.0 ) ;
32- weights. insert ( "berylnut" . to_string ( ) , 0.0 ) ;
33- weights. insert ( "baconagaric" . to_string ( ) , 0.0 ) ;
16+ fn apply_preset_argument ( input : & str , config : & mut OptimizerConfig ) -> bool {
17+ if let Some ( preset) = models:: preset_by_id_or_phase ( input) {
18+ models:: apply_preset_to_config ( preset, config) ;
19+ true
20+ } else {
21+ false
22+ }
3423}
3524
3625fn print_help ( ) {
@@ -80,7 +69,9 @@ fn main() {
8069
8170 let mut custom_file_path: Option < String > = None ;
8271 let mut config = OptimizerConfig :: default ( ) ;
83- GamePhase :: Phase1 . apply_weights ( & mut config. weights ) ;
72+ if let Some ( preset) = models:: preset_by_id_or_phase ( "phase1" ) {
73+ models:: apply_preset_to_config ( preset, & mut config) ;
74+ }
8475
8576 let mut output_json = false ;
8677 let mut run_simulation = false ;
@@ -197,10 +188,7 @@ fn main() {
197188 "--tier" | "--phase" => {
198189 if i + 1 < args. len ( ) {
199190 let phase_str = & args[ i + 1 ] ;
200- if let Some ( phase) = GamePhase :: from_str ( phase_str) {
201- phase. apply_weights ( & mut config. weights ) ;
202- config. game_phase = phase;
203- } else {
191+ if !apply_preset_argument ( phase_str, & mut config) {
204192 eprintln ! ( "Error: Invalid phase/tier value '{}'." , phase_str) ;
205193 return ;
206194 }
@@ -211,8 +199,7 @@ fn main() {
211199 }
212200 }
213201 "--collectibles" => {
214- apply_collectibles_weights ( & mut config. weights ) ;
215- config. game_phase = GamePhase :: Phase5 ;
202+ apply_preset_argument ( "collectibles" , & mut config) ;
216203 i += 1 ;
217204 }
218205 "--ignore-spawns" | "--ignore-starting-areas" => {
@@ -312,7 +299,7 @@ fn run_full_simulation_matrix(nodes: &[models::ResourceNode]) {
312299 }
313300
314301 let mut sim_configs = Vec :: new ( ) ;
315- let presets = 0 ..6 ;
302+ let presets = 0 ..models :: all_presets ( ) . len ( ) ;
316303 let purities = [
317304 PurityOverride :: Default ,
318305 PurityOverride :: Normal ,
@@ -330,18 +317,18 @@ fn run_full_simulation_matrix(nodes: &[models::ResourceNode]) {
330317 models:: DistanceDecay :: Linear ,
331318 models:: DistanceDecay :: LogisticStep ,
332319 ] ;
333- let sigma = 700.0 ;
334320
335321 for preset_idx in presets {
336322 for & purity in & purities {
337323 for & utility in & utilities {
338324 for & decay in & decays {
325+ let preset = models:: all_presets ( ) [ preset_idx] ;
339326 sim_configs. push ( SimConfig {
340327 preset_idx,
341328 purity,
342329 utility,
343330 decay,
344- sigma,
331+ sigma : preset . sigma ,
345332 } ) ;
346333 }
347334 }
@@ -355,21 +342,15 @@ fn run_full_simulation_matrix(nodes: &[models::ResourceNode]) {
355342 let results: Vec < ( SimConfig , optimizer:: OptimizationResult ) > = sim_configs
356343 . into_iter ( )
357344 . map ( |config| {
345+ let preset = models:: all_presets ( ) [ config. preset_idx ] ;
358346 let mut opt_config = OptimizerConfig {
359347 sigma : config. sigma ,
360348 weights : HashMap :: new ( ) ,
361349 purity_override : config. purity ,
362350 strategy : models:: SearchStrategy :: Hybrid ,
363351 utility_func : config. utility ,
364352 decay_func : config. decay ,
365- game_phase : match config. preset_idx {
366- 0 => models:: GamePhase :: Phase1 ,
367- 1 => models:: GamePhase :: Phase2 ,
368- 2 => models:: GamePhase :: Phase3 ,
369- 3 => models:: GamePhase :: Phase4 ,
370- 4 => models:: GamePhase :: Phase5 ,
371- _ => models:: GamePhase :: Phase1 ,
372- } ,
353+ game_phase : preset. phase ,
373354 ignore_spawns : true ,
374355 } ;
375356 apply_preset_weights ( config. preset_idx , & mut opt_config. weights ) ;
@@ -425,3 +406,32 @@ fn run_full_simulation_matrix(nodes: &[models::ResourceNode]) {
425406 csv_path
426407 ) ;
427408}
409+
410+ #[ cfg( test) ]
411+ mod tests {
412+ use super :: * ;
413+
414+ #[ test]
415+ fn cli_phase_preset_application_sets_radius_and_spawn_behavior ( ) {
416+ let mut phase1_config = OptimizerConfig :: default ( ) ;
417+ assert ! ( apply_preset_argument( "phase1" , & mut phase1_config) ) ;
418+ assert_eq ! ( phase1_config. sigma, 200.0 ) ;
419+ assert ! ( !phase1_config. ignore_spawns) ;
420+
421+ let mut phase4_config = OptimizerConfig :: default ( ) ;
422+ assert ! ( apply_preset_argument( "phase4" , & mut phase4_config) ) ;
423+ assert_eq ! ( phase4_config. sigma, 600.0 ) ;
424+ assert ! ( phase4_config. ignore_spawns) ;
425+ }
426+
427+ #[ test]
428+ fn cli_collectibles_preset_application_uses_shared_weights ( ) {
429+ let mut config = OptimizerConfig :: default ( ) ;
430+ assert ! ( apply_preset_argument( "collectibles" , & mut config) ) ;
431+
432+ assert_eq ! ( config. sigma, 1000.0 ) ;
433+ assert ! ( config. ignore_spawns) ;
434+ assert_eq ! ( config. weights. get( "blueslug" ) . copied( ) , Some ( 0.3 ) ) ;
435+ assert_eq ! ( config. weights. get( "harddrive" ) . copied( ) , Some ( 1.5 ) ) ;
436+ }
437+ }
0 commit comments