Test builds for 3.3.0

Found another snag. Maybe no test builds for a few more days.

Map, Board, and StackMetrics are adjusted for HDPI support now. Still to go are GlobalMap, MenuDisplayer, PieceMover, and CounterDetailViewer.

CounterDetailViewer is adjusted now.

Current state of things:

  1. I have set up a VASSAL repo on github: github.com/uckelman/vassal

I had not been intending to do this for V3, on the assumption that by now we’d be working on V4; however, the work for V3.3 has reminded me of just how painful Subversion is in comparison with Git and I can’t stand it anymore.

I’m not abandoning our svn repo, but the rest of the work I do for V3.3 is going to happen using git and then be pushed back to svn later.

The two branches in the git repo are master, which is the same as master in svn at present, and hdpi, which is where I’md going the HiDPI work.

  1. Traditionally, one screen pixel has equaled one “user space” pixel. This changed when Apple introduced their “Retina” displays some years ago. On a Retina screen, each user-space pixel is twice as wide and twice as tall as a screen pixel—i.e., each user-space pixel corresponds to four screen pixels. Screens where user-space pixels correspond to multiple screen pixels are HiDPI screens.

Through Java 8, Java treated HiDPI displays as regular displays, which is why Java applications running in those versions of Java looked very small on HiDPI displays. Java 9 has HiDPI support for Swing components—a Swing application (as VASSAL is) running on Java 9 or later on a HiDPI display will look the right size, since the Swing components in Java 9 are drawn to allow for a difference betwen user and screen pixels. In order to accomplish this, how all the standard Swing components are drawn had to be modified. (Specifically, each component has to be aware that its user-space dimensions differ from its screen dimensions by a constant factor.) We get all this for free with the standard components when moving from Java 8 to Java 9—but we’re stuck undertaking that work for any custom components we have which draw themselves. One such component is the map. There are no standard Swing components which are even remotely close to being able to handle displaying game maps.

  1. With Java 8 on a HiDPI display, Swing applications are drawn at half scale. With Java 9 (or later) on a HiDPI display, Swing applications which haven’t been updated for HiDPI have their custom components drawn at user-space size but then upscaled to fill the pixels, with predictably crappy looking results. This has the virtue of keeping the applications nominally functional, but makes anything your application draws quite blurry. The correct solution is to paint on the basis of how many screen pixels you have to fill, so that no upscaling occurs. To take a concrete example: If a map is being displayed at 25% zoom on a HiDPI display where each user-space pixel is four screen pixels, then we need to treat the map’s zoom as 50% when drawing (25% map zoom * screen scale factor of 2).

That sounds simple, but in practice it is not—the reason being that drawing and component interaction had previously always taken place in the same coordinate space, so there are no indicators in the code for which are which, and coordinates originating from component interaction necesasrily get fed into drawing when doing things like dragging pieces.

  1. So, if you look at Map.java, you’ll find Map.View, which is the Swing component which displays the map. Map.View.paint(Graphics g) is the function which paints the map, and that’s where we have to start.

That Graphics is actually a Graphics2D, so you can cast it to one and get an AffineTransform from it:

  final Graphics2D g2d = (Graphics2D) g;
  final AffineTransform orig_t = g2d.getTransform();

If you’re running Java 8 or using a display which is not HiDPI and you check the scale elements of the AffineTransform (using getScaleX(), getScaleY()), you’ll find that they’re 1.0. If you’re using Java 9 or later on a HiDPI system, however (or setting the sun.java2d.uiScale property to simulate a HiDPI system—more on that later), you’ll find that your scale elements are 2.0. Now we see how exactly Java 9 handles upscaling custom Swing components which haven’t been modified for HiDPI support—it’s the scale factor on the AffineTransform which does it.

So, how do we adjust this to avoid upscaling and get crisp drawing back? What we need to do is save the AffineTransform we’re given and replace it with an indentity transform but then draw everything with an effective zoom that’s our actual map zoom multiplied by the scale factor the original AffineTransform had.

In service of this, I’ve expanded the coordinate space transformation functions in Map to handle conversions to and from drawing coordinates, because we have to deal with three coordinate spaces now—map, component, AND drawing, whereas previously component and drawing coordinates were always identical. These functions all have names of the form “aToB”, where “a” and “B” are coordinate spaces. E.g., componentToDrawing() converts component coordinates to drawing coordinates, while drawingToMap() converts drawing coordinates to map coordinates.)

