home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Datafile PD-CD 3
/
PDCD_3.iso
/
pocketbk
/
games
/
yam11src
/
MAIN.OPL
< prev
next >
Wrap
Text File
|
1995-07-27
|
14KB
|
484 lines
REM MODULE Main
REM Copyright (c) 1995 Bermuda Software Publishing
REM Written by Bruno Essmann (bessmann@iiic.ethz.ch)
PROC YAM_Init
REM Asynchronous timer setup
TimerError = IOOPEN(TimerHandle, "TIM:", -1)
IF TimerError : ALERT(ERR$(-45), ErrTimer) : Term : ENDIF
TimerTime = 10 : TimerStatus = -46
REM Load preferences
LoadPrefs
ENDP REM YAM_Init
PROC YAM_Term
REM Update prefs and close prefs file
TRAP UPDATE : TRAP CLOSE
REM Shut down timer
IF TimerError = 0 : IOCLOSE(TimerHandle) : ENDIF
ENDP REM YAM_Term
PROC YAM_Loop
REM Main program loop (event handler)
LOCAL keycode%, keymod%, t%
REM Asynchronous GETEVENT setup
IOA(-2, 14, SystemStatus, keycode%, #0)
WHILE 1
REM Wait for an event
IOWAIT
IF TimerStatus <> NoEvent
REM Timer event will only occur when GameStatus = GamePlay
TimerUpdate : TimerStart
ELSEIF SystemStatus <> NoEvent
REM Key or system event
IF SystemStatus < 0
REM Failure (should never happen)
RAISE SystemStatus
ELSEIF keycode% = SysForeground
REM Program sent to foreground, reinstall timer
IF GameStatus = GamePlay : TimerStart : ENDIF
ELSEIF keycode% = SysBackground
REM Program sent to background, remove timer
TimerStop
ELSEIF keycode% = SysMessage
REM Shell message (open/create/exit)
IF LEFT$(GETCMD$, 1) = "X"
REM The shell wants us to exit
Term
ENDIF
ELSEIF keycode% = MenuKey
REM Menukey pressed, display menu
LOCK ON : Disp_OpenPauseWin
mINIT
mCARD TNew, MNew, HNew, MBeginner, HBeginner, MAdvanced, HAdvanced, MExpert, HExpert, MCustom, HCustom
IF GameStatus = GamePaused : mCARD TGame, MResume, HResume, MHiscore, HHiscore
ELSE : mCARD TGame, MPause, HPause, MHiscore, HHiscore : ENDIF
mCARD TSpecial, MPreferences, HPreferences, MPrefSound, HPrefSound, MAbout, HAbout, MHelp, HHelp, MExit, HExit
keycode% = MENU
Disp_ClosePauseWin : LOCK OFF
YAM_Menu(keycode%)
ELSEIF keycode% = HelpKey
REM Helpkey pressed, display help
YAM_Help(HelpMain)
ELSEIF (keymod% AND PsionKey)
REM Psion+keycode% pressed, evaluate
IF keycode% = Enter
REM Inspect group
t% = Fieldtype(MarkX, MarkY)
IF (GameStatus = GamePlay) AND (t% = FieldNumbered)
Game_CheckGroup
ENDIF
ELSEIF keycode% >= FirstCursorKey AND keycode% <= LastCursorKey
REM Cursorkey pressed
Disp_MarkMove(keycode%-NormalKey, 1)
ELSEIF (keycode% AND NormalKey) = Tab
IF (GameStatus = GamePlay)
Game_Cheat
ENDIF
ELSE
IF keymod% AND ShiftKey
keycode% = (keycode% AND NormalKey)-ShiftDifference
ELSE
keycode% = (keycode% AND NormalKey)
ENDIF
YAM_Menu(keycode%)
ENDIF
ELSEIF (GameStatus = GamePlay) OR (GameStatus = GameNew)
IF keycode% >= FirstCursorKey AND keycode% <= LastCursorKey
REM Cursorkey pressed
IF keymod% AND ControlKey
Disp_MarkMove(keycode%-NormalKey, D.CInc%)
ELSE
Disp_MarkMove(keycode%-NormalKey, 1)
ENDIF
ELSEIF (keycode% AND SpecialKey) = 0
REM Normal key pressed
IF keycode% = Enter
REM Return pressed, inspect field
IF GameStatus = GameNew : Game_Init : ENDIF
t% = Fieldtype(MarkX, MarkY)
IF t% = FieldNumbered
Game_CheckGroup
ELSEIF (t% = FieldFree) OR (t% = FieldMined)
#ifdef DEBUG
DebugCount = 0
#endif
LOCK OFF : Game_CheckField(MarkX, MarkY, t%) : LOCK OFF : Disp_MarkShow
ENDIF
ELSEIF keycode% = Space
REM Space pressed, flag/unflag field
IF GameStatus = GamePlay
Game_FlagField
ENDIF
ENDIF
ENDIF
ENDIF
REM Re-instate system/keystroke messages:
IOA(-2, 14, SystemStatus, keycode%, #0)
ENDIF
ENDWH
ENDP REM YAM_Loop
PROC YAM_Menu(keycode%)
REM Execute menufunction
LOCAL k$(1)
k$ = CHR$(keycode%)
IF k$ = KNew
IF GameType = 1 : YAM_Menu(%b)
ELSEIF GameType = 2 : YAM_Menu(%a)
ELSEIF GameType = 3 : YAM_Menu(%e)
ELSEIF GameType = 4
IF AbortGame : NewGame(D.DCX%, D.DCY%, D.DCMines%) : ENDIF
ENDIF
ELSEIF k$ = KBeginner : IF AbortGame : GameType = 1 : NewGame(08, 08, 10) : ENDIF
ELSEIF k$ = KAdvanced : IF AbortGame : GameType = 2 : NewGame(16, 16, 40) : ENDIF
ELSEIF k$ = KExpert : IF AbortGame : GameType = 3 : NewGame(30, 16, 99) : ENDIF
ELSEIF k$ = KCustom : NewCustomGame
ELSEIF k$ = KPause
IF GameStatus = GameOver : GIPRINT "Game over"
ELSEIF GameStatus = GameNew : GIPRINT "Game not started yet"
ELSEIF GameStatus = GamePlay :
TimerStop : GameStatus = GamePaused : Disp_DrawSmiley : Disp_OpenPauseWin
ELSEIF GameStatus = GamePaused :
Disp_ClosePauseWin : GameStatus = GamePlay : Disp_DrawSmiley : TimerStart
ENDIF
ELSEIF k$ = KHiscore : Disp_OpenPauseWin : ShowHiscores : Disp_ClosePauseWin
ELSEIF k$ = KPreferences : Disp_OpenPauseWin : SetPrefs : Disp_ClosePauseWin
ELSEIF k$ = KPrefSound : Disp_OpenPauseWin : SetupSounds : Disp_ClosePauseWin
ELSEIF k$ = KAbout : YAM_Help(HelpAbout)
ELSEIF k$ = KHelp : YAM_Help(HelpMain)
ELSEIF k$ = KExit
IF GameStatus >= GamePlay
IF Util_Query(QueryExit) : RETURN : ENDIF
ENDIF
Term
ENDIF
ENDP REM YAM_Menu
PROC AbortGame
REM Ask if a running game should be stopped
IF GameStatus >= GamePlay
IF Util_Query(QueryNewGame) : RETURN NO : ENDIF
TimerStop
ENDIF
RETURN YES
ENDP REM AbortGame
PROC NewGame(x%, y%, mines%) REM GameNew
REM Initialize game values and draw game
REM Set game values and calculate drawing offset
GameW = x% : GameH = y% : GameMines = mines%
NoFlags = 0 : NoFalseFlags = 0
ScrX = (286-(GameW*FieldW))/2 : ScrY = (160-(GameH*FieldW))/2
REM Initialize minefield
Game_PreInit
REM Draw the gameboard
Disp_DrawBord
REM Initialize timer
TimeMin = 0 : TimeSec = -1 : TimerUpdate
REM Set status to "New game"
GameStatus = GameNew : Disp_DrawSmiley
REM Set marker and draw initial state
Disp_MarkInit
Disp_DrawFlags
ENDP REM NewGame
PROC NewCustomGame
LOCAL dcx&, dcy&, dcmode%, dcmines&, ret%
LOCAL keys%(10)
REM Initialize variables
dcx& = D.DCX% : dcy& = D.DCY%
dcmode% = D.DCMode% : dcmines& = D.DCMines%
IF GameStatus >= GamePlay : TimerStop : ENDIF
REM Setup dialog
Disp_OpenPauseWin : LOCK ON
WHILE 1
dINIT CustomGameTitle
dLONG dcx&, CustomGameWidth, MinW, MaxW
dLONG dcy&, CustomGameHeight, MinH, MaxH
dCHOICE dcmode%, CustomGameMineMode
dLONG dcmines&, CustomGameMines, MinMines, MaxMines
REM Present dialog and set new values if appropriate
ret% = DIALOG
CALL($288E,ADDR(keys%()))
IF (keys%(4) AND 4)=0 : BREAK : ENDIF
YAM_Help(CustomGameHelp)
ENDWH
LOCK OFF : Disp_ClosePauseWin
IF ret%
REM Make shure at least 20% of fields are free
IF INT(dcx&*dcy&*0.85) < dcmines&
dcmines& = INT(dcx&*dcy&*0.85)
GIPRINT MinesAdjusted+NUM$(dcmines&, 3)
ENDIF
GameType = GameCustom
REM Save values for the next time and start a new game
D.DCX% = dcx& : D.DCY% = dcy& : D.DCMode% = dcmode%
IF d.DCMode% = 1 REM Auto
dcmines& = INT(((D.DCX%*D.DCY%)/5.5)+0.5)
ENDIF
IF dcmines& > INT((8*D.DCX%*D.DCY%)/10)
dcmines& = INT((8*D.DCX%*D.DCY%)/10)
GIPRINT MinesAdjusted+NUM$(dcmines&, 3)
ENDIF
D.DCMines% = dcmines&
NewGame(D.DCX%, D.DCY%, D.DCMines%)
ELSE
IF GameStatus >= GamePlay : TimerStart : ENDIF
ENDIF
ENDP REM NewCustomGame
PROC ShowHiscores
LOCAL keys%(10)
LOCK ON
WHILE 1
dINIT HiscoreTitle
dTEXT HiscoreBeginner+ D.HNB$, Util_TimeString(D.HTMB%, D.HTSB%)
dTEXT HiscoreAdvanced+D.HNA$, Util_TimeString(D.HTMA%, D.HTSA%)
dTEXT HiscoreExpert+D.HNE$, Util_TimeString(D.HTME%, D.HTSE%)
DIALOG
CALL($288E,ADDR(keys%()))
IF (keys%(4) AND 4)=0 : BREAK : ENDIF
YAM_Help(HiscoreHelp)
ENDWH
LOCK OFF
ENDP REM ShowHiscores
PROC CheckHiscore
LOCAL name$(15), min%, sec%
IF GameType = GameBeginner
min% = D.HTMB% : sec% = D.HTSB%
ELSEIF GameType = GameAdvanc