home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Datafile PD-CD 3
/
PDCD_3.iso
/
pocketbk
/
games
/
yam11src
/
DISP.OPL
next >
Wrap
Text File
|
1995-07-08
|
8KB
|
260 lines
REM MODULE Disp
REM Copyright (c) 1995 Bermuda Software Publishing
REM Written by Bruno Essmann (bessmann@iiic.ethz.ch)
#define Print(x,y,s) gAT x,y : gPRINT s
#define Line(x,y,w,h) gAT x,y : gLINEBY w,h
#define Font(t,s) gFONT t : gSTYLE s
#define Fill(x,y,w,h,m) gAT x,y : gFILL w,h,m
PROC Disp_Init
REM Initialize Display
LOCAL rect%(4), fname$(32), mpicb%, mpicg%
REM Some standard stuff
STATUSWIN ON, 2 : STATWININFO(-1, rect%())
gSETWIN 0, 0, rect%(1), 160
DEFAULTWIN 1 : gGREY 2 : gBORDER 0
REM Draw some things that won't change
Line(285, 8, 0, 144)
Font(8, 1) : Print(330, 28, "YAM") : Font(10, 0)
Print(295, 55, DispStatus)
Print(295, 70, DispTime)
Print(295, 85, DispMines)
Print(295, 105, DispType)
Print(295, 120, DispWidth)
Print(295, 135, DispHeight)
Print(295, 150, DispMines)
REM Find picture file
fname$ = DispPicture
IF NOT Util_FileExist(ADDR(fname$))
REM Show error with filename (but without drivename)
ALERT(ERR$(-33), PEEK$(ADDR(fname$)+2))
REM Set flag 'Picture not loaded' and terminate
GamePict = -1
Term
ENDIF
REM Combine black and grey plane in one drawable called GamePict
mpicb% = gLOADBIT(fname$, 0, 0) : mpicg% = gLOADBIT(fname$, 0, 1)
GamePict = gCREATE(0, 0, 135, 37, 0, 1)
gGREY 0 : gCOPY mpicb%, 0, 0, 135, 37, 0 : gGREY 1
gCOPY mpicg%, 0, 0, 135, 37, 0
gCLOSE mpicb% : gCLOSE mpicg%
gUSE 1 : gGREY 2
PauseWinOpen = 0
ENDP REM Disp_Init
PROC Disp_Term
REM Terminate Display (will only be called once)
IF GamePict > 0
gCLOSE GamePict
ENDIF
ENDP REM Disp_Term
PROC Disp_MarkInit
REM Initialize marker and border marks (if needed)
MarkX = 0 : MarkY = 0
IF D.BMark% = 1
REM Draw border marks as well
Disp_MarkToggle
ENDIF
Fill(ScrX+MarkX*FieldW, ScrY+MarkY*FieldW, FieldW-1, FieldW-1, 2)
ENDP REM Disp_MarkInit
PROC Disp_MarkToggle
REM Remove the marker
Fill(ScrX+MarkX*FieldW, ScrY-MarkW-2, FieldW, MarkW, 2)
Fill(ScrX+MarkX*FieldW, ScrY+GameH*FieldW+1, FieldW, MarkW, 2)
Fill(ScrX-MarkW-2, ScrY+MarkY*FieldW, MarkW, FieldW, 2)
Fill(ScrX+GameW*FieldW+1, ScrY+MarkY*FieldW, MarkW, FieldW, 2)
ENDP REM Disp_MarkToggle
PROC Disp_MarkMove(dir%, step%)
REM Move marker according to dir% and step%
LOCAL x%, y%
IF GameStatus < GameNew OR GameStatus > GamePlay : RETURN : ENDIF
x% = MarkX : y% = MarkY
VECTOR dir% : Up, Down, Right, Left, PgUp, PgDown, Home, End : ENDV
Up:: : y% = y%-step% : GOTO Check
Down:: : y% = y%+step% : GOTO Check
Right:: : x% = x%+step% : GOTO Check
Left:: : x% = x%-step% : GOTO Check
PgUp:: : y% = 0 : GOTO Draw
PgDown:: : y% = GameH-1 : GOTO Draw
Home:: : x% = 0 : GOTO Draw
End:: : x% = GameW-1 : GOTO Draw
Check::
REM Check if values are valid before proceeding
IF x% < 0 : x% = 0
ELSEIF x% > GameW-1 : x% = GameW-1
ELSEIF y% < 0 : y% = 0
ELSEIF y% > GameH-1 : y% = GameH-1
ENDIF
Draw::
REM Remove the old mark and draw the new one, adjust MarkX, MarkY
Disp_MarkDraw(x%, y%)
ENDP REM Disp_MarkMove
PROC Disp_MarkDraw(x%, y%)
REM Update marks according to x% and y%
IF x% = MarkX AND y% = MarkY : RETURN : ENDIF
IF D.BMark% = 1
REM Additional border marks are on
Fill(ScrX+MarkX*FieldW, ScrY-MarkW-2, FieldW, MarkW, 2)
Fill(ScrX+MarkX*FieldW, ScrY+GameH*FieldW+1, FieldW, MarkW, 2)
Fill(ScrX+x%*FieldW, ScrY-MarkW-2, FieldW, MarkW, 2)
Fill(ScrX+x%*FieldW, ScrY+GameH*FieldW+1, FieldW, MarkW, 2)
Fill(ScrX-MarkW-2, ScrY+MarkY*FieldW, MarkW, FieldW, 2)
Fill(ScrX+GameW*FieldW+1, ScrY+MarkY*FieldW, MarkW, FieldW, 2)
Fill(ScrX-MarkW-2, ScrY+y%*FieldW, MarkW, FieldW, 2)
Fill(ScrX+GameW*FieldW+1, ScrY+y%*FieldW, MarkW, FieldW, 2)
ENDIF
Fill(ScrX+MarkX*FieldW, ScrY+MarkY*FieldW, FieldW-1, FieldW-1, 2)
Fill(ScrX+x%*FieldW, ScrY+y%*FieldW, FieldW-1, FieldW-1, 2)
MarkX = x% : MarkY = y%
ENDP REM Disp_MarkDraw
PROC Disp_MarkShowHide
Fill(ScrX+MarkX*FieldW, ScrY+MarkY*FieldW, FieldW-1, FieldW-1, 2)
ENDP REM Disp_MarkShow
PROC Disp_DrawBord
REM Draw new gameboard
LOCAL i%, k%, w%, tempwin%
REM Drawing the minefield takes quite long therefore we're
REM going to try to speed this up a little bit by drawing
REM to an invisible bitmap. To reduce the number of gCOPY
REM instruction we're doing some additional work.
tempwin% = gCREATE(0, 0, GameW*FieldW, GameH*FieldW, 0, 1)
gGREY 2 : gAT 0, 0 : gCOPY GamePict, 0, 0, FieldW, FieldW, 3
gUSE tempwin%
gAT FieldW, 0 : gCOPY tempwin%, 0, 0, FieldW, FieldW, 3
k% = GameW/2 : i% = 1
WHILE i% <> k%
gAT i%*2*FieldW, 0 : gCOPY tempwin%, 0, 0, 2*FieldW, FieldW, 3
INC(i%)
ENDWH
IF GameW AND $1
gAT (GameW-1)*FieldW, 0 : gCOPY tempwin%, 0, 0, FieldW, FieldW, 3
ENDIF
w% = GameW*FieldW
gAT 0, FieldW : gCOPY tempwin%, 0, 0, w%, FieldW, 3
k% = GameH/2 : i% = 1
WHILE i% <> k%
gAT 0, i%*2*FieldW : gCOPY tempwin%, 0, 0, w%, 2*FieldW, 3
INC(i%)
ENDWH
IF GameH AND $1
gAT 0, (GameH-1)*FieldW : gCOPY tempwin%, 0, 0, w%, FieldW, 3
ENDIF
REM Clear game rect and copy the created minefield
gUSE 1
Fill(4,4,277,152,1)
gAT ScrX-1, ScrY-1 : gBOX FieldW*GameW+1, FieldW*GameH+1
gAT ScrX, ScrY : gCOPY tempwin%, 0, 0, GameW*FieldW, GameH*FieldW, 3
gCLOSE tempwin%
REM Print game values
gAT 350, 105
IF GameType = GameBeginner : gPRINTB DispBeginner, 60
ELSEIF GameType = GameAdvanced : gPRINTB DispAdvanced, 60
ELSEIF GameType = GameExpert : gPRINTB DispExpert, 60
ELSE : gPRINTB DispCustom, 60
ENDIF
gAT 350, 120 : gPRINTB NUM$(GameW, 2), 60
gAT 350, 135 : gPRINTB NUM$(GameH, 2), 60
gAT 350, 150 : gPRINTB NUM$(GameMines, 3), 60
ENDP REM Disp_DrawBord
PROC Disp_DrawField(x%, y%)
REM Draw one single minefield cell
LOCAL i%
i% = Fieldtype(x%, y%)
IF GameStatus = GameOver
IF i% = FieldMined
i% = 1
ELSEIF i% = FieldFalseFlagged
i% = 12
ENDIF
ELSE
IF (i% = FieldMined) OR (i% = FieldFree)
i% = 0
ELSEIF (i% = FieldFlagged) OR (i% = FieldFalseFlagged)
i% = 11
ELSEIF i% = FieldNumbered
i% = Fieldnumber(x%, y%)+2
ENDIF
ENDIF
gAT ScrX+x%*FieldW, ScrY+y%*FieldW
gCOPY GamePict, i%*FieldW, 0, FieldW, FieldW, 3
ENDP REM Disp_DrawField
PROC Disp_DrawSmiley
REM Draw smiley and update status information
LOCAL face%
gAT 350, 55
IF GameStatus = GameOver
IF CheckWon()
gPRINTB DispGameWon, 60 : face% = 3
ELSE
gPRINTB DispGameOver, 60 : face% = 2
ENDIF
ELSEIF GameStatus = GameNew : gPRINTB DispGameNew, 60 : face% = 0
ELSEIF GameStatus = GamePlay : gPRINTB DispGamePlay, 60 : face% = 0
ELSEIF GameStatus = GamePaused : gPRINTB DispGamePaused, 60 : face% = 1
ELSEIF GameStatus = GameInit : gPRINTB DispGameInit, 60 : face% = 1
ELSEIF GameStatus = GamePeekGood : gPRINTB DispGameCheat, 60 : face% = 3
ELSEIF GameStatus = GamePeekNada : gPRINTB DispGameCheat, 60 : face% = 2
ENDIF
gAT 295, 8 : gCOPY GamePict, face%*27, 10, 27, 27, 3
ENDP REM Disp_DrawSmiley
PROC Disp_DrawFlags
gAT 350, 85 : gPRINTB NUM$(GameMines-NoFlags-NoFalseFlags, 5), 60
ENDP REM Disp_DrawFlags
PROC Disp_DrawTime
gAT 350, 70
gPRINTB Util_TimeString(TimeMin, TimeSec), 60
ENDP REM Disp_DrawTime
PROC Disp_OpenPauseWin
REM Show "Game Paused" window
IF ((GameStatus <> GamePlay) AND (GameStatus <> GamePaused)) : RETURN : ENDIF
INC(PauseWinOpen)
IF (PauseWinOpen > 1) : RETURN : ENDIF
PauseWin = gCREATE(ScrX, ScrY, FieldW*GameW-1,FieldW*GameH-1, 1, 0)
gAT (FieldW*GameW-28)/2, (FieldW*GameH-28)/2
gCOPY GamePict, 108, 10, 27, 27, 3
gFONT 5 : gSTYLE 0
gAT 1, (FieldW*GameH)/2-20
gPRINTB DispPauseGame, FieldW*GameW-2, 3
gAT 1, (FieldW*GameH)/2+26
gPRINTB DispPausePause, FieldW*GameW-2, 3
gFONT 10 : gSTYLE 0
ENDP REM Disp_OpenPauseWin
PROC Disp_ClosePauseWin
IF ((GameStatus <> GamePlay) AND (GameStatus <> GamePaused)) : RETURN : ENDIF
DEC(PauseWinOpen)
IF PauseWinOpen > 0 : RETURN : ENDIF
gCLOSE PauseWin
ENDP REM Disp_ClosePauseWin
REM END Disp.