@@ -81,7 +81,7 @@ function find_save(state, target, card) {
81
81
* @returns {Clue | undefined } The TCM if valid, otherwise undefined.
82
82
*/
83
83
function find_tcm ( state , target , saved_cards , trash_card ) {
84
- logger . info ( `saved cards ${ saved_cards . map ( c => Utils . logCard ( c ) ) . join ( ',' ) } , trash card ${ Utils . logCard ( trash_card ) } ` ) ;
84
+ logger . info ( `attempting tcm with trash card ${ Utils . logCard ( trash_card ) } , saved cards ${ saved_cards . map ( c => Utils . logCard ( c ) ) . join ( ',' ) } ` ) ;
85
85
const chop = saved_cards . at ( - 1 ) ;
86
86
87
87
// Colour or rank save (if possible) is preferred over trash chop move
@@ -101,22 +101,17 @@ function find_tcm(state, target, saved_cards, trash_card) {
101
101
return ;
102
102
}
103
103
104
- let saved_trash = 0 ;
105
- // At most 1 trash card should be saved
106
- for ( const card of saved_cards ) {
107
- const { suitIndex, rank, order } = card ;
108
-
109
- // Saving a trash card or two of the same card
110
- if ( isTrash ( state , state . ourPlayerIndex , suitIndex , rank , order ) ||
111
- saved_cards . some ( c => card . matches ( c . suitIndex , c . rank ) && card . order > c . order )
112
- ) {
113
- saved_trash ++ ;
114
- logger . info ( `would save trash ${ Utils . logCard ( card ) } ` ) ;
115
- }
116
- }
104
+ const saved_trash = saved_cards . filter ( card => {
105
+ const { suitIndex, rank, order} = card ;
106
+
107
+ return isTrash ( state , state . ourPlayerIndex , suitIndex , rank , order ) || // Saving a trash card
108
+ saved_cards . some ( c => card . matches ( c . suitIndex , c . rank ) && card . order > c . order ) ; // Saving 2 of the same card
109
+ } ) . map ( c => Utils . logCard ( c ) ) ;
110
+
111
+ logger . info ( `would save ${ saved_trash . length === 0 ? 'no' : saved_trash . join ( ) } trash` ) ;
117
112
118
- // There has to be more useful cards saved than trash cards, and a trash card should not be on chop (otherwise can wait)
119
- if ( saved_trash <= 1 && ( saved_cards . length - saved_trash ) > saved_trash ) {
113
+ // There has to be more useful cards saved than trash cards
114
+ if ( saved_trash . length <= 1 && ( saved_cards . length - saved_trash . length ) > saved_trash . length ) {
120
115
const possible_clues = direct_clues ( state , target , trash_card ) ;
121
116
122
117
const tcm = possible_clues . find ( clue => {
@@ -228,7 +223,6 @@ export function find_clues(state, options = {}) {
228
223
if ( ! options . ignoreCM && isBasicTrash ( state , suitIndex , rank ) ) {
229
224
// Trash chop move (we only want to find the rightmost tcm)
230
225
if ( ! ( card . clued || card . chop_moved ) && cardIndex !== chopIndex && ! found_tcm ) {
231
- logger . info ( 'looking for tcm on' , Utils . logCard ( card ) ) ;
232
226
const saved_cards = hand . slice ( cardIndex + 1 ) . filter ( c => ! ( c . clued || c . chop_moved ) ) ;
233
227
// Use original save clue if tcm not found
234
228
save_clues [ target ] = find_tcm ( state , target , saved_cards , card ) ?? save_clues [ target ] ;
0 commit comments