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
model_canUndo( const ModelCtxt* model )
{
/* PENDING Turning off undo for duplicate mode for now. */
XP_Bool result = !model->vol.gi->inDuplicateMode;
XP_Bool inDuplicateMode = 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 ) {
const StackCtxt* stack = model->vol.stack;
XP_U16 nStackEntries = stack_getNEntries( stack );
/* 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;
}
return result;

View file

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

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;
char* explStr = strFromStream( expl );
char* wordsStr;
if ( NULL == words ) {
wordsStr = malloc(1);
wordsStr[0] = '\0';
} else {
wordsStr = strFromStream( words );
gchar* msg = g_strdup_printf( "informMove():\nexpl: %s", explStr );
if ( NULL != words ) {
char* wordsStr = strFromStream( words );
gchar* prev = msg;
gchar* postfix = g_strdup_printf( "words: %s", wordsStr );
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 );
free( explStr );
free( wordsStr );
free( msg );
g_free( msg );
}
static void