mirror of
git://xwords.git.sourceforge.net/gitroot/xwords/xwords
synced 2025-02-05 20:45:49 +01:00
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:
parent
bd6f6e373c
commit
1c9fe6745c
3 changed files with 28 additions and 17 deletions
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Add table
Reference in a new issue