Back-end facilities for table matchmaking.
git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@508 542714f4-19e9-0310-aa3c-eee0fc999fb1
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
//
|
||||
// $Id: Table.java,v 1.1 2001/10/19 02:04:29 mdb Exp $
|
||||
// $Id: Table.java,v 1.2 2001/10/19 22:02:36 mdb Exp $
|
||||
|
||||
package com.threerings.parlor.data;
|
||||
|
||||
@@ -12,17 +12,27 @@ import com.samskivert.util.StringUtil;
|
||||
import com.threerings.presents.dobj.DSet;
|
||||
import com.threerings.presents.dobj.io.ValueMarshaller;
|
||||
|
||||
import com.threerings.parlor.client.ParlorCodes;
|
||||
import com.threerings.parlor.game.GameConfig;
|
||||
|
||||
/**
|
||||
* This class represents a table that is being used to matchmake a game by
|
||||
* the Parlor services.
|
||||
*/
|
||||
public class Table implements DSet.Element
|
||||
public class Table
|
||||
implements DSet.Element, ParlorCodes
|
||||
{
|
||||
/** The unique identifier for this table. */
|
||||
public Integer tableId;
|
||||
|
||||
/** The object id of the lobby object with which this table is
|
||||
* associated. */
|
||||
public int lobbyOid;
|
||||
|
||||
/** The oid of the game that was created from this table or -1 if the
|
||||
* table is still in matchmaking mode. */
|
||||
public int gameOid;
|
||||
|
||||
/** An array of the usernames of the occupants of this table (some
|
||||
* slots may not be filled. */
|
||||
public String[] occupants;
|
||||
@@ -31,6 +41,39 @@ public class Table implements DSet.Element
|
||||
* instance will also implement {@link TableConfig}. */
|
||||
public GameConfig config;
|
||||
|
||||
/**
|
||||
* Creates a new table instance, and assigns it the next monotonically
|
||||
* increasing table id. The supplied config instance must implement
|
||||
* {@link TableConfig} or a {@link ClassCastException} will be thrown.
|
||||
*
|
||||
* @param lobbyOid the object id of the lobby in which this table is
|
||||
* to live.
|
||||
* @param config the configuration of the game being matchmade by this
|
||||
* table.
|
||||
*/
|
||||
public Table (int lobbyOid, GameConfig config)
|
||||
{
|
||||
// assign a unique table id
|
||||
tableId = new Integer(++_tableIdCounter);
|
||||
|
||||
// keep track of our lobby oid
|
||||
this.lobbyOid = lobbyOid;
|
||||
|
||||
// keep a casted reference around
|
||||
_tconfig = (TableConfig)config;
|
||||
this.config = config;
|
||||
|
||||
// make room for the maximum number of players
|
||||
occupants = new String[_tconfig.getMaximumPlayers()];
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructs a blank table instance, suitable for unserialization.
|
||||
*/
|
||||
public Table ()
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* A convenience function for accessing the table id as an int.
|
||||
*/
|
||||
@@ -39,6 +82,75 @@ public class Table implements DSet.Element
|
||||
return tableId.intValue();
|
||||
}
|
||||
|
||||
/**
|
||||
* Once a table is ready to play (see {@link #readyToPlay}), the
|
||||
* players array can be fetched using this method. It will return an
|
||||
* array containing the usernames of all of the players in the game,
|
||||
* sized properly and with each player in the appropriate position.
|
||||
*/
|
||||
public String[] getPlayers ()
|
||||
{
|
||||
// count up the players
|
||||
int pcount = 0;
|
||||
for (int i = 0; i < occupants.length; i++) {
|
||||
if (!StringUtil.blank(occupants[i])) {
|
||||
pcount++;
|
||||
}
|
||||
}
|
||||
|
||||
// create and populate the players array
|
||||
String[] players = new String[pcount];
|
||||
pcount = 0;
|
||||
for (int i = 0; i < occupants.length; i++) {
|
||||
if (!StringUtil.blank(occupants[i])) {
|
||||
players[pcount++] = occupants[i];
|
||||
}
|
||||
}
|
||||
|
||||
return players;
|
||||
}
|
||||
|
||||
/**
|
||||
* Requests to seat the specified user at the specified position in
|
||||
* this table.
|
||||
*
|
||||
* @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, String username)
|
||||
{
|
||||
// find out how many positions we have for occupation
|
||||
int maxpos = _tconfig.getDesiredPlayers();
|
||||
// if there is no desired number of players, use the max
|
||||
if (maxpos == -1) {
|
||||
maxpos = _tconfig.getMaximumPlayers();
|
||||
}
|
||||
|
||||
// make sure the requested position is a valid one
|
||||
if (position >= maxpos) {
|
||||
return INVALID_TABLE_POSITION;
|
||||
}
|
||||
|
||||
// make sure the requested position is not already occupied
|
||||
if (!StringUtil.blank(occupants[position])) {
|
||||
return TABLE_POSITION_OCCUPIED;
|
||||
}
|
||||
|
||||
// otherwise all is well, stick 'em in
|
||||
occupants[position] = username;
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns true if this table has occupants in all of the desired
|
||||
* positions and should be started.
|
||||
*/
|
||||
public boolean readyToStart ()
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
// documentation inherited
|
||||
public Object getKey ()
|
||||
{
|
||||
@@ -50,6 +162,8 @@ public class Table implements DSet.Element
|
||||
throws IOException
|
||||
{
|
||||
out.writeInt(getTableId());
|
||||
out.writeInt(lobbyOid);
|
||||
out.writeInt(gameOid);
|
||||
ValueMarshaller.writeTo(out, occupants);
|
||||
ValueMarshaller.writeTo(out, config);
|
||||
}
|
||||
@@ -59,8 +173,11 @@ public class Table implements DSet.Element
|
||||
throws IOException
|
||||
{
|
||||
tableId = new Integer(in.readInt());
|
||||
gameOid = in.readInt();
|
||||
lobbyOid = in.readInt();
|
||||
occupants = (String[])ValueMarshaller.readFrom(in);
|
||||
config = (GameConfig)ValueMarshaller.readFrom(in);
|
||||
_tconfig = (TableConfig)config;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -69,7 +186,15 @@ public class Table implements DSet.Element
|
||||
public String toString ()
|
||||
{
|
||||
return "[tableId=" + tableId +
|
||||
", lobbyOid=" + lobbyOid +
|
||||
", gameOid=" + gameOid +
|
||||
", occupants=" + StringUtil.toString(occupants) +
|
||||
", config=" + config + "]";
|
||||
}
|
||||
|
||||
/** A casted reference of our game config object. */
|
||||
protected TableConfig _tconfig;
|
||||
|
||||
/** A counter for assigning table ids. */
|
||||
protected static int _tableIdCounter = 0;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user