Vassal 3.6 Release Notes

This article will give you a quick tour of the new features in VASSAL 3.6, as well as listing some significant player-facing bug fixes.

Major New Features

Folders


Folders

The Editor now supports folders inside of most components that accept “children”. When adding new subcomponents you can also choose to “Add Folder” which will make a folder into which any valid subcomponents of the parent can be placed. In the example shown, folders are used inside of the [Game Prototype Definitions] segment to organize the prototypes.

FolderAdd.png

Drag and Drop

Components in the Editor window can now be “dragged and dropped” from one valid location to another.

Duplicate

You can now duplicate a component in the Editor, which will make a second identical copy of it at the same location in the tree. If you duplicate a folder or a component that has children (subcomponents), then all of the child items will be duplicated as well.

Insert

The Editor now allows you to Insert an item at the currently selected location (as opposed to the traditional Add which adds an item at the bottom of the current list of subcomponents). This can be useful for adding to the middle of a long list of pieces, prototypes, or other components.

Mats & Cargo


Mats & Cargo Example

You can now add a “Mat” trait to a game piece to mark it as a piece that other pieces are placed upon. If those other pieces are marked with a “Mat Cargo” trait, then when you select the Mat the Mat Cargo pieces on it will also become selected–this means e.g. that if you drag the Mat around, then by default all the Mat Cargo pieces will come with it in the appropriate relative positions. Mats & Cargo can also be set to maintain relative facing (i.e. if you rotate the mat the cargo will be rotated as well).

Mat.png

MatCargo.png

Basic Name trait

Basic Name trait in a prototype

You can now define the $BasicName$ property for a piece defined in a prototype by adding the new Basic Name trait – this allows you to safely leave the Basic Piece member completely blank in an individual piece definition (e.g. in a Game Piece Palette, an At Start Stack, or a Place Marker trait or Replace With Other trait). The $BasicName$ property will be filled with the value from the Basic Name trait, ignoring any name (blank or otherwise) in Basic Piece.

Scaling Factor for Layer and Non-Rectangular Traits

Scaling a Layer

Both Layer traits (i.e. images) and Non-Rectangular traits now come with a built-in Scaling Factor field. This allows you to more easily adjust the relative sizes with which your various pieces are drawn, which can be particularly useful when boardgame companies supply source art that is not “in scale” with other parts of the game.

Does Not Stack improvements (DOES stack!)

This piece DOES stack

The “Does Not Stack” trait just got interesting… it can now be told that in fact it DOES stack! This allows the creation of pieces that take advantage of some of Does Not Stack’s other features that have accumulated over the years (such as the ability to ignore the map grid) while retaining the standard VASSAL stacking behavior.

A description field is also provided, and you’ll notice in the editor that the key features of an individual Does Not Stack trait are better summarized in the traits list for a piece.

Mask Inset Improvements

Nice Inset, Sir!

The Mask trait has a new centered Image Inset option that makes the full face of the card or piece visible to the owning player, while insetting it slightly into the “masked” card back as a reminder that the card or piece is currently hidden from the other players.

Simply choose Image Inset in the Display Style combo box at the bottom of the Mask trait’s definition.

Rotate Directly To Facing/Angle

Rotate Me Baby!

The Can Rotate trait now includes a key command to rotate the piece directly to a specific facing OR angle. Since the facing-or-angle is chosen via an expression, you can use a property in your expression to facilitate rotating however you like.

In the example shown at right, I set the ForceRotate Dynamic Property to where I want to rotate the piece, and then I issue the ForceRotate key command to tell the piece to rotate to that direction.

Autopeek Rollover

Setting up Autopeek

The Mask trait includes an Autopeek on Rollover checkbox, which allows masked pieces to continue to show their full rollover information to players who are entitled to see the piece (e.g. the current owner(s) of the piece).

Module Debug Features

Debug-o-rama dingdong!

A module debug window can now be opened, either from the Tools menu or you can edit the [Global Options] of your module to add a hotkey and/or toolbar button for it. It will show the current mouse cursor position on the map, as well as the name and position of the currently-selected piece, and is designed to make it easier to find and adjust map locations during module development.

A related improvement is that when adjusting the location of a Deck or Setup Stack, the current coordinates are shown during the adjustment process, and there is a checkbox to allow showing the “ghosted” start position of other Decks and Stacks. Likewise when placing points to define the shape of a new Zone the coordinates are shown.

Deck Refresher

Deck Refresher! Or Wreck Defresher?

The Refresh Counters (and corresponding Refresh Predefined Setups tool in the Editor) can now refresh Decks: existing decks will be updated to use the latest settings from the module, which includes the ability to adjust the deck’s location. If a deck has been deleted from the module it will be deleted from the current game (leaving any cards in a stack). Decks newly added to the module will be added to the game (though any new cards must be added separately, e.g. from palettes, and then dragged to the deck.).

Deck Restriction By Side

Lend me your decks!

Decks in publicly accessible places (e.g. on the Main Map) can now have their access restricted to particular players. This means you can put player-specific draw piles or even hands on the main map (avoiding e.g. a whole extra deck window) while still allowing only the correct players to access them.

Deal Cards Face Down

Down and Dirty!

The Mask trait now includes a key command to “deal the card face down” to a side specified by an expression, meaning that as long as the card isn’t currently “owned” by another player it will become owned by the specified side, and thus face down. This can be used to allow players to deal cards from a community deck while making sure they can’t see the cards that other players received.

Move Camera Button

Rome, James!

You can now add toolbar buttons to a map window which, when clicked, will cause the map view to recenter on a specific location (determined by expression).

Fixed Cards From Deck (Global Key Commands)

Not so fixed any more!

When a Global Key Command interacts with a deck, the “fixed number of cards” it selects can now be determined by an expression.

Action Button Improvements

NOW MEGA-DELUXE!

Action buttons now have a fancy visual configurer, and can be set to any polygon shape rather than only a rectangle. Also, the default for an action button is simply to turn the whole piece into a button (rather than always having to explicitly define boundaries)

GetString() added to BeanShell

5+1=51! Sometimes!

Beanshell now supports the GetString() function – which works like GetProperty() except it always returns the result as a string (even if the property was a number or a boolean). Likewise the .toString() suffix, which works similarly e.g. LocationName.toString() has been included in the expression builder.

