# Analyse .sgf (or .MGT) files # see http://www.red-bean.com/sgf/ # This list extracted from gnugo sources "sgf.info"<< EOF AB Black setup [] move list AW White setup [] move list B Black move W White move BR Black rank text C Comment text CP Copyright text DT Date text EV Event text FF Fileformat number (range: 1-4) GN Game name text HA Handicap number KM Komi real ON Opening text PB Player Black text PW Player White text RE Result text RU Rules text SZ Size number | composed number ':' number) US User text WR White rank text EOF Z<-TXT X_SGFKEY KEY Z<-(KEY,"[.*]") #rxfind TXT Z<-#deb (1+rKEY)d_1dZ<-TXT[Z[0]+iZ[1]] Z<-TXT X_SGFINI KEY;C;J;N;U |List initial moves Z<-""; C<-1dKEY ->(1 #ne r J<-((KEY,"[")#find TXT)/irTXT)/0 TXT<-(J+rKEY) d TXT U<-f\TXT e "[]", G.AZ TXT<-U/TXT N<-rZ<-(TXT e G.AZ)/TXT Z<-((N%2),2)rZ; Z<-C,"[",Z,"]" Z<-SRC SGF_VAL KEYS;I;J;K;T |Concatenate values of sgf tags IF "," e , KEYS; KEYS<-#sstomat ",",KEYS Z<-""; I<-0; NK<-1tr:KEYS WHILE I0 SRC<-"-v QV<-1" GETOPTS STR IF 0= #fstat SRC; ->0 I<-0; N<-1tr:LST<-0 #sed"X:r", SRC,";:cm" Z<-12003 #use "PDB.1" Z<-12003 #use "PDB.2" WHILE I0 K<-0 WHILE 0<=K<-(2 2,(18 70 f 2+rZ),K) PMENU Z T<-#deb 12 d Z[K] J<-(+/yT #find LST)/i1tr:LST PLIST<-FLIST<-0 CSV_SPLIT LST[J] 0 r SGF_MENU FLIST WEND Z<-SGF_MENU TAB;F;K |Select .sgf files from list Z<-""; K<-0 WHILE 0<=K<-(4 20, (18 40 f 2+rTAB), K) PMENU TAB Z<-SGF_REPLAY G.TEXT<-B_TR G.FILE<-F<-#deb TAB[K:] WEND Z<-J CSV_SPLIT X;U |Get Jth field of ',' delimited matrix U<-0 _1 d 0,y+\y","=X<-X,"," Z<- #sstomat _1 m (J=,U)/,X Z<-SGF_SUMMARY STR;I;LST;KEYS;N;OFILE;QV;V |Summarize sgf files as comma separated strings. OFILE<-"";QV<-0 I<-0;Z<-0 r 5 #sed":d" KEYS<-"PB,PW,RE" STR<-"-v QV<-1|-keys KEYS<-SHIFT|-o OFILE<-SHIFT" GETOPTS STR IF 0=rSTR; ->0 N<-1tr:LST<-D4.XFL STR KEYS<-#sstomat",",UPALPHA[#av KEYS] WHILE I0 Z<-WW.FSCR 5 Z<-B_TR F;A;H;K;T;U |Transcript and variables ->(0=rZ<-, #files F<-#deb F)/0 Z<-#deb (32 <= #av Z)/Z<- #zload F |Deal with mixed case tags, such as SiZe[19] U<-~+\(Z="[")-0 ,_1m1dZ="]" & Z<-(~U*Z #ne UPALPHA[#av Z])/Z Z[(Z=";")/irZ]<-_CR A<-Z Z<-7 #sed "X:d;$Z;s/WL[.*]//*;s/BL[.*]//*;.0;d/SZ[/" IF 0=rZ<-A X_SGFKEY "SZ"; Z<-"19" G.SZ<-#val Z G.PB<-A X_SGFKEY "PB" G.PW<-A X_SGFKEY "PW" G.WR<-A X_SGFKEY "WR" G.BR<-A X_SGFKEY "BR" G.KM<-A X_SGFKEY "KM" G.RE<-A X_SGFKEY "RE" G.DT<-A X_SGFKEY "DT" G.EV<-A X_SGFKEY "EV" G.US<-A X_SGFKEY "US" |Pre-set white stones. old games IF 0XX |Create 3 letter id WHILE ~ 0 = #fstat Y<-"../print/sgf-",((#av 97+i26)[?3r26]),".gif"; WEND Z #wput 0 6, r: Z<-"Printing .... ", Y Z<-SGF_PLOT"-o xb.xpm -title -range 1 300 ", G.FILE 0 r #cmd Z<-"convert xb.xpm ",Y Z 0 r #cmd Z<- "display ",Y, " &" Z XX:Z<-0 r #cursor 23 0 "GOBOT.OPTS" -shuffle QS<-1 -d DL<- #fi SHIFT -lst VAR<-SHIFT Z<-GOBOT STR;LST;DIR;DL;I;J;M;N;SCR;VAR;X;Y |Go Robot. DL<-1000; QS<-0; QT<-0; VAR<-""; SCR<-#screen STR<-GOBOT.OPTS GETOPTS STR IF 0(J>N)/CC Y<-$T[J] & X<-X S_PUT (".WB"i1tY), G.SZ2 b G.AZ i Y[3 2] Z #wput 2 2,r Z<-V_MAP X WEIQI.CUT<-#wget 0 0, #screen 0 r #sleep 0, 1000*DL J++ & ->BB CC: 0 r #sleep 0, 1000*DL WEND Z<-"" # Convert .sgf game to printable diagrams # try 24x24 grid for black and white stones "D6X13BOLD" XX XX XXXX XXXXXX XX XXXXXX XXX XXXXXX XXXX XXXX XXXX XXX XX XX XX XX XX XX XXXX XXXX XX XX XXXXXX XX XX XX XXX XX XX XX XX XXXX XX XX XX XX XX XX XXXX XXXXX XX XX XX XXXX XXX XX XX XX XX XXXX X XX XXX XXXXXXX XX XXXX XXXXX XX XX XX XX XXXX XX XXXXX XX XX XX XX XX XX XX XX XX XXXXXXXX XXXX XX XX XX XX XX XXXX XX XX XX XX XX XX XXXX XX XX XX XX XX XX XXXXXXXXXXXX XXXX XX XXXX XXXX XX XXXX XXX "D6X13" X X XXX XXXXX X XXXXX XXX XXXXX XXX XXX X X XX X X X X X X X X X X X X X X X X X X X XX X X X X X X X X X X X X X X X XX X X X X X X X X X X XXX X X XX X XXXX X XXX XXXX X X X X X X X X X X X X X X X X X X X XXXXX X X X X X X X X X X X X X X X X X X X X X X X X XXXXX XXXXX XXX X XXX XXX X XXX XXX "D7X13" XX X XXXX XXXXXX X XXXXXX XXX XXXXXX XXXX X X XX X X X XX X X X X X X X X X X X X X X X X X X X X X X X X X X X XXX X X X X X X X X XXX X X XX X X XXX X XXXX X X X XX X X X X XX X X X X X X X X X XXXXXX X X X X X X X X X X X X X X X X X X X X XX XXXXX XXXXXX XXXX X XXXX XXXX X XXXX "D8X16SC" XXXX XXXXXX XXXX XXXXXXX X XXXX XX XX XXXXX XXXXX XXX X XX XX X XX XX XX XX XXXX XX XXXX XXXX XX XX XXX X XXX XX X XX XXX XX X X X XXXX X X XX X XXX X XX XX X X XXXXX XX X XX X X X X XX X XX XXXX XX X XXXXX XX XX X XX XXXX XXX X XX X X X XX XX X XX X XX XX XXXXXX XXXX X X XX X X XX X XXXXXXXX X X X X XX XX XX X X XX X XX X X X XX XX X X X X XXX XX X XX XX XX X XX XX XXXXX XX X X X XXXXX X XXXXXXX XXXXX X XXXXX X XX XX X XX XXXXXX XX X X Z<-TRIM X;U;J |Delete leading and trailing blank rows of a matrix J<-f\U<-f/X=" " |Leading blanks J<-J c m f\mU Z<-(~J)/X Z<-NN NUM2MAT STR;D;NC;T |Bitmap from digit sequence NN<-"D6X13" #ifndef "NN" D<-"0123456789" NC<-D i NN[1] T<-$NL[NN] Z<-T[: J<-,(NC*D i STR) #outer + iNC] Z<-".F"[Z="X"] "SGF_PLOT.OPTS" -o OFILE<-SHIFT -src SRC<-SHIFT -fnt FNT<-SHIFT -style DS<-SHIFT -range RG<-NARGS 2 -title QTT<-1 Z<-SGF_PLOT STR;CNT;CTXT;DS;GB;GX;FNT;I;K;NMAP;OFILE;P;QTT;RG;SRC;T;X;Y |Make images from .sgf file |Global F8MAP, F16MAP DS<-"D6X13" |digit style FNT<-"../font/sc.fnt" OFILE<-"" SRC<-"" RG<-1 99 QTT<-0 CTXT<-"" STR<-SGF_PLOT.OPTS GETOPTS STR<-"" #ifndef "STR" IF 0=rSRC; SRC<-STR |Initialise pixmap stuff Z<- #av #zload FNT | Read font file once only F16MAP<-(256,((rZ)%256))rZ Z<-"" W24<-"F."[(X #outer +X<-X*X<-_12+i24)e 80+i30] B24<-"F."[(X #outer +X<-X*X<-_12+i24)<120] |Initialise transcript G.TEXT<-B_TR G.FILE<-SRC N<-7 #sed".z" & X<-(G.SZ*G.SZ) r "." Z<-WEIQI_INIT G.SZ NMAP<-(rX)r0 I<-1 WHILE ICC NMAP[Z]<-K GX<-DS MK_GLYPH (1tY),zK GB<-GX KJ_PUT "GB ", z 24*P CC: I++; K++ WEND IF QTT; CTXT<-G.TEXT,:" ",:((1tr:CTXT),1dr:G.TEXT)t CTXT GB<-GB,456 210 r"F" T<-".F"["."=F16MAP TXT2MAT CTXT] GB<-T KJ_PUT "GB 0 456" IF 0=rOFILE; Z<-GB; ->0 Z<-MK_XPM"-o ",OFILE," -var GB" Z<-STYLE MK_GLYPH X;DX;T |Paste digits onto stone object Z<-""; STYLE<-"D6X13" #ifndef "STYLE" T<-STYLE NUM2MAT 1dX; DX<- z (25-rT)%2 IF "B"=1tX; Z<-T KJ_PSET "B24 F ", DX IF "W"=1tX; Z<-"F."[T="F"] KJ_PSET "W24 . ", DX R<-XB_SETUP X;I;N;P;S;T |Create pixmap matrix for board set up |X a matrix with values .BW S<-12=(i24*19) #mod 24 T<-i19*24 T<-(T>11)*T<_11+24*19 R<-(S #outer c S) f (T #outer f T) R<-"F."[R] I<-0;N<-rX<-,X WHILE I