Get the opening book

eXtreme Gammon opening book has been generated using rollouts made by user on BGonline.org. For that reason the data is in thepublic domain. You may freely download, use, modified the data with the only limitation that the information in each entry showing who is the person who made the rollout is preserved and displayed when the associated entry is presented. The file can been downloaded here: Latest Opening Book

The file is a binary file, with a fixed size

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