mirror of
git://xwords.git.sourceforge.net/gitroot/xwords/xwords
synced 2025-02-06 20:45:54 +01:00
change signature to fit API changes (but don't use new params yet);
add new strings; fix formatting.
This commit is contained in:
parent
7dbcdf4ca5
commit
810c3475be
1 changed files with 282 additions and 267 deletions
|
@ -89,8 +89,8 @@ CMenuBar MainMenuBar( MENUBAR_WINDOW_ID, 23 );
|
||||||
static VTableMgr* frank_util_getVTManager( XW_UtilCtxt* uc );
|
static VTableMgr* frank_util_getVTManager( XW_UtilCtxt* uc );
|
||||||
static DictionaryCtxt* frank_util_makeEmptyDict( XW_UtilCtxt* uc );
|
static DictionaryCtxt* frank_util_makeEmptyDict( XW_UtilCtxt* uc );
|
||||||
static void frank_util_userError( XW_UtilCtxt* uc, UtilErrID id );
|
static void frank_util_userError( XW_UtilCtxt* uc, UtilErrID id );
|
||||||
static XP_U16 frank_util_userQuery( XW_UtilCtxt* uc, UtilQueryID id,
|
static XP_Bool frank_util_userQuery( XW_UtilCtxt* uc, UtilQueryID id,
|
||||||
XWStreamCtxt* stream );
|
XWStreamCtxt* stream );
|
||||||
static XP_S16 frank_util_userPickTile( XW_UtilCtxt* uc, PickInfo* pi,
|
static XP_S16 frank_util_userPickTile( XW_UtilCtxt* uc, PickInfo* pi,
|
||||||
XP_U16 playerNum,
|
XP_U16 playerNum,
|
||||||
XP_UCHAR4* texts, XP_U16 nTiles );
|
XP_UCHAR4* texts, XP_U16 nTiles );
|
||||||
|
@ -150,6 +150,7 @@ class CXWordsWindow : public CWindow {
|
||||||
BOOL drawInProgress;
|
BOOL drawInProgress;
|
||||||
BOOL userEventPending;
|
BOOL userEventPending;
|
||||||
XP_Bool fRobotHalted;
|
XP_Bool fRobotHalted;
|
||||||
|
XP_Bool fAskTrayLimits;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
CXWordsWindow( MPFORMAL FrankDictList* dlist );
|
CXWordsWindow( MPFORMAL FrankDictList* dlist );
|
||||||
|
@ -283,6 +284,8 @@ CXWordsWindow::CXWordsWindow(MPFORMAL FrankDictList* dlist )
|
||||||
fGame.server = (ServerCtxt*)NULL;
|
fGame.server = (ServerCtxt*)NULL;
|
||||||
fGame.board = (BoardCtxt*)NULL;
|
fGame.board = (BoardCtxt*)NULL;
|
||||||
|
|
||||||
|
fAskTrayLimits = XP_FALSE;
|
||||||
|
|
||||||
gi_initPlayerInfo( MEMPOOL(this) &fGameInfo, (XP_UCHAR*)"Player %d" );
|
gi_initPlayerInfo( MEMPOOL(this) &fGameInfo, (XP_UCHAR*)"Player %d" );
|
||||||
|
|
||||||
U16 nRecords = gamesDB->countRecords();
|
U16 nRecords = gamesDB->countRecords();
|
||||||
|
@ -314,10 +317,10 @@ XWStreamCtxt*
|
||||||
CXWordsWindow::makeMemStream()
|
CXWordsWindow::makeMemStream()
|
||||||
{
|
{
|
||||||
XWStreamCtxt* stream = mem_stream_make( MEMPOOL(this)
|
XWStreamCtxt* stream = mem_stream_make( MEMPOOL(this)
|
||||||
fVTableMgr,
|
fVTableMgr,
|
||||||
this,
|
this,
|
||||||
CHANNEL_NONE,
|
CHANNEL_NONE,
|
||||||
(MemStreamCloseCallback)NULL );
|
(MemStreamCloseCallback)NULL );
|
||||||
return stream;
|
return stream;
|
||||||
} /* makeMemStream */
|
} /* makeMemStream */
|
||||||
|
|
||||||
|
@ -340,21 +343,21 @@ void
|
||||||
CXWordsWindow::positionBoard()
|
CXWordsWindow::positionBoard()
|
||||||
{
|
{
|
||||||
board_setPos( fGame.board, BOARD_LEFT, BOARD_TOP,
|
board_setPos( fGame.board, BOARD_LEFT, BOARD_TOP,
|
||||||
XP_FALSE );
|
XP_FALSE );
|
||||||
board_setScale( fGame.board, BOARD_SCALE, BOARD_SCALE );
|
board_setScale( fGame.board, BOARD_SCALE, BOARD_SCALE );
|
||||||
|
|
||||||
board_setScoreboardLoc( fGame.board, SCORE_LEFT, SCORE_TOP,
|
board_setScoreboardLoc( fGame.board, SCORE_LEFT, SCORE_TOP,
|
||||||
this->GetWidth()-SCORE_LEFT-TIMER_WIDTH,
|
this->GetWidth()-SCORE_LEFT-TIMER_WIDTH,
|
||||||
SCORE_HEIGHT, XP_TRUE );
|
SCORE_HEIGHT, XP_TRUE );
|
||||||
|
|
||||||
U16 trayTop = BOARD_TOP + (BOARD_SCALE * 15) + 2;
|
U16 trayTop = BOARD_TOP + (BOARD_SCALE * 15) + 2;
|
||||||
board_setTrayLoc( fGame.board, TRAY_LEFT, trayTop,
|
board_setTrayLoc( fGame.board, TRAY_LEFT, trayTop,
|
||||||
MIN_TRAY_SCALE, MIN_TRAY_SCALE,
|
MIN_TRAY_SCALE, MIN_TRAY_SCALE,
|
||||||
FRANK_DIVIDER_WIDTH );
|
FRANK_DIVIDER_WIDTH );
|
||||||
|
|
||||||
board_setTimerLoc( fGame.board,
|
board_setTimerLoc( fGame.board,
|
||||||
this->GetWidth() - TIMER_WIDTH,
|
this->GetWidth() - TIMER_WIDTH,
|
||||||
SCORE_TOP, TIMER_WIDTH, TIMER_HEIGHT );
|
SCORE_TOP, TIMER_WIDTH, TIMER_HEIGHT );
|
||||||
} /* positionBoard */
|
} /* positionBoard */
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -388,7 +391,7 @@ CXWordsWindow::addButtonAtBitmap( short id, short x, short y, const char* c,
|
||||||
IMAGE* img )
|
IMAGE* img )
|
||||||
{
|
{
|
||||||
CButton* button = new CButton( id, 0, 0, (const char*)NULL,
|
CButton* button = new CButton( id, 0, 0, (const char*)NULL,
|
||||||
img, (IMAGE*)NULL, (IMAGE*)NULL );
|
img, (IMAGE*)NULL, (IMAGE*)NULL );
|
||||||
this->AddChild( button, x+1, y );
|
this->AddChild( button, x+1, y );
|
||||||
|
|
||||||
return button;
|
return button;
|
||||||
|
@ -444,12 +447,12 @@ CXWordsWindow::~CXWordsWindow()
|
||||||
void CXWordsWindow::Draw()
|
void CXWordsWindow::Draw()
|
||||||
{
|
{
|
||||||
if ( !this->drawInProgress ) {
|
if ( !this->drawInProgress ) {
|
||||||
this->drawInProgress = TRUE;
|
this->drawInProgress = TRUE;
|
||||||
// don't call CWindow::Draw(); It erases the entire board
|
// don't call CWindow::Draw(); It erases the entire board
|
||||||
board_draw( fGame.board );
|
board_draw( fGame.board );
|
||||||
|
|
||||||
this->DrawChildren();
|
this->DrawChildren();
|
||||||
this->drawInProgress = FALSE;
|
this->drawInProgress = FALSE;
|
||||||
}
|
}
|
||||||
} // CXWordsWindow::Draw
|
} // CXWordsWindow::Draw
|
||||||
|
|
||||||
|
@ -461,6 +464,7 @@ CXWordsWindow::MsgHandler( MSG_TYPE type, CViewable *from, S32 data )
|
||||||
S16 drag_x;
|
S16 drag_x;
|
||||||
S16 drag_y;
|
S16 drag_y;
|
||||||
XWTimerReason reason;
|
XWTimerReason reason;
|
||||||
|
XP_Bool handled;
|
||||||
|
|
||||||
drag_x = (S16) (data >> 16);
|
drag_x = (S16) (data >> 16);
|
||||||
drag_y = (S16) data;
|
drag_y = (S16) data;
|
||||||
|
@ -469,154 +473,154 @@ CXWordsWindow::MsgHandler( MSG_TYPE type, CViewable *from, S32 data )
|
||||||
switch (type) {
|
switch (type) {
|
||||||
|
|
||||||
case MSG_USER:
|
case MSG_USER:
|
||||||
switch ( data ) {
|
switch ( data ) {
|
||||||
case HINT_REQUEST:
|
case HINT_REQUEST:
|
||||||
doHint( XP_FALSE ); /* will reset if fails */
|
doHint( XP_FALSE ); /* will reset if fails */
|
||||||
break;
|
break;
|
||||||
case SERVER_TIME_REQUEST:
|
case SERVER_TIME_REQUEST:
|
||||||
this->clearUserEventPending(); /* clear before calling server! */
|
this->clearUserEventPending(); /* clear before calling server! */
|
||||||
if ( server_do( fGame.server ) ) {
|
if ( server_do( fGame.server ) ) {
|
||||||
GUI_NeedUpdate();
|
GUI_NeedUpdate();
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case NEWGAME_REQUEST:
|
case NEWGAME_REQUEST:
|
||||||
this->newGame( XP_FALSE );
|
this->newGame( XP_FALSE );
|
||||||
break;
|
break;
|
||||||
case FINALSCORE_REQUEST:
|
case FINALSCORE_REQUEST:
|
||||||
this->displayFinalScores();
|
this->displayFinalScores();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case MSG_PEN_DOWN:
|
case MSG_PEN_DOWN:
|
||||||
this->penDown = TRUE;
|
this->penDown = TRUE;
|
||||||
if ( board_handlePenDown( fGame.board, drag_x, drag_y, 0 ) ) {
|
if ( board_handlePenDown( fGame.board, drag_x, drag_y, 0, &handled ) ) {
|
||||||
GUI_NeedUpdate();
|
GUI_NeedUpdate();
|
||||||
result = 1;
|
result = 1;
|
||||||
}
|
}
|
||||||
board_pushTimerSave( fGame.board );
|
board_pushTimerSave( fGame.board );
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case MSG_PEN_TRACK:
|
case MSG_PEN_TRACK:
|
||||||
if ( this->penDown ) {
|
if ( this->penDown ) {
|
||||||
if ( board_handlePenMove( fGame.board, drag_x, drag_y ) ) {
|
if ( board_handlePenMove( fGame.board, drag_x, drag_y ) ) {
|
||||||
GUI_NeedUpdate();
|
GUI_NeedUpdate();
|
||||||
result = 1;
|
result = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case MSG_PEN_UP:
|
case MSG_PEN_UP:
|
||||||
if ( this->penDown ) {
|
if ( this->penDown ) {
|
||||||
board_popTimerSave( fGame.board );
|
board_popTimerSave( fGame.board );
|
||||||
if ( board_handlePenUp( fGame.board, drag_x, drag_y, 0 ) ) {
|
if ( board_handlePenUp( fGame.board, drag_x, drag_y, 0 ) ) {
|
||||||
GUI_NeedUpdate();
|
GUI_NeedUpdate();
|
||||||
result = 1;
|
result = 1;
|
||||||
}
|
}
|
||||||
this->penDown = FALSE;
|
this->penDown = FALSE;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case MSG_TIMER:
|
case MSG_TIMER:
|
||||||
reason = this->fTimers[TIMER_PENDOWN]?
|
reason = this->fTimers[TIMER_PENDOWN]?
|
||||||
TIMER_PENDOWN:TIMER_TIMERTICK;
|
TIMER_PENDOWN:TIMER_TIMERTICK;
|
||||||
fTimers[reason] = XP_FALSE; /* clear now; board may set it again */
|
fTimers[reason] = XP_FALSE; /* clear now; board may set it again */
|
||||||
board_timerFired( fGame.board, reason );
|
board_timerFired( fGame.board, reason );
|
||||||
setTimerIfNeeded();
|
setTimerIfNeeded();
|
||||||
GUI_NeedUpdate(); /* Needed off-emulator? PENDING */
|
GUI_NeedUpdate(); /* Needed off-emulator? PENDING */
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case MSG_BUTTON_SELECT:
|
case MSG_BUTTON_SELECT:
|
||||||
result = 1;
|
result = 1;
|
||||||
switch (from->GetID()) {
|
switch (from->GetID()) {
|
||||||
case MAIN_FLIP_BUTTON_ID:
|
case MAIN_FLIP_BUTTON_ID:
|
||||||
if ( board_flip( fGame.board ) ) {
|
if ( board_flip( fGame.board ) ) {
|
||||||
GUI_NeedUpdate();
|
GUI_NeedUpdate();
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case MAIN_VALUE_BUTTON_ID:
|
case MAIN_VALUE_BUTTON_ID:
|
||||||
if ( board_toggle_showValues( fGame.board ) ) {
|
if ( board_toggle_showValues( fGame.board ) ) {
|
||||||
GUI_NeedUpdate();
|
GUI_NeedUpdate();
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case MAIN_HINT_BUTTON_ID:
|
case MAIN_HINT_BUTTON_ID:
|
||||||
this->doHint( XP_FALSE );
|
this->doHint( XP_FALSE );
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case MAIN_UNDO_BUTTON_ID:
|
case MAIN_UNDO_BUTTON_ID:
|
||||||
this->doUndo();
|
this->doUndo();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case MAIN_COMMIT_BUTTON_ID:
|
case MAIN_COMMIT_BUTTON_ID:
|
||||||
this->doCommit();
|
this->doCommit();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case MAIN_TRADE_BUTTON_ID:
|
case MAIN_TRADE_BUTTON_ID:
|
||||||
if ( board_beginTrade( fGame.board ) ) {
|
if ( board_beginTrade( fGame.board ) ) {
|
||||||
GUI_NeedUpdate();
|
GUI_NeedUpdate();
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case MAIN_JUGGLE_BUTTON_ID:
|
case MAIN_JUGGLE_BUTTON_ID:
|
||||||
if ( board_juggleTray( fGame.board ) ) {
|
if ( board_juggleTray( fGame.board ) ) {
|
||||||
GUI_NeedUpdate();
|
GUI_NeedUpdate();
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case MAIN_HIDE_BUTTON_ID:
|
case MAIN_HIDE_BUTTON_ID:
|
||||||
this->doHideTray();
|
this->doHideTray();
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
result = 0;
|
result = 0;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case MSG_KEY:
|
case MSG_KEY:
|
||||||
xpkey = XP_KEY_NONE;
|
xpkey = XP_KEY_NONE;
|
||||||
switch( data ) {
|
switch( data ) {
|
||||||
|
|
||||||
case K_JOG_ENTER:
|
case K_JOG_ENTER:
|
||||||
xpkey = XP_RETURN_KEY;
|
xpkey = XP_RETURN_KEY;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case K_JOG_DOWN:
|
case K_JOG_DOWN:
|
||||||
xpkey = XP_CURSOR_KEY_RIGHT;
|
xpkey = XP_CURSOR_KEY_RIGHT;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case K_JOG_UP:
|
case K_JOG_UP:
|
||||||
xpkey = XP_CURSOR_KEY_LEFT;
|
xpkey = XP_CURSOR_KEY_LEFT;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case K_DELETE:
|
case K_DELETE:
|
||||||
case K_BACKSPACE:
|
case K_BACKSPACE:
|
||||||
xpkey = XP_CURSOR_KEY_DEL;
|
xpkey = XP_CURSOR_KEY_DEL;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
if ( isalpha( data ) ) {
|
if ( isalpha( data ) ) {
|
||||||
xpkey = (XP_Key)toupper(data);
|
xpkey = (XP_Key)toupper(data);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( xpkey != XP_KEY_NONE ) {
|
if ( xpkey != XP_KEY_NONE ) {
|
||||||
if ( board_handleKey( fGame.board, xpkey ) ) {
|
if ( board_handleKey( fGame.board, xpkey ) ) {
|
||||||
GUI_NeedUpdate();
|
GUI_NeedUpdate();
|
||||||
result = 1;
|
result = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
break; /* MSG_KEY */
|
break; /* MSG_KEY */
|
||||||
|
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
GUI_EnableTimers();
|
GUI_EnableTimers();
|
||||||
|
|
||||||
if ( result == 0 ) {
|
if ( result == 0 ) {
|
||||||
result = CWindow::MsgHandler( type, from, data );
|
result = CWindow::MsgHandler( type, from, data );
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
} // CXWordsWindow::MsgHandler
|
} // CXWordsWindow::MsgHandler
|
||||||
|
@ -626,13 +630,13 @@ CXWordsWindow::setTimerIfNeeded()
|
||||||
{
|
{
|
||||||
U32 mSeconds;
|
U32 mSeconds;
|
||||||
if ( fTimers[TIMER_PENDOWN] ) { /* faster, so higher priority */
|
if ( fTimers[TIMER_PENDOWN] ) { /* faster, so higher priority */
|
||||||
mSeconds = (U32)450;
|
mSeconds = (U32)450;
|
||||||
XP_DEBUGF( "setting timer %d", TIMER_PENDOWN );
|
XP_DEBUGF( "setting timer %d", TIMER_PENDOWN );
|
||||||
} else if ( fTimers[TIMER_TIMERTICK] ) {
|
} else if ( fTimers[TIMER_TIMERTICK] ) {
|
||||||
mSeconds = (U32)1000;
|
mSeconds = (U32)1000;
|
||||||
XP_DEBUGF( "setting timer %d", TIMER_TIMERTICK );
|
XP_DEBUGF( "setting timer %d", TIMER_TIMERTICK );
|
||||||
} else {
|
} else {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
SetTimer( mSeconds, XP_FALSE, 0L );
|
SetTimer( mSeconds, XP_FALSE, 0L );
|
||||||
|
@ -643,9 +647,9 @@ CXWordsWindow::disOrEnableFrank( U16 id, XP_Bool enable )
|
||||||
{
|
{
|
||||||
CButton* button = (CButton*)GetChildID( id );
|
CButton* button = (CButton*)GetChildID( id );
|
||||||
if ( enable ) {
|
if ( enable ) {
|
||||||
button->Enable();
|
button->Enable();
|
||||||
} else {
|
} else {
|
||||||
button->Disable();
|
button->Disable();
|
||||||
}
|
}
|
||||||
} /* disOrEnableFrank */
|
} /* disOrEnableFrank */
|
||||||
|
|
||||||
|
@ -668,10 +672,10 @@ CXWordsWindow::startProgressBar()
|
||||||
{
|
{
|
||||||
if ( fState.showProgress ) {
|
if ( fState.showProgress ) {
|
||||||
|
|
||||||
DrawRectFilled( &fProgressRect, COLOR_WHITE );
|
DrawRectFilled( &fProgressRect, COLOR_WHITE );
|
||||||
DrawRect( &fProgressRect, COLOR_BLACK );
|
DrawRect( &fProgressRect, COLOR_BLACK );
|
||||||
|
|
||||||
fProgressCurLine = 0;
|
fProgressCurLine = 0;
|
||||||
}
|
}
|
||||||
} /* startProgressBar */
|
} /* startProgressBar */
|
||||||
|
|
||||||
|
@ -679,7 +683,7 @@ void
|
||||||
CXWordsWindow::finishProgressBar()
|
CXWordsWindow::finishProgressBar()
|
||||||
{
|
{
|
||||||
if ( fState.showProgress ) {
|
if ( fState.showProgress ) {
|
||||||
DrawRectFilled( &fProgressRect, COLOR_WHITE );
|
DrawRectFilled( &fProgressRect, COLOR_WHITE );
|
||||||
}
|
}
|
||||||
} /* finishProgressBar */
|
} /* finishProgressBar */
|
||||||
|
|
||||||
|
@ -687,27 +691,27 @@ void
|
||||||
CXWordsWindow::advanceProgressBar()
|
CXWordsWindow::advanceProgressBar()
|
||||||
{
|
{
|
||||||
if ( fState.showProgress ) {
|
if ( fState.showProgress ) {
|
||||||
U16 line;
|
U16 line;
|
||||||
U16 height = fProgressRect.height - 2; /* don't overwrite top and
|
U16 height = fProgressRect.height - 2; /* don't overwrite top and
|
||||||
bottom */
|
bottom */
|
||||||
XP_Bool draw;
|
XP_Bool draw;
|
||||||
COLOR color;
|
COLOR color;
|
||||||
|
|
||||||
fProgressCurLine %= height * 2;
|
fProgressCurLine %= height * 2;
|
||||||
draw = fProgressCurLine < height;
|
draw = fProgressCurLine < height;
|
||||||
|
|
||||||
line = fProgressCurLine % (height) + 1;
|
line = fProgressCurLine % (height) + 1;
|
||||||
line = fProgressRect.y + height - line + 1;
|
line = fProgressRect.y + height - line + 1;
|
||||||
if ( draw ) {
|
if ( draw ) {
|
||||||
color = COLOR_BLACK;
|
color = COLOR_BLACK;
|
||||||
} else {
|
} else {
|
||||||
color = COLOR_WHITE;
|
color = COLOR_WHITE;
|
||||||
}
|
}
|
||||||
|
|
||||||
DrawLine( fProgressRect.x+1, line,
|
DrawLine( fProgressRect.x+1, line,
|
||||||
fProgressRect.x + fProgressRect.width - 1, line, color );
|
fProgressRect.x + fProgressRect.width - 1, line, color );
|
||||||
|
|
||||||
++fProgressCurLine;
|
++fProgressCurLine;
|
||||||
}
|
}
|
||||||
} /* advanceProgressBar */
|
} /* advanceProgressBar */
|
||||||
|
|
||||||
|
@ -807,7 +811,7 @@ Init_Menu()
|
||||||
menu->SetRow( row++, GAMEMENU_HISTORY, "Game history", 's' );
|
menu->SetRow( row++, GAMEMENU_HISTORY, "Game history", 's' );
|
||||||
menu->SetRow( row++, GAMEMENU_FINALSCORES, "Final scores", 'f' );
|
menu->SetRow( row++, GAMEMENU_FINALSCORES, "Final scores", 'f' );
|
||||||
MainMenuBar.AddButton( new CPushButton(GAMEMENU_BUTTON_ID,0,0,"Game"),
|
MainMenuBar.AddButton( new CPushButton(GAMEMENU_BUTTON_ID,0,0,"Game"),
|
||||||
menu );
|
menu );
|
||||||
|
|
||||||
menu = new CMenu( MOVEMENU_WINDOW_ID );
|
menu = new CMenu( MOVEMENU_WINDOW_ID );
|
||||||
menu->SetNumRows( 9 );
|
menu->SetNumRows( 9 );
|
||||||
|
@ -841,11 +845,11 @@ void
|
||||||
MyErrorHandler( const char *filename, int lineno, const char *failexpr )
|
MyErrorHandler( const char *filename, int lineno, const char *failexpr )
|
||||||
{
|
{
|
||||||
if (lineno != -1 || strcmp( failexpr, "Out of memory" )) {
|
if (lineno != -1 || strcmp( failexpr, "Out of memory" )) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
GUI_Alert( ALERT_WARNING,
|
GUI_Alert( ALERT_WARNING,
|
||||||
"Operation cancelled - insufficient memory" );
|
"Operation cancelled - insufficient memory" );
|
||||||
GUI_SetMallocReserve( 1536 );
|
GUI_SetMallocReserve( 1536 );
|
||||||
GUI_ClearStack();
|
GUI_ClearStack();
|
||||||
}
|
}
|
||||||
|
@ -977,14 +981,15 @@ CXWordsWindow::doHint( XP_Bool reset )
|
||||||
XP_Bool done;
|
XP_Bool done;
|
||||||
|
|
||||||
if ( reset ) {
|
if ( reset ) {
|
||||||
board_resetEngine( fGame.board );
|
board_resetEngine( fGame.board );
|
||||||
}
|
}
|
||||||
done = board_requestHint( fGame.board, &workRemains );
|
done = board_requestHint( fGame.board,
|
||||||
|
fAskTrayLimits, &workRemains );
|
||||||
if ( done ) {
|
if ( done ) {
|
||||||
GUI_NeedUpdate();
|
GUI_NeedUpdate();
|
||||||
}
|
}
|
||||||
if ( workRemains ) {
|
if ( workRemains ) {
|
||||||
GUI_EventMessage( MSG_USER, this, HINT_REQUEST );
|
GUI_EventMessage( MSG_USER, this, HINT_REQUEST );
|
||||||
}
|
}
|
||||||
} /* handleHintMenu */
|
} /* handleHintMenu */
|
||||||
|
|
||||||
|
@ -992,7 +997,7 @@ void
|
||||||
CXWordsWindow::doUndo()
|
CXWordsWindow::doUndo()
|
||||||
{
|
{
|
||||||
if ( server_handleUndo( fGame.server ) ) {
|
if ( server_handleUndo( fGame.server ) ) {
|
||||||
GUI_NeedUpdate();
|
GUI_NeedUpdate();
|
||||||
}
|
}
|
||||||
} /* doUndo */
|
} /* doUndo */
|
||||||
|
|
||||||
|
@ -1000,7 +1005,7 @@ void
|
||||||
CXWordsWindow::doHideTray()
|
CXWordsWindow::doHideTray()
|
||||||
{
|
{
|
||||||
if ( board_hideTray( fGame.board ) ) {
|
if ( board_hideTray( fGame.board ) ) {
|
||||||
GUI_NeedUpdate();
|
GUI_NeedUpdate();
|
||||||
}
|
}
|
||||||
} /* doHideTray */
|
} /* doHideTray */
|
||||||
|
|
||||||
|
@ -1024,7 +1029,7 @@ void
|
||||||
CXWordsWindow::doCommit()
|
CXWordsWindow::doCommit()
|
||||||
{
|
{
|
||||||
if ( board_commitTurn( fGame.board ) ) {
|
if ( board_commitTurn( fGame.board ) ) {
|
||||||
GUI_NeedUpdate();
|
GUI_NeedUpdate();
|
||||||
}
|
}
|
||||||
} /* doCommit */
|
} /* doCommit */
|
||||||
|
|
||||||
|
@ -1042,9 +1047,9 @@ CXWordsWindow::doNewGameMenu()
|
||||||
"game." ) ) {
|
"game." ) ) {
|
||||||
makeNewGame( this->gamesDB->countRecords() );
|
makeNewGame( this->gamesDB->countRecords() );
|
||||||
} else if ( 0 == GUI_Alert( ALERT_OK,
|
} else if ( 0 == GUI_Alert( ALERT_OK,
|
||||||
"Are you sure you want to replace"
|
"Are you sure you want to replace"
|
||||||
" the existing game?" ) ) {
|
" the existing game?" ) ) {
|
||||||
doit = XP_FALSE;
|
doit = XP_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( doit && newGame( XP_FALSE ) ) { /* don't let user cancel; too late! */
|
if ( doit && newGame( XP_FALSE ) ) { /* don't let user cancel; too late! */
|
||||||
|
@ -1061,19 +1066,19 @@ CXWordsWindow::doSavedGames()
|
||||||
{
|
{
|
||||||
U16 openIndex; /* what index am I to open? */
|
U16 openIndex; /* what index am I to open? */
|
||||||
U16 curIndex = fState.curGameIndex; /* may change if lower-index
|
U16 curIndex = fState.curGameIndex; /* may change if lower-index
|
||||||
game deleted */
|
game deleted */
|
||||||
saveCurrentGame(); /* so can be duped */
|
saveCurrentGame(); /* so can be duped */
|
||||||
wrappedEventLoop( new CSavedGamesWindow( this->gamesDB, &openIndex,
|
wrappedEventLoop( new CSavedGamesWindow( this->gamesDB, &openIndex,
|
||||||
&curIndex) );
|
&curIndex) );
|
||||||
|
|
||||||
fState.curGameIndex = curIndex;
|
fState.curGameIndex = curIndex;
|
||||||
if ( curIndex != openIndex ) {
|
if ( curIndex != openIndex ) {
|
||||||
fState.curGameIndex = openIndex;
|
fState.curGameIndex = openIndex;
|
||||||
loadCurrentGame();
|
loadCurrentGame();
|
||||||
positionBoard();
|
positionBoard();
|
||||||
server_do( fGame.server ); /* in case there's a robot */
|
server_do( fGame.server ); /* in case there's a robot */
|
||||||
board_invalAll( fGame.board );
|
board_invalAll( fGame.board );
|
||||||
GUI_NeedUpdate();
|
GUI_NeedUpdate();
|
||||||
}
|
}
|
||||||
} /* doSavedGames */
|
} /* doSavedGames */
|
||||||
#endif
|
#endif
|
||||||
|
@ -1085,28 +1090,28 @@ CXWordsWindow::doAbout()
|
||||||
XWStreamCtxt* stream;
|
XWStreamCtxt* stream;
|
||||||
|
|
||||||
stream = makeMemStream();
|
stream = makeMemStream();
|
||||||
char* txt = "Crosswords" VERSION_STRING "\n"
|
char* txt = "Crosswords " VERSION_STRING "\n"
|
||||||
"Copyright 2000-2002 by Eric House (fixin@peak.org).\n"
|
"Copyright 2000-2004 by Eric House (fixin@peak.org).\n"
|
||||||
"All rights reserved.\n"
|
"All rights reserved.\n"
|
||||||
"For further information see www.peak.org/~fixin/xwords/ebm.html.";
|
"For further information see www.peak.org/~fixin/xwords/ebm.html.";
|
||||||
stream_putBytes( stream, txt, strlen(txt) );
|
stream_putBytes( stream, txt, strlen(txt) );
|
||||||
stream_putU8( stream, '\0' );
|
stream_putU8( stream, '\0' );
|
||||||
|
|
||||||
wrappedEventLoop( new CShowTextWindow( MEMPOOL(this) stream,
|
wrappedEventLoop( new CShowTextWindow( MEMPOOL(this) stream,
|
||||||
"About Crosswords",
|
"About Crosswords",
|
||||||
true, false,
|
true, false,
|
||||||
&ignore ) );
|
&ignore ) );
|
||||||
} /* doAbout */
|
} /* doAbout */
|
||||||
|
|
||||||
void
|
void
|
||||||
CXWordsWindow::doEndGame()
|
CXWordsWindow::doEndGame()
|
||||||
{
|
{
|
||||||
if ( server_getGameIsOver( fGame.server ) ) {
|
if ( server_getGameIsOver( fGame.server ) ) {
|
||||||
this->displayFinalScores();
|
this->displayFinalScores();
|
||||||
} else if ( GUI_Alert( ALERT_OK,
|
} else if ( GUI_Alert( ALERT_OK,
|
||||||
"Are you sure you want to end the game now?" )
|
"Are you sure you want to end the game now?" )
|
||||||
!= 0 ) {
|
!= 0 ) {
|
||||||
server_endGame( fGame.server );
|
server_endGame( fGame.server );
|
||||||
}
|
}
|
||||||
GUI_NeedUpdate();
|
GUI_NeedUpdate();
|
||||||
} /* doEndGame */
|
} /* doEndGame */
|
||||||
|
@ -1182,7 +1187,7 @@ CXWordsWindow::writeGameToStream( XWStreamCtxt* stream, U16 index )
|
||||||
XP_UCHAR* dictName = dict_getName( dict );
|
XP_UCHAR* dictName = dict_getName( dict );
|
||||||
stream_putU8( stream, !!dictName );
|
stream_putU8( stream, !!dictName );
|
||||||
if ( !!dictName ) {
|
if ( !!dictName ) {
|
||||||
stringToStream( stream, dictName );
|
stringToStream( stream, dictName );
|
||||||
}
|
}
|
||||||
|
|
||||||
game_saveToStream( &fGame, &fGameInfo, stream );
|
game_saveToStream( &fGame, &fGameInfo, stream );
|
||||||
|
@ -1225,14 +1230,14 @@ CXWordsWindow::displayFinalScores()
|
||||||
|
|
||||||
XP_U16
|
XP_U16
|
||||||
CXWordsWindow::displayTextFromStream( XWStreamCtxt* stream,
|
CXWordsWindow::displayTextFromStream( XWStreamCtxt* stream,
|
||||||
const char* title, /* should be ID!!! */
|
const char* title, /* should be ID!!! */
|
||||||
BOOL killStream,
|
BOOL killStream,
|
||||||
BOOL includeCancel )
|
BOOL includeCancel )
|
||||||
{
|
{
|
||||||
XP_U16 result = 0;
|
XP_U16 result = 0;
|
||||||
wrappedEventLoop( new CShowTextWindow( MEMPOOL(this) stream, title,
|
wrappedEventLoop( new CShowTextWindow( MEMPOOL(this) stream, title,
|
||||||
killStream, includeCancel,
|
killStream, includeCancel,
|
||||||
&result ) );
|
&result ) );
|
||||||
return result;
|
return result;
|
||||||
} /* displayTextFromStream */
|
} /* displayTextFromStream */
|
||||||
|
|
||||||
|
@ -1241,30 +1246,30 @@ extern "C" {
|
||||||
int
|
int
|
||||||
frank_snprintf( XP_UCHAR* buf, XP_U16 len, XP_UCHAR* format, ... )
|
frank_snprintf( XP_UCHAR* buf, XP_U16 len, XP_UCHAR* format, ... )
|
||||||
{
|
{
|
||||||
va_list ap;
|
va_list ap;
|
||||||
|
|
||||||
va_start(ap, format);
|
va_start(ap, format);
|
||||||
|
|
||||||
vsnprintf((char*)buf, len, (char*)format, ap);
|
vsnprintf((char*)buf, len, (char*)format, ap);
|
||||||
|
|
||||||
va_end(ap);
|
va_end(ap);
|
||||||
|
|
||||||
return strlen((char*)buf);
|
return strlen((char*)buf);
|
||||||
} /* frank_snprintf */
|
} /* frank_snprintf */
|
||||||
|
|
||||||
void
|
void
|
||||||
frank_debugf( char* format, ... )
|
frank_debugf( char* format, ... )
|
||||||
{
|
{
|
||||||
char buf[256];
|
char buf[256];
|
||||||
va_list ap;
|
va_list ap;
|
||||||
|
|
||||||
va_start(ap, format);
|
va_start(ap, format);
|
||||||
|
|
||||||
vsprintf(buf, format, ap);
|
vsprintf(buf, format, ap);
|
||||||
|
|
||||||
va_end(ap);
|
va_end(ap);
|
||||||
|
|
||||||
perror(buf);
|
perror(buf);
|
||||||
} // debugf
|
} // debugf
|
||||||
|
|
||||||
XP_UCHAR*
|
XP_UCHAR*
|
||||||
|
@ -1331,34 +1336,34 @@ frank_util_userError( XW_UtilCtxt* uc, UtilErrID id )
|
||||||
*/
|
*/
|
||||||
switch( id ) {
|
switch( id ) {
|
||||||
case ERR_TILES_NOT_IN_LINE:
|
case ERR_TILES_NOT_IN_LINE:
|
||||||
message = "All tiles played must be in a line.";
|
message = "All tiles played must be in a line.";
|
||||||
break;
|
break;
|
||||||
case ERR_NO_EMPTIES_IN_TURN:
|
case ERR_NO_EMPTIES_IN_TURN:
|
||||||
message = "Empty squares cannot separate tiles played.";
|
message = "Empty squares cannot separate tiles played.";
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case ERR_TWO_TILES_FIRST_MOVE:
|
case ERR_TWO_TILES_FIRST_MOVE:
|
||||||
message = "Must play two or more pieces on the first move.";
|
message = "Must play two or more pieces on the first move.";
|
||||||
break;
|
break;
|
||||||
case ERR_TILES_MUST_CONTACT:
|
case ERR_TILES_MUST_CONTACT:
|
||||||
message = "New pieces must contact others already in place (or "
|
message = "New pieces must contact others already in place (or "
|
||||||
"the middle square on the first move).";
|
"the middle square on the first move).";
|
||||||
break;
|
break;
|
||||||
case ERR_NOT_YOUR_TURN:
|
case ERR_NOT_YOUR_TURN:
|
||||||
message = "You can't do that; it's not your turn!";
|
message = "You can't do that; it's not your turn!";
|
||||||
break;
|
break;
|
||||||
case ERR_NO_PEEK_ROBOT_TILES:
|
case ERR_NO_PEEK_ROBOT_TILES:
|
||||||
message = "No peeking at the robot's tiles!";
|
message = "No peeking at the robot's tiles!";
|
||||||
break;
|
break;
|
||||||
case ERR_CANT_TRADE_MID_MOVE:
|
case ERR_CANT_TRADE_MID_MOVE:
|
||||||
message = "Remove played tiles before trading.";
|
message = "Remove played tiles before trading.";
|
||||||
break;
|
break;
|
||||||
case ERR_TOO_FEW_TILES_LEFT_TO_TRADE:
|
case ERR_TOO_FEW_TILES_LEFT_TO_TRADE:
|
||||||
message = "Too few tiles left to trade.";
|
message = "Too few tiles left to trade.";
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
message = "unknown errorcode ID!!!";
|
message = "unknown errorcode ID!!!";
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
(void)GUI_Alert( ALERT_ERROR, message );
|
(void)GUI_Alert( ALERT_ERROR, message );
|
||||||
|
@ -1367,7 +1372,7 @@ frank_util_userError( XW_UtilCtxt* uc, UtilErrID id )
|
||||||
GUI_NeedUpdate();
|
GUI_NeedUpdate();
|
||||||
} /* frank_util_userError */
|
} /* frank_util_userError */
|
||||||
|
|
||||||
static XP_U16
|
static XP_Bool
|
||||||
frank_util_userQuery( XW_UtilCtxt* uc, UtilQueryID id, XWStreamCtxt* stream )
|
frank_util_userQuery( XW_UtilCtxt* uc, UtilQueryID id, XWStreamCtxt* stream )
|
||||||
{
|
{
|
||||||
char* question;
|
char* question;
|
||||||
|
@ -1397,7 +1402,7 @@ frank_util_userQuery( XW_UtilCtxt* uc, UtilQueryID id, XWStreamCtxt* stream )
|
||||||
askResult = GUI_Alert( ALERT_OK, question );
|
askResult = GUI_Alert( ALERT_OK, question );
|
||||||
board_invalAll( self->fGame.board );
|
board_invalAll( self->fGame.board );
|
||||||
GUI_NeedUpdate();
|
GUI_NeedUpdate();
|
||||||
return askResult;
|
return askResult != 0;
|
||||||
} /* frank_util_userQuery */
|
} /* frank_util_userQuery */
|
||||||
|
|
||||||
static XP_S16
|
static XP_S16
|
||||||
|
@ -1445,7 +1450,7 @@ frank_util_hiliteCell( XW_UtilCtxt* uc, XP_U16 col, XP_U16 row )
|
||||||
CXWordsWindow* self = (CXWordsWindow*)uc->closure;
|
CXWordsWindow* self = (CXWordsWindow*)uc->closure;
|
||||||
XP_Bool halted = self->robotIsHalted();
|
XP_Bool halted = self->robotIsHalted();
|
||||||
if ( !halted ) {
|
if ( !halted ) {
|
||||||
board_hiliteCellAt( self->fGame.board, col, row );
|
board_hiliteCellAt( self->fGame.board, col, row );
|
||||||
}
|
}
|
||||||
BOOL waiting = EVNT_IsWaiting();
|
BOOL waiting = EVNT_IsWaiting();
|
||||||
return !waiting && !halted;
|
return !waiting && !halted;
|
||||||
|
@ -1470,7 +1475,7 @@ frank_util_setTimer( XW_UtilCtxt* uc, XWTimerReason why )
|
||||||
CXWordsWindow* self = (CXWordsWindow*)uc->closure;
|
CXWordsWindow* self = (CXWordsWindow*)uc->closure;
|
||||||
|
|
||||||
XP_ASSERT( why == TIMER_PENDOWN ||
|
XP_ASSERT( why == TIMER_PENDOWN ||
|
||||||
why == TIMER_TIMERTICK );
|
why == TIMER_TIMERTICK );
|
||||||
|
|
||||||
self->fTimers[why] = XP_TRUE;
|
self->fTimers[why] = XP_TRUE;
|
||||||
self->setTimerIfNeeded();
|
self->setTimerIfNeeded();
|
||||||
|
@ -1481,8 +1486,8 @@ frank_util_requestTime( XW_UtilCtxt* uc )
|
||||||
{
|
{
|
||||||
CXWordsWindow* self = (CXWordsWindow*)uc->closure;
|
CXWordsWindow* self = (CXWordsWindow*)uc->closure;
|
||||||
if ( !self->getUserEventPending() ) {
|
if ( !self->getUserEventPending() ) {
|
||||||
GUI_EventMessage( MSG_USER, self, SERVER_TIME_REQUEST );
|
GUI_EventMessage( MSG_USER, self, SERVER_TIME_REQUEST );
|
||||||
self->setUserEventPending();
|
self->setUserEventPending();
|
||||||
}
|
}
|
||||||
} /* frank_util_requestTime */
|
} /* frank_util_requestTime */
|
||||||
|
|
||||||
|
@ -1505,29 +1510,28 @@ frank_util_getSquareBonus( XW_UtilCtxt* uc, ModelCtxt* model,
|
||||||
XP_U16 col, XP_U16 row )
|
XP_U16 col, XP_U16 row )
|
||||||
{
|
{
|
||||||
XP_U16 index;
|
XP_U16 index;
|
||||||
/* This must be static or won't compile under multilink (for Palm).
|
|
||||||
Fix! */
|
|
||||||
const char scrabbleBoard[8*8] = {
|
|
||||||
TW,EM,EM,DL,EM,EM,EM,TW,
|
|
||||||
EM,DW,EM,EM,EM,TL,EM,EM,
|
|
||||||
|
|
||||||
EM,EM,DW,EM,EM,EM,DL,EM,
|
const char scrabbleBoard[8*8] = {
|
||||||
DL,EM,EM,DW,EM,EM,EM,DL,
|
TW,EM,EM,DL,EM,EM,EM,TW,
|
||||||
|
EM,DW,EM,EM,EM,TL,EM,EM,
|
||||||
|
|
||||||
|
EM,EM,DW,EM,EM,EM,DL,EM,
|
||||||
|
DL,EM,EM,DW,EM,EM,EM,DL,
|
||||||
|
|
||||||
EM,EM,EM,EM,DW,EM,EM,EM,
|
EM,EM,EM,EM,DW,EM,EM,EM,
|
||||||
EM,TL,EM,EM,EM,TL,EM,EM,
|
EM,TL,EM,EM,EM,TL,EM,EM,
|
||||||
|
|
||||||
EM,EM,DL,EM,EM,EM,DL,EM,
|
EM,EM,DL,EM,EM,EM,DL,EM,
|
||||||
TW,EM,EM,DL,EM,EM,EM,DW,
|
TW,EM,EM,DL,EM,EM,EM,DW,
|
||||||
}; /* scrabbleBoard */
|
}; /* scrabbleBoard */
|
||||||
|
|
||||||
if ( col > 7 ) col = 14 - col;
|
if ( col > 7 ) col = 14 - col;
|
||||||
if ( row > 7 ) row = 14 - row;
|
if ( row > 7 ) row = 14 - row;
|
||||||
index = (row*8) + col;
|
index = (row*8) + col;
|
||||||
if ( index >= 8*8 ) {
|
if ( index >= 8*8 ) {
|
||||||
return (XWBonusType)EM;
|
return (XWBonusType)EM;
|
||||||
} else {
|
} else {
|
||||||
return (XWBonusType)scrabbleBoard[index];
|
return (XWBonusType)scrabbleBoard[index];
|
||||||
}
|
}
|
||||||
} /* frank_util_getSquareBonus */
|
} /* frank_util_getSquareBonus */
|
||||||
|
|
||||||
|
@ -1547,6 +1551,8 @@ frank_util_getUserString( XW_UtilCtxt* uc, XP_U16 stringCode )
|
||||||
return (XP_UCHAR*)"Commit the current move?\n";
|
return (XP_UCHAR*)"Commit the current move?\n";
|
||||||
case STR_NONLOCAL_NAME:
|
case STR_NONLOCAL_NAME:
|
||||||
return (XP_UCHAR*)"%s (remote)";
|
return (XP_UCHAR*)"%s (remote)";
|
||||||
|
case STR_LOCAL_NAME:
|
||||||
|
return (XP_UCHAR*)"%s";
|
||||||
case STRD_TIME_PENALTY_SUB:
|
case STRD_TIME_PENALTY_SUB:
|
||||||
return (XP_UCHAR*)" - %d [time]";
|
return (XP_UCHAR*)" - %d [time]";
|
||||||
|
|
||||||
|
@ -1572,6 +1578,15 @@ frank_util_getUserString( XW_UtilCtxt* uc, XP_U16 stringCode )
|
||||||
case STR_ROBOT_MOVED:
|
case STR_ROBOT_MOVED:
|
||||||
return (XP_UCHAR*)"The robot made this move:\n";
|
return (XP_UCHAR*)"The robot made this move:\n";
|
||||||
|
|
||||||
|
case STR_PASSED:
|
||||||
|
return (XP_UCHAR*)"Passed";
|
||||||
|
case STRSD_SUMMARYSCORED:
|
||||||
|
return (XP_UCHAR*)"%s:%d";
|
||||||
|
case STRD_TRADED:
|
||||||
|
return (XP_UCHAR*)"Traded %d";
|
||||||
|
case STR_LOSTTURN:
|
||||||
|
return (XP_UCHAR*)"Lost turn";
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return (XP_UCHAR*)"unknown code ";
|
return (XP_UCHAR*)"unknown code ";
|
||||||
}
|
}
|
||||||
|
@ -1583,13 +1598,13 @@ formatBadWords( BadWordInfo* bwi, char buf[] )
|
||||||
XP_U16 i;
|
XP_U16 i;
|
||||||
|
|
||||||
for ( i = 0, buf[0] = '\0'; ; ) {
|
for ( i = 0, buf[0] = '\0'; ; ) {
|
||||||
char wordBuf[18];
|
char wordBuf[18];
|
||||||
sprintf( wordBuf, "\"%s\"", bwi->words[i] );
|
sprintf( wordBuf, "\"%s\"", bwi->words[i] );
|
||||||
strcat( buf, wordBuf );
|
strcat( buf, wordBuf );
|
||||||
if ( ++i == bwi->nWords ) {
|
if ( ++i == bwi->nWords ) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
strcat( buf, ", " );
|
strcat( buf, ", " );
|
||||||
}
|
}
|
||||||
} /* formatBadWords */
|
} /* formatBadWords */
|
||||||
|
|
||||||
|
@ -1605,17 +1620,17 @@ frank_util_warnIllegalWord( XW_UtilCtxt* uc, BadWordInfo* bwi,
|
||||||
formatBadWords( bwi, wordsBuf );
|
formatBadWords( bwi, wordsBuf );
|
||||||
|
|
||||||
if ( turnLost ) {
|
if ( turnLost ) {
|
||||||
XP_UCHAR* name = self->fGameInfo.players[turn].name;
|
XP_UCHAR* name = self->fGameInfo.players[turn].name;
|
||||||
XP_ASSERT( !!name );
|
XP_ASSERT( !!name );
|
||||||
sprintf( buf, "Player %d (%s) played illegal word[s] "
|
sprintf( buf, "Player %d (%s) played illegal word[s] "
|
||||||
"%s; loses turn",
|
"%s; loses turn",
|
||||||
turn+1, name, wordsBuf );
|
turn+1, name, wordsBuf );
|
||||||
(void)GUI_Alert( ALERT_ERROR, buf );
|
(void)GUI_Alert( ALERT_ERROR, buf );
|
||||||
result = XP_TRUE;
|
result = XP_TRUE;
|
||||||
} else {
|
} else {
|
||||||
sprintf( buf, "Word %s not in the current dictionary. "
|
sprintf( buf, "Word %s not in the current dictionary. "
|
||||||
"Use it anyway?", wordsBuf );
|
"Use it anyway?", wordsBuf );
|
||||||
result = GUI_Alert( ALERT_OK, buf );
|
result = GUI_Alert( ALERT_OK, buf );
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
} /* frank_util_warnIllegalWord */
|
} /* frank_util_warnIllegalWord */
|
||||||
|
|
Loading…
Add table
Reference in a new issue