home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Datafile PD-CD 3
/
PDCD_3.iso
/
pocketbk
/
games
/
yam11src
/
GAME.OPL
< prev
next >
Wrap
Text File
|
1995-07-27
|
6KB
|
282 lines
REM MODULE Game
REM Copyright (c) 1995 Bermuda Software Publishing
REM Written by Bruno Essmann (bessmann@iiic.ethz.ch)
PROC Game_PreInit
REM Initialize minefield
LOCAL x%, y%
LOCK ON
REM Initialize global variables
NoFlags = 0
NoFalseFlags = 0
NoFree = GameW*GameH-GameMines
REM Initialize minefield, set all fields to 'Free'
y% = 0
WHILE y% < MaxH
x% = 0
WHILE x% < MaxW
SetFieldtype(x%, y%, FieldFree)
INC(x%)
ENDWH
INC(y%)
ENDWH
LOCK OFF
ENDP REM Game_PreInit
PROC Game_Init
REM Initialize minefield and distribute mines
LOCAL x%, y%, i%, k%, mines%
LOCAL mxm%, mym%, mxp%, myp%
LOCK ON
REM Indicate, we're initializing
GameStatus = GameInit
Disp_DrawSmiley
BUSY GameInitDistrib, 1, 2
REM Distribute mines randomly
mxm% = MarkX-1 : mxp% = MarkX+1
mym% = MarkY-1 : myp% = MarkY+1
i% = 0
WHILE i% < GameMines
DO
DO
x% = Util_Rand(GameW) : y% = Util_Rand(GameH)
UNTIL (x% < mxm%) OR (x% > mxp%) OR (y% < mym%) OR (y% > myp%)
UNTIL Fieldtype(x%, y%) = FieldFree
SetFieldtype(x%, y%, FieldMined)
INC(i%)
ENDWH
BUSY GameInitCalc, 1, 2
REM Calculate number of mines in adjacent fields
REM (I know that this could be done faster but I don't
REM think that the gain is worth the trouble...)
x% = 0
WHILE x% < GameW
y% = 0
WHILE y% < GameH
IF Fieldtype(x%, y%) <> FieldMined
mines% = 0
i% = x%-1
WHILE i% <= x%+1
k% = y%-1
WHILE k% <= y%+1
IF (i% >= 0) AND (i% < GameW) AND (k% >= 0) AND (k% < GameH)
IF Fieldtype(i%, k%) = FieldMined : INC(mines%) : ENDIF
ENDIF
INC(k%)
ENDWH
INC(i%)
ENDWH
SetNoMines(x%, y%, mines%)
ENDIF
INC(y%)
ENDWH
INC(x%)
ENDWH
BUSY OFF
LOCK OFF
REM Game is running...
GameStatus = GamePlay : Disp_DrawSmiley
TimerStart
ENDP REM Game_Init
PROC Game_Lost
LOCAL x%, y%, i%
TimerStop
Util_Play(SoundLost)
GameStatus = GameOver
Disp_DrawFlags
Disp_DrawSmiley
x% = 0
WHILE x% < GameW
y% = 0
WHILE y% < GameH
i% = Fieldtype(x%, y%)
IF (i% = FieldFalseFlagged) OR (i% = FieldMined)
Disp_DrawField(x%, y%)
ENDIF
INC(y%)
ENDWH
INC(x%)
ENDWH
ENDP REM Game_Lost
PROC Game_Won
TimerStop
Util_Play(SoundWon)
GameStatus = GameOver
Disp_DrawSmiley
CheckHiscore
ENDP REM Game_Won
PROC Game_Cheat
REM Check one single field
LOCAL t%, w%
t% = Fieldtype(MarkX, MarkY)
IF (t% = FieldMined) OR (t% = FieldFalseFlagged)
GameStatus = GamePeekNada
ELSE
GameStatus = GamePeekGood
ENDIF
Disp_DrawSmiley
t% = GameCheatDelay : w% = 10 / t%
WHILE t% > 0 : TimerUpdate : PAUSE w% : DEC(t%) : ENDWH
GameStatus = GamePlay
Disp_DrawSmiley
ENDP REM Game_Cheat
#ifdef CHECK_RECURSIVE
REM Recursive version
PROC Game_CheckField(x%, y%, t%)
LOCAL i%, k%
IF t% = FieldMined
Game_Lost
ELSE
SetFieldtype(x%, y%, FieldNumbered)
IF Fieldnumber(x%, y%) = 0
i% = x%-1
WHILE i% <= x%+1
k% = y%-1
WHILE k% <= y%+1
IF (i% >= 0) AND (i% < GameW) AND (k% >= 0) AND (k% < GameH)
IF Fieldtype(i%, k%) = FieldFree
Game_CheckField(i%, k%, FieldFree)
ENDIF
ENDIF
INC(k%)
ENDWH
INC(i%)
ENDWH
ENDIF
Disp_DrawField(x%, y%)
DEC(NoFree)
IF CheckWon() : Game_Won : ENDIF
ENDIF
ENDP REM Game_CheckField
#else
REM Nonrecursive version
PROC Game_CheckField(x%, y%, t%)
LOCAL StackX%(MaxWH), StackY%(MaxWH), Top%, Bot%, i%, k%, c%
IF t% = FieldMined
Game_Lost : RETURN
ENDIF
Bot% = 1 : Top% = 2
StackX%(1) = x% : StackY%(1) = y%
WHILE Bot% < Top%
SetFieldtype(StackX%(Bot%), StackY%(Bot%), FieldNumbered)
IF Fieldnumber(StackX%(Bot%), StackY%(Bot%)) = 0
i% = StackX%(Bot%)-1
WHILE i% <= StackX%(Bot%)+1
k% = StackY%(Bot%)-1
WHILE k% <= StackY%(Bot%)+1
IF (i% >= 0) AND (i% < GameW) AND (k% >= 0) AND (k% < GameH)
IF Fieldtype(i%, k%) = FieldFree
c% = Bot%+1
WHILE c% < Top%
IF (StackX%(c%) = i%) AND (StackY%(c%) = k%)
BREAK
ENDIF
INC(c%)
ENDWH
IF c% = Top%
StackX%(Top%) = i% : StackY%(Top%) = k%
INC(Top%)
ENDIF
ENDIF
ENDIF
INC(k%)
ENDWH
INC(i%)
ENDWH
ENDIF
Disp_DrawField(StackX%(Bot%), StackY%(Bot%))
DEC(NoFree)
IF CheckWon() : Game_Won : RETURN : ENDIF
INC(Bot%)
ENDWH
ENDP REM Game_CheckField
#endif
PROC Game_FlagField
REM Mark field with a flag
LOCAL i%
i% = Fieldtype(MarkX, MarkY)
IF i% = FieldNumbered
RETURN
ELSEIF i% = FieldMined
INC(NoFlags)
SetFieldtype(MarkX, MarkY, FieldFlagged)
ELSEIF i% = FieldFree
INC(NoFalseFlags)
SetFieldtype(MarkX, MarkY, FieldFalseFlagged)
ELSEIF i% = FieldFlagged
DEC(NoFlags)
SetFieldtype(MarkX, MarkY, FieldMined)
ELSEIF i% = FieldFalseFlagged
DEC(NoFalseFlags)
SetFieldtype(MarkX, MarkY, FieldFree)
ENDIF
Disp_DrawField(MarkX, MarkY)
Disp_DrawFlags
Disp_MarkShow
IF CheckWon() : Game_Won : ENDIF
ENDP REM Game_FlagField
PROC Game_CheckGroup
REM This only works if current field is already uncovered
LOCAL x%, y%, t%, n%
n% = Fieldnumber(MarkX, MarkY)
x% = MarkX-1
WHILE x% <= MarkX+1
y% = MarkY-1
WHILE y% <= MarkY+1
IF (x% >= 0) AND (x% < GameW) AND (y% >= 0) AND (y% < GameH)
t% = Fieldtype(x%, y%)
IF (t% = FieldFlagged) OR (t% = FieldFalseFlagged)
DEC(n%)
ENDIF
ENDIF
INC(y%)
ENDWH
INC(x%)
ENDWH
IF n% <> 0
Util_Play(SoundError)
RETURN
ENDIF
LOCK ON
x% = MarkX-1
WHILE x% <= MarkX+1
y% = MarkY-1
WHILE y% <= MarkY+1
IF (x% >= 0) AND (x% < GameW) AND (y% >= 0) AND (y% < GameH)
t% = Fieldtype(x%, y%)
IF (t% = FieldFree) OR (t% = FieldMined)
Game_CheckField(x%, y%, t%)
ENDIF
ENDIF
INC(y%)
ENDWH
INC(x%)
ENDWH
LOCK OFF
ENDP REM Game_CheckGroup
REM END Game.