@@ -2,7 +2,6 @@ use crate::resource::ResourceType;
2
2
use crate :: utils;
3
3
use serde:: { Deserialize , Serialize } ;
4
4
use std:: {
5
- cmp,
6
5
fmt:: Display ,
7
6
iter:: Sum ,
8
7
ops:: { Add , AddAssign , Mul , SubAssign } ,
@@ -68,7 +67,7 @@ impl ResourcePile {
68
67
}
69
68
70
69
#[ must_use]
71
- pub fn get ( & self , resource_type : ResourceType ) -> u32 {
70
+ pub fn get ( & self , resource_type : & ResourceType ) -> u32 {
72
71
match resource_type {
73
72
ResourceType :: Food => self . food ,
74
73
ResourceType :: Wood => self . wood ,
@@ -80,6 +79,17 @@ impl ResourcePile {
80
79
}
81
80
}
82
81
82
+ #[ must_use]
83
+ pub fn has_at_least ( & self , other : & ResourcePile , times : u32 ) -> bool {
84
+ self . food >= other. food * times
85
+ && self . wood >= other. wood * times
86
+ && self . ore >= other. ore * times
87
+ && self . ideas >= other. ideas * times
88
+ && self . gold >= other. gold * times
89
+ && self . mood_tokens >= other. mood_tokens * times
90
+ && self . culture_tokens >= other. culture_tokens * times
91
+ }
92
+
83
93
///
84
94
/// # Panics
85
95
/// Panics if `resource_type` is `Discount`
@@ -362,113 +372,27 @@ impl CostWithDiscount {
362
372
&& available. mood_tokens >= cost. mood_tokens
363
373
&& available. culture_tokens >= cost. culture_tokens
364
374
}
365
-
366
- //this function assumes that `self` can afford `cost`
367
- #[ must_use]
368
- pub fn get_payment_options ( & self , available : & ResourcePile ) -> PaymentOptions {
369
- let cost = & self . cost ;
370
- let mut jokers_left = self . discount ;
371
-
372
- let mut gold_left = available. gold ;
373
- let mut gold_cost = cost. gold ;
374
- gold_left -= gold_cost;
375
-
376
- if cost. food > available. food {
377
- let joker_cost = cost. food - available. food ;
378
- if joker_cost > jokers_left {
379
- gold_left -= joker_cost - jokers_left;
380
- gold_cost += joker_cost - jokers_left;
381
- }
382
- jokers_left = jokers_left. saturating_sub ( joker_cost) ;
383
- }
384
- if cost. wood > available. wood {
385
- let joker_cost = cost. wood - available. wood ;
386
- if joker_cost > jokers_left {
387
- gold_left -= joker_cost - jokers_left;
388
- gold_cost += joker_cost - jokers_left;
389
- }
390
- jokers_left = jokers_left. saturating_sub ( joker_cost) ;
391
- }
392
- if cost. ore > available. ore {
393
- let joker_cost = cost. ore - available. ore ;
394
- if joker_cost > jokers_left {
395
- gold_left -= joker_cost - jokers_left;
396
- gold_cost += joker_cost - jokers_left;
397
- }
398
- jokers_left = jokers_left. saturating_sub ( joker_cost) ;
399
- }
400
- if cost. ideas > available. ideas {
401
- let joker_cost = cost. ideas - available. ideas ;
402
- if joker_cost > jokers_left {
403
- gold_left -= joker_cost - jokers_left;
404
- gold_cost += joker_cost - jokers_left;
405
- }
406
- jokers_left = jokers_left. saturating_sub ( joker_cost) ;
407
- }
408
- let default = ResourcePile :: new (
409
- cmp:: min ( cost. food , available. food ) ,
410
- cmp:: min ( cost. wood , available. wood ) ,
411
- cmp:: min ( cost. ore , available. ore ) ,
412
- cmp:: min ( cost. ideas , available. ideas ) ,
413
- gold_cost,
414
- cost. mood_tokens ,
415
- cost. culture_tokens ,
416
- ) ;
417
- PaymentOptions :: new ( default, gold_left, jokers_left)
418
- }
419
- }
420
-
421
- #[ derive( PartialEq , Eq , Debug , Clone ) ]
422
- pub struct PaymentOptions {
423
- pub default : ResourcePile ,
424
- pub gold_left : u32 ,
425
- pub discount_left : u32 ,
426
- }
427
-
428
- impl PaymentOptions {
429
- #[ must_use]
430
- pub fn new ( default : ResourcePile , gold_left : u32 , discount_left : u32 ) -> Self {
431
- Self {
432
- default,
433
- gold_left,
434
- discount_left,
435
- }
436
- }
437
375
}
438
376
439
377
#[ cfg( test) ]
440
378
mod tests {
441
- use super :: { CostWithDiscount , PaymentOptions , ResourcePile } ;
442
- use crate :: payment:: PaymentModel ;
379
+ use super :: ResourcePile ;
380
+ use crate :: payment:: PaymentOptions ;
443
381
444
382
fn assert_can_afford ( name : & str , cost : & ResourcePile , discount : u32 ) {
445
383
let player_has = ResourcePile :: new ( 1 , 2 , 3 , 4 , 5 , 6 , 7 ) ;
446
384
let can_afford =
447
- PaymentModel :: resources_with_discount ( cost. clone ( ) , discount) . can_afford ( & player_has) ;
385
+ PaymentOptions :: resources_with_discount ( cost. clone ( ) , discount) . can_afford ( & player_has) ;
448
386
assert ! ( can_afford, "{name}" ) ;
449
387
}
450
388
451
389
fn assert_cannot_afford ( name : & str , cost : & ResourcePile , discount : u32 ) {
452
390
let player_has = ResourcePile :: new ( 1 , 2 , 3 , 4 , 5 , 6 , 7 ) ;
453
391
let can_afford =
454
- PaymentModel :: resources_with_discount ( cost. clone ( ) , discount) . can_afford ( & player_has) ;
392
+ PaymentOptions :: resources_with_discount ( cost. clone ( ) , discount) . can_afford ( & player_has) ;
455
393
assert ! ( !can_afford, "{name}" ) ;
456
394
}
457
395
458
- fn assert_payment_options (
459
- name : & str ,
460
- cost : & ResourcePile ,
461
- discount : u32 ,
462
- want : & PaymentOptions ,
463
- ) {
464
- let budget = ResourcePile :: new ( 1 , 2 , 3 , 4 , 5 , 6 , 7 ) ;
465
- let c = CostWithDiscount {
466
- cost : cost. clone ( ) ,
467
- discount,
468
- } ;
469
- assert_eq ! ( want, & c. get_payment_options( & budget) , "{name}" ) ;
470
- }
471
-
472
396
fn assert_to_string ( resource_pile : & ResourcePile , expected : & str ) {
473
397
assert_eq ! (
474
398
expected. to_string( ) ,
@@ -521,28 +445,6 @@ mod tests {
521
445
assert_eq ! ( ResourcePile :: new( 0 , 1 , 2 , 0 , 0 , 0 , 0 ) , waste) ;
522
446
}
523
447
524
- #[ test]
525
- fn payment_options_test ( ) {
526
- assert_payment_options (
527
- "no gold use" ,
528
- & ResourcePile :: new ( 1 , 1 , 3 , 2 , 0 , 2 , 4 ) ,
529
- 0 ,
530
- & ( PaymentOptions :: new ( ResourcePile :: new ( 1 , 1 , 3 , 2 , 0 , 2 , 4 ) , 5 , 0 ) ) ,
531
- ) ;
532
- assert_payment_options (
533
- "use some gold" ,
534
- & ResourcePile :: new ( 2 , 2 , 3 , 5 , 2 , 0 , 0 ) ,
535
- 0 ,
536
- & ( PaymentOptions :: new ( ResourcePile :: new ( 1 , 2 , 3 , 4 , 4 , 0 , 0 ) , 1 , 0 ) ) ,
537
- ) ;
538
- assert_payment_options (
539
- "jokers" ,
540
- & ( ResourcePile :: ore ( 4 ) + ResourcePile :: ideas ( 4 ) ) ,
541
- 3 ,
542
- & ( PaymentOptions :: new ( ResourcePile :: ore ( 3 ) + ResourcePile :: ideas ( 4 ) , 5 , 2 ) ) ,
543
- ) ;
544
- }
545
-
546
448
#[ test]
547
449
fn resource_pile_display_test ( ) {
548
450
assert_to_string ( & ResourcePile :: empty ( ) , "nothing" ) ;
0 commit comments