VASSAL 3.4.0 Released

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

The VASSAL Team is happy to announce the release of VASSAL 3.4.0.


  • 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.2[/size]

New features

  • 13313: Specify VM options for Player via a file
  • 13275: Ctrl+Mousewheel to zoom
  • 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
  • 13174: Pieces in Piece Palettes (PieceSlots) can be given a scale factor
  • 13172: Undo button can now be assigned a hotkey by module designer
  • 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
  • 12999: Add Beanshell functions to generate Random results
  • 3199: Add separators to menus
  • 1875: Movement Trail Enhancements: add commands to clear, turn on, turn off movement trails

Bug fixes

  • 13358: Prevent units in Zones setting OldLocationName incorrectly
  • 13356: Game refresher should not copy marker state
  • 13351: SequenceEncoder.Decoder.copy() should use start offset from parent
  • 13329: Don’t create new GPIDs for temporary pieceslots
  • 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 Embellishment0.getCurrentImage()
  • 13280: NPE in KeyStrokeListener.keyPressed()
  • 13236: StackOverflowError: Expressions and Formatted Strings can infinite-loop
  • 13234: Rotation gets stuck due to floating point error
  • 13221: Data race in ConcurrentSoftHashMap.SoftValue.equals() and hashCode()
  • 13217: Editor: Prevent pasting a cut ancestor as its own child
  • 13216: Adding regions to Irregular Grid via GUI editor was broken
  • 13205: NPE when trying to display file write failure dialog
  • 13200: NPE in Map.setup() when attempting to dock main map
  • 13199: MapShader using image throws InternalError on Linux
  • 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
  • 13134: Some characters in Text Labels render poorly at 8pt on Windows in 3.3+
  • 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
  • 13076: NPE in FlowView$FlowStrategy.layoutRow()
  • 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
  • 12980: Set Global Property: Beanshell incorrectly tries to “simplify” expression and generates incorrect result
  • 12972: Return to Location backMap and backPoint are not sent to clients or undone
  • 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
  • 12798: ClassCastException: NullCommand cannot be cast to AddPiece
  • 12648: Setup stack doesn’t recover from a piece build failure
  • 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
  • 12551: Movement Trails: locallyVisible repeatedly “initialized” resulting in buggy trail behavior
  • 12519: GlobalKeyCommand with Matching Properties does not apply ‘Fixed number of pieces’ to a Deck correctly
  • 11827: NPE in SendToLocation.getSendLocation()
  • 11355: NPE in MassPieceLoader$MyTreeTable.getCellRenderer()
  • 10414: SVG with non-px dimensions throws ImageIOException
  • 10314: NPE in GameRefresher if dialog is closed quickly while test is running
  • 3215: Global Options icons do not update themselves properly
  • 2714: NPE in StackMetrics.merge()
  • 2705: NPE in FreeRotator.mouseDragged if piece was moved off-map
  • 2377: NPE in Decorator.getOutermost() caused by PlaceMarker

Other improvements

  • 13371: Render text labels directly at the required size rather than rendering at 100% and scaling
  • 13332: Improved save game write time
  • 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
  • 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
  • 13184: CounterDetailViewer can now display overlapping counters
  • 13164: Upgrade Apache Commons libraries: commons-io 2.7, commons-codec 1.14, commons-lang3 3.10
  • 13124: Removed unused deprecated code
  • 13100: Replace Beanshell If function in Expression Builder with inline If ?:
  • 3042: Improved Retire/Resign/Switch Sides button flow

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

[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.



It is mentioned in the release notes above, but worth calling out that there is a wiki article with a “visual tour of the new features” at … ease_Notes

Hi, I’m a Mac user and I have the following problem with the new release .dmg file. After launching it and copying the .app file to the Applications folder, the Finder does not show it. However I find it with the Finder Search, but I can’t launch it, not even with the right mouse click on the Open menu: I always get the message “Cannot open because the developer cannot be verified”.

Hi Emmaus - you should be able to, after locating it in a Finder window (you have to use the Finder window specifically the first time), that you can then Open, and although you will receive a very similar warning about “because the developer cannot be verified”, it will offer an “Open” button. After the first time you won’t need to do this special procedure again, and should be able to open from e.g. Applications folder.

Alternatively, after you have receive the cannot open message you can go to the Apple menu, and go to “System Preferences → Security & Privacy”. and on the “General” tab at the bottom it will say “VASSAL was blocked from opening because it is not from an identified developer.” and there will be a button for “Open Anyway”. (If the “Lock” icon at the lower left is marked locked you will have to first click on it to unlock and enter your password). As with the first open, if you do this once you shouldn’t have any problems after that.

There are some screenshots of the two version of this process at the bottom of the page here: … n_Problems



Hi Cattlesquat thanks for your information with which I solved.