]> git.sesse.net Git - remoteglot/blob - book/parse-pgn.pl
Remove now obsolete Postgres support.
[remoteglot] / book / parse-pgn.pl
1 #! /usr/bin/perl
2 use Chess::PGN::Parse;
3 use Data::Dumper;
4 use strict;
5 use warnings;
6 use DBI;
7 use DBD::Pg;
8 require 'Position.pm';
9 require 'Engine.pm';
10 require 'ECO.pm';
11
12 my $TEXTOUT = 0;
13 my $BINOUT = 1;
14
15 ECO::init();
16
17 my ($filename, $my_num, $tot_num) = @ARGV;
18
19 my $pgn = Chess::PGN::Parse->new($filename)
20         or die "can't open $filename\n";
21 my $game_num = 0;
22 while ($pgn->read_game()) {
23         next unless ($game_num++ % $tot_num == $my_num);
24         my $tags = $pgn->tags();
25 #       next unless $tags->{'WhiteElo'} >= 2000;
26 #       next unless $tags->{'BlackElo'} >= 2000;
27         $pgn->quick_parse_game;
28         my $pos = Position->start_pos($pgn->white, $pgn->black);
29         my $result = $pgn->result;
30         my $binresult;
31         if ($result eq '1-0') {
32                 $binresult = chr(0);
33         } elsif ($result eq '1/2-1/2') {
34                 $binresult = chr(1);
35         } elsif ($result eq '0-1') {
36                 $binresult = chr(2);
37         } else {
38                 die "Unknown result $result";
39         }
40         my $binwhiteelo = pack('l', $tags->{'WhiteElo'});
41         my $binblackelo = pack('l', $tags->{'BlackElo'});
42         my $moves = $pgn->moves;
43         my $opening = ECO::get_opening_num($pos);
44 #       print STDERR $pgn->white, " ", $pgn->black, "\n";
45         for (my $i = 0; $i + 1 < scalar @$moves; ++$i) {
46                 my ($from_row, $from_col, $to_row, $to_col, $promo) = $pos->parse_pretty_move($moves->[$i]);
47                 my $next_move = $moves->[$i];
48                 my $bpfen = $pos->bitpacked_fen;
49                 my $fen = $pos->fen;
50                 $opening = ECO::get_opening_num($pos) // $opening;
51                 print "$fen $next_move $result $opening\n" if $TEXTOUT;
52                 if ($BINOUT) {
53                         print chr(length($bpfen) + length($next_move)) . $bpfen . $next_move;
54                         print $binresult . $binwhiteelo . $binblackelo;
55                         print pack('l', $opening);
56                 }
57                 $pos = $pos->make_move($from_row, $from_col, $to_row, $to_col, $promo, $moves->[$i]);
58         }
59 }