1
1
use pyo3:: { pyclass, pymethods, PyErr } ;
2
2
3
- use crate :: plugin:: { errors:: HUIError , field:: Field , game_state:: GameState } ;
3
+ use crate :: plugin:: { errors:: HUIError , field:: Field , game_state:: GameState , hare :: Hare } ;
4
4
5
5
use super :: card:: Card ;
6
6
@@ -28,21 +28,44 @@ impl Advance {
28
28
29
29
let current_field = state. board . get_field ( player. position ) . unwrap ( ) ;
30
30
if self . cards . is_empty ( ) {
31
- match current_field {
32
- Field :: Market | Field :: Hare => {
33
- return Err ( HUIError :: new_err ( "Cannot enter field without any cards" ) ) ;
34
- }
35
- _ => {
36
- state. update_player ( player) ;
37
- return Ok ( ( ) ) ;
38
- }
31
+ return self . handle_empty_cards ( current_field, state, player) ;
32
+ }
33
+
34
+ self . handle_cards ( current_field, state, player)
35
+ }
36
+
37
+ fn handle_empty_cards (
38
+ & self ,
39
+ current_field : Field ,
40
+ state : & mut GameState ,
41
+ player : Hare ,
42
+ ) -> Result < ( ) , PyErr > {
43
+ match current_field {
44
+ Field :: Market | Field :: Hare => {
45
+ Err ( HUIError :: new_err ( "Cannot enter field without any cards" ) )
46
+ }
47
+ _ => {
48
+ state. update_player ( player) ;
49
+ Ok ( ( ) )
39
50
}
40
51
}
52
+ }
41
53
54
+ fn handle_cards (
55
+ & self ,
56
+ mut current_field : Field ,
57
+ state : & mut GameState ,
58
+ mut player : Hare ,
59
+ ) -> Result < ( ) , PyErr > {
42
60
let mut last_card: Option < & Card > = None ;
43
61
let mut card_bought = false ;
44
62
45
- for card in & self . cards {
63
+ for ( index, card) in self . cards . iter ( ) . enumerate ( ) {
64
+ let remaining_cards = self
65
+ . cards
66
+ . get ( index + 1 ..)
67
+ . map ( |slice| slice. to_vec ( ) )
68
+ . unwrap_or ( Vec :: new ( ) ) ;
46
69
match current_field {
47
70
Field :: Market if card_bought => {
48
71
return Err ( HUIError :: new_err ( "Only one card allowed to buy" ) ) ;
@@ -60,18 +83,20 @@ impl Advance {
60
83
}
61
84
62
85
last_card = Some ( card) ;
63
- let mut remaining_cards = self . cards . clone ( ) ;
64
-
65
- if let Some ( position) = remaining_cards. iter ( ) . position ( |c| c == card) {
66
- remaining_cards. remove ( position) ;
67
- } else {
68
- return Err ( HUIError :: new_err ( "Card not in list of cards" ) ) ?;
69
- }
70
86
71
- card. perform ( state, remaining_cards) ?;
87
+ card. perform ( state, remaining_cards. clone ( ) ) ?;
88
+ player = state. clone_current_player ( ) ;
72
89
}
73
90
_ => Err ( HUIError :: new_err ( "Card cannot be played on this field" ) ) ?,
74
91
}
92
+
93
+ current_field = state. board . get_field ( player. position ) . unwrap ( ) ;
94
+ if current_field == Field :: Hare && remaining_cards. is_empty ( ) && last_card. is_none ( ) {
95
+ return Err ( HUIError :: new_err ( "Cannot enter field without any cards" ) ) ;
96
+ }
97
+ if current_field == Field :: Market && remaining_cards. is_empty ( ) && !card_bought {
98
+ return Err ( HUIError :: new_err ( "Cannot enter field without any cards" ) ) ;
99
+ }
75
100
}
76
101
77
102
state. update_player ( player) ;
0 commit comments