Report and Message Formats – Beanshell Expression Builders

No More Mr. Nice $

All Message Format and Report Format fields in VASSAL now include the Expression Builder button. Beanshell was previously supported here, but was more on the “undocumented tips and tricks” side. Now it has been embraced as a documented feature.

Inventory - Multi Zoom Level

Who IS that unmasked card?!

Inventory windows now support 3 levels of zoom, so you can include both a “tiny icons list” and a “large icons gallery”.

Toolbar Buttons can be Disabled (Greyed Out)

Meet "Toolbar the Grey"

Many Toolbar buttons (e.g. Multi Action Buttons, Global Key Command Buttons, Dice Buttons, etc) can be assigned a Global Property. When that Global Property is set to “true”, the button becomes disabled – greyed out and can’t be activated – until the Global Property is no longer true!

LOS Thread - line thickness

Better! Stronger! THICKER!

LOS Threads can be configured to be multiple pixels wide.

Load-and-Fast-Forward Logs, also Load/FF/Append

Faster than a speeding logfile...

Log files can be loaded in “fast forward” mode, which skips them to the end without the need to press the step-forward button multiple times.

They can also be loaded for “fast forward and append” which will go straight to the end AND commence appending further commands – this is an easier/safer way to create complete logs of an entire game, while preserving the ability to stop from time to time to back up your progress so far.

These new options are both to be found on the Tools menu.

Miscellaneous Minor Improvements

  • Improved Polygon Editor (cut/paste vertices, delete polygon)
  • Improved Region Editor (drag-at-edge works again, move regions inside of zone)
  • The “console” function of the chat window now allows properties of selected pieces to be queried/set as well as global properties (“/help property”)
  • When using the “console” function of the chat window, up and down arrows can be used to scroll back through previously issued commands
  • Ctrl+Click and Shift+Click can be used in Game Piece Palettes to grab multiple pieces at a time.
  • When switching sides, any player hands and private windows that the new side doesn’t have access to will automatically close.
  • Better trait one-line summaries in editor (auto-populates with information from trait’s major fields)
  • Folder summary in Editor automatically includes its description field
  • While double-clicking to open component in Editor, holding Alt, Shift, and/or Ctrl affects the location the new window opens
  • The Action Button trait includes an option to have the button open the piece’s right-click context menu
  • Report Action trait has a checkbox to override Global Key Command suppression of individual reports
  • Return-to-Deck trait allows target deck to be specified as an expression
  • Send-to-Location trait has new options for sending to pieces-selected-by-properties: cycle and nearest
  • Send-to-Location trait “To Grid Location” option now includes offset options
  • Added $numericTotal$ and $result#$ options to standard Dice Button report format
  • Mouseover Stack Viewer now allows layer filters to be combined with Property Match filters. (Before it was one or the other)
  • Newly added Layer traits will now default to ‘Always active’
  • A Map window’s “Mark Unmoved” button now accepts a hotkey and a report format
  • Game Piece Palette allows setting of default width for “docked” Game Piece Palette
  • When editing an IrregularGrid (e.g. in a Zone), start the map view somewhere near the grid or its parent Zone
  • Expression audit trails preference - improved error reporting/debugging when Beanshell expressions fail.
  • Default UI font size can be overridden in preferences
  • Preference to reverse left-to-right order counters are shown in Mouseover Stack Viewer
  • Added Global property MapName_isVisible for each Map to allow checking if Map is currently open
  • Deck Sort Key Command component to allow sorting of cards in a Deck by properties via menu or hotkey.
  • CountStack() added to beanshell to count pieces in current Stack
  • Repositioning Stacks/Decks optionally draws ghosted images of other stacks/decks
  • Show X,Y coordinates when repositioning At-Start Stack or Deck
  • Zone Editor shows coordinates of vertices while editing
  • Global Key Commands “Within a Deck, select Fixed number of pieces” field now supports expressions
  • Decks - filled out the rest of the commands with hotkeys and report formats
  • Multiplayer Server controls have improved feedback / UX
  • Private Message windows no longer prompt to ignore every time you close them; incoming private messages do not grab focus
  • Rebuild prototypes when they are changed in the editor (without having to exit and start again). Existing pieces on the board would still need refreshing though.
  • Different types of Global Key Commands can be cut and pasted
  • (Windows & Mac) Pieces dragged off the palette using the palette scale factor instead of always full size

Native Builds

There are now native builds for 64-bit ARM Windows and 64-bit ARM MacOS. For best performance, we recommend using a native build for your system and architecture if one is available.

If you were experiencing poor rendering performance with an Apple Silicon Mac, you should see improved performance with the 64-bit ARM build.

Removed & Deprecated Code

Some code which has been deprecated for more than a year has been removed. On loading a module containing custom code which uses removed or deprecated code, a warning dialog is now displayed immediately (instead of at the point when the deprecated code is used, as in 3.5).

3.6.0 Full Release Notes (changes since 3.5.8)

