Report Action on oldLayer_Name not working

After one of the recent updates of Vassal, some reporting functionality using Report Action no longer works as before.

I used Report Action on “oldLayer_Name”

$Name$ discarded $oldToken 1_Name$ token

This would for example return “Imperial Star Destroyer has discarded a brace token.”

But since “old” no longer works, it reports only Imperial Star Destroyer has discarded a token.

I can change it to remove “old” but then the reporting is pointless. The token was discarded, so there is nothing to report on.

Why was this functionality removed? It was very useful.

To expand on this:

There are 6 token types that can occupy a “slot” on each piece, each with two sides, for 12 named layers.

There is a 13th empty layer, which is what you get when a token is discarded rather than flipped. This layer isn’t named, bc nothing refers to it.

I COULD make an empty layer for each discarded token type, for a total of 18 layers instead of 13, but man is that clunky.

Each layer is tied to a Dynamic Property, so that would have to be changed as well.

Can we please bring back the old functionality?


Thanks for the bug report, the functionality was not removed intentionally. It is a side-effect if a fix of a seriously inefficient piece of code.

To help with investigation, could you please let me know which module it is you are talking about and exactly where in the module is the property ‘Token 1_Name’ defined?

It would also help if you could provide the last Vassal version you know of where the functionality works.


It is the Star Wars: Armada module.

The module is fairly large and complex. … rs:_Armada

This specific build: … .13.0.vmod

I can’t say the last version it worked. I was on 3.3.17 (IIRC) until very recently, then did some rapid updates. I’m now on 3.4.5.

The functionality is reused many places in the module. I suggest searching for “oldToken”