Map.View.paint() doesn’t do much itself, but there we convert the visible rectangle from component space to drawing space before passing it on to Map.paintRegion():

  final Rectangle r = map.componentToDrawing(getVisibleRect());

Map.paintRegion() calls in succession the functions which clear the map border, paint the boards, and draw the pieces. What I’ve done in each of these is similar, so I’ll take Map.drawBoardsInRegion() as an exmaple and omit discussion of the others.

  public void drawBoardsInRegion(Graphics g,
                                 Rectangle visibleRect,
                                 Component c) {
    final double dzoom = getZoom() * os_scale;
    for (Board b : boards) {
      b.drawRegion(g, getLocation(b, dzoom), visibleRect, dzoom, c);
    }
  }

The change I’ve made is simply to the scale factor which gets passed on: It used to be Map.getZoom(), but is now getZoom() * os_scale (which is the HiDPI scale factor). That’s it. Everything further down this call tree is expecting to be told a scale factor and to draw at that scale factor, so by adjusting the scale factor here, it does the right thing. (*This is not 100% true, I had to make a small modification in Board.java as well, but for most things we draw it is true.)

  1. I’ve made a bunch of changes as in #4 which get us most of the way back to correct rendering. However, there are a few difficult components which involve both rendering and user interaction which are not yet done: GlobalMap, MenuDisplayer, PieceMover for sure; possibly also LOS_Thread, FreeRotator, MapCenterer.

In order to troubleshoot these, you need to run with Java 9 or later, and either use a HiDPI display OR set the sun.java2d.uiScale property to force Java to upscale your UI. The following has been my test setup:

  java -classpath lib/Vengine.jar --add-exports java.desktop/sun.java2d.cmm=ALL-UNNAMED -Dsun.java2d.uiScale=2 VASSAL.launch.Player --standalone ../mods/The_caucasus_campaign_1_2_1.vmod

(Note that 2 is likely the only value which makese sense for uiScale. 1 is just normal, so you won’t be able to troubleshoot that way. Non-integers seem not to work, and anyhow would be awful for aliasing if they did. 3 is way too huge.)

Particular problems:

  • GlobalMap is very broken. It needs a complete read-through.
  • MenuDisplayer handles showing context menus when you right-click. The problem to solve here is that the map jumps when you right-click under HiDPI.
  • PieceMover handles piece drags, among other things. The problem here is incorrect repainting behind drags.

There are likely to be other problems I have yet to find. I’d appreciate being made aware of those and shown how to reproduce them.

  1. If you’d like to help with this, clone the git repo and start reading through the relevant code.

Baseline : git commit id 29c901de8cfd8a93cd144a3d509d1f021b55e57c

I could not do a proper compile of ImageIOImageLoader due to a missing class named sun.java2d.cmm.ProfileDeferralMgr.

Well I ran the tests on my Windows Box with different JDKs and I noticed these things

TileToImageTest :: testTileToImage - differs but image looks the same
→ maybe read in.png and out.png again and compare the loaded Image ?

ProcessCallableTest :: testNormal differs by 1 byte (longer on windows) and the test contains ‘\n’ sequences so most likely OS dependent test.

VASSAL.test.AllTests

  • may be required due to using make.
  • IDE integration (here Eclipse) complains about its presence.

Baseline : git commit id 7255ef7cadb977f0d3b86ab6499def27ec224760

Situation is basically the same, but when running the tests on Java 14
TileToImageTest :: testTileToImage is green.

Here is an observation on the code:

A lot of felt weight comes from dispersed explicit low-level math.
Basically we have a super tight coupling with Framework code.
So these calculations are treated 2nd class compared to libary code.

Decoupling stuff and treating 2d-Math as the core-domain of Vassal-the-UI-Library will help.
We are talking about Vassal specific representations of Point, Rectangle or Dimenions, etc.

I would start with Vassal.internal.math.Rectangle2D class as there is a lot of drawing / collission code that can be moved to a dedicated spot. Once that is out of the way a clearer picture will emerge.

