DEFINITION MODULE SkakBrainEval;

(*$ DEFINE Test:=FALSE *)

(*$ LongAlign:=TRUE StackParms:=TRUE CStrings:=TRUE LargeVars:=FALSE *)

(*$ IF Test *)
  (*$ Volatile:=FALSE StackChk:=TRUE RangeChk:=TRUE OverflowChk:=TRUE
  NilChk:=TRUE EntryClear:=TRUE CaseChk:=TRUE ReturnChk:=TRUE *)
(*$ ELSE *)
  (*$ Volatile:=TRUE StackChk:=FALSE RangeChk:=FALSE OverflowChk:=FALSE
  NilChk:=FALSE EntryClear:=FALSE CaseChk:=FALSE ReturnChk:=FALSE *)
(*$ ENDIF *)

FROM FileSystem IMPORT
  File;

FROM SkakBase IMPORT
  STILLINGTYPE;

CONST
  SkakBrainEvalDefCompilation="17";
  ValueT= 470;
  ValueR= 480;
  ValueM=9999;
  ValueK=9980;
  ValueD= 880;
  ValueL= 300;
  ValueS= 300;
  ValueB= 100;
  ValueE= 100;

TYPE
  pdType=ARRAY['B'..'t'] OF ARRAY[11..88] OF INTEGER; (* size=51*78*2=7956 *)	

VAR
  Evals:LONGINT; 			(* for current/last engine call *)
  OpenGame,EndGame:BOOLEAN;		(* calculated by preprocessor 	*)
  pd,pdw,pdb : POINTER TO pdType;       (* position values tables, set 	*)
                                        (* to pdb if mirrored else pdw  *)
VAR
  TestFil : File;
  ToFile  : BOOLEAN;
  Depth   : INTEGER;
  matr,posi,wbonus,bbonus:INTEGER;
  (* see Eval here, for testing only *)

PROCEDURE WRITEF(n:CARDINAL);

PROCEDURE WRITELNF(n:CARDINAL);

PROCEDURE Vis(txt:ARRAY OF CHAR; VAR st:STILLINGTYPE);
(* Show position, for testing only *)

PROCEDURE PreProcess;
(* sets the pd array to default positional values *)

PROCEDURE PreProcessor(st:STILLINGTYPE);
(* adjusts the pd-array+OpenGame+EngGame according to the actual position. *)
(* Is called one time for each engin call *)

PROCEDURE Eval(VAR stilling:STILLINGTYPE; Activity:INTEGER;
               Sort:BOOLEAN; alpha, beta:INTEGER):INTEGER;
(* evaluates the actual postion using pd and position. *)
(* Is called thousands of times for each engine call! *)

END SkakBrainEval.