This is the code for ship defense tokens prototype. The actual layers are stored in a number of separate prototypes, based on various ship sizes (Small ship defense tokens, medium ship… etc.).

    < name="Defense token definitions">+/null/report;57\,715;$Name$ discarded $oldToken 4_Name$ token;;;Discard 4	report;56\,715;$Name$ discarded $oldToken 3_Name$ token;;;Discard 3\	report;55\,715;$Name$ discarded $oldToken 2_Name$ token;;;Discard 2\\	report;54\,715;$Name$ discarded $oldToken 1_Name$ token;;;Discard 1\\\	report;57\,195;$Name$ refreshed $oldToken 4_Name$ token;;;Refresh 4\\\\	report;56\,195;$Name$ refreshed $oldToken 3_Name$ token;;;Refresh 3\\\\\	report;55\,195;$Name$ refreshed $oldToken 2_Name$ token;;;Refresh 2\\\\\\	report;54\,195;$Name$ refreshed $oldToken 1_Name$ token;;;Refresh 1\\\\\\\	report;57\,130;$Name$ exhausted $oldToken 4_Name$ token;;;Exhaust 4\\\\\\\\	report;56\,130;$Name$ exhausted $oldToken 3_Name$ token;;;Exhaust 3\\\\\\\\\	report;55\,130;$Name$ exhausted $oldToken 2_Name$ token;;;Exhaust 2\\\\\\\\\\	report;54\,130;$Name$ exhausted $oldToken 1_Name$ token;;;Exhaust 1\\\\\\\\\\\	hideCmd;Block discard 4;Disable;{GetProperty("Token 4")==13};57\,715,57\,195,57\,130\\\\\\\\\\\\	hideCmd;Block discard 3;Disable;{GetProperty("Token 3")==13};56\,715,56\,195,56\,130\\\\\\\\\\\\\	hideCmd;Block discard 2;Disable;{GetProperty("Token 2")==13};55\,715,55\,195,55\,130\\\\\\\\\\\\\\	hideCmd;Block discard 1;Disable;{GetProperty("Token 1")==13};54\,715,54\,195,54\,130\\\\\\\\\\\\\\\	hideCmd;Block exhaust 4;Disable;{GetProperty("Token 3")==2||GetProperty("Token 3")==4||GetProperty("Token 3")==6||GetProperty("Token 3")==8||GetProperty("Token 3")==10||GetProperty("Token 4")==12};56\,130\\\\\\\\\\\\\\\\	hideCmd;Block exhaust 3;Disable;{GetProperty("Token 3")==2||GetProperty("Token 3")==4||GetProperty("Token 3")==6||GetProperty("Token 3")==8||GetProperty("Token 3")==10||GetProperty("Token 3")==12};56\,130\\\\\\\\\\\\\\\\\	hideCmd;Block exhaust 2;Disable;{GetProperty("Token 2")==2||GetProperty("Token 2")==4||GetProperty("Token 2")==6||GetProperty("Token 2")==8||GetProperty("Token 2")==10||GetProperty("Token 2")==12};55\,130\\\\\\\\\\\\\\\\\\	hideCmd;Block exhaust 1;Disable;{GetProperty("Token 1")==2||GetProperty("Token 1")==4||GetProperty("Token 1")==6||GetProperty("Token 1")==8||GetProperty("Token 1")==10||GetProperty("Token 1")==12};54\,130\\\\\\\\\\\\\\\\\\\	hideCmd;Block refresh 4;Disable;{GetProperty("Token 4")==1||GetProperty("Token 4")==3||GetProperty("Token 4")==5||GetProperty("Token 4")==7||GetProperty("Token 4")==9||GetProperty("Token 4")==11};57\,195\\\\\\\\\\\\\\\\\\\\	hideCmd;Block refresh 3;Disable;{GetProperty("Token 3")==1||GetProperty("Token 3")==3||GetProperty("Token 3")==5||GetProperty("Token 3")==7||GetProperty("Token 3")==9||GetProperty("Token 3")==11};56\,195\\\\\\\\\\\\\\\\\\\\\	hideCmd;Block refresh 2;Disable;{GetProperty("Token 2")==1||GetProperty("Token 2")==3||GetProperty("Token 2")==5||GetProperty("Token 2")==7||GetProperty("Token 2")==9||GetProperty("Token 2")==11};55\,195\\\\\\\\\\\\\\\\\\\\\\	hideCmd;Block refresh 1;Disable;{GetProperty("Token 1")==1||GetProperty("Token 1")==3||GetProperty("Token 1")==5||GetProperty("Token 1")==7||GetProperty("Token 1")==9||GetProperty("Token 1")==11};54\,195\\\\\\\\\\\\\\\\\\\\\\\	macro;Refresh token 4;;82,715;{GetProperty("Token 4")==2||GetProperty("Token 4")==4||GetProperty("Token 4")==6||GetProperty("Token 4")==8||GetProperty("Token 4")==10||GetProperty("Token 4")==12};;57\,195;false;;;counted;;;;false;;1;1\\\\\\\\\\\\\\\\\\\\\\\\	macro;Refresh token 3;;82,715;{GetProperty("Token 3")==2||GetProperty("Token 3")==4||GetProperty("Token 3")==6||GetProperty("Token 3")==8||GetProperty("Token 3")==10||GetProperty("Token 3")==12};;56\,195;false;;;counted;;;;false;;1;1\\\\\\\\\\\\\\\\\\\\\\\\\	macro;Refresh token 2;;82,715;{GetProperty("Token 2")==2||GetProperty("Token 2")==4||GetProperty("Token 2")==6||GetProperty("Token 2")==8||GetProperty("Token 2")==10||GetProperty("Token 2")==12};;55\,195;false;;;counted;;;;false;;1;1\\\\\\\\\\\\\\\\\\\\\\\\\\	macro;Refresh token 1;;82,715;{GetProperty("Token 1")==2||GetProperty("Token 1")==4||GetProperty("Token 1")==6||GetProperty("Token 1")==8||GetProperty("Token 1")==10||GetProperty("Token 1")==12};;54\,195;false;;;counted;;;;false;;1;1\\\\\\\\\\\\\\\\\\\\\\\\\\\	mark;token\\\\\\\\\\\\\\\\\\\\\\\\\\\\	submenu;Defense Token 1;Set Token 1,Exhaust token 1,Discard token 1,Refresh token 1\\\\\\\\\\\\\\\\\\\\\\\\\\\\\	submenu;Defense Token 2;Set Token 2,Exhaust token 2,Discard token 2,Refresh token 2\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\	submenu;Defense Token 3;Set Token 3,Exhaust token 3,Discard token 3,Refresh token 3\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\	submenu;Defense Token 4;Set Token 4,Exhaust token 4,Discard token 4,Refresh token 4\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\	submenu;Set Token 1;Set token 1 to Brace,Set token 1 to Contain,Set token 1 to Evade,Set token 1 to Redirect,Set token 1 to Salvo,Set token 1 to Scatter\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\	submenu;Set Token 2;Set token 2 to Brace,Set token 2 to Contain,Set token 2 to Evade,Set token 2 to Redirect,Set token 2 to Salvo,Set token 2 to Scatter\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\	submenu;Set Token 3;Set token 3 to Brace,Set token 3 to Contain,Set token 3 to Evade,Set token 3 to Redirect,Set token 3 to Salvo,Set token 3 to Scatter\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\	submenu;Set Token 4;Set token 4 to Brace,Set token 4 to Contain,Set token 4 to Evade,Set token 4 to Redirect,Set token 4 to Salvo,Set token 4 to Scatter\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\	PROP;Token 4;true,1,13,false;Set token 4 to Brace:63743\,0\,brc4:P\,1,Set token 4 to Contain:63743\,0\,cnt4:P\,3,Set token 4 to Evade:63743\,0\,evd4:P\,5,Set token 4 to Redirect:63743\,0\,red4:P\,7,Set token 4 to Scatter:63743\,0\,sct4:P\,9,Discard token 4:57\,715:I\,12,Exhaust token 4:57\,130:I\,1,Refresh token 4:57\,195:I\,-1,Set token 4 to Salvo:63743\,0\,sal4:P\,11\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\	PROP;Token 3;true,1,13,false;Set token 3 to Brace:63743\,0\,brc3:P\,1,Set token 3 to Contain:63743\,0\,cnt3:P\,3,Set token 3 to Evade:63743\,0\,evd3:P\,5,Set token 3 to Redirect:63743\,0\,red3:P\,7,Set token 3 to Scatter:63743\,0\,sct3:P\,9,Discard token 3:56\,715:I\,12,Exhaust token 3:56\,130:I\,1,Refresh token 3:56\,195:I\,-1,Set token 3 to Salvo:63743\,0\,sal3:P\,11\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\	PROP;Token 2;true,1,13,false;Set token 2 to Brace:63743\,0\,brc2:P\,1,Set token 2 to Contain:63743\,0\,cnt2:P\,3,Set token 2 to Evade:63743\,0\,evd2:P\,5,Set token 2 to Redirect:63743\,0\,red2:P\,7,Set token 2 to Scatter:63743\,0\,sct2:P\,9,Discard token 2:55\,715:I\,12,Exhaust token 2:55\,130:I\,1,Refresh token 2:55\,195:I\,-1,Set token 2 to Salvo:63743\,0\,sal2:P\,11\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\	PROP;Token 1;true,1,13,false;Set token 1 to Brace:63743\,0\,brc1:P\,1,Set token 1 to Contain:63743\,0\,cnt1:P\,3,Set token 1 to Evade:63743\,0\,evd1:P\,5,Set token 1 to Redirect:63743\,0\,red1:P\,7,Set token 1 to Scatter:63743\,0\,sct1:P\,9,Discard token 1:54\,715:I\,12,Exhaust token 1:54\,130:I\,1,Refresh token 1:54\,195:I\,-1,Set token 1 to Salvo:63743\,0\,sal1:P\,11\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\	piece;;;;/-1	-1\	-1\\	-1\\\	-1\\\\	-1\\\\\	-1\\\\\\	-1\\\\\\\	-1\\\\\\\\	-1\\\\\\\\\	-1\\\\\\\\\\	-1\\\\\\\\\\\	\\\\\\\\\\\\	\\\\\\\\\\\\\	\\\\\\\\\\\\\\	\\\\\\\\\\\\\\\	\\\\\\\\\\\\\\\\	\\\\\\\\\\\\\\\\\	\\\\\\\\\\\\\\\\\\	\\\\\\\\\\\\\\\\\\\	\\\\\\\\\\\\\\\\\\\\	\\\\\\\\\\\\\\\\\\\\\	\\\\\\\\\\\\\\\\\\\\\\	\\\\\\\\\\\\\\\\\\\\\\\	\\\\\\\\\\\\\\\\\\\\\\\\	\\\\\\\\\\\\\\\\\\\\\\\\\	\\\\\\\\\\\\\\\\\\\\\\\\\\	\\\\\\\\\\\\\\\\\\\\\\\\\\\	defense\\\\\\\\\\\\\\\\\\\\\\\\\\\\	\\\\\\\\\\\\\\\\\\\\\\\\\\\\\	\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\	\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\	\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\	\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\	\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\	\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\	\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\	13\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\	13\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\	13\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\	13\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\	null;334;63;