New features

  • 10736: ‘Deal cards out’ to other players
  • 10728: Allow ‘Prompt’ Dice Button values to be locked by designer
  • 10727: Module Debug Window
  • 10719: Deck Refresher
  • 10717: Deck access - allow access to decks to be restricted by player
  • 10682: Move Camera Button
  • 10674: Startup Global Key Commands always fire in order, can’t be undone, and can be configured to, e.g., “once per game”
  • 10649: Deck can start face-up or face-down when using right-click menu setting
  • 10628: Autopeek Rollover
  • 10584: Map “Mark Unmoved” button now accepts a hotkey and a report format
  • 10582: Basic Name trait - facilitates creating pieces entirely in prototype (alternative way to fill BasicName property)
  • 10576: Send-to-Location new options for pieces-selected-by-properties: cycle and nearest
  • 10558: Added Current Mat GKC FastMatch option
  • 10552: CounterDetailViewer - can combine layer filters with property match expression
  • 10551: Action Button option to open right-click context menu
  • 10509: Add $numericTotal$ and $result#$ options to standard Dice Button report format
  • 10505: Enable Offset options to work with the Grid option in SendToLocation
  • 10486: Better obscurable option for insetting
  • 10484: Mats have more deselection options; double-clicking delesects cargo
  • 10468: Refresh Counters support for Mats and Cargo
  • 10454: Game Piece Palette allows setting of default width for “docked” Game Piece Palette
  • 10412: Double the max heap for modules which run out of memory during loading
  • 10394: Add a Key Command to Can Rotate trait to rotate directly to a facing specified by an expression
  • 10276: Expose property if we’re currently drawing Counter Detail Viewer
  • 10273: Mat Cargo can be set to detect mats way from their exact center
  • 10248: Invisible trait - Option to disable auto-report of moves
  • 10075: Scaling factors for Layers and Non-Rectangular
  • 10066: Mats & Cargo - Cargo pieces stay attached to Mat piece when moving.
  • 10034: Added option to Mass Piece Loader to not create empty levels in layers when there is no matching image
  • 10021: Added sub-folders to group components under Module, Maps, Decks, At-Start Stacks, Prototypes and Global Properties folders
  • 10002: Add Hotkeys to hide and show map windows. Existing show/hide hotkey field is now always visible. Allow changes to hide/show Map button settings without needing Editor restart
  • 10001: Inventory window allows a hotkey for Refresh
  • 9998: Editor now has Drag and Drop support
  • 9997: Can duplicate and insert components in Editor, not just add to bottom
  • 9988: CountStack() added to beanshell to count pieces in current Stack
  • 9987: ReportState checkbox overrides Global Key Command suppression of individual reports
  • 9979: Add Deck Sort Key Command component to allow sorting of cards in a Deck by properties via menu or hotkey. Add Deck Send Key Command component to provide additional commands to send contents of one Deck to another via menu or hotkey.
  • 9973: Deck supports configurable strings for Draw Multiple, Draw Specific, Face Up, Face Down
  • 9972: Ability to specify Return-to-Deck target as an expression
  • 9917: Global Options can be configured to let toolbar items on closed windows accept global hotkeys
  • 9912: Add Global property MapName_isVisible for each Map to allow checking if Map is currently open
  • 9901: Preference to reverse left-to-right order counters are shown in Mouseover Stack Viewer
  • 9864: Improved translation features (Global Translatable Message component, Translatable Message trait, exposing current language/locale as property)
  • 9549: Default UI font size can be overridden in preferences
  • 9391: Beanshell can now access $$ variables in Report Formats
  • 4542: Added ‘Stack Normally’ option to ‘Does Not Stack’ trait
  • 4533: Make grid center dot display independent of grid display

Bug fixes

  • 10840: Directly setting coordinates in Zone definer fails to create a Zone
  • 10827: Fix Deck refreshing when running Game Refresher
  • 10826: Protect against multiple initializations of Movement Trails
  • 10818: DrawingMouseoverIndex correctly returned as string. Console now displays null valued properties instead of NPE
  • 10815: Fix Dice Button reporting when Keeping and Sorting results
  • 10810: Protect against no available trait being selected in PieceDefiner
  • 10793: Fix NPE: Always cache SetupStack configurer bounding box
  • 10777: Fix duplicate DragShadow for Cargo at zoom < 100%
  • 10773: Fixed bad description for Movement Trail trait
  • 10760: Correctly initialize local-only properties in Movement Trails
  • 10757: Prevent undo of Refresh Counters from causing contents of Decks to disappear, and deleting units from inside a Deck could not be undone
  • 10752: Fixed bug where Deck ‘count expressions’ wouldn’t count beanshell, only old-style (now will count either)
  • 10734: No refresh allowed during replay
  • 10718: NPE due to dropTargetSelector being unset
  • 10713: Escape errorLog path when making link URL for connection failed page in BugDialog
  • 10711: When rotating a mat, jointly rotating cargo should prefer to stay with current mat
  • 10703: Correct inconsistency in use of GetConfigureBoard
  • 10702: When inventory grouping specifies properties that aren’t internally strings, don’t balk
  • 10683: Fix bug in DiceButton ‘Keep Dice’ option
  • 10679: Place Marker, Send-to-Location, and Translate traits didn’t always repaint maps
  • 10678: Undo of movement will no longer deny lone stackable pieces their own stack
  • 10671: Calculate Hex Range correctly, regardless of hex shape
  • 10663: Fix occasional draw-side exceptions during loading game and saving screenshots
  • 10660: Report translated name for Symbolic Die Faces
  • 10659: Sanitize temporary file names a bit earlier
  • 10658: Fix NPE if try to open translations but the buildable doesn’t exist
  • 10654: Fixed corner-case NPE when closing a game
  • 10647: Private Maps visible to non-owning players will correctly display Mouseover text
  • 10640: Tidier right arrow symbol in default move reports
  • 10639: Fix exception when canceling edit of a component that has been elsewhere moved or deleted
  • 10638: Fixed NPE if pasting a cut component that was then deleted before pasting
  • 10635: Trigger Action traits with “loop until” and “loop while” conditions can properly access piece properties in expression builder
  • 10632: Fix ArrayIndexOutOfBoundsException in Embellishment when layer value is out of range
  • 10631: Clip pieces to their bounds and set rendering hints for drag image
  • 10630: Correctly check if there are sides with blank passwords for password matching
  • 10629: String Array Configurer bounds protection
  • 10623: Fix NPE joining chat room when socket drops early
  • 10622: Fix NPE when MapShader temporarily points to blank or missing filename
  • 10621: Protect against changing to Image style while Image name is still blank
  • 10620: Fix NPE EditPropertiesAction.windowClosed()
  • 10619: Eliminate Command+A key conflict in Editor on MacOS
  • 10618: ToolbarMenus that are submenus of other ToolbarMenus display their icons properly
  • 10616: Mouseover Stack Viewer was failing to launch in certain situations
  • 10615: Stack NPE in Mat Movement code
  • 10607: P2P address book entries with spaces in address cause StringIndexOutOfBoundsException
  • 10604: Match blank passwords less eagerly
  • 10603: Action Buttons should not respond to Shift+Click, Ctrl+Click, Alt+Click, Cmd+Click
  • 10602: Don’t unselect piece about to get context menu with Ctrl+RightClick
  • 10601: Flares weren’t responding to Cmd key on MacOS
  • 10599: map can be null during GameRefresher
  • 10596: Protect CounterDetailViewer from designers who set the drawing scale to 0.0
  • 10595: Fix crash ending logfiles- beginningState shouldn’t be allowed to be non-null when outputfile is null
  • 10594: Fix crash when copying Toolbar Menu to a newly created map
  • 10592: Corner case boardpicker exception with multiple boards being moved around
  • 10591: Protect from GKCs that get sent when no game ever started
  • 10589: Fix Mat send-to-location bug (which created problems in Undo & multiplayer)
  • 10585: Movement Trail “initial visibility” and bounding box caching bugs
  • 10572: Fix Drag Threshold preference to work correctly
  • 10563: Trait editor Paste button is now always enabled
  • 10555: Fix mat save/load to reconnect mats and cargo
  • 10504: Text label shape, bounding box doesn’t resepect rotated labels
  • 10476: Editor: Inserting text into middle of Key Command doesn’t work
  • 10474: Movement traits need to update cargo’s mat after movement before applying apply-on-move keystroke
  • 10405: Log replay of delete command behaves differently after load of sebsequent log file
  • 10404: Catch FileNotFoundException when reading prefs files
  • 10402: NPE when trying to create new P2P Network
  • 10400: Custom preferences in Global Options incorrectly use property name, not description
  • 10399: ThrowableUtils.throwAncestor() throws wrong object; throwMe() uses wrong constructor
  • 10390: NPE in GameModule.getProperty() after deleting the Map from the owning Map widget
  • 10387: ‘Centre on Opponents Moves’ functionality should ignore movement by Invisible units
  • 10386: Audit Trail reporting is not reporting trait or piece information for Return to Deck trait when invalid Deck specified
  • 10381: Replaying a log step can cause Deck to become corrupted
  • 10375: NPE in EnumeratedPropertyPrompt.getNewValue()
  • 10371: Reset the Zone Editor title to match the Zone being edited
  • 10359: ClassCastException: DeckGlobalCommand cannot be cast to Auditable
  • 10357: Return To Deck Deck name can be lost when pre 3.6 module is edited using 3.6
  • 10351: Checkbox preference default value is ignored
  • 10341: Symbolic Dice Button tooltip is overwritten by description text
  • 10326: Add option to disable OpenGL FBOs on Macs
  • 10301: Double max heap and retry when image tiler runs out of memory
  • 10294: Can Rotate traits no longer lose any pre-defined starting rotation when editing a Piece Slot
  • 10226: Force Game Piece Image names to be valid file names ending in .png
  • 10187: Duplicate key and menu item for Editor menu
  • 10095: Definition of Player Sides - Retire/Switch Button image not showing in editor
  • 9993: DeckPosition was reporting 1 higher than the actual position
  • 9884: Fix and improve module validity checking
  • 8949: IllegalArgumentException in GameState.getRestorePiecesCommand() due to bad comparator
  • 6130: Grid Numbering dialog can appear blank when grid size is very large

