A few twiddlings:

- set up the playerStatus array before gameWillStart() so that we can properly
  note players that abandon ship before the game is going;
- fixed some raw collection usage;
- fixed some assumptions about IN_PLAY being the only state that means a game
  is in play.


git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@4127 542714f4-19e9-0310-aa3c-eee0fc999fb1
This commit is contained in:
Michael Bayne
2006-05-19 01:56:54 +00:00
parent 0ac15b0e3c
commit da4e12771f
@@ -26,10 +26,11 @@ import java.util.Arrays;
import java.util.Iterator;
import com.samskivert.util.ArrayIntSet;
import com.samskivert.util.Interval;
import com.samskivert.util.IntListUtil;
import com.samskivert.util.Interval;
import com.samskivert.util.RepeatCallTracker;
import com.samskivert.util.StringUtil;
import com.samskivert.util.Tuple;
import com.threerings.util.Name;
import com.threerings.presents.data.ClientObject;
@@ -444,10 +445,9 @@ public class GameManager extends PlaceManager
((_gameobj == null) || (_gameobj.state == GameObject.PRE_GAME))) {
// queue up the message.
if (_startmsgs == null) {
_startmsgs = new ArrayList();
_startmsgs = new ArrayList<Tuple<String,String>>();
}
_startmsgs.add(msgbundle);
_startmsgs.add(msg);
_startmsgs.add(new Tuple<String,String>(msgbundle, msg));
return;
}
@@ -488,6 +488,9 @@ public class GameManager extends PlaceManager
// stick the players into the game object
_gameobj.setPlayers(_gameconfig.players);
// set up an initial player status array
_gameobj.setPlayerStatus(new int[getPlayerSlots()]);
// save off the number of players so that we needn't repeatedly
// iterate through the player name array server-side unnecessarily
_playerCount = _gameobj.getPlayerCount();
@@ -599,11 +602,12 @@ public class GameManager extends PlaceManager
// Log.info("Game room empty. Going away. " +
// "[game=" + _gameobj.which() + "].");
// If we're in play then move to game over
// if we're in play then move to game over
if (_gameobj.state != GameObject.PRE_GAME &&
_gameobj.state != GameObject.GAME_OVER &&
_gameobj.state != GameObject.CANCELLED) {
_gameobj.setState(GameObject.GAME_OVER);
// and shutdown directly
shutdown();
// cancel the game; which will shut us down
@@ -753,7 +757,7 @@ public class GameManager extends PlaceManager
/**
* @return true if we should start the game even without any humans.
* Default implementation always returns false.
* Default implementation always returns false.
*/
protected boolean startWithoutHumans ()
{
@@ -769,9 +773,6 @@ public class GameManager extends PlaceManager
*/
protected void gameWillStart ()
{
// initialize the player status
_gameobj.setPlayerStatus(new int[getPlayerSlots()]);
// increment the round identifier
_gameobj.setRoundId(_gameobj.roundId + 1);
@@ -798,8 +799,14 @@ public class GameManager extends PlaceManager
break;
case GameObject.GAME_OVER:
// call gameDidEnd() only if the game was previously in play
if (oldState == GameObject.IN_PLAY) {
// we do some jiggery pokery to allow derived game objects to have
// different notions of what it means to be in play
_gameobj.state = oldState;
boolean wasInPlay = _gameobj.isInPlay();
_gameobj.state = state;
// now call gameDidEnd() only if the game was previously in play
if (wasInPlay) {
gameDidEnd();
}
break;
@@ -834,9 +841,9 @@ public class GameManager extends PlaceManager
// inform the players of any pending messages.
if (_startmsgs != null) {
for (Iterator iter = _startmsgs.iterator(); iter.hasNext(); ) {
systemMessage((String) iter.next(), // bundle
(String) iter.next()); // message
for (Tuple<String,String> mtup : _startmsgs) {
systemMessage(mtup.left, // bundle
mtup.right); // message
}
_startmsgs = null;
}
@@ -905,7 +912,6 @@ public class GameManager extends PlaceManager
// if it's time to end the game, then do so
if (shouldEndGame()) {
endGame();
} else {
// otherwise report that the player was knocked out to other
// people in his/her room
@@ -962,9 +968,9 @@ public class GameManager extends PlaceManager
}
// END TEMP
if (_gameobj.state != GameObject.IN_PLAY) {
Log.debug("Refusing to end game that was not in play " +
"[game=" + _gameobj.which() + "].");
if (!_gameobj.isInPlay()) {
Log.info("Refusing to end game that was not in play " +
"[game=" + _gameobj.which() + "].");
return;
}
@@ -1153,6 +1159,9 @@ public class GameManager extends PlaceManager
*/
protected void gameWillReset ()
{
// reinitialize the player status
_gameobj.setPlayerStatus(new int[getPlayerSlots()]);
// let our delegates do their business
applyToDelegates(new DelegateOp() {
public void apply (PlaceManagerDelegate delegate) {
@@ -1243,7 +1252,7 @@ public class GameManager extends PlaceManager
long now = System.currentTimeMillis();
int size = _managers.size();
for (int ii = 0; ii < size; ii++) {
GameManager gmgr = (GameManager)_managers.get(ii);
GameManager gmgr = _managers.get(ii);
try {
gmgr.tick(now);
} catch (Exception e) {
@@ -1291,7 +1300,7 @@ public class GameManager extends PlaceManager
/** If non-null, contains bundles and messages that should be sent as
* system messages once the game has started. */
protected ArrayList _startmsgs;
protected ArrayList<Tuple<String,String>> _startmsgs;
/** Our delegate operator to tick AIs. */
protected TickAIDelegateOp _tickAIOp;
@@ -1304,7 +1313,8 @@ public class GameManager extends PlaceManager
protected RepeatCallTracker _gameEndTracker = new RepeatCallTracker();
/** A list of all currently active game managers. */
protected static ArrayList _managers = new ArrayList();
protected static ArrayList<GameManager> _managers =
new ArrayList<GameManager>();
/** The interval for the game manager tick. */
protected static Interval _tickInterval;