“Token 1_Name” is then defined in the following prototypes:

Small Ship Defense Tokens
Medium Ship Defense Tokens
Large Ship Defense Tokens
Huge Ship Defense Tokens

But you need only look at one, as the code is the same for all.

I see there is a version of Vassal 3.4.7

I don’t suppose updating would help?

Thus spake greenknight:

I see there is a version of Vassal 3.4.7

I don’t suppose updating would help?

It might make no difference for the problem you’re seeing, but we always
recommend using the most recent bugfix version for any major release.


Updated to 3.4.7

Saved module in new version.

Bug remains.

New data:

It worked in 3.2.17

It does not work in 3.4.3, which IIRC was the first update for the module since 3.2.17

Thanks for the info, working on a fix for 3.4.8.


Could you please supply a vlog file demonstrating the problem. I don’t know how to reproduce the issue using your module.


Here you can see me getting a Rebel starship from my pieces menu.

I then do 3 actions that would normally report as:

  • ASSAULT FRIGATE MK 2 exhausted [oldLayer_Name] token.
  • ASSAULT FRIGATE MK 2 refreshed [oldLayer_Name] token.
  • ASSAULT FRIGATE MK 2 discarded [oldLayer_Name] token.

But as you can see, it ignores oldLayer_Name.

I have managed to track down and fix this bug, we should have a test build for you to try soon.

The brave warriors of a Galaxy Far, Far Away salute you!

Works in 3.4.8

Well done guys!