EngineOpeningBookV2 = record
case EntryType: integer of
0: (Magic: Dword; // Leters OBDB or $4244424F
MajorVersion: integer; // version of file structure, currently 1
MinorVersion: integer; // subversion of file structure, currently 0
RecordSize: integer; // Record size for easy conversion in case it changes, currently 256
LastUpdate: TdateTime; // Last time the database was edited
FileVersion: string[8]; // User defined ANSI STRING
Description: TShortUnicodeString96; // Name of the opening book
);
1: (Notes: TShortUnicodeString96; // can have multiple record. they need to be concatenated
// to form the full notes.);
2: (
Source: TShortUnicodeString32; // source
Pos: PositionEngine; // list of 26 shortint, positive numbers mean player 1 checkers, negative for player 2
Cube: integer; // cube value as value=2^cube
CubePos: integer; // 0=center; +1=own; -1=opponent
Score: array [1 .. 2] of integer; // score player1 and player2
Jacoby: integer; // 0 = False 1 = True
Beaver: integer; // 0 = False 1 = True
Crawford: integer; // 0 = False 1 = True
Eval: array [0 .. 5] of single; // Winning chances as loose bg, loose gammon, loose single,
// win single, win gammon, win backgammon
Equity: single; // cubeful normalized equity
Level: integer; // 100=Ro; 1000=XGR; 1001=XGR+; 100=RO; N=N-ply
// for normalization purpose GnuBG 2-ply should be stored as 3
ProgramName: integer; // 0=XG; 1=Snowie; 2=GnuBG; 3=BGBlitz
ProgramMajor: integer; // Major version of the program that made the analyze
ProgramMinor: integer; // Minor version of the program that made the analyze
ROGames: Dword; // For RO, number of game rolled
ROStd: single; // For RO, standard deviation of the normalized equity
ROChecker: integer; // For RO, level used for checker play
ROCube: integer; // For RO, level used for cube
RORotation: integer; // For RO, 0=rotate on 36 dice, 1=rotate on 21 dice
// probably only for XG, old version (<1.10) were making RO using 21 dice rotation
ROSeed: integer; // For RO, seed used
ROTruncation: integer; // For RO, truncate after ROTruncation moves, 0 for none
RODuration: single; // duration of the RO in seconds
DateImported: TdateTime;
DateSaved: TdateTime;
Deleted: Boolean;
Filler: array [0 .. 8] of integer; // unused, for future addition must be initialized to 0
);
end;
Just a few note about Delphi types
• Integer is 32 bit signed (regardless of 32 or 64 bit compilation)
• Dword is 32 bit unsigned
• TdateTime is a double precision float which is the Julian date (time in the decimal part)
• string[8] ANSI string of 8 characters (0 terminated if less)
• Shortint is 8 bit signed
• TShortUnicodeString96 Unicode UTF-16 string of 96 characters max (0 terminated if less)
• TShortUnicodeString32 Unicode UTF-16 string of 32 characters max (0 terminated if less)
• Single Single precision float