Class Obscurable

All Implemented Interfaces:
PropertyNameSource, PropertySource, EditablePiece, GamePiece, PropertyExporter, StateMergeable, TranslatablePiece, PersistentPropertyContainer, Auditable, ImageSearchTarget, SearchTarget

public class Obscurable extends Decorator implements TranslatablePiece
d/b/a "Mask" Trait that lets some traits of a piece be hidden "from some players, some of the time".
  • Field Details

    • ID

      public static final String ID
      See Also:
    • INSET

      protected static final char INSET
      See Also:
    • BACKGROUND

      protected static final char BACKGROUND
      See Also:
    • PEEK

      protected static final char PEEK
      See Also:
    • IMAGE

      protected static final char IMAGE
      See Also:
    • INSET2

      protected static final char INSET2
      See Also:
    • DEFAULT_PEEK_COMMAND

      protected static final String DEFAULT_PEEK_COMMAND
    • obscureKey

      protected char obscureKey
    • keyCommand

      protected NamedKeyStroke keyCommand
    • peekKey

      protected NamedKeyStroke peekKey
    • dealKey

      protected NamedKeyStroke dealKey
    • imageName

      protected String imageName
    • obscuredToOthersImage

      protected String obscuredToOthersImage
    • obscuredBy

      protected String obscuredBy
    • obscuredOptions

      protected ObscurableOptions obscuredOptions
    • hideCommand

      protected String hideCommand
    • peekCommand

      protected String peekCommand
    • obscuredToMeView

      protected GamePiece obscuredToMeView
    • obscuredToOthersView

      protected GamePiece obscuredToOthersView
    • peeking

      protected boolean peeking
    • displayStyle

      protected char displayStyle
    • autoPeekRollover

      protected boolean autoPeekRollover
    • maskName

      protected String maskName
    • access

      protected PieceAccess access
    • dealExpression

      protected String dealExpression
    • commandsWithPeek

      protected KeyCommand[] commandsWithPeek
    • commandsWithoutPeek

      protected KeyCommand[] commandsWithoutPeek
    • hide

      protected KeyCommand hide
    • peek

      protected KeyCommand peek
    • deal

      protected KeyCommand deal
    • description

      protected String description
  • Constructor Details

    • Obscurable

      public Obscurable()
    • Obscurable

      public Obscurable(String type, GamePiece d)
  • Method Details

    • mySetState

      public void mySetState(String in)
      Description copied from class: Decorator
      Sets the state of this-trait-only (inverse of Decorator.myGetState()). 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.
      Specified by:
      mySetState in class Decorator
      Parameters:
      in - New state information serialized in string form, ready to be passed to a SequenceEncoder#decode.
    • mySetType

      public void mySetType(String in)
      Description copied from interface: EditablePiece
      Sets the information for this piece. See Decorator.myGetType()
      Specified by:
      mySetType in interface EditablePiece
      Parameters:
      in - a serialized configuration string to set the "type information" of this piece, which is information that doesn't change during the course of a single game (e.g. Image Files, Context Menu strings, etc). Typically ready to be processed e.g. by SequenceEncoder.decode()
    • myGetType

      public String myGetType()
      Description copied from class: Decorator
      The "type information" of a piece or trait is information that does not change during the course of a game. Image file names, context menu strings, etc., all should be reflected in the type. The type information is returned serialized string form, ready to be decoded by a SequenceEncoder#decode.
      Specified by:
      myGetType in class Decorator
      Returns:
      the type information of this trait alone
      See Also:
    • myGetState

      public String myGetState()
      Description copied from class: Decorator
      The "state information" is "game state" 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.
      Specified by:
      myGetState in class Decorator
      Returns:
      the game state information of this trait alone
      See Also:
    • boundingBox

      public Rectangle boundingBox()
      Specified by:
      boundingBox in interface GamePiece
      Returns:
      The area which this GamePiece occupies when drawn at the point (0,0)
    • isAutoPeeking

      public boolean isAutoPeeking()
    • getShape

      public Shape getShape()
      Specified by:
      getShape in interface GamePiece
      Returns:
      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 GamePiece.boundingBox(), it assumes the position is (0,0) -- which to be clear is normally aligned with the CENTER of the piece image -- and must be translated to the actual location where the piece is being drawn. For most ordinary pieces, the shape returned here will simply be equivalent to the bounding box, but see NonRectangular.
    • obscuredToMe

      public boolean obscuredToMe()
    • obscuredToOthers

      public boolean obscuredToOthers()
    • setProperty

      public void setProperty(Object key, Object val)
      Description copied from class: Decorator
      Within a Trait/Decorator, the default behavior when setting a property is to handle changing our own inner/outer links directly, to cache the selection state (while also passing it inward), and to simply pass every other property change request inward. A Trait with its own properties to maintain would intercept and process those requests, while sending the rest inward to the next member of the piece.

      Properties can be associated with a piece -- many may be game-specific, but others are standard, such as the LocationName property exposed by BasicPiece -- and can be set through this interface. The properties may or may not need to be encoded in the piece's Decorator.getState() method. Properties include the value of e.g. Marker Traits, DynamicProperty Traits, and so forth.

      NOTE: Not all properties maintained by traits can be "set" by setProperty, even though they can be read by getProperty -- they may be "read only" for instance. You will need to check the code for individual traits to see what they support in this regard.

      NOTE: Properties outside the piece CANNOT be set by this method (e.g. Global Properties), even though they can be read by Decorator.getProperty(java.lang.Object) -- in this the two methods are not perfect mirrors.
      Specified by:
      setProperty in interface GamePiece
      Overrides:
      setProperty in class Decorator
      Parameters:
      key - String key of property to be changed
      val - Object containing new value of the property
    • getProperty

      public Object getProperty(Object key)
      Description copied from class: Decorator
      Properties can be associated with a piece -- many may be game-specific, but others are standard, such as the LocationName property exposed by BasicPiece -- and can be read through this interface. The properties may or may not need to be encoded in the piece's Decorator.getState() method. Properties include the value of e.g. Marker Traits, DynamicProperty Traits, and so forth. Furthermore they include the values of any visible "Global Property" in a Vassal module, whether at the module level, map level, or zone level -- but these "higher level" properties, coming from "outside the piece", CANNOT be written to by the Decorator.setProperty(java.lang.Object, java.lang.Object) method even though they can be read by this method -- in this sense the two methods are NOT perfect mirrors.

      Within a Trait/Decorator, default behavior is to process some requests directly (e.g. requests for our "inner" or "outer" link), process our *part* of certain other requests (e.g. request for our game state information we supply state information for this trait and then append any information obtained from passing the same request inward), and then for any other requests that we cannot process we simply pass the request to the next trait/member inward.

      When using this interface a piece's own properties are preferred to those of "Global Properties", and those in turn are searched Zone-first then Map, then Module.

      This method implements the PropertySource interface, which allows Global Properties to be read by other types of object than GamePieces.
      Specified by:
      getProperty in interface GamePiece
      Specified by:
      getProperty in interface PropertySource
      Overrides:
      getProperty in class Decorator
      Parameters:
      key - String key of property to be returned
      Returns:
      Object containing new value of the specified property
    • getLocalizedProperty

      public Object getLocalizedProperty(Object key)
      Description copied from class: Decorator
      Returns a localized translation of the specified property value, if available. Otherwise returns the non-localized version. See Decorator.getProperty(java.lang.Object).
      Specified by:
      getLocalizedProperty in interface PropertySource
      Overrides:
      getLocalizedProperty in class Decorator
      Parameters:
      key - String key of property to be returned
      Returns:
      Object containing localized text of the specified property, if available, otherwise non-localized value
    • draw

      public void draw(Graphics g, int x, int y, Component obs, double zoom)
      Description copied from interface: GamePiece
      Draw this GamePiece
      Specified by:
      draw in interface GamePiece
      Parameters:
      g - target Graphics object
      x - x-location of the center of the piece
      y - y-location of the center of the piece
      obs - the Component on which this piece is being drawn
      zoom - the scaling factor.
    • drawObscuredToMe

      protected void drawObscuredToMe(Graphics g, int x, int y, Component obs, double zoom)
    • drawObscuredToOthers

      protected void drawObscuredToOthers(Graphics g, int x, int y, Component obs, double zoom)
    • isPeeking

      public boolean isPeeking()
      Return true if the piece is currently being "peeked at"
    • bBoxObscuredToMe

      protected Rectangle bBoxObscuredToMe()
    • bBoxObscuredToOthers

      protected Rectangle bBoxObscuredToOthers()
    • getLocalizedName

      public String getLocalizedName()
      Description copied from interface: GamePiece
      And the translated name for this piece
      Specified by:
      getLocalizedName in interface GamePiece
      Overrides:
      getLocalizedName in class Decorator
      Returns:
      the translated name for this piece. Most pieces do not have translatable elements, so just return the standard name
    • getName

      public String getName()
      Description copied from interface: GamePiece
      The plain English name for this piece
      Specified by:
      getName in interface GamePiece
    • getName

      protected String getName(String maskedName, boolean localized)
    • getKeyCommands

      public KeyCommand[] getKeyCommands()
      Overrides:
      getKeyCommands in class Decorator
      Returns:
      The set of key commands that will populate the piece's right-click menu. The key commands are accessible through the Properties.KEY_COMMANDS property. The commands for a Trait/Decorator are a composite of Decorator.myGetKeyCommands() and the commands of its inner piece member(s), so requesting this information of the "outermost" Trait/Decorator of a piece will produce the complete set of Key Commands for the entire logical game piece. See also: Decorator.myGetKeyCommands(), which returns the commands for this Trait/Decorator only.
    • myGetKeyCommands

      public KeyCommand[] myGetKeyCommands()
      Specified by:
      myGetKeyCommands in class Decorator
      Returns:
      the key commands for this trait alone
      See Also:
    • isMaskable

      public boolean isMaskable()
      Return true if this piece can be masked/unmasked by the current player
    • keyEvent

      public Command keyEvent(KeyStroke stroke)
      Description copied from class: Decorator
      The primary way for the piece or trait to receive events. Appends the command returned by Decorator.myKeyEvent(javax.swing.KeyStroke) with the command returned by the inner piece member's GamePiece.keyEvent(javax.swing.KeyStroke) method. KeyStroke events are forwarded to this method if they are received while the piece is selected (or as the result of e.g. a Global Key Command being sent to the piece). The class implementing GamePiece can respond in any way it likes. Actual key presses by the player, selected items from the right-click Context Menu, keystrokes "applied on move" by a Map that the piece has just moved on, and Global Key Commands all send KeyStrokes (and NamedKeyStrokes) which are passed to pieces and traits through this interface.
      Specified by:
      keyEvent in interface GamePiece
      Overrides:
      keyEvent in class Decorator
      Parameters:
      stroke - KeyStroke to apply (note that although they are passed as KeyStroke objects, they may be NamedKeyStroke objects)
      Returns:
      a Command that, when executed, will make all changes to the game state (maps, pieces, other pieces, etc) to duplicate what the Trait/Decorator plus any inner piece members did in response to this event, on another machine. Often a ChangePiece command, but for example if this keystroke caused the piece/trait to decide to fire off a Global Key Command, then the Command returned would include the entire results of that, appended as subcommands. Returns null if the keystroke did not produce an effect.
      See Also:
    • myKeyEvent

      public Command myKeyEvent(KeyStroke stroke)
      Description copied from class: Decorator
      The response of this trait alone to the given KeyStroke or the virtual keystroke of a NamedKeyStroke. NamedKeyStrokes are allocated a unique internal KeyStroke when they are first used in a module, and that KeyStroke is passed up and down the decorator stack to represent them (see NamedKeyStroke.getKeyStroke()).
      Specified by:
      myKeyEvent in class Decorator
      Parameters:
      stroke - KeyStroke to apply (to apply a Named Keystroke send NamedKeyStroke.getKeyStroke()
      Returns:
      Generated Command to reproduce any changes just made to to the game state, or null if no effect
      See Also:
    • getDescription

      public String getDescription()
      Description copied from interface: EditablePiece
      A plain-English description of this type of trait/piece - includes data from fields where appropriate
      Specified by:
      getDescription in interface EditablePiece
    • getBaseDescription

      public String getBaseDescription()
      Description copied from interface: EditablePiece
      Support for a basic-name-only description introduced later, so this default retrofits it from the full description if an explicit one is not defined.
      Specified by:
      getBaseDescription in interface EditablePiece
      Returns:
      name of trait/piece type, w/o additional data
    • getDescriptionField

      public String getDescriptionField()
      Description copied from class: Decorator
      If Decorator contains a description *field*, returns the current contents of it.
      Overrides:
      getDescriptionField in class Decorator
      Returns:
      contents of "description" field, if it exists.
    • getHelpFile

      public HelpFile getHelpFile()
      Specified by:
      getHelpFile in interface EditablePiece
      Returns:
      the help file for this trait
    • getEditor

      public PieceEditor getEditor()
      Specified by:
      getEditor in interface EditablePiece
      Overrides:
      getEditor in class Decorator
      Returns:
      the configurer for this trait - the dialog which allows the editing the piece's type information. Default configurer is a SimplePieceEditor, but many traits will want to provide custom versions.
    • getI18nData

      public PieceI18nData getI18nData()
      Description copied from class: Decorator
      Return Internationalization (I18n) data for this piece
      Specified by:
      getI18nData in interface TranslatablePiece
      Overrides:
      getI18nData in class Decorator
      Returns:
      I18n data, used to hold translations of strings
    • getPropertyNames

      public List<String> getPropertyNames()
      Return Property names exposed by this trait
      Specified by:
      getPropertyNames in interface PropertyNameSource
      Overrides:
      getPropertyNames in class Decorator
      Returns:
      List of property names "exposed" by this piece -- that are available to other Traits and components to read. Default behavior for a Trait is not to expose any properties, but Traits which should expose some (e.g. DynamicProperty or Marker) would provide an array of the property names here.
    • testEquals

      public boolean testEquals(Object o)
      Description copied from class: Decorator
      Test if this Decorator's Class, Type and State are equal to another trait. Implementations of this method should compare the individual values of the fields that make up the Decorators Type and State. Implementations should NOT compare the values returned by myGetType() or myGetState(). This method is intended to be used by Unit Tests to verify that a trait is unchanged after going through a process such as serialization/deserialization.
      Overrides:
      testEquals in class Decorator
      Parameters:
      o - Object to compare this Decorator to
      Returns:
      true if the Class, type and state all match
    • getNamedKeyStrokeList

      public List<NamedKeyStroke> getNamedKeyStrokeList()
      Description copied from class: Decorator
      Specified by:
      getNamedKeyStrokeList in interface SearchTarget
      Overrides:
      getNamedKeyStrokeList in class Decorator
      Returns:
      a list of any Named KeyStrokes referenced in the Decorator, if any (for search)
    • getMenuTextList

      public List<String> getMenuTextList()
      Description copied from class: Decorator
      Specified by:
      getMenuTextList in interface SearchTarget
      Overrides:
      getMenuTextList in class Decorator
      Returns:
      a list of any Menu Text strings referenced in the Decorator, if any (for search)
    • getFormattedStringList

      public List<String> getFormattedStringList()
      Description copied from class: Decorator
      Specified by:
      getFormattedStringList in interface SearchTarget
      Overrides:
      getFormattedStringList in class Decorator
      Returns:
      a list of any Message Format strings referenced in the Decorator, if any (for search)
    • addLocalImageNames

      public void addLocalImageNames(Collection<String> s)
      Description copied from class: AbstractImageFinder
      Classes extending AbstractImageFinder should override this method in order to add the names of any image files they use to the collection.
      Specified by:
      addLocalImageNames in interface ImageSearchTarget
      Overrides:
      addLocalImageNames in class AbstractImageFinder
      Parameters:
      s - Collection to add image names to