home *** CD-ROM | disk | FTP | other *** search
/ RISCWORLD 7 / RISCWORLD_VOL7.iso / Software / Issue4 / IYONIX / MANICMINER / SOURCE.ZIP / manicminer-1.6.3 / c / game < prev    next >
Encoding:
Text File  |  2000-12-10  |  16.2 KB  |  817 lines

  1. #include "manic.h"
  2. #include "gfxlibs/keyboard.h"
  3. #include "gfxdata/gfxdata.h"
  4. #include "miscdata/misc.h"
  5. #include "functions.h"
  6. #include "sndlibs/snd.h"
  7. #include "gfxlibs/gfx.h"
  8. #include <string.h>
  9. #ifndef __riscos
  10. # include <unistd.h>
  11. #endif
  12.  
  13. static void ChangeLevelCheat (void);
  14. static void CheckCheat (void);
  15. static void CheckMusic (void);
  16. static void CheckPause (void);
  17. static void DoBoot (void);
  18. static void DoCheat (void);
  19. static void DoOverText (void);
  20. static void DoText (void);
  21. static void DrawOver (int xpos, int ypos, BYTE block);
  22. static void DrawWilly2 (void);
  23. static void ExtraLife (void);
  24. static void FadeDownText (void);
  25. static void FadeUpText (void);
  26. static void GameOver (void);
  27. static void GameSetup (void);
  28. static void GameText1 (void);
  29. static void Killed (void);
  30. static void LastBit (void);
  31. static void LastClear (void);
  32. static void LastExit (void);
  33. static void LastFade (void);
  34. static void LastFirst (void);
  35. static void LevelDone (void);
  36. static void OverSetup (void);
  37. static void PauseText (void);
  38. static void PlayGame (void);
  39. static void RotPal2 (void);
  40.  
  41. /* ////////////////////////////////////////////////////////////
  42. //      Game Stuff
  43. //////////////////////////////////////////////////////////// */
  44. void
  45. DoGame (void)
  46. {
  47.   switch (GAMEm) {
  48.   case 0:            /* SETUP */
  49.     GameSetup ();
  50.     break;
  51.   case 1:            /* PLAYING */
  52.     PlayGame ();
  53.     break;
  54.   case 2:            /* DEATH */
  55.     Killed ();
  56.     break;
  57.   case 3:            /* NEW LEVEL */
  58.     LevelDone ();
  59.     break;
  60.   case 4:            /* GAME OVER */
  61.     GameOver ();
  62.     break;
  63.   case 5:            /* LAST EXIT */
  64.     LastExit ();
  65.     break;
  66.   }
  67.  
  68.   if (mm_keyb_pressed (KEYB_F11) && GAMEm != 5) {
  69.     GAMEm = 5;
  70.     LASTm = 0;
  71.     LASTc = 0;
  72.     LASTp = 0;
  73.     TEXT.m = 0;
  74.     TEXT.ink = 7;
  75.     TEXT.fade = 0;
  76.   }
  77. }
  78.  
  79. /* ////////////////////////////////////////////////////////////
  80. //      Game Fisrt Setup
  81. //////////////////////////////////////////////////////////// */
  82. static void
  83. GameSetup (void)
  84. {
  85.   memset (PALwhite, 63, sizeof (PALwhite));
  86.   memset (PALblack,  0, sizeof (PALblack));
  87.   memcpy (PALfade, PALmain, sizeof (PALfade));
  88.   memcpy (PALover, PALmain, sizeof (PALover));
  89.  
  90.   LEVEL = 0;
  91.   SCORE = 0;
  92.   LIVES = 3;
  93.  
  94.   LIVESf = 0;
  95.   LIVESp = 0;
  96.  
  97.   EXTRA = 10000;
  98.   EXTRAdelta = 10000;
  99.   EXTRAm = 0;
  100.   EXTRAc = 0;
  101.  
  102.   CopyLevelInfo ();
  103.   DrawLevel ();
  104.   mm_gfx_palset (PALmain);
  105.   mm_gfx_flush ();
  106.  
  107.   GAMEm = 1;
  108.   OVERm = 0;
  109.  
  110.   CHEATp = 0;
  111.   CHEATh = 0;
  112.  
  113.   MUSICh = 0;
  114.  
  115.   PAUSE = 0;
  116.  
  117.   StartGameMusic ();
  118. }
  119.  
  120. /* ////////////////////////////////////////////////////////////
  121. //      Draw Level
  122. //////////////////////////////////////////////////////////// */
  123. void
  124. DrawLevel (void)
  125. {
  126.   DrawCurrentLevel ();
  127.   DrawConv ();
  128.   DrawKeys ();
  129.   DrawSwitches ();
  130.   DrawExit ();
  131.   DrawTPlate ();
  132.   DrawAirBG ();
  133.   DoWilly ();
  134.   DoHRobo ();
  135.   DoVRobo ();
  136.   DoSpecialRobo ();
  137.   DrawExit ();
  138.   DrawAir ();
  139.  
  140.   mm_gfx_fillbox (0, 144, 256, 48, PAPER);
  141.  
  142.   PrintScore ();
  143.   PrintHighScore ();
  144.   DrawLives ();
  145. }
  146.  
  147. /* ////////////////////////////////////////////////////////////
  148. //      Play Game
  149. //////////////////////////////////////////////////////////// */
  150. static void
  151. PlayGame (void)
  152. {
  153.   CheckPause ();
  154.   CheckMusic ();
  155.  
  156.   if (PAUSE == 0) {
  157.     int waitvrcount;
  158.     for (waitvrcount = 0; waitvrcount < SPEED; waitvrcount++) {
  159.       mm_gfx_waitvr ();
  160.       mm_snd_update ();
  161.     }
  162.     mm_gfx_flush ();
  163.  
  164.     ExtraLife ();
  165.  
  166.     RemoveSun ();
  167.     RemoveWilly ();
  168.     RemoveSPG ();
  169.     RemoveSky ();
  170.     RemoveKong ();
  171.     RemoveVRobo ();
  172.     RemoveHRobo ();
  173.     RemoveEugene ();
  174.  
  175.     DrawKeys ();
  176.     DrawConv ();
  177.  
  178.     DrawSwitches ();
  179.     DoCrumb ();
  180.  
  181.     DoHRobo ();
  182.     DoVRobo ();
  183.     DoSpecialRobo ();
  184.  
  185.     DoWilly ();
  186.  
  187.     DrawExit ();
  188.     DrawAir ();
  189.     DoSun ();
  190.  
  191.     DrawLives ();
  192.  
  193.     PrintScore ();
  194.   }
  195.   else
  196. #ifdef __riscos
  197.   {
  198.     mm_gfx_waitvr ();
  199.     mm_gfx_waitvr ();
  200.     mm_gfx_waitvr ();
  201.     mm_gfx_waitvr ();
  202.     mm_gfx_waitvr ();
  203.   }
  204. #else
  205.     usleep (100000);
  206. #endif
  207.  
  208.   if (mm_keyb_pressed (KEYB_ESC)) {
  209.     MODE = 0;
  210.     TITLEm = 0;
  211.     GAMEm = 0;
  212.     mm_snd_stopmod ();
  213.   }
  214.  
  215.   if (CHEAT == 1)
  216.     DoCheat ();
  217.   else
  218.     CheckCheat ();
  219.  
  220.   if ((mm_keyb_pressed (KEYB_F1)) && (mm_keyb_pressed (KEYB_CTRL)))
  221.     SPEED = 0;
  222.   if ((mm_keyb_pressed (KEYB_F2)) && (mm_keyb_pressed (KEYB_CTRL)))
  223.     SPEED = 1;
  224.   if ((mm_keyb_pressed (KEYB_F3)) && (mm_keyb_pressed (KEYB_CTRL)))
  225.     SPEED = 2;
  226.   if ((mm_keyb_pressed (KEYB_F4)) && (mm_keyb_pressed (KEYB_CTRL)))
  227.     SPEED = 3;
  228.   if ((mm_keyb_pressed (KEYB_F5)) && (mm_keyb_pressed (KEYB_CTRL)))
  229.     SPEED = 4;
  230. }
  231.  
  232. /* ////////////////////////////////////////////////////////////
  233. //      Willy Killed
  234. //////////////////////////////////////////////////////////// */
  235. static void
  236. Killed (void)
  237. {
  238.   int i;
  239.  
  240.   if (DEATHm == 0) {
  241.     if (++DEATHc == 8) {
  242.       DEATHm = 1;
  243.       if (--LIVES == 0)
  244.     GAMEm = 4;
  245.     }
  246.     else {
  247.       for (i = 0; i < 8; i++)
  248.     PaletteFade (PALblack, PALfade);
  249.       mm_gfx_palset (PALfade);
  250.     }
  251.   }
  252.   else {
  253.     CopyLevelInfo ();
  254.     DrawLevel ();
  255.     mm_gfx_palset (PALmain);
  256.     mm_gfx_flush ();
  257.     GAMEm = 1;
  258.     StartGameMusic ();
  259.   }
  260. }
  261.  
  262. /* ////////////////////////////////////////////////////////////
  263. //      Level Done
  264. //////////////////////////////////////////////////////////// */
  265. static void
  266. LevelDone (void)
  267. {
  268.   mm_snd_stopmod ();
  269.   cEXIT.m = 0;
  270.  
  271.   LevelDoneExtra ();
  272.   mm_gfx_flush ();
  273.  
  274.   FadeToBlue ();
  275.  
  276.   do {
  277.     mm_gfx_flush ();
  278.     mm_snd_jump (6000 + (cAIR * 100));
  279.     mm_snd_jump2 (4000 + (cAIR * 100));
  280.     mm_snd_update ();
  281.     DrawAir ();
  282.     SCORE += 9;
  283.     PrintScore ();
  284.   }
  285.   while (--cAIR > 32);
  286.  
  287.   LEVEL++;
  288.   if (LEVEL == 20 || LEVEL == 40)
  289.     LEVEL -= 20;
  290.  
  291.   CopyLevelInfo ();
  292.   DrawLevel ();
  293.   mm_gfx_flush ();
  294.  
  295.   GAMEm = 1;
  296.   StartGameMusic ();
  297. }
  298.  
  299. /* ////////////////////////////////////////////////////////////
  300. //      Game Over
  301. //////////////////////////////////////////////////////////// */
  302. static void
  303. GameOver (void)
  304. {
  305.   switch (OVERm) {
  306.   case 0:
  307.     OverSetup ();
  308.     break;
  309.   case 1:
  310.     DoBoot ();
  311.     break;
  312.   case 2:
  313.     DoOverText ();
  314.     break;
  315.   }
  316. }
  317.  
  318. /* ////////////////////////////////////////////////////////////
  319. //      Draw Game Over Screen
  320. //////////////////////////////////////////////////////////// */
  321. static void
  322. OverSetup (void)
  323. {
  324.   int i;
  325.  
  326.   BOOTy = 0;
  327.  
  328.   for (i = 1; i >= 0; --i) {
  329.     mm_gfx_cls (0);
  330.  
  331.     PAPER = 254;
  332.     mm_gfx_fillbox (0, 0, 256, 128, PAPER);
  333.  
  334.     DrawWilly2 ();
  335.     DrawOver (120, 112, 0);
  336.     DrawOver (120, BOOTy, 1);
  337.     DrawTPlate ();
  338.     DrawAirBG ();
  339.     PrintScore ();
  340.     PrintHighScore ();
  341.     if (i)
  342.       mm_gfx_flush ();
  343.   }
  344.  
  345.   OVERm = 1;
  346.   OVERp = 0;
  347.  
  348.   PAPER = 0;
  349. }
  350.  
  351. /* ////////////////////////////////////////////////////////////
  352. //      Draw GAME OVER Gfx
  353. //////////////////////////////////////////////////////////// */
  354. static void
  355. DrawOver (int xpos, int ypos, BYTE block)
  356. {
  357.   Plot16ink (xpos, ypos, GFXover + 256 * block, 0, 254);
  358. }
  359.  
  360. /* ////////////////////////////////////////////////////////////
  361. //      Do Boot
  362. //////////////////////////////////////////////////////////// */
  363. static void
  364. DoBoot (void)
  365. {
  366.   DrawOver (120, BOOTy, 1);
  367.   mm_snd_jump (4000 + (BOOTy * BOOTy));
  368.  
  369.   if (++BOOTy > 96) {
  370.     OVERm = 2;
  371.     OVERink = 1;
  372.     memset (PALover + 720, 0, 48);
  373.   }
  374.   RotPal ();
  375.   mm_gfx_palset (PALover);
  376.   mm_gfx_flush ();
  377.  
  378.   if (BOOTy > 96)
  379.     DrawOver (120, 96, 1);
  380. }
  381.  
  382. /* ////////////////////////////////////////////////////////////
  383. //      Draw Willy
  384. //////////////////////////////////////////////////////////// */
  385. static void
  386. DrawWilly2 (void)
  387. {
  388.   Plot16ink (120, 96, GFXwilly + 512, 0, 254);
  389. }
  390.  
  391. /* ////////////////////////////////////////////////////////////
  392. //      Do Over Text
  393. //////////////////////////////////////////////////////////// */
  394. static void
  395. DoOverText (void)
  396. {
  397.   GameText1 ();
  398.   mm_gfx_flush ();
  399.  
  400.   if (++OVERp > 200) {
  401.     MODE = 0;
  402.     TITLEm = 0;
  403.     DEMOm = 0;
  404.     GAMEm = 0;
  405.     OVERm = 0;
  406.     if (SCORE > HISCORE)
  407.       HISCORE = SCORE;
  408.   }
  409. }
  410.  
  411. /* ////////////////////////////////////////////////////////////
  412. //      Game Over Text
  413. //////////////////////////////////////////////////////////// */
  414. static void
  415. GameText1 (void)
  416. {
  417.   INK = OVERink;
  418.   FontPrint (10, 6, "G");
  419.   INK = (OVERink + 1) & 7;
  420.   FontPrint (11, 6, "a");
  421.   INK = (OVERink + 2) & 7;
  422.   FontPrint (12, 6, "m");
  423.   INK = (OVERink + 3) & 7;
  424.   FontPrint (13, 6, "e");
  425.   INK = (OVERink + 4) & 7;
  426.   FontPrint (18, 6, "O");
  427.   INK = (OVERink + 5) & 7;
  428.   FontPrint (19, 6, "v");
  429.   INK = (OVERink + 6) & 7;
  430.   FontPrint (20, 6, "e");
  431.   INK = OVERink = (OVERink + 7) & 7;
  432.   FontPrint (21, 6, "r");
  433. }
  434.  
  435. /* ////////////////////////////////////////////////////////////
  436. //      Do Extra Life Gained
  437. //////////////////////////////////////////////////////////// */
  438. static void
  439. ExtraLife (void)
  440. {
  441.   switch (EXTRAm) {
  442.   case 1:
  443.     RotPal2 ();
  444.     mm_gfx_palset (PALfade);
  445.     if (++EXTRAc > 7)
  446.       EXTRAm = 2;
  447.     break;
  448.   case 2:
  449.     memcpy (PALfade, PALmain, sizeof (PALfade));
  450.     EXTRAc = 0;
  451.     EXTRAm = 0;
  452.     mm_gfx_palset (PALmain);
  453.   }
  454. }
  455.  
  456. /* ////////////////////////////////////////////////////////////
  457. //      Rotate end of palette
  458. //////////////////////////////////////////////////////////// */
  459. static void
  460. RotPal2 (void)
  461. {
  462.   if (EXTRAc < 7) {
  463.     int i;
  464.     for (i = 765; i >= 0; i -= 3) {
  465.       /*  NOT (blue*2 + green*9 + red*5) / 16 */
  466.       int grey = PALmain[i] * 2 + PALmain[i + 1] * 9 + PALmain[i + 2] * 5;
  467.       grey = ~(grey / 16);
  468.       PALfade[i + 0] = (EXTRAc & 2) ? 0 : (BYTE) grey;
  469.       PALfade[i + 1] = (EXTRAc & 4) ? 0 : (BYTE) grey;
  470.       PALfade[i + 2] = (EXTRAc & 1) ? 0 : (BYTE) grey;
  471.     }
  472.   }
  473.   else
  474.     memset (PALfade, 0, sizeof (PALfade));
  475. }
  476.  
  477. /* ////////////////////////////////////////////////////////////
  478. //      Do Cheat Stuff
  479. //////////////////////////////////////////////////////////// */
  480. static void
  481. DoCheat (void)
  482. {
  483.   BYTE lev;
  484.  
  485.   lev = 0;
  486.   if (mm_keyb_pressed (KEYB_1))
  487.     lev |= 1;
  488.   if (mm_keyb_pressed (KEYB_2))
  489.     lev |= 2;
  490.   if (mm_keyb_pressed (KEYB_3))
  491.     lev |= 4;
  492.   if (mm_keyb_pressed (KEYB_4))
  493.     lev |= 8;
  494.   if (mm_keyb_pressed (KEYB_5))
  495.     lev |= 16;
  496.   if (lev > 19)
  497.     return;
  498.  
  499.   if (mm_keyb_pressed (KEYB_6)) {
  500.     mm_snd_stopmod ();
  501.     LEVEL = lev;
  502.     ChangeLevelCheat ();
  503.   }
  504.  
  505.   if (mm_keyb_pressed (KEYB_7) &&
  506.       mm_keyb_pressed (KEYB_8) && mm_keyb_pressed (KEYB_0))
  507.     LIVES = 12;
  508. }
  509.  
  510. /* ////////////////////////////////////////////////////////////
  511. //      Change Level for Cheat
  512. //////////////////////////////////////////////////////////// */
  513. static void
  514. ChangeLevelCheat (void)
  515. {
  516.   CopyLevelInfo ();
  517.   DrawLevel ();
  518.   mm_gfx_flush ();
  519.   StartGameMusic ();
  520. }
  521.  
  522. /* ////////////////////////////////////////////////////////////
  523. //      Check for Cheat
  524. //////////////////////////////////////////////////////////// */
  525. static void
  526. CheckCheat (void)
  527. {
  528.   if (CHEATh == 1) {
  529.     if (!mm_keyb_pressed (CHEATkey[CHEATp])) {
  530.       if (++CHEATp == 6)
  531.     CHEAT = 1;
  532.       CHEATh = 0;
  533.     }
  534.   }
  535.  
  536.   if (mm_keyb_pressed (CHEATkey[CHEATp]))
  537.     CHEATh = 1;
  538.   else if (mm_keyb_pressed (KEYB_ANYKEY))
  539.     CHEATp = 0;
  540. }
  541.  
  542. /* ////////////////////////////////////////////////////////////
  543. //      Check for MUSIC
  544. //////////////////////////////////////////////////////////// */
  545. static void
  546. CheckMusic (void)
  547. {
  548.   if (mm_keyb_pressed (KEYB_H) ||
  549.       mm_keyb_pressed (KEYB_J) ||
  550.       mm_keyb_pressed (KEYB_K) ||
  551.       mm_keyb_pressed (KEYB_L)) {
  552.     MUSICon ^= 1;
  553.     VOL = MUSICon ? 64 : 0;
  554.     if (MUSICon)
  555.       mm_snd_unmute ();
  556.     else
  557.       mm_snd_mute ();
  558.   }
  559.  
  560. }
  561.  
  562. /* ////////////////////////////////////////////////////////////
  563. //      Check for Pause
  564. //////////////////////////////////////////////////////////// */
  565. static void
  566. CheckPause (void)
  567. {
  568.   if (PAUSE == 0) {
  569.     if (mm_keyb_pressed (KEYB_A) ||
  570.     mm_keyb_pressed (KEYB_S) ||
  571.     mm_keyb_pressed (KEYB_D) ||
  572.     mm_keyb_pressed (KEYB_F) ||
  573.     mm_keyb_pressed (KEYB_G)) {
  574.       PAUSE = 1;
  575.       if (MUSICon && PAUSEtype)
  576.         mm_snd_mute ();
  577.     }
  578.   }
  579.   else {
  580.     if ((!mm_keyb_pressed (KEYB_A) &&
  581.      !mm_keyb_pressed (KEYB_S) &&
  582.      !mm_keyb_pressed (KEYB_D) &&
  583.      !mm_keyb_pressed (KEYB_F) &&
  584.      !mm_keyb_pressed (KEYB_G)) && mm_keyb_pressed (KEYB_ANYKEY)) {
  585.       PAUSE = 0;
  586.       if (MUSICon && PAUSEtype)
  587.         mm_snd_unmute ();
  588.     }
  589.   }
  590. }
  591.  
  592. /* ////////////////////////////////////////////////////////////
  593. //      Last Exit
  594. //////////////////////////////////////////////////////////// */
  595. static void
  596. LastExit (void)
  597. {
  598.   switch (LASTm) {
  599.   case 0:
  600.     LastFirst ();
  601.     break;
  602.   case 1:
  603.     LastFade ();
  604.     break;
  605.   case 2:
  606.     LastClear ();
  607.     break;
  608.   case 3:
  609.     LastBit ();
  610.     break;
  611.   }
  612. }
  613.  
  614. /* ////////////////////////////////////////////////////////////
  615. //      Last Air
  616. //////////////////////////////////////////////////////////// */
  617. static void
  618. LastFirst (void)
  619. {
  620.   mm_snd_stopmod ();
  621.   LevelDoneExtra ();
  622.   mm_gfx_flush ();
  623.  
  624.   do {
  625.     mm_gfx_flush ();
  626.     mm_snd_jump (6000 + (cAIR * 100));
  627.     mm_snd_jump2 (4000 + (cAIR * 100));
  628.     mm_snd_update ();
  629.     DrawAir ();
  630.     SCORE += 9;
  631.     PrintScore ();
  632.   }
  633.   while (--cAIR > 32);
  634.  
  635.   if (SCORE > HISCORE)
  636.     HISCORE = SCORE;
  637.  
  638.   mm_snd_unmute ();
  639.   mm_snd_playmod (0x20);
  640.   LASTm = 1;
  641.   LASTp = 0;
  642. }
  643.  
  644. /* ////////////////////////////////////////////////////////////
  645. //      Fade Down Game
  646. //////////////////////////////////////////////////////////// */
  647. static void
  648. LastFade (void)
  649. {
  650.   LASTp++;
  651.   if (LASTp == 4) {
  652.     LASTp = 0;
  653.     PaletteFade (PALblack, PALfade);
  654.     if (++LASTc == 4) {
  655.       LASTc = 0;
  656.       SUN.y++;
  657.       if (--SUN.h == 0)
  658.     LASTm = 2;
  659.     }
  660.     mm_gfx_flush ();
  661.     mm_gfx_palset (PALfade);
  662.     RemoveSun ();
  663.     DoSun ();
  664.   }
  665.   else {
  666.     mm_gfx_flush ();
  667.     RemoveSun ();
  668.     DoSun ();
  669.     DrawAir ();
  670.     PrintScore ();
  671.   }
  672. }
  673.  
  674. /* ////////////////////////////////////////////////////////////
  675. //  Text width & display
  676. //////////////////////////////////////////////////////////// */
  677. static BYTE TEXTxpos[TEXTLIMIT];
  678. static BYTE TEXTlines;
  679.  
  680. static void
  681. WidthText (void)
  682. {
  683.   int i = 0, j;
  684.  
  685.   while (i < TEXTLIMIT && EndText[TEXT.point].text[i]) {
  686.     j = strlen (EndText[TEXT.point].text[i]);
  687.     TEXTxpos[i] = 16 - j / 2 + 127 * (j & 1);    /* round down (left) */
  688.     i++;
  689.   }
  690.   TEXTlines = i;
  691. }
  692.  
  693. static void
  694. ShowText (void)
  695. {
  696.   int i, l = 11 - TEXTlines / 2 + 127 * (TEXTlines & 1);
  697.   for (i = 0; i < TEXTlines; ++i)
  698.     FontPrint (TEXTxpos[i], l + i, EndText[TEXT.point].text[i]);
  699. }
  700.  
  701. /* ////////////////////////////////////////////////////////////
  702. //      Clear Last Screen
  703. //////////////////////////////////////////////////////////// */
  704. static void
  705. LastClear (void)
  706. {
  707.   mm_gfx_cls (0);
  708.   mm_gfx_flush ();
  709.   if (++LASTc == 2) {
  710.     LASTm = 3;
  711.     mm_gfx_palset (PALmain);
  712.     LASTc = 0;
  713.     LASTp = 0;
  714.  
  715.     TEXT.m = 0;
  716.     TEXT.pause = 0;
  717.     TEXT.point = 0;
  718.     TEXT.ink = 0;
  719.     TEXT.fade = 0;
  720.     WidthText ();
  721.   }
  722. }
  723.  
  724. /* ////////////////////////////////////////////////////////////
  725. //      Do Last Bit
  726. //////////////////////////////////////////////////////////// */
  727. static void
  728. LastBit (void)
  729. {
  730. /*   if (mm_snd_getmodpos () == 0x11) { */
  731.   if (mm_keyb_pressed (KEYB_SPACE)) {
  732.     MODE = 0;
  733.     TITLEm = 0;
  734.     GAMEm = 0;
  735.     mm_snd_stopmod ();
  736.   }
  737.  
  738.   if (++LASTp == 6) {
  739.     LASTp = 0;
  740.     LASTc = (LASTc + 1) & 15;
  741.   }
  742.  
  743.   PlotXY (176, 0, GFXhouse, 32, 32);
  744.   Plot16 (184, 8, GFXwin + 256 * WINDOW[LASTc]);
  745.   DoText ();
  746.   mm_gfx_flush ();
  747. }
  748.  
  749. /* ////////////////////////////////////////////////////////////
  750. //      Do End Text
  751. //////////////////////////////////////////////////////////// */
  752. static void
  753. DoText (void)
  754. {
  755.   switch (TEXT.m) {
  756.   case 0:
  757.     FadeUpText ();
  758.     break;
  759.   case 1:
  760.     PauseText ();
  761.     break;
  762.   case 2:
  763.     FadeDownText ();
  764.     break;
  765.   }
  766. }
  767.  
  768. /* ////////////////////////////////////////////////////////////
  769. //      Fade Up Text
  770. //////////////////////////////////////////////////////////// */
  771. static void
  772. FadeUpText (void)
  773. {
  774.   if (++TEXT.ink >= 63) {
  775.     TEXT.pause = 0;
  776.     TEXT.m = 1;
  777.   }
  778.   INK = 127 - (TEXT.ink >> 2);
  779.   ShowText ();
  780. }
  781.  
  782. /* ////////////////////////////////////////////////////////////
  783. //      Fade Down Text
  784. //////////////////////////////////////////////////////////// */
  785. static void
  786. FadeDownText (void)
  787. {
  788.   if (--TEXT.ink == 0) {
  789.     TEXT.m = 0;
  790.     if (EndText[++TEXT.point].delay > 0)
  791.       WidthText ();
  792.     else
  793.     {
  794.       MODE = 0;
  795.       TITLEm = 0;
  796.       GAMEm = 0;
  797.       mm_snd_stopmod ();
  798.     }
  799.   }
  800.   INK = 127 - (TEXT.ink >> 2);
  801.   ShowText ();
  802. }
  803.  
  804. /* ////////////////////////////////////////////////////////////
  805. //      Text Pause
  806. //////////////////////////////////////////////////////////// */
  807. static void
  808. PauseText (void)
  809. {
  810.   ShowText ();
  811.  
  812.   if (++TEXT.pause == EndText[TEXT.point].delay) {
  813.     TEXT.pause = 0;
  814.     TEXT.m = 2;
  815.   }
  816. }
  817.