Other improvements

  • 10853: Prototypes can be selected from popup menu
  • 10852: Turn Tracker button sizes configurability
  • 10839: Improved flow for users with blank passwords
  • 10831: Allow JVM to be specified from command line for VASSAL.sh
  • 10828: Skip All / Skip None for Mass Piece Loader
  • 10812: Optimize Single Property Beanshell expressions
  • 10811: Optimization: Check for possible keystrokes in Restrict Commands before evaluating match expression
  • 10808: Misc property lookup optimizations
  • 10806: Improved performance of Map “_isVisible” properties
  • 10803: Speeds Game Refresh and general performance in modules with many maps defined
  • 10800: Preference to turn off automatic update notification
  • 10784: LOS thread thickness is adjustable
  • 10774: Validation messages when Movement Trail traits placed inside of Rotate, Pivot, or Mat Cargo traits
  • 10772: Allow module images to have English localizations
  • 10764: Server text improvements
  • 10762: Add sumProperties() function for use in Beanshell expressions in the Mouse-over Stack Viewer
  • 10761: Toolbar buttons can be disabled when a specified Global Property is true
  • 10755: When switching sides, close private hands/windows that we no longer have access to
  • 10753: Clarify documentation of sum(PropertyName) in Mouseover
  • 10751: Better description of Player Hand
  • 10750: Place Marker should put stacking markers in a stack (even if parent marker is non-stacking)
  • 10749: Move Camera Button can also change Zoom
  • 10731: Add description fields to most important editor components
  • 10730: Improve Game Piece Palette doc per forum suggestion (AsciiDoc file only)
  • 10701: Zone defining - when dragging a square to define initial zone, dragging at edge of screen scrolls
  • 10700: Improved bug dialog text
  • 10699: Repositioning Stacks/Decks optionally draws ghosted images of other stacks/decks
  • 10696: Global Key Commands “Within a Deck, select Fixed number of pieces” field now supports expressions
  • 10691: Mouseover Stack Viewer - Unstatic a naughty field and add ability to count face down cards in a deck
  • 10686: Decks - fill out the rest of the commands with hotkeys and report formats
  • 10681: Better documented pieceName vs PieceName
  • 10676: Upgrade to Java 17.0.1+12 for Windows, Mac packages
  • 10673: Added Game Refresher documentation
  • 10672: Multiplayer Server controls have improved feedback / UX
  • 10667: Private Message windows no longer prompt to ignore every time you close them; incoming private messages do not grab focus
  • 10652: Zone Editor shows coordinates of vertices while editing
  • 10650: Show X,Y in Configurer when repositioning At Start Stack
  • 10648: Private chat windows will no longer steal focus
  • 10643: Show saved game mismatch warnings (e.g., loading wrong version) when loading from Wizard
  • 10641: When Editor changes a prototype, clear the prototype cache and all PieceSlot caches
  • 10636: Warn when Global Property has a blank name (which causes NPE on game load)
  • 10633: Remove doubled images from Ghost Bug Pref
  • 10626: Different types of Global Key Commands can be cut and pasted
  • 10610: More robust configurer for PredefinedSetup
  • 10609: Trigger Action - improved trait summary
  • 10597: Selection Highlighter expressions now found by search
  • 10593: Add description to Prototype Definition
  • 10590: Better ConfigureTree summary on PieceSlot containing a BasicName-using piece
  • 10587: Description field & better auto-summary for Does Not Stack
  • 10586: Better defaults for Send To Location offsets
  • 10578: MatCargo now provides OldMatOffsetX and OldMatOffsetY properties
  • 10569: Better trait one-line summaries in editor; Folder summary includes description
  • 10565: While double-clicking to open component in Editor, holding Alt, Shift, and/or Ctrl affects the location the new window opens
  • 10557: Added MatCargo to manually attach/detach from mats
  • 10547: Bring fastmatch $$ variable handling into line with standard Global Key Command match expression handling
  • 10543: Initialise OldMat related properties in a Placed marker
  • 10519: Improve Mat Movement
  • 10510: More robust Java version check for Linux
  • 10466: Reference manual missing description of restrict counters to Deck option
  • 10446: Removed more items deprecated for over a year
  • 10445: Improved browser launch support
  • 10432: Store the tile cache in %LOCALAPPDATA% instead of %APPDATA% on Windows
  • 10430: Upgrade to Java 17 for Windows, Mac packages
  • 10392: HTTP requests for server status should follow redirects
  • 10383: Update all site URLs for new site and HTTPS
  • 10337: Bring Reference Manual up to date
  • 10286: Add removal/deprecation checker and remove anything deprecated a year ago
  • 10277: When editing an IrregularGrid, start the map view somewhere near the grid or its parent Zone
  • 10272: Don’t auto-name new regions a long string
  • 10259: 64-bit ARM builds for Windows and Macs; switched bundled Java to Zulu
  • 10228: Upgrade to Launch4j 3.14
  • 10041: Newly added Layer traits will now default to ‘Always active’
  • 10015: Remove ?s from checkbox preference strings
  • 10011: Add Scrollbars to Prefs Dialog when needed
  • 10007: Ctrl/Cmd to select for Does Not Stack
  • 9999: First ‘advanced search’ on a module defaults to all boxes prechecked
  • 9992: Removed ignored ‘button tooltip’ field from Turn Tracker config
  • 9989: Less verbose window titles for sub-windows
  • 9975: Deck reports now suppressed during GKC report suppresssion
  • 9913: Increase number of default zoom levels in new Map Zoom Capability
  • 9596: Pieces dragged off the palette using the palette scale factor instead of always full size
  • 9366: Inventory window allows 3-level zoom
  • 9254: Expression audit trails preference - Improve error reporting when Beanshell expressions fail. Suppress ‘Bad Data in Module’ errors * generated by counters in Game Piece Palette.
  • 9219: Expression Builder button added for Message Format fields & Report Trait. Sum() and Count() now available in the Report trait’s field
  • 9209: Added GetString() and .toString() to Beanshell to force the return of property values as Strings
  • 9124: Property incrementers no longer apply turned-off min/max constraints
  • 6195: Don’t change Deck properties or fire Empty Deck Hotkey when just rearranging order
  • 6075: Action Buttons now respect rotation
  • 4496: Allow Action Buttons to be any shape and defined using a Polygon editor
  • 4479: Shift-click and Ctrl-click can be used in the Piece Palette to select and drag multiple pieces on to the map

