- Revamped PartyGameConfig so that it can report which type of party game

it is (seated or free-for-all) or if it's not a party game after all
  (which the old interface supported and we may need in the future).
- Cleaned up the setting of table occupants to make the extension in yohoho
  cleaner.
- tables are now party-game aware and will do the right thing with
  the occupants list.
- simplified Table.equals() and added a corresponding hashCode(), because
  two objects that are equals() must give the same hashCode.


git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@3804 542714f4-19e9-0310-aa3c-eee0fc999fb1
This commit is contained in:
Ray Greenwell
2006-01-13 01:52:36 +00:00
parent bf45bb876e
commit 7f98cac7a8
5 changed files with 86 additions and 41 deletions
+53 -19
View File
@@ -29,8 +29,11 @@ import com.threerings.util.Name;
import com.threerings.presents.dobj.DSet;
import com.threerings.crowd.data.BodyObject;
import com.threerings.parlor.data.ParlorCodes;
import com.threerings.parlor.game.data.GameConfig;
import com.threerings.parlor.game.data.PartyGameConfig;
/**
* This class represents a table that is being used to matchmake a game by
@@ -151,8 +154,8 @@ public class Table
*/
public Name[] getPlayers ()
{
if (occupants == null) {
return null;
if (isPartyGame()) {
return occupants;
}
// create and populate the players array
@@ -195,19 +198,40 @@ public class Table
return newTeams;
}
/**
* Return true if the game is a party game.
*/
public boolean isPartyGame ()
{
return (PartyGameConfig.NOT_PARTY_GAME != getPartyGameType());
}
/**
* Get the type of party game being played at this table, or
* PartyGameConfig.NOT_PARTY_GAME.
*/
public byte getPartyGameType ()
{
if (config instanceof PartyGameConfig) {
return ((PartyGameConfig) config).getPartyGameType();
} else {
return PartyGameConfig.NOT_PARTY_GAME;
}
}
/**
* Requests to seat the specified user at the specified position in
* this table.
*
* @param position the position in which to seat the user.
* @param username the username of the user to be set.
* @param bodyOid the body object id of the user to be set.
* @param occupant the occupant to set.
*
* @return null if the user was successfully seated, a string error
* code explaining the failure if the user was not able to be seated
* at that position.
*/
public String setOccupant (int position, Name username, int bodyOid)
public String setOccupant (int position, BodyObject occupant)
{
// make sure the requested position is a valid one
if (position >= tconfig.desiredPlayerCount || position < 0) {
@@ -220,11 +244,21 @@ public class Table
}
// otherwise all is well, stick 'em in
occupants[position] = username;
bodyOids[position] = bodyOid;
setOccupantPos(position, occupant);
return null;
}
/**
* This method is used for party games, it does no bounds checking
* or verification of the player's ability to join, if you are unsure
* you should call 'setOccupant'.
*/
public void setOccupantPos (int position, BodyObject occupant)
{
occupants[position] = occupant.getVisibleName();
bodyOids[position] = occupant.getOid();
}
/**
* Requests that the specified user be removed from their seat at this
* table.
@@ -264,10 +298,10 @@ public class Table
}
/**
* Internal method used for clearing an occupant once we've located
* the right position.
* Called to clear an occupant at the specified position.
* Only call this method if you know what you're doing.
*/
protected void clearOccupantPos (int position)
public void clearOccupantPos (int position)
{
occupants[position] = null;
bodyOids[position] = 0;
@@ -325,17 +359,17 @@ public class Table
return tableId;
}
/**
* Returns true if this table is equal to the supplied object (which
* must be a table with the same table id).
*/
// documentation inherited
public boolean equals (Object other)
{
if (other != null && other instanceof Table) {
return ((Table)other).tableId.equals(tableId);
} else {
return false;
}
return (other instanceof Table) &&
tableId.equals(((Table) other).tableId);
}
// documentation inherited
public int hashCode ()
{
return tableId.intValue();
}
/**
@@ -309,8 +309,9 @@ public abstract class GameController extends PlaceController
*/
protected boolean isPartyGame ()
{
return ((_config instanceof PartyGameConfig) &&
((PartyGameConfig)_config).isPartyGame());
return (_config instanceof PartyGameConfig) &&
(((PartyGameConfig)_config).getPartyGameType() !=
PartyGameConfig.NOT_PARTY_GAME);
}
/** A reference to the active parlor context. */
@@ -23,17 +23,28 @@ package com.threerings.parlor.game.data;
/**
* Provides additional information for party games.
* A party game is a game in which the players are not set prior to starting,
* but players can come and go at will during the normal progression of
* the game.
*/
public interface PartyGameConfig
{
/**
* Returns true if this party game is being played in party game mode,
* false if it is not.
*/
public boolean isPartyGame ();
/** Party game constant indicating that this game, while it does
* implement PartyGameConfig, is not currently being played in party
* mode. */
public static final byte NOT_PARTY_GAME = 0;
/** Party game constant indicating that we're in a party game in which
* players must sit at an available seat to play, otherwise they're
* an observer. */
public static final byte SEATED_PARTY_GAME = 1;
/** Party game constant indicating that everyone in the game place is
* a "player", meaning that they do not need to claim a seat to play. */
public static final byte FREE_FOR_ALL_PARTY_GAME = 2;
/**
* Configures this game config as a party game or not.
* Get the type of party game being played.
*/
public void setPartyGame (boolean isPartyGame);
public byte getPartyGameType ();
}
@@ -106,6 +106,16 @@ public class GameManager extends PlaceManager
return _gameconfig;
}
/**
* Used to determine if this game is a party game.
*/
public boolean isPartyGame ()
{
return (_gameconfig instanceof PartyGameConfig) &&
(((PartyGameConfig)_gameconfig).getPartyGameType() !=
PartyGameConfig.NOT_PARTY_GAME);
}
/**
* Adds the given player to the game at the first available player
* index. This should only be called before the game is started, and
@@ -1200,15 +1210,6 @@ public class GameManager extends PlaceManager
protected GameAI _ai;
}
/**
* Used to determine if this game is a party game.
*/
protected boolean isPartyGame ()
{
return ((_gameconfig instanceof PartyGameConfig) &&
((PartyGameConfig)_gameconfig).isPartyGame());
}
/** A reference to our game config. */
protected GameConfig _gameconfig;
@@ -113,8 +113,7 @@ public class TableManager
// stick the creator into the first non-AI position
int cpos = (config.ais == null) ? 0 : config.ais.length;
String error =
table.setOccupant(cpos, creator.getVisibleName(), creator.getOid());
String error = table.setOccupant(cpos, creator);
if (error != null) {
Log.warning("Unable to add creator to position zero of " +
"table!? [table=" + table + ", creator=" + creator +
@@ -170,8 +169,7 @@ public class TableManager
}
// request that the user be added to the table at that position
String error = table.setOccupant(
position, joiner.getVisibleName(), joiner.getOid());
String error = table.setOccupant(position, joiner);
// if that failed, report the error
if (error != null) {
throw new InvocationException(error);