home *** CD-ROM | disk | FTP | other *** search
- #include "manic.h"
- #include "gfxlibs/keyboard.h"
- #include "gfxdata/gfxdata.h"
- #include "miscdata/misc.h"
- #include "functions.h"
- #include "sndlibs/snd.h"
- #include "gfxlibs/gfx.h"
- #include <string.h>
- #ifndef __riscos
- # include <unistd.h>
- #endif
-
- static void ChangeLevelCheat (void);
- static void CheckCheat (void);
- static void CheckMusic (void);
- static void CheckPause (void);
- static void DoBoot (void);
- static void DoCheat (void);
- static void DoOverText (void);
- static void DoText (void);
- static void DrawOver (int xpos, int ypos, BYTE block);
- static void DrawWilly2 (void);
- static void ExtraLife (void);
- static void FadeDownText (void);
- static void FadeUpText (void);
- static void GameOver (void);
- static void GameSetup (void);
- static void GameText1 (void);
- static void Killed (void);
- static void LastBit (void);
- static void LastClear (void);
- static void LastExit (void);
- static void LastFade (void);
- static void LastFirst (void);
- static void LevelDone (void);
- static void OverSetup (void);
- static void PauseText (void);
- static void PlayGame (void);
- static void RotPal2 (void);
-
- /* ////////////////////////////////////////////////////////////
- // Game Stuff
- //////////////////////////////////////////////////////////// */
- void
- DoGame (void)
- {
- switch (GAMEm) {
- case 0: /* SETUP */
- GameSetup ();
- break;
- case 1: /* PLAYING */
- PlayGame ();
- break;
- case 2: /* DEATH */
- Killed ();
- break;
- case 3: /* NEW LEVEL */
- LevelDone ();
- break;
- case 4: /* GAME OVER */
- GameOver ();
- break;
- case 5: /* LAST EXIT */
- LastExit ();
- break;
- }
-
- if (mm_keyb_pressed (KEYB_F11) && GAMEm != 5) {
- GAMEm = 5;
- LASTm = 0;
- LASTc = 0;
- LASTp = 0;
- TEXT.m = 0;
- TEXT.ink = 7;
- TEXT.fade = 0;
- }
- }
-
- /* ////////////////////////////////////////////////////////////
- // Game Fisrt Setup
- //////////////////////////////////////////////////////////// */
- static void
- GameSetup (void)
- {
- memset (PALwhite, 63, sizeof (PALwhite));
- memset (PALblack, 0, sizeof (PALblack));
- memcpy (PALfade, PALmain, sizeof (PALfade));
- memcpy (PALover, PALmain, sizeof (PALover));
-
- LEVEL = 0;
- SCORE = 0;
- LIVES = 3;
-
- LIVESf = 0;
- LIVESp = 0;
-
- EXTRA = 10000;
- EXTRAdelta = 10000;
- EXTRAm = 0;
- EXTRAc = 0;
-
- CopyLevelInfo ();
- DrawLevel ();
- mm_gfx_palset (PALmain);
- mm_gfx_flush ();
-
- GAMEm = 1;
- OVERm = 0;
-
- CHEATp = 0;
- CHEATh = 0;
-
- MUSICh = 0;
-
- PAUSE = 0;
-
- StartGameMusic ();
- }
-
- /* ////////////////////////////////////////////////////////////
- // Draw Level
- //////////////////////////////////////////////////////////// */
- void
- DrawLevel (void)
- {
- DrawCurrentLevel ();
- DrawConv ();
- DrawKeys ();
- DrawSwitches ();
- DrawExit ();
- DrawTPlate ();
- DrawAirBG ();
- DoWilly ();
- DoHRobo ();
- DoVRobo ();
- DoSpecialRobo ();
- DrawExit ();
- DrawAir ();
-
- mm_gfx_fillbox (0, 144, 256, 48, PAPER);
-
- PrintScore ();
- PrintHighScore ();
- DrawLives ();
- }
-
- /* ////////////////////////////////////////////////////////////
- // Play Game
- //////////////////////////////////////////////////////////// */
- static void
- PlayGame (void)
- {
- CheckPause ();
- CheckMusic ();
-
- if (PAUSE == 0) {
- int waitvrcount;
- for (waitvrcount = 0; waitvrcount < SPEED; waitvrcount++) {
- mm_gfx_waitvr ();
- mm_snd_update ();
- }
- mm_gfx_flush ();
-
- ExtraLife ();
-
- RemoveSun ();
- RemoveWilly ();
- RemoveSPG ();
- RemoveSky ();
- RemoveKong ();
- RemoveVRobo ();
- RemoveHRobo ();
- RemoveEugene ();
-
- DrawKeys ();
- DrawConv ();
-
- DrawSwitches ();
- DoCrumb ();
-
- DoHRobo ();
- DoVRobo ();
- DoSpecialRobo ();
-
- DoWilly ();
-
- DrawExit ();
- DrawAir ();
- DoSun ();
-
- DrawLives ();
-
- PrintScore ();
- }
- else
- #ifdef __riscos
- {
- mm_gfx_waitvr ();
- mm_gfx_waitvr ();
- mm_gfx_waitvr ();
- mm_gfx_waitvr ();
- mm_gfx_waitvr ();
- }
- #else
- usleep (100000);
- #endif
-
- if (mm_keyb_pressed (KEYB_ESC)) {
- MODE = 0;
- TITLEm = 0;
- GAMEm = 0;
- mm_snd_stopmod ();
- }
-
- if (CHEAT == 1)
- DoCheat ();
- else
- CheckCheat ();
-
- if ((mm_keyb_pressed (KEYB_F1)) && (mm_keyb_pressed (KEYB_CTRL)))
- SPEED = 0;
- if ((mm_keyb_pressed (KEYB_F2)) && (mm_keyb_pressed (KEYB_CTRL)))
- SPEED = 1;
- if ((mm_keyb_pressed (KEYB_F3)) && (mm_keyb_pressed (KEYB_CTRL)))
- SPEED = 2;
- if ((mm_keyb_pressed (KEYB_F4)) && (mm_keyb_pressed (KEYB_CTRL)))
- SPEED = 3;
- if ((mm_keyb_pressed (KEYB_F5)) && (mm_keyb_pressed (KEYB_CTRL)))
- SPEED = 4;
- }
-
- /* ////////////////////////////////////////////////////////////
- // Willy Killed
- //////////////////////////////////////////////////////////// */
- static void
- Killed (void)
- {
- int i;
-
- if (DEATHm == 0) {
- if (++DEATHc == 8) {
- DEATHm = 1;
- if (--LIVES == 0)
- GAMEm = 4;
- }
- else {
- for (i = 0; i < 8; i++)
- PaletteFade (PALblack, PALfade);
- mm_gfx_palset (PALfade);
- }
- }
- else {
- CopyLevelInfo ();
- DrawLevel ();
- mm_gfx_palset (PALmain);
- mm_gfx_flush ();
- GAMEm = 1;
- StartGameMusic ();
- }
- }
-
- /* ////////////////////////////////////////////////////////////
- // Level Done
- //////////////////////////////////////////////////////////// */
- static void
- LevelDone (void)
- {
- mm_snd_stopmod ();
- cEXIT.m = 0;
-
- LevelDoneExtra ();
- mm_gfx_flush ();
-
- FadeToBlue ();
-
- do {
- mm_gfx_flush ();
- mm_snd_jump (6000 + (cAIR * 100));
- mm_snd_jump2 (4000 + (cAIR * 100));
- mm_snd_update ();
- DrawAir ();
- SCORE += 9;
- PrintScore ();
- }
- while (--cAIR > 32);
-
- LEVEL++;
- if (LEVEL == 20 || LEVEL == 40)
- LEVEL -= 20;
-
- CopyLevelInfo ();
- DrawLevel ();
- mm_gfx_flush ();
-
- GAMEm = 1;
- StartGameMusic ();
- }
-
- /* ////////////////////////////////////////////////////////////
- // Game Over
- //////////////////////////////////////////////////////////// */
- static void
- GameOver (void)
- {
- switch (OVERm) {
- case 0:
- OverSetup ();
- break;
- case 1:
- DoBoot ();
- break;
- case 2:
- DoOverText ();
- break;
- }
- }
-
- /* ////////////////////////////////////////////////////////////
- // Draw Game Over Screen
- //////////////////////////////////////////////////////////// */
- static void
- OverSetup (void)
- {
- int i;
-
- BOOTy = 0;
-
- for (i = 1; i >= 0; --i) {
- mm_gfx_cls (0);
-
- PAPER = 254;
- mm_gfx_fillbox (0, 0, 256, 128, PAPER);
-
- DrawWilly2 ();
- DrawOver (120, 112, 0);
- DrawOver (120, BOOTy, 1);
- DrawTPlate ();
- DrawAirBG ();
- PrintScore ();
- PrintHighScore ();
- if (i)
- mm_gfx_flush ();
- }
-
- OVERm = 1;
- OVERp = 0;
-
- PAPER = 0;
- }
-
- /* ////////////////////////////////////////////////////////////
- // Draw GAME OVER Gfx
- //////////////////////////////////////////////////////////// */
- static void
- DrawOver (int xpos, int ypos, BYTE block)
- {
- Plot16ink (xpos, ypos, GFXover + 256 * block, 0, 254);
- }
-
- /* ////////////////////////////////////////////////////////////
- // Do Boot
- //////////////////////////////////////////////////////////// */
- static void
- DoBoot (void)
- {
- DrawOver (120, BOOTy, 1);
- mm_snd_jump (4000 + (BOOTy * BOOTy));
-
- if (++BOOTy > 96) {
- OVERm = 2;
- OVERink = 1;
- memset (PALover + 720, 0, 48);
- }
- RotPal ();
- mm_gfx_palset (PALover);
- mm_gfx_flush ();
-
- if (BOOTy > 96)
- DrawOver (120, 96, 1);
- }
-
- /* ////////////////////////////////////////////////////////////
- // Draw Willy
- //////////////////////////////////////////////////////////// */
- static void
- DrawWilly2 (void)
- {
- Plot16ink (120, 96, GFXwilly + 512, 0, 254);
- }
-
- /* ////////////////////////////////////////////////////////////
- // Do Over Text
- //////////////////////////////////////////////////////////// */
- static void
- DoOverText (void)
- {
- GameText1 ();
- mm_gfx_flush ();
-
- if (++OVERp > 200) {
- MODE = 0;
- TITLEm = 0;
- DEMOm = 0;
- GAMEm = 0;
- OVERm = 0;
- if (SCORE > HISCORE)
- HISCORE = SCORE;
- }
- }
-
- /* ////////////////////////////////////////////////////////////
- // Game Over Text
- //////////////////////////////////////////////////////////// */
- static void
- GameText1 (void)
- {
- INK = OVERink;
- FontPrint (10, 6, "G");
- INK = (OVERink + 1) & 7;
- FontPrint (11, 6, "a");
- INK = (OVERink + 2) & 7;
- FontPrint (12, 6, "m");
- INK = (OVERink + 3) & 7;
- FontPrint (13, 6, "e");
- INK = (OVERink + 4) & 7;
- FontPrint (18, 6, "O");
- INK = (OVERink + 5) & 7;
- FontPrint (19, 6, "v");
- INK = (OVERink + 6) & 7;
- FontPrint (20, 6, "e");
- INK = OVERink = (OVERink + 7) & 7;
- FontPrint (21, 6, "r");
- }
-
- /* ////////////////////////////////////////////////////////////
- // Do Extra Life Gained
- //////////////////////////////////////////////////////////// */
- static void
- ExtraLife (void)
- {
- switch (EXTRAm) {
- case 1:
- RotPal2 ();
- mm_gfx_palset (PALfade);
- if (++EXTRAc > 7)
- EXTRAm = 2;
- break;
- case 2:
- memcpy (PALfade, PALmain, sizeof (PALfade));
- EXTRAc = 0;
- EXTRAm = 0;
- mm_gfx_palset (PALmain);
- }
- }
-
- /* ////////////////////////////////////////////////////////////
- // Rotate end of palette
- //////////////////////////////////////////////////////////// */
- static void
- RotPal2 (void)
- {
- if (EXTRAc < 7) {
- int i;
- for (i = 765; i >= 0; i -= 3) {
- /* NOT (blue*2 + green*9 + red*5) / 16 */
- int grey = PALmain[i] * 2 + PALmain[i + 1] * 9 + PALmain[i + 2] * 5;
- grey = ~(grey / 16);
- PALfade[i + 0] = (EXTRAc & 2) ? 0 : (BYTE) grey;
- PALfade[i + 1] = (EXTRAc & 4) ? 0 : (BYTE) grey;
- PALfade[i + 2] = (EXTRAc & 1) ? 0 : (BYTE) grey;
- }
- }
- else
- memset (PALfade, 0, sizeof (PALfade));
- }
-
- /* ////////////////////////////////////////////////////////////
- // Do Cheat Stuff
- //////////////////////////////////////////////////////////// */
- static void
- DoCheat (void)
- {
- BYTE lev;
-
- lev = 0;
- if (mm_keyb_pressed (KEYB_1))
- lev |= 1;
- if (mm_keyb_pressed (KEYB_2))
- lev |= 2;
- if (mm_keyb_pressed (KEYB_3))
- lev |= 4;
- if (mm_keyb_pressed (KEYB_4))
- lev |= 8;
- if (mm_keyb_pressed (KEYB_5))
- lev |= 16;
- if (lev > 19)
- return;
-
- if (mm_keyb_pressed (KEYB_6)) {
- mm_snd_stopmod ();
- LEVEL = lev;
- ChangeLevelCheat ();
- }
-
- if (mm_keyb_pressed (KEYB_7) &&
- mm_keyb_pressed (KEYB_8) && mm_keyb_pressed (KEYB_0))
- LIVES = 12;
- }
-
- /* ////////////////////////////////////////////////////////////
- // Change Level for Cheat
- //////////////////////////////////////////////////////////// */
- static void
- ChangeLevelCheat (void)
- {
- CopyLevelInfo ();
- DrawLevel ();
- mm_gfx_flush ();
- StartGameMusic ();
- }
-
- /* ////////////////////////////////////////////////////////////
- // Check for Cheat
- //////////////////////////////////////////////////////////// */
- static void
- CheckCheat (void)
- {
- if (CHEATh == 1) {
- if (!mm_keyb_pressed (CHEATkey[CHEATp])) {
- if (++CHEATp == 6)
- CHEAT = 1;
- CHEATh = 0;
- }
- }
-
- if (mm_keyb_pressed (CHEATkey[CHEATp]))
- CHEATh = 1;
- else if (mm_keyb_pressed (KEYB_ANYKEY))
- CHEATp = 0;
- }
-
- /* ////////////////////////////////////////////////////////////
- // Check for MUSIC
- //////////////////////////////////////////////////////////// */
- static void
- CheckMusic (void)
- {
- if (mm_keyb_pressed (KEYB_H) ||
- mm_keyb_pressed (KEYB_J) ||
- mm_keyb_pressed (KEYB_K) ||
- mm_keyb_pressed (KEYB_L)) {
- MUSICon ^= 1;
- VOL = MUSICon ? 64 : 0;
- if (MUSICon)
- mm_snd_unmute ();
- else
- mm_snd_mute ();
- }
-
- }
-
- /* ////////////////////////////////////////////////////////////
- // Check for Pause
- //////////////////////////////////////////////////////////// */
- static void
- CheckPause (void)
- {
- if (PAUSE == 0) {
- if (mm_keyb_pressed (KEYB_A) ||
- mm_keyb_pressed (KEYB_S) ||
- mm_keyb_pressed (KEYB_D) ||
- mm_keyb_pressed (KEYB_F) ||
- mm_keyb_pressed (KEYB_G)) {
- PAUSE = 1;
- if (MUSICon && PAUSEtype)
- mm_snd_mute ();
- }
- }
- else {
- if ((!mm_keyb_pressed (KEYB_A) &&
- !mm_keyb_pressed (KEYB_S) &&
- !mm_keyb_pressed (KEYB_D) &&
- !mm_keyb_pressed (KEYB_F) &&
- !mm_keyb_pressed (KEYB_G)) && mm_keyb_pressed (KEYB_ANYKEY)) {
- PAUSE = 0;
- if (MUSICon && PAUSEtype)
- mm_snd_unmute ();
- }
- }
- }
-
- /* ////////////////////////////////////////////////////////////
- // Last Exit
- //////////////////////////////////////////////////////////// */
- static void
- LastExit (void)
- {
- switch (LASTm) {
- case 0:
- LastFirst ();
- break;
- case 1:
- LastFade ();
- break;
- case 2:
- LastClear ();
- break;
- case 3:
- LastBit ();
- break;
- }
- }
-
- /* ////////////////////////////////////////////////////////////
- // Last Air
- //////////////////////////////////////////////////////////// */
- static void
- LastFirst (void)
- {
- mm_snd_stopmod ();
- LevelDoneExtra ();
- mm_gfx_flush ();
-
- do {
- mm_gfx_flush ();
- mm_snd_jump (6000 + (cAIR * 100));
- mm_snd_jump2 (4000 + (cAIR * 100));
- mm_snd_update ();
- DrawAir ();
- SCORE += 9;
- PrintScore ();
- }
- while (--cAIR > 32);
-
- if (SCORE > HISCORE)
- HISCORE = SCORE;
-
- mm_snd_unmute ();
- mm_snd_playmod (0x20);
- LASTm = 1;
- LASTp = 0;
- }
-
- /* ////////////////////////////////////////////////////////////
- // Fade Down Game
- //////////////////////////////////////////////////////////// */
- static void
- LastFade (void)
- {
- LASTp++;
- if (LASTp == 4) {
- LASTp = 0;
- PaletteFade (PALblack, PALfade);
- if (++LASTc == 4) {
- LASTc = 0;
- SUN.y++;
- if (--SUN.h == 0)
- LASTm = 2;
- }
- mm_gfx_flush ();
- mm_gfx_palset (PALfade);
- RemoveSun ();
- DoSun ();
- }
- else {
- mm_gfx_flush ();
- RemoveSun ();
- DoSun ();
- DrawAir ();
- PrintScore ();
- }
- }
-
- /* ////////////////////////////////////////////////////////////
- // Text width & display
- //////////////////////////////////////////////////////////// */
- static BYTE TEXTxpos[TEXTLIMIT];
- static BYTE TEXTlines;
-
- static void
- WidthText (void)
- {
- int i = 0, j;
-
- while (i < TEXTLIMIT && EndText[TEXT.point].text[i]) {
- j = strlen (EndText[TEXT.point].text[i]);
- TEXTxpos[i] = 16 - j / 2 + 127 * (j & 1); /* round down (left) */
- i++;
- }
- TEXTlines = i;
- }
-
- static void
- ShowText (void)
- {
- int i, l = 11 - TEXTlines / 2 + 127 * (TEXTlines & 1);
- for (i = 0; i < TEXTlines; ++i)
- FontPrint (TEXTxpos[i], l + i, EndText[TEXT.point].text[i]);
- }
-
- /* ////////////////////////////////////////////////////////////
- // Clear Last Screen
- //////////////////////////////////////////////////////////// */
- static void
- LastClear (void)
- {
- mm_gfx_cls (0);
- mm_gfx_flush ();
- if (++LASTc == 2) {
- LASTm = 3;
- mm_gfx_palset (PALmain);
- LASTc = 0;
- LASTp = 0;
-
- TEXT.m = 0;
- TEXT.pause = 0;
- TEXT.point = 0;
- TEXT.ink = 0;
- TEXT.fade = 0;
- WidthText ();
- }
- }
-
- /* ////////////////////////////////////////////////////////////
- // Do Last Bit
- //////////////////////////////////////////////////////////// */
- static void
- LastBit (void)
- {
- /* if (mm_snd_getmodpos () == 0x11) { */
- if (mm_keyb_pressed (KEYB_SPACE)) {
- MODE = 0;
- TITLEm = 0;
- GAMEm = 0;
- mm_snd_stopmod ();
- }
-
- if (++LASTp == 6) {
- LASTp = 0;
- LASTc = (LASTc + 1) & 15;
- }
-
- PlotXY (176, 0, GFXhouse, 32, 32);
- Plot16 (184, 8, GFXwin + 256 * WINDOW[LASTc]);
- DoText ();
- mm_gfx_flush ();
- }
-
- /* ////////////////////////////////////////////////////////////
- // Do End Text
- //////////////////////////////////////////////////////////// */
- static void
- DoText (void)
- {
- switch (TEXT.m) {
- case 0:
- FadeUpText ();
- break;
- case 1:
- PauseText ();
- break;
- case 2:
- FadeDownText ();
- break;
- }
- }
-
- /* ////////////////////////////////////////////////////////////
- // Fade Up Text
- //////////////////////////////////////////////////////////// */
- static void
- FadeUpText (void)
- {
- if (++TEXT.ink >= 63) {
- TEXT.pause = 0;
- TEXT.m = 1;
- }
- INK = 127 - (TEXT.ink >> 2);
- ShowText ();
- }
-
- /* ////////////////////////////////////////////////////////////
- // Fade Down Text
- //////////////////////////////////////////////////////////// */
- static void
- FadeDownText (void)
- {
- if (--TEXT.ink == 0) {
- TEXT.m = 0;
- if (EndText[++TEXT.point].delay > 0)
- WidthText ();
- else
- {
- MODE = 0;
- TITLEm = 0;
- GAMEm = 0;
- mm_snd_stopmod ();
- }
- }
- INK = 127 - (TEXT.ink >> 2);
- ShowText ();
- }
-
- /* ////////////////////////////////////////////////////////////
- // Text Pause
- //////////////////////////////////////////////////////////// */
- static void
- PauseText (void)
- {
- ShowText ();
-
- if (++TEXT.pause == EndText[TEXT.point].delay) {
- TEXT.pause = 0;
- TEXT.m = 2;
- }
- }
-