mirror of
git://xwords.git.sourceforge.net/gitroot/xwords/xwords
synced 2024-12-26 09:58:20 +01:00
Merge branch 'android_branch' into android_invite
This commit is contained in:
commit
19ce482a43
25 changed files with 169 additions and 121 deletions
|
@ -16,7 +16,6 @@ local_DEFINES += \
|
||||||
-DXWFEATURE_RELAY \
|
-DXWFEATURE_RELAY \
|
||||||
-DXWFEATURE_TURNCHANGENOTIFY \
|
-DXWFEATURE_TURNCHANGENOTIFY \
|
||||||
-DXWFEATURE_CHAT \
|
-DXWFEATURE_CHAT \
|
||||||
-DSHOW_PROGRESS \
|
|
||||||
-DKEY_SUPPORT \
|
-DKEY_SUPPORT \
|
||||||
-DXWFEATURE_CROSSHAIRS \
|
-DXWFEATURE_CROSSHAIRS \
|
||||||
-DPOINTER_SUPPORT \
|
-DPOINTER_SUPPORT \
|
||||||
|
|
|
@ -11,11 +11,17 @@
|
||||||
<ul>
|
<ul>
|
||||||
|
|
||||||
<li>Redesign of how new games -- in particular networked games --
|
<li>Redesign of how new games -- in particular networked games --
|
||||||
are created. You can now \"invite\" somebody to a game you're
|
are created. You can now "invite" somebody to a game you're
|
||||||
creating, or to an existing game that's missing players.</li>
|
creating, or to an existing game that's missing players.</li>
|
||||||
|
|
||||||
|
<li>Add a setting for default player name, and on startup ask for it
|
||||||
|
-- but only once.</li>
|
||||||
|
|
||||||
<li>Make name fields assume upper-case</li>
|
<li>Make name fields assume upper-case</li>
|
||||||
|
|
||||||
|
<li>Sort games by creation date not name. (Soon you'll be able to
|
||||||
|
rename them.)</li>
|
||||||
|
|
||||||
<li>Fix/reduce impact of java memory leaks</li>
|
<li>Fix/reduce impact of java memory leaks</li>
|
||||||
|
|
||||||
</ul>
|
</ul>
|
||||||
|
|
|
@ -72,6 +72,10 @@ public class BoardActivity extends XWActivity
|
||||||
private static final int CHAT_REQUEST = 1;
|
private static final int CHAT_REQUEST = 1;
|
||||||
private static final int SCREEN_ON_TIME = 10 * 60 * 1000; // 10 mins
|
private static final int SCREEN_ON_TIME = 10 * 60 * 1000; // 10 mins
|
||||||
|
|
||||||
|
private static final String DLG_TITLE = "DLG_TITLE";
|
||||||
|
private static final String DLG_TITLESTR = "DLG_TITLESTR";
|
||||||
|
private static final String DLG_BYTES = "DLG_BYTES";
|
||||||
|
|
||||||
private BoardView m_view;
|
private BoardView m_view;
|
||||||
private int m_jniGamePtr;
|
private int m_jniGamePtr;
|
||||||
private GameUtils.GameLock m_gameLock;
|
private GameUtils.GameLock m_gameLock;
|
||||||
|
@ -104,8 +108,6 @@ public class BoardActivity extends XWActivity
|
||||||
private JNIThread.GameStateInfo m_gsi;
|
private JNIThread.GameStateInfo m_gsi;
|
||||||
private boolean m_blockingDlgPosted = false;
|
private boolean m_blockingDlgPosted = false;
|
||||||
|
|
||||||
private ProgressDialog m_progress;
|
|
||||||
private boolean m_isVisible;
|
|
||||||
private String m_room;
|
private String m_room;
|
||||||
private int m_missing;
|
private int m_missing;
|
||||||
private boolean m_haveInvited = false;
|
private boolean m_haveInvited = false;
|
||||||
|
@ -141,7 +143,6 @@ public class BoardActivity extends XWActivity
|
||||||
case DLG_BADWORDS:
|
case DLG_BADWORDS:
|
||||||
case DLG_RETRY:
|
case DLG_RETRY:
|
||||||
ab = new AlertDialog.Builder( BoardActivity.this )
|
ab = new AlertDialog.Builder( BoardActivity.this )
|
||||||
//.setIcon( R.drawable.alert_dialog_icon )
|
|
||||||
.setTitle( m_dlgTitle )
|
.setTitle( m_dlgTitle )
|
||||||
.setMessage( m_dlgBytes )
|
.setMessage( m_dlgBytes )
|
||||||
.setPositiveButton( R.string.button_ok, null );
|
.setPositiveButton( R.string.button_ok, null );
|
||||||
|
@ -316,6 +317,7 @@ public class BoardActivity extends XWActivity
|
||||||
protected void onCreate( Bundle savedInstanceState )
|
protected void onCreate( Bundle savedInstanceState )
|
||||||
{
|
{
|
||||||
super.onCreate( savedInstanceState );
|
super.onCreate( savedInstanceState );
|
||||||
|
getBundledData( savedInstanceState );
|
||||||
|
|
||||||
if ( CommonPrefs.getHideTitleBar( this ) ) {
|
if ( CommonPrefs.getHideTitleBar( this ) ) {
|
||||||
requestWindowFeature( Window.FEATURE_NO_TITLE );
|
requestWindowFeature( Window.FEATURE_NO_TITLE );
|
||||||
|
@ -352,10 +354,31 @@ public class BoardActivity extends XWActivity
|
||||||
{
|
{
|
||||||
super.onResume();
|
super.onResume();
|
||||||
m_handler = new Handler();
|
m_handler = new Handler();
|
||||||
|
m_blockingDlgPosted = false;
|
||||||
|
|
||||||
setKeepScreenOn();
|
setKeepScreenOn();
|
||||||
|
|
||||||
loadGame();
|
loadGame();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onSaveInstanceState( Bundle outState )
|
||||||
|
{
|
||||||
|
super.onSaveInstanceState( outState );
|
||||||
|
outState.putInt( DLG_TITLESTR, m_dlgTitle );
|
||||||
|
outState.putString( DLG_TITLESTR, m_dlgTitleStr );
|
||||||
|
outState.putString( DLG_BYTES, m_dlgBytes );
|
||||||
|
}
|
||||||
|
|
||||||
|
private void getBundledData( Bundle bundle )
|
||||||
|
{
|
||||||
|
if ( null != bundle ) {
|
||||||
|
m_dlgTitleStr = bundle.getString( DLG_TITLESTR );
|
||||||
|
m_dlgTitle = bundle.getInt( DLG_TITLE );
|
||||||
|
m_dlgBytes = bundle.getString( DLG_BYTES );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onActivityResult( int requestCode, int resultCode, Intent data )
|
protected void onActivityResult( int requestCode, int resultCode, Intent data )
|
||||||
{
|
{
|
||||||
|
@ -541,7 +564,7 @@ public class BoardActivity extends XWActivity
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
Utils.logf( "menuitem " + item.getItemId() + " not handled" );
|
Utils.logf( "menuitem %d not handled", id );
|
||||||
handled = false;
|
handled = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -780,7 +803,7 @@ public class BoardActivity extends XWActivity
|
||||||
|
|
||||||
public void setIsServer( boolean isServer )
|
public void setIsServer( boolean isServer )
|
||||||
{
|
{
|
||||||
Utils.logf( "setIsServer(%s)", isServer?"true":"false" );
|
Utils.logf( "setIsServer(%b)", isServer );
|
||||||
DeviceRole newRole = isServer? DeviceRole.SERVER_ISSERVER
|
DeviceRole newRole = isServer? DeviceRole.SERVER_ISSERVER
|
||||||
: DeviceRole.SERVER_ISCLIENT;
|
: DeviceRole.SERVER_ISCLIENT;
|
||||||
if ( newRole != m_gi.serverRole ) {
|
if ( newRole != m_gi.serverRole ) {
|
||||||
|
@ -868,37 +891,6 @@ public class BoardActivity extends XWActivity
|
||||||
return ! m_jniThread.busy();
|
return ! m_jniThread.busy();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void engineStarting( int nBlanks )
|
|
||||||
{
|
|
||||||
if ( nBlanks > 0 ) {
|
|
||||||
post( new Runnable() {
|
|
||||||
// Need to keep this from running after activity dies!!
|
|
||||||
public void run() {
|
|
||||||
if ( m_isVisible ) {
|
|
||||||
String title =
|
|
||||||
getString( R.string.progress_title );
|
|
||||||
m_progress =
|
|
||||||
ProgressDialog.show( BoardActivity.this,
|
|
||||||
title, null, true,
|
|
||||||
true );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void engineStopping()
|
|
||||||
{
|
|
||||||
post( new Runnable() {
|
|
||||||
public void run() {
|
|
||||||
if ( null != m_progress ) {
|
|
||||||
m_progress.cancel();
|
|
||||||
m_progress = null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} );
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean userQuery( int id, String query )
|
public boolean userQuery( int id, String query )
|
||||||
{
|
{
|
||||||
boolean result;
|
boolean result;
|
||||||
|
@ -1002,7 +994,8 @@ public class BoardActivity extends XWActivity
|
||||||
// m_view.setVerticalScrollBarEnabled( maxOffset > 0 );
|
// m_view.setVerticalScrollBarEnabled( maxOffset > 0 );
|
||||||
// }
|
// }
|
||||||
|
|
||||||
public boolean warnIllegalWord( String[] words, int turn, boolean turnLost )
|
public boolean warnIllegalWord( String[] words, int turn,
|
||||||
|
boolean turnLost )
|
||||||
{
|
{
|
||||||
Utils.logf( "warnIllegalWord" );
|
Utils.logf( "warnIllegalWord" );
|
||||||
boolean accept = turnLost;
|
boolean accept = turnLost;
|
||||||
|
@ -1028,7 +1021,7 @@ public class BoardActivity extends XWActivity
|
||||||
accept = 0 != waitBlockingDialog( QUERY_REQUEST_BLK, 0 );
|
accept = 0 != waitBlockingDialog( QUERY_REQUEST_BLK, 0 );
|
||||||
}
|
}
|
||||||
|
|
||||||
Utils.logf( "warnIllegalWord=>" + accept );
|
Utils.logf( "warnIllegalWord=>%b", accept );
|
||||||
return accept;
|
return accept;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1050,9 +1043,6 @@ public class BoardActivity extends XWActivity
|
||||||
|
|
||||||
private void loadGame()
|
private void loadGame()
|
||||||
{
|
{
|
||||||
Assert.assertFalse( m_blockingDlgPosted ); // found the problem!
|
|
||||||
m_blockingDlgPosted = false;
|
|
||||||
|
|
||||||
if ( 0 == m_jniGamePtr ) {
|
if ( 0 == m_jniGamePtr ) {
|
||||||
Assert.assertNull( m_gameLock );
|
Assert.assertNull( m_gameLock );
|
||||||
m_gameLock = new GameUtils.GameLock( m_name, true ).lock();
|
m_gameLock = new GameUtils.GameLock( m_name, true ).lock();
|
||||||
|
@ -1235,25 +1225,27 @@ public class BoardActivity extends XWActivity
|
||||||
Utils.logf( "waitBlockingDialog: dropping dlgID %d", dlgID );
|
Utils.logf( "waitBlockingDialog: dropping dlgID %d", dlgID );
|
||||||
} else {
|
} else {
|
||||||
setBlockingThread();
|
setBlockingThread();
|
||||||
|
m_resultCode = cancelResult;
|
||||||
|
|
||||||
post( new Runnable() {
|
if ( post( new Runnable() {
|
||||||
public void run() {
|
public void run() {
|
||||||
showDialog( dlgID ); // crash
|
showDialog( dlgID );
|
||||||
m_blockingDlgPosted = true;
|
m_blockingDlgPosted = true;
|
||||||
}
|
}
|
||||||
} );
|
} ) ) {
|
||||||
|
|
||||||
try {
|
try {
|
||||||
m_forResultWait.acquire();
|
m_forResultWait.acquire();
|
||||||
m_blockingDlgPosted = false;
|
m_blockingDlgPosted = false;
|
||||||
} catch ( java.lang.InterruptedException ie ) {
|
} catch ( java.lang.InterruptedException ie ) {
|
||||||
Utils.logf( "waitBlockingDialog: got " + ie.toString() );
|
Utils.logf( "waitBlockingDialog: got %s", ie.toString() );
|
||||||
m_resultCode = cancelResult;
|
|
||||||
if ( m_blockingDlgPosted ) {
|
if ( m_blockingDlgPosted ) {
|
||||||
dismissDialog( dlgID );
|
dismissDialog( dlgID );
|
||||||
m_blockingDlgPosted = false;
|
m_blockingDlgPosted = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
clearBlockingThread();
|
clearBlockingThread();
|
||||||
result = m_resultCode;
|
result = m_resultCode;
|
||||||
}
|
}
|
||||||
|
@ -1308,11 +1300,7 @@ public class BoardActivity extends XWActivity
|
||||||
interruptBlockingThread();
|
interruptBlockingThread();
|
||||||
|
|
||||||
if ( null != m_jniThread ) {
|
if ( null != m_jniThread ) {
|
||||||
if ( save ) {
|
m_jniThread.waitToStop( save );
|
||||||
Utils.logf( "posting CMD_SAVE" );
|
|
||||||
m_jniThread.handle( JNIThread.JNICmd.CMD_SAVE );
|
|
||||||
}
|
|
||||||
m_jniThread.waitToStop();
|
|
||||||
m_jniThread = null;
|
m_jniThread = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1373,13 +1361,15 @@ public class BoardActivity extends XWActivity
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void post( Runnable runnable )
|
private boolean post( Runnable runnable )
|
||||||
{
|
{
|
||||||
if ( null != m_handler ) {
|
boolean canPost = null != m_handler;
|
||||||
|
if ( canPost ) {
|
||||||
m_handler.post( runnable );
|
m_handler.post( runnable );
|
||||||
} else {
|
} else {
|
||||||
Utils.logf( "post: dropping because handler null" );
|
Utils.logf( "post: dropping because handler null" );
|
||||||
}
|
}
|
||||||
|
return canPost;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void postDelayed( Runnable runnable, int when )
|
private void postDelayed( Runnable runnable, int when )
|
||||||
|
|
|
@ -187,7 +187,7 @@ public class BoardView extends View implements DrawCtx, BoardHandler,
|
||||||
m_jniThread.handle( JNIThread.JNICmd.CMD_PEN_UP, xx, yy );
|
m_jniThread.handle( JNIThread.JNICmd.CMD_PEN_UP, xx, yy );
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
Utils.logf( "unknown action: " + action );
|
Utils.logf( "unknown action: %d", action );
|
||||||
Utils.logf( event.toString() );
|
Utils.logf( event.toString() );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -143,11 +143,11 @@ public class CommsTransport implements TransportProcs,
|
||||||
// we get this when relay goes down. Need to notify!
|
// we get this when relay goes down. Need to notify!
|
||||||
failed = true;
|
failed = true;
|
||||||
closeSocket();
|
closeSocket();
|
||||||
Utils.logf( "exiting: " + cce.toString() );
|
Utils.logf( "exiting: %s", cce.toString() );
|
||||||
break; // don't try again
|
break; // don't try again
|
||||||
} catch ( java.io.IOException ioe ) {
|
} catch ( java.io.IOException ioe ) {
|
||||||
closeSocket();
|
closeSocket();
|
||||||
Utils.logf( "exiting: " + ioe.toString() );
|
Utils.logf( "exiting: %s", ioe.toString() );
|
||||||
Utils.logf( ioe.toString() );
|
Utils.logf( ioe.toString() );
|
||||||
} catch ( java.nio.channels.NoConnectionPendingException ncp ) {
|
} catch ( java.nio.channels.NoConnectionPendingException ncp ) {
|
||||||
Utils.logf( "%s", ncp.toString() );
|
Utils.logf( "%s", ncp.toString() );
|
||||||
|
@ -318,7 +318,7 @@ public class CommsTransport implements TransportProcs,
|
||||||
try {
|
try {
|
||||||
m_thread.join(100); // wait up to 1/10 second
|
m_thread.join(100); // wait up to 1/10 second
|
||||||
} catch ( java.lang.InterruptedException ie ) {
|
} catch ( java.lang.InterruptedException ie ) {
|
||||||
Utils.logf( "got InterruptedException: " + ie.toString() );
|
Utils.logf( "got InterruptedException: %s", ie.toString() );
|
||||||
}
|
}
|
||||||
m_thread = null;
|
m_thread = null;
|
||||||
}
|
}
|
||||||
|
|
|
@ -38,6 +38,8 @@ import org.eehouse.android.xw4.jni.*;
|
||||||
|
|
||||||
public class DBUtils {
|
public class DBUtils {
|
||||||
|
|
||||||
|
private static final String ROW_ID = "rowid";
|
||||||
|
|
||||||
public static interface DBChangeListener {
|
public static interface DBChangeListener {
|
||||||
public void pathSaved( String path );
|
public void pathSaved( String path );
|
||||||
}
|
}
|
||||||
|
@ -87,7 +89,8 @@ public class DBUtils {
|
||||||
|
|
||||||
synchronized( s_dbHelper ) {
|
synchronized( s_dbHelper ) {
|
||||||
SQLiteDatabase db = s_dbHelper.getReadableDatabase();
|
SQLiteDatabase db = s_dbHelper.getReadableDatabase();
|
||||||
String[] columns = { DBHelper.NUM_MOVES, DBHelper.NUM_PLAYERS,
|
String[] columns = { ROW_ID,
|
||||||
|
DBHelper.NUM_MOVES, DBHelper.NUM_PLAYERS,
|
||||||
DBHelper.MISSINGPLYRS,
|
DBHelper.MISSINGPLYRS,
|
||||||
DBHelper.GAME_OVER, DBHelper.PLAYERS,
|
DBHelper.GAME_OVER, DBHelper.PLAYERS,
|
||||||
DBHelper.TURN, DBHelper.GIFLAGS,
|
DBHelper.TURN, DBHelper.GIFLAGS,
|
||||||
|
@ -103,6 +106,9 @@ public class DBUtils {
|
||||||
Cursor cursor = db.query( DBHelper.TABLE_NAME_SUM, columns,
|
Cursor cursor = db.query( DBHelper.TABLE_NAME_SUM, columns,
|
||||||
selection, null, null, null, null );
|
selection, null, null, null, null );
|
||||||
if ( 1 == cursor.getCount() && cursor.moveToFirst() ) {
|
if ( 1 == cursor.getCount() && cursor.moveToFirst() ) {
|
||||||
|
Utils.logf( "got rowid: %d",
|
||||||
|
cursor.getLong( cursor.getColumnIndex(ROW_ID) ) );
|
||||||
|
|
||||||
summary = new GameSummary();
|
summary = new GameSummary();
|
||||||
summary.nMoves = cursor.getInt(cursor.
|
summary.nMoves = cursor.getInt(cursor.
|
||||||
getColumnIndex(DBHelper.NUM_MOVES));
|
getColumnIndex(DBHelper.NUM_MOVES));
|
||||||
|
|
|
@ -65,11 +65,11 @@ public class DictImportActivity extends XWActivity {
|
||||||
m_saved = saveDict( is, uri.getPath() );
|
m_saved = saveDict( is, uri.getPath() );
|
||||||
is.close();
|
is.close();
|
||||||
} catch ( java.net.URISyntaxException use ) {
|
} catch ( java.net.URISyntaxException use ) {
|
||||||
Utils.logf( "URISyntaxException: %s" + use.toString() );
|
Utils.logf( "URISyntaxException: %s", use.toString() );
|
||||||
} catch ( java.net.MalformedURLException mue ) {
|
} catch ( java.net.MalformedURLException mue ) {
|
||||||
Utils.logf( "MalformedURLException: %s" + mue.toString() );
|
Utils.logf( "MalformedURLException: %s", mue.toString() );
|
||||||
} catch ( java.io.IOException ioe ) {
|
} catch ( java.io.IOException ioe ) {
|
||||||
Utils.logf( "IOException: %s" + ioe.toString() );
|
Utils.logf( "IOException: %s", ioe.toString() );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return totalSize;
|
return totalSize;
|
||||||
|
|
|
@ -397,7 +397,7 @@ public class DictsActivity extends ExpandableListActivity
|
||||||
try {
|
try {
|
||||||
info = (ExpandableListContextMenuInfo)item.getMenuInfo();
|
info = (ExpandableListContextMenuInfo)item.getMenuInfo();
|
||||||
} catch (ClassCastException e) {
|
} catch (ClassCastException e) {
|
||||||
Utils.logf( "bad menuInfo:" + e.toString() );
|
Utils.logf( "bad menuInfo: %s", e.toString() );
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -919,8 +919,8 @@ public class GameConfig extends XWActivity
|
||||||
|
|
||||||
if ( !m_notNetworkedGame ) {
|
if ( !m_notNetworkedGame ) {
|
||||||
m_car.ip_relay_seeksPublicRoom = m_joinPublicCheck.isChecked();
|
m_car.ip_relay_seeksPublicRoom = m_joinPublicCheck.isChecked();
|
||||||
Utils.logf( "ip_relay_seeksPublicRoom: %s",
|
Utils.logf( "ip_relay_seeksPublicRoom: %b",
|
||||||
m_car.ip_relay_seeksPublicRoom?"true":"false" );
|
m_car.ip_relay_seeksPublicRoom );
|
||||||
m_car.ip_relay_advertiseRoom =
|
m_car.ip_relay_advertiseRoom =
|
||||||
Utils.getChecked( this, R.id.advertise_new_room_check );
|
Utils.getChecked( this, R.id.advertise_new_room_check );
|
||||||
if ( m_car.ip_relay_seeksPublicRoom ) {
|
if ( m_car.ip_relay_seeksPublicRoom ) {
|
||||||
|
|
|
@ -634,8 +634,8 @@ public class GameUtils {
|
||||||
bytes = new byte[len];
|
bytes = new byte[len];
|
||||||
int nRead = dict.read( bytes, 0, len );
|
int nRead = dict.read( bytes, 0, len );
|
||||||
if ( nRead != len ) {
|
if ( nRead != len ) {
|
||||||
Utils.logf( "**** warning ****; read only " + nRead + " of "
|
Utils.logf( "**** warning ****; read only %d of %d bytes.",
|
||||||
+ len + " bytes." );
|
nRead, len );
|
||||||
}
|
}
|
||||||
// check that with len bytes we've read the whole file
|
// check that with len bytes we've read the whole file
|
||||||
Assert.assertTrue( -1 == dict.read() );
|
Assert.assertTrue( -1 == dict.read() );
|
||||||
|
@ -831,7 +831,7 @@ public class GameUtils {
|
||||||
lock.unlock();
|
lock.unlock();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Utils.logf( "feedMessages=>%s", draw?"true":"false" );
|
Utils.logf( "feedMessages=>%b", draw );
|
||||||
return draw;
|
return draw;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -361,7 +361,7 @@ public class GamesList extends XWListActivity
|
||||||
try {
|
try {
|
||||||
info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
|
info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
|
||||||
} catch (ClassCastException e) {
|
} catch (ClassCastException e) {
|
||||||
Utils.logf( "bad menuInfo:" + e.toString() );
|
Utils.logf( "bad menuInfo: %s", e.toString() );
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -31,7 +31,7 @@ public class ReceiveNBS extends BroadcastReceiver {
|
||||||
@Override
|
@Override
|
||||||
public void onReceive( Context context, Intent intent )
|
public void onReceive( Context context, Intent intent )
|
||||||
{
|
{
|
||||||
Utils.logf( "onReceive called: " + intent.toString() );
|
Utils.logf( "onReceive called: %s", intent.toString() );
|
||||||
|
|
||||||
Bundle bundle = intent.getExtras();
|
Bundle bundle = intent.getExtras();
|
||||||
SmsMessage[] smsarr = null;
|
SmsMessage[] smsarr = null;
|
||||||
|
@ -40,7 +40,7 @@ public class ReceiveNBS extends BroadcastReceiver {
|
||||||
smsarr = new SmsMessage[pdus.length];
|
smsarr = new SmsMessage[pdus.length];
|
||||||
for ( int ii = 0; ii < pdus.length; ii++){
|
for ( int ii = 0; ii < pdus.length; ii++){
|
||||||
smsarr[ii] = SmsMessage.createFromPdu((byte[])pdus[ii]);
|
smsarr[ii] = SmsMessage.createFromPdu((byte[])pdus[ii]);
|
||||||
Utils.logf( "from " + smsarr[ii].getOriginatingAddress() );
|
Utils.logf( "from %s", smsarr[ii].getOriginatingAddress() );
|
||||||
// buf.append( smsarr[ii].getMessageBody() );
|
// buf.append( smsarr[ii].getMessageBody() );
|
||||||
// XwJni.handle( XwJni.JNICmd.CMD_RECEIVE,
|
// XwJni.handle( XwJni.JNICmd.CMD_RECEIVE,
|
||||||
// smsarr[ii].getMessageBody() );
|
// smsarr[ii].getMessageBody() );
|
||||||
|
|
|
@ -29,7 +29,7 @@ public class StatusReceiver extends BroadcastReceiver {
|
||||||
@Override
|
@Override
|
||||||
public void onReceive( Context context, Intent intent )
|
public void onReceive( Context context, Intent intent )
|
||||||
{
|
{
|
||||||
Utils.logf( "StatusReceiver::onReceive called: " + intent.toString() );
|
Utils.logf( "StatusReceiver.onReceive called: %s", intent.toString() );
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -108,6 +108,7 @@ public class JNIThread extends Thread {
|
||||||
private GameStateInfo m_gsi = new GameStateInfo();
|
private GameStateInfo m_gsi = new GameStateInfo();
|
||||||
|
|
||||||
private boolean m_stopped = false;
|
private boolean m_stopped = false;
|
||||||
|
private boolean m_saveOnStop = false;
|
||||||
private int m_jniGamePtr;
|
private int m_jniGamePtr;
|
||||||
private GameUtils.GameLock m_lock;
|
private GameUtils.GameLock m_lock;
|
||||||
private Context m_context;
|
private Context m_context;
|
||||||
|
@ -143,8 +144,12 @@ public class JNIThread extends Thread {
|
||||||
m_queue = new LinkedBlockingQueue<QueueElem>();
|
m_queue = new LinkedBlockingQueue<QueueElem>();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void waitToStop() {
|
public void waitToStop( boolean save )
|
||||||
|
{
|
||||||
|
synchronized ( this ) {
|
||||||
m_stopped = true;
|
m_stopped = true;
|
||||||
|
m_saveOnStop = save;
|
||||||
|
}
|
||||||
handle( JNICmd.CMD_NONE ); // tickle it
|
handle( JNICmd.CMD_NONE ); // tickle it
|
||||||
try {
|
try {
|
||||||
// Can't pass timeout to join. There's no way to kill
|
// Can't pass timeout to join. There's no way to kill
|
||||||
|
@ -154,7 +159,7 @@ public class JNIThread extends Thread {
|
||||||
join();
|
join();
|
||||||
// Assert.assertFalse( isAlive() );
|
// Assert.assertFalse( isAlive() );
|
||||||
} catch ( java.lang.InterruptedException ie ) {
|
} catch ( java.lang.InterruptedException ie ) {
|
||||||
Utils.logf( "got InterruptedException: " + ie.toString() );
|
Utils.logf( "JNIThread.waitToStop() got %s", ie.toString() );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -251,10 +256,31 @@ public class JNIThread extends Thread {
|
||||||
Message.obtain( m_handler, TOOLBAR_STATES ).sendToTarget();
|
Message.obtain( m_handler, TOOLBAR_STATES ).sendToTarget();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void save_jni()
|
||||||
|
{
|
||||||
|
// If server has any work to do, e.g. clean up after showing a
|
||||||
|
// remote- or robot-moved dialog, let it do so before saving
|
||||||
|
// state. In some cases it'll otherwise drop the move.
|
||||||
|
XwJNI.server_do( m_jniGamePtr );
|
||||||
|
|
||||||
|
XwJNI.game_getGi( m_jniGamePtr, m_gi );
|
||||||
|
GameSummary summary = new GameSummary( m_gi );
|
||||||
|
XwJNI.game_summarize( m_jniGamePtr, summary );
|
||||||
|
byte[] state = XwJNI.game_saveToStream( m_jniGamePtr, null );
|
||||||
|
GameUtils.saveGame( m_context, state, m_lock, false );
|
||||||
|
DBUtils.saveSummary( m_context, m_lock, summary );
|
||||||
|
}
|
||||||
|
|
||||||
public void run()
|
public void run()
|
||||||
{
|
{
|
||||||
boolean[] barr = new boolean[2]; // scratch boolean
|
boolean[] barr = new boolean[2]; // scratch boolean
|
||||||
while ( !m_stopped ) {
|
for ( ; ; ) {
|
||||||
|
synchronized ( this ) {
|
||||||
|
if ( m_stopped ) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
QueueElem elem;
|
QueueElem elem;
|
||||||
Object[] args;
|
Object[] args;
|
||||||
try {
|
try {
|
||||||
|
@ -271,18 +297,7 @@ public class JNIThread extends Thread {
|
||||||
if ( nextSame( JNICmd.CMD_SAVE ) ) {
|
if ( nextSame( JNICmd.CMD_SAVE ) ) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
// If server has any work to do, e.g. clean up after
|
save_jni();
|
||||||
// showing a remote- or robot-moved dialog, let it do
|
|
||||||
// so before saving state. In some cases it'll
|
|
||||||
// otherwise drop the move.
|
|
||||||
XwJNI.server_do( m_jniGamePtr );
|
|
||||||
|
|
||||||
XwJNI.game_getGi( m_jniGamePtr, m_gi );
|
|
||||||
GameSummary summary = new GameSummary( m_gi );
|
|
||||||
XwJNI.game_summarize( m_jniGamePtr, summary );
|
|
||||||
byte[] state = XwJNI.game_saveToStream( m_jniGamePtr, null );
|
|
||||||
GameUtils.saveGame( m_context, state, m_lock, false );
|
|
||||||
DBUtils.saveSummary( m_context, m_lock, summary );
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case CMD_DRAW:
|
case CMD_DRAW:
|
||||||
|
@ -531,13 +546,17 @@ public class JNIThread extends Thread {
|
||||||
|
|
||||||
checkButtons();
|
checkButtons();
|
||||||
}
|
}
|
||||||
|
} // for
|
||||||
|
|
||||||
|
if ( m_saveOnStop ) {
|
||||||
|
save_jni();
|
||||||
}
|
}
|
||||||
} // run
|
} // run
|
||||||
|
|
||||||
public void handle( JNICmd cmd, boolean isUI, Object... args )
|
public void handle( JNICmd cmd, boolean isUI, Object... args )
|
||||||
{
|
{
|
||||||
QueueElem elem = new QueueElem( cmd, isUI, args );
|
QueueElem elem = new QueueElem( cmd, isUI, args );
|
||||||
// Utils.logf( "adding: " + cmd.toString() );
|
// Utils.logf( "adding: %s", cmd.toString() );
|
||||||
m_queue.add( elem );
|
m_queue.add( elem );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -34,8 +34,6 @@ public interface UtilCtxt {
|
||||||
void turnChanged();
|
void turnChanged();
|
||||||
|
|
||||||
boolean engineProgressCallback();
|
boolean engineProgressCallback();
|
||||||
void engineStarting( int nBlanks );
|
|
||||||
void engineStopping();
|
|
||||||
|
|
||||||
// Values for why; should be enums
|
// Values for why; should be enums
|
||||||
public static final int TIMER_PENDOWN = 1;
|
public static final int TIMER_PENDOWN = 1;
|
||||||
|
|
|
@ -63,16 +63,6 @@ public class UtilCtxtImpl implements UtilCtxt {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void engineStarting( int nBlanks )
|
|
||||||
{
|
|
||||||
subclassOverride( "engineStarting" );
|
|
||||||
}
|
|
||||||
|
|
||||||
public void engineStopping()
|
|
||||||
{
|
|
||||||
subclassOverride( "engineStopping" );
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setTimer( int why, int when, int handle )
|
public void setTimer( int why, int when, int handle )
|
||||||
{
|
{
|
||||||
subclassOverride( "setTimer" );
|
subclassOverride( "setTimer" );
|
||||||
|
@ -170,7 +160,7 @@ public class UtilCtxtImpl implements UtilCtxt {
|
||||||
id = R.string.strd_turn_score;
|
id = R.string.strd_turn_score;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
Utils.logf( "no such stringCode: " + stringCode );
|
Utils.logf( "no such stringCode: %d", stringCode );
|
||||||
}
|
}
|
||||||
|
|
||||||
String result;
|
String result;
|
||||||
|
|
|
@ -278,7 +278,11 @@ CommsCtxt*
|
||||||
comms_make( MPFORMAL XW_UtilCtxt* util, XP_Bool isServer,
|
comms_make( MPFORMAL XW_UtilCtxt* util, XP_Bool isServer,
|
||||||
XP_U16 XP_UNUSED_RELAY(nPlayersHere),
|
XP_U16 XP_UNUSED_RELAY(nPlayersHere),
|
||||||
XP_U16 XP_UNUSED_RELAY(nPlayersTotal),
|
XP_U16 XP_UNUSED_RELAY(nPlayersTotal),
|
||||||
const TransportProcs* procs )
|
const TransportProcs* procs
|
||||||
|
#ifdef SET_GAMESEED
|
||||||
|
, XP_U16 gameSeed
|
||||||
|
#endif
|
||||||
|
)
|
||||||
{
|
{
|
||||||
CommsCtxt* result = (CommsCtxt*)XP_MALLOC( mpool, sizeof(*result) );
|
CommsCtxt* result = (CommsCtxt*)XP_MALLOC( mpool, sizeof(*result) );
|
||||||
XP_MEMSET( result, 0, sizeof(*result) );
|
XP_MEMSET( result, 0, sizeof(*result) );
|
||||||
|
@ -293,6 +297,9 @@ comms_make( MPFORMAL XW_UtilCtxt* util, XP_Bool isServer,
|
||||||
|
|
||||||
#ifdef XWFEATURE_RELAY
|
#ifdef XWFEATURE_RELAY
|
||||||
init_relay( result, nPlayersHere, nPlayersTotal );
|
init_relay( result, nPlayersHere, nPlayersTotal );
|
||||||
|
# ifdef SET_GAMESEED
|
||||||
|
result->channelSeed = gameSeed;
|
||||||
|
# endif
|
||||||
#endif
|
#endif
|
||||||
return result;
|
return result;
|
||||||
} /* comms_make */
|
} /* comms_make */
|
||||||
|
@ -527,7 +534,11 @@ comms_makeFromStream( MPFORMAL XWStreamCtxt* stream, XW_UtilCtxt* util,
|
||||||
nPlayersTotal = 0;
|
nPlayersTotal = 0;
|
||||||
}
|
}
|
||||||
comms = comms_make( MPPARM(mpool) util, isServer,
|
comms = comms_make( MPPARM(mpool) util, isServer,
|
||||||
nPlayersHere, nPlayersTotal, procs );
|
nPlayersHere, nPlayersTotal, procs
|
||||||
|
#ifdef SET_GAMESEED
|
||||||
|
, 0
|
||||||
|
#endif
|
||||||
|
);
|
||||||
XP_MEMCPY( &comms->addr, &addr, sizeof(comms->addr) );
|
XP_MEMCPY( &comms->addr, &addr, sizeof(comms->addr) );
|
||||||
|
|
||||||
comms->connID = stream_getU32( stream );
|
comms->connID = stream_getU32( stream );
|
||||||
|
|
|
@ -142,7 +142,11 @@ typedef struct _TransportProcs {
|
||||||
CommsCtxt* comms_make( MPFORMAL XW_UtilCtxt* util,
|
CommsCtxt* comms_make( MPFORMAL XW_UtilCtxt* util,
|
||||||
XP_Bool isServer,
|
XP_Bool isServer,
|
||||||
XP_U16 nPlayersHere, XP_U16 nPlayersTotal,
|
XP_U16 nPlayersHere, XP_U16 nPlayersTotal,
|
||||||
const TransportProcs* procs );
|
const TransportProcs* procs
|
||||||
|
#ifdef SET_GAMESEED
|
||||||
|
,XP_U16 gameSeed
|
||||||
|
#endif
|
||||||
|
);
|
||||||
|
|
||||||
void comms_reset( CommsCtxt* comms, XP_Bool isServer,
|
void comms_reset( CommsCtxt* comms, XP_Bool isServer,
|
||||||
XP_U16 nPlayersHere, XP_U16 nPlayersTotal );
|
XP_U16 nPlayersHere, XP_U16 nPlayersTotal );
|
||||||
|
@ -174,7 +178,8 @@ CommsConnType comms_getConType( const CommsCtxt* comms );
|
||||||
XP_Bool comms_getIsServer( const CommsCtxt* comms );
|
XP_Bool comms_getIsServer( const CommsCtxt* comms );
|
||||||
|
|
||||||
CommsCtxt* comms_makeFromStream( MPFORMAL XWStreamCtxt* stream,
|
CommsCtxt* comms_makeFromStream( MPFORMAL XWStreamCtxt* stream,
|
||||||
XW_UtilCtxt* util, const TransportProcs* procs );
|
XW_UtilCtxt* util,
|
||||||
|
const TransportProcs* procs );
|
||||||
void comms_start( CommsCtxt* comms );
|
void comms_start( CommsCtxt* comms );
|
||||||
void comms_writeToStream( const CommsCtxt* comms, XWStreamCtxt* stream );
|
void comms_writeToStream( const CommsCtxt* comms, XWStreamCtxt* stream );
|
||||||
|
|
||||||
|
|
|
@ -72,7 +72,11 @@ checkServerRole( CurGameInfo* gi, XP_U16* nPlayersHere, XP_U16* nPlayersTotal )
|
||||||
void
|
void
|
||||||
game_makeNewGame( MPFORMAL XWGame* game, CurGameInfo* gi,
|
game_makeNewGame( MPFORMAL XWGame* game, CurGameInfo* gi,
|
||||||
XW_UtilCtxt* util, DrawCtx* draw,
|
XW_UtilCtxt* util, DrawCtx* draw,
|
||||||
CommonPrefs* cp, const TransportProcs* procs )
|
CommonPrefs* cp, const TransportProcs* procs
|
||||||
|
#ifdef SET_GAMESEED
|
||||||
|
,XP_U16 gameSeed
|
||||||
|
#endif
|
||||||
|
)
|
||||||
{
|
{
|
||||||
XP_U16 gameID = 0;
|
XP_U16 gameID = 0;
|
||||||
XP_U16 nPlayersHere, nPlayersTotal;
|
XP_U16 nPlayersHere, nPlayersTotal;
|
||||||
|
@ -92,7 +96,12 @@ game_makeNewGame( MPFORMAL XWGame* game, CurGameInfo* gi,
|
||||||
if ( gi->serverRole != SERVER_STANDALONE ) {
|
if ( gi->serverRole != SERVER_STANDALONE ) {
|
||||||
game->comms = comms_make( MPPARM(mpool) util,
|
game->comms = comms_make( MPPARM(mpool) util,
|
||||||
gi->serverRole != SERVER_ISCLIENT,
|
gi->serverRole != SERVER_ISCLIENT,
|
||||||
nPlayersHere, nPlayersTotal, procs );
|
nPlayersHere, nPlayersTotal,
|
||||||
|
procs
|
||||||
|
#ifdef SET_GAMESEED
|
||||||
|
, gameSeed
|
||||||
|
#endif
|
||||||
|
);
|
||||||
} else {
|
} else {
|
||||||
game->comms = (CommsCtxt*)NULL;
|
game->comms = (CommsCtxt*)NULL;
|
||||||
}
|
}
|
||||||
|
@ -141,7 +150,11 @@ game_reset( MPFORMAL XWGame* game, CurGameInfo* gi,
|
||||||
} else if ( gi->serverRole != SERVER_STANDALONE ) {
|
} else if ( gi->serverRole != SERVER_STANDALONE ) {
|
||||||
game->comms = comms_make( MPPARM(mpool) util,
|
game->comms = comms_make( MPPARM(mpool) util,
|
||||||
gi->serverRole != SERVER_ISCLIENT,
|
gi->serverRole != SERVER_ISCLIENT,
|
||||||
nPlayersHere, nPlayersTotal, procs );
|
nPlayersHere, nPlayersTotal, procs
|
||||||
|
#ifdef SET_GAMESEED
|
||||||
|
, 0
|
||||||
|
#endif
|
||||||
|
);
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
# ifdef DEBUG
|
# ifdef DEBUG
|
||||||
|
|
|
@ -108,7 +108,11 @@ typedef struct XWGame {
|
||||||
|
|
||||||
void game_makeNewGame( MPFORMAL XWGame* game, CurGameInfo* gi,
|
void game_makeNewGame( MPFORMAL XWGame* game, CurGameInfo* gi,
|
||||||
XW_UtilCtxt* util, DrawCtx* draw,
|
XW_UtilCtxt* util, DrawCtx* draw,
|
||||||
CommonPrefs* cp, const TransportProcs* procs );
|
CommonPrefs* cp, const TransportProcs* procs
|
||||||
|
#ifdef SET_GAMESEED
|
||||||
|
,XP_U16 gameSeed
|
||||||
|
#endif
|
||||||
|
);
|
||||||
void game_reset( MPFORMAL XWGame* game, CurGameInfo* gi, XW_UtilCtxt* util,
|
void game_reset( MPFORMAL XWGame* game, CurGameInfo* gi, XW_UtilCtxt* util,
|
||||||
CommonPrefs* cp, const TransportProcs* procs );
|
CommonPrefs* cp, const TransportProcs* procs );
|
||||||
|
|
||||||
|
|
|
@ -87,6 +87,7 @@ DEFINES += -DFEATURE_TRAY_EDIT
|
||||||
DEFINES += -DXWFEATURE_CROSSHAIRS
|
DEFINES += -DXWFEATURE_CROSSHAIRS
|
||||||
DEFINES += -DXWFEATURE_CHAT
|
DEFINES += -DXWFEATURE_CHAT
|
||||||
DEFINES += -DDISABLE_TILE_SEL
|
DEFINES += -DDISABLE_TILE_SEL
|
||||||
|
DEFINES += -DSET_GAMESEED
|
||||||
DEFINES += -DTEXT_MODEL
|
DEFINES += -DTEXT_MODEL
|
||||||
|
|
||||||
ifdef CURSES_CELL_HT
|
ifdef CURSES_CELL_HT
|
||||||
|
|
|
@ -1528,7 +1528,7 @@ cursesmain( XP_Bool isServer, LaunchParams* params )
|
||||||
} else {
|
} else {
|
||||||
game_makeNewGame( MEMPOOL &g_globals.cGlobals.game, ¶ms->gi,
|
game_makeNewGame( MEMPOOL &g_globals.cGlobals.game, ¶ms->gi,
|
||||||
params->util, (DrawCtx*)g_globals.draw,
|
params->util, (DrawCtx*)g_globals.draw,
|
||||||
&g_globals.cGlobals.cp, &procs );
|
&g_globals.cGlobals.cp, &procs, params->gameSeed );
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef XWFEATURE_STANDALONE_ONLY
|
#ifndef XWFEATURE_STANDALONE_ONLY
|
||||||
|
|
|
@ -443,7 +443,7 @@ createOrLoadObjects( GtkAppGlobals* globals )
|
||||||
|
|
||||||
game_makeNewGame( MEMPOOL &globals->cGlobals.game, ¶ms->gi,
|
game_makeNewGame( MEMPOOL &globals->cGlobals.game, ¶ms->gi,
|
||||||
params->util, (DrawCtx*)globals->draw,
|
params->util, (DrawCtx*)globals->draw,
|
||||||
&globals->cGlobals.cp, &procs );
|
&globals->cGlobals.cp, &procs, params->gameSeed );
|
||||||
|
|
||||||
addr.conType = params->conType;
|
addr.conType = params->conType;
|
||||||
if ( 0 ) {
|
if ( 0 ) {
|
||||||
|
|
|
@ -250,6 +250,7 @@ typedef enum {
|
||||||
,CMD_DICT
|
,CMD_DICT
|
||||||
,CMD_PLAYERDICT
|
,CMD_PLAYERDICT
|
||||||
,CMD_SEED
|
,CMD_SEED
|
||||||
|
,CMD_GAMESEED
|
||||||
,CMD_GAMEFILE
|
,CMD_GAMEFILE
|
||||||
,CMD_MMAP
|
,CMD_MMAP
|
||||||
,CMD_PRINTHISORY
|
,CMD_PRINTHISORY
|
||||||
|
@ -323,6 +324,7 @@ static CmdInfoRec CmdInfoRecs[] = {
|
||||||
,{ CMD_DICT, true, "game-dict", "dictionary name for game" }
|
,{ CMD_DICT, true, "game-dict", "dictionary name for game" }
|
||||||
,{ CMD_PLAYERDICT, true, "player-dict", "dictionary name for player (in sequence)" }
|
,{ CMD_PLAYERDICT, true, "player-dict", "dictionary name for player (in sequence)" }
|
||||||
,{ CMD_SEED, true, "seed", "random seed" }
|
,{ CMD_SEED, true, "seed", "random seed" }
|
||||||
|
,{ CMD_GAMESEED, true, "game-seed", "game seed (for relay play)" }
|
||||||
,{ CMD_GAMEFILE, true, "file", "file to save to/read from" }
|
,{ CMD_GAMEFILE, true, "file", "file to save to/read from" }
|
||||||
,{ CMD_MMAP, false, "use-mmap", "mmap dicts rather than copy them to memory" }
|
,{ CMD_MMAP, false, "use-mmap", "mmap dicts rather than copy them to memory" }
|
||||||
,{ CMD_PRINTHISORY, false, "print-history", "print history on game over" }
|
,{ CMD_PRINTHISORY, false, "print-history", "print history on game over" }
|
||||||
|
@ -1026,6 +1028,9 @@ main( int argc, char** argv )
|
||||||
case CMD_SEED:
|
case CMD_SEED:
|
||||||
seed = atoi(optarg);
|
seed = atoi(optarg);
|
||||||
break;
|
break;
|
||||||
|
case CMD_GAMESEED:
|
||||||
|
mainParams.gameSeed = atoi(optarg);
|
||||||
|
break;
|
||||||
case CMD_GAMEFILE:
|
case CMD_GAMEFILE:
|
||||||
mainParams.fileName = optarg;
|
mainParams.fileName = optarg;
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -54,6 +54,7 @@ typedef struct LaunchParams {
|
||||||
VTableMgr* vtMgr;
|
VTableMgr* vtMgr;
|
||||||
XP_U16 nLocalPlayers;
|
XP_U16 nLocalPlayers;
|
||||||
XP_U16 nHidden;
|
XP_U16 nHidden;
|
||||||
|
XP_U16 gameSeed;
|
||||||
XP_S16 dropNthRcvd; /* negative means use for random calc */
|
XP_S16 dropNthRcvd; /* negative means use for random calc */
|
||||||
XP_U16 nPacketsRcvd; /* toward dropNthRcvd */
|
XP_U16 nPacketsRcvd; /* toward dropNthRcvd */
|
||||||
XP_Bool askNewGame;
|
XP_Bool askNewGame;
|
||||||
|
|
Loading…
Reference in a new issue