{****************************************************************************}
{*  INIT.PAS:  this file contains the routines which initialize the global  *}
{*  variables.                                                              *}
{****************************************************************************}

{****************************************************************************}
{*  Init Possible Moves:  put the constant values into the data structure   *}
{*  which gives the possible moves for each piece, the point values for     *}
{*  capturing enemy pieces, and the opposite color to the given one.        *}
{****************************************************************************}
  procedure InitPossibleMoves;
    var index: integer;
    begin
        PossibleMoves [BISHOP].NumDirections := 4;
        PossibleMoves [BISHOP].MaxDistance := 7;
        PossibleMoves [BISHOP].UnitMove[1].DirRow := 1;
        PossibleMoves [BISHOP].UnitMove[1].DirCol := -1;
        PossibleMoves [BISHOP].UnitMove[2].DirRow := 1;
        PossibleMoves [BISHOP].UnitMove[2].DirCol := 1;
        PossibleMoves [BISHOP].UnitMove[3].DirRow := -1;
        PossibleMoves [BISHOP].UnitMove[3].DirCol := -1;
        PossibleMoves [BISHOP].UnitMove[4].DirRow := -1;
        PossibleMoves [BISHOP].UnitMove[4].DirCol := 1;
        PossibleMoves [KNIGHT].NumDirections := 8;
        PossibleMoves [KNIGHT].MaxDistance := 1;
        PossibleMoves [KNIGHT].UnitMove[1].DirRow := 1;
        PossibleMoves [KNIGHT].UnitMove[1].DirCol := -2;
        PossibleMoves [KNIGHT].UnitMove[2].DirRow := 2;
        PossibleMoves [KNIGHT].UnitMove[2].DirCol := -1;
        PossibleMoves [KNIGHT].UnitMove[3].DirRow := 2;
        PossibleMoves [KNIGHT].UnitMove[3].DirCol := 1;
        PossibleMoves [KNIGHT].UnitMove[4].DirRow := 1;
        PossibleMoves [KNIGHT].UnitMove[4].DirCol := 2;
        PossibleMoves [KNIGHT].UnitMove[5].DirRow := -1;
        PossibleMoves [KNIGHT].UnitMove[5].DirCol := 2;
        PossibleMoves [KNIGHT].UnitMove[6].DirRow := -2;
        PossibleMoves [KNIGHT].UnitMove[6].DirCol := 1;
        PossibleMoves [KNIGHT].UnitMove[7].DirRow := -2;
        PossibleMoves [KNIGHT].UnitMove[7].DirCol := -1;
        PossibleMoves [KNIGHT].UnitMove[8].DirRow := -1;
        PossibleMoves [KNIGHT].UnitMove[8].DirCol := -2;
        PossibleMoves [ROOK].NumDirections := 4;
        PossibleMoves [ROOK].MaxDistance := 7;
        PossibleMoves [ROOK].UnitMove[1].DirRow := 1;
        PossibleMoves [ROOK].UnitMove[1].DirCol := 0;
        PossibleMoves [ROOK].UnitMove[2].DirRow := 0;
        PossibleMoves [ROOK].UnitMove[2].DirCol := -1;
        PossibleMoves [ROOK].UnitMove[3].DirRow := 0;
        PossibleMoves [ROOK].UnitMove[3].DirCol := 1;
        PossibleMoves [ROOK].UnitMove[4].DirRow := -1;
        PossibleMoves [ROOK].UnitMove[4].DirCol := 0;
        PossibleMoves [QUEEN].NumDirections := 8;
        PossibleMoves [QUEEN].MaxDistance := 7;
        PossibleMoves [KING].NumDirections := 8;
        PossibleMoves [KING].MaxDistance := 1;
        for index := 1 to 4 do begin
            PossibleMoves [QUEEN].UnitMove[index] := PossibleMoves [BISHOP].UnitMove[index];
            PossibleMoves [KING].UnitMove[index] := PossibleMoves [BISHOP].UnitMove[index];
        end;
        for index := 1 to 4 do begin
            PossibleMoves [QUEEN].UnitMove[index + 4] := PossibleMoves [ROOK].UnitMove[index];
            PossibleMoves [KING].UnitMove[index + 4] := PossibleMoves [ROOK].UnitMove[index];
        end;

        CapturePoints[BLANK] := 0;
        CapturePoints[PAWN] := 10;
        CapturePoints[KNIGHT] := 35;
        CapturePoints[BISHOP] := 35;
        CapturePoints[ROOK] := 50;
        CapturePoints[QUEEN] := 90;
        CapturePoints[KING] := 2000;

        EnemyColor[C_WHITE] := C_BLACK;
        EnemyColor[C_BLACK] := C_WHITE;
    end;

{****************************************************************************}
{*  Startup Initialize:  set the default player info and options, and set   *}
{*  valid and invalid squares of the board.                                 *}
{****************************************************************************}
  procedure StartupInitialize;
    var row, col: RowColType;
    begin
      Randomize;
      InitPossibleMoves;
      DefaultFileName := 'EXAMPLE';

      {*** default options ***}
      Game.TimeLimit := 0;
      Game.EnPassentAllowed := true;
      Game.SoundFlag := true;
      Game.FlashCount := 2;
      Game.WatchDelay := 600;

      {*** default player attributes ***}
      with Player[C_WHITE] do begin
          Name := 'PERSON';
          IsHuman := true;
          LookAhead := 3;
          PosEval := false;
      end;
      with Player[C_BLACK] do begin
          Name := 'COMPUTER';
          IsHuman := false;
          LookAhead := 3;
          PosEval := false;
      end;

      {*** initialize board ***}
      for col := -1 to 10 do
          for row := -1 to 10 do
              with Board[row, col] do begin
                  image := BLANK;
                  color := C_WHITE;
                  HasMoved := false;
                  ValidSquare := false;
              end;
      for col := 1 to BOARD_SIZE do
          for row := 1 to BOARD_SIZE do
              Board[row, col].ValidSquare := true;
    end;

{*** end of INIT.PAS include file ***}
