simplify move expl tracking; don't show for dup-mode robots

Removed a boolean that seemed unnecessary. Stopped showing
move-explanations for robots in duplicate mode. They were being shown
too early thanks to bad logic, but I don't think there's any call for
them at all. A robot's move is only interesting if it's the one that
wins the turn.
This commit is contained in:
Eric House 2022-08-04 16:03:07 -07:00
parent 818868bdb2
commit c00bbf8ef1
3 changed files with 31 additions and 34 deletions

View file

@ -955,14 +955,17 @@ model_rejectPreviousMove( ModelCtxt* model, XWEnv xwe,
XP_Bool XP_Bool
model_canUndo( const ModelCtxt* model ) model_canUndo( const ModelCtxt* model )
{ {
/* PENDING Turning off undo for duplicate mode for now. */ XP_Bool inDuplicateMode = model->vol.gi->inDuplicateMode;
XP_Bool result = !model->vol.gi->inDuplicateMode; /* I'm turning off undo for duplicate mode for now to avoid
crashes. Ideally a duplicate mode player could change his mind until
the timer fires, so try to fix this. PENDING*/
XP_Bool result = !inDuplicateMode;
if ( result ) { if ( result ) {
const StackCtxt* stack = model->vol.stack; const StackCtxt* stack = model->vol.stack;
XP_U16 nStackEntries = stack_getNEntries( stack ); XP_U16 nStackEntries = stack_getNEntries( stack );
/* More than just tile assignment? */ /* More than just tile assignment? */
XP_U16 assignCount = model->vol.gi->inDuplicateMode ? 1 : model->nPlayers; XP_U16 assignCount = inDuplicateMode ? 1 : model->nPlayers;
result = nStackEntries > assignCount; result = nStackEntries > assignCount;
} }
return result; return result;

View file

@ -113,7 +113,6 @@ typedef struct ServerVolatiles {
GameOverListener gameOverListener; GameOverListener gameOverListener;
void* gameOverData; void* gameOverData;
XP_U16 bitsPerTile; XP_U16 bitsPerTile;
XP_Bool showPrevMove;
XP_Bool pickTilesCalled[MAX_NUM_PLAYERS]; XP_Bool pickTilesCalled[MAX_NUM_PLAYERS];
} ServerVolatiles; } ServerVolatiles;
@ -1027,7 +1026,6 @@ setPrevMoveStream( ServerCtxt* server, XWEnv xwe, XWStreamCtxt* stream )
{ {
if ( !server->nv._prevMoveStream ) { if ( !server->nv._prevMoveStream ) {
server->nv._prevMoveStream = stream; server->nv._prevMoveStream = stream;
// mkServerStream( server );
} else { } else {
XP_LOGFF( "appending to existing stream" ); XP_LOGFF( "appending to existing stream" );
stream_putBytes( server->nv._prevMoveStream, stream_getPtr( stream ), stream_putBytes( server->nv._prevMoveStream, stream_getPtr( stream ),
@ -1049,7 +1047,6 @@ dupe_setupShowTrade( ServerCtxt* server, XWEnv xwe, XP_U16 nTiles )
stream_catString( stream, buf ); stream_catString( stream, buf );
setPrevMoveStream( server, xwe, stream ); setPrevMoveStream( server, xwe, stream );
server->vol.showPrevMove = XP_TRUE;
} }
static void static void
@ -1089,8 +1086,7 @@ dupe_setupShowMove( ServerCtxt* server, XWEnv xwe, XP_U16* scores )
} }
setPrevMoveStream( server, xwe, stream ); setPrevMoveStream( server, xwe, stream );
server->vol.showPrevMove = XP_TRUE; } /* dupe_setupShowMove */
}
static void static void
addDupeStuffMark( XWStreamCtxt* stream, DUPE_STUFF typ ) addDupeStuffMark( XWStreamCtxt* stream, DUPE_STUFF typ )
@ -1399,8 +1395,6 @@ robotTradeTiles( ServerCtxt* server, MoveInfo* newMove )
tradeTiles[numToTrade++] = curTiles[ii]; tradeTiles[numToTrade++] = curTiles[ii];
} }
} }
} /* robotTradeTiles */ } /* robotTradeTiles */
#endif #endif
@ -1473,14 +1467,15 @@ makeRobotMove( ServerCtxt* server, XWEnv xwe )
} }
if ( forceTrade || searchComplete ) { if ( forceTrade || searchComplete ) {
const XP_UCHAR* str; const XP_UCHAR* str;
XWStreamCtxt* stream = NULL;
XP_Bool trade = forceTrade || XP_Bool trade = forceTrade ||
((newMove.nTiles == 0) && !canMove && ((newMove.nTiles == 0) && !canMove &&
(server_countTilesInPool( server ) >= gi->traySize)); (server_countTilesInPool( server ) >= gi->traySize));
server->vol.showPrevMove = XP_TRUE; /* I've forgotten why I earlier wanted to explain robot moves in
if ( inDuplicateMode(server) || server->nv.showRobotScores ) { duplicate games. I don't want to now. */
XWStreamCtxt* stream = NULL;
if ( server->nv.showRobotScores && ! inDuplicateMode(server) ) {
stream = mkServerStream( server ); stream = mkServerStream( server );
} }
@ -1520,14 +1515,15 @@ makeRobotMove( ServerCtxt* server, XWEnv xwe )
newMove.nTiles, turn ); newMove.nTiles, turn );
if ( !!stream ) { if ( !!stream ) {
setPrevMoveStream( server, xwe, stream );
XWStreamCtxt* wordsStream = mkServerStream( server ); XWStreamCtxt* wordsStream = mkServerStream( server );
WordNotifierInfo* ni = WordNotifierInfo* ni =
model_initWordCounter( model, wordsStream ); model_initWordCounter( model, wordsStream );
(void)model_checkMoveLegal( model, xwe, turn, stream, ni ); (void)model_checkMoveLegal( model, xwe, turn, stream, ni );
setPrevMoveStream( server, xwe, stream );
server->nv.prevWordsStream = wordsStream; server->nv.prevWordsStream = wordsStream;
} }
result = server_commitMove( server, xwe, turn, NULL ); result = commitMoveImpl( server, xwe, turn, NULL, XP_FALSE );
} else { } else {
result = XP_FALSE; result = XP_FALSE;
} }
@ -1599,7 +1595,6 @@ showPrevScore( ServerCtxt* server, XWEnv xwe )
{ {
/* showRobotScores can be changed between turns */ /* showRobotScores can be changed between turns */
if ( inDuplicateMode( server ) || server->nv.showRobotScores ) { if ( inDuplicateMode( server ) || server->nv.showRobotScores ) {
XW_UtilCtxt* util = server->vol.util;
XW_DUtilCtxt* dutil = server->vol.dutil; XW_DUtilCtxt* dutil = server->vol.dutil;
XWStreamCtxt* stream; XWStreamCtxt* stream;
XP_UCHAR buf[128]; XP_UCHAR buf[128];
@ -1634,7 +1629,7 @@ showPrevScore( ServerCtxt* server, XWEnv xwe )
stream_destroy( prevStream, xwe ); stream_destroy( prevStream, xwe );
} }
util_informMove( util, xwe, prevTurn, stream, server->nv.prevWordsStream ); util_informMove( server->vol.util, xwe, prevTurn, stream, server->nv.prevWordsStream );
stream_destroy( stream, xwe ); stream_destroy( stream, xwe );
if ( !!server->nv.prevWordsStream ) { if ( !!server->nv.prevWordsStream ) {
@ -2717,12 +2712,14 @@ nextTurn( ServerCtxt* server, XWEnv xwe, XP_S16 nxtTurn )
} }
} }
if ( server->vol.showPrevMove ) { if ( NULL != server->nv._prevMoveStream && XWSTATE_NEED_SHOWSCORE != server->nv.gameState ) {
server->vol.showPrevMove = XP_FALSE;
if ( inDuplicateMode(server) || server->nv.showRobotScores ) { if ( inDuplicateMode(server) || server->nv.showRobotScores ) {
server->nv.stateAfterShow = server->nv.gameState; server->nv.stateAfterShow = server->nv.gameState;
SETSTATE( server, XWSTATE_NEED_SHOWSCORE ); SETSTATE( server, XWSTATE_NEED_SHOWSCORE ); /* here? */
moreToDo = XP_TRUE; moreToDo = XP_TRUE;
} else {
XP_ASSERT( 0 );
XP_LOGFF( "ERROR: have move stream I won't display" );
} }
} }
@ -3000,7 +2997,6 @@ reflectMoveAndInform( ServerCtxt* server, XWEnv xwe, XWStreamCtxt* stream )
&tradedTiles, &newTiles ); &tradedTiles, &newTiles );
pool_replaceTiles( server->pool, &tradedTiles ); pool_replaceTiles( server->pool, &tradedTiles );
server->vol.showPrevMove = XP_TRUE;
mvStream = makeTradeReportIf( server, xwe, &tradedTiles ); mvStream = makeTradeReportIf( server, xwe, &tradedTiles );
} else { } else {
@ -3014,7 +3010,6 @@ reflectMoveAndInform( ServerCtxt* server, XWEnv xwe, XWStreamCtxt* stream )
sendMoveToClientsExcept( server, xwe, whoMoved, isLegalMove, &newTiles, sendMoveToClientsExcept( server, xwe, whoMoved, isLegalMove, &newTiles,
(TrayTileSet*)NULL, sourceClientIndex ); (TrayTileSet*)NULL, sourceClientIndex );
server->vol.showPrevMove = XP_TRUE;
if ( isLegalMove ) { if ( isLegalMove ) {
mvStream = makeMoveReportIf( server, xwe, &wordsStream ); mvStream = makeMoveReportIf( server, xwe, &wordsStream );
} }
@ -3092,10 +3087,8 @@ reflectMove( ServerCtxt* server, XWEnv xwe, XWStreamCtxt* stream )
model_makeTileTrade( model, whoMoved, &tradedTiles, &newTiles ); model_makeTileTrade( model, whoMoved, &tradedTiles, &newTiles );
pool_replaceTiles( server->pool, &tradedTiles ); pool_replaceTiles( server->pool, &tradedTiles );
server->vol.showPrevMove = XP_TRUE;
mvStream = makeTradeReportIf( server, xwe, &tradedTiles ); mvStream = makeTradeReportIf( server, xwe, &tradedTiles );
} else { } else {
server->vol.showPrevMove = XP_TRUE;
mvStream = makeMoveReportIf( server, xwe, &wordsStream ); mvStream = makeMoveReportIf( server, xwe, &wordsStream );
model_commitTurn( model, xwe, whoMoved, &newTiles ); model_commitTurn( model, xwe, whoMoved, &newTiles );
} }

