I'm thinking of providing more information, but it requires an array, and I'm still looking into how I might handle that.
It would already be very helpful if the 'origin' and 'moved' info was always available for the first move of the sequence. Without that, the following code seems to do what is required. (I did not want to use the Do Not Include checkbox, as the store / restore is only needed on the latest move of the game, while on all other moves it would come in handy if it is automatically performed.)
The underlying assumption is that implied e.p. captures and moves that generate e.p. rights ('double pushes') will never have other (explicitly specified) side effects, and will thus be entered as simple moves. (For castlings XBetza already guarantees that, but it is in theory possible to specify rights-generating moves that would also make a locust capture. It is hard to imagine any Chess variant would ever have that, though.)
Pre-Move:
if != mln $maxmln:
store;
endif;
Post-Move:
if == mln $maxmln:
// last move must be tested for legality
store resultpos;
restore;
if == dest null or not origin: // move is composit
set mvs explode chr 59 thismove; // split it
eval join "MOVE: " trim elem 0 mvs; // get origin and moved of first part
restore;
endif;
set legal false;
set task 0; // specifies what subroutine genmoves should do with the generated moves
gosub genmoves moved origin; // compare all moves of the piece to thismove
if not legal:
die "Illegal move";
endif;
restore resultpos;
if unload:
drop unload dropsqr; // relocates another piece (also used for castling)
endif;
if locustsqr:
capture locustsqr; // removes another piece (also used for castling and e.p.)
endif;
elseif != dest null and origin:
// setting up game: guaranteed to be legal, apply implied side effects only
if match dest epsqrs and ep:
if or checkaleap origin dest 1 1 // code specifically generated to recognize
checkaleap origin dest -1 1 // e.p.-capable leaps to empty squares
and == moved P
and not capture:
capture #ep // and remove the victim
endif;
elseif match dest wcastle:
if == moved K: // code specifically generated to
... // identify castling partner and move it
endif;
endif;
set ep false;
set epsqrs; // empty array (?)
if checkaleap origin dest 0 2 // code specifically generated to recognize
and == moved P: // e.p.-rights-creating leaps
set ep dest;
push epsqrs where origin 0 1; // add all e.p. squares
endif;
setflag dest;
endif;
The routine 'genmoves' would generate all moves of a given piece in a given location, in the context of the pre-move board position. In the process it would also build a list of side effects: squares that have to be cleared, or where the captured piece has to be dropped.For 'task 0', used here, it would build a string through
join moved chr 32 origin chr 45 dest chr 59
plus the required suicides and freedrops describing the side effects (e.g. ... chr 32 chr 64 chr 45 sideeffect), for comparison with thismove. On a match it would set legal true, and actually perform the suicide.
It would already be very helpful if the 'origin' and 'moved' info was always available for the first move of the sequence. Without that, the following code seems to do what is required. (I did not want to use the Do Not Include checkbox, as the store / restore is only needed on the latest move of the game, while on all other moves it would come in handy if it is automatically performed.)
The underlying assumption is that implied e.p. captures and moves that generate e.p. rights ('double pushes') will never have other (explicitly specified) side effects, and will thus be entered as simple moves. (For castlings XBetza already guarantees that, but it is in theory possible to specify rights-generating moves that would also make a locust capture. It is hard to imagine any Chess variant would ever have that, though.)
Pre-Move:
Post-Move:
The routine 'genmoves' would generate all moves of a given piece in a given location, in the context of the pre-move board position. In the process it would also build a list of side effects: squares that have to be cleared, or where the captured piece has to be dropped. For 'task 0', used here, it would build a string through
join moved chr 32 origin chr 45 dest chr 59
plus the required suicides and freedrops describing the side effects (e.g. ... chr 32 chr 64 chr 45 sideeffect), for comparison with thismove. On a match it would set legal true, and actually perform the suicide.