/*
* $Id$
*
* Copyright (c) 2000-2003 by Rodney Kinney
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License (LGPL) as published by the Free Software Foundation.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, copies are available
* at http://www.opensource.org.
*/
package VASSAL.counters;
import java.awt.Component;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.Shape;
import javax.swing.KeyStroke;
import VASSAL.build.module.BasicCommandEncoder;
import VASSAL.build.module.GameState;
import VASSAL.build.module.Map;
import VASSAL.build.module.properties.PropertySource;
import VASSAL.command.ChangePiece;
import VASSAL.command.Command;
/**
* Basic class for representing a physical component of the game
*/
public interface GamePiece extends PropertySource {
/** Each GamePiece belongs to a single {@link Map} */
public void setMap(Map map);
public Map getMap();
/**
* Draw this GamePiece
* @param g
* @param x x-location of the center of the piece
* @param y y-location of the center of the piece
* @param obs the Component on which this piece is being drawn
* @param zoom the scaling factor.
*/
public void draw(Graphics g, int x, int y, Component obs, double zoom);
/**
* @return the location of this piece on its owning {@link Map}
*/
public Point getPosition();
public void setPosition(Point p);
/**
* The area which this GamePiece occupies when
* drawn at the point (0,0)
*/
public Rectangle boundingBox();
/**
* The shape of the piece from the user's viewpoint. This defines the area
* in which the user must click to select or move the piece, for example.
* Like {@link #boundingBox}, it assumes the position is (0,0) and must be translated
* to the actual location where the piece is being drawn.
*/
public Shape getShape();
/**
* @return the {@link Stack} to which this piece belongs, or null if it doesn't belong to a stack.
*/
public Stack getParent();
public void setParent(Stack s);
/**
* Keyboard events are forward to this method when a piece is selected
* The GamePiece can respond in any way it likes
*
* @return a {@link Command} that, when executed, will invoke
* the same response. Usually a {@link ChangePiece} command.
*
* @see VASSAL.build.module.map.ForwardToKeyBuffer
*/
public Command keyEvent(KeyStroke stroke);
/** The plain English name for this piece */
public String getName();
/** And the translated name for this piece */
public String getLocalizedName();
/**
* Each GamePiece must have a unique String identifier
* @see GameState#getNewPieceId
*/
public String getId();
public void setId(String id);
/** The type information is information that does not change
* during the course of a game. Image file names, popup menu
* command names, etc., all should be reflected in the type.
* @see BasicCommandEncoder */
public String getType();
/** The state information is information that can change during
* the course of a game. State information is saved when the game
* is saved and is transferred between players on the server. For
* example, the relative order of pieces in a stack is state
* information, but whether the stack is expanded is not */
public String getState();
public void setState(String newState);
/**
* Other properties, possibly game-specific, can be associated with a piece.
* The properties may or may not need to be encoded
* in the piece's {@link #getState} method. */
public void setProperty(Object key, Object val);
public Object getProperty(Object key);
}