|
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: 16036 (0x3ea4) Types: TextFile Names: »goMenu.pas«
└─⟦b20c6495f⟧ Bits:30007238 EUUGD18: Wien-båndet, efterår 1987 └─⟦this⟧ »EUUGD18/General/GoBoard/goMenu.pas«
{---------------------------------------------------------------} { Go Menu Manager } { Copyright (c) 1982 by Three Rivers Computer Corp. } { } { Written: December 3, 1982 by Stoney Ballard } { Edit History: } { } { Jan 5, 1983 - Fixed bug in menu select } { Jan 27, 1983 - added setPlayLevel } {---------------------------------------------------------------} module goMenu; exports imports fileDefs from fileDefs; imports goTree from goTree; procedure initMenu; function getMenuCmd: integer; procedure endCmd; procedure putMString(cmd: integer; ms: string); procedure activate(cmd: integer; act: boolean); procedure restoreCursor; function confirmed: boolean; function menuGoFile(var fName: pathName): boolean; procedure waitNoButton; procedure waitButton; procedure clearLine(ln: integer); procedure prompt(s: string); procedure showComment; procedure showTag; function getHCMenu: integer; function getTagMenu: tagPtr; procedure setMenuCursor; procedure menuPlayLevel(var playLevel: integer; maxLevel: integer); private imports goCom from goCom; imports goMgr from goMgr; imports popUp from popUp; imports raster from raster; imports screen from screen; imports IO_Others from IO_Others; imports fileSystem from fileSystem; imports fileUtils from fileUtils; imports perq_String from perq_String; const mWidth = 180; mHeight = 18; mLBorder = 12; mTBorder = 10; mVSpacing = mHeight + 4; mHSpacing = mWidth + 8; grHeight = mHeight - 2; grWidth = (((mWidth - 2 + 15) div 16 + 3) div 4) * 4; type mStr = string[20]; menuBox = record leftX, topY, rightX, botY: integer; isAct: boolean; str: mStr; end; greyPat = array[0..grHeight - 1] of array[0..grWidth - 1] of integer; pGreyPat = ^greyPat; var mItems: array[1..mLast] of menuBox; curHiLi, curCmd: integer; mGreyP: pGreyPat; isMenuCursor: boolean; valDesc: pNameDesc; cnfDesc: pNameDesc; res: resRes; goFNames: array[1..1024] of string[25]; tabXPos, tabYPos: integer; procedure restoreCursor; begin { restoreCursor } if isMenuCursor then IOLoadCursor(defaultCursor, 0, 0) else IOLoadCursor(selCursor, curC, curC); end { restoreCursor }; procedure waitNoButton; begin { waitNoButton } while tabYellow or tabWhite or tabGreen or tabBlue or tabSwitch do; end { waitNoButton }; procedure waitButton; begin { waitButton } while not tabSwitch do; end { waitButton }; procedure menuPlayLevel(var playLevel: integer; maxLevel: integer); var plMenu: pNameDesc; i: integer; res: resres; handler outside; begin { outside } destroyNameDesc(plMenu); write(''); {control-G} waitNoButton; exit(menuPlayLevel); end { outside }; begin { menuPlayLevel } allocNameDesc(maxLevel + 1, 0, plMenu); plMenu^.header := 'Play Level?'; for i := 0 to maxLevel do begin {$R-} plMenu^.commands[i + 1] := intToStr(i); {$R=} end; menu(plMenu, false, 1, maxLevel + 1, -1, -1, -1, res); playLevel := res^.indices[1] - 1; destroyRes(res); destroyNameDesc(plMenu); end { menuPlayLevel }; function getTagMenu: tagPtr; var tp: tagPtr; nTags, tIdx, i: integer; tMenu: pNameDesc; res: resres; handler outside; begin { outside } destroyNameDesc(tMenu); write(''); {control-G} waitNoButton; exit(getTagMenu); end { outside }; begin { getTagMenu } getTagMenu := nil; tp := treeRoot^.lastTag; nTags := 0; while tp <> nil do begin nTags := nTags + 1; tp := tp^.nextTag; end; if nTags = 0 then write('') {control-G} else begin tp := treeRoot^.lastTag; allocNameDesc(nTags, 0, tMenu); tMenu^.header := 'Which Tag?'; for i := nTags downTo 1 do begin {$R-} tMenu^.commands[i] := tp^.sTag; {$R=} tp := tp^.nextTag; end; menu(tMenu, false, 1, nTags, -1, -1, -1, res); restoreCursor; tIdx := nTags - res^.indices[1]; destroyRes(res); destroyNameDesc(tMenu); tp := treeRoot^.lastTag; for i := 1 to tIdx do tp := tp^.nextTag; getTagMenu := tp; end; end { getTagMenu }; procedure clearLine(ln: integer); var lY: integer; begin { clearLine } lY := winTable[statWin].winTY + (ln * (charHeight + lineDel)) + lineY - charHeight; rasterop(RAndNot, sWinW - promptX - 32, charHeight, promptX, lY, SScreenW, SScreenP, promptX, lY, SScreenW, SScreenP); end { clearLine }; procedure posLine(ln: integer); var lY: integer; begin { posLine } clearLine(ln); lY := winTable[statWin].winTY + (ln * (charHeight + lineDel)) + lineY; SSetCursor(promptX, lY); end { posLine }; procedure prompt(s: string); begin { prompt } posLine(promptLine); write(s); end { prompt }; procedure showTag; var ts: string; begin { showTag } posLine(tagLine); if getTag(curMove, ts) then write('Tag: ', ts); end { showTag }; procedure showComment; var cs: string; begin { showComment } posLine(cmtLine); if getComment(curMove, cs) then write('Comment: ', cs); end { showComment }; function getHCMenu: integer; var res: resres; handler outside; begin { outside } restoreCursor; getHCMenu := none; write(''); {control-G} exit(getHCMenu); end { outside }; begin { getHCMenu } menu(valDesc, false, 1, 8, -1, -1, -1, res); restoreCursor; getHCMenu := res^.indices[1] + 1; destroyRes(res); end { getHCMenu }; function menuGoFile(var fName: pathName): boolean; var fi, i: integer; fid: fileID; fileMenu: pNameDesc; res: resres; scanP: ptrScanRecord; function isGoFName(var rName: string): boolean; var ts: string; begin { isGoFName } isGoFName := false; ts := rName; convUpper(ts); if length(ts) < 3 then exit(isGoFName); ts := subStr(ts, length(ts) - 2, 3); if ts = '.GO' then begin rName := subStr(rName, 1, length(rName) - 3); isGoFName := true; end; end { isGoFName }; handler outside; begin { outside } destroyNameDesc(fileMenu); restoreCursor; menuGoFile := false; write(''); {control-G} exit(menuGoFile); end { outside }; begin { menuGoFile } new(scanP); scanP^.initialCall := true; scanP^.dirName := ''; prompt('Scanning Directory...'); fi := 0; while FSScan(scanP, fName, fid) do if isGoFName(fName) then begin fi := fi + 1; goFNames[fi] := fName; end; dispose(scanP); prompt(''); if fi < 1 then begin prompt('No GO files found'); menuGoFile := false; exit(menuGoFile); end; allocNameDesc(fi, 0, fileMenu); fileMenu^.header := 'Available Games'; for i := 1 to fi do begin {$R-} fileMenu^.commands[i] := goFNames[i]; {$R=} end; menu(fileMenu, false, 1, fi, -1, -1, -1, res); restoreCursor; destroyNameDesc(fileMenu); fName := goFNames[res^.indices[1]]; destroyRes(res); menuGoFile := true; end { menuGoFile }; function confirmed: boolean; handler outside; begin { outside } confirmed := false; restoreCursor; exit(confirmed); end { outside }; begin { confirmed } if treeDirty then begin menu(cnfDesc, false, 1, 2, -1, -1, -1, res); restoreCursor; confirmed := res^.indices[1] = 2; destroyRes(res); end else confirmed := true; end { confirmed }; procedure activate(cmd: integer; act: boolean); var dFun: lineStyle; begin { activate } with mItems[cmd] do begin isAct := act; if isAct then dFun := drawLine else dFun := eraseLine; line(dFun, leftX, topY, rightX, topY, SScreenP); line(dFun, leftX, botY, rightX, botY, SScreenP); line(dFun, leftX, topY, leftX, botY, SScreenP); line(dFun, rightX, topY, rightX, botY, SScreenP); end; end { activate }; function findItem(x, y: integer): integer; var i: integer; begin { findItem } for i := 1 to mLast do with mItems[i] do if isAct then if (x >= leftX) and (x <= rightX) and (y >= topY) and (y <= botY) then begin findItem := i; exit(findItem); end; findItem := none; end { findItem }; procedure invertItem(cmd: integer); begin { invertItem } with mItems[cmd] do rasterop(rNot, mWidth - 2, mHeight - 2, leftX + 1, topY + 1, SScreenW, SScreenP, leftX + 1, topY + 1, SScreenW, SScreenP); end { invertItem }; procedure checkHighLight; var cmd: integer; begin { checkHighLight } cmd := findItem(tabXPos, tabYPos); if cmd <> curHiLi then begin if curHiLi <> none then invertItem(curHiLi); if cmd <> none then invertItem(cmd); curHiLi := cmd; end; end { checkHighLight }; procedure writeMStr(cmd, cFunc: integer); begin { writeMStr } SChrFunc(cFunc); with mItems[cmd] do begin SSetCursor(leftX + 9, botY - 2); write(str); end; SChrFunc(rRpl); end { writeMStr }; procedure xorGrey(cmd: integer); begin { xorGrey } if (cmd <> none) and (cmd <= mLast) then with mItems[cmd] do rasterop(rXor, mWidth - 2, mHeight - 2, leftX + 1, topY + 1, SScreenW, SScreenP, 0, 0, grWidth, mGreyP); end { xorGrey }; procedure selItem(cmd: integer); begin { selItem } xorGrey(cmd); writeMStr(cmd, rOr); end { selItem }; procedure deSelItem(cmd: integer); begin { deSelItem } xorGrey(cmd); writeMStr(cmd, rAndNot); end { deSelItem }; procedure setMenuCursor; begin { setMenuCursor } if not isMenuCursor then begin IOLoadCursor(defaultCursor, 0, 0); isMenuCursor := true; end; end { setMenuCursor }; function getMenuCmd: integer; var cmd, nCmd: integer; gOn: boolean; begin { getMenuCmd } tabXPos := tabRelX; tabYPos := tabRelY; with winTable[boardWin] do if (tabXPos >= winLX) and (tabXPos <= winRX) and (tabYPos >= winTY) and (tabYPos <= winBY) then begin if isMenuCursor then IOLoadCursor(selCursor, curC, curC); isMenuCursor := false; end else setMenuCursor; checkHighLight; if not tabSwitch then curCmd := none else if tabWhite then begin with mItems[mBackOne] do if isAct then begin cmd := mBackOne; if curHiLi <> cmd then begin if curHiLi <> none then invertItem(curHiLi); invertItem(cmd); end; curHiLi := cmd; curCmd := cmd; selItem(cmd); end else write(''); {control-G} waitNoButton; end else if tabGreen then begin with mItems[mForOne] do if isAct then begin cmd := mForOne; if curHiLi <> cmd then begin if curHiLi <> none then invertItem(curHiLi); invertItem(cmd); end; curHiLi := cmd; curCmd := cmd; selItem(cmd); end else write(''); {control-G} waitNoButton; end else { tabYellow or tabBlue } begin cmd := findItem(tabXPos, tabYPos); if cmd <> none then begin selItem(cmd); gOn := true; while tabSwitch do begin nCmd := findItem(tabRelX, tabRelY); if nCmd <> cmd then begin if gOn then deSelItem(cmd); gOn := false; end else begin if not gOn then selItem(cmd); gOn := true; end; end; if gOn then begin curCmd := cmd; end else begin write(''); {control-G} curCmd := none; end; waitNoButton; end else with winTable[boardWin] do if (tabXPos >= winLX) and (tabXPos <= winRX) and (tabYPos >= winTY) and (tabYPos <= winBY) then curCmd := mPlaceStone else begin write(''); {control-G} curCmd := none; waitNoButton; end; end; getMenuCmd := curCmd; end { getMenuCmd }; procedure endCmd; begin { endCmd } if (curCmd <> none) and (curCmd <= mLast) then deSelItem(curCmd); curCmd := none; end { endCmd }; procedure putMString(cmd: integer; ms: string); begin { putMString } if (curCmd = cmd) and (cmd <= mLast) then begin deSelItem(cmd); curCmd := none; end; with mItems[cmd] do begin rasterOp(rAndNot, mWidth - 2, mHeight - 2, leftX + 1, topY + 1, SScreenW, SScreenP, leftX + 1, topY + 1, SScreenW, SScreenP); str := ms; writeMStr(cmd, rRpl); if curHiLi = cmd then invertItem(cmd); end; end { putMString }; procedure initMenu; var i, j: integer; procedure setItem(cmd, sx, sy: integer; cs: string); begin { setItem } with mItems[cmd] do begin leftX := (sx * mHSpacing) + mLBorder + mWinX; topY := (sy * mVSpacing) + mTBorder + mWinY; isAct := false; rightX := leftX + mWidth - 1; botY := topY + mHeight - 1; putMString(cmd, cs); end; end { setItem }; begin { initMenu } curHiLi := none; curCmd := none; setItem(mPass, 0, 0, 'Pass'); setItem(mAutoPlay, 0, 1, 'Generate Move'); setItem(mPlayMyself, 0, 2, 'Play Myself'); setItem(mSetPlayLevel, 0, 3, 'Set Play Level'); setItem(mSetHC, 0, 4, 'Set Handicap'); setItem(mScore, 0, 5, 'Score'); setItem(mQuit, 0, 6, 'Quit'); setItem(mInit, 0, 7, 'Initialize'); setItem(mBackOne, 1, 0, 'Backup One'); setItem(mGotoRoot, 1, 1, 'Back to Start'); setItem(mBackToBr, 1, 2, 'Back to Branch'); setItem(mBackToStone, 1, 3, 'Back to Stone'); setItem(mEraseMove, 1, 4, 'Erase Move'); setItem(mPruneBranches, 1, 5, 'Prune Branches'); setItem(mDebug, 1, 6, 'Turn Debug On'); setItem(mWriteFile, 1, 7, 'Write File'); setItem(mForOne, 2, 0, 'Forward One'); setItem(mForToLeaf, 2, 1, 'Forward to Leaf'); setItem(mForToBr, 2, 2, 'Forward to Branch'); setItem(mStepToTag, 2, 3, 'Step Towards Tag'); setItem(mGotoTag, 2, 5, 'Go To Tag'); setItem(mRefBoard, 2, 6, 'Refresh Board'); setItem(mReadFile, 2, 7, 'Read File'); setItem(mPutTag, 3, 0, 'Put Tag'); setItem(mPutCmt, 3, 1, 'Put Comment'); setItem(mSetStepTag, 3, 2, 'Set Step Tag'); setItem(mShoState, 3, 3, 'Show Player State'); setItem(mTogNums, 3, 4, 'Show Stone Numbers'); setItem(mBoardSize, 3, 5, 'Use Small Board'); setItem(mPrintBoard, 3, 6, 'Print Board'); setItem(mPrintDiag, 3, 7, 'Print Diagram'); initPopUp; allocNameDesc(8, 0, valDesc); with valDesc^ do begin {$R-} header := 'How Many?'; commands[1] := '2'; commands[2] := '3'; commands[3] := '4'; commands[4] := '5'; commands[5] := '6'; commands[6] := '7'; commands[7] := '8'; commands[8] := '9'; {$R=} end; allocNameDesc(2, 0, cnfDesc); with cnfDesc^ do begin header := 'Confirm'; {$R-} commands[1] := 'No'; commands[2] := 'Yes'; {$R=} end; new(0, 4, mGreyP); i := 0; repeat for j := 0 to (grWidth - 1) do case (i mod 4) of 0, 2: mGreyP^[i, j] := #177777; 1: mGreyP^[i, j] := #125252; 3: mGreyP^[i, j] := #052525; end; i := i + 1; until i > (grHeight - 1); isMenuCursor := true; end. { initMenu }