@@ -2,8 +2,8 @@ use std::{collections::HashMap, ops::Range};
22
33use chrono:: { DateTime , Utc } ;
44
5- // Standard-pool 5★ HSR characters and light cones. A pull whose item is in this list and whose
6- // timestamp falls outside every rate-up banner is a Loss; everything else counts as a Win.
5+ // Standard-pool 5★ HSR characters and light cones. A pull outside every configured banner window
6+ // is a Loss only when the item is in this list; otherwise it is a Win.
77pub const HSR_STANDARD : & [ i32 ] = & [
88 1209 , 1004 , 1101 , 1211 , 1104 , 1107 , 1003 , // characters
99 23000 , 23002 , 23003 , 23004 , 23005 , 23012 , 23013 , // light cones
@@ -20,9 +20,19 @@ pub fn is_win_fn<'a>(
2020 standard : & ' a [ i32 ] ,
2121) -> impl Fn ( i32 , DateTime < Utc > ) -> bool + ' a {
2222 move |item_id, timestamp| {
23- banners
24- . get ( & item_id)
25- . is_some_and ( |v| v. iter ( ) . any ( |r| r. contains ( & timestamp) ) )
26- || !standard. contains ( & item_id)
23+ let matching_items: Vec < _ > = banners
24+ . iter ( )
25+ . filter ( |( _, ranges) | ranges. iter ( ) . any ( |range| range. contains ( & timestamp) ) )
26+ . map ( |( item_id, _) | * item_id)
27+ . collect ( ) ;
28+
29+ let is_standard = standard. contains ( & item_id) ;
30+ let is_win = if matching_items. is_empty ( ) {
31+ !is_standard
32+ } else {
33+ matching_items. contains ( & item_id)
34+ } ;
35+
36+ is_win
2737 }
2838}
0 commit comments