View file

@ -1827,18 +1827,19 @@ gtk_util_informMove( XW_UtilCtxt* uc, XWEnv XP_UNUSED(xwe), XP_S16 XP_UNUSED(tur
{ {
GtkGameGlobals* globals = (GtkGameGlobals*)uc->closure; GtkGameGlobals* globals = (GtkGameGlobals*)uc->closure;
char* explStr = strFromStream( expl ); char* explStr = strFromStream( expl );
char* wordsStr; gchar* msg = g_strdup_printf( "informMove():\nexpl: %s", explStr );
if ( NULL == words ) { if ( NULL != words ) {
wordsStr = malloc(1); char* wordsStr = strFromStream( words );
wordsStr[0] = '\0'; gchar* prev = msg;
} else { gchar* postfix = g_strdup_printf( "words: %s", wordsStr );
wordsStr = strFromStream( words ); free( wordsStr );
msg = g_strconcat( msg, postfix, NULL );
g_free( prev );
g_free( postfix );
} }
gchar* msg = g_strdup_printf( "informMove():\nexpl: %swords: %s", explStr, wordsStr );
(void)gtkask( globals->window, msg, GTK_BUTTONS_OK, NULL ); (void)gtkask( globals->window, msg, GTK_BUTTONS_OK, NULL );
free( explStr ); free( explStr );
free( wordsStr ); g_free( msg );
free( msg );
} }
static void static void