Changes in 3.6.1

New features

  • 10879: Dice Button raw result and counts reporting

Bug fixes

  • 10876: Remove unwanted nulls from Inventory
  • 10871: Display proper name for Set Global Property and Place Marker in Editor
  • 10869: Inventory shouldn’t show pictures/text for pieces in private windows not currently accessible
  • 10861: Polygon read from coordinates list should never be null

Other improvements

  • 10880: Create HintTextFields lazily

Changes in 3.6.2

Bug Fixes

  • 10925: Turn Tracker Button can never be size 0
  • 10915: Undo of Send To Location sent to bottom card of deck returns the card to the top of the Deck
  • 10908: Fix NPE when using Send Back in SendToLocation
  • 10907: Disabled Toolbar Buttons on Map Windows didn’t initialize starting state properly
  • 10906: Show an error dialog if reading a corrupted prefs file
  • 10903: Stacking units placed by At-Start stacks didn’t allow Action Buttons on said pieces to function until the piece was moved
  • 10901: Unchecking Cycle Message box in a Report trait clears the fields
  • 10899: Show the player window before the welcome wizard
  • 10894: Warn about movement trails inside of rotates only when editing module
  • 10893: Fix NPE: RandomTextButton raw rolls/counts support
  • 10891: Pieces in decks were not being updated during Refresh Counters
  • 10889: Added diagnostic to determine what is trying to add stacks to stacks
  • 10887: Wasn’t possible to click add to add an Action Button trait to a piece

Other Improvements

  • 10929: Use ‘/usr/bin/env bash’ in VASSAL.sh for greater portability on Unix

Changes in 3.6.3

Bug Fixes

  • 11008: Prevent URLConnection cache from holding edited modules open on Windows
  • 11007: Fix ArrayIndexOutOfBoundsException in StringEnumConfigurer
  • 11003: Fixed bad tile message; added plea for help with TileNotFoundExceptions
  • 10997: Editor: Don’t close window when moving Map or other components relative to Map
  • 10992: Fix NPE in SpecialDiceButton.getAttributeValueString() after deleting tooltip
  • 10985: Reset save dialog filename after close of game
  • 10983: Fix bad Inventory.Counter.equals()
  • 10981: Reinstate AbstractBuildable.getComponents()
  • 10979: Prevent Save Game from clobbering log being replayed
  • 10970: Fix problem where rotated pieces did not move-fixed-distance in correct direction
  • 10969: Fix Refresh of Pieces in Decks, remove old pieces completely
  • 10964: Fix Deal-to-Side Mask bug - Finish evaluating expression properly
  • 10954: Fix stack overflow infinite loop if invalid property name put in blank
  • 10947: Collect diagnostic information for an SSLHandshakeException
  • 10940: Fix NPE in TurnLevel
  • 10942: Fix NPE in SendToLocation
  • 10934: Repaint the background in the SetupStack editor
  • 10931: Fix NPE in KeyCommand.makeMenuText()

Other Improvements

  • 10961: Use heuristic value for initial tiler heap; use 3/4 physical RAM as max heap

