use tmp model to find words crossing a point to avoid undoing pending turns

This commit is contained in:
Eric House 2014-03-20 18:52:57 -07:00
parent 5d32fce43e
commit c2c81dbbf1

View file

@ -2114,7 +2114,8 @@ printMovePost( ModelCtxt* model, XP_U16 XP_UNUSED(moveN),
} /* printMovePost */ } /* printMovePost */
static void static void
copyStack( ModelCtxt* model, StackCtxt* destStack, const StackCtxt* srcStack ) copyStack( const ModelCtxt* model, StackCtxt* destStack,
const StackCtxt* srcStack )
{ {
XWStreamCtxt* stream = mem_stream_make( MPPARM(model->vol.mpool) XWStreamCtxt* stream = mem_stream_make( MPPARM(model->vol.mpool)
util_getVTManager(model->vol.util), util_getVTManager(model->vol.util),
@ -2127,7 +2128,7 @@ copyStack( ModelCtxt* model, StackCtxt* destStack, const StackCtxt* srcStack )
} /* copyStack */ } /* copyStack */
static ModelCtxt* static ModelCtxt*
makeTmpModel( ModelCtxt* model, XWStreamCtxt* stream, makeTmpModel( const ModelCtxt* model, XWStreamCtxt* stream,
MovePrintFuncPre mpf_pre, MovePrintFuncPost mpf_post, MovePrintFuncPre mpf_pre, MovePrintFuncPost mpf_post,
void* closure ) void* closure )
{ {
@ -2331,14 +2332,17 @@ void
model_listWordsThrough( ModelCtxt* model, XP_U16 col, XP_U16 row, model_listWordsThrough( ModelCtxt* model, XP_U16 col, XP_U16 row,
XWStreamCtxt* stream ) XWStreamCtxt* stream )
{ {
ModelCtxt* tmpModel = makeTmpModel( model, NULL, NULL, NULL, NULL );
copyStack( model, tmpModel->vol.stack, model->vol.stack );
XP_ASSERT( !!stream ); XP_ASSERT( !!stream );
StackCtxt* stack = model->vol.stack; StackCtxt* stack = tmpModel->vol.stack;
XP_U16 nEntriesBefore = stack_getNEntries( stack ); XP_U16 nEntriesBefore = stack_getNEntries( stack );
XP_U16 nEntriesAfter; XP_U16 nEntriesAfter;
/* Loop until we undo the move that placed the tile. */ /* Loop until we undo the move that placed the tile. */
while ( model_undoLatestMoves( model, NULL, 1, NULL, NULL ) ) { while ( model_undoLatestMoves( tmpModel, NULL, 1, NULL, NULL ) ) {
if ( 0 != (TILE_EMPTY_BIT & getModelTileRaw( model, col, row ) ) ) { if ( 0 != (TILE_EMPTY_BIT & getModelTileRaw( tmpModel, col, row ) ) ) {
break; break;
} }
} }
@ -2359,10 +2363,12 @@ model_listWordsThrough( ModelCtxt* model, XP_U16 col, XP_U16 row,
XP_ASSERT( 0 ); XP_ASSERT( 0 );
break; break;
} }
modelAddEntry( model, nEntriesAfter++, &entry, XP_FALSE, NULL, &ni, modelAddEntry( tmpModel, nEntriesAfter++, &entry, XP_FALSE, NULL, &ni,
NULL, NULL, NULL ); NULL, NULL, NULL );
} }
} }
model_destroy( tmpModel );
} /* model_listWordsThrough */ } /* model_listWordsThrough */
#endif #endif