Comments/Ratings for a Single Item
Should be:
if and flag f2 == moved K:
Operators come before their arguments. I'll add parenthesis to show what's going on (although you should not use the parenthesis):
if (and (flag f2) (== moved k))
I see what you say but with that I get always false. And the flag works well. I had checked. So it is the equality. If i write if and flag f2 moved == K then it works for the king but the code enters for other pieces too which is weird. So maybe == moved K regardless of how is written does not give the expected answer but all T or all F, which is weird. And that probably means I have trouble somewhere else.
Black pieces use lowercase labels. K is the white King, not just any King.
I know that. This is why the error seems weird to me. I'll get back to you on that!
You're still checking the flag on f2, which is not the starting space for the Black King.
All right, you were correct on that final point, but things are not done.
Let us start from scratch. Maybe I'll understand what is going on.
The code that greg has suggested:
if and flag f2 == moved K:
for the condition that enters the main code in question does not work although the way I see it it should.. It is always false. I have checked for the flag. That works fine so it moved be the == moved K part. But I can't see why!
Are you saying that this code is not working?
if and flag f9 == moved k:
Looking at the rest of your code, I see details that pertain only to castling, but I presume this code is not for castling. You need to understand what the code does and remove or modify what doesn't fit your purposes.
Fergus,
I have solved it:
if flag f2:
if moved == K:
move $dest $origin; // Temporarily undo King move
if sub checked $origin:
if not or checkleap $origin $dest 1 0 checkleap $origin $dest 1 1:
die A King may not use the special moves out of check.;
endif;
endif;
move $origin $dest;
endif;
endif;
@Aurelian,
At our current game I cannot make 7... b h5-f3 (bishop x wizard) because the GC program says: "A King may not use the special moves out of check. Use your browser's BACK button to go back to the previous page, then reload if necessary."
In order not to affect the current games, it would be convenient to do the tests to improve the code in a cloned preset using another settings name.
I removed the buggy code.
Now it should work!
@Fergus,
I have moved the buggy code back to the old testing ground:
if flag f2:
if moved == K:
move $dest $origin; // Temporarily undo King move
if sub checked $origin:
if not or checkleap $origin $dest 1 0 checkleap $origin $dest 1 1:
die A King may not use the special moves out of check.;
endif;
endif;
move $origin $dest;
endif;
endif;
The way this goes wrong is that other pieces other than the king are affected by it. Any idea why?
I implemented 'repeated shuffling' in the diagram now, where the shuffle parameter accepts a comma-separated list of shuffles, which are then performed in order. I also added a new shuffle limitation: a piece prefixed with ':' (colon) will not be shuffled to different shades (like a '!' prefix would do), but to symmetric locations. (Which, on boards with an even number of files, should also have opposit shades.) Better make sure to apply it only to an even number of pieces on a set of symmetrically distributed locations!
I think this should allow you to do the shuffling you want, through a trick: When you shuffle (say) Knights and Bishops with :BN specification, it can only leave them as they were, or swap the N and B on both wings. Otherwise the Bishops would no longer be symmetrically positioned.
So what you can do is start the Bishops in the d- and g-file, and (say) A and C on the b- and i-file, and then shuffle A:BC. This will make the B end up either on d/g or b/i, with 50-50 chance. After that you shuffle B and N (which started on c- and h-file), as :BN, to randomize those while preserving symmetry. Finally you shuffle ACQ without limitations. So the specification would be shuffle=A:BC,:BN,ACQ .
I have tested it by pressing restart and it does not go well. The queen and knigt get swaped. But not the way I described in the rules. My code is here:
<script type="text/javascript" src="../membergraphics/MSinteractive-diagrams/betza.js"></script>
<div style="float:left;margin:0 40px 20px 0;">
<div class="idiagram">
files=10
ranks=12
holdingsType=1
promoZone=3
promoChoice=!P*N*B*C*W*R2*J2*Q1*D1*G1
graphicsDir=../graphics.dir/alfaerie/
whitePrefix=w
blackPrefix=b
graphicsType=gif
squareSize=54
symmetry=mirror
shuffle=G:BD,:BN,GDQ
hole::::a1,b1,c1,i1,j1,,a12,b12,c12,i12,j12
pawn:p:ifmnDfmWfceF:pawn:a4,b4,c4,d4,e4,f4,g4,h4,i4,j4,,a9,b9,c9,d9,e9,f9,g9,h9,i9,j9
rook::::a2,j2,,a11,j11:1
queen::::e3,,e10:1
bishop:B:B:bishop:d3,g3,,d10,g10
knight:N:NmHmA:knight:c3,h3,,c10,h10:1
wizard:W:FL:mage:d1,g1,,d12,g12
champion:C:WAD:champion:e1,h1,,e12,h12:1
joker:J:fI:fool:f1,,f12
dragon:D:FyafsF:dragon:i3,,i10
griffin:G:WyafsW:gryphon:b3,,b10
king:K:KimbsLimbsN:king:f3,,f10
</div></div>
I had tested it be pressing restart a few times on the diagram. Refresh gives me the initial position.
OK, I see that my trick did not work for swapping b and d, as these are same shade, so that the B must get automatically to opposit halves, and the : adds nothing extra. I changed the meaning of : now to explicitly mean "mirror-image location", and adapted the Diagram script for that. This should make your diagram work as you have it, with the updated script.
I'm not sure why but the diagram still does not work.
It behaves the same way.
I'm wondering if you have not tried to put a bishop over an already occupied square. Would this be an error?
I think caching again is broken on this website. I uploaded a new Diagram script, but when I read it back from the website, it shows the old text. Only when I suffix the URL with some random suffix, like ?t=1234, I get to see the newly uploaded text.
So this is what you can do as a work-around too: suffix the URL to betza.js in your comment to make it betza.js?nocache=true , to make sure it will use the new script. You still would have to flush your browser cache. When I tried the current script locally on your diagram, the shuffling works as it should.
BTW, note that when you specify symmetry=mirror (as you must, to preserve vertical symmetry during shuffling), there is no need to mention the location of the black pieces, as the Diagram would automatically add those. So you could leave out the double comma and everything behind it, even for the holes.
@HG,
Indeed HG, now the diagram works as expected for me too!...
Thanks!
@Fergus,
I have remade the code to work as expected for the king to not be able to use the special moves out of check:
/play/pbm/play.php?game%3DApothecary+Chess+1%26settings%3DApothecary1working
The relevant piece of code for white is:
if flag f2:
if == moved K:
if sub checked $origin:;
if not or checkleap $origin $dest 1 0 checkleap $origin $dest 1 1:
die A King may not use the special moves out of check.;
endif;
endif;
endif;
endif;
There is still the problem that the special moves are displayed as legal when a king is in check. Is that solvable?
As long as you evaluate actual moves in the Post-Move sections, you have to bear in mind that potential moves are evaluated before a move would be made, and actual moves are evaluated after a move has been made. This means that you have to sometimes use different code for potential and actual moves. That's true of the King here. You should use both a function and a subroutine for the King's movement. The function should handle only potential moves, and it should stop a King from making its special move out of check before it makes its move. The subroutine should handle actual moves, and it should undo a King's special move after it has been made to make sure the King didn't move out of check with that move, then redo it if it was legal.
have written the following code but I don't know where to call the subroutine.
sub King from to
move #to #from;
if sub checked #from:
verify or checkleap #from #to 1 0 checkleap #from #to 1 1;
else:
verify fn King #from #to;
endif;
move #from #to;
endsub;
;
To the editors.
Can a piece set be changed or it needs to be redone from the beginning?
I want to change in the apothecary chess standard piece set the bird with the dragon.
Since your function has to allow special moves but stop the illegal ones, you should not be calling your function from your subroutine. They should be independent from each other. How to call the subroutine is described in the Fairychess include file tutorial under "A Real Example from Chess".
The tutorial also describes how you can use different pieces with the same notation. Although you cannot modify a set within Game Courier, you can change which pieces you use and what notation you will use for them. I recommend reviewing this tutorial every now and then.
While I could add code to Game Courier for enabling GAME Code programs to modify the images in piece sets, it would not work in Edit mode. So, if you want to use piece images that are not in your current set, you should change it to use a different set.
25 comments displayed
Permalink to the exact comments currently displayed.
@Fergus,
I'm glad to say I have managed to make it work.
Here is the code that does well:
if flag f2 and moved == K:
move $dest $origin; // Temporarily undo King move
if sub checked $origin and not checkleap $origin $dest 1 0 or checkleap $origin $dest 1 1:
die A King may not castle out of check.;
endif;
move $origin $dest;
endif;
if == moved K:
unsetflag f2;
set Kpos $dest;
endif;
if sub checked var Kpos:
die You may not move into check.;
endif;
Later edit:
But althought the code works for white it does not work for black well, and also there is a weird side effect where a queen move on the first square generates the a king may not castle out of check error. So there is still work to do despite the progress.
2nd edit:
I think I have found the bug that generates both problems. It is the first if :
if flag f2 and moved == K:
this is either always true or always false if I move the == ahead of moved but I cannot get it to work in the intended way which is enter the condition when flag f2 of set and the K has just been moved.