DataMuseum.dk

Presents historical artifacts from the history of:

DKUUG/EUUG Conference tapes

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about DKUUG/EUUG Conference tapes

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - metrics - download
Index: T p

⟦1bc74c7d3⟧ TextFile

    Length: 1505 (0x5e1)
    Types: TextFile
    Names: »piecemoves.c«

Derivation

└─⟦b20c6495f⟧ Bits:30007238 EUUGD18: Wien-båndet, efterår 1987
    └─⟦this⟧ »EUUGD18/General/Kriegspiel/piecemoves.c« 

TextFile

/* piecemoves.c */

#include "externs.h"

LIST
piecemoves (from, ignoreenemy)
	/* doesn't include castling */
	int from, ignoreenemy;
{
	int piece, color, front, spot, side, addend, to;
	LIST dirs, moves, linsert ();

	piece = occupant [from];
	color = whose [from];
	moves = NIL;
	if (piece == PAWN) {
		front = from + pawndir [color];
		if (whose [front] != color
		&& (ignoreenemy || whose [front] == EMPTY)) {
			moves = linsert (moves, front);
			if (from / 10 == 7 - 5 * color) { /* pawn can move 2 */
				spot = front + pawndir [color];
				if (whose [spot] != color
				&& (ignoreenemy || whose [spot] == EMPTY))
					moves = linsert (moves, spot);
			}
		}
		for (side = -1; side <= 1; side += 2) {
			spot = front + side;
			if (whose [spot] != color
			&& whose [spot] != OFFBOARD
			&& (ignoreenemy || whose [spot] == 1 - color
			|| (from / 10 == 4 + color	/* en passent */
			    && occupant [from + side] == PAWN
			    && lastmovefrom == spot + pawndir [color]
			    && lastmoveto == from + side)))
				moves = linsert (moves, spot);
		}
	} else {
		dirs = dirlist [piece];
		while (dirs != NIL) {
			addend = dirs->i;
			dirs = dirs->n;
			to = from;
			while (TRUE) {
				to += addend;
				if (to < 0 || to > 99)
					break;
				if (whose [to] == OFFBOARD
				||  whose [to] == color)
					break;
				moves = linsert (moves, to);
				if (ignoreenemy == FALSE
				&& whose [to] == 1 - color)
					break;
				if (piece == KING || piece == KNIGHT)
					break;
			}
		}
	}
	return moves;
}