@@ -150,7 +150,7 @@ pub(crate) trait AbilityInitializerSetup: Sized {
150
150
self
151
151
}
152
152
153
- fn add_player_event_listener < T , U , V , E , F > ( self , event : E , listener : F , priority : i32 ) -> Self
153
+ fn add_player_event_listener < T , U , V , E , F > ( self , event : E , priority : i32 , listener : F ) -> Self
154
154
where
155
155
T : Clone + PartialEq ,
156
156
E : Fn ( & mut PlayerEvents ) -> & mut Event < T , U , V > + ' static + Clone ,
@@ -190,16 +190,12 @@ pub(crate) trait AbilityInitializerSetup: Sized {
190
190
F : Fn ( & mut T , & U , & V ) + ' static + Clone ,
191
191
{
192
192
let id = self . get_key ( ) . id ( ) ;
193
- self . add_player_event_listener (
194
- event,
195
- move |value, u, v| {
196
- if !get_info ( value) . contains_key ( & id) {
197
- listener ( value, u, v) ;
198
- get_info ( value) . insert ( id. clone ( ) , "used" . to_string ( ) ) ;
199
- }
200
- } ,
201
- priority,
202
- )
193
+ self . add_player_event_listener ( event, priority, move |value, u, v| {
194
+ if !get_info ( value) . contains_key ( & id) {
195
+ listener ( value, u, v) ;
196
+ get_info ( value) . insert ( id. clone ( ) , "used" . to_string ( ) ) ;
197
+ }
198
+ } )
203
199
}
204
200
205
201
fn add_current_event_listener < E , V > (
@@ -217,72 +213,89 @@ pub(crate) trait AbilityInitializerSetup: Sized {
217
213
E : Fn ( & mut PlayerEvents ) -> & mut CurrentEvent < V > + ' static + Clone ,
218
214
{
219
215
let origin = self . get_key ( ) ;
220
- self . add_player_event_listener (
221
- event,
222
- move |game, i, details| {
223
- let player_index = i. player ;
224
- let player_name = game. players [ player_index] . get_name ( ) ;
225
-
226
- if let Some ( mut phase) = game. current_events . pop ( ) {
227
- if let Some ( ref c) = phase. player . handler {
228
- if let Some ( ref action) = c. response {
229
- if c. priority == priority {
230
- let mut current = phase. clone ( ) ;
231
- current
232
- . player
233
- . handler
234
- . as_mut ( )
235
- . expect ( "current missing" )
236
- . response = None ;
237
- if can_undo ( & current. event_type ) {
238
- game. undo_context_stack
239
- . push ( UndoContext :: Event ( Box :: new ( current) ) ) ;
240
- }
241
- let r = c. request . clone ( ) ;
242
- let a = action. clone ( ) ;
243
- phase. player . handler = None ;
244
- game. current_events . push ( phase) ;
245
- end_custom_phase. clone ( ) (
246
- game,
247
- player_index,
248
- & player_name,
249
- a,
250
- r,
251
- details,
252
- ) ;
253
- return ;
216
+ self . add_player_event_listener ( event, priority, move |game, i, details| {
217
+ let player_index = i. player ;
218
+ let player_name = game. player_name ( player_index) ;
219
+
220
+ if let Some ( mut phase) = game. current_events . pop ( ) {
221
+ if let Some ( ref c) = phase. player . handler {
222
+ if let Some ( ref action) = c. response {
223
+ if c. priority == priority {
224
+ let mut current = phase. clone ( ) ;
225
+ current
226
+ . player
227
+ . handler
228
+ . as_mut ( )
229
+ . expect ( "current missing" )
230
+ . response = None ;
231
+ if can_undo ( & current. event_type ) {
232
+ game. undo_context_stack
233
+ . push ( UndoContext :: Event ( Box :: new ( current) ) ) ;
254
234
}
235
+ let r = c. request . clone ( ) ;
236
+ let a = action. clone ( ) ;
237
+ phase. player . handler = None ;
238
+ game. current_events . push ( phase) ;
239
+ end_custom_phase. clone ( ) (
240
+ game,
241
+ player_index,
242
+ & player_name,
243
+ a,
244
+ r,
245
+ details,
246
+ ) ;
247
+ return ;
255
248
}
256
249
}
257
- let is_current = phase. player . handler . is_some ( ) ;
258
- game. current_events . push ( phase) ;
259
- if is_current {
260
- return ;
261
- }
262
250
}
263
-
264
- if game
265
- . current_event_player ( )
266
- . last_priority_used
267
- . is_some_and ( |last| last < priority)
268
- {
269
- // already handled before
251
+ let is_current = phase. player . handler . is_some ( ) ;
252
+ game. current_events . push ( phase) ;
253
+ if is_current {
270
254
return ;
271
255
}
256
+ }
257
+
258
+ if game
259
+ . current_event_player ( )
260
+ . last_priority_used
261
+ . is_some_and ( |last| last < priority)
262
+ {
263
+ // already handled before
264
+ return ;
265
+ }
266
+
267
+ if let Some ( request) = start_custom_phase ( game, player_index, & player_name, details) {
268
+ let s = game. current_event_mut ( ) ;
269
+ s. player . last_priority_used = Some ( priority) ;
270
+ s. player . handler = Some ( CurrentEventHandler {
271
+ priority,
272
+ request : request. clone ( ) ,
273
+ response : None ,
274
+ origin : origin. clone ( ) ,
275
+ } ) ;
276
+ } ;
277
+ } )
278
+ }
272
279
273
- if let Some ( request ) = start_custom_phase ( game , player_index , & player_name , details )
274
- {
275
- let s = game . current_event_mut ( ) ;
276
- s . player . last_priority_used = Some ( priority) ;
277
- s . player . handler = Some ( CurrentEventHandler {
278
- priority ,
279
- request : request . clone ( ) ,
280
- response : None ,
281
- origin : origin . clone ( ) ,
282
- } ) ;
283
- } ;
284
- } ,
280
+ fn add_simple_current_event_listener < V , E , F > (
281
+ self ,
282
+ event : E ,
283
+ priority : i32 ,
284
+ listener : F ,
285
+ ) -> Self
286
+ where
287
+ E : Fn ( & mut PlayerEvents ) -> & mut CurrentEvent < V > + ' static + Clone ,
288
+ F : Fn ( & mut Game , usize , & str , & V ) + ' static + Clone ,
289
+ {
290
+ self . add_current_event_listener (
291
+ event ,
285
292
priority,
293
+ move |game, player_index, player_name, details| {
294
+ // only for the listener
295
+ listener ( game, player_index, player_name, details) ;
296
+ None
297
+ } ,
298
+ |_, _, _, _, _, _| { } ,
286
299
)
287
300
}
288
301
@@ -300,7 +313,12 @@ pub(crate) trait AbilityInitializerSetup: Sized {
300
313
event,
301
314
priority,
302
315
move |game, player_index, _player_name, details| {
303
- request ( game, player_index, details) . map ( CurrentEventRequest :: Payment )
316
+ request ( game, player_index, details)
317
+ . filter ( |r| {
318
+ r. iter ( )
319
+ . any ( |r| game. get_player ( player_index) . can_afford ( & r. cost ) )
320
+ } )
321
+ . map ( CurrentEventRequest :: Payment )
304
322
} ,
305
323
move |game, player_index, player_name, action, request, details| {
306
324
if let CurrentEventRequest :: Payment ( requests) = & request {
@@ -350,7 +368,7 @@ pub(crate) trait AbilityInitializerSetup: Sized {
350
368
let req = request ( game, player_index, details) ;
351
369
if let Some ( r) = & req {
352
370
if r. reward . possible_resource_types ( ) . len ( ) == 1 {
353
- let player_name = game. players [ player_index ] . get_name ( ) ;
371
+ let player_name = game. player_name ( player_index ) ;
354
372
let r = r. reward . default_payment ( ) ;
355
373
for log in g (
356
374
game,
@@ -689,7 +707,7 @@ pub(crate) trait AbilityInitializerSetup: Sized {
689
707
game,
690
708
& SelectedChoice :: new (
691
709
player_index,
692
- & game. get_player ( player_index) . get_name ( ) ,
710
+ & game. player_name ( player_index) ,
693
711
false ,
694
712
m. choices . clone ( ) ,
695
713
details,
0 commit comments