From 7f98cac7a88f7b07a7718028d069100f977de6b2 Mon Sep 17 00:00:00 2001 From: Ray Greenwell Date: Fri, 13 Jan 2006 01:52:36 +0000 Subject: [PATCH] - 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 --- .../com/threerings/parlor/data/Table.java | 72 ++++++++++++++----- .../parlor/game/client/GameController.java | 5 +- .../parlor/game/data/PartyGameConfig.java | 25 +++++-- .../parlor/game/server/GameManager.java | 19 ++--- .../parlor/server/TableManager.java | 6 +- 5 files changed, 86 insertions(+), 41 deletions(-) diff --git a/src/java/com/threerings/parlor/data/Table.java b/src/java/com/threerings/parlor/data/Table.java index a1bc709df..33fd54e17 100644 --- a/src/java/com/threerings/parlor/data/Table.java +++ b/src/java/com/threerings/parlor/data/Table.java @@ -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(); } /** diff --git a/src/java/com/threerings/parlor/game/client/GameController.java b/src/java/com/threerings/parlor/game/client/GameController.java index 51506472f..a7231b56c 100644 --- a/src/java/com/threerings/parlor/game/client/GameController.java +++ b/src/java/com/threerings/parlor/game/client/GameController.java @@ -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. */ diff --git a/src/java/com/threerings/parlor/game/data/PartyGameConfig.java b/src/java/com/threerings/parlor/game/data/PartyGameConfig.java index 5659fb6c1..10debf328 100644 --- a/src/java/com/threerings/parlor/game/data/PartyGameConfig.java +++ b/src/java/com/threerings/parlor/game/data/PartyGameConfig.java @@ -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 (); } diff --git a/src/java/com/threerings/parlor/game/server/GameManager.java b/src/java/com/threerings/parlor/game/server/GameManager.java index 009f9b51b..56d0ba450 100644 --- a/src/java/com/threerings/parlor/game/server/GameManager.java +++ b/src/java/com/threerings/parlor/game/server/GameManager.java @@ -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; diff --git a/src/java/com/threerings/parlor/server/TableManager.java b/src/java/com/threerings/parlor/server/TableManager.java index beeaf9432..3ed2fbab2 100644 --- a/src/java/com/threerings/parlor/server/TableManager.java +++ b/src/java/com/threerings/parlor/server/TableManager.java @@ -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);