VASSAL 3.4.0-beta1 Released

[size=200]VASSAL 3.4.0-beta1 Released[/size]

The VASSAL Team is happy to announce the release of VASSAL 3.4.0-beta1, which is a preview release.

(If you’re wondering why we’re releasing 3.4.0-beta1 next after 3.3.3-beta1: You haven’t missed 3.3.3. We decided that the next full release should be 3.4.0 due to added features.)


  • Things may be broken which worked previously. If you find a new bug, please report it.

  • If you save a module in VASSAL 3.4, you will NOT be able to open it afterwards with VASSAL 3.3 or earlier. We recommend keeping a backup copy of any pre-3.4 modules you plan to modify in 3.4 until you’ve verified that everything works to your satisfaction.

  • Some modules containing custom drawing code may render incorrectly on HiDPI displays, starting with 3.3. If you are the maintainer of such a module, let us know and we can advise you about what needs updating for 3.4 in your code. (We are aware that VASL has this problem and are working with its maintainers to update it.)


Mac OS X
Windows (64-bit)
Windows (32-bit)

[size=150]Changes since 3.3.3-beta1[/size]

New features

  • 13313: Specify VM options for Player via a file
  • 13275: Ctrl+Mousewheel to zoom

Bug fixes

  • 13319: Multiline HTML labels breaks toolbar button alignment
  • 13302: BasicCommandEncoder.DecoratorFactory and BasicPieceFactory should
    have remained public
  • 13300: HTML-Enable pref for Chatter doesn’t show for pre-3.3.3 modules
    without GlobalOptions
  • 13291: Fix Beanshell issues with $$ variable processing
  • 13289: Don’t print “Saving game” twice when using Save As
  • 13281: Added inadvertently removed throws declaration for
  • 13280: NPE in KeyStrokeListener.keyPressed()
  • 13236: StackOverflowError: Expressions and Formatted Strings can infinite-loop
  • 13217: Editor: Prevent pasting a cut ancestor as its own child
  • 13200: NPE in Map.setup() when attempting to dock main map
  • 13076: NPE in FlowView$FlowStrategy.layoutRow()
  • 12798: ClassCastException: NullCommand cannot be cast to AddPiece
  • 12648: Setup stack doesn’t recover from a piece build failure
  • 11827: NPE in SendToLocation.getSendLocation()
  • 11355: NPE in MassPieceLoader$MyTreeTable.getCellRenderer()
  • 3215: Global Options icons do not update themselves properly

Other improvements

  • 13325: Specify encoding for String conversion to and from bytes
  • 13301: Don’t rewrite save state when we already have it
  • 13290: Optimized serialization, unserialization
  • 13282: Stop logging debug messages by default
  • 13197: Reverted Mac hotkey change from 3.3.3-beta1

[size=150]Changes since 3.3.2[/size]

New features & improvements

  • 13276: Center on Moves is now a user preference instead of a module setting
  • 13251: Add Module name to Bug summary, extra info to comments
  • 13250: Add implementation of Missing !~ Beanshell operator
  • 13243: Add functionality to methods to be deprecated and removed gracefully
  • 13239: Right-click doesn’t pick up whole stack anymore
  • 13229: Performance: Save property map rather than clone pieces as snapshot
  • 13218: Allow a piece get its context menu click location
  • 13191: Add a “Search” command to the editor for searching the nodes/names/descriptions of a module
  • 13184: CounterDetailViewer can now display overlapping counters
  • 13174: Pieces in Piece Palettes (PieceSlots) can be given a scale factor
  • 13172: Undo button can now be assigned a hotkey by module designer
  • 13164: Upgrade Apache Commons libraries: commons-io 2.7, commons-codec 1.14, commons-lang3 3.10
  • 13149: “Band Select” Improvements: immobile pieces don’t “eat” band selects, and band-select gets Does-Not-Stack filter
  • 13129: New HTML Chatter with colors, fonts/bold/italic, image tags
  • 13124: Removed unused deprecated code
  • 13100: Replace Beanshell If function in Expression Builder with inline If ?:
  • 12999: Add Beanshell functions to generate Random results
  • 3199: Add separators to menus
  • 3042: Improved Retire/Resign/Switch Sides button flow
  • 1875: Movement Trail Enhancements: add commands to clear, turn on, turn off movement trails

