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 l

⟦7c57a3ddc⟧ TextFile

    Length: 2174 (0x87e)
    Types: TextFile
    Names: »legalmove.c«

Derivation

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

TextFile

/* legalmove.c */

#include "externs.h"

legalmove(pawntries, pawnattempts, checkdirs, from, to, color)
	int from, to, color;
	int pawntries, *pawnattempts;
	LIST checkdirs;
{
	LIST lmember(), piecemoves();
	int i;
	static struct {
		int from;
		int to;
	} pawnstried [3];

	if (whose [from] != color)
		return NO_PIECE;
	else if (occupant [from] == KING && to == from + 2) {
		/* castle king side */
		if (!virgin [from])
			return (KING_MOVED);
		else if (!virgin [from + 3])
			return (ROOK_MOVED);
		else if (whose [from + 1] == color
		|| whose [from + 2] == color)
			return (PIECE_IN_WAY);
		else if (checkdirs
		|| whose [from + 1] != EMPTY
		|| whose [from + 2] != EMPTY
		|| moveintocheck (from, from + 1)
		|| moveintocheck (from, from + 2))
			return ILLEGAL;
		else
			return TRUE;
	} else if (occupant [from] == KING && to == from - 2) {
		/* castle queen side */
		if (!virgin [from])
			return (KING_MOVED);
		else if (!virgin [from - 4])
			return (ROOK_MOVED);
		else if (whose [from - 1] == color
		|| whose [from - 2] == color
		|| whose [from - 3] == color)
			return (PIECE_IN_WAY);
		else if (checkdirs
		|| whose [from - 1] != EMPTY
		|| whose [from - 2] != EMPTY
		|| whose [from - 3] != EMPTY
		|| moveintocheck (from, from - 1)
		|| moveintocheck (from, from - 2))
			return ILLEGAL;
		else
			return TRUE;
	} else if (!lmember (to, piecemoves (from, TRUE)))
		return (NO_MOVE);
	else if (option [ANNOUNCEPAWNS] == TRUE
	&& from % 10 != to % 10
	&& occupant [from] == PAWN) {
		if (pawntries == 0)
			return NOPAWNTRIES;
		for (i = 0; i < *pawnattempts; i++)
			if (pawnstried [i].from == from
			&&  pawnstried [i].to   == to)
				return ILLEGAL;
		if (*pawnattempts == 3)
			return NOMOREPAWNTRIES;
		if (lmember (to, piecemoves (from, FALSE)))
			return TRUE;
		pawnstried [*pawnattempts].from = from;
		pawnstried [(*pawnattempts)++].to = to;
		if (*pawnattempts == 1)
			wprintw (win [MESSAGE],"1 attempt\r");
		else
			wprintw (win [MESSAGE],"%d attempts\r", *pawnattempts);
		return ILLEGAL;
	} else if (!lmember (to, piecemoves (from, FALSE)))
		return ILLEGAL;
	else if (moveintocheck (from, to))
		return ILLEGAL;
	else
		return TRUE;
}