home *** CD-ROM | disk | FTP | other *** search
/ The Datafile PD-CD 3 / PDCD_3.iso / pocketbk / games / yam11src / MAIN.OPL < prev    next >
Text File  |  1995-07-27  |  14KB  |  484 lines

  1. REM MODULE Main
  2. REM Copyright (c) 1995 Bermuda Software Publishing
  3. REM Written by Bruno Essmann (bessmann@iiic.ethz.ch)
  4.  
  5. PROC YAM_Init
  6.     REM Asynchronous timer setup
  7.     TimerError = IOOPEN(TimerHandle, "TIM:", -1)
  8.     IF TimerError : ALERT(ERR$(-45), ErrTimer) : Term : ENDIF
  9.     TimerTime = 10 : TimerStatus = -46
  10.     REM Load preferences
  11.     LoadPrefs
  12. ENDP REM YAM_Init
  13.  
  14. PROC YAM_Term
  15.     REM Update prefs and close prefs file
  16.     TRAP UPDATE : TRAP CLOSE
  17.  
  18.     REM Shut down timer
  19.     IF TimerError = 0 : IOCLOSE(TimerHandle) : ENDIF
  20. ENDP REM YAM_Term
  21.  
  22. PROC YAM_Loop
  23.     REM Main program loop (event handler)
  24.     LOCAL keycode%, keymod%, t%
  25.  
  26.     REM Asynchronous GETEVENT setup
  27.     IOA(-2, 14, SystemStatus, keycode%, #0)
  28.  
  29.     WHILE 1
  30.         REM Wait for an event
  31.         IOWAIT
  32.         
  33.         IF TimerStatus <> NoEvent
  34.             REM Timer event will only occur when GameStatus = GamePlay
  35.             TimerUpdate : TimerStart
  36.         
  37.         ELSEIF SystemStatus <> NoEvent
  38.             REM Key or system event
  39.             
  40.             IF SystemStatus < 0
  41.                 REM Failure (should never happen)
  42.                 RAISE SystemStatus
  43.             
  44.             ELSEIF keycode% = SysForeground
  45.                 REM Program sent to foreground, reinstall timer
  46.                 IF GameStatus = GamePlay : TimerStart : ENDIF
  47.             
  48.             ELSEIF keycode% = SysBackground
  49.                 REM Program sent to background, remove timer
  50.                 TimerStop
  51.  
  52.             ELSEIF keycode% = SysMessage
  53.                 REM Shell message (open/create/exit)
  54.                 IF LEFT$(GETCMD$, 1) = "X"
  55.                     REM The shell wants us to exit
  56.                     Term
  57.                 ENDIF
  58.             
  59.             ELSEIF keycode% = MenuKey
  60.                 REM Menukey pressed, display menu
  61.                 LOCK ON : Disp_OpenPauseWin
  62.                 mINIT
  63.                 mCARD TNew, MNew, HNew, MBeginner, HBeginner, MAdvanced, HAdvanced, MExpert, HExpert, MCustom, HCustom
  64.                 IF GameStatus = GamePaused : mCARD TGame, MResume, HResume, MHiscore, HHiscore
  65.                 ELSE : mCARD TGame, MPause, HPause, MHiscore, HHiscore : ENDIF
  66.                 mCARD TSpecial, MPreferences, HPreferences, MPrefSound, HPrefSound, MAbout, HAbout, MHelp, HHelp, MExit, HExit
  67.                 keycode% = MENU
  68.                 Disp_ClosePauseWin : LOCK OFF
  69.                 YAM_Menu(keycode%)
  70.             
  71.             ELSEIF keycode% = HelpKey
  72.                 REM Helpkey pressed, display help
  73.                 YAM_Help(HelpMain)
  74.                 
  75.             ELSEIF (keymod% AND PsionKey)
  76.                 REM Psion+keycode% pressed, evaluate
  77.                 IF keycode% = Enter
  78.                     REM Inspect group
  79.                     t% = Fieldtype(MarkX, MarkY)
  80.                     IF (GameStatus = GamePlay) AND (t% = FieldNumbered)
  81.                         Game_CheckGroup
  82.                     ENDIF
  83.                 ELSEIF keycode% >= FirstCursorKey AND keycode% <= LastCursorKey
  84.                     REM Cursorkey pressed
  85.                     Disp_MarkMove(keycode%-NormalKey, 1)
  86.                 ELSEIF (keycode% AND NormalKey) = Tab
  87.                     IF (GameStatus = GamePlay)
  88.                         Game_Cheat
  89.                     ENDIF
  90.                 ELSE
  91.                     IF keymod% AND ShiftKey
  92.                         keycode% = (keycode% AND NormalKey)-ShiftDifference
  93.                     ELSE
  94.                         keycode% = (keycode% AND NormalKey)
  95.                     ENDIF
  96.                     YAM_Menu(keycode%)
  97.                 ENDIF                
  98.                     
  99.             ELSEIF (GameStatus = GamePlay) OR (GameStatus = GameNew)
  100.                 IF keycode% >= FirstCursorKey AND keycode% <= LastCursorKey
  101.                     REM Cursorkey pressed
  102.                     IF keymod% AND ControlKey
  103.                         Disp_MarkMove(keycode%-NormalKey, D.CInc%)
  104.                     ELSE
  105.                         Disp_MarkMove(keycode%-NormalKey, 1)
  106.                     ENDIF
  107.                 
  108.                 ELSEIF (keycode% AND SpecialKey) = 0
  109.                     REM Normal key pressed
  110.                     IF keycode% = Enter
  111.                         REM Return pressed, inspect field
  112.                         IF GameStatus = GameNew : Game_Init : ENDIF
  113.                         t% = Fieldtype(MarkX, MarkY)
  114.                         IF t% = FieldNumbered
  115.                             Game_CheckGroup
  116.                         ELSEIF (t% = FieldFree) OR (t% = FieldMined)
  117.                             #ifdef DEBUG
  118.                                 DebugCount = 0
  119.                             #endif
  120.                             LOCK OFF : Game_CheckField(MarkX, MarkY, t%) : LOCK OFF : Disp_MarkShow
  121.                         ENDIF
  122.                     ELSEIF keycode% = Space
  123.                         REM Space pressed, flag/unflag field
  124.                         IF GameStatus = GamePlay
  125.                             Game_FlagField
  126.                         ENDIF
  127.                     ENDIF
  128.                 ENDIF
  129.             ENDIF
  130.             
  131.             REM Re-instate system/keystroke messages:
  132.             IOA(-2, 14, SystemStatus, keycode%, #0)
  133.         ENDIF
  134.     ENDWH
  135. ENDP REM YAM_Loop
  136.  
  137. PROC YAM_Menu(keycode%)
  138.     REM Execute menufunction
  139.     LOCAL k$(1)
  140.     k$ = CHR$(keycode%)
  141.     
  142.     IF k$ = KNew
  143.         IF GameType = 1 : YAM_Menu(%b)
  144.         ELSEIF GameType = 2 : YAM_Menu(%a)
  145.         ELSEIF GameType = 3 : YAM_Menu(%e)
  146.         ELSEIF GameType = 4
  147.             IF AbortGame : NewGame(D.DCX%, D.DCY%, D.DCMines%) : ENDIF
  148.         ENDIF
  149.     ELSEIF k$ = KBeginner    : IF AbortGame : GameType = 1 : NewGame(08, 08, 10) : ENDIF
  150.     ELSEIF k$ = KAdvanced    : IF AbortGame : GameType = 2 : NewGame(16, 16, 40) : ENDIF
  151.     ELSEIF k$ = KExpert        : IF AbortGame : GameType = 3 : NewGame(30, 16, 99) : ENDIF
  152.     ELSEIF k$ = KCustom        : NewCustomGame
  153.     ELSEIF k$ = KPause
  154.         IF GameStatus = GameOver : GIPRINT "Game over"
  155.         ELSEIF GameStatus = GameNew : GIPRINT "Game not started yet"
  156.         ELSEIF GameStatus = GamePlay :
  157.             TimerStop : GameStatus = GamePaused : Disp_DrawSmiley : Disp_OpenPauseWin
  158.         ELSEIF GameStatus = GamePaused :
  159.             Disp_ClosePauseWin : GameStatus = GamePlay : Disp_DrawSmiley : TimerStart
  160.         ENDIF
  161.     ELSEIF k$ = KHiscore : Disp_OpenPauseWin : ShowHiscores : Disp_ClosePauseWin
  162.     ELSEIF k$ = KPreferences : Disp_OpenPauseWin : SetPrefs : Disp_ClosePauseWin
  163.     ELSEIF k$ = KPrefSound : Disp_OpenPauseWin : SetupSounds : Disp_ClosePauseWin
  164.     ELSEIF k$ = KAbout : YAM_Help(HelpAbout)
  165.     ELSEIF k$ = KHelp : YAM_Help(HelpMain)
  166.     ELSEIF k$ = KExit
  167.         IF GameStatus >= GamePlay
  168.             IF Util_Query(QueryExit) : RETURN : ENDIF
  169.         ENDIF
  170.         Term
  171.     ENDIF
  172. ENDP REM YAM_Menu
  173.  
  174. PROC AbortGame
  175.     REM Ask if a running game should be stopped
  176.  
  177.     IF GameStatus >= GamePlay
  178.         IF Util_Query(QueryNewGame) : RETURN NO : ENDIF
  179.         TimerStop
  180.     ENDIF
  181.     RETURN YES
  182. ENDP REM AbortGame
  183.  
  184. PROC NewGame(x%, y%, mines%)         REM GameNew
  185.     REM Initialize game values and draw game
  186.  
  187.     REM Set game values and calculate drawing offset
  188.     GameW = x% : GameH = y% : GameMines = mines%
  189.     NoFlags = 0 : NoFalseFlags = 0
  190.     ScrX = (286-(GameW*FieldW))/2 : ScrY = (160-(GameH*FieldW))/2
  191.  
  192.     REM Initialize minefield
  193.     Game_PreInit
  194.  
  195.     REM Draw the gameboard
  196.     Disp_DrawBord
  197.  
  198.     REM Initialize timer
  199.     TimeMin = 0 : TimeSec = -1 : TimerUpdate
  200.  
  201.     REM Set status to "New game"
  202.     GameStatus = GameNew : Disp_DrawSmiley
  203.  
  204.     REM Set marker and draw initial state
  205.     Disp_MarkInit
  206.     Disp_DrawFlags
  207. ENDP REM NewGame
  208.  
  209. PROC NewCustomGame
  210.     LOCAL dcx&, dcy&, dcmode%, dcmines&, ret%
  211.     LOCAL keys%(10)
  212.  
  213.     REM Initialize variables
  214.     dcx& = D.DCX% : dcy& = D.DCY%
  215.     dcmode% = D.DCMode% : dcmines& = D.DCMines%
  216.     
  217.     IF GameStatus >= GamePlay : TimerStop : ENDIF
  218.  
  219.     REM Setup dialog
  220.     Disp_OpenPauseWin : LOCK ON
  221.     WHILE 1
  222.         dINIT CustomGameTitle
  223.         dLONG dcx&, CustomGameWidth, MinW, MaxW
  224.         dLONG dcy&, CustomGameHeight, MinH, MaxH
  225.         dCHOICE dcmode%, CustomGameMineMode
  226.         dLONG dcmines&, CustomGameMines, MinMines, MaxMines
  227.     
  228.         REM Present dialog and set new values if appropriate
  229.         ret% = DIALOG
  230.         CALL($288E,ADDR(keys%()))
  231.         IF (keys%(4) AND 4)=0 : BREAK : ENDIF
  232.         YAM_Help(CustomGameHelp)
  233.     ENDWH
  234.     LOCK OFF : Disp_ClosePauseWin
  235.     IF ret%
  236.         REM Make shure at least 20% of fields are free
  237.         IF INT(dcx&*dcy&*0.85) < dcmines&
  238.             dcmines& = INT(dcx&*dcy&*0.85)
  239.             GIPRINT MinesAdjusted+NUM$(dcmines&, 3)
  240.         ENDIF
  241.         GameType = GameCustom
  242.         REM Save values for the next time and start a new game
  243.         D.DCX% = dcx& : D.DCY% = dcy& : D.DCMode% = dcmode%
  244.         IF d.DCMode% = 1 REM Auto
  245.             dcmines& = INT(((D.DCX%*D.DCY%)/5.5)+0.5)
  246.         ENDIF
  247.         IF dcmines& > INT((8*D.DCX%*D.DCY%)/10)
  248.             dcmines& = INT((8*D.DCX%*D.DCY%)/10)
  249.             GIPRINT MinesAdjusted+NUM$(dcmines&, 3)
  250.         ENDIF
  251.         D.DCMines% = dcmines&
  252.         NewGame(D.DCX%, D.DCY%, D.DCMines%)
  253.     ELSE
  254.         IF GameStatus >= GamePlay : TimerStart : ENDIF
  255.     ENDIF
  256. ENDP REM NewCustomGame
  257.  
  258. PROC ShowHiscores
  259.     LOCAL keys%(10)
  260.     
  261.     LOCK ON
  262.     WHILE 1
  263.         dINIT HiscoreTitle
  264.         dTEXT HiscoreBeginner+ D.HNB$, Util_TimeString(D.HTMB%, D.HTSB%)
  265.         dTEXT HiscoreAdvanced+D.HNA$, Util_TimeString(D.HTMA%, D.HTSA%)
  266.         dTEXT HiscoreExpert+D.HNE$, Util_TimeString(D.HTME%, D.HTSE%)
  267.         DIALOG
  268.         CALL($288E,ADDR(keys%()))
  269.         IF (keys%(4) AND 4)=0 : BREAK : ENDIF
  270.         YAM_Help(HiscoreHelp)
  271.     ENDWH
  272.     LOCK OFF
  273. ENDP REM ShowHiscores
  274.  
  275. PROC CheckHiscore
  276.     LOCAL name$(15), min%, sec%
  277.  
  278.     IF GameType = GameBeginner
  279.         min% = D.HTMB% : sec% = D.HTSB%
  280.     ELSEIF GameType = GameAdvanc