Changes in 3.6.4

New features

  • 11079: Main window & map accept Drag-and-Drop for loading saves and logs
  • 11032: List Key Commands tool for Editor

Bug fixes

  • 11073: Fix situation where Send-to-Location throws exceptions when it can’t find target counters
  • 11069: Fix crash in Load Deck when an invalid deck file selected in file picker
  • 11067: Fix NPE in SetupStack.isOwningBoardActive()
  • 11065: Improved error handling when a temp file can’t be created
  • 11062: Fix problem on Windows where a click at edge made it slowly scroll all the way in that direction
  • 11060: Fixes to various Toolbar Buttons that weren’t respecting the “disable-on-global-property” settings
  • 11056: Don’t attempt to send to already-hung-up connection
  • 11053: Suppress Empty Deck Hotkeys when refreshing game
  • 11041: Inventory windows respond to hide-if-property-true
  • 11039: Display Loaded message instead of Cancelled when refreshing Predefined Setups
  • 11038: Allow ‘Use Same Boards’ option on Private Map to be removed
  • 11031: Turn Tracker List configure box missing labels
  • 11025: Guard against ClassCastException when MultiActionButtons change property values
  • 11024: Communicating with tiler over socket fails for some users; use stdout instead
  • 11020: Don’t display lock option for P2P rooms, which aren’t lockable
  • 11011: Fixed typo in DiceButton docs

Other improvements

  • 11076: Editor’s search function (and List Key Commands) will now “find” the keys for Undo & Step Forward
  • 11074: Support Send-to-Location source/target matching with $…$ expressions
  • 11070: Documentation updates for DrawingMouseover / DrawingMouseover Index
  • 11059: Right Click menu added to Show Error Log window in Module Manager
  • 11054: Don’t let old versions of PoG load and crash

Changes in 3.6.5

New features

  • 11124: Console supports up-arrow / down-arrow for command history
  • 11122: Console can show/set properties of selected piece
  • 11117: Log files can be fast-forwarded and appended to

Bug fixes

  • 11218: Grid Editor incorrectly changes some grid settings on Cancel
  • 11196: Game Refresher should not refresh stacks not on maps
  • 11186: Disable load and edit actions for null modules
  • 11179: Chart Windows display their names properly in their window titles
  • 11162: Turn Tracker does not display a spurious blank line if its report format is left empty
  • 11160: Prevent At-Start Stacks from creating additional spurious pieces on main map
  • 11156: Games incorrectly load normally during ‘Load Continuation’
  • 11150: Use heuristic value for tiler max heap, retry with 50% more on failure
  • 11149: Capture tiling error messages Java incorrectly writes to stdout
  • 11139: Deal-to-Other key in Mask Trait now recognized in Search
  • 11135: Fixed Discord console drag-and-drop bug
  • 11127: Don’t throw exception if there’s a drive letter in a filename
  • 11121: Fix problem where undo wasn’t allowed when starting a new game with logging turned on
  • 11119: Fixed NPE in NamedHotKeyConfigurer.setValue()
  • 11115: Fix ClassCastException due to Zone properties not accounting for folders
  • 11109: LOS Range incorrect when thread is not snapped to hex centres
  • 11106: Fix NPE when duplicating GamePieceImage
  • 11105: Added missing Editor.SendToLocation.getSendLocation translation key
  • 11096: Remove “duplicate this item” option from Game Piece Image
  • 11095: Deduce the existence of localized image directories which lack ZIP entries
  • 11094: Exclude GamePieceLayout image names from unused image list
  • 11093: Image directories for i18n were not found in 3.6.4
  • 11089: Write text files in UTF-8, not the default encoding
  • 11081: Prevent GameRefresher from changing visual order of pieces

Other improvements

  • 11216: Inventory has checkbox to enable zoom (defaults off)
  • 11209: Global Options settings for (a) Inventory Security, and (b) Send-to-Location generating move trails. Inventory now defaults to “old behavior” on seeing private windows, but can be turned to secure.
  • 11205: Improved Polygon Editor (cut/paste vertices, delete polygon) & Improved Region Editor (drag-at-edge works again, move regions inside of zone)
  • 11197: Better auto-description for Translatable Message trait and BasicPiece
  • 11194: The errorlog console command is available at all times
  • 11164: Upgrade bundled Java to 17.0.2+8
  • 11135: Prompt to save/discard/cancel before loading the new game
  • 11120: Permit hyphens and periods in GamePieceImage names
  • 11107: Warn if Decks or Stacks defined before [Map Boards]
  • 11098: Screenshot “typo” fix for Turn Tracker’s global hotkey

Changes in 3.6.6

Bug fixes

  • 11327: Fix Action Button not working after refreshing pre-defined setups
  • 11325: Implement the missing Play Sound trait ‘Send sound to other players’ functionality
  • 11315: Show correct Turn Tracker tooltip
  • 11302: Fixed link typo in GamePieceImageDefinitions page of Reference Manual
  • 11287: Fix ConcurrentExecutionException in Game Refresher with Mats
  • 11278: Scale tiled images to target size rather than by scale factor
  • 11254: Tiler dialog doesn’t cancel tiling when Cancel button is clicked
  • 11248: Catch InvalidDnDOperation exceptions when inappropriate drag-and-drops attempted
  • 11227: Fix NPE when copying vertices from a zone with no vertices
  • 11232: Stop edit of table when TableInfo is closed
  • 11223: Copy/Paste conversions fixed for Zone Properties to/from Global and Map Properties
  • 11188: DoActionButton hotkeys were not found by search

Other improvements

  • 11303: Preference to control drag-at-edge scroll rate; per module defaults for edge scrolling
  • 11297: Don’t copy out unused images on removal
  • 11296: Don’t block the EDT when clearing the tile cache
  • 11292: Strip leading and trailing whitespace from module names and versions
  • 11286: Improved Setup Stack descriptions in editor
  • 11279: Module “other” strings displayed in About screen
  • 11276: Place Marker (and Replace With Other) include name of added piece in summary
  • 11260: Editor now remembers its most recent image-picking (and sound) directories separately from its memory of last save/load of games and logs
  • 11258: New BasicName trait defaults to Prototype’s name; Changing Prototype’s name changes BasicName trait’s, if identical; At-Start Stack with no name displays name of first contained piece or folder in editor
  • 11256: Added a preference for the tiler max heap; tiler will retry up to that limit
  • 11255: Updated downloads URL to the one for our download page
  • 11243: Enable Sum and Count in GKC Report Expressions
  • 11233: UI Cleanup: don’t scroll-at-edge the map if a file or link is being dragged instead of a piece
  • 11229: Allow ‘Select All Regions’ when defining them; right click to delete now works for single unselected region
  • 11071: Improved version number checking

