- 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:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user