ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/Games-Go-SGF-Grove/Grove.pm
Revision: 1.9
Committed: Mon Jul 21 18:44:41 2008 UTC (15 years, 11 months ago) by elmex
Branch: MAIN
Changes since 1.8: +5 -2 lines
Log Message:
small fix and un-commented the broken code of mine

File Contents

# User Rev Content
1 root 1.1 =head1 NAME
2    
3 root 1.2 Games::Go::SGF::Grove - SGF the Perl way
4 root 1.1
5     =head1 SYNOPSIS
6    
7     use Games::Go::SGF::Grove;
8 root 1.2
9     $game = load_sgf $path;
10     save_sgf $path, $game;
11    
12     $game = decode_sgf $sgf_data;
13     $sgf_data = encode_sgf $game;
14 root 1.1
15     =head1 DESCRIPTION
16    
17 root 1.2 This module loads and saves Go SGF files. Unlike other modules, it doesn't
18     build a very fancy data structure with lot's of java-like accessors
19     but instead returns a simple Perl data structure you can inspect with
20     Data::Dumper and modify easily. The structure follows the SGF file format
21     very closely.
22    
23     The SGF format is documented here: L<http://www.red-bean.com/sgf/>.
24    
25     All the functions below use a common data format and throw exceptions on
26     any errors.
27 root 1.1
28     =over 4
29    
30     =cut
31    
32     package Games::Go::SGF::Grove;
33    
34 root 1.2 use strict;
35     no warnings;
36    
37 root 1.7 use Carp;
38    
39 root 1.8 use base Exporter::;
40 root 1.7
41 root 1.2 our $VERSION = 0.1;
42     our @EXPORT = qw(load_sgf save_sgf encode_sgf decode_sgf);
43    
44     =item $game = load_sgf $path
45    
46     Tries to read the file given by C<$path> and parses it as an SGF file,
47     returning the parsed data structure.
48    
49     =item save_sgf $path, $game
50    
51     Saves the SGF data to the specified file.
52    
53     =item $game = decode_sgf $sgf_data
54    
55     Tries to parse the given string into a Pelr data structure and returns it.
56    
57     =item $sgf_data = encode_sgf $game
58    
59     Takes a Perl data structure and serialises it into an SGF file. Anything
60     stored in the structure that isn't understood by this module will be
61     silently ignored.
62    
63     =cut
64    
65     sub decode_sgf($) {
66     my ($sgf_data) = @_;
67 root 1.3
68 root 1.4 Games::Go::SGF::Grove::Parser::->new->decode_sgf ($sgf_data)
69 root 1.2 }
70    
71     sub encode_sgf($) {
72     my ($game) = @_;
73 root 1.4
74     Games::Go::SGF::Grove::Parser::->new->encode_sgf ($game)
75 root 1.2 }
76    
77     sub load_sgf($) {
78     my ($path) = @_;
79    
80     open my $fh, "<:perlio", $path
81 root 1.7 or Carp::croak "$path: $!";
82 root 1.2
83     local $/;
84 root 1.3 decode_sgf <$fh>
85 root 1.2 }
86    
87     sub save_sgf($$) {
88     my ($path, $game) = @_;
89    
90 root 1.4 open my $fh, ">:perlio", $path
91 root 1.7 or Carp::croak "$path: $!";
92 root 1.2
93     print $fh encode_sgf $game;
94     }
95    
96     =back
97    
98     =head2 The Game Data structure
99    
100     The SGF game is represented by a linked Perl data structure consisting of
101     unblessed hashes and arrays.
102    
103 root 1.4 SGF files are a forest of trees, called a collection (i.e. you can have
104     multiple games stored in a file). The C<load_sgf> and C<decode_sgf>
105     functions returns this collection as a reference to an array containing
106     the individual game trees (usually there is only one, though).
107    
108     Each individual tree is again an array of nodes representing the main line
109     of play.
110    
111     Each node is simply a hash reference. Each SGF property is stored with the
112     (uppercase) property name as the key, and a property-dependent value for
113     the contents (e.g., a black move is stored as C<< B => [3, 5] >>.
114    
115     If there are any variations/branches/alternate lines of play, then these
116     are stored in the array reference in the C<variations> key (those again
117     are game trees, so array references themselves).
118    
119     This module reserves all uppercase key names for SGF properties, the key
120     C<variations> and all keys starting with an underscore (C<_xxx>) as it's
121     own. Users of this module may store additional attributes that don't
122     conflict with these names in any node.
123    
124     Unknown properties will be stored as scalars with the (binary) property
125     contents. Text nodes will always be decoded into Unicode text and encoded
126     into whatever the CA property of the root node says (default: C<UTF-8>).
127    
128     When saving, all uppercase keys will be saved, lowercase keys will be
129     ignored.
130    
131     For the actual encoding of other types, best decode some example game that
132     contains them and use Data::Dumper. Here is such an example:
133    
134     [ # list of game-trees, only one here
135     [ # the main node sequence
136     { # the root node, contains some variations
137     DI => '7k',
138     AP => undef,
139     CO => '5',
140     DP => '40',
141     GE => 'tesuji',
142     AW => [
143     [ 2, 16 ], [ 3, 15 ], [ 15, 9 ], [ 14, 13 ], ...
144     ],
145     C => 'White just played a ladder block at h12.',
146     variations => [ # list of variations, only one
147     [ # sequence of variation moves
148     { B => [ 7, 5 ] }, # a black move
149     { W => [ 12, 12 ] }, # a white move
150     ... and so on
151     ]
152     ],
153     }
154     ]
155     }
156 root 1.2
157     =cut
158    
159     package Games::Go::SGF::Grove::Parser;
160 root 1.1
161     no warnings;
162 root 1.4 use strict 'vars';
163    
164     use Encode ();
165     use Carp qw(croak);
166 root 1.1
167     my $ws = qr{[\x00-\x20]*}s;
168     my $property; # property => propertyinfo
169    
170     sub new {
171     my $class = shift;
172     bless { @_ }, $class;
173     }
174    
175     sub error {
176     my ($self, $error) = @_;
177    
178 root 1.4 my $pos = pos $self->{sgf};
179    
180     my $tail = substr $self->{sgf}, $pos, 32;
181 root 1.1 $tail =~ s/[\x00-\x1f]+/ /g;
182    
183 root 1.4 croak "$error (at octet $pos, '$tail')";
184 root 1.1 }
185    
186 root 1.4 sub decode_sgf {
187 root 1.1 my ($self, $sgf) = @_;
188    
189     # correct lines
190     if ($sgf =~ /[^\015\012]\015/) {
191     $sgf =~ s/\015\012?/\n/g;
192     } else {
193     $sgf =~ s/\012\015?/\n/g;
194     }
195    
196     $self->{sgf} = $sgf;
197    
198     $self->{FF} = 1;
199 root 1.4 $self->{CA} = 'WINDOWS-1252'; # too many files are
200 root 1.1 $self->{GM} = 1;
201    
202     my @trees;
203    
204     eval {
205     while ($self->{sgf} =~ /\G$ws(?=\()/sgoc) {
206 root 1.4 push @trees, $self->decode_GameTree;
207 root 1.1 }
208     };
209    
210 root 1.4 croak $@ if $@;
211 root 1.1
212     \@trees
213     }
214    
215 root 1.4 sub decode_GameTree {
216 root 1.1 my ($self) = @_;
217    
218     $self->{sgf} =~ /\G$ws\(/sgoc
219     or $self->error ("GameTree does not start with '('");
220    
221 root 1.4 my $nodes = $self->decode_Sequence;
222 root 1.1
223     while ($self->{sgf} =~ /\G$ws(?=\()/sgoc) {
224 root 1.4 push @{$nodes->[-1]{variations}}, $self->decode_GameTree;
225 root 1.1 }
226     $self->{sgf} =~ /\G$ws\)/sgoc
227     or $self->error ("GameTree does not end with ')'");
228    
229     $nodes
230     }
231    
232 root 1.4 sub postprocess {
233     my $self = shift;
234    
235     for (@_) {
236     if ("ARRAY" eq ref) {
237     $self->postprocess (@$_);
238     } elsif ("HASH" eq ref) {
239     if (my $value = $_->{_text}) {
240 root 1.6 $value =~ s/\\\n/ /g;
241 root 1.5 $value =~ s/\\(.)/$1/g;
242 root 1.4 $_ = eval { Encode::decode $self->{CA}, $value } || $value
243     } else {
244     $self->postprocess (values %$_);
245     }
246     }
247     }
248     }
249    
250     sub decode_Sequence {
251 root 1.1 my ($self) = @_;
252    
253 root 1.4 my (@nodes, $node, $name, $value, $prop, @val);
254 root 1.1
255     while ($self->{sgf} =~ /\G$ws;/goc) {
256     push @nodes, $node = {};
257     # Node
258     while ($self->{sgf} =~ /\G$ws([A-Z]+)/goc) {
259     # Property
260     $name = $1;
261 root 1.4 $prop = $property->{$name};
262 root 1.1
263     while ($self->{sgf} =~ /\G$ws\[((?:[^\\\]]*|\\.)*)\]/sgoc) {
264     # PropValue
265     $value = $1;
266 root 1.4 if ($prop) {
267     @val = $prop->{in}->($self, $value, $prop);
268 root 1.1
269     if ($prop->{is_list}) {
270     push @{$node->{$name}}, @val
271     } else {
272     $node->{$name} = $val[0];
273 root 1.4
274     $self->{CA} = $val[0] if $name eq "CA";
275 root 1.1 }
276     } else {
277 root 1.3 #warn "unknown property '$name', will be saved unchanged.";#d#
278 root 1.4 push @{$node->{$name}}, $value;
279 root 1.1 }
280     }
281     }
282 root 1.4
283     # postprocess nodes, currently only to decode text and simpletext
284     $self->postprocess ($node);
285 root 1.1 }
286    
287     \@nodes
288     }
289    
290 root 1.4 sub encode_sgf($) {
291     my ($self, $game) = @_;
292    
293     $self->{sgf} = "";
294    
295     $self->{FF} = 4;
296     $self->{CA} = 'UTF-8';
297     $self->{GM} = 1;
298     $self->{AP} = ["Games::Go::SGF::Grove", $VERSION];
299    
300     $self->encode_GameTree ($_, 1) for @$game;
301    
302     $self->{sgf}
303     }
304    
305     sub encode_GameTree {
306     my ($self, $sequence, $is_root) = @_;
307    
308     if ($is_root) {
309     my $root = $sequence->[0];
310    
311     $root->{CA} ||= $self->{CA};
312     $root->{FF} ||= $self->{FF};
313     $root->{GM} ||= $self->{GM};
314     $root->{AP} ||= $self->{AP};
315    
316     $self->{CA} = $root->{CA};
317     }
318    
319     $self->{sgf} .= "(";
320     $self->encode_Sequence ($sequence);
321     $self->{sgf} .= ")";
322     }
323    
324     sub encode_Sequence {
325     my ($self, $sequence) = @_;
326    
327 root 1.8 my ($value, $prop);
328    
329 root 1.4 for my $node (@$sequence) {
330     $self->{sgf} .= ";";
331    
332 root 1.8 for my $name (sort keys %$node) {
333 root 1.4 next unless $name eq uc $name;
334    
335 root 1.8 $value = $node->{$name};
336    
337 root 1.4 $self->{sgf} .= "$name\[";
338    
339 root 1.8 if ($prop = $property->{$name}) {
340 root 1.4 if ($prop->{is_list}) {
341     $self->{sgf} .= join "][", map $prop->{out}->($self, $_), @$value;
342     } else {
343     $self->{sgf} .= $prop->{out}->($self, $value);
344     }
345     } else {
346 elmex 1.9 $self->{sgf} .=
347     ref $value
348     ? join "][", @$value
349     : $value;
350 root 1.4 }
351    
352     $self->{sgf} .= "]";
353     }
354    
355     $self->encode_GameTree ($_) for @{ $node->{variations} };
356     }
357     }
358    
359 root 1.1 #############################################################################
360    
361     =head2 Property Type Structure
362    
363     A property type is a hash like this:
364    
365     {
366     name => "SQ",
367     group => {
368     name => "Markup properties",
369     restrictions => "CR, MA, SL, SQ and TR points must be unique, ...",
370     },
371     related => "TR, CR, LB, SL, AR, MA, LN",
372     function => "Marks the given points with a square.\nPoints must be unique.",
373     propertytype => "-",
374     propvalue => "list of point"
375     is_list => 1,
376     }
377    
378     =cut
379    
380    
381     {
382     my ($group, $name, $value, $prop);
383    
384     my (%char2coord, %coord2char);
385    
386     {
387     my @coord = ("a" .. "z", "A" .. "Z");
388 root 1.4
389 root 1.1 for (0.. $#coord) {
390     $char2coord{ $coord[$_] } = $_;
391     $coord2char{ $_ } = $coord[$_];
392     }
393     }
394    
395 root 1.3 sub _parsetype($);
396 root 1.1 sub _parsetype {
397     for (shift) {
398     if (s/e?list of //) {
399     $prop->{is_list} = 1;
400 root 1.3 return _parsetype $_;
401 root 1.4
402 root 1.1 } elsif (s/composed (\S+)\s+(?:':'\s+)?(\S+)//) {
403 root 1.4 $prop->{composed} = 1;
404 root 1.1 my ($i, $o) = ($1, $2);
405 root 1.3 my ($i1, $o1, $i2, $o2) = (_parsetype $i, _parsetype $o);
406 root 1.1 return (
407     sub {
408     if ($_[1] =~ /^((?:[^\\:]+|\\.)*)(?::(.*))$/s) {
409     # or $_[0]->error ("'Compose' ($i:$o) expected, got '$_[1]'");
410     my ($l, $r) = ($1, $2);
411    
412     [
413     $i1->($_[0], $l),
414     defined $r ? $i2->($_[0], $r) : undef,
415 root 1.4 ]
416 root 1.1 } else {
417 root 1.3 # yes, this is not according to standard, but let's handle it somehow anyway
418 elmex 1.9 [ $i1->($_[0], $_[1]) ]
419 root 1.1 }
420     },
421     sub {
422     $o1->($_[0], $_[1][0])
423 root 1.4 . ":"
424     . $o2->($_[0], $_[1][1])
425 root 1.1 },
426     );
427 root 1.4
428 root 1.1 } elsif (s/double//) {
429     return (
430     sub {
431     $_[1] =~ /^[12]$/
432 root 1.3 or $_[0]->error ("'Double' (1|2) expected, got '$_[1]'");
433 root 1.1 $_[1]
434     },
435     sub {
436     $_[1]
437     },
438     );
439     } elsif (s/color//) {
440     return (
441     sub {
442 root 1.4 # too many broken programs write this wrong
443     return "B" if $_[1] eq "1";
444     return "W" if $_[1] eq "2";
445    
446 root 1.1 $_[1] =~ /^[BW]$/i
447 root 1.3 or $_[0]->error ("'Color' (B|W) expected, got '$_[1]'");
448 root 1.1 lc $_[1]
449     },
450     sub {
451     uc $_[1]
452     },
453     );
454     } elsif (s/none//) {
455     return (
456     sub {
457     $_[1] =~ /^$/i
458 root 1.3 or $_[0]->error ("'None' expected, got '$_[1]'");
459 root 1.1 undef
460     },
461     sub {
462     "",
463     },
464     );
465     } elsif (s/point// || s/move// || s/stone//) {
466     return (
467     sub {
468     if ($_[2]->{is_list}) {
469     if ($_[1] =~ /^([^:]+):(.*)$/) {
470     my ($ul, $dr) = ($1, $2);
471     my ($x1, $y1) = map $char2coord{$_}, split //, $ul;
472     my ($x2, $y2) = map $char2coord{$_}, split //, $dr;
473     my @stones;
474     for (my $d = $x1; $d < $x2; $d++) {
475     for (my $i = $y1; $i < $y2; $i++) {
476     push @stones, [$d, $i];
477     }
478     }
479     return @stones;
480     }
481     }
482     $_[1] =~ /^(.)(.)$/
483     ? [ $char2coord{$1}, $char2coord{$2} ]
484     : []
485     },
486     sub {
487 root 1.4 $coord2char{$_[1][0]} . $coord2char{$_[1][1]}
488 root 1.1 },
489     );
490     } elsif (s/real//) {
491     return (
492     sub {
493     $_[1] =~ /^[+-]?[0-9]*\.?[0-9]*$/i
494 root 1.3 or $_[0]->error ("'Real' expected, got '$_[1]'");
495 root 1.4 $_[1]+0
496 root 1.1 },
497     sub {
498 root 1.4 $_[1]+0
499 root 1.1 },
500     );
501     } elsif (s/number//) {
502     return (
503     sub {
504     $_[1] =~ /^[+-]?[0-9]*$/i
505 root 1.3 or $_[0]->error ("'Number' expected, got '$_[1]'");
506 root 1.4 $_[1]+0
507 root 1.1 },
508     sub {
509 root 1.4 int $_[1]
510 root 1.1 },
511     );
512 root 1.4 } elsif (s/text// || s/simpletext//i) {
513 root 1.1 return (
514     sub {
515 root 1.4 { _text => $_[1] }
516 root 1.1 },
517     sub {
518 root 1.4 my $str = Encode::encode $_[0]{CA}, $_[1];
519     $str =~ s/([\:\]\\])/\\$1/g;
520     $str
521 root 1.1 },
522     );
523     } else {
524     die "FATAL: garbled DATA section, unknown type '$_'";
525     }
526     }
527     }
528    
529     while (<DATA>) {
530     if (/^(\S+):\t(.*)/) {
531     if ($name eq "Restrictions") {
532     $group->{restrictions} = $value;
533     } elsif ($name eq "Property") {
534     $property->{$value} =
535     $prop = {
536     name => $value,
537     group => $group,
538     };
539     } elsif ($name ne "") {
540     $prop->{lc $name} = $value;
541     if ($name eq "Propvalue") {
542     ($prop->{in}, $prop->{out}) = _parsetype $value;
543     }
544     }
545     $name = $1;
546     $value = $2;
547     } elsif (/^\t\t(.*)/) {
548     $value .= "\n$1";
549     } elsif (/(\S.*)/) {
550     $group = {
551     name => $1,
552     };
553     } elsif (/^$/) {
554     # nop
555     } else {
556     die "FATAL: DATA section garbled\n";
557     }
558     }
559     }
560    
561     1;
562    
563     =head1 AUTHOR
564    
565     Marc Lehmann <schmorp@schmorp.de>
566     Robin Redeker <elmex@ta-sa.org>
567    
568     =cut
569    
570     # now node descriptions follow
571    
572     __DATA__
573     Move properties
574    
575     Property: B
576     Propvalue: move
577     Propertytype: move
578     Function: Execute a black move. This is one of the most used properties
579     in actual collections. As long as
580     the given move is syntactically correct it should be executed.
581     It doesn't matter if the move itself is illegal
582     (e.g. recapturing a ko in a Go game).
583     Have a look at how to execute a Go-move.
584     B and W properties must not be mixed within a node.
585     Related: W, KO
586    
587     Property: KO
588     Propvalue: none
589     Propertytype: move
590     Function: Execute a given move (B or W) even it's illegal. This is
591     an optional property, SGF viewers themselves should execute
592     ALL moves. It's purpose is to make it easier for other
593     applications (e.g. computer-players) to deal with illegal
594     moves. A KO property without a black or white move within
595     the same node is illegal.
596     Related: W, B
597    
598     Property: MN
599     Propvalue: number
600     Propertytype: move
601     Function: Sets the move number to the given value, i.e. a move
602     specified in this node has exactly this move-number. This
603     can be useful for variations or printing.
604     Related: B, W, FG, PM
605    
606     Property: W
607     Propvalue: move
608     Propertytype: move
609     Function: Execute a white move. This is one of the most used properties
610     in actual collections. As long as
611     the given move is syntactically correct it should be executed.
612     It doesn't matter if the move itself is illegal
613     (e.g. recapturing a ko in a Go game).
614     Have a look at how to execute a Go-move.
615     B and W properties must not be mixed within a node.
616     Related: B, KO
617    
618     Setup properties
619     Restrictions: AB, AW and AE must have unique points, i.e. it is illegal to place different colors on the same point within one node.
620     AB, AW and AE values which don't change the board, e.g. placing a black stone with AB[] over a black stone that's already there, is bad style. Applications may want to delete these values and issue a warning.
621    
622     Property: AB
623     Propvalue: list of stone
624     Propertytype: setup
625     Function: Add black stones to the board. This can be used to set up
626     positions or problems. Adding is done by 'overwriting' the
627     given point with black stones. It doesn't matter what
628     was there before. Adding a stone doesn't make any prisoners
629     nor any other captures (e.g. suicide). Thus it's possible
630     to create illegal board positions.
631     Points used in stone type must be unique.
632     Related: AW, AE, PL
633    
634     Property: AE
635     Propvalue: list of point
636     Propertytype: setup
637     Function: Clear the given points on the board. This can be used
638     to set up positions or problems. Clearing is done by
639     'overwriting' the given points, so that they contain no
640     stones. It doesn't matter what was there before.
641     Clearing doesn't count as taking prisoners.
642     Points must be unique.
643     Related: AB, AW, PL
644    
645     Property: AW
646     Propvalue: list of stone
647     Propertytype: setup
648     Function: Add white stones to the board. This can be used to set up
649     positions or problems. Adding is done by 'overwriting' the
650     given points with white stones. It doesn't matter what
651     was there before. Adding a stone doesn't make any prisoners
652     nor any other captures (e.g. suicide). Thus it's possible
653     to create illegal board positions.
654     Points used in stone type must be unique.
655     Related: AB, AE, PL
656    
657     Property: PL
658     Propvalue: color
659     Propertytype: setup
660     Function: PL tells whose turn it is to play. This can be used when
661     setting up positions or problems.
662     Related: AE, AB, AW
663    
664     Node annotation properties
665    
666     Property: C
667     Propvalue: text
668     Propertytype: -
669     Function: Provides a comment text for the given node. The purpose of
670     providing both a node name and a comment is to have a short
671     identifier like "doesn't work" or "Dia. 15" that can be
672     displayed directly with the properties of the node, even if
673     the comment is turned off or shown in a separate window.
674     See text-type for more info.
675     Related: N, ST, V, UC, DM, HO
676    
677     Property: DM
678     Propvalue: double
679     Propertytype: -
680     Function: The position is even. SGF viewers should display a
681     message. This property may indicate main variations in
682     opening libraries (joseki) too. Thus DM[2] indicates an
683     even result for both players and that this is a main
684     variation of this joseki/opening.
685     This property must not be mixed with UC, GB or GW
686     within a node.
687     Related: UC, GW, GB
688    
689     Property: GB
690     Propvalue: double
691     Propertytype: -
692     Function: Something good for black. SGF viewers should display a
693     message. The property is not related to any specific place
694     on the board, but marks the whole node instead.
695     GB must not be mixed with GW, DM or UC within a node.
696     Related: GW, C, UC, DM
697    
698     Property: GW
699     Propvalue: double
700     Propertytype: -
701     Function: Something good for white. SGF viewers should display a
702     message. The property is not related to any specific place
703     on the board, but marks the whole node instead.
704     GW must not be mixed with GB, DM or UC within a node.
705     Related: GB, C, UC, DM
706    
707     Property: HO
708     Propvalue: double
709     Propertytype: -
710     Function: Node is a 'hotspot', i.e. something interesting (e.g.
711     node contains a game-deciding move).
712     SGF viewers should display a message.
713     The property is not related to any specific place
714     on the board, but marks the whole node instead.
715     Sophisticated applications could implement the navigation
716     command next/previous hotspot.
717     Related: GB, GW, C, UC, DM
718    
719     Property: N
720     Propvalue: simpletext
721     Propertytype: -
722     Function: Provides a name for the node. For more info have a look at
723     the C-property.
724     Related: C, ST, V
725    
726     Property: UC
727     Propvalue: double
728     Propertytype: -
729     Function: The position is unclear. SGF viewers should display a
730     message. This property must not be mixed with DM, GB or GW
731     within a node.
732     Related: DM, GW, GB
733    
734     Property: V
735     Propvalue: real
736     Propertytype: -
737     Function: Define a value for the node. Positive values are good for
738     black, negative values are good for white.
739     The interpretation of particular values is game-specific.
740     In Go, this is the estimated score.
741     Related: C, N, RE
742    
743     Move annotation properties
744     Restrictions: Move annotation properties without a move (B[] or W[]) within the same node are senseless and therefore illegal. Applications should delete such properties and issue a warning.
745     BM, TE, DO and IT are mutual exclusive, i.e. they must not be mixed within a single node.
746    
747     Property: BM
748     Propvalue: double
749     Propertytype: move
750     Function: The played move is bad.
751     Viewers should display a message.
752     Related: TE, DO, IT
753    
754     Property: DO
755     Propvalue: none
756     Propertytype: move
757     Function: The played move is doubtful.
758     Viewers should display a message.
759     Related: BM, TE, IT
760    
761     Property: IT
762     Propvalue: none
763     Propertytype: move
764     Function: The played move is interesting.
765     Viewers should display a message.
766     Related: BM, DO, TE
767    
768     Property: TE
769     Propvalue: double
770     Propertytype: move
771     Function: The played move is a tesuji (good move).
772     Viewers should display a message.
773     Related: BM, DO, IT
774    
775     Markup properties
776     Restrictions: CR, MA, SL, SQ and TR points must be unique, i.e. it's illegal to have two or more of these markups on the same point within a node.
777    
778     Property: AR
779     Propvalue: list of composed point point
780     Propertytype: -
781     Function: Viewers should draw an arrow pointing FROM the first point
782     TO the second point.
783     It's illegal to specify the same arrow twice,
784     e.g. (Go) AR[aa:bb][aa:bb]. Different arrows may have the same
785     starting or ending point though.
786     It's illegal to specify a one point arrow, e.g. AR[cc:cc]
787     as it's impossible to tell into which direction the
788     arrow points.
789     Related: TR, CR, LB, SL, MA, SQ, LN
790    
791     Property: CR
792     Propvalue: list of point
793     Propertytype: -
794     Function: Marks the given points with a circle.
795     Points must be unique.
796     Related: TR, MA, LB, SL, AR, SQ, LN
797    
798     Property: DD
799     Propvalue: elist of point
800     Propertytype: inherit
801     Function: Dim (grey out) the given points.
802     DD[] clears any setting, i.e. it undims everything.
803     Related: VW
804    
805     Property: LB
806     Propvalue: list of composed point simpletext
807     Propertytype: -
808     Function: Writes the given text on the board. The text should be
809     centered around the given point. Note: there's no longer
810     a restriction to the length of the text to be displayed.
811     Have a look at the FF4 example file on possibilities
812     to display long labels (pictures five and six).
813     Points must be unique.
814     Related: TR, CR, MA, SL, AR, SQ, LN
815    
816     Property: LN
817     Propvalue: list of composed point point
818     Propertytype: -
819     Function: Applications should draw a simple line form one point
820     to the other.
821     It's illegal to specify the same line twice,
822     e.g. (Go) LN[aa:bb][aa:bb]. Different lines may have the same
823     starting or ending point though.
824     It's illegal to specify a one point line, e.g. LN[cc:cc].
825     Related: TR, CR, MA, SL, AR, SQ, LB
826    
827    
828     Property: MA
829     Propvalue: list of point
830     Propertytype: -
831     Function: Marks the given points with an 'X'.
832     Points must be unique.
833     Related: TR, CR, LB, SL, AR, SQ, LN
834    
835     Property: SL
836     Propvalue: list of point
837     Propertytype: -
838     Function: Selected points. Type of markup unknown
839     (though SGB inverts the colors of the given points).
840     Points must be unique.
841     Related: TR, CR, LB, MA, AR, LN
842    
843     Property: SQ
844     Propvalue: list of point
845     Propertytype: -
846     Function: Marks the given points with a square.
847     Points must be unique.
848     Related: TR, CR, LB, SL, AR, MA, LN
849    
850     Property: TR
851     Propvalue: list of point
852     Propertytype: -
853     Function: Marks the given points with a triangle.
854     Points must be unique.
855     Related: MA, CR, LB, SL, AR, LN
856    
857     Root properties
858    
859     Property: AP
860     Propvalue: composed simpletext simpletext
861     Propertytype: root
862     Function: Provides the name and version number of the application used
863     to create this gametree.
864     The name should be unique and must not be changed for
865     different versions of the same program.
866     The version number itself may be of any kind, but the format
867     used must ensure that by using an ordinary string-compare,
868     one is able to tell if the version is lower or higher
869     than another version number.
870     Here's the list of known applications and their names:
871    
872     Application System Name
873     --------------------------- ----------- --------------------
874     [CGoban:1.6.2] Unix CGoban
875     [Hibiscus:2.1] Windows 95 Hibiscus Go Editor
876     [IGS:5.0] Internet Go Server
877     [Many Faces of Go:10.0] Windows 95 The Many Faces of Go
878     [MGT:?] DOS/Unix MGT
879     [NNGS:?] Unix No Name Go Server
880     [Primiview:3.0] Amiga OS3.0 Primiview
881     [SGB:?] Macintosh Smart Game Board
882     [SmartGo:1.0] Windows SmartGo
883    
884     Related: FF, GM, SZ, ST, CA
885    
886     Property: CA
887     Propvalue: simpletext
888     Propertytype: root
889     Function: Provides the used charset for SimpleText and Text type.
890     Default value is 'ISO-8859-1' aka 'Latin1'.
891     Only charset names (or their aliases) as specified in RFC 1345
892     (or updates thereof) are allowed.
893     Basically this field uses the same names as MIME messages in
894     their 'charset=' field (in Content-Type).
895     RFC's can be obtained via FTP from DS.INTERNIC.NET,
896     NIS.NSF.NET, WUARCHIVE.WUSTL.EDU, SRC.DOC.IC.AC.UK
897     or FTP.IMAG.FR.
898     Related: FF, C, text type
899    
900     Property: FF
901     Propvalue: number (range: 1-4)
902     Propertytype: root
903     Function: Defines the used file format. For difference between those
904     formats have a look at the history of SGF.
905     Default value: 1
906     Applications must be able to deal with different file formats
907     within a collection.
908     Related: GM, SZ, ST, AP, CA
909    
910     Property: GM
911     Propvalue: number (range: 1-16)
912     Propertytype: root
913     Function: Defines the type of game, which is stored in the current
914     gametree. The property should help applications
915     to reject games, they cannot handle.
916     Valid numbers are: Go = 1, Othello = 2, chess = 3,
917     Gomoku+Renju = 4, Nine Men's Morris = 5, Backgammon = 6,
918     Chinese chess = 7, Shogi = 8, Lines of Action = 9,
919     Ataxx = 10, Hex = 11, Jungle = 12, Neutron = 13,
920     Philosopher's Football = 14, Quadrature = 15, Trax = 16,
921     Tantrix = 17, Amazons = 18, Octi = 19, Gess = 20.
922     Default value: 1
923     Different kind of games may appear within a collection.
924     Related: FF, SZ, ST, AP, CA
925    
926     Property: ST
927     Propvalue: number (range: 0-3)
928     Propertytype: root
929     Function: Defines how variations should be shown (this is needed to
930     synchronize the comments with the variations). If ST is omitted
931     viewers should offer the possibility to change the mode online.
932     Basically most programs show variations in two ways:
933     as markup on the board (if the variation contains a move)
934     and/or as a list (in a separate window).
935     The style number consists two options.
936     1) show variations of successor node (children) (value: 0)
937     show variations of current node (siblings) (value: 1)
938     affects markup & list
939     2) do board markup (value: 0)
940     no (auto-) board markup (value: 2)
941     affects markup only.
942     Using no board markup could be used in problem collections
943     or if variations are marked by subsequent properties.
944     Viewers should take care, that the automatic variation
945     board markup DOESN'T overwrite any markup of other
946     properties.
947     The final number is calculated by adding the values of each
948     option. Example: 3 = no board markup/variations of current node
949     1 = board markup/variations of current node
950     Default value: 0
951     Related: C, FF, GM, SZ, AP, CA
952    
953     Property: SZ
954 root 1.4 Propvalue: number
955 root 1.1 Propertytype: root
956     Function: Defines the size of the board. If only a single value
957     is given, the board is a square; with two numbers given,
958     rectangular boards are possible.
959     If a rectangular board is specified, the first number specifies
960     the number of columns, the second provides the number of rows.
961     Square boards must not be defined using the compose type
962     value: e.g. SZ[19:19] is illegal.
963     The valid range for SZ is any size greater or equal to 1x1.
964     For Go games the maximum size is limited to 52x52.
965     Default value: game specific
966     for Go: 19 (square board)
967     for Chess: 8 (square board)
968     Different board sizes may appear within a collection.
969     See move-/point-type for more info.
970     Related: FF, GM, ST, AP, CA
971    
972     Game info properties
973    
974     Property: AN
975     Propvalue: simpletext
976     Propertytype: game-info
977     Function: Provides the name of the person, who made the annotations
978     to the game.
979     Related: US, SO, CP
980    
981     Property: BR
982     Propvalue: simpletext
983     Propertytype: game-info
984     Function: Provides the rank of the black player.
985     For Go (GM[1]) the following format is recommended:
986     "..k" or "..kyu" for kyu ranks and
987     "..d" or "..dan" for dan ranks.
988     Go servers may want to add '?' for an uncertain rating and
989     '*' for an established rating.
990     Related: PB, BT, WR
991    
992     Property: BT
993     Propvalue: simpletext
994     Propertytype: game-info
995     Function: Provides the name of the black team, if game was part of a
996     team-match (e.g. China-Japan Supermatch).
997     Related: PB, PW, WT
998    
999     Property: CP
1000     Propvalue: simpletext
1001     Propertytype: game-info
1002     Function: Any copyright information (e.g. for the annotations) should
1003     be included here.
1004     Related: US, SO, AN
1005    
1006     Property: DT
1007     Propvalue: simpletext
1008     Propertytype: game-info
1009     Function: Provides the date when the game was played.
1010     It is MANDATORY to use the ISO-standard format for DT.
1011     Note: ISO format implies usage of the Gregorian calendar.
1012     Syntax:
1013     "YYYY-MM-DD" year (4 digits), month (2 digits), day (2 digits)
1014     Do not use other separators such as "/", " ", "," or ".".
1015     Partial dates are allowed:
1016     "YYYY" - game was played in YYYY
1017     "YYYY-MM" - game was played in YYYY, month MM
1018     For games that last more than one day: separate other dates
1019     by a comma (no spaces!); following shortcuts may be used:
1020     "MM-DD" - if preceded by YYYY-MM-DD, YYYY-MM, MM-DD, MM or DD
1021     "MM" - if preceded by YYYY-MM or MM
1022     "DD" - if preceded by YYYY-MM-DD, MM-DD or DD
1023     Shortcuts acquire the last preceding YYYY and MM (if
1024     necessary).
1025     Note: interpretation is done from left to right.
1026     Examples:
1027     1996-05,06 = played in May,June 1996
1028     1996-05-06,07,08 = played on 6th,7th,8th May 1996
1029     1996,1997 = played in 1996 and 1997
1030     1996-12-27,28,1997-01-03,04 = played on 27th,28th
1031     of December 1996 and on 3rd,4th January 1997
1032     Note: it's recommended to use shortcuts whenever possible,
1033     e.g. 1997-05-05,06 instead of 1997-05-05,1997-05-06
1034     Related: EV, RO, PC, RU, RE, TM
1035    
1036     Property: EV
1037     Propvalue: simpletext
1038     Propertytype: game-info
1039     Function: Provides the name of the event (e.g. tournament).
1040     Additional information (e.g. final, playoff, ..)
1041     shouldn't be included (see RO).
1042     Related: GC, RO, DT, PC, RU, RE, TM
1043    
1044     Property: GN
1045     Propvalue: simpletext
1046     Propertytype: game-info
1047     Function: Provides a name for the game. The name is used to
1048     easily find games within a collection.
1049     The name should therefore contain some helpful information
1050     for identifying the game. 'GameName' could also be used
1051     as the file-name, if a collection is split into
1052     single files.
1053     Related: GC, EV, DT, PC, RO, ID
1054    
1055     Property: GC
1056     Propvalue: text
1057     Propertytype: game-info
1058     Function: Provides some extra information about the following game.
1059     The intend of GC is to provide some background information
1060     and/or to summarize the game itself.
1061     Related: GN, ON, AN, CP
1062    
1063     Property: ON
1064     Propvalue: simpletext
1065     Propertytype: game-info
1066     Function: Provides some information about the opening played
1067     (e.g. san-ren-sei, Chinese fuseki, etc.).
1068     Related: GN, GC
1069    
1070     Property: OT
1071     Propvalue: simpletext
1072     Propertytype: game-info
1073     Function: Describes the method used for overtime (byo-yomi).
1074     Examples: "5 mins Japanese style, 1 move / min",
1075     "25 moves / 10 min".
1076     Related: TM, BL, WL, OB, OW
1077    
1078     Property: PB
1079     Propvalue: simpletext
1080     Propertytype: game-info
1081     Function: Provides the name of the black player.
1082     Related: PW, BT, WT
1083    
1084     Property: PC
1085     Propvalue: simpletext
1086     Propertytype: game-info
1087     Function: Provides the place where the games was played.
1088     Related: EV, DT, RO, RU, RE, TM
1089    
1090     Property: PW
1091     Propvalue: simpletext
1092     Propertytype: game-info
1093     Function: Provides the name of the white player.
1094     Related: PB, BT, WT
1095    
1096     Property: RE
1097     Propvalue: simpletext
1098     Propertytype: game-info
1099     Function: Provides the result of the game. It is MANDATORY to use the
1100     following format:
1101     "0" (zero) or "Draw" for a draw (jigo),
1102     "B+" ["score"] for a black win and
1103     "W+" ["score"] for a white win
1104     Score is optional (some games don't have a score e.g. chess).
1105     If the score is given it has to be given as a real value,
1106     e.g. "B+0.5", "W+64", "B+12.5"
1107     Use "B+R" or "B+Resign" and "W+R" or "W+Resign" for a win by
1108     resignation. Applications must not write "Black resigns".
1109     Use "B+T" or "B+Time" and "W+T" or "W+Time" for a win on time,
1110     "B+F" or "B+Forfeit" and "W+F" or "W+Forfeit" for a win by
1111     forfeit,
1112     "Void" for no result or suspended play and
1113     "?" for an unknown result.
1114    
1115     Related: EV, DT, PC, RO, RU, TM
1116    
1117     Property: RO
1118     Propvalue: simpletext
1119     Propertytype: game-info
1120     Function: Provides round-number and type of round. It should be
1121     written in the following way: RO[xx (tt)], where xx is the
1122     number of the round and (tt) the type:
1123     final, playoff, league, ...
1124     Related: EV, DT, PC, RU, RE, TM
1125    
1126     Property: RU
1127     Propvalue: simpletext
1128     Propertytype: game-info
1129     Function: Provides the used rules for this game.
1130     Because there are many different rules, SGF requires
1131     mandatory names only for a small set of well known rule sets.
1132     Note: it's beyond the scope of this specification to give an
1133     exact specification of these rule sets.
1134     Mandatory names for Go (GM[1]):
1135     "AGA" (rules of the American Go Association)
1136     "GOE" (the Ing rules of Goe)
1137     "Japanese" (the Nihon-Kiin rule set)
1138     "NZ" (New Zealand rules)
1139    
1140     Related: EV, DT, PC, RO, RE, TM
1141    
1142     Property: SO
1143     Propvalue: simpletext
1144     Propertytype: game-info
1145     Function: Provides the name of the source (e.g. book, journal, ...).
1146     Related: US, AN, CP
1147    
1148     Property: TM
1149     Propvalue: real
1150     Propertytype: game-info
1151     Function: Provides the time limits of the game.
1152     The time limit is given in seconds.
1153     Related: EV, DT, PC, RO, RU, RE
1154    
1155     Property: US
1156     Propvalue: simpletext
1157     Propertytype: game-info
1158     Function: Provides the name of the user (or program), who entered
1159     the game.
1160     Related: SO, AN, CP
1161    
1162     Property: WR
1163     Propvalue: simpletext
1164     Propertytype: game-info
1165     Function: Provides the rank of the white player. For recommended
1166     format see BR.
1167     Related: PW, WT, BR
1168    
1169     Property: WT
1170     Propvalue: simpletext
1171     Propertytype: game-info
1172     Function: Provide the name of the white team, if game was part of a
1173     team-match (e.g. China-Japan Supermatch).
1174     Related: PB, PW, BT
1175    
1176     Timing properties
1177    
1178     Property: BL
1179     Propvalue: real
1180     Propertytype: move
1181     Function: Time left for black, after the move was made.
1182     Value is given in seconds.
1183     Related: TM, OT, WL, OB, OW
1184    
1185     Property: OB
1186     Propvalue: number
1187     Propertytype: move
1188     Function: Number of black moves left (after the move of this node was
1189     played) to play in this byo-yomi period.
1190     Related: TM, OT, BL, WL, OW
1191    
1192     Property: OW
1193     Propvalue: number
1194     Propertytype: move
1195     Function: Number of white moves left (after the move of this node was
1196     played) to play in this byo-yomi period.
1197     Related: TM, OT, BL, WL, OB
1198    
1199     Property: WL
1200     Propvalue: real
1201     Propertytype: move
1202     Function: Time left for white after the move was made.
1203     Value is given in seconds.
1204     Related: TM, OT, BL, OB, OW
1205    
1206     Miscellaneous properties
1207    
1208     Property: FG
1209     Propvalue: composed number SimpleText
1210     Propertytype: -
1211     Function: The figure property is used to divide a game into
1212     different figures for printing: a new figure starts at the
1213     node containing a figure property.
1214     If the value is not empty then
1215     - Simpletext provides a name for the diagram
1216     - Number specifies some flags (for printing).
1217     These flags are:
1218     - coordinates on/off (value: 0/1)
1219     - diagram name on/off (value: 0/2)
1220     - list moves not shown in figure on/off (value: 0/4)
1221     Some moves can't be shown in a diagram (e.g. ko
1222     captures in Go) - these moves may be listed as text.
1223     - remove captured stones on/off (value: 0/256)
1224     'remove off' means: keep captured stones in the
1225     diagram and don't overwrite stones played earlier -
1226     this is the way diagrams are printed in books.
1227     'remove on' means: capture and remove the stones from
1228     the display - this is the usual viewer mode.
1229     This flag is specific to Go (GM[1]).
1230     - hoshi dots on/off (value: 0/512)
1231     This flag is specific to Go (GM[1]).
1232     - Ignore flags on/off (value: 32768)
1233     If on, then all other flags should be ignored and
1234     the application should use its own defaults.
1235     The final number is calculated by summing up all flag values.
1236     E.g. 515 = coordinates and diagram name off, remove captured
1237     stones, list unshown moves, hoshi dots off;
1238     257 = coordinates off, diagram name on, list unshown moves,
1239     don't remove captured stones, hoshi dots on.
1240     (this is how diagrams are printed in e.g. Go World)
1241     Note: FG combined with VW, MN and PM are mighty tools to print
1242     and compile diagrams.
1243     Related: MN, PM, VW
1244    
1245     Property: PM
1246     Propvalue: number
1247     Propertytype: inherit
1248     Function: This property is used for printing.
1249     It specifies how move numbers should be printed.
1250     0 ... don't print move numbers
1251     1 ... print move numbers as they are
1252     2 ... print 'modulo 100' move numbers
1253     This mode is usually used in books or magazines.
1254     Note: Only the first move number is calculated
1255     'modulo 100' and the obtained number is increased
1256     for each move in the diagram.
1257     E.g. A figure containing moves
1258     32-78 is printed as moves 32-78
1259     102-177 is printed as moves 2-77
1260     67-117 is printed as moves 67-117
1261     154-213 is printed as moves 54-113
1262     Default value: 1
1263     Related: MN, FG
1264    
1265     Property: VW
1266     Propvalue: elist of point
1267     Propertytype: inherit
1268     Function: View only part of the board. The points listed are
1269     visible, all other points are invisible.
1270     Note: usually the point list is given in compressed
1271     format (see 'point' type)!
1272     Points have to be unique.
1273     Have a look at the picture to get an idea.
1274     VW[] clears any setting, i.e. the whole board is
1275     visible again.
1276     Related: DD, PM, FG
1277    
1278     Go properties
1279     Restrictions: TW and TB points must be unique, i.e. it's illegal to list the same point in TB and TW within the same node.
1280     Gametype: 1
1281    
1282     Property: HA
1283     Propvalue: number
1284     Propertytype: game-info
1285     Function: Defines the number of handicap stones (>=2).
1286     If there is a handicap, the position should be set up with
1287     AB within the same node.
1288     HA itself doesn't add any stones to the board, nor does
1289     it imply any particular way of placing the handicap stones.
1290     Related: KM, RE, RU
1291    
1292     Property: KM
1293     Propvalue: real
1294     Propertytype: game-info
1295     Function: Defines the komi.
1296     Related: HA, RE, RU
1297    
1298     Property: TB
1299     Propvalue: elist of point
1300     Propertytype: -
1301     Function: Specifies the black territory or area (depends on
1302     rule set used).
1303     Points must be unique.
1304     Related: TW
1305    
1306     Property: TW
1307     Propvalue: elist of point
1308     Propertytype: -
1309     Function: Specifies the white territory or area (depends on
1310     rule set used).
1311     Points must be unique.
1312     Related: TB
1313    
1314     Octi properties
1315     Gametype: 19
1316    
1317     Property: RU (rules)
1318     Propvalue: simpletext
1319     Propertytype: game-info
1320     Function: Valid values are one major variation ("full", "fast",
1321     or "kids") followed by a colon and a comma separated
1322     elist of variations ("edgeless", "superprong", etc.).
1323    
1324     The colon may be omitted if either side is empty.
1325     The default is 2-player full, no variations.
1326     The 4-player game is not currently available.
1327    
1328     Property: BO (black octisquares)
1329     Propvalue: list of point
1330     Propertytype: game-info
1331     Function: The position of Black's octi squares. Black will be
1332     setup with one empty pod on each of these points.
1333     It is illegal to list the same point twice.
1334     Traditionally, Black sits at the south end of the board.
1335     Related: WO
1336    
1337     Property: WO (white octisquares)
1338     Propvalue: list of point
1339     Propertytype: game-info
1340     Function: The position of White's octi squares. White will be
1341     setup with one empty pod on each of these points.
1342     It is illegal to list the same point twice.
1343     Traditionally, White sits at the north end of the board.
1344     Related: BO
1345    
1346     Property: NP (number of prongs)
1347     Propvalue: number
1348     Propertytype: game-info
1349     Function: This is the number of prongs each players has at the
1350     start of the game.
1351     The default will be derived from the rules.
1352     Related: NR
1353    
1354     Property: NR (number of reserve)
1355     Propvalue: number
1356     Propertytype: game-info
1357     Function: This is the number of pods in each players reserve at
1358     the start of the game.
1359     The default will be derived from the rules.
1360     Related: NP, NS
1361    
1362     Property: NS (number of superprongs)
1363     Propvalue: number
1364     Propertytype: game-info
1365     Function: This is the number of superprongs each players has at
1366     the start of the game.
1367     The default will be derived from the rules.
1368     Related: NR
1369    
1370     Property: AS (arrow stone)
1371     Propvalue: list of composed stone ':' point
1372     Propertytype: -
1373     Function: Most of the same restriction from AR apply.
1374     The same arrow must not occur twice; however, two arrows
1375     from different stones at the same point may have arrows
1376     to the same destination. Single point arrows are also
1377     illegal.
1378     Related: AR
1379    
1380     Property: CS (circle stone)
1381     Propvalue: list of stone
1382     Propertytype: -
1383     Function: Marks the given stones, each with a circle.
1384     Related: CR
1385    
1386     Property: MS (mark stone)
1387     Propvalue: list of stone
1388     Propertytype: -
1389     Function: Marks the given stones, each with an ex.
1390     Related: MA
1391    
1392     Property: SS (square stone)
1393     Propvalue: list of stone
1394     Propertytype: -
1395     Function: Marks the given stones, each with a square.
1396     Related: SQ
1397    
1398     Property: TS (triangle stone)
1399     Propvalue: list of stone
1400     Propertytype: -
1401     Function: Marks the given stones, each with a triangle.
1402     Related: TR
1403    
1404     Property: RP (remove pod)
1405     Propvalue: list of stone
1406     Propertytype: setup
1407     Function: Removes a stone from the board.
1408     More selective than AddEmpty.
1409     Related: AE
1410    
1411     Backgammon properties
1412     Gametype: 6
1413    
1414     Property: CO
1415     Propvalue: simpletext
1416     Propertytype: setup
1417     Function: Set the position of the doubling cube. The value
1418     should be `b' (black), `w' (white), `c' (centred), or `n'
1419     (none -- for cubeless or Crawford games).
1420     Related: CV
1421    
1422     Property: CV
1423     Propvalue: number
1424     Propertytype: setup
1425     Function: Set the value of the doubling cube. This value
1426     defaults to 1 at the beginning of the game, but a CV property
1427     should be added when setting up a position where a double has
1428     been made, or at the beginning of a money game if automatic
1429     doubles occur.
1430     Related: CP
1431    
1432     Property: DI
1433     Propvalue: number
1434     Propertytype: setup
1435     Function: Set the dice without moving (this could be useful for
1436     creating problem positions, e.g. DI[31])
1437     Related: CO
1438    
1439     Property: MI
1440     Propvalue: list of composed simpletext ':' simpletext
1441     Propertytype: game-info
1442     Function: Specifies information about the match the game belongs to.
1443     This property should specify a list of tag/value pairs, where
1444     the allowable tags are case-insensitive, and include:
1445    
1446     length - the match length (number of points); value should
1447     be a number
1448     game - the number of this game within the match (the
1449     first game is 1); value should be a number
1450     bs - the score for Black at the start of the game;
1451     value should be a number
1452     ws - the score for White at the start of the game;
1453     value should be a number
1454    
1455     Unknown tags should be ignored (a warning may be produced).
1456     The order of tags in the list is not significant. An example
1457     MI property is:
1458     MI[length:7][game:3][ws:2][bs:1]
1459     Related: EV, GN, RE, RO
1460    
1461     Property: RE
1462     Propvalue: simpletext
1463     Propertytype: game-info
1464     Function: The general RE property has the following
1465     modification in backgammon games: in the case of a
1466     resignation, the value should also specify the number of
1467     points before the R(esign). Here are three example RE
1468     properties:
1469    
1470     RE[B+6R] -- White resigns a backgammon on a 2
1471     cube (worth 6 points).
1472     RE[W+2Resign] -- Black resigns a gammon on a 1 cube
1473     (worth 2 points).
1474     RE[W+4] -- Black drops a redouble to 8 (note
1475     this is considered a normal loss, not
1476     a resignation).
1477     Related: RE
1478    
1479     Property: RU
1480     Propvalue: simpletext
1481     Propertytype: game-info
1482     Function: Backgammon-specific values for the general RU property
1483     include the following:
1484    
1485     [Crawford] -- the Crawford rule is being used in this match,
1486     although this is not the Crawford game.
1487     [Crawford:CrawfordGame] -- this IS the Crawford game.
1488     [Jacoby] -- the Jacoby rule is in use for this game.
1489     Related: RU
1490    
1491     Lines of Action properties
1492     Gametype: 9
1493    
1494     Property: AS
1495     Propvalue: SimpleText
1496     Propertytype: -
1497     Function: Adding stones - the color of the player who is adding
1498     stones to the board. The valid strings are 'Black', 'White'
1499     or 'None'. The puropse of this property is to define a
1500     board position where the human is expected to continue placing
1501     stones on the board through some user interface.
1502    
1503     Property: IP
1504     Propvalue: SimpleText
1505     Propertytype: game-info
1506     Function: Designates the initial position in the game to be
1507     displayed by the viewer.
1508     The only value currently supported is 'End', which causes
1509     the viewer to initially display the final position of the game.
1510     The default is to display the position after setup but before
1511     any moves.
1512    
1513     Property: IY
1514     Propvalue: SimpleText
1515     Propertytype: game-info
1516     Function: Invert Y axis. Values are 'true' or 'false'.
1517     If 'true', the board should be displayed with numbers
1518     increasing in value from bottom to top of the screen.
1519     Default: 'false'
1520    
1521     Property: SE
1522     Propvalue: point
1523     Propertytype: -
1524     Function: Mark the given point and up to 8 additional points,
1525     depending on where the provided point (stone) could legally
1526     move.
1527    
1528     Property: SU
1529     Propvalue: SimpleText
1530     Propertytype: game-info
1531     Function: Setup type - designates the intial placement of pieces,
1532     and also the implicitly the variation on the basic rules to be
1533     employed. The currently valid values include the following
1534     strings:
1535     'Standard', 'Scrambled-eggs', 'Parachute', 'Gemma' and 'Custom'
1536     (the initial board is empty, AB and AW properties
1537     will be used to establish the starting position).
1538     Default: 'Standard'
1539     For details on the setups and rule variations, consult the
1540     LOA home pages.
1541    
1542     Hex properties
1543     Gametype: 11
1544    
1545     Property: IS
1546     Propvalue: list of composed SimpleText ':' SimpleText
1547     Propertytype: root
1548     Function: This property allows applications to store and read
1549     an initial viewer setting. The property value is a list of
1550     "keyword followed by ':' followed by either 'on' or 'off'".
1551     Valid keywords are:
1552     'tried' - identify future moves that have been tried?
1553     'marked' - show good/bad move markings?
1554     'lastmove' - identify the last cell played?
1555     'headings' - display column/row headings (a b.., 1 2..)?
1556     'lock' - lock the game against new moves (for analysis)?
1557     This property is allowed in the root node only.
1558     Example: IS[tried:on][lock:off][marked:off]
1559    
1560     Property: IP
1561     Propvalue: SimpleText
1562     Propertytype: game-info
1563     Function: Designates the initial position that the viewer
1564     should display. It will most frequently indicate the
1565     current position of play in the game. This is necessary
1566     because future possible moves may have been explored,
1567     and the user must be able to distinguish real moves
1568     actually made from exploratory moves. More than one IP[]
1569     property in a game is illegal, and the behaviour undefined.
1570     The property value should be empty (""); it is specified
1571     as SimpleText for compatibility.
1572    
1573     Amazons properties
1574     Gametype: 18
1575    
1576     Property: AA
1577     Propvalue: list of point
1578     Propertytype: setup
1579     Function: Adding arrows to the board. This can be used to set up
1580     positions or problems.
1581    
1582     End: this marks the end
1583