mirror of
git://xwords.git.sourceforge.net/gitroot/xwords/xwords
synced 2025-02-06 20:45:54 +01:00
pass current tray into util_userPickTile, removing to-be-traded tiles
first.
This commit is contained in:
parent
21456efa8b
commit
f69eb698b3
1 changed files with 73 additions and 9 deletions
|
@ -590,7 +590,7 @@ makeRobotMove( ServerCtxt* server )
|
||||||
XP_ASSERT( !!server_getEngineFor( server, turn ) );
|
XP_ASSERT( !!server_getEngineFor( server, turn ) );
|
||||||
finished = engine_findMove( server_getEngineFor( server, turn ),
|
finished = engine_findMove( server_getEngineFor( server, turn ),
|
||||||
model, model_getDictionary( model ),
|
model, model_getDictionary( model ),
|
||||||
tileSet->tiles, tileSet->nTiles,
|
tileSet->tiles, tileSet->nTiles, 0,
|
||||||
targetScore, &canMove, &newMove );
|
targetScore, &canMove, &newMove );
|
||||||
if ( finished ) {
|
if ( finished ) {
|
||||||
XP_UCHAR* str;
|
XP_UCHAR* str;
|
||||||
|
@ -902,13 +902,20 @@ client_readInitialMessage( ServerCtxt* server, XWStreamCtxt* stream )
|
||||||
XP_U32 gameID;
|
XP_U32 gameID;
|
||||||
PoolContext* pool;
|
PoolContext* pool;
|
||||||
|
|
||||||
|
/* version */
|
||||||
|
XP_U8 streamVersion = stream_getU8( stream );
|
||||||
|
XP_ASSERT( streamVersion == CUR_STREAM_VERS );
|
||||||
|
if ( streamVersion != CUR_STREAM_VERS ) {
|
||||||
|
return XP_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
gameID = stream_getBits( stream, 32 );
|
gameID = stream_getBits( stream, 32 );
|
||||||
XP_STATUSF( "read gameID of %ld; calling comms_setConnID", gameID );
|
XP_STATUSF( "read gameID of %ld; calling comms_setConnID", gameID );
|
||||||
server->vol.gi->gameID = gameID;
|
server->vol.gi->gameID = gameID;
|
||||||
comms_setConnID( server->vol.comms, gameID );
|
comms_setConnID( server->vol.comms, gameID );
|
||||||
|
|
||||||
XP_MEMSET( &localGI, 0, sizeof(localGI) );
|
XP_MEMSET( &localGI, 0, sizeof(localGI) );
|
||||||
gi_readFromStream( MPPARM(server->mpool) stream, &localGI );
|
gi_readFromStream( MPPARM(server->mpool) stream, streamVersion, &localGI );
|
||||||
localGI.serverRole = SERVER_ISCLIENT;
|
localGI.serverRole = SERVER_ISCLIENT;
|
||||||
|
|
||||||
/* so it's not lost (HACK!). Without this, a client won't have a default
|
/* so it's not lost (HACK!). Without this, a client won't have a default
|
||||||
|
@ -1036,8 +1043,11 @@ server_sendInitialMessage( ServerCtxt* server )
|
||||||
stream_open( stream );
|
stream_open( stream );
|
||||||
stream_putBits( stream, XWPROTO_NBITS, XWPROTO_CLIENT_SETUP );
|
stream_putBits( stream, XWPROTO_NBITS, XWPROTO_CLIENT_SETUP );
|
||||||
|
|
||||||
|
/* write version for server's benefit */
|
||||||
|
stream_putU8( stream, CUR_STREAM_VERS );
|
||||||
|
|
||||||
XP_STATUSF( "putting gameID %ld into msg", gameID );
|
XP_STATUSF( "putting gameID %ld into msg", gameID );
|
||||||
stream_putBits( stream, 32, gameID );
|
stream_putU32( stream, gameID );
|
||||||
|
|
||||||
makeSendableGICopy( server, &localGI, deviceIndex );
|
makeSendableGICopy( server, &localGI, deviceIndex );
|
||||||
gi_writeToStream( stream, &localGI );
|
gi_writeToStream( stream, &localGI );
|
||||||
|
@ -1267,33 +1277,84 @@ makeNotAVowel( ServerCtxt* server, Tile* newTile )
|
||||||
} /* makeNotAVowel */
|
} /* makeNotAVowel */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
static void
|
||||||
|
curTrayAsTexts( ServerCtxt* server, XP_U16 turn, const TrayTileSet* notInTray,
|
||||||
|
XP_U16* nUsedP, XP_UCHAR4* curTrayText )
|
||||||
|
{
|
||||||
|
const TrayTileSet* tileSet = model_getPlayerTiles( server->vol.model, turn );
|
||||||
|
DictionaryCtxt* dict = model_getDictionary( server->vol.model );
|
||||||
|
XP_U16 i, j;
|
||||||
|
XP_U16 size = tileSet->nTiles;
|
||||||
|
Tile* tp = tileSet->tiles;
|
||||||
|
XP_U16 tradedTiles[MAX_TRAY_TILES];
|
||||||
|
XP_U16 nNotInTray = 0;
|
||||||
|
XP_U16 nUsed = 0;
|
||||||
|
|
||||||
|
XP_MEMSET( tradedTiles, 0xFF, sizeof(tradedTiles) );
|
||||||
|
if ( !!notInTray ) {
|
||||||
|
Tile* tp = notInTray->tiles;
|
||||||
|
nNotInTray = notInTray->nTiles;
|
||||||
|
for ( i = 0; i < nNotInTray; ++i ) {
|
||||||
|
tradedTiles[i] = *tp++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for ( i = 0; i < size; ++i ) {
|
||||||
|
Tile tile = *tp++;
|
||||||
|
XP_Bool toBeTraded = XP_FALSE;
|
||||||
|
|
||||||
|
for ( j = 0; j < nNotInTray; ++j ) {
|
||||||
|
if ( tradedTiles[j] == tile ) {
|
||||||
|
tradedTiles[j] = 0xFFFF;
|
||||||
|
toBeTraded = XP_TRUE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( !toBeTraded ) {
|
||||||
|
dict_tilesToString( dict, &tile, 1, (XP_UCHAR*)&curTrayText[nUsed++] );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*nUsedP = nUsed;
|
||||||
|
} /* curTrayAsTexts */
|
||||||
|
|
||||||
/* Get tiles for one user. If picking is available, let user pick until
|
/* Get tiles for one user. If picking is available, let user pick until
|
||||||
* cancels. Otherwise, and after cancel, pick for 'im.
|
* cancels. Otherwise, and after cancel, pick for 'im.
|
||||||
*/
|
*/
|
||||||
static void
|
static void
|
||||||
fetchTiles( ServerCtxt* server, XP_U16 playerNum, XP_U16 nToFetch,
|
fetchTiles( ServerCtxt* server, XP_U16 playerNum, XP_U16 nToFetch,
|
||||||
TrayTileSet* resultTiles )
|
const TrayTileSet* tradedTiles, TrayTileSet* resultTiles )
|
||||||
{
|
{
|
||||||
XP_Bool ask;
|
XP_Bool ask;
|
||||||
XP_U16 nSoFar = 0;
|
XP_U16 nSoFar = 0;
|
||||||
|
XP_U16 nLeft;
|
||||||
PoolContext* pool = server->pool;
|
PoolContext* pool = server->pool;
|
||||||
TrayTileSet oneTile;
|
TrayTileSet oneTile;
|
||||||
PickInfo pi;
|
PickInfo pi;
|
||||||
|
XP_UCHAR4 curTray[MAX_TRAY_TILES];
|
||||||
|
DictionaryCtxt* dict = model_getDictionary( server->vol.model );
|
||||||
|
|
||||||
XP_ASSERT( !!pool );
|
XP_ASSERT( !!pool );
|
||||||
#ifdef FEATURE_TRAY_EDIT
|
#ifdef FEATURE_TRAY_EDIT
|
||||||
ask = server->vol.gi->allowPickTiles
|
ask = server->vol.gi->allowPickTiles
|
||||||
&& (!server->vol.gi->players[playerNum].isRobot
|
&& !server->vol.gi->players[playerNum].isRobot;
|
||||||
|| server->vol.gi->allowPickTilesRobot);
|
|
||||||
#else
|
#else
|
||||||
ask = XP_FALSE;
|
ask = XP_FALSE;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
nLeft = pool_getNTilesLeft( pool );
|
||||||
|
if ( nLeft < nToFetch ) {
|
||||||
|
nToFetch = nLeft;
|
||||||
|
}
|
||||||
|
|
||||||
oneTile.nTiles = 1;
|
oneTile.nTiles = 1;
|
||||||
|
|
||||||
pi.why = PICK_FOR_CHEAT;
|
pi.why = PICK_FOR_CHEAT;
|
||||||
pi.nTotal = nToFetch;
|
pi.nTotal = nToFetch;
|
||||||
pi.thisPick = 0;
|
pi.thisPick = 0;
|
||||||
|
pi.curTiles = curTray;
|
||||||
|
|
||||||
|
curTrayAsTexts( server, playerNum, tradedTiles, &pi.nCurTiles, curTray );
|
||||||
|
|
||||||
#ifdef FEATURE_TRAY_EDIT /* good compiler would note ask==0, but... */
|
#ifdef FEATURE_TRAY_EDIT /* good compiler would note ask==0, but... */
|
||||||
/* First ask until cancelled */
|
/* First ask until cancelled */
|
||||||
|
@ -1305,6 +1366,7 @@ fetchTiles( ServerCtxt* server, XP_U16 playerNum, XP_U16 nToFetch,
|
||||||
|
|
||||||
model_packTilesUtil( server->vol.model, pool,
|
model_packTilesUtil( server->vol.model, pool,
|
||||||
XP_TRUE, &nUsed, texts, tiles );
|
XP_TRUE, &nUsed, texts, tiles );
|
||||||
|
|
||||||
++pi.thisPick;
|
++pi.thisPick;
|
||||||
chosen = util_userPickTile( server->vol.util, &pi,
|
chosen = util_userPickTile( server->vol.util, &pi,
|
||||||
playerNum, texts, nUsed );
|
playerNum, texts, nUsed );
|
||||||
|
@ -1316,6 +1378,8 @@ fetchTiles( ServerCtxt* server, XP_U16 playerNum, XP_U16 nToFetch,
|
||||||
oneTile.tiles[0] = tile;
|
oneTile.tiles[0] = tile;
|
||||||
pool_removeTiles( pool, &oneTile );
|
pool_removeTiles( pool, &oneTile );
|
||||||
|
|
||||||
|
(void)dict_tilesToString( dict, &tile, 1, (XP_UCHAR*)&curTray[pi.nCurTiles++] );
|
||||||
|
|
||||||
resultTiles->tiles[nSoFar++] = tile;
|
resultTiles->tiles[nSoFar++] = tile;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1362,7 +1426,7 @@ assignTilesToAll( ServerCtxt* server )
|
||||||
}
|
}
|
||||||
for ( i = 0; i < nPlayers; ++i ) {
|
for ( i = 0; i < nPlayers; ++i ) {
|
||||||
TrayTileSet newTiles;
|
TrayTileSet newTiles;
|
||||||
fetchTiles( server, i, numAssigned, &newTiles );
|
fetchTiles( server, i, numAssigned, NULL, &newTiles );
|
||||||
model_assignPlayerTiles( model, i, &newTiles );
|
model_assignPlayerTiles( model, i, &newTiles );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1778,7 +1842,7 @@ server_commitMove( ServerCtxt* server )
|
||||||
++server->nv.nPassesInRow;
|
++server->nv.nPassesInRow;
|
||||||
}
|
}
|
||||||
|
|
||||||
fetchTiles( server, turn, nTilesMoved, &newTiles );
|
fetchTiles( server, turn, nTilesMoved, NULL, &newTiles );
|
||||||
|
|
||||||
#ifndef XWFEATURE_STANDALONE_ONLY
|
#ifndef XWFEATURE_STANDALONE_ONLY
|
||||||
if ( isClient ) {
|
if ( isClient ) {
|
||||||
|
@ -1846,7 +1910,7 @@ server_commitTrade( ServerCtxt* server, TileBit selBits )
|
||||||
|
|
||||||
removeTradedTiles( server, selBits, &oldTiles );
|
removeTradedTiles( server, selBits, &oldTiles );
|
||||||
|
|
||||||
fetchTiles( server, turn, oldTiles.nTiles, &newTiles );
|
fetchTiles( server, turn, oldTiles.nTiles, &oldTiles, &newTiles );
|
||||||
|
|
||||||
#ifndef XWFEATURE_STANDALONE_ONLY
|
#ifndef XWFEATURE_STANDALONE_ONLY
|
||||||
if ( server->vol.gi->serverRole == SERVER_ISCLIENT ) {
|
if ( server->vol.gi->serverRole == SERVER_ISCLIENT ) {
|
||||||
|
|
Loading…
Add table
Reference in a new issue