Bug fixes

  • 13234: Rotation gets stuck due to floating point error
  • 13221: Data race in ConcurrentSoftHashMap.SoftValue.equals() and hashCode()
  • 13216: Adding regions to Irregular Grid via GUI editor was broken
  • 13205: NPE when trying to display file write failure dialog
  • 13199: MapShader using image throws InternalError on Linux
  • 13197: Hotkeys using Control should use Command on Macs
  • 13196: Ctrl+Click toggles rather than only deselects
  • 13178: Game Refresher does not handle Place Markers or Prototypes correctly
  • 13171: SetGlobalProperty makes menuCommands the wrong type of array
  • 13155: Correct Dutch translations
  • 13153: Consistently ask to start logging when loading a game
  • 13146: Custom classes that are children fail to be culled in PropertiesWindow.initialized (resulting in duplicate buildFile entries)
  • 13137: Drag Threshold was effectively 1 pixel except at 100% zoom, making double-click difficult; also added preference for drag threshold adjustment
  • 13123: “Mark When Moved” trait puts blank line in menu, even if Command field left completely empty
  • 13117: Help & HTML Charts scroll unnecessarily slowly with mouse wheel
  • 13060: Area Of Effect generates NPE if activated when piece is not on a Map
  • 13036: Entire contents of a deck can be inadvertently group-selected and moved
  • 13018: Fix incorrect ExpressionConfigurer in SetGlobalProperty config
  • 12972: Return to Location backMap and backPoint are not sent to clients or undone
  • 12980: Set Global Property: Beanshell incorrectly tries to “simplify” expression and generates incorrect result
  • 12970: Setting values of Old… variables are not encoded in a Command
  • 12952: Evalute $…$ strings in Property Match expressions on source pce
  • 12951: Undo of Send to Deck command does not return cards to hand in same state
  • 12948: Trigger action firing multiple Moved Fixed Distance, piece ends up in incorrect position
  • 12935: NPE in MoveReporter.shouldMarkMoved assuming nonnull map
  • 12888: NPE in BooleanConfigurer.setValue
  • 12576: At-Start stack attaches to first board listed in module, even if that board wasn’t selected by player and is inactive
  • 12554: Undo bug: Do not add the whole Stack to the DragBuffer
  • 12519: GlobalKeyCommand with Matching Properties does not apply ‘Fixed number of pieces’ to a Deck correctly
  • 12551: Movement Trails: locallyVisible repeatedly “initialized” resulting in buggy trail behavior
  • 10414: SVG with non-px dimensions throws ImageIOException
  • 10314: NPE in GameRefresher if dialog is closed quickly while test is running
  • 2705: NPE in FreeRotator.mouseDragged if piece was moved off-map

See the Release Notes for descriptions of the changes in 3.4.0-beta1.

[size=150]Minimum Requirements[/size]

VASSAL 3.4 requires Java 11 or later.

The Windows and Mac packages have an appropriate version of Java bundled with them, so there is no need to install Java separately on those operating systems. On Linux, use your package manager to install Java 11 or later.

[size=159]Help us test[/size]

Should you find any problems/oddities/bugs, please tell us so that we can
fix them for a future release of VASSAL.

Please report bugs in the Technical Support & Bugs category at the VASSAL forums.



I’m confused. Does this mean there will be no 3.3.3-beta2 (or final 3.3.3), i.e., 3.4.0-beta1 is in place of 3.3.3-beta2?

Correct on both counts. Sorry for any confusion.

We made the mistake of adding new features to version 3.3.3. This results in modules that can be created in v3.3.3 that will crash and burn and generate bug reports when run on versions v3.3.0, 1 or 2.

We made the decision to skip a v3.3.3 release and go straight to v3.4.0. The earlier Vassal 3.3 releases already ‘know’ they are not allowed to run v3.4 modules.

In the future, we will be sticking to a stricter release schedule where major releases (3.4, 3.5, 3.6) will be new feature releases and x.y.z releases will be bug fixes only.


Thus spake jrwatts:

I’m confused. Does this mean there will be no 3.3.3-beta2 (or final
3.3.3), i.e., 3.4.0-beta1 is in place of 3.3.3-beta2?

Exactly. The next full release will be 3.4.0.