Changes in 3.6.7

Bug fixes

  • 11465: DoActionButton claims its icon in remove-unused-images
  • 11417: Fix Ctrl key with Does Not Stack trait
  • 11406: Don’t show image scale option for panels inside Chart Windows
  • 11388: Correctly draw hex coordinates for odd-numbered columns spanning tile boundaries
  • 11372: Delayed Notes from subsequent saves displayed out of order
  • 11369: Leading zeros handling in Set Dynamic Property
  • 11362: Match expanded Inventory nodes by entry value, not by display text
  • 11347: Inventory should not reveal face down deck images
  • 11344: Prevent Undo from triggering Deck Empty Hotkey
  • 11343: Ensure that the pivot point is used for rotating Cargo
  • 11329: Invisible Pieces belonging to another player can still stack together

Other improvements

  • 11487: Removed obsolete option from startup script
  • 11460: Show a dialog when connection to the game server is lost
  • 11446: Tweak version number display in online window (numbers at end, grayed out)
  • 11414: Improved version mismatch messaging
  • 11373: Make columns in Delayed Notes table sortable
  • 11361: Allow Calculated properties to set Game Piece Layer
  • 11356: SetupStack can match literal grid names even if Zone only reports Zone name (e.g., uses $name$ as Location Format)
  • 11351: Documented that Mats w/ cargo can’t go in decks
  • 11348: Polygon Editor improvements (move whole shape, tab between points)
  • 11346: Update bundled Java to 18
  • 11330: Allow .toString() to be called properly on property names in Beanshell

Changes in 3.6.8

Bug fixes

  • 11778: System.setProperty() in BugDialog throws if the value is null
  • 11727: Fixed incorrect properties file path, which prevents working on translations
  • 11716: Dereference symbolic link to executable before attemping to find install dir
  • 11678: Prevent clearing the tile cache when a module is open
  • 11617: Closing a reopenable Map should not close game
  • 11565: Global Option List Preferences not initialising Global Property correctly
  • 11544: Broken links to and within Reference Manual
  • 11543: Closing game should reset multiplayer flag for console
  • 11540: Display translated Basic Piece/Basic Name in Scrollable lists in Game Piece Palette
  • 11537: Cancel key in Multi-Piece Editor (Edit all contained pieces) correctly backs out with no changes
  • 11515: Piece dropped into incorrect position in the stack when dragging within a stack to a lower position
  • 11513: Piece “disappears” when dragged to grid space with an existing stack and “snap to defined point”
  • 11510: Updated Opt-in version of the ‘Leading Zeros in Integers’ handing
  • 11496: Safer GKC Configurer for Fixed # From Deck

Other improvements

  • 11798: Added Chinese translation
  • 11796: Added Polish translation
  • 11790: Updated bundled Java to 19 for Windows and MacOS
  • 11704: Added Place Marker editor hotkeys
  • 11700: Irregular Grid editor - add region with Insert or Ctrl+Right Click
  • 11622: Added support for Open Recent… submenu
  • 11600: Player context menus: Show keyboard shortcuts right-aligned and with symbols
  • 11570: Update Module Extension window, add missing description
  • 11564: Prevent Notes windows always starting open at very last character of note
  • 11557: Auto-select contents of Edit boxes when they get focus
  • 11546: Default dialog-closing button behaviors for Enter/Esc; Key shortcuts added to Piece Definer (see Game Piece help); Piece Definer list boxes jump to entry starting with that letter; Key shortcuts added editing Layer trait (see Layer help); Most text fields support Ctrl/Cmd+Z for undo/redo
  • 11545: Description of Prototype will auto-include any BasicName
  • 11541: Add hotkey to start specific chess clock
  • 11534: Add Open all Contained Pieces option
  • 11524: Option to ‘always use format’ on text label (even if label is blank)
  • 11521: BoundsTracker - Track bounds and repaint just for the regions of added pieces; rather than the whole map
  • 11499: TurnTracker Forward Only Toggle: Allow module designers to disable the backwards TurnTracker button
  • 11497: Don’t play sounds while fast-forwarding a log

Changes in 3.6.9

Bug fixes

  • 11825: BoundsTracker once again repaints entire maps, reverting 11521
  • 11821: Include the AreaOfEffect bounds in the piece bounding box only if the AoE is visible
  • 11814: Ensure that valid BasicName property is used to identify piece when no translation is available
  • 11808: PieceCloner.clonePiece() should not expand inner pieces unconditionally
  • 11806: NotesWindow re-open assigns focus properly to retain caret position
  • 11805: Fixed NPE: tab.getTitleAt() can return null, so check for that

Other improvements

  • 11804: Log element name on build exception, if available
  • 11803: Report exceptions thrown while loading modules

Changes in 3.6.10

Bug fixes

  • 11883: Fixed order of labels for “Select play mode” and “Enter your name” steps in the Welcome Wizard
  • 11879: NPE when cutting and pasting a GlobalPropertyFolder
  • 11860: Warn when same piece is both Mat and Mat Cargo
  • 11858: Clear all PieceSlot caches after loading extensions
  • 11846: Protect from null property results during search
  • 11823: NPE in GameRefresher when refreshing unnamed Decks
  • 11813: NPE in PieceSlot.getLocalizedConfigureName()
  • 11759: Do not allow negative number of Dice or Sides
  • 11748: NPE when cutting and pasting a prototype folder
  • 11455: Prevent NPE when adding empty KeyStrokes to list
  • 11452: Prevent NPE if invalid file specified in img tag

Changes in 3.6.11

