Okay, it’s possible I won’t do what you want, but who cares.
I load a scenario, and it has 12 blocks scattered on the map. They could be masked; I don’t care. There may be more or less than 12; I don’t care. Everybody knows what’s where. Each block has a right click command. If I right click any block, it first sends the GKC “alpha” to every block. Then it sends “beta.” This causes all blocks to shuffle so everybody is (probably) in a different block spot, but no one will know it happened. It’s magic.
An overview of how it works: When each block gets the alpha command, it does place-marker. It creates a piece I call a “bogus” piece because it’s not like a real piece. A bogus piece saves its (x,y) location and then sends itself to a special always-shuffle bogus deck. When done, the deck will have 12 pieces.
When each block gets the beta command, it summons a random piece from the bogus deck at the same time loading its UniqueID into the bogus piece. The bogus piece tells its summoner (via the UniqueID) its (x,y). The bogus guy deletes itself, and the block goes to this new (x,y). Below are the gory details.
First, I create a deck called BogusDeck. It always shuffles.
I create a prototype called Bogus. It defines an invisible piece that is not like the pieces we know and love. It is simply an information container. Here’s what it looks like.
prototype Bogus
Dynamic property myX command set = $CurrentX$
Dynamic property myY command set = $CurrentY$
return-to-deck BogusDeck
Trigger STORE
…set
…return-to-deck BogusDeck
//
Dynamic property caller
Trigger SUMMON
…set-piece-property
…Delete
Set-piece-property
Delete trait.
Block has 2 new dynamic properties: newBlockX and newBlockY.
When it gets the alpha GKC, it does place-marker. The marker is a new piece, no image, prototype Bogus. It sends STORE to the bogus piece. The bogus piece stores its (x,y) location, which is the block’s location. It then goes to BogusDeck. Every other block does the same thing, so BogusDeck has 12 bogus pieces with each holding a unique (x,y).
Then the right-clicked block sends a beta GKC to all blocks. A block that receives beta sends SUMMON to BogusDeck. It says get one piece, and it also downloads its property UniqueID into the bogus piece’s “caller” dynamic property.
The bogus piece does set-piece-property with the matching expression:
{ UniqueID == “$caller$” }. It sets newBlockX=myX and newBlockY=myY. i..e. it’s downloading a new (x,y) into the block. The block then simply goes to (newBlockX, newBlockY).
When it’s all done, all blocks will have changed places, and BogusDeck is empty. BTW, I would either restrict what goes into BogusDeck or move it to (-1,0) because otherwise someone could drop a piece on it and have it disappear forever.