Code: Select all
PROCEDURE CUTATK (* CUT ATTACKS THROUGH SQUARE *)
(A:TS); (* SQUARE *)
VAR
INRS : RS; (* ATTACKING PIECES *)
INTS : TS; (* ATTACKING PIECE SQUARE *)
IMRS : RS; (* SCRATCH *)
INTD : TD; (* STEP SIZE *)
INTM : TM; (* ATTACKING PIECE SIDE *)
INTL : TL; (* NO LONGER ATTACKED SQUARE *)
INTT : TT; (* NO LONGER ATTACKED SQUARE *)
BEGIN
CPYRS(INRS,ATKTO[A]); (* ALL PIECES ATTACKING SQUARE *)
WHILE NXTTS(INRS,INTS) DO
IF XSPB[MBORD[INTS]] THEN (* IF SWEEP PIECE *)
BEGIN
INTD := XLLD[XTSL[A]-XTSL[INTS]];
(* STEP SIZE ON 10X12 BOARD *)
INTM := XTPM[MBORD[INTS]]; (* SIDE OF ATTACKING PIECE *)
INTL := XTSL[A]+INTD; (* FIRST SQUARE BEYOND PIECE *)
INTT := XTLS[INTL]; (* FIRST SQUARE BEYOND PIECE ON
8X8 BOARD *)
WHILE INTT > AT DO (* WHILE ON BOARD *)
BEGIN
CLRRS(ATKFR[INTS],INTT); (* CLEAR ATTACK MAP *)
CLRRS(ATKTO[INTT],INTS);
ANDRS(IMRS,ATKTO[INTT],TMLOC[INTM]);
(* OTHER ATTACKS ON SQUARE BY
SAME SIDE *)
IF NULRS(IMRS) THEN (* IF NO ATTACKS BY THAT SIDE *)
CLRRS(ALATK[INTM],INTT); (* CLEAR ATTACKS BY SIDE *)
IF MBORD[INTT] = MT THEN
BEGIN
INTL := INTL+INTD; (* STEP BEYOND SQUARE *)
INTT := XTLS[INTL];
END
ELSE
INTT := AT; (* STOP SCAN *)
END;
END;
END; (* CUTATK *)
Code: Select all
(defun cut-attacks (my-sq my-bbdb)
"Cut the attacks through a square in a bitboard database."
(let*
(
(loc-merge-bb (bbdb-loc-merge-bb my-bbdb))
(loc-sweep-bb (bbdb-loc-sweep-bb my-bbdb))
(loc-color-bb-vec (bbdb-loc-color-bb-vec my-bbdb))
(atk-by-color-bb-vec (bbdb-atk-by-color-bb-vec my-bbdb))
(atk-fr-sq-bb-vec (bbdb-atk-fr-sq-bb-vec my-bbdb))
(atk-to-sq-bb-vec (bbdb-atk-to-sq-bb-vec my-bbdb))
(atkr-bb (clone-bb (svref atk-to-sq-bb-vec my-sq)))
)
(loop-bb (atkr-bb atkr-sq)
(when (sq-set? loc-sweep-bb atkr-sq)
(let*
(
(atkr-color (calc-occ-color-bbdb atkr-sq my-bbdb))
(atkr-loc-bb (svref loc-color-bb-vec atkr-color))
(atk-by-color-bb (svref atk-by-color-bb-vec atkr-color))
(atk-fr-sq-bb (svref atk-fr-sq-bb-vec atkr-sq))
(dir (aref intersquare-dir-vec atkr-sq my-sq))
(extn-sqs (aref open-ray-sqs-vec my-sq dir))
)
(when extn-sqs
(do ((extn-sq (pop extn-sqs))) ((not extn-sq))
(reset-sq atk-fr-sq-bb extn-sq)
(reset-sq (svref atk-to-sq-bb-vec extn-sq) atkr-sq)
(when (bb-ni2? atkr-loc-bb (svref atk-to-sq-bb-vec extn-sq))
(reset-sq atk-by-color-bb extn-sq))
(if (or (null? extn-sqs) (sq-set? loc-merge-bb extn-sq))
(setf extn-sq nil)
(setf extn-sq (pop extn-sqs))))))))))