mirror of
git://xwords.git.sourceforge.net/gitroot/xwords/xwords
synced 2025-01-08 05:24:39 +01:00
new functions to figure out score of player's most recent move
This commit is contained in:
parent
f6d4ea8e6a
commit
7e860c9124
1 changed files with 93 additions and 11 deletions
104
common/model.c
104
common/model.c
|
@ -559,12 +559,15 @@ model_undoLatestMoves( ModelCtxt* model, PoolContext* pool,
|
||||||
|
|
||||||
/* get the tiles out of player's tray and back into the
|
/* get the tiles out of player's tray and back into the
|
||||||
pool */
|
pool */
|
||||||
replaceNewTiles( model, pool, turn, &entry.u.move.newTiles );
|
if ( !!pool ) {
|
||||||
|
replaceNewTiles( model, pool, turn, &entry.u.move.newTiles );
|
||||||
|
}
|
||||||
|
|
||||||
undoFromMoveInfo( model, turn, blankTile,
|
undoFromMoveInfo( model, turn, blankTile,
|
||||||
&entry.u.move.moveInfo );
|
&entry.u.move.moveInfo );
|
||||||
} else if ( entry.moveType == TRADE_TYPE ) {
|
} else if ( entry.moveType == TRADE_TYPE ) {
|
||||||
|
|
||||||
|
XP_ASSERT ( !!pool );
|
||||||
replaceNewTiles( model, pool, turn, &entry.u.trade.newTiles );
|
replaceNewTiles( model, pool, turn, &entry.u.trade.newTiles );
|
||||||
|
|
||||||
pool_removeTiles( pool, &entry.u.trade.oldTiles );
|
pool_removeTiles( pool, &entry.u.trade.oldTiles );
|
||||||
|
@ -1508,12 +1511,28 @@ printMovePost( ModelCtxt* model, XP_U16 moveN, StackEntry* entry,
|
||||||
printString( stream, (XP_UCHAR*)XP_CR );
|
printString( stream, (XP_UCHAR*)XP_CR );
|
||||||
} /* printMovePost */
|
} /* printMovePost */
|
||||||
|
|
||||||
|
static ModelCtxt*
|
||||||
|
makeTmpModel( ModelCtxt* model, XWStreamCtxt* stream,
|
||||||
|
MovePrintFuncPre mpf_pre, MovePrintFuncPost mpf_post,
|
||||||
|
void* closure )
|
||||||
|
{
|
||||||
|
ModelCtxt* tmpModel = model_make( MPPARM(model->vol.mpool)
|
||||||
|
model_getDictionary(model),
|
||||||
|
model->vol.util, model_numCols(model),
|
||||||
|
model_numRows(model));
|
||||||
|
model_setNPlayers( tmpModel, model->nPlayers );
|
||||||
|
|
||||||
|
buildModelFromStack( tmpModel, model->vol.stack, stream,
|
||||||
|
mpf_pre, mpf_post, closure );
|
||||||
|
|
||||||
|
return tmpModel;
|
||||||
|
} /* makeTmpModel */
|
||||||
|
|
||||||
void
|
void
|
||||||
model_writeGameHistory( ModelCtxt* model, XWStreamCtxt* stream,
|
model_writeGameHistory( ModelCtxt* model, XWStreamCtxt* stream,
|
||||||
ServerCtxt* server, XP_Bool gameOver )
|
ServerCtxt* server, XP_Bool gameOver )
|
||||||
{
|
{
|
||||||
ModelCtxt* tmpModel;
|
ModelCtxt* tmpModel;
|
||||||
StackCtxt* stack = model->vol.stack;
|
|
||||||
MovePrintClosure closure;
|
MovePrintClosure closure;
|
||||||
|
|
||||||
closure.stream = stream;
|
closure.stream = stream;
|
||||||
|
@ -1521,15 +1540,8 @@ model_writeGameHistory( ModelCtxt* model, XWStreamCtxt* stream,
|
||||||
closure.keepHidden = !gameOver;
|
closure.keepHidden = !gameOver;
|
||||||
closure.nPrinted = 0;
|
closure.nPrinted = 0;
|
||||||
|
|
||||||
tmpModel = model_make( MPPARM(model->vol.mpool)
|
tmpModel = makeTmpModel( model, stream, printMovePre, printMovePost,
|
||||||
model_getDictionary(model),
|
&closure );
|
||||||
model->vol.util, model_numCols(model),
|
|
||||||
model_numRows(model));
|
|
||||||
model_setNPlayers( tmpModel, model->nPlayers );
|
|
||||||
|
|
||||||
buildModelFromStack( tmpModel, stack, stream,
|
|
||||||
printMovePre, printMovePost,
|
|
||||||
&closure );
|
|
||||||
|
|
||||||
if ( gameOver ) {
|
if ( gameOver ) {
|
||||||
/* if the game's over, it shouldn't matter which model I pass to this
|
/* if the game's over, it shouldn't matter which model I pass to this
|
||||||
|
@ -1540,6 +1552,76 @@ model_writeGameHistory( ModelCtxt* model, XWStreamCtxt* stream,
|
||||||
model_destroy( tmpModel );
|
model_destroy( tmpModel );
|
||||||
} /* model_writeGameHistory */
|
} /* model_writeGameHistory */
|
||||||
|
|
||||||
|
static void
|
||||||
|
scoreLastMove( ModelCtxt* model, MoveInfo* moveInfo, XP_U16 howMany,
|
||||||
|
XP_UCHAR* buf, XP_U16* bufLen )
|
||||||
|
{
|
||||||
|
|
||||||
|
if ( moveInfo->nTiles == 0 ) {
|
||||||
|
*bufLen = XP_SNPRINTF( buf, *bufLen, "Passed" );
|
||||||
|
} else {
|
||||||
|
XP_U16 score;
|
||||||
|
XP_UCHAR wordBuf[MAX_ROWS+1];
|
||||||
|
|
||||||
|
ModelCtxt* tmpModel = makeTmpModel( model, NULL, NULL, NULL, NULL );
|
||||||
|
XP_U16 turn;
|
||||||
|
XP_S16 moveNum;
|
||||||
|
|
||||||
|
model_undoLatestMoves( tmpModel, NULL, howMany, &turn, &moveNum );
|
||||||
|
|
||||||
|
score = figureMoveScore( tmpModel, moveInfo, (EngineCtxt*)NULL,
|
||||||
|
(XWStreamCtxt*)NULL, XP_TRUE,
|
||||||
|
(WordNotifierInfo*)NULL, wordBuf );
|
||||||
|
|
||||||
|
model_destroy( tmpModel );
|
||||||
|
|
||||||
|
*bufLen = XP_SNPRINTF( buf, *bufLen, "%s for %d", wordBuf, score );
|
||||||
|
}
|
||||||
|
} /* scoreLastMove */
|
||||||
|
|
||||||
|
XP_Bool
|
||||||
|
model_getPlayersLastScore( ModelCtxt* model, XP_S16 player,
|
||||||
|
XP_UCHAR* expl, XP_U16* explLen )
|
||||||
|
{
|
||||||
|
StackCtxt* stack = model->vol.stack;
|
||||||
|
XP_S16 nEntries, which;
|
||||||
|
StackEntry entry;
|
||||||
|
XP_Bool found = XP_FALSE;
|
||||||
|
|
||||||
|
XP_ASSERT( !!stack );
|
||||||
|
XP_ASSERT( player >= 0 );
|
||||||
|
|
||||||
|
nEntries = stack_getNEntries( stack );
|
||||||
|
|
||||||
|
for ( which = nEntries; which >= 0; ) {
|
||||||
|
if ( stack_getNthEntry( stack, --which, &entry ) ) {
|
||||||
|
if ( entry.playerNum == player ) {
|
||||||
|
found = XP_TRUE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( found ) { /* success? */
|
||||||
|
switch ( entry.moveType ) {
|
||||||
|
case MOVE_TYPE:
|
||||||
|
scoreLastMove( model, &entry.u.move.moveInfo, nEntries - which, expl, explLen );
|
||||||
|
break;
|
||||||
|
case TRADE_TYPE:
|
||||||
|
*explLen = XP_SNPRINTF( expl, *explLen, "Traded" );
|
||||||
|
break;
|
||||||
|
case PHONY_TYPE:
|
||||||
|
*explLen = XP_SNPRINTF( expl, *explLen, "Lost turn" );
|
||||||
|
break;
|
||||||
|
case ASSIGN_TYPE:
|
||||||
|
found = XP_FALSE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return found;
|
||||||
|
} /* model_getPlayersLastScore */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
loadPlayerCtxt( XWStreamCtxt* stream, PlayerCtxt* pc )
|
loadPlayerCtxt( XWStreamCtxt* stream, PlayerCtxt* pc )
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in a new issue