Revamped game cancellation handling a bit and modified handlePartialNoShow() to
cancel rather than start a game if zero humans showed up. git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@4049 542714f4-19e9-0310-aa3c-eee0fc999fb1
This commit is contained in:
@@ -599,15 +599,11 @@ public class GameManager extends PlaceManager
|
|||||||
// Log.info("Game room empty. Going away. " +
|
// Log.info("Game room empty. Going away. " +
|
||||||
// "[game=" + _gameobj.which() + "].");
|
// "[game=" + _gameobj.which() + "].");
|
||||||
|
|
||||||
// cancel the game if it was not already over
|
// cancel the game; which will shut us down
|
||||||
if (_gameobj.state != GameObject.GAME_OVER &&
|
if (!cancelGame()) {
|
||||||
_gameobj.state != GameObject.CANCELLED) {
|
// or shut down directly if the game is already over
|
||||||
_gameobj.setState(GameObject.CANCELLED);
|
shutdown();
|
||||||
}
|
}
|
||||||
|
|
||||||
// shut down the place (which will destroy the game object and
|
|
||||||
// clean up after everything)
|
|
||||||
shutdown();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -665,19 +661,29 @@ public class GameManager extends PlaceManager
|
|||||||
// mark the no-show players; this will cause allPlayersReady() to
|
// mark the no-show players; this will cause allPlayersReady() to
|
||||||
// think that everyone has arrived, but still allow us to tell who
|
// think that everyone has arrived, but still allow us to tell who
|
||||||
// has not shown up in gameDidStart()
|
// has not shown up in gameDidStart()
|
||||||
|
int humansHere = 0;
|
||||||
for (int ii = 0; ii < _playerOids.length; ii++) {
|
for (int ii = 0; ii < _playerOids.length; ii++) {
|
||||||
if (_playerOids[ii] == 0) {
|
if (_playerOids[ii] == 0) {
|
||||||
_playerOids[ii] = -1;
|
_playerOids[ii] = -1;
|
||||||
|
} else if (!isAI(ii)) {
|
||||||
|
humansHere++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// go ahead and start the game; gameDidStart() will take care of
|
if (humansHere == 0) {
|
||||||
// giving the boot to anyone who isn't around
|
// if there are no human players in the game, just cancel it
|
||||||
Log.info("Forcing start of partial no-show game " +
|
Log.info("Canceling no-show game [game=" + _gameobj.which() +
|
||||||
"[game=" + _gameobj.which() +
|
", players=" + StringUtil.toString(_playerOids) + "].");
|
||||||
", players=" + StringUtil.toString(_gameobj.players) +
|
cancelGame();
|
||||||
", poids=" + StringUtil.toString(_playerOids) + "].");
|
|
||||||
startGame();
|
} else {
|
||||||
|
// go ahead and start the game; gameDidStart() will take care of
|
||||||
|
// giving the boot to anyone who isn't around
|
||||||
|
Log.info("Forcing start of partial no-show game " +
|
||||||
|
"[game=" + _gameobj.which() +
|
||||||
|
", poids=" + StringUtil.toString(_playerOids) + "].");
|
||||||
|
startGame();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -775,15 +781,22 @@ public class GameManager extends PlaceManager
|
|||||||
gameDidStart();
|
gameDidStart();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case GameObject.CANCELLED:
|
|
||||||
// fall through to GAME_OVER case
|
|
||||||
|
|
||||||
case GameObject.GAME_OVER:
|
case GameObject.GAME_OVER:
|
||||||
// call gameDidEnd() only if the game was previously in play
|
// call gameDidEnd() only if the game was previously in play
|
||||||
if (oldState == GameObject.IN_PLAY) {
|
if (oldState == GameObject.IN_PLAY) {
|
||||||
gameDidEnd();
|
gameDidEnd();
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case GameObject.CANCELLED:
|
||||||
|
// let the manager do anything it cares to
|
||||||
|
gameWasCancelled();
|
||||||
|
|
||||||
|
// and shutdown if there's no one here
|
||||||
|
if (_plobj.occupants.size() == 0) {
|
||||||
|
shutdown();
|
||||||
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -962,6 +975,22 @@ public class GameManager extends PlaceManager
|
|||||||
// endGame() have been dispatched
|
// endGame() have been dispatched
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the state of the game to {@link GameObject#CANCELLED}.
|
||||||
|
*
|
||||||
|
* @return true if the game was cancelled, false if it was already over or
|
||||||
|
* cancelled.
|
||||||
|
*/
|
||||||
|
public boolean cancelGame ()
|
||||||
|
{
|
||||||
|
if (_gameobj.state != GameObject.GAME_OVER &&
|
||||||
|
_gameobj.state != GameObject.CANCELLED) {
|
||||||
|
_gameobj.setState(GameObject.CANCELLED);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Assigns the final winning status for each player to their respect
|
* Assigns the final winning status for each player to their respect
|
||||||
* player index in the supplied array. This will be called by {@link
|
* player index in the supplied array. This will be called by {@link
|
||||||
@@ -1031,6 +1060,23 @@ public class GameManager extends PlaceManager
|
|||||||
// calculate ratings and all that...
|
// calculate ratings and all that...
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Called to let the manager know that the game was cancelled (and may be
|
||||||
|
* about to be shutdown if there's no one in the room). In the base
|
||||||
|
* framework a game will only be canceled if no one shows up, so {@link
|
||||||
|
* #gameWillStart}, etc. will never have been called and thus {@link
|
||||||
|
* #gameWillEnd}, etc. will not be called. However, if a game chooses to
|
||||||
|
* cancel itself for whatever reason, no effort will be made to call {@link
|
||||||
|
* #endGame} and the game ending call backs so that game can override this
|
||||||
|
* method to do anything it needs. Note that {@link #didShutdown} will be
|
||||||
|
* called in every case and that's generally the best place to free
|
||||||
|
* resources so this method may not be needed.
|
||||||
|
*/
|
||||||
|
protected void gameWasCancelled ()
|
||||||
|
{
|
||||||
|
// nothing to do by default
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Report winner and loser oids to each room that any of the
|
* Report winner and loser oids to each room that any of the
|
||||||
* winners/losers is in.
|
* winners/losers is in.
|
||||||
|
|||||||
Reference in New Issue
Block a user