home *** CD-ROM | disk | FTP | other *** search
/ The Datafile PD-CD 3 / PDCD_3.iso / pocketbk / games / yam11src / DISP.OPL next >
Text File  |  1995-07-08  |  8KB  |  260 lines

  1. REM MODULE Disp
  2. REM Copyright (c) 1995 Bermuda Software Publishing
  3. REM Written by Bruno Essmann (bessmann@iiic.ethz.ch)
  4.  
  5. #define Print(x,y,s)     gAT x,y : gPRINT s
  6. #define Line(x,y,w,h)    gAT x,y : gLINEBY w,h
  7. #define Font(t,s)        gFONT t : gSTYLE s
  8. #define Fill(x,y,w,h,m)  gAT x,y : gFILL w,h,m
  9.  
  10. PROC Disp_Init
  11.     REM Initialize Display
  12.     LOCAL rect%(4), fname$(32), mpicb%, mpicg%
  13.  
  14.     REM Some standard stuff
  15.     STATUSWIN ON, 2 : STATWININFO(-1, rect%())
  16.     gSETWIN 0, 0, rect%(1), 160
  17.     DEFAULTWIN 1 : gGREY 2 : gBORDER 0
  18.  
  19.     REM Draw some things that won't change
  20.     Line(285, 8, 0, 144)
  21.     Font(8, 1) : Print(330, 28, "YAM") : Font(10, 0)
  22.     Print(295,  55, DispStatus)
  23.     Print(295,  70, DispTime)
  24.     Print(295,  85, DispMines)
  25.     Print(295, 105, DispType)
  26.     Print(295, 120, DispWidth)
  27.     Print(295, 135, DispHeight)
  28.     Print(295, 150, DispMines)
  29.  
  30.     REM Find picture file
  31.     fname$ = DispPicture
  32.     IF NOT Util_FileExist(ADDR(fname$))
  33.         REM Show error with filename (but without drivename)
  34.         ALERT(ERR$(-33), PEEK$(ADDR(fname$)+2))
  35.         REM Set flag 'Picture not loaded' and terminate
  36.         GamePict = -1
  37.         Term
  38.     ENDIF
  39.  
  40.     REM Combine black and grey plane in one drawable called GamePict
  41.     mpicb% = gLOADBIT(fname$, 0, 0) : mpicg% = gLOADBIT(fname$, 0, 1)
  42.     GamePict = gCREATE(0, 0, 135, 37, 0, 1)
  43.     gGREY 0 : gCOPY mpicb%, 0, 0, 135, 37, 0 : gGREY 1
  44.     gCOPY mpicg%, 0, 0, 135, 37, 0
  45.     gCLOSE mpicb% : gCLOSE mpicg%
  46.     gUSE 1 : gGREY 2
  47.  
  48.     PauseWinOpen = 0
  49. ENDP REM Disp_Init
  50.  
  51. PROC Disp_Term
  52.     REM Terminate Display (will only be called once)
  53.     IF GamePict > 0
  54.         gCLOSE GamePict
  55.     ENDIF
  56. ENDP REM Disp_Term
  57.  
  58. PROC Disp_MarkInit
  59.     REM Initialize marker and border marks (if needed)
  60.     MarkX = 0 : MarkY = 0
  61.     IF D.BMark% = 1
  62.         REM Draw border marks as well
  63.         Disp_MarkToggle
  64.     ENDIF
  65.     Fill(ScrX+MarkX*FieldW, ScrY+MarkY*FieldW, FieldW-1, FieldW-1, 2)
  66. ENDP REM Disp_MarkInit
  67.  
  68. PROC Disp_MarkToggle
  69.     REM Remove the marker
  70.     Fill(ScrX+MarkX*FieldW, ScrY-MarkW-2, FieldW, MarkW, 2)
  71.     Fill(ScrX+MarkX*FieldW, ScrY+GameH*FieldW+1, FieldW, MarkW, 2)
  72.     Fill(ScrX-MarkW-2, ScrY+MarkY*FieldW, MarkW, FieldW, 2)
  73.     Fill(ScrX+GameW*FieldW+1, ScrY+MarkY*FieldW, MarkW, FieldW, 2)
  74. ENDP REM Disp_MarkToggle
  75.  
  76. PROC Disp_MarkMove(dir%, step%)
  77.     REM Move marker according to dir% and step%
  78.     LOCAL x%, y%
  79.     
  80.     IF GameStatus < GameNew OR GameStatus > GamePlay : RETURN : ENDIF
  81.     
  82.     x% = MarkX : y% = MarkY
  83.     VECTOR dir% : Up, Down, Right, Left, PgUp, PgDown, Home, End : ENDV
  84.     Up::            : y% = y%-step%    : GOTO Check
  85.     Down::        : y% = y%+step%    : GOTO Check
  86.     Right::        : x% = x%+step%    : GOTO Check
  87.     Left::        : x% = x%-step%    : GOTO Check
  88.     PgUp::        : y% = 0                : GOTO Draw
  89.     PgDown::    : y% = GameH-1    : GOTO Draw
  90.     Home::        : x% = 0                : GOTO Draw
  91.     End::            : x% = GameW-1    : GOTO Draw
  92.  
  93.     Check::
  94.     REM Check if values are valid before proceeding
  95.     IF x% < 0                        : x% = 0
  96.     ELSEIF x% > GameW-1    : x% = GameW-1
  97.     ELSEIF y% < 0                : y% = 0
  98.     ELSEIF y% > GameH-1    : y% = GameH-1
  99.     ENDIF
  100.  
  101.     Draw::
  102.     REM Remove the old mark and draw the new one, adjust MarkX, MarkY
  103.     Disp_MarkDraw(x%, y%)
  104. ENDP REM Disp_MarkMove
  105.  
  106. PROC Disp_MarkDraw(x%, y%)
  107.     REM Update marks according to x% and y%
  108.     IF x% = MarkX AND y% = MarkY : RETURN : ENDIF
  109.     IF D.BMark% = 1
  110.         REM Additional border marks are on
  111.         Fill(ScrX+MarkX*FieldW, ScrY-MarkW-2, FieldW, MarkW, 2)
  112.         Fill(ScrX+MarkX*FieldW, ScrY+GameH*FieldW+1, FieldW, MarkW, 2)
  113.         Fill(ScrX+x%*FieldW, ScrY-MarkW-2, FieldW, MarkW, 2)
  114.         Fill(ScrX+x%*FieldW, ScrY+GameH*FieldW+1, FieldW, MarkW, 2)
  115.         Fill(ScrX-MarkW-2, ScrY+MarkY*FieldW, MarkW, FieldW, 2)
  116.         Fill(ScrX+GameW*FieldW+1, ScrY+MarkY*FieldW, MarkW, FieldW, 2)
  117.         Fill(ScrX-MarkW-2, ScrY+y%*FieldW, MarkW, FieldW, 2)
  118.         Fill(ScrX+GameW*FieldW+1, ScrY+y%*FieldW, MarkW, FieldW, 2)
  119.     ENDIF
  120.     Fill(ScrX+MarkX*FieldW, ScrY+MarkY*FieldW, FieldW-1, FieldW-1, 2)
  121.     Fill(ScrX+x%*FieldW, ScrY+y%*FieldW, FieldW-1, FieldW-1, 2)
  122.     MarkX = x% : MarkY = y%
  123. ENDP REM Disp_MarkDraw
  124.  
  125. PROC Disp_MarkShowHide
  126.     Fill(ScrX+MarkX*FieldW, ScrY+MarkY*FieldW, FieldW-1, FieldW-1, 2)
  127. ENDP REM Disp_MarkShow
  128.  
  129. PROC Disp_DrawBord
  130.     REM Draw new gameboard
  131.     LOCAL i%, k%, w%, tempwin%
  132.     
  133.     REM Drawing the minefield takes quite long therefore we're
  134.     REM going to try to speed this up a little bit by drawing
  135.     REM to an invisible bitmap. To reduce the number of gCOPY
  136.     REM instruction we're doing some additional work.
  137.     tempwin% = gCREATE(0, 0, GameW*FieldW, GameH*FieldW, 0, 1)
  138.     gGREY 2 : gAT 0, 0 : gCOPY GamePict, 0, 0, FieldW, FieldW, 3
  139.     gUSE tempwin%
  140.  
  141.     gAT FieldW, 0 : gCOPY tempwin%, 0, 0, FieldW, FieldW, 3
  142.     k% = GameW/2 : i% = 1
  143.     WHILE i% <> k%
  144.         gAT i%*2*FieldW, 0 : gCOPY tempwin%, 0, 0, 2*FieldW, FieldW, 3
  145.         INC(i%)
  146.     ENDWH
  147.     IF GameW AND $1
  148.         gAT (GameW-1)*FieldW, 0 : gCOPY tempwin%, 0, 0, FieldW, FieldW, 3
  149.     ENDIF
  150.  
  151.     w% = GameW*FieldW
  152.     gAT 0, FieldW : gCOPY tempwin%, 0, 0, w%, FieldW, 3
  153.     k% = GameH/2 : i% = 1
  154.     WHILE i% <> k%
  155.         gAT 0, i%*2*FieldW : gCOPY tempwin%, 0, 0, w%, 2*FieldW, 3
  156.         INC(i%)
  157.     ENDWH
  158.     IF GameH AND $1
  159.         gAT 0, (GameH-1)*FieldW : gCOPY tempwin%, 0, 0, w%, FieldW, 3
  160.     ENDIF
  161.  
  162.     REM Clear game rect and copy the created minefield
  163.     gUSE 1
  164.     Fill(4,4,277,152,1)
  165.     gAT ScrX-1, ScrY-1 : gBOX FieldW*GameW+1, FieldW*GameH+1
  166.     gAT ScrX, ScrY : gCOPY tempwin%, 0, 0, GameW*FieldW, GameH*FieldW, 3
  167.     gCLOSE tempwin%
  168.  
  169.     REM Print game values    
  170.     gAT 350, 105
  171.     IF GameType = GameBeginner            : gPRINTB DispBeginner, 60
  172.     ELSEIF GameType = GameAdvanced    : gPRINTB DispAdvanced, 60
  173.     ELSEIF GameType = GameExpert        : gPRINTB DispExpert, 60
  174.     ELSE                                                         : gPRINTB DispCustom, 60
  175.     ENDIF
  176.     gAT 350, 120 : gPRINTB NUM$(GameW, 2), 60
  177.     gAT 350, 135 : gPRINTB NUM$(GameH, 2), 60
  178.     gAT 350, 150 : gPRINTB NUM$(GameMines, 3), 60
  179. ENDP REM Disp_DrawBord
  180.  
  181. PROC Disp_DrawField(x%, y%)
  182.     REM Draw one single minefield cell
  183.     LOCAL i%
  184.  
  185.     i% = Fieldtype(x%, y%)
  186.     IF GameStatus = GameOver
  187.         IF i% = FieldMined
  188.             i% = 1
  189.         ELSEIF i% = FieldFalseFlagged
  190.             i% = 12
  191.         ENDIF
  192.     ELSE
  193.         IF (i% = FieldMined) OR (i% = FieldFree)
  194.             i% = 0
  195.         ELSEIF (i% = FieldFlagged) OR (i% = FieldFalseFlagged)
  196.             i% = 11
  197.         ELSEIF i% = FieldNumbered
  198.             i% = Fieldnumber(x%, y%)+2
  199.         ENDIF
  200.     ENDIF
  201.     
  202.     gAT ScrX+x%*FieldW, ScrY+y%*FieldW
  203.     gCOPY GamePict, i%*FieldW, 0, FieldW, FieldW, 3
  204. ENDP REM Disp_DrawField
  205.  
  206. PROC Disp_DrawSmiley
  207.     REM Draw smiley and update status information
  208.     LOCAL face%
  209.  
  210.     gAT 350, 55
  211.     IF GameStatus = GameOver
  212.         IF CheckWon()
  213.             gPRINTB DispGameWon, 60 : face% = 3
  214.         ELSE
  215.             gPRINTB DispGameOver, 60 : face% = 2
  216.         ENDIF
  217.     ELSEIF GameStatus = GameNew                : gPRINTB DispGameNew, 60            : face% = 0
  218.     ELSEIF GameStatus = GamePlay            : gPRINTB DispGamePlay, 60        : face% = 0
  219.     ELSEIF GameStatus = GamePaused        : gPRINTB DispGamePaused, 60    : face% = 1
  220.     ELSEIF GameStatus = GameInit            : gPRINTB DispGameInit, 60        : face% = 1
  221.     ELSEIF GameStatus = GamePeekGood    : gPRINTB DispGameCheat, 60        : face% = 3
  222.     ELSEIF GameStatus = GamePeekNada  : gPRINTB DispGameCheat, 60        : face% = 2
  223.     ENDIF
  224.     gAT 295, 8 : gCOPY GamePict, face%*27, 10, 27, 27, 3
  225. ENDP REM Disp_DrawSmiley
  226.  
  227. PROC Disp_DrawFlags
  228.     gAT 350, 85 : gPRINTB NUM$(GameMines-NoFlags-NoFalseFlags, 5), 60
  229. ENDP REM Disp_DrawFlags
  230.  
  231. PROC Disp_DrawTime
  232.     gAT 350, 70
  233.     gPRINTB Util_TimeString(TimeMin, TimeSec), 60
  234. ENDP REM Disp_DrawTime
  235.  
  236. PROC Disp_OpenPauseWin
  237.     REM Show "Game Paused" window
  238.     IF ((GameStatus <> GamePlay) AND (GameStatus <> GamePaused)) : RETURN : ENDIF
  239.     INC(PauseWinOpen)
  240.     IF (PauseWinOpen > 1) : RETURN : ENDIF
  241.     PauseWin = gCREATE(ScrX, ScrY, FieldW*GameW-1,FieldW*GameH-1, 1, 0)
  242.     gAT (FieldW*GameW-28)/2, (FieldW*GameH-28)/2
  243.     gCOPY GamePict, 108, 10, 27, 27, 3
  244.     gFONT 5 : gSTYLE 0
  245.     gAT 1, (FieldW*GameH)/2-20
  246.     gPRINTB DispPauseGame, FieldW*GameW-2, 3
  247.     gAT 1, (FieldW*GameH)/2+26
  248.     gPRINTB DispPausePause, FieldW*GameW-2, 3
  249.     gFONT 10 : gSTYLE 0
  250. ENDP REM Disp_OpenPauseWin
  251.  
  252. PROC Disp_ClosePauseWin
  253.     IF ((GameStatus <> GamePlay) AND (GameStatus <> GamePaused)) : RETURN : ENDIF
  254.     DEC(PauseWinOpen)
  255.     IF PauseWinOpen > 0 : RETURN : ENDIF
  256.     gCLOSE PauseWin
  257. ENDP REM Disp_ClosePauseWin
  258.  
  259. REM END Disp.
  260.