Have things to the point where players take turns placing tiles. Whee!

git-svn-id: https://samskivert.googlecode.com/svn/trunk@353 6335cc39-0255-0410-8fd6-9bcaacd3b74c
This commit is contained in:
mdb
2001-10-12 20:34:13 +00:00
parent 2b211cb4b1
commit 6d377584f5
8 changed files with 285 additions and 44 deletions
@@ -1,5 +1,5 @@
//
// $Id: AtlantiBoard.java,v 1.3 2001/10/11 04:08:22 mdb Exp $
// $Id: AtlantiBoard.java,v 1.4 2001/10/12 20:34:13 mdb Exp $
package com.threerings.venison;
@@ -8,15 +8,18 @@ import java.awt.event.*;
import javax.swing.*;
import java.util.Iterator;
import com.samskivert.swing.Controller;
import com.samskivert.swing.util.SwingUtil;
import com.threerings.presents.dobj.DSet;
import com.threerings.venison.Log;
/**
* Displays the tiles that make up the Venison board.
*/
public class VenisonBoard
extends JPanel implements TileCodes
extends JPanel implements TileCodes, VenisonCodes
{
/** The command posted when a tile is placed by the user on the
* board. */
@@ -50,12 +53,32 @@ public class VenisonBoard
*/
public void setTiles (DSet tiles)
{
// grab the new tiles
_tiles = tiles;
// we need to recompute our desired dimensions and then have our
// parent adjust to our changed size
computeDimensions();
// update our display
refreshTiles();
}
/**
* Instructs the board to refresh its display in case changes have
* occurred in the tiles set.
*/
public void refreshTiles ()
{
Log.info("Refreshing tiles " + _tiles + ".");
// recompute our desired dimensions and then have our parent
// adjust to our changed size
if (_tiles != null) {
computeDimensions();
}
// we may need to revalidate if our dimensions changed
revalidate();
// we also have to repaint in case our dimensions didn't change
repaint();
}
/**
@@ -67,12 +90,18 @@ public class VenisonBoard
* <code>TILE_PLACED</code> command will be dispatched to the
* controller in scope. The coordinates and orientation of the tile
* will have been set to the values specified by the user.
*
* @param tile the new tile to be placed or null if no tile is to
* currently be placed.
*/
public void setTileToBePlaced (VenisonTile tile)
{
_placingTile = tile;
// update our internal state based on this new placing tile
updatePlacingInfo(true);
if (_placingTile != null) {
updatePlacingInfo(true);
}
// and repaint
repaint();
}
@@ -95,10 +124,12 @@ public class VenisonBoard
g.translate(_tx, _ty);
// iterate over our tiles, painting each of them
Iterator iter = _tiles.elements();
while (iter.hasNext()) {
VenisonTile tile = (VenisonTile)iter.next();
tile.paint(g, _origX, _origY);
if (_tiles != null) {
Iterator iter = _tiles.elements();
while (iter.hasNext()) {
VenisonTile tile = (VenisonTile)iter.next();
tile.paint(g, _origX, _origY);
}
}
// if we have a placing tile, draw that one as well
@@ -135,9 +166,18 @@ public class VenisonBoard
/** Called by our adapter when the mouse is clicked. */
protected void mouseClicked (MouseEvent evt)
{
// if we have a placing tile, we want to dispatch a command
// letting the controller know that the user placed it
if (_placingTile != null) {
// if we have a placing tile and it's in a valid position, we want
// to dispatch an action letting the controller know that the user
// placed it
if (_placingTile != null && _validPlacement) {
// clear out the placing tile
_placingTile = null;
// post the action
Controller.postAction(this, TILE_PLACED);
// and repaint
repaint();
}
}
@@ -256,18 +296,20 @@ public class VenisonBoard
int minX = 0, minY = 0;
// figure out what our boundaries are
Iterator iter = _tiles.elements();
while (iter.hasNext()) {
VenisonTile tile = (VenisonTile)iter.next();
if (tile.x > maxX) {
maxX = tile.x;
} else if (tile.x < minX) {
minX = tile.x;
}
if (tile.y > maxY) {
maxY = tile.y;
} else if (tile.y < minY) {
minY = tile.y;
if (_tiles != null) {
Iterator iter = _tiles.elements();
while (iter.hasNext()) {
VenisonTile tile = (VenisonTile)iter.next();
if (tile.x > maxX) {
maxX = tile.x;
} else if (tile.x < minX) {
minX = tile.x;
}
if (tile.y > maxY) {
maxY = tile.y;
} else if (tile.y < minY) {
minY = tile.y;
}
}
}
@@ -3,8 +3,17 @@
package com.threerings.venison;
import java.awt.event.ActionEvent;
import com.threerings.presents.dobj.AttributeChangedEvent;
import com.threerings.presents.dobj.DSet;
import com.threerings.presents.dobj.MessageEvent;
import com.threerings.crowd.data.BodyObject;
import com.threerings.crowd.data.PlaceObject;
import com.threerings.crowd.client.PlaceView;
import com.threerings.parlor.client.GameController;
import com.threerings.parlor.turn.TurnGameController;
import com.threerings.parlor.util.ParlorContext;
import com.threerings.venison.Log;
@@ -13,17 +22,87 @@ import com.threerings.venison.Log;
* The main coordinator of user interface activities on the client-side of
* the Venison game.
*/
public class VenisonController extends GameController
public class VenisonController
extends TurnGameController implements VenisonCodes
{
// documentation inherited
protected void didInit ()
{
super.didInit();
// get a handle on our body object
_self = (BodyObject)_ctx.getClient().getClientObject();
}
// documentation inherited
protected PlaceView createPlaceView ()
{
return new VenisonPanel(_ctx);
_panel = new VenisonPanel(_ctx, this);
return _panel;
}
protected void gameDidStart ()
// documentation inherited
public void willEnterPlace (PlaceObject plobj)
{
super.gameDidStart();
super.willEnterPlace(plobj);
Log.info("Venison game did start.");
// get a casted reference to our game object
_venobj = (VenisonObject)plobj;
}
// documentation inherited
protected void turnDidChange (String turnHolder)
{
super.turnDidChange(turnHolder);
// if it's our turn, set the tile to be placed. otherwise clear it
// out
if (turnHolder.equals(_self.username)) {
Log.info("Setting tile to be placed: " + _venobj.currentTile);
_panel.board.setTileToBePlaced(_venobj.currentTile);
}
// and refresh the tiles
_panel.board.refreshTiles();
}
// documentation inherited
public void attributeChanged (AttributeChangedEvent event)
{
super.attributeChanged(event);
// handle the setting of the board state
if (event.getName().equals(VenisonObject.TILES)) {
_panel.board.setTiles(_venobj.tiles);
}
}
// documentation inherited
public boolean handleAction (ActionEvent action)
{
if (action.getActionCommand().equals(TILE_PLACED)) {
// the user placed the tile into a valid location. the board
// will have updated the position and orientation information
// in the tile object accordingly, so we simply submit our
// move to the server
Object[] args = new Object[] { _venobj.currentTile };
MessageEvent mevt = new MessageEvent(
_venobj.getOid(), PLACE_TILE_REQUEST, args);
_ctx.getDObjectManager().postEvent(mevt);
} else {
return super.handleAction(action);
}
return true;
}
/** A reference to our game panel. */
protected VenisonPanel _panel;
/** A reference to our game panel. */
protected VenisonObject _venobj;
/** A reference to our body object. */
protected BodyObject _self;
}
@@ -6,6 +6,9 @@ package com.threerings.venison;
import java.awt.BorderLayout;
import javax.swing.*;
import com.samskivert.swing.Controller;
import com.samskivert.swing.ControllerProvider;
import com.threerings.crowd.data.PlaceObject;
import com.threerings.crowd.client.PlaceView;
@@ -15,14 +18,22 @@ import com.threerings.parlor.util.ParlorContext;
* The top-level user interface component for the Venison game display.
*/
public class VenisonPanel
extends JPanel implements PlaceView
extends JPanel implements PlaceView, ControllerProvider
{
/** A reference to the board that is accessible to the controller. */
public VenisonBoard board;
/**
* Constructs a new Venison game display.
*/
public VenisonPanel (ParlorContext ctx)
public VenisonPanel (ParlorContext ctx, VenisonController controller)
{
add(new JLabel("Venison panel"), BorderLayout.CENTER);
// add the board
board = new VenisonBoard();
add(board, BorderLayout.CENTER);
// we'll need this later to provide it
_controller = controller;
}
// documentation inherited
@@ -36,4 +47,14 @@ public class VenisonPanel
{
Log.info("Panel left place.");
}
// documentation inherited
public Controller getController ()
{
return _controller;
}
/** A reference to our controller that we need to implement the {@link
* ControllerProvider} interface. */
protected VenisonController _controller;
}
@@ -0,0 +1,22 @@
//
// $Id: AtlantiCodes.java,v 1.1 2001/10/12 20:34:13 mdb Exp $
package com.threerings.venison;
/**
* Constants used by the Venison game code.
*/
public interface VenisonCodes
{
/** The name of the command posted by the {@link VenisonBoard} when
* the user places a tile into a valid position. */
public static final String TILE_PLACED = "tile_placed";
/** The message submitted by the client to the server when they have
* chosen where they wish to place their tile. */
public static final String PLACE_TILE_REQUEST = "place_tile";
/** The message submitted by the client to the server when they have
* chosen where they wish to place their piecen. */
public static final String PLACE_PIECEN_REQUEST = "place_piecen";
}
@@ -1,9 +1,9 @@
//
// $Id: AtlantiConfig.java,v 1.1 2001/10/09 20:27:35 mdb Exp $
// $Id: AtlantiConfig.java,v 1.2 2001/10/12 20:34:13 mdb Exp $
package com.threerings.venison;
import com.threerings.parlor.data.GameConfig;
import com.threerings.parlor.game.GameConfig;
public class VenisonConfig extends GameConfig
{
@@ -1,24 +1,30 @@
//
// $Id: AtlantiObject.java,v 1.3 2001/10/11 04:08:22 mdb Exp $
// $Id: AtlantiObject.java,v 1.4 2001/10/12 20:34:13 mdb Exp $
package com.threerings.venison;
import com.threerings.presents.dobj.DSet;
import com.threerings.parlor.data.GameObject;
import com.threerings.parlor.turn.TurnGameObject;
/**
* The distributed object used to maintain state for the Venison game.
*/
public class VenisonObject extends GameObject
public class VenisonObject extends TurnGameObject
{
/** The field name of the <code>tiles</code> field. */
public static final String TILES = "tiles";
/** The field name of the <code>currentTile</code> field. */
public static final String CURRENT_TILE = "currentTile";
/** A set containing all of the tiles that are in play in this
* game. */
public DSet tiles = new DSet(VenisonTile.class);
/** The tile being placed by the current turn holder. This value is
* only valid while it is someone's turn. */
public VenisonTile currentTile = new VenisonTile();
/**
* Requests that the <code>tiles</code> field be set to the specified
* value.
@@ -55,10 +61,20 @@ public class VenisonObject extends GameObject
requestElementUpdate(TILES, elem);
}
/**
* Requests that the <code>currentTile</code> field be set to the
* specified value.
*/
public void setCurrentTile (VenisonTile value)
{
requestAttributeChange(CURRENT_TILE, value);
}
// documentation inherited
protected void toString (StringBuffer buf)
{
super.toString(buf);
buf.append(", tiles=").append(tiles);
buf.append(", currentTile=").append(currentTile);
}
}
@@ -1,5 +1,5 @@
//
// $Id: AtlantiTile.java,v 1.3 2001/10/11 04:08:22 mdb Exp $
// $Id: AtlantiTile.java,v 1.4 2001/10/12 20:34:13 mdb Exp $
package com.threerings.venison;
@@ -154,4 +154,11 @@ public class VenisonTile
x = in.readInt();
y = in.readInt();
}
public String toString ()
{
return "[type=" + type + ", shield=" + hasShield +
", orient=" + ORIENT_NAMES[orientation] +
", pos=" + x + "/" + y + "]";
}
}
@@ -1,16 +1,21 @@
//
// $Id: AtlantiManager.java,v 1.4 2001/10/11 04:08:22 mdb Exp $
// $Id: AtlantiManager.java,v 1.5 2001/10/12 20:34:13 mdb Exp $
package com.threerings.venison;
import java.util.Collections;
import java.util.List;
import com.threerings.presents.dobj.DSet;
import com.threerings.parlor.server.GameManager;
import com.threerings.presents.dobj.MessageEvent;
import com.threerings.parlor.turn.TurnGameManager;
/**
* The main coordinator of the Venison game on the server side.
*/
public class VenisonManager
extends GameManager
extends TurnGameManager implements VenisonCodes
{
// documentation inherited
protected Class getPlaceObjectClass ()
@@ -18,6 +23,17 @@ public class VenisonManager
return VenisonObject.class;
}
// documentation inherited
protected void didInit ()
{
super.didInit();
// register our message handlers
registerMessageHandler(PLACE_TILE_REQUEST, new PlaceTileHandler());
registerMessageHandler(
PLACE_PIECEN_REQUEST, new PlacePiecenHandler());
}
// documentation inherited
protected void didStartup ()
{
@@ -35,10 +51,48 @@ public class VenisonManager
{
super.gameWillStart();
// generate a shuffled tile list
_tiles = TileUtil.getStandardTileSet();
Collections.shuffle(_tiles);
// clear out the tile set
_venobj.setTiles(new DSet(VenisonTile.class));
_venobj.addToTiles(TileUtil.STARTING_TILE);
}
protected void turnWillStart ()
{
// let the players know what the next tile is that should be
// played
VenisonTile tile = (VenisonTile)_tiles.remove(0);
_venobj.setCurrentTile(tile);
}
/** Handles place tile requests. */
protected class PlaceTileHandler implements MessageHandler
{
public void handleEvent (MessageEvent event)
{
VenisonTile tile = (VenisonTile)event.getArgs()[0];
// don't do no checking at present
_venobj.addToTiles(tile);
// and since they placed their tile, we end the turn
endTurn();
}
}
/** Handles place piecen requests. */
protected class PlacePiecenHandler implements MessageHandler
{
public void handleEvent (MessageEvent event)
{
}
}
/** A casted reference to our Venison game object. */
protected VenisonObject _venobj;
/** The (shuffled) list of tiles remaining to be played in this
* game. */
protected List _tiles;
}