mirror of
git://xwords.git.sourceforge.net/gitroot/xwords/xwords
synced 2025-01-07 05:24:46 +01:00
implement new game and open game (roughly)
This commit is contained in:
parent
9ec8952fdb
commit
0c99b8490b
1 changed files with 54 additions and 37 deletions
|
@ -52,7 +52,7 @@
|
||||||
#define BDWIDTH WINDOW_WIDTH
|
#define BDWIDTH WINDOW_WIDTH
|
||||||
#define BDHEIGHT WINDOW_HEIGHT
|
#define BDHEIGHT WINDOW_HEIGHT
|
||||||
|
|
||||||
#define KEY_GAME "the_game"
|
#define KEY_LAST "cur_game"
|
||||||
#define KEY_PLAYER_NAME "player_name"
|
#define KEY_PLAYER_NAME "player_name"
|
||||||
#define DICTNAME "assets_dir/CollegeEng_2to8.xwd"
|
#define DICTNAME "assets_dir/CollegeEng_2to8.xwd"
|
||||||
|
|
||||||
|
@ -78,6 +78,8 @@
|
||||||
#define BUTTON_GAME_RENAME "Rename Game"
|
#define BUTTON_GAME_RENAME "Rename Game"
|
||||||
#define BUTTON_GAME_DELETE "Delete Game"
|
#define BUTTON_GAME_DELETE "Delete Game"
|
||||||
|
|
||||||
|
static void loadAndDraw( Globals* globals, const NetLaunchInfo* invite,
|
||||||
|
const char* key, bool forceNew );
|
||||||
|
|
||||||
#define MAX_BUTTONS 20 /* not sure what's safe here */
|
#define MAX_BUTTONS 20 /* not sure what's safe here */
|
||||||
|
|
||||||
|
@ -104,7 +106,7 @@ EM_JS(void, call_dialog, (const char* str, const char** but_strs,
|
||||||
} );
|
} );
|
||||||
|
|
||||||
EM_JS(void, call_pickBlank, (const char* msg, const char** strs, int nStrs,
|
EM_JS(void, call_pickBlank, (const char* msg, const char** strs, int nStrs,
|
||||||
AlertProc proc, void* closure), {
|
AlertProc proc, void* closure), {
|
||||||
var buttons = [];
|
var buttons = [];
|
||||||
for ( let ii = 0; ii < nStrs; ++ii ) {
|
for ( let ii = 0; ii < nStrs; ++ii ) {
|
||||||
const mem = HEAP32[(strs + (ii * 4)) >> 2];
|
const mem = HEAP32[(strs + (ii * 4)) >> 2];
|
||||||
|
@ -112,7 +114,19 @@ EM_JS(void, call_pickBlank, (const char* msg, const char** strs, int nStrs,
|
||||||
buttons.push(str);
|
buttons.push(str);
|
||||||
}
|
}
|
||||||
nbBlankPick(UTF8ToString(msg), buttons, proc, closure);
|
nbBlankPick(UTF8ToString(msg), buttons, proc, closure);
|
||||||
} );
|
} );
|
||||||
|
|
||||||
|
EM_JS(void, call_pickGame, (const char* msg, AlertProc proc, void* closure), {
|
||||||
|
var buttons = [];
|
||||||
|
for (var ii = 0; ii < localStorage.length; ++ii ) {
|
||||||
|
var key = localStorage.key(ii);
|
||||||
|
if ( key.startsWith('game_key_') ) {
|
||||||
|
buttons.push(key);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
nbBlankPick(UTF8ToString(msg), buttons, proc, closure);
|
||||||
|
} );
|
||||||
|
|
||||||
EM_JS(void, call_get_string, (const char* msg, const char* dflt,
|
EM_JS(void, call_get_string, (const char* msg, const char* dflt,
|
||||||
AlertProc proc, void* closure), {
|
AlertProc proc, void* closure), {
|
||||||
|
@ -146,12 +160,6 @@ EM_JS(void, setButtonText, (const char* id, const char* text), {
|
||||||
document.getElementById(jsid).textContent = jstext;
|
document.getElementById(jsid).textContent = jstext;
|
||||||
});
|
});
|
||||||
|
|
||||||
EM_JS(bool, getChecked, (const char* id), {
|
|
||||||
let jsid = UTF8ToString(id);
|
|
||||||
let box = document.getElementById(jsid);
|
|
||||||
return box.checked;
|
|
||||||
});
|
|
||||||
|
|
||||||
EM_JS(void, setButtons, (const char* id, const char** bstrs,
|
EM_JS(void, setButtons, (const char* id, const char** bstrs,
|
||||||
AlertProc proc, void* closure), {
|
AlertProc proc, void* closure), {
|
||||||
var buttons = [];
|
var buttons = [];
|
||||||
|
@ -317,12 +325,23 @@ updateGameButtons( Globals* globals )
|
||||||
setButtons( BUTTONS_ID_GAME, buttons, onGameButton, globals );
|
setButtons( BUTTONS_ID_GAME, buttons, onGameButton, globals );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
onGameChosen( void* closure, const char* key )
|
||||||
|
{
|
||||||
|
Globals* globals = (Globals*)closure;
|
||||||
|
loadAndDraw( globals, NULL, key, false );
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
onDeviceButton( void* closure, const char* button )
|
onDeviceButton( void* closure, const char* button )
|
||||||
{
|
{
|
||||||
|
Globals* globals = (Globals*)closure;
|
||||||
XP_LOGFF( "(button=%s)", button );
|
XP_LOGFF( "(button=%s)", button );
|
||||||
if ( 0 == strcmp(button, BUTTON_GAME_NEW) ) {
|
if ( 0 == strcmp(button, BUTTON_GAME_NEW) ) {
|
||||||
|
loadAndDraw( globals, NULL, NULL, true );
|
||||||
} else if ( 0 == strcmp(button, BUTTON_GAME_OPEN) ) {
|
} else if ( 0 == strcmp(button, BUTTON_GAME_OPEN) ) {
|
||||||
|
const char* msg = "Choose game to open";
|
||||||
|
call_pickGame( msg, onGameChosen, globals);
|
||||||
} else if ( 0 == strcmp(button, BUTTON_GAME_RENAME ) ) {
|
} else if ( 0 == strcmp(button, BUTTON_GAME_RENAME ) ) {
|
||||||
} else if ( 0 == strcmp(button, BUTTON_GAME_DELETE) ) {
|
} else if ( 0 == strcmp(button, BUTTON_GAME_DELETE) ) {
|
||||||
}
|
}
|
||||||
|
@ -433,7 +452,7 @@ onReplaceConfirmed( void* closure, bool confirmed )
|
||||||
if ( !!globals->gs.util ) {
|
if ( !!globals->gs.util ) {
|
||||||
game_dispose( &globals->gs.game, NULL );
|
game_dispose( &globals->gs.game, NULL );
|
||||||
wasm_util_destroy( globals->gs.util );
|
wasm_util_destroy( globals->gs.util );
|
||||||
globals->gs.util = NULL;
|
XP_MEMSET( &globals->gs, 0, sizeof(globals->gs) );
|
||||||
}
|
}
|
||||||
|
|
||||||
gi_disposePlayerInfo( MPPARM(globals->mpool) &globals->gs.gi );
|
gi_disposePlayerInfo( MPPARM(globals->mpool) &globals->gs.gi );
|
||||||
|
@ -491,12 +510,12 @@ gameFromInvite( Globals* globals, const NetLaunchInfo* invite )
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool
|
static bool
|
||||||
loadSavedGame( Globals* globals )
|
loadSavedGame( Globals* globals, const char* key )
|
||||||
{
|
{
|
||||||
bool loaded = false;
|
bool loaded = false;
|
||||||
XWStreamCtxt* stream = mem_stream_make_raw( MPPARM(globals->mpool)
|
XWStreamCtxt* stream = mem_stream_make_raw( MPPARM(globals->mpool)
|
||||||
globals->vtMgr );
|
globals->vtMgr );
|
||||||
dutil_loadStream( globals->dutil, NULL, KEY_GAME, NULL, stream );
|
dutil_loadStream( globals->dutil, NULL, key, NULL, stream );
|
||||||
if ( 0 < stream_getSize( stream ) ) {
|
if ( 0 < stream_getSize( stream ) ) {
|
||||||
XP_ASSERT( !globals->gs.util );
|
XP_ASSERT( !globals->gs.util );
|
||||||
globals->gs.util = wasm_util_make( MPPARM(globals->mpool) &globals->gs.gi,
|
globals->gs.util = wasm_util_make( MPPARM(globals->mpool) &globals->gs.gi,
|
||||||
|
@ -510,6 +529,7 @@ loadSavedGame( Globals* globals )
|
||||||
&globals->cp, &globals->procs );
|
&globals->cp, &globals->procs );
|
||||||
|
|
||||||
if ( loaded ) {
|
if ( loaded ) {
|
||||||
|
strcpy( globals->gs.gameKey, key );
|
||||||
updateScreen( globals, false );
|
updateScreen( globals, false );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -517,9 +537,17 @@ loadSavedGame( Globals* globals )
|
||||||
return loaded;
|
return loaded;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
makeGameKey( Globals* globals )
|
||||||
|
{
|
||||||
|
snprintf( globals->gs.gameKey, sizeof(globals->gs.gameKey),
|
||||||
|
"game_key_%X", globals->gs.gi.gameID );
|
||||||
|
XP_LOGFF( "made key: %s", globals->gs.gameKey );
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
loadAndDraw( Globals* globals, const NetLaunchInfo* invite,
|
loadAndDraw( Globals* globals, const NetLaunchInfo* invite,
|
||||||
bool forceNew )
|
const char* key, bool forceNew )
|
||||||
{
|
{
|
||||||
if ( !!globals->gs.util ) {
|
if ( !!globals->gs.util ) {
|
||||||
game_dispose( &globals->gs.game, NULL );
|
game_dispose( &globals->gs.game, NULL );
|
||||||
|
@ -533,16 +561,17 @@ loadAndDraw( Globals* globals, const NetLaunchInfo* invite,
|
||||||
} else {
|
} else {
|
||||||
/* First, load any saved game. We need it e.g. to confirm that an incoming
|
/* First, load any saved game. We need it e.g. to confirm that an incoming
|
||||||
invite is a dup and should be dropped. */
|
invite is a dup and should be dropped. */
|
||||||
haveGame = loadSavedGame( globals );
|
if ( !!key ) {
|
||||||
|
haveGame = loadSavedGame( globals, key );
|
||||||
|
}
|
||||||
if ( !!invite ) {
|
if ( !!invite ) {
|
||||||
haveGame = gameFromInvite( globals, invite );
|
haveGame = gameFromInvite( globals, invite );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( !haveGame ) {
|
if ( !haveGame ) {
|
||||||
bool p0robot = getChecked("robot0");
|
bool p0robot = false;
|
||||||
bool p1robot = getChecked("robot1");
|
bool p1robot = true;
|
||||||
globals->gs.gi.serverRole = SERVER_STANDALONE;
|
globals->gs.gi.serverRole = SERVER_STANDALONE;
|
||||||
globals->gs.gi.phoniesAction = PHONIES_WARN;
|
globals->gs.gi.phoniesAction = PHONIES_WARN;
|
||||||
globals->gs.gi.hintsNotAllowed = false;
|
globals->gs.gi.hintsNotAllowed = false;
|
||||||
|
@ -566,7 +595,7 @@ loadAndDraw( Globals* globals, const NetLaunchInfo* invite,
|
||||||
globals->gs.util, globals->draw,
|
globals->gs.util, globals->draw,
|
||||||
&globals->cp, &globals->procs );
|
&globals->cp, &globals->procs );
|
||||||
}
|
}
|
||||||
|
makeGameKey( globals );
|
||||||
startGame( globals, NULL );
|
startGame( globals, NULL );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -882,9 +911,10 @@ updateScreen( Globals* globals, bool doSave )
|
||||||
globals->vtMgr );
|
globals->vtMgr );
|
||||||
game_saveToStream( &globals->gs.game, NULL, &globals->gs.gi,
|
game_saveToStream( &globals->gs.game, NULL, &globals->gs.gi,
|
||||||
stream, ++globals->gs.saveToken );
|
stream, ++globals->gs.saveToken );
|
||||||
dutil_storeStream( globals->dutil, NULL, KEY_GAME, stream );
|
dutil_storeStream( globals->dutil, NULL, globals->gs.gameKey, stream );
|
||||||
stream_destroy( stream, NULL );
|
stream_destroy( stream, NULL );
|
||||||
game_saveSucceeded( &globals->gs.game, NULL, globals->gs.saveToken );
|
game_saveSucceeded( &globals->gs.game, NULL, globals->gs.saveToken );
|
||||||
|
set_stored_value( KEY_LAST, globals->gs.gameKey );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -994,30 +1024,17 @@ initNoReturn( int argc, const char** argv )
|
||||||
|
|
||||||
initDeviceGlobals( globals );
|
initDeviceGlobals( globals );
|
||||||
|
|
||||||
loadAndDraw( globals, nlip, false );
|
const char* lastKey = get_stored_value( KEY_LAST );
|
||||||
|
loadAndDraw( globals, nlip, lastKey, false );
|
||||||
|
if ( !!lastKey ) {
|
||||||
|
free( (void*)lastKey );
|
||||||
|
}
|
||||||
|
|
||||||
updateDeviceButtons( globals );
|
updateDeviceButtons( globals );
|
||||||
|
|
||||||
emscripten_set_main_loop_arg( looper, globals, -1, 1 );
|
emscripten_set_main_loop_arg( looper, globals, -1, 1 );
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
onNewgameResponse( void* closure, bool confirmed )
|
|
||||||
{
|
|
||||||
Globals* globals = (Globals*)closure;
|
|
||||||
if ( confirmed ) {
|
|
||||||
loadAndDraw( globals, NULL, true );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
newgame( void* closure )
|
|
||||||
{
|
|
||||||
Globals* globals = (Globals*)closure;
|
|
||||||
const char* query = "Replace the current game?";
|
|
||||||
call_confirm( globals, query, onNewgameResponse, globals );
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
MQTTConnectedChanged( void* closure, bool connected )
|
MQTTConnectedChanged( void* closure, bool connected )
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in a new issue