; *** Mage ; *** Game of Oliver Xymoron (?), ZRF by Peter Aronson ; v.1.0 Original Coding. ; You need to purchase Zillions of Games to load this rules file ; Visit the Zillions web site at http://www.zillions-of-games.com (define add-test (verify (not-piece? Rook)) add ) (define step ($1 (verify not-friend?) (add-test))) (define leap2 ($1 $2 (verify not-friend?) (add-test))) (define king-shift ($1 (verify not-friend?) (set-attribute never-moved? false) (add-test))) (define slide ($1 (while empty? (add-test) $1) (verify not-friend?) (add-test))) (define rook-slide ( $1 (while empty? (set-attribute never-moved? false) add $1) (verify empty?) (set-attribute never-moved? false) add )) (define O-O ( (verify never-moved?) e ; KB1 (verify empty?) e ; KN1 (verify empty?) cascade e ; KR1 (verify (and friend? (piece? Rook) never-moved?) ) from back ; K1 ; Save expensive not-attacked?s for last (verify not-attacked?) e ; KB1 (verify not-attacked?) to (set-attribute never-moved? false) ; We could check if KN1 is attacked too, but this isn't ; really necessary since Zillions doesn't allow any moves ; into check e ; KN1 (set-attribute never-moved? false) add ) ) (define O-O-O ( (verify never-moved?) w ; Q1 (verify empty?) w ; QB1 (verify empty?) cascade w ; QN1 (verify empty?) w ; QR1 (verify (and friend? (piece? Rook) never-moved?) ) from back ; K1 ; Save expensive not-attacked?s for last (verify not-attacked?) w ; Q1 (verify not-attacked?) to (set-attribute never-moved? false) ; We could check if KN1 is attacked too, but this isn't ; really necessary since Zillions doesn't allow any moves ; into check w ; QB1 (set-attribute never-moved? false) add ) ) ; Oddity here. Zillions would freeze if we let the Mage swap with its own King, ; but works fine if the King swaps with the Mage. Even if the King does a from ; so that the swap appears to originate with the Mage. (define swap-with ( (if (piece? King) (verify (and (friend? $1) (piece? Mage $1))) $1 from cascade back add else (verify (and (or (not-piece? King $1) enemy?) (not-empty? $1))) $1 (verify not-marked?) cascade back add ) )) (define swap (swap-with a1) (swap-with a2) (swap-with a3) (swap-with a4) (swap-with a5) (swap-with a6) (swap-with a7) (swap-with a8) (swap-with b1) (swap-with b2) (swap-with b3) (swap-with b4) (swap-with b5) (swap-with b6) (swap-with b7) (swap-with b8) (swap-with c1) (swap-with c2) (swap-with c3) (swap-with c4) (swap-with c5) (swap-with c6) (swap-with c7) (swap-with c8) (swap-with d1) (swap-with d2) (swap-with d3) (swap-with d4) (swap-with d5) (swap-with d6) (swap-with d7) (swap-with d8) (swap-with e1) (swap-with e2) (swap-with e3) (swap-with e4) (swap-with e5) (swap-with e6) (swap-with e7) (swap-with e8) (swap-with f1) (swap-with f2) (swap-with f3) (swap-with f4) (swap-with f5) (swap-with f6) (swap-with f7) (swap-with f8) (swap-with g1) (swap-with g2) (swap-with g3) (swap-with g4) (swap-with g5) (swap-with g6) (swap-with g7) (swap-with g8) (swap-with h1) (swap-with h2) (swap-with h3) (swap-with h4) (swap-with h5) (swap-with h6) (swap-with h7) (swap-with h8) ) (define Pawn-add (verify (not-piece? Rook)) (if (in-zone? promotion-zone) (add Knight Bishop Rook Mage) else add) ) (define Pawn-move ( n (verify empty?) (Pawn-add) (verify (in-zone? third-rank)) n (verify empty?) add ) ) (define Pawn-capture ( $1 (verify enemy?) (Pawn-add) ) ) (define En-Passant ( $1 (verify enemy?) (verify last-to?) (verify (piece? Pawn)) capture n to n (verify last-from?) add ) ) (define Board-Definitions (image "images\Chess\Chess8x8.bmp") (grid (start-rectangle 5 5 53 53) (dimensions ("a/b/c/d/e/f/g/h" (49 0)) ; files ("8/7/6/5/4/3/2/1" (0 49)) ; ranks ) (directions (n 0 -1) (e 1 0) (s 0 1) (w -1 0) (ne 1 -1) (nw -1 -1) (se 1 1) (sw -1 1) ) ) (symmetry Black (n s)(s n) (nw sw)(sw nw) (ne se)(se ne)) (zone (name promotion-zone) (players White) (positions a8 b8 c8 d8 e8 f8 g8 h8) ) (zone (name promotion-zone) (players Black) (positions a1 b1 c1 d1 e1 f1 g1 h1) ) (zone (name third-rank) (players White) (positions a3 b3 c3 d3 e3 f3 g3 h3) ) (zone (name third-rank) (players Black) (positions a6 b6 c6 d6 e6 f6 g6 h6) ) ) (game (title "Mage") (description "Object: Checkmate the opponent's King by attacking it so it cannot escape. This game is like standard FIDE Chess, except for two differences: Rooks can not capture or be captured, and the Queen is replaced by a Mage. A Mage can either move like a King (one step in any direction), or may swap places with any piece on the board. Pawns swapped to the 8th rank do not promote, and are stuck there until someone swaps them out again. Pawns swapped to the first rank do not have a double move. Pawns swapped to the 2nd rank may double move. \\ To see a description of how a piece moves right-click on it to bring up its properties dialog.") (history "Mage was created by Oliver Xymoron (whoever that really is) is the late 80's. ZRF by Peter Aronson. \\ ZRF Revision 1.0, June 10th, 2001.") (win-sound "Audio\Orchestra_CF.wav") (loss-sound "Audio\Orchestra_FC.wav") (click-sound "Audio\Pickup.wav") (release-sound "Audio\WoodThunk.wav") (players White Black) (turn-order White Black) (pass-turn false) (loss-condition (White Black) (checkmated King)) (draw-condition (White Black) (and (pieces-remaining 0 Pawn) (pieces-remaining 0 Knight) (pieces-remaining 0 Bishop) (pieces-remaining 0 Mage))) (board (Board-Definitions)) (board-setup (White (Pawn a2 b2 c2 d2 e2 f2 g2 h2) (Knight b1 g1) (Bishop c1 f1) (Rook a1 h1) (Mage d1) (King e1) ) (Black (Pawn a7 b7 c7 d7 e7 f7 g7 h7) (Knight b8 g8) (Bishop c8 f8) (Rook a8 h8) (Mage d8) (King e8) ) ) (piece (name Pawn) (help "Pawn: moves forward, captures diagonally, can promote on 8th row") (description "Pawn\A Pawn can move straight ahead one square, or two squares from the second rank. A Pawn captures by moving one square ahead and diagonally. If a Pawn moves to the far rank it promotes, changing into a Knight, Bishop, Rook, or Queen. If a Pawn is swapped to the far rank by a Mage, it is stranded there, unable to move, capture or promote unless it is swapped off again. On rare occasions Pawns can also execute a move called `En Passant`, or `in passing`. This allows a Pawn to take an enemy Pawn that has just moved two squares.") (image White "images\Chess\wpawn.bmp" Black "images\Chess\bpawn.bmp") (moves (Pawn-capture nw) (Pawn-capture ne) (Pawn-move) (En-Passant e) (En-Passant w) ) ) (piece (name Knight) (help "Knight: moves like an `L`, 2 squares one way and one the other") (description "Knight\A Knight moves like an `L`, two squares vertically plus one horizontally, or two squares horizontally plus one vertically. It hops over any pieces on the way.") (image White "images\Chess\wknight.bmp" Black "images\Chess\bknight.bmp") (moves (leap2 n ne) (leap2 n nw) (leap2 s se) (leap2 s sw) (leap2 e ne) (leap2 e se) (leap2 w nw) (leap2 w sw) ) ) (piece (name Bishop) (help "Bishop: slides diagonally any number of squares") (description "Bishop\A Bishop moves any number of squares on a diagonal. It may not leap over other pieces.") (image White "images\Chess\wbishop.bmp" Black "images\Chess\bbishop.bmp") (moves (slide ne) (slide nw) (slide se) (slide sw) ) ) (piece (name Rook) (help "Rook: slides any number of squares along the row or column; can't capture or be captured.") (description "Rook\A Rook moves any number of squares orthogonally on a rank or a file. It may not leap over other pieces, and it can neither capture or be captured.") (image White "images\Chess\wdownrook.bmp" Black "images\Chess\bdownrook.bmp") (attribute never-moved? true) (moves (rook-slide n) (rook-slide e) (rook-slide s) (rook-slide w) ) ) (piece (name Mage) (help "Mage: Switch with any piece on the board, or move 1 square in any direction.") (description "Mage\A Mage moves one square in any direction, or may swap places with any piece on the board.") (image White "images\Chess\wdownqueen.bmp" Black "images\Chess\bdownqueen.bmp") (moves (step n) (step e) (step s) (step w) (step ne) (step nw) (step se) (step sw) (swap) ) ) (piece (name King) (help "King: steps 1 square in any direction to a safe square") (description "King\A King can move to any adjacent square, but never to a square where it can be captured. It may also `castle` with the Rook if neither the Rook nor King has moved yet and there is nothing in between them. In castling the King moves two squares nearer the Rook and the Rook leaps to the far side of the King. You may not castle out of or through check, or if the King or Rook involved has previously moved.") (image White "images\Chess\wking.bmp" Black "images\Chess\bking.bmp") (attribute never-moved? true) (moves (king-shift n) (king-shift e) (king-shift s) (king-shift w) (king-shift ne) (king-shift nw) (king-shift se) (king-shift sw) (O-O) (O-O-O) (swap) ) ) )