Bug fixes

  • 11941: Since 3.6.7, French/Belgian AZERTY keyboards on Mac were experiencing problems with Ctrl / Alt keys on the number key row
  • 11938: IndexOutOfBoundsException trying to open a private note
  • 11933: At-Start stacks were getting confused by blank boards
  • 11929: Show translated module name and descriptions in Module Manager
  • 11924: Reinstate translation of Player Sides
  • 11904: Global Key Command fastmatch for Mats fixed to avoid trait-order bugs
  • 11901: Corrected “Mark When Moved” documentation
  • 11899: Hide FileConfigurer label in preferences dialogs
  • 11890: NPE when current-stack option used on non-stacking piece
  • 11505: Insert items into formatted strings from drop-down list into the correctly selected position

Other improvements

  • 11911: Debug window shows board-relative coordinates if they are different from the map-relative ones
  • 11906: MatCargo’s mat detection did unnecessary computations for lack of parentheses
  • 11900: Clear Tile Cache with more efficient Files.walkFileTree()

Changes in 3.6.12

Bug fixes

  • 11994: Deck “send-when-empty” hotkeys no longer create extra undo steps
  • 11993: ActionButtons set to count 0 times don’t spuriously execute 1 time
  • 11982: Fixed multiplayer problems with detach option on Deselect trait
  • 11963: SendToLocation, Can Rotate, and MoveFixedDistance were all unlinking from deck/stack at wrong time, causing buggy behavior in some instances especially involving decks
  • 11961: Clear up mark-when-moved problems for modules which still had a legacy value set
  • 11884: ‘OldMat’ properties now set correctly regardless of order of Mat Cargo and Send-to-Location (etc.) traits
  • 11880: Triggers set to count 0 times don’t spuriously execute 1 time
  • 11714: Deck’s Send-when-Empty key now processes AFTER fully moving last card
  • 11627: ActionButtons with context menu flag no longer trigger context menu when a different ActionButton on same piece (that doesn’t have the flag set) is clicked
  • 11462: Don’t +1 inventory sum if property isn’t even defined
  • 11437: Prevent NPE when right-clicking on a Deck with no menu items
  • 11429: Deck Empty Hotkey no longer repeats per online player instance, nor when stepping forward a log

Other improvements

  • 12013: Reinstate removal of module tile cache when a module is removed from the Module Manager
  • 12007: Update Apple Silicon terminology in preferences and docs
  • 11986: Add missing Section size symbol to NATO markers
  • 11957: Spaces in GKC reports made consistent with all other reports
  • 11935: Allow option for only first Mouseover-stack Viewer that generates a tooltip will be drawn

Changes in 3.6.13

Bug fixes

  • 12042: Fix bug when copying Decks and At-Start Stacks to other maps
  • 12037: Fix concurrent modification exception in Decks
  • 12016: Fix a possible crash scenario in At-Start Stacks
  • 11897: Ensure that deleted extensions don’t crash the Module Manager
  • 11693: Prevent NPE when copying folders containing Mouse-over Stack Viewers
  • 11451: Don’t permit drag-and-drop within PlaceMarker, Replace with Other selection dialogs
  • 11173: Fixed crash in sorting a deck

Other improvements

  • 11995: ActionButtons with reports shouldn’t display them if report is empty
  • 11967: When dragging piece out of face-down deck, use unrotated shape
  • 10877: Added a ‘player joined’ message when playing online
  • 9786: Text Label traits will respond to GameRefresher (unless trait has a manually-change-label hotkey defined)

Changes in 3.6.14

Bug fixes

  • 12063: Fixed Deck save/load hotkeys being mixed up
  • 12061: Fixed bug with pasting invalid/incomplete regex expressions
  • 12059: Various PMD and Spotbugs fixes
  • 12048: Fix bugs when deleting groups of decks/stacks from the editor
  • 12041: Rollover border color of ‘no color’ did not save to file, nor copy correctly
  • 11249: Enhanced recursion protection to catch self-referencing prototypes

Other improvements

  • 12065: Reduce update check delay to 5 days, from 10
  • 10249: Duplicating a prototype no longer disables that prototype until next module reload

Changes in 3.6.15

Bug fixes

  • 12119: Restore vanished Load Comments
  • 12116: Pieces shouldn’t receive same GKC twice just because it sent them to a new map
  • 12105: Deck’s ‘Send-to-Deck’ subcomponent has access to properties (e.g., PlayerSide) and properly shuffles “always shuffle” decks
  • 12093: Fix disabling of toolbar items nested in multiple Toolbar Menus

Other improvements

  • 12140: Action Buttons on pieces that have just been drag-moved are suppressed for a half second for user-error avoidance
  • 12085: Screen capture default icon height adjusted to match the other 16-pixel-high icons
  • 12069: Tiling: Improved detection of and recovery from running out of memory; improved error dialogs
  • 9894: Improved error dialog for failure to start child process

Changes in 3.6.16

Bug fixes

  • 12232: Notify user about mismatch between module and save version instead of throwing IllegalStateException
  • 12231: Check that all tiles exist for an image when tiling, not just 0,0@1:1
  • 12221: Fixed various missing searchability on various components
  • 12209: Report correct trait in expression Audit Trail
  • 12159: Correctly handle install paths containing spaces in VASSAL.sh
  • 12158: List Key Commands tool can be re-opened after closing with X button
  • 12152: Work around Java bug which prevents displaying Windows file dialogs

Changes in 3.6.17

Bug fixes

  • 12248: Don’t NPE when handling setup errors
  • 12247: Fix error dialog broken since 3.6.15 for exceptions with null messages
  • 12237: Fix edge case Mat Refresh bugs
  • 12234: Don’t try to render SVG which would have a width or height of zero
  • 12233: Ensure that OpMultiResolutionImage.getBaseImage() never returns null

Other improvements

  • 12250: Adjusted TilingHandler to simplify VASL and VSQL custom tilers
  • 12238: Upgrade bundled Java from 19 to 20

Changes in 3.6.18

Bug fixes

  • 12291: Fix incorrect drag offset on Windows with UI scaling > 100%
  • 12256: Work around Java’s use of incorrect gamma for grayscale + alpha PNGs

Changes in 3.6.19

Other improvements

  • 12313: Added MAYBE_MOVED property for 3.7 compatibility