|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T g
Length: 38049 (0x94a1) Types: TextFile Names: »goBoard.pas«
└─⟦b20c6495f⟧ Bits:30007238 EUUGD18: Wien-båndet, efterår 1987 └─⟦this⟧ »EUUGD18/General/GoBoard/goBoard.pas«
{---------------------------------------------------------------} { goBoard.Pas } { } { Board Image Handler for Go } { Copyright (c) 1982 by Three Rivers Computer Corp. } { } { Written: June 3, 1982 by Stoney Ballard } { Edit History: } { June 3, 1982 Started } { June 4, 1982 Add dead group removal } { June 10, 1982 Use new go file manager } { Nov 8, 1982 Split From Go.Pas } {---------------------------------------------------------------} module goBoard; exports imports goCom from goCom; imports screen from screen; type SoundType = (atari, koV, s3, s4, die, die2, die3, error); exception gbFatal; procedure initGoBoard; procedure clearBoard; procedure addHCStones(num: integer); procedure placeStone(which: sType; lx, ly, ofx, ofy, moveNum: integer); procedure placeAlt(which: sType; lx, ly, ofx, ofy: integer); procedure remStone(lx, ly: integer); procedure showPass(which: sType); procedure remPass; function passLocCur(cx, cy: integer): boolean; function bLocCur(cx, cy: integer; var lx, ly, sx, sy: integer): boolean; procedure beep(sound: SoundType); procedure dotStone(lx, ly: integer); procedure showAllStones; procedure printBoard(isDiagram: boolean); procedure showCaptures; procedure turnIs(who: sType); procedure refreshBoard; procedure putBString(x, y: integer; s: string); private imports raster from raster; imports io_unit from io_unit; imports io_others from io_others; imports memory from memory; imports fileSystem from fileSystem; imports perq_string from perq_string; imports csdx from csdx; imports goMgr from goMgr; imports goTree from goTree; imports goMenu from goMenu; imports system from system; imports go from go; const sPicC = 15; sPicS = 32; hpPicS = 10; hpPicC = 4; patchS = 40; patchC = 19; picWW = 4; htHeight = 4; htWidth = 48; gridWidth = 32; pGridWidth = 34; { for printing } xMargin = boardX + gridWidth; yMargin = boardY + gridWidth; pxMargin = pBoardX + pGridWidth; pyMargin = pBoardY + pGridWidth; gridBorder = gridWidth div 2; pGridBorder = pGridWidth div 2; gridXMargin = xMargin - gridBorder; gridYMargin = yMargin - gridBorder; pGridXMargin = pxMargin - pGridBorder; pGridYMargin = pyMargin - pGridBorder; htXMargin = xMargin - gridWidth; htYMargin = yMargin - gridWidth; phtXMargin = pxMargin - pGridWidth; phtYMargin = pyMargin - pGridWidth; boardHeight = 20 * gridWidth; pBoardHeight = 20 * pGridWidth; slopSize = 2; lineWidth = 2; extraXO = pxMargin; { 96 } extraYO = 768; pedgeBX = pxMargin; { 96 } pedgeBY = pyMargin + (19 * pGridWidth); { 672 } pedgeLX = pBoardX; { 64 } pedgeLY = pBoardY + (19 * pGridWidth); { 640 } edgeBX = xMargin; { 96 } edgeBY = yMargin + (19 * GridWidth); { 672 } edgeLX = BoardX; { 64 } edgeLY = BoardY + (19 * GridWidth); { 640 } rCmtY = pBoardX + pBoardHeight + 32; lCmtY = rCmtY + 8 + charHeight; tFntWidth = 6; tFntHeight = 9; maxSMark = 2; type htArray = array[0..3] of array[0..47] of integer; pHtArray = ^htArray; beepbuf = array[0..63] of integer; pBeepBuf = ^BeepBuf; var hcDot: pPicBuf; htBuf: pHtArray; patch: array[1..9] of pPicBuf; StatPtr: IOStatPtr; statRec: IOStatus; sounds: array[atari..die3] of pBeepBuf; stones: array[sType] of pPicBuf; stoneCir: pPicBuf; stoneMarks: array[0..maxSMark] of pPicBuf; sysFont: fontPtr; goBNumFont: fontPtr; goSNumFont: fontPtr; goTNumFont: fontPtr; goSLetFont: fontPtr; printing: boolean; scrSavPtr: rasterPtr; sNumBase, sNumStart: integer; bigNums: boolean; { merely beeps the given sound } procedure beep(sound: SoundType); var zilch: Double; rep, i: integer; savY, savB, savG, savW, savS: boolean; begin { beep } if sound = error then IOBeep else begin savY := tabYellow; savW := tabWhite; savG := tabGreen; savB := tabBlue; savS := tabSwitch; IOSetModeTablet(offTablet); if sound = die then rep := 128 * 3 else rep := 128; UnitIO(Speech, RECAST(sounds[sound],IOBufPtr), IOWriteHiVol, rep, zilch, nil, StatPtr); IOSetModeTablet(relTablet); tabYellow := savY; tabWhite := savW; tabGreen := savG; tabBlue := savB; tabSwitch := savS; end; end { beep }; procedure showCaptures; var s: string; procedure dectos(val: integer); var numC, i: integer; ts: string; c: char; begin { dectos } if val = 0 then s := '0' else begin numC := 0; adjust(ts, 20); while val <> 0 do begin numC := numC + 1; ts[numC] := chr(val mod 10 + ord('0')); val := val div 10; end; adjust(s, numC); for i := 1 to numC do s[i] := ts[numC - i + 1]; end; end { dectos }; begin { showCaptures } dectos(captures[black]); SSetCursor(captNBX, captNY); write(s:3); dectos(captures[white]); SSetCursor(captNWX, captNY); write(s:3); end { showCaptures }; procedure turnIs(who: sType); begin { turnIs } SSetCursor(turnX, turnY); if who = white then write('White to Play') else write('Black to Play'); end { turnIs }; procedure putBString(x, y: integer; s: string); var xp, yp, sw, i: integer; fnt: fontPtr; begin { putBString } setFont(goSNumFont); fnt := goSNumFont; for i := 1 to length(s) do if (s[i] >= '0') and (s[i] <= '9') then s[i] := chr(ord(s[i]) - #46 + #200); xp := x * gridWidth + xMargin; yp := y * gridWidth + yMargin; sw := 0; for i := 1 to length(s) do sw := sw + fnt^.index[lAnd(ord(s[i]), #177)].width; xp := xp - (sw div 2); yp := yp + (fnt^.height div 2) + 1; SChrFunc(0); SSetCursor(xp, yp); write(s:0); end { putBString }; procedure putStone(cx, cy, mNum: integer; val: bVal); const widthPad = 2; shPad = 3; bhPad = 1; var x, y, org: integer; ns: string; sl, d, sw, n: integer; cv: integer; fnt: fontPtr; heightPad: integer; begin { putStone } x := cx - sPicC; y := cy - sPicC; rasterop(RAndNot, sPicS, sPicS, x, y, SScreenW, SScreenP, 0, 0, picWW, stones[black]); rasterop(ROr, sPicS, sPicS, x, y, SScreenW, SScreenP, 0, 0, picWW, stones[val]); if numbEnabled and (mNum > 0) then begin n := mNum - sNumBase; if n < 0 then exit(putStone); n := n + sNumStart; if bigNums then begin fnt := goBNumFont; heightPad := bhPad; end else begin fnt := goSNumFont; heightPad := shPad; end; if val = black then if bigNums then begin if n > 9 then org := ord('`') else org := ord('j'); end else begin if n > 99 then org := #24 else org := #0; end else if bigNums then begin if n > 9 then org := ord('@') else org := ord('J'); end else begin if n > 99 then org := #12 else org := #60; end; ns := ' '; sl := 0; sw := 0; if n >= 100 then d := 100 else if n >= 10 then d := 10 else d := 1; while d > 0 do begin sl := sl + 1; cv := (n div d) + org; ns[sl] := chr(cv + #200); sw := sw + fnt^.index[cv].width; n := n mod d; d := d div 10; end; adjust(ns, sl); x := cx - (sw div 2) + widthPad; y := cy + (fnt^.height div 2) + heightPad; setFont(fnt); SSetCursor(x, y); SChrFunc(6); write(ns); setFont(sysFont); SChrFunc(0); end; end { putStone }; procedure showStone(lx, ly: integer); var x, y: integer; begin { showStone } with board[lx, ly] do begin if printing then if printLarge then begin x := lx * pGridWidth + pxMargin; y := ly * pGridWidth + pyMargin; end else { small board } begin x := lx * gridWidth + xMargin; y := ly * gridWidth + yMargin; end else { not printing } begin x := lx * gridWidth + xMargin + xOfs; y := ly * gridWidth + yMargin + yOfs; end; putStone(x, y, mNum, val); end; end { showStone }; procedure showAllStones; var i, j: integer; begin { showAllStones } for j := 0 to maxPoint do for i := 0 to maxPoint do if board[i, j].val <> empty then showStone(i, j); end { showAllStones }; procedure dotStone(lx, ly: integer); var x, y: integer; begin { dotStone } with board[lx, ly] do if val <> empty then begin x := lx * gridWidth + xMargin + xOfs; y := ly * gridWidth + yMargin + yOfs; rasterop(rNot, 2, 2, x, y, SScreenW, SScreenP, x, y, SScreenW, SScreenP); end; end { dotStone }; function bLocCur(cx, cy: integer; var lx, ly, sx, sy: integer): boolean; var xic, yic: integer; begin { bLocCur } bLocCur := false; if printing and printLarge then begin cx := cx - pGridXMargin; cy := cy - pGridYMargin; end else begin cx := cx - gridXMargin; cy := cy - gridYMargin; end; if (cx >= 0) and (cy >= 0) then begin if printing and printLarge then begin lx := cx div pGridWidth; ly := cy div pGridWidth; xic := lx * pGridWidth + pGridBorder; yic := ly * pGridWidth + pGridBorder; end else begin lx := cx div gridWidth; ly := cy div gridWidth; xic := lx * gridWidth + gridBorder; yic := ly * gridWidth + gridBorder; end; if (lx <= maxPoint) and (ly <= maxPoint) then begin if cx < xic - slopSize then cx := xic - slopSize else if cx > xic + slopSize then cx := xic + slopSize; if cy < yic - slopSize then cy := yic - slopSize else if cy > yic + slopSize then cy := yic + slopSize; sx := cx - xic; sy := cy - yic; bLocCur := true; end; end; end { bLocCur }; procedure showPass(which: sType); begin { showPass } SSetCursor(passX, passY); if which = black then write(' Black Passes ') else write(' White Passes '); passShowing := true; end { showPass }; procedure remPass; begin { remPass } SSetCursor(passX, passY); write(' '); passShowing := false; end { remPass }; function passLocCur(cx, cy: integer): boolean; begin { passLocCur } passLocCur := (cx >= passX) and (cx < (passX + passW)) and (cy <= passY) and (cy > (passY - passH)); end { passLocCur }; procedure showAlt(lx, ly: integer; sv: sType); begin { showAlt } with board[lx, ly] do begin lx := lx * gridWidth + xMargin - sPicC; ly := ly * gridWidth + yMargin - sPicC; rasterop(ROr, sPicS, sPicS, lx, ly, SScreenW, SScreenP, 0, 0, picWW, stoneCir); end; end { showAlt }; procedure placeStone(which: sType; lx, ly, ofx, ofy, moveNum: integer); begin { placeStone } if passShowing then remPass; with board[lx, ly] do begin val := which; xOfs := ofx; yOfs := ofy; mNum := moveNum; showStone(lx, ly); end; end { placeStone }; procedure placeAlt(which: sType; lx, ly, ofx, ofy: integer); begin { placeAlt } with board[lx, ly] do begin val := alternate; xOfs := 0; yOfs := 0; mNum := -1; showAlt(lx, ly, which); end; end { placeAlt }; procedure remStone(lx, ly: integer); var x, y, i, j: integer; begin { remStone } with board[lx, ly] do if val <> empty then begin val := empty; if ly = 0 then i := 1 else if ly = maxPoint then i := 7 else i := 4; if lx = maxPoint then i := i + 2 else if lx > 0 then i := i + 1; if printing and printLarge then begin x := (lx * pGridWidth) - patchC + pxMargin; y := (ly * pGridWidth) - patchC + pyMargin; end else begin x := (lx * gridWidth) - patchC + xMargin; y := (ly * gridWidth) - patchC + yMargin; end; rasterop(RRpl, patchS, patchS, x, y, SScreenW, SScreenP, 0, 0, picWW, patch[i]); if ((lx = 3) and (ly = 3)) or ((lx = 9) and (ly = 3)) or ((lx = 15) and (ly = 3)) or ((lx = 3) and (ly = 9)) or ((lx = 9) and (ly = 9)) or ((lx = 15) and (ly = 9)) or ((lx = 3) and (ly = 15)) or ((lx = 9) and (ly = 15)) or ((lx = 15) and (ly = 15)) then if printing and printLarge then rasterop(ROr, hpPicS, hpPicS, pxMargin + (pGridWidth * lx) - hpPicC, pyMargin + (pGridWidth * ly) - hpPicC, SScreenW, SScreenP, 0, 0, picWW, hcDot) else rasterop(ROr, hpPicS, hpPicS, xMargin + (gridWidth * lx) - hpPicC, yMargin + (gridWidth * ly) - hpPicC, SScreenW, SScreenP, 0, 0, picWW, hcDot); for i := lx - 1 to lx + 1 do for j := ly - 1 to ly + 1 do if (i >= 0) and (i <= maxPoint) and (j >= 0) and (j <= maxPoint) then if (board[i, j].val = black) or (board[i, j].val = white) then begin showStone(i, j); if (i = dotSX) and (j = dotSY) then dotStone(i, j); end; end; end { remStone }; procedure addHCStones(num: integer); begin { addHCStones } case num of 2: begin placeStone(black, 3, 15, 0, 0, 0); placeStone(black, 15, 3, 0, 0, 0); end; 3: begin placeStone(black, 3, 15, 0, 0, 0); placeStone(black, 15, 3, 0, 0, 0); placeStone(black, 15, 15, 0, 0, 0); end; 4: begin placeStone(black, 3, 15, 0, 0, 0); placeStone(black, 15, 3, 0, 0, 0); placeStone(black, 3, 3, 0, 0, 0); placeStone(black, 15, 15, 0, 0, 0); end; 5: begin placeStone(black, 3, 3, 0, 0, 0); placeStone(black, 3, 15, 0, 0, 0); placeStone(black, 9, 9, 0, 0, 0); placeStone(black, 15, 3, 0, 0, 0); placeStone(black, 15, 15, 0, 0, 0); end; 6: begin placeStone(black, 3, 3, 0, 0, 0); placeStone(black, 3, 15, 0, 0, 0); placeStone(black, 3, 9, 0, 0, 0); placeStone(black, 15, 9, 0, 0, 0); placeStone(black, 15, 3, 0, 0, 0); placeStone(black, 15, 15, 0, 0, 0); end; 7: begin placeStone(black, 3, 3, 0, 0, 0); placeStone(black, 3, 15, 0, 0, 0); placeStone(black, 3, 9, 0, 0, 0); placeStone(black, 9, 9, 0, 0, 0); placeStone(black, 15, 9, 0, 0, 0); placeStone(black, 15, 3, 0, 0, 0); placeStone(black, 15, 15, 0, 0, 0); end; 8: begin placeStone(black, 3, 3, 0, 0, 0); placeStone(black, 3, 9, 0, 0, 0); placeStone(black, 3, 15, 0, 0, 0); placeStone(black, 9, 3, 0, 0, 0); placeStone(black, 9, 15, 0, 0, 0); placeStone(black, 15, 3, 0, 0, 0); placeStone(black, 15, 9, 0, 0, 0); placeStone(black, 15, 15, 0, 0, 0); end; 9: begin placeStone(black, 3, 3, 0, 0, 0); placeStone(black, 3, 9, 0, 0, 0); placeStone(black, 3, 15, 0, 0, 0); placeStone(black, 9, 3, 0, 0, 0); placeStone(black, 9, 9, 0, 0, 0); placeStone(black, 9, 15, 0, 0, 0); placeStone(black, 15, 3, 0, 0, 0); placeStone(black, 15, 9, 0, 0, 0); placeStone(black, 15, 15, 0, 0, 0); end; end; end { addHCStones }; procedure drawBoard; var i, j, c, lWidth, x, y, w: integer; xMarg, yMarg, gWid, eBX, eBY, eLX, eLY: integer; begin { drawBoard } if printing then begin lWidth := 1; if printLarge then begin xMarg := pxMargin; yMarg := pyMargin; gWid := pGridWidth; eBX := pedgeBX; eBY := pedgeBY; eLX := pedgeLX; eLY := pedgeLY; end else begin xMarg := xMargin; yMarg := yMargin; gWid := gridWidth; eBX := edgeBX; eBY := edgeBY; eLX := edgeLX; eLY := edgeLY; end end else begin lWidth := lineWidth; xMarg := xMargin; yMarg := yMargin; gWid := gridWidth; end; if not printing then for i := (htYMargin div htHeight) to ((htYMargin + boardHeight) div htHeight) - 1 do rasterop(RRpl, bWinW - (htXMargin * 2), htHeight, htXMargin, i * htHeight, SScreenW, SScreenP, htXMargin, 0, htWidth, htBuf) else rasterop(rAndNot, bWinW - (phtXMargin * 2), (bWinY + bWinH) - phtYMargin, phtXMargin, phtYMargin, SScreenW, SScreenP, phtXMargin, phtYMargin, SScreenW, SScreenP); for i := 1 to maxPoint - 1 do rasterop(ROrNot, (maxPoint * gWid) + lWidth, lWidth, xMarg, yMarg + (i * gWid), SScreenW, SScreenP, xMarg, yMarg + (i * gWid), SScreenW, SScreenP); for i := 1 to maxPoint - 1 do rasterop(ROrNot, lWidth, (maxPoint * gWid) + lWidth, xMarg + (i * gWid), yMarg, SScreenW, SScreenP, xMarg + (i * gWid), yMarg, SScreenW, SScreenP); rasterop(ROrNot, (maxPoint * gWid) + lineWidth, lineWidth, xMarg, yMarg, SScreenW, SScreenP, xMarg, yMarg, SScreenW, SScreenP); rasterop(ROrNot, (maxPoint * gWid) + lineWidth, lineWidth, xMarg, yMarg + (maxPoint * gWid), SScreenW, SScreenP, xMarg, yMarg + (maxPoint * gWid), SScreenW, SScreenP); rasterop(ROrNot, lineWidth, (maxPoint * gWid) + lineWidth, xMarg, yMarg, SScreenW, SScreenP, xMarg, yMarg, SScreenW, SScreenP); rasterop(ROrNot, lineWidth, (maxPoint * gWid) + lineWidth, xMarg + (maxPoint * gWid), yMarg, SScreenW, SScreenP, xMarg + (maxPoint * gWid), yMarg, SScreenW, SScreenP); rasterop(ROr, hpPicS, hpPicS, xMarg + (gWid * 3) - hpPicC, yMarg + (gWid * 3) - hpPicC, SScreenW, SScreenP, 0, 0, picWW, hcDot); rasterop(ROr, hpPicS, hpPicS, xMarg + (gWid * 9) - hpPicC, yMarg + (gWid * 3) - hpPicC, SScreenW, SScreenP, 0, 0, picWW, hcDot); rasterop(ROr, hpPicS, hpPicS, xMarg + (gWid * 15) - hpPicC, yMarg + (gWid * 3) - hpPicC, SScreenW, SScreenP, 0, 0, picWW, hcDot); rasterop(ROr, hpPicS, hpPicS, xMarg + (gWid * 3) - hpPicC, yMarg + (gWid * 9) - hpPicC, SScreenW, SScreenP, 0, 0, picWW, hcDot); rasterop(ROr, hpPicS, hpPicS, xMarg + (gWid * 9) - hpPicC, yMarg + (gWid * 9) - hpPicC, SScreenW, SScreenP, 0, 0, picWW, hcDot); rasterop(ROr, hpPicS, hpPicS, xMarg + (gWid * 15) - hpPicC, yMarg + (gWid * 9) - hpPicC, SScreenW, SScreenP, 0, 0, picWW, hcDot); rasterop(ROr, hpPicS, hpPicS, xMarg + (gWid * 3) - hpPicC, yMarg + (gWid * 15) - hpPicC, SScreenW, SScreenP, 0, 0, picWW, hcDot); rasterop(ROr, hpPicS, hpPicS, xMarg + (gWid * 9) - hpPicC, yMarg + (gWid * 15) - hpPicC, SScreenW, SScreenP, 0, 0, picWW, hcDot); rasterop(ROr, hpPicS, hpPicS, xMarg + (gWid * 15) - hpPicC, yMarg + (gWid * 15) - hpPicC, SScreenW, SScreenP, 0, 0, picWW, hcDot); if not printing then begin SSetCursor(captBX, captY); write('Black Captures'); SSetCursor(captWX, captY); write('White Captures'); end else begin for i := 1 to maxPoint + 1 do begin if i > 9 then w := charWidth * 2 else w := charWidth; x := ((i - 1) * gWid) + eBX - (w div 2); y := eBY + charHeight; SSetCursor(x, y); write(i:0); end; for i := 0 to maxPoint do begin x := eLX - charWidth; y := eLY - ((maxPoint - i) * gWid) + (charHeight div 2); c := i + ord('A'); if c >= ord('I') then c := c + 1; SSetCursor(x, y); SPutChr(chr(c)); end; end; end { drawBoard }; procedure clearBoard; var i, j, xMarg, yMarg, gWid: integer; begin { clearBoard } drawBoard; if printing and printLarge then begin xMarg := pxMargin; yMarg := pyMargin; gWid := pGridWidth; end else begin xMarg := xMargin; yMarg := yMargin; gWid := gridWidth; end; rasterop(RRpl, patchS, patchS, 0, 0, picWW, patch[1], xMarg + (0 * gWid) - patchC, yMarg + (0 * gWid) - patchC, SScreenW, SScreenP); rasterop(RRpl, patchS, patchS, 0, 0, picWW, patch[2], xMarg + (6 * gWid) - patchC, yMarg + (0 * gWid) - patchC, SScreenW, SScreenP); rasterop(RRpl, patchS, patchS, 0, 0, picWW, patch[3], xMarg + (18 * gWid) - patchC, yMarg + (0 * gWid) - patchC, SScreenW, SScreenP); rasterop(RRpl, patchS, patchS, 0, 0, picWW, patch[4], xMarg + (0 * gWid) - patchC, yMarg + (6 * gWid) - patchC, SScreenW, SScreenP); rasterop(RRpl, patchS, patchS, 0, 0, picWW, patch[5], xMarg + (6 * gWid) - patchC, yMarg + (6 * gWid) - patchC, SScreenW, SScreenP); rasterop(RRpl, patchS, patchS, 0, 0, picWW, patch[6], xMarg + (18 * gWid) - patchC, yMarg + (6 * gWid) - patchC, SScreenW, SScreenP); rasterop(RRpl, patchS, patchS, 0, 0, picWW, patch[7], xMarg + (0 * gWid) - patchC, yMarg + (18 * gWid) - patchC, SScreenW, SScreenP); rasterop(RRpl, patchS, patchS, 0, 0, picWW, patch[8], xMarg + (6 * gWid) - patchC, yMarg + (18 * gWid) - patchC, SScreenW, SScreenP); rasterop(RRpl, patchS, patchS, 0, 0, picWW, patch[9], xMarg + (18 * gWid) - patchC, yMarg + (18 * gWid) - patchC, SScreenW, SScreenP); for i := 0 to maxPoint do for j := 0 to maxPoint do board[i][j].val := empty; if not printing then remPass; end { clearBoard }; procedure showPlayHistory(isDiagram: boolean); var curRow, curCol, bx, by, bLim, curNum: integer; cm, scm, tm: pMRec; c: char; needWipe, lastCapt: boolean; procedure getMarks; var bx, by, lbx, lby, gx, gy, sMark, x, y, w: integer; curC: char; done: boolean; begin { getMarks } lbx := -1; lby := -1; curC := 'a'; sMark := 0; prompt('Point at locations to place marks - press off board to stop'); while tabSwitch do; done := false; setFont(goSLetFont); sChrFunc(rOr); repeat while not tabSwitch do; if bLocCur(tabRelX, tabRelY, bx, by, gx, gy) then begin if printLarge then begin x := bx * pGridWidth + pxMargin; y := by * pGridWidth + pyMargin; end else begin x := bx * GridWidth + xMargin; y := by * GridWidth + yMargin; end; if board[bx, by].val = empty then begin rasterop(rXor, 20, 30, x - 10, y - 15, SScreenW, SScreenP, x - 10, y - 15, SScreenW, SScreenP); w := goSLetFont^.index[ord(curC)].width - 2; SSetCursor(x - (w div 2), y + 7); write(curC); curC := chr(ord(curC) + 1); end else begin x := x - sPicC; y := y - sPicC; if (bx = lbx) and (by = lby) then begin if sMark <= maxSMark then begin rasterop(RXor, sPicS, sPicS, x, y, SScreenW, SScreenP, 0, 0, picWW, stoneMarks[sMark]); sMark := sMark + 1; end else sMark := 0; end else sMark := 0; if sMark <= maxSMark then rasterop(RXor, sPicS, sPicS, x, y, SScreenW, SScreenP, 0, 0, picWW, stoneMarks[sMark]); end; lbx := bx; lby := by; end else done := true; while tabSwitch do; until done; sChrFunc(rRpl); setFont(sysFont); prompt(''); end { getMarks }; begin { showPlayHistory } if not isDiagram then begin bLim := 99; sNumBase := 0; sNumStart := 0; end else bLim := 1000; curNum := 0; needWipe := true; wipeTreeMarks; cm := curMove; while cm <> treeRoot do begin cm^.mark := true; cm := cm^.blink; end; repeat if needWipe then begin rasterop(rAndNot, 768, 1024 - extraYO, 0, extraYO, SScreenW, SScreenP, 0, extraYO, SScreenW, SScreenP); curRow := 0; curCol := 0; showAllStones; needWipe := false; end; cm := cm^.flink; while not cm^.mark do cm := cm^.slink; with cm^ do case id of hcPlay: begin addHCStones(hcNum); curNum := 1; end; move: begin if board[mx, my].val <> empty then begin bx := curCol * (20 * charWidth) + extraXO; by := curRow * charHeight * 2 + extraYO + charHeight; SSetCursor(bx, by); if who = black then write('Black ') else write('White '); write((moveN - sNumBase):0, ' at '); c := chr(my + ord('A')); if c >= 'I' then c := chr(ord(c) + 1); write(c, '-', (mx + 1):0); curRow := curRow + 1; if (curRow * charHeight * 2 + extraYO + charHeight) > 1000 then begin curRow := 0; curCol := curCol + 1; end; end else placeStone(who, mx, my, 0, 0, moveN); curNum := moveN; lastCapt := false; repeat if cm^.flink = nil then lastCapt := true else if cm^.flink^.id = remove then begin cm := cm^.flink; if curNum < sNumBase then remStone(cm^.mx, cm^.my); end else lastCapt := true; until lastCapt; end; pass: begin if not isDiagram then begin bx := curCol * (20 * charWidth) + extraXO; by := curRow * charHeight * 2 + extraYO + charHeight; SSetCursor(bx, by); if who = black then write('Black ') else write('White '); write((moveN - sNumBase):0, ' - Pass'); curRow := curRow + 1; if (curRow * charHeight * 2 + extraYO + charHeight) > 1000 then begin curRow := 0; curCol := curCol + 1; end; end; curNum := moveN; end; end { case }; if (curNum = bLim) or (cm = curMove) then begin if isDiagram then getMarks; csdx; if cm <> curMove then begin sNumBase := bLim + 1; bLim := bLim + 100; needWipe := true; clearBoard; scm := curMove; curMove := treeRoot; switchBranch(cm); curMove := scm; wipeTreeMarks; tm := curMove; while tm <> treeRoot do begin tm^.mark := true; tm := tm^.blink; end; end; end; until cm = curMove; sNumBase := 0; sNumStart := 0; end { showPlayHistory }; procedure printBoard(isDiagram: boolean); label 1; var sseg: integer; neWas: boolean; cmSave: pMRec; procedure showFName; var fnX, fnY: integer; fs: string; begin { showFName } getFNameString(fs); if fs <> '' then begin fnY := charHeight + 8; fnX := 384 - (charWidth * length(fs) div 2); SSetCursor(fnX, fnY); write(fs); end; end { showFName }; procedure showComments(isDiagram: boolean); var cx: integer; cs: string; begin { showComments } if not isDiagram then if getComment(treeRoot, cs) then begin cx := 384 - (charWidth * length(cs) div 2); SSetCursor(cx, rCmtY); write(cs); end; if getComment(curMove, cs) then begin cx := 384 - (charWidth * length(cs) div 2); if isDiagram then SSetCursor(cx, charHeight + 8) else SSetCursor(cx, lCmtY); write(cs); end; end { showComments }; handler ctlC; begin { ctlC } IOKeyClear; resetInput; write(''); {control-G} prompt(''); goto 1; end { ctlC }; function readNum(pmpt: string): integer; label 2; var n: integer; handler notNumber(fn: pathName); begin { notNumber } write(''); {control-G} prompt('Bad Number - try again: '); goto 2; end { notNumber }; handler pastEOF(fn: pathName); begin { pastEOF } write(''); {control-G} goto 1; end { pastEOF }; begin { readNum } prompt(''); 2: resetInput; write(pmpt); readln(n); readNum := n; end { readNum }; begin { printBoard } if curMove = treeRoot then begin write(''); {control-G} exit(printBoard); end; cmSave := curMove; if scrSavPtr = nil then begin createSegment(sseg, 192, 1, 192); scrSavPtr := makePtr(sseg, 0, rasterPtr); end; rasterop(rRpl, 768, 1024, 0, 0, SScreenW, scrSavPtr, 0, 0, SScreenW, SScreenP); rasterop(rAndNot, 768, 1024, 0, 0, SScreenW, SScreenP, 0, 0, SScreenW, SScreenP); printing := true; neWas := numbEnabled; numbEnabled := true; sNumBase := 0; sNumStart := 0; drawBoard; bigNums := false; showAllStones; if not isDiagram then begin showComments(false); showFName; csdx; end else begin sNumBase := readNum('Start Numbering at which stone? '); sNumStart := readNum('First Number is? '); prompt(''); end; clearBoard; bigNums := true; if isDiagram then showComments(true); showPlayHistory(isDiagram); 1: rasterop(rRpl, 768, 1024, 0, 0, SScreenW, SScreenP, 0, 0, SScreenW, scrSavPtr); printing := false; numbEnabled := neWas; bigNums := false; sNumBase := 0; sNumStart := 0; clearBoard; curMove := treeRoot; captures[black] := 0; captures[white] := 0; switchBranch(cmSave); curMove := cmSave; end { printBoard }; procedure refreshBoard; begin { refreshBoard } drawBoard; showAllStones; dotSX := -1; dotLast; end { refreshBoard }; { initializes this module } procedure initGoBoard; procedure beepInit; const size = (WordSize(beepBuf) * 7 + 255) div 256; var d: SoundType; i,j: integer; beepSeg: integer; begin { beepInit } createSegment(beepSeg, size, 1, size); new(0,4,StatPtr); for d := atari to die3 do new(beepSeg, 4, sounds[d]); for i := 0 to 63 do begin sounds[atari]^[i] := 511; case i mod 3 of 0: sounds[koV]^[i] := -5; 1: sounds[koV]^[i] := 34; 2: sounds[koV]^[i] := 0; end; case i mod 4 of 0: sounds[s3]^[i] := 1023; 1: sounds[s3]^[i] := 0; 2: sounds[s3]^[i] := -1; 3: sounds[s3]^[i] := -1023; end; case i mod 5 of 0: sounds[s4]^[i] := 43; 1: sounds[s4]^[i] := 765; 2: sounds[s4]^[i] := -432; 3: sounds[s4]^[i] := -6; 4: sounds[s4]^[i] := 345; end; end; for i := 0 to 1 do for j := 0 to 15 do begin sounds[die]^[i*32+j] := -1; sounds[die]^[i*32+16+j] := 0; end; for i := 0 to 63 do begin sounds[die2]^[i] := sounds[die]^[i]; sounds[die3]^[i] := sounds[die]^[i]; end; end { beepInit }; procedure definePats; var i, j, blks, gbg: integer; fid: fileID; begin { definePats } fid := FSLookup('go.animate', blks, gbg); if fid = 0 then begin writeln('GO.ANIMATE not found'); raise gbFatal; end else if blks < 8 then begin writeln('GO.ANIMATE too short'); raise gbFatal; end; new(0, 4, stones[black]); FSBlkRead(fid, 0, recast(stones[black], pDirBlk)); new(0, 4, stones[white]); FSBlkRead(fid, 1, recast(stones[white], pDirBlk)); new(0, 4, hcDot); FSBlkRead(fid, 2, recast(hcDot, pDirBlk)); new(0, 4, selCursor); FSBlkRead(fid, 3, recast(selCursor, pDirBlk)); new(0, 4, stoneCir); FSBlkRead(fid, 4, recast(stoneCir, pDirBlk)); new(0, 4, stoneMarks[0]); FSBlkRead(fid, 5, recast(stoneMarks[0], pDirBlk)); new(0, 4, stoneMarks[1]); FSBlkRead(fid, 6, recast(stoneMarks[1], pDirBlk)); new(0, 4, stoneMarks[2]); FSBlkRead(fid, 7, recast(stoneMarks[2], pDirBlk)); new(0, 4, htBuf); for i := 0 to 47 do htBuf^[0, i] := #125252; for i := 0 to 47 do htBuf^[1, i] := 0; for i := 0 to 47 do htBuf^[2, i] := #125252; { #52525 } for i := 0 to 47 do htBuf^[3, i] := 0; for i := 1 to 9 do new(0, 4, patch[i]); end { definePats }; procedure setupFont; var bblks, sblks, tBlks, lBlks, bits, fontseg, i: integer; bFID, sFID, tFID, lFID: fileID; bp: pDirBlk; begin { setupFont } sysFont := getFont; bFID := FSLookup('goBNum.kst', bblks, bits); if bFID = 0 then begin writeln('goBNum.KST not found'); raise gbFatal; end; sFID := FSLookup('goSNum.kst', sblks, bits); if sFID = 0 then begin writeln('goSNum.KST not found'); raise gbFatal; end; tFID := FSLookup('goTNum.kst', tblks, bits); if sFID = 0 then begin writeln('goTNum.KST not found'); raise gbFatal; end; lFID := FSLookup('goSLets.kst', lBlks, bits); if lFID = 0 then begin writeln('goSLets.KST not found'); raise gbFatal; end; createSegment(fontseg, bblks + sblks + tBlks + lBlks, 1, bblks + sblks + tBlks + lBlks); for i := 0 to bblks - 1 do begin bp := makePtr(fontSeg, i * 256, pDirBlk); FSBlkRead(bFID, i, bp); end; goBNumFont := makePtr(fontseg, 0, fontPtr); for i := 0 to sblks - 1 do begin bp := makePtr(fontSeg, (i + bblks) * 256, pDirBlk); FSBlkRead(sFID, i, bp); end; goSNumFont := makePtr(fontseg, bblks * 256, fontPtr); for i := 0 to tblks - 1 do begin bp := makePtr(fontSeg, (i + bblks + sBlks) * 256, pDirBlk); FSBlkRead(tFID, i, bp); end; goTNumFont := makePtr(fontseg, (bblks + sBlks) * 256, fontPtr); for i := 0 to lBlks - 1 do begin bp := makePtr(fontSeg, (i + bblks + sBlks + tBlks) * 256, pDirBlk); FSBlkRead(lFID, i, bp); end; goSLetFont := makePtr(fontseg, (bblks + sBlks + tBlks) * 256, fontPtr); end { setupFont }; begin { initGoBoard } printing := false; beepInit; definePats; setupFont; scrSavPtr := nil; sNumBase := 0; sNumStart := 0; bigNums := false; end. { initGoBoard }