fix crash with 23x23 (linux only); allow 6 blanks

Portuguese will want six blanks for a 21x21 board, so might as well
not crash in case that becomes a thing.
This commit is contained in:
Eric House 2022-04-04 17:28:10 +02:00
parent bd6f6e373c
commit 1c9fe6745c
3 changed files with 28 additions and 17 deletions

View file

@ -548,17 +548,23 @@ getCountsFor( const DictionaryCtxt* dict, XP_U16 nCols )
/* don't have it in the wordlist? Extrapolate */ /* don't have it in the wordlist? Extrapolate */
if ( !found ) { if ( !found ) {
const Tile blank = dict_getBlankTile( dict );
XP_U16 pct = (nCols * nCols * 100) / (15 * 15); XP_U16 pct = (nCols * nCols * 100) / (15 * 15);
XP_U8* src15 = dict->counts[15>>1]; XP_U8* src15 = dict->counts[15>>1];
XP_ASSERT( !!src15 ); XP_ASSERT( !!src15 );
for ( int ii = 0; ii < dict->nFaces; ++ii ) { for ( Tile tile = 0; tile < dict->nFaces; ++tile ) {
XP_U16 count = src15[ii]; XP_U16 count = src15[tile];
XP_U16 newCount = count * pct / 100; XP_U16 newCount = count * pct / 100;
if ( 50 < (count * pct) % 100 ) { if ( 50 < (count * pct) % 100 ) {
++newCount; ++newCount;
} }
counts[ii] = newCount; XP_ASSERT( tile != blank || newCount <= MAX_NUM_BLANKS );
if ( tile == blank && newCount > MAX_NUM_BLANKS ) {
newCount = MAX_NUM_BLANKS;
}
counts[tile] = newCount;
} }
} }
} }

View file

@ -419,19 +419,24 @@ getSquareBonus( XP_U16 nCols, XP_U16 col, XP_U16 row )
row = tmp; row = tmp;
} }
/* For a smaller board, skip the outer "rings" */ /* For a smaller board, skip the outer "rings." For larger,
XP_U16 adj = (21 - nCols) / 2; outer rings are empty */
col += adj;
row += adj;
XP_U16 index = col;
for ( XP_U16 ii = 1; ii <= row; ++ii ) {
index += ii;
}
XWBonusType result = BONUS_NONE; XWBonusType result = BONUS_NONE;
if ( index < VSIZE(sTwentyOne)) { XP_U16 adj = (21 - nCols) / 2;
result = sTwentyOne[index]; if ( 0 <= adj ) {
col += adj;
row += adj;
if ( col <= 21 && row <= 21 ) {
XP_U16 index = col;
for ( XP_U16 ii = 1; ii <= row; ++ii ) {
index += ii;
}
if ( index < VSIZE(sTwentyOne)) {
result = sTwentyOne[index];
}
}
} }
return result; return result;
} }

View file

@ -51,8 +51,8 @@ extern "C" {
#define CELL_OWNER(t) (((t)&CELL_OWNER_MASK) >> CELL_OWNER_OFFSET) #define CELL_OWNER(t) (((t)&CELL_OWNER_MASK) >> CELL_OWNER_OFFSET)
#define MAX_UNIQUE_TILES 64 /* max tile non-blank faces */ #define MAX_UNIQUE_TILES 64 /* max tile non-blank faces */
#define MAX_NUM_BLANKS 4 /* Portuguese has 3 for a 15x15 game; can go higer on larger boards */
#define MAX_NUM_BLANKS 6
typedef struct BlankQueue { typedef struct BlankQueue {
XP_U16 nBlanks; XP_U16 nBlanks;