onix-chess
Version:
Onix chess library
133 lines (115 loc) • 4.17 kB
text/typescript
import { Pieces, Colors } from '../types/Types';
import { Color } from './Color';
/**
* Chess piece
*/
export namespace Piece {
const noPiece = undefined;
const PIECE_IS_SLIDER: boolean[] = [false, false, true, true, true, false, false, false];
const PIECE_CHARS: string[] = ["x", "K", "Q", "R", "B", "N", "P", ".", "x", "k", "q", "r", "b", "n", "p", "x"];
const PIECE_NAMES: string[] = ["xx", "wk", "wq", "wr", "wb", "wn", "wp", "xx", "xx", "bk", "bq", "br", "bb", "bn", "bp"];
// Piece types (without color): ============
export const King: Pieces.King = 0x01;
export const Queen: Pieces.Queen = 0x02;
export const Rook: Pieces.Rook = 0x03;
export const Bishop: Pieces.Bishop = 0x04;
export const Knight: Pieces.Knight = 0x05;
export const Pawn: Pieces.Pawn = 0x06;
export const None: Pieces.Empty = undefined;
// White pieces: ============
export const WKing: Pieces.WKing = 0x01;
export const WQueen: Pieces.WQueen = 0x02;
export const WRook: Pieces.WRook = 0x03;
export const WBishop: Pieces.WBishop = 0x04;
export const WKnight: Pieces.WKnight = 0x05;
export const WPawn: Pieces.WPawn = 0x06;
// Black pieces: ============
export const BKing: Pieces.BKing = 0x09;
export const BQueen: Pieces.BQueen = 0x0A;
export const BRook: Pieces.BRook = 0x0B;
export const BBishop: Pieces.BBishop = 0x0C;
export const BKnight: Pieces.BKnight = 0x0D;
export const BPawn: Pieces.BPawn = 0x0E;
export const Score = [9999, 10, 6, 3, 3, 1];
export function notEmpty(p?: Pieces.Piece): Pieces.Piece {
return p!;
}
export function isPiece(p?: number): p is Pieces.Piece {
return (p !== noPiece) && ((p >= WKing && p <= WPawn) || ( p>= BKing && p <= BPawn));
}
export function isPieceType(p?: number): p is Pieces.PieceType {
return (p !== noPiece) && (p >= King && p <= Pawn);
}
/**
* Return piece type.
*/
export function type(p: Pieces.Piece): Pieces.PieceType {
return (p & 0x07) as Pieces.PieceType;
}
/**
* Return piece color.
* If piece is invalid or empty return [[Color.NoColor]].
*/
export function color(p: Pieces.Piece): Colors.BW {
return ((p & 0x08) >> 3) as Colors.BW;
}
/**
* Return piece color for valid piece
*/
export function colorOrEmpty(p?: Pieces.Piece): Colors.BW | Colors.None {
return (p === Piece.None) ? Color.None : ((p & 0x08) >> 3) as Colors.BW;
}
/**
* Make colored piece.
* @param c piece color
* @param p piece type
*/
export function create(c: Colors.BW, p: Pieces.PieceType): Pieces.Piece {
return ((c << 3) | (p & 0x07)) as Pieces.Piece;
}
/**
* Return true, if piece can slide moves.
*/
export function isSlider(p: Pieces.Piece): boolean {
return PIECE_IS_SLIDER[Piece.type(p)];
}
/**
* Return piece type from piece char.
*/
export function typeFromChar(pc: string): Pieces.PieceType | Pieces.Empty {
switch (pc) {
case "k": return Piece.King;
case "q": return Piece.Queen;
case "r": return Piece.Rook;
case "n": return Piece.Knight;
case "b": return Piece.Bishop;
case "p": return Piece.Pawn;
default: return Piece.None;
}
}
/**
* Return piece char.
* White pieces will be returns uppercased, black lowercased.
*/
export function toChar(p: Pieces.Piece): string {
return PIECE_CHARS[p];
}
/**
* Return uppercased piece char.
*/
export function toUpperChar(p: Pieces.Piece): string {
const pt = Piece.type(p);
switch (pt) {
case Piece.King: return "K";
case Piece.Queen: return "Q";
case Piece.Rook: return "R";
case Piece.Knight: return "N";
case Piece.Bishop: return "B";
case Piece.Pawn: return "P";
default: return "";
}
}
export function pieceName(p: Pieces.Piece): string {
return PIECE_NAMES[p];
}
}