Seamless integration is key. So being able to “cast” between Vassal / AWT / Swing types is crucial.
So getting back to AWT / Swing should be a simple .toAWT() or .toSwing() call on the Vassal-Object.
Active refactorings will quickly make the actual functionality emerge - so don’t worry too much about it.

Unless we’re talking about FULL images the memory offset is effectively neglectible.
However there are significant effects to development speed due to readability, testability and comfort.

I had multiple instances where performing such changes had multiple positive effects at the same time that sound contradicting in the first place:

  • reduced technical complexity of an application code
  • extending feature-complexity drastically
  • performance gains - probably because the Hotspot JVM Compiler kicked in for the first time

I’ve fixed the problems with display of context menus and repainting while dragging and scrolling (which I thought were with MenuDisplayer and PieceMover, but turned out to be due to an oversight in handling the AffineTransform in Map.View.paint()).

Left to fix are GlobalMap, LOS_Thread, FreeRotator.

GlobalMap is fixed now.

FreeRotator is fixed now.

Started looking at PieceMover, however it is quite a beast to understand.

Thus spake AlisterMcLane via messages:

Started looking at PieceMover, however it is quite a beast to
understand.

No need. It turned out that there was nothing to fix in PieceMover.

What’s on the hdpi branch presently has fixes for every problem I’ve
found save for the repaint problem in LOS_Thread I’m working on at
the moment.


J.

I’ve now fixed every HiDPI problem I’ve seen.

Please try the 3.3.0-svn9303 builds here: vassalengine.org/~uckelman/tmp/

New test build: 3.3.0-svn9324. vassalengine.org/~uckelman/tmp/

Please give this a try. This needs some testing with a variety of modules before we can release it as 3.3.0. I am not confident that I caught all of the HiDPI problems, so if you find a rendering bug and you’re using a HiDPI display, PLEASE let me know what it was and how to reproduce it.

Hi,

Is the github.com/uckelman/vassal supposed to work on mac ? i tried the launch “ModuleManager” the module start i see the module windows and then the app close itself with no errors.

Thus spake burzum51:

Hi,

Is the github.com/uckelman/vassal[1] supposed to work on mac ? i
tried the launch “ModuleManager” the module start i see the module
windows and then the app close itself with no errors.

(That’s the link to the page on github btw, not to the test builds.)

We need more details about what exactly you’re doing to be able to say
whether it should work.

  • What are you running?
  • How are you runniung it?
  • What’s in the errorLog after it fails?


J.

I would like to try to run vassal is nthe lastest build to check my eclipse conf.

Il run the main of the “ModuleManager” class in ecplise with JDK 14 on an mac os.

I have no error log and don’t know if the is a log file supposed to be somewhere

nevermind it’s working.

Just started using VASSAL version 3.3.0-svn9324 - which I installed directly over an installation of VASSAL v3.2.17 that was working.

Platform. MacBook Pro (13-inch, Mid 2012), macOS Catalina 10.15.4

In my test, I was using Commands & Colors Medieval module v1.4, playing through a .vlog created under Vassal 3.2.17, C&CM module v1.3. The crash occurred part way through replaying the (short) log file. I may have clicking on and/or moved the vassal window immediately prior to the crash. I have not been able to reproduce the crash so far.

vlog here… dropbox.com/s/uf94w3slt14m3 … .vlog?dl=0

I had successfully played through the same .vlog moments earlier.

Log follows below.
2020-03-27 10:31:52,000 [0-main] INFO VASSAL.launch.StartUp - Starting
2020-03-27 10:31:52,004 [0-main] INFO VASSAL.launch.StartUp - OS Mac OS X 10.15.4
2020-03-27 10:31:52,005 [0-main] INFO VASSAL.launch.StartUp - Java version 13.0.1
2020-03-27 10:31:52,005 [0-main] INFO VASSAL.launch.StartUp - VASSAL version 3.3.0-svn9324
2020-03-27 10:31:52,107 [0-AWT-EventQueue-0] INFO VASSAL.launch.ModuleManager - Manager
2020-03-27 10:34:07,016 [0-SwingWorker-pool-1-thread-1] INFO VASSAL.launch.AbstractLaunchAction - Loading module file /Users/mark/Dropbox/Vassal Modules/CCMedievalV1_4.vmod
2020-03-27 10:34:07,641 [0-SwingWorker-pool-1-thread-1] INFO VASSAL.tools.io.ProcessLauncher - launching /Applications/VASSAL.app/Contents/MacOS/jre/bin/java -classpath Contents/Resources/Java/Vengine.jar -Xmx164M -DVASSAL.id=2 -Duser.home=/Users/mark -DVASSAL.port=52075 VASSAL.tools.image.tilecache.ZipFileImageTiler /Users/mark/Dropbox/Vassal Modules/CCMedievalV1_4.vmod /Users/mark/Library/Application Support/VASSAL/tiles/bfbdbd9ba26b0524a61bebcf0c6d8a60576d6df1 256 256
2020-03-27 10:34:08,863 [2-main] INFO VASSAL.tools.image.tilecache.ZipFileImageTiler - Starting
2020-03-27 10:34:09,118 [2-main] INFO VASSAL.tools.image.tilecache.FileArchiveImageTiler - Tiling images/CCM.Terrain.Chart.v1.0.png
2020-03-27 10:34:09,861 [2-main] INFO VASSAL.tools.image.tilecache.FileArchiveImageTiler - Tiling images/Chart.Terrain.Gates.v1.0.png
2020-03-27 10:34:10,179 [2-main] INFO VASSAL.tools.image.tilecache.FileArchiveImageTiler - Tiling images/box-cover.jpg
2020-03-27 10:34:10,548 [2-main] INFO VASSAL.tools.image.tilecache.FileArchiveImageTiler - Tiling images/card_00_back.gif
2020-03-27 10:34:10,835 [2-main] INFO VASSAL.tools.image.tilecache.FileArchiveImageTiler - Tiling images/card_ambush.gif
2020-03-27 10:34:11,072 [2-main] INFO VASSAL.tools.image.tilecache.FileArchiveImageTiler - Tiling images/card_clashofshields.gif
2020-03-27 10:34:11,189 [2-main] INFO VASSAL.tools.image.tilecache.FileArchiveImageTiler - Tiling images/card_commandcenter.gif
2020-03-27 10:34:11,302 [2-main] INFO VASSAL.tools.image.tilecache.FileArchiveImageTiler - Tiling images/card_commandleft.gif
2020-03-27 10:34:11,417 [2-main] INFO VASSAL.tools.image.tilecache.FileArchiveImageTiler - Tiling images/card_commandright.gif
2020-03-27 10:34:11,513 [2-main] INFO VASSAL.tools.image.tilecache.FileArchiveImageTiler - Tiling images/card_coordinatedattack.gif
2020-03-27 10:34:11,614 [2-main] INFO VASSAL.tools.image.tilecache.FileArchiveImageTiler - Tiling images/card_counterattack.gif
2020-03-27 10:34:11,762 [2-main] INFO VASSAL.tools.image.tilecache.FileArchiveImageTiler - Tiling images/card_cryavoc.gif
2020-03-27 10:34:11,876 [2-main] INFO VASSAL.tools.image.tilecache.FileArchiveImageTiler - Tiling images/card_darkenthesky.gif
2020-03-27 10:34:11,992 [2-main] INFO VASSAL.tools.image.tilecache.FileArchiveImageTiler - Tiling images/card_doubletime.gif
2020-03-27 10:34:12,089 [2-main] INFO VASSAL.tools.image.tilecache.FileArchiveImageTiler - Tiling images/card_fireandclose.gif
2020-03-27 10:34:12,355 [2-main] INFO VASSAL.tools.image.tilecache.FileArchiveImageTiler - Tiling images/card_firststrike.gif
2020-03-27 10:34:12,458 [2-main] INFO VASSAL.tools.image.tilecache.FileArchiveImageTiler - Tiling images/card_footonslaught.gif
2020-03-27 10:34:12,580 [2-main] INFO VASSAL.tools.image.tilecache.FileArchiveImageTiler - Tiling images/card_forward.gif
2020-03-27 10:34:12,661 [2-main] INFO VASSAL.tools.image.tilecache.FileArchiveImageTiler - Tiling images/card_grid_0.png
2020-03-27 10:34:12,984 [2-main] INFO VASSAL.tools.image.tilecache.FileArchiveImageTiler - Tiling images/card_grid_4.png
2020-03-27 10:34:13,411 [2-main] INFO VASSAL.tools.image.tilecache.FileArchiveImageTiler - Tiling images/card_grid_5.png
2020-03-27 10:34:13,728 [2-main] INFO VASSAL.tools.image.tilecache.FileArchiveImageTiler - Tiling images/card_grid_6.png
2020-03-27 10:34:14,041 [2-main] INFO VASSAL.tools.image.tilecache.FileArchiveImageTiler - Tiling images/card_leaders.gif
2020-03-27 10:34:14,202 [2-main] INFO VASSAL.tools.image.tilecache.FileArchiveImageTiler - Tiling images/card_leadershipany.gif
2020-03-27 10:34:14,275 [2-main] INFO VASSAL.tools.image.tilecache.FileArchiveImageTiler - Tiling images/card_leadershipcenter.gif
2020-03-27 10:34:14,354 [2-main] INFO VASSAL.tools.image.tilecache.FileArchiveImageTiler - Tiling images/card_leadershipleft.gif
2020-03-27 10:34:14,458 [2-main] INFO VASSAL.tools.image.tilecache.FileArchiveImageTiler - Tiling images/card_leadershipright.gif
2020-03-27 10:34:14,546 [2-main] INFO VASSAL.tools.image.tilecache.FileArchiveImageTiler - Tiling images/card_linecommand.gif
2020-03-27 10:34:14,629 [2-main] INFO VASSAL.tools.image.tilecache.FileArchiveImageTiler - Tiling images/card_mountedcharge.gif
2020-03-27 10:34:14,721 [2-main] INFO VASSAL.tools.image.tilecache.FileArchiveImageTiler - Tiling images/card_movefiremove.gif
2020-03-27 10:34:14,816 [2-main] INFO VASSAL.tools.image.tilecache.FileArchiveImageTiler - Tiling images/card_order2center.gif
2020-03-27 10:34:14,908 [2-main] INFO VASSAL.tools.image.tilecache.FileArchiveImageTiler - Tiling images/card_order2left.gif
2020-03-27 10:34:14,995 [2-main] INFO VASSAL.tools.image.tilecache.FileArchiveImageTiler - Tiling images/card_order2right.gif
2020-03-27 10:34:15,088 [2-main] INFO VASSAL.tools.image.tilecache.FileArchiveImageTiler - Tiling images/card_order3center.gif
2020-03-27 10:34:15,166 [2-main] INFO VASSAL.tools.image.tilecache.FileArchiveImageTiler - Tiling images/card_order3left.gif
2020-03-27 10:34:15,270 [2-main] INFO VASSAL.tools.image.tilecache.FileArchiveImageTiler - Tiling images/card_order3right.gif
2020-03-27 10:34:15,351 [2-main] INFO VASSAL.tools.image.tilecache.FileArchiveImageTiler - Tiling images/card_orderheavytroops.gif
2020-03-27 10:34:15,432 [2-main] INFO VASSAL.tools.image.tilecache.FileArchiveImageTiler - Tiling images/card_orderlighttroops.gif
2020-03-27 10:34:15,511 [2-main] INFO VASSAL.tools.image.tilecache.FileArchiveImageTiler - Tiling images/card_ordermediumtroops.gif
2020-03-27 10:34:15,592 [2-main] INFO VASSAL.tools.image.tilecache.FileArchiveImageTiler - Tiling images/card_outflanked.gif
2020-03-27 10:34:15,676 [2-main] INFO VASSAL.tools.image.tilecache.FileArchiveImageTiler - Tiling images/card_rally.gif
2020-03-27 10:34:15,757 [2-main] INFO VASSAL.tools.image.tilecache.FileArchiveImageTiler - Tiling images/card_scout.gif
2020-03-27 10:34:15,843 [2-main] INFO VASSAL.tools.image.tilecache.FileArchiveImageTiler - Tiling images/ccm-ref-sheet-base1.jpg
2020-03-27 10:34:16,058 [2-main] INFO VASSAL.tools.image.tilecache.FileArchiveImageTiler - Tiling images/ccm-ref-sheet-base2.jpg
2020-03-27 10:34:16,201 [2-main] INFO VASSAL.tools.image.tilecache.FileArchiveImageTiler - Tiling images/ccm-ref-sheet-inspired-byz.jpg
2020-03-27 10:34:16,517 [2-main] INFO VASSAL.tools.image.tilecache.FileArchiveImageTiler - Tiling images/ccm-ref-sheet-inspired-sas.jpg
2020-03-27 10:34:16,852 [2-main] INFO VASSAL.tools.image.tilecache.FileArchiveImageTiler - Tiling images/ccn_map_hq.jpg
2020-03-27 10:34:18,489 [2-main] INFO VASSAL.tools.image.tilecache.FileArchiveImageTiler - Tiling images/dicefootprint.png
2020-03-27 10:34:18,501 [2-main] INFO VASSAL.tools.image.tilecache.FileArchiveImageTiler - Tiling images/side_purple.png
2020-03-27 10:34:18,512 [2-main] INFO VASSAL.tools.image.tilecache.FileArchiveImageTiler - Tiling images/side_tan.png
2020-03-27 10:34:18,520 [2-main] INFO VASSAL.tools.image.tilecache.FileArchiveImageTiler - Tiling images/sidemap.png
2020-03-27 10:34:18,995 [2-main] INFO VASSAL.tools.image.tilecache.FileArchiveImageTiler - Tiling images/tan side.png
2020-03-27 10:34:19,002 [2-main] INFO VASSAL.tools.image.tilecache.FileArchiveImageTiler - Tiling images/victrack-5.png
2020-03-27 10:34:19,049 [2-main] INFO VASSAL.tools.image.tilecache.FileArchiveImageTiler - Tiling images/victrack-6.png
2020-03-27 10:34:19,098 [2-main] INFO VASSAL.tools.image.tilecache.FileArchiveImageTiler - Tiling images/victrack-7.png
2020-03-27 10:34:19,157 [2-main] INFO VASSAL.tools.image.tilecache.FileArchiveImageTiler - Tiling images/victrack-8.png
2020-03-27 10:34:19,193 [2-main] INFO VASSAL.tools.image.tilecache.FileArchiveImageTiler - Tiling images/victrack-9.png
2020-03-27 10:34:19,244 [2-main] INFO VASSAL.tools.image.tilecache.ZipFileImageTiler - Exiting
2020-03-27 10:34:19,652 [0-SwingWorker-pool-1-thread-1] INFO VASSAL.launch.AbstractLaunchAction - Loading module Commands & Colors Medieval
2020-03-27 10:34:19,700 [0-SwingWorker-pool-1-thread-1] INFO VASSAL.tools.io.ProcessLauncher - launching /Applications/VASSAL.app/Contents/MacOS/jre/bin/java -Xms256M -Xmx512M -DVASSAL.id=1 -DVASSAL.port=52087 -Duser.home=/Users/mark -Duser.dir=/Applications/VASSAL.app -cp Contents/Resources/Java/Vengine.jar -Xdock:name=Commands & Colors Medieval -Xdock:icon=/Applications/VASSAL.app/Contents/Resources/VASSAL.icns VASSAL.launch.Player --load – /Users/mark/Dropbox/Vassal Modules/CCMedievalV1_4.vmod
2020-03-27 10:34:23,396 [1-main] INFO VASSAL.launch.StartUp - Starting
2020-03-27 10:34:23,399 [1-main] INFO VASSAL.launch.StartUp - OS Mac OS X 10.15.4
2020-03-27 10:34:23,400 [1-main] INFO VASSAL.launch.StartUp - Java version 13.0.1
2020-03-27 10:34:23,400 [1-main] INFO VASSAL.launch.StartUp - VASSAL version 3.3.0-svn9324
2020-03-27 10:34:23,400 [1-main] INFO VASSAL.launch.Launcher - Player
2020-03-27 10:34:27,536 [1-IconFactory-preload] INFO VASSAL.tools.icon.IconFactory - VASSAL images folder found at jar:file:/Applications/VASSAL.app/Contents/Resources/Java/Vengine.jar!/images/
2020-03-27 10:34:27,540 [1-IconFactory-preload] INFO VASSAL.tools.icon.IconFactory - Icon family VASSAL created for VASSAL.svg
2020-03-27 10:34:27,541 [1-IconFactory-preload] INFO VASSAL.tools.icon.IconFactory - Icon family VASSAL-jabber created for VASSAL-jabber.png
2020-03-27 10:34:27,541 [1-IconFactory-preload] INFO VASSAL.tools.icon.IconFactory - Icon family network-idle created for network-idle.svg
2020-03-27 10:34:27,541 [1-IconFactory-preload] INFO VASSAL.tools.icon.IconFactory - Icon family yes created for yes.svg
2020-03-27 10:34:27,541 [1-IconFactory-preload] INFO VASSAL.tools.icon.IconFactory - Icon family go-down created for go-down.svg
2020-03-27 10:34:27,542 [1-IconFactory-preload] INFO VASSAL.tools.icon.IconFactory - Icon family bug created for bug.svg
2020-03-27 10:34:27,542 [1-IconFactory-preload] INFO VASSAL.tools.icon.IconFactory - Icon family no created for no.svg
2020-03-27 10:34:27,542 [1-IconFactory-preload] INFO VASSAL.tools.icon.IconFactory - Icon family calculator created for calculator.svg
2020-03-27 10:34:27,542 [1-IconFactory-preload] INFO VASSAL.tools.icon.IconFactory - Icon family jabber created for jabber.png
2020-03-27 10:34:27,543 [1-IconFactory-preload] INFO VASSAL.tools.icon.IconFactory - Icon family go-up created for go-up.svg
2020-03-27 10:34:27,544 [1-IconFactory-preload] INFO VASSAL.tools.icon.IconFactory - Icon family network-server created for network-server.svg
2020-03-27 10:34:31,556 [1-AWT-EventQueue-0] WARN VASSAL.launch.BasicModule - Commands & Colors Medieval version 1.4
2020-03-27 10:37:51,855 [1-AWT-EventQueue-0] INFO VASSAL.build.module.GameState - Loading save game /Users/mark/Dropbox/C&C Medieval PBEM - James & Mark/GI03-Vulturnus2 016.vlog, created with module version 1.3
2020-03-27 10:44:47,089 [1-AWT-EventQueue-0] INFO VASSAL.build.GameModule - Exiting
2020-03-27 10:44:50,789 [0-SwingWorker-pool-1-thread-2] INFO VASSAL.launch.AbstractLaunchAction - Loading module file /Users/mark/Dropbox/Vassal Modules/CCMedievalV1_4.vmod
2020-03-27 10:44:50,909 [0-SwingWorker-pool-1-thread-2] INFO VASSAL.launch.TilingHandler - No images to tile.
2020-03-27 10:44:50,910 [0-SwingWorker-pool-1-thread-2] INFO VASSAL.launch.AbstractLaunchAction - Loading module Commands & Colors Medieval
2020-03-27 10:44:50,911 [0-SwingWorker-pool-1-thread-2] INFO VASSAL.tools.io.ProcessLauncher - launching /Applications/VASSAL.app/Contents/MacOS/jre/bin/java -Xms256M -Xmx512M -DVASSAL.id=3 -DVASSAL.port=52229 -Duser.home=/Users/mark -Duser.dir=/Applications/VASSAL.app -cp Contents/Resources/Java/Vengine.jar -Xdock:name=Commands & Colors Medieval -Xdock:icon=/Applications/VASSAL.app/Contents/Resources/VASSAL.icns VASSAL.launch.Player --load – /Users/mark/Dropbox/Vassal Modules/CCMedievalV1_4.vmod
2020-03-27 10:44:54,973 [3-main] INFO VASSAL.launch.StartUp - Starting
2020-03-27 10:44:54,976 [3-main] INFO VASSAL.launch.StartUp - OS Mac OS X 10.15.4
2020-03-27 10:44:54,976 [3-main] INFO VASSAL.launch.StartUp - Java version 13.0.1
2020-03-27 10:44:54,977 [3-main] INFO VASSAL.launch.StartUp - VASSAL version 3.3.0-svn9324
2020-03-27 10:44:54,977 [3-main] INFO VASSAL.launch.Launcher - Player
2020-03-27 10:44:59,457 [3-IconFactory-preload] INFO VASSAL.tools.icon.IconFactory - VASSAL images folder found at jar:file:/Applications/VASSAL.app/Contents/Resources/Java/Vengine.jar!/images/
2020-03-27 10:44:59,462 [3-IconFactory-preload] INFO VASSAL.tools.icon.IconFactory - Icon family VASSAL created for VASSAL.svg
2020-03-27 10:44:59,462 [3-IconFactory-preload] INFO VASSAL.tools.icon.IconFactory - Icon family VASSAL-jabber created for VASSAL-jabber.png
2020-03-27 10:44:59,462 [3-IconFactory-preload] INFO VASSAL.tools.icon.IconFactory - Icon family network-idle created for network-idle.svg
2020-03-27 10:44:59,462 [3-IconFactory-preload] INFO VASSAL.tools.icon.IconFactory - Icon family yes created for yes.svg
2020-03-27 10:44:59,462 [3-IconFactory-preload] INFO VASSAL.tools.icon.IconFactory - Icon family go-down created for go-down.svg
2020-03-27 10:44:59,462 [3-IconFactory-preload] INFO VASSAL.tools.icon.IconFactory - Icon family bug created for bug.svg
2020-03-27 10:44:59,462 [3-IconFactory-preload] INFO VASSAL.tools.icon.IconFactory - Icon family no created for no.svg
2020-03-27 10:44:59,463 [3-IconFactory-preload] INFO VASSAL.tools.icon.IconFactory - Icon family calculator created for calculator.svg
2020-03-27 10:44:59,463 [3-IconFactory-preload] INFO VASSAL.tools.icon.IconFactory - Icon family jabber created for jabber.png
2020-03-27 10:44:59,463 [3-IconFactory-preload] INFO VASSAL.tools.icon.IconFactory - Icon family go-up created for go-up.svg
2020-03-27 10:44:59,463 [3-IconFactory-preload] INFO VASSAL.tools.icon.IconFactory - Icon family network-server created for network-server.svg
2020-03-27 10:45:02,585 [3-AWT-EventQueue-0] WARN VASSAL.launch.BasicModule - Commands & Colors Medieval version 1.4
2020-03-27 10:47:22,762 [3-AWT-EventQueue-0] INFO VASSAL.build.module.GameState - Loading save game /Users/mark/Dropbox/C&C Medieval PBEM - James & Mark/010 Decimum Phase2 014.vlog, created with module version 1.3
2020-03-27 10:54:26,025 [3-AWT-EventQueue-0] INFO VASSAL.build.module.GameState - Loading save game /Users/mark/Dropbox/010 Decimum Phase2 015.vlog, created with module version 1.4
2020-03-27 10:54:52,726 [3-AWT-EventQueue-0] INFO VASSAL.build.module.GameState - Loading save game /Users/mark/Dropbox/C&C Medieval PBEM - James & Mark/010 Decimum Phase2 015.vlog, created with module version 1.4
2020-03-27 10:56:27,010 [3-AWT-EventQueue-0] INFO VASSAL.script.ExpressionInterpreter - Attempting to load /VASSAL/script/init_expression.bsh URI generated=jar:file:/Applications/VASSAL.app/Contents/Resources/Java/Vengine.jar!/VASSAL/script/init_expression.bsh
2020-03-27 10:57:27,329 [3-AWT-EventQueue-0] INFO VASSAL.build.module.GameState - Loading save game /Users/mark/Dropbox/010 Decimum Phase2 015.vlog, created with module version 1.4
2020-03-27 10:57:50,784 [3-Thread-8] ERROR VASSAL.tools.ErrorDialog -
javazoom.jl.decoder.BitstreamException: Bitstream errorcode 102
at javazoom.jl.decoder.Bitstream.newBitstreamException(Unknown Source)
at javazoom.jl.decoder.Bitstream.readFrame(Unknown Source)
at javazoom.jl.player.Player.decodeFrame(Unknown Source)
at javazoom.jl.player.Player.play(Unknown Source)
at javazoom.jl.player.Player.play(Unknown Source)
at VASSAL.tools.Mp3AudioClip$1.run(Mp3AudioClip.java:100)

Ref above crash report - https://forum.vassalengine.org/t/test-builds-for-3-3-0/10056/91

I have reproduced the problem a couple of times in about 10 re-tries. Both times I had resized the board window part way through the replay and the crash happened when I resumed playing.