#include #include #include #include #include #include #define FLOOR 2 #define BONUS 3 #define GREYWALL 1 #define PINKWALL 0 #define PINKWALL2 4 #define CLOSEDDOOR 5 #define OPENEDDOOR 6 #define KEY 7 #define HOLE 8 #define P1BONUS 9 #define P2BONUS 10 extern struct TextAttr Font1DEF; extern struct TextAttr Font2DEF; extern struct NewScreen PanelScreenDEF; extern struct NewWindow PanelWindowDEF; extern USHORT PanelColors[16]; extern struct NewScreen GameScreenDEF; extern struct NewWindow GameWindowDEF; extern USHORT StdColors[16]; extern USHORT GameColors[16]; extern __chip USHORT mousedata[]; extern struct Screen *gscreen; extern struct Screen *pscreen; extern struct Window *gwindow; extern struct Window *pwindow; extern struct RastPort *grp; extern struct RastPort *prp; extern struct ViewPort *gvp; extern struct ViewPort *pvp; extern UBYTE *gplane[4]; extern UBYTE *pplane[4]; extern APTR font2; extern CPTR MoveSound; extern CPTR ShuffleSound; extern CPTR NoShuffleSound; extern CPTR BonusSound; extern CPTR FallSound; extern CPTR DoorSound; extern CPTR End1Sound; extern CPTR End2Sound; extern BOOL music; extern BOOL sound; extern CPTR song; extern char Buffer[]; /****************************/ /* GAME DATA */ /****************************/ extern UBYTE Area[12][20]; extern SHORT Level; extern SHORT Bonus; struct Player { SHORT XPos, YPos; SHORT Score, Keys; SHORT Count, Collect; SHORT GamesWon, GamesPlayed; char *Name; }; extern struct Player Player[]; extern struct Player *p1, *p2; /****************************/ /* FUNCTION DECLARARTION */ /****************************/ SHORT Game(); void EditLevel(); void LoadGraphics(); void LoadPanel(); void LoadLevel(); void LoadSounds(); void OpenAll(); void CloseAll(__A0 char *); void DoPlayer(__A0 struct Player *, __A1 struct Player *); void PutArea(__D0 SHORT, __D1 SHORT); void PrintAt(__A0 struct RastPort *, __D0 SHORT, __D1 SHORT, __D2 SHORT, __D3 char *); void OPrintAt(__A0 struct RastPort *, __D0 SHORT, __D1 SHORT, __D2 SHORT, __D3 char *); LONG InitPlayer(); void RemMPlayer(); void PlayModule(__A0 CPTR); void PlayModule2(__A0 CPTR); void StopPlayer(); CPTR LoadModule(__A0 char *); void UnLoadModule(__A0 CPTR); #include "Joystick.c" /****************************/ /* Game */ /****************************/ SHORT Game() { if ( !music ) RemMPlayer(); /*************/ /* init game */ /*************/ { SHORT x, y; struct IntuiMessage *msg; while ( msg = (struct IntuiMessage *)GetMsg(pwindow->UserPort) ) ReplyMsg(msg); while ( msg = (struct IntuiMessage *)GetMsg(gwindow->UserPort) ) ReplyMsg(msg); Bonus = 0; for ( x = 0 ; x < 20 ; x++ ) for ( y = 0 ; y < 12 ; y++ ) switch ( Area[y][x] ) { case BONUS : case P1BONUS : case P2BONUS : Bonus++; break; } p1->XPos = 0; p1->YPos = 0; p1->Score = 0; p1->Keys = 0; p1->Count = rand() & 3; p1->Collect = 0; p2->XPos = 19; p2->YPos = 11; p2->Score = 0; p2->Keys = 0; p2->Count = rand() & 3; p2->Collect = 0; } /*************/ /* draw area */ /*************/ { SHORT x, y, i; LoadRGB4(gvp, GameColors, 16); for ( i = 0 ; i < 6 ; i++ ) { for ( x = i ; x < 20-i ; x++ ) { PutArea(i, x); PutArea(11-i, 19-x); Delay(1); } for ( y = i ; y < 12-i ; y++ ) { PutArea(y, 19-i); PutArea(11-y, i); Delay(1); } } } /************/ /* mainloop */ /************/ while ( Bonus > 0 ) { /*****************/ /* check for key */ /*****************/ { struct IntuiMessage *msg; while ( msg = (struct IntuiMessage *)GetMsg(pwindow->UserPort) ) { if ( (msg->Class == VANILLAKEY) && (msg->Code == ' ') ) Bonus = 0; ReplyMsg(msg); } while ( msg = (struct IntuiMessage *)GetMsg(gwindow->UserPort) ) { if ( (msg->Class == VANILLAKEY) && (msg->Code == ' ') ) Bonus = 0; ReplyMsg(msg); } } WaitTOF(); DoPlayer(p1, p2); DoPlayer(p2, p1); /************************/ /* print bonus & scores */ /************************/ { sprintf(Buffer, "%06u", Bonus); Move(prp, 136, 47); Text(prp, Buffer, 6); sprintf(Buffer, "%04u", p1->Score); Move(prp, 65, 15); Text(prp, Buffer, 4); sprintf(Buffer, "%04u", p2->Score); Move(prp, 280, 15); Text(prp, Buffer, 4); } } /* mainloop */ /****************/ /* clear screen */ /****************/ { SHORT i; if ( sound ) { PlaySound( End1Sound, MAXVOLUME, LEFT1, NORMALRATE, 1 ); Delay(5); PlaySound( End1Sound, MAXVOLUME, RIGHT1, NORMALRATE, 1 ); } SetAPen(grp, 0); for ( i = 0 ; i < 320 ; i += 4 ) { WaitTOF(); Move(grp, i, 0); Draw(grp, i, 191); Move(grp, 318-i, 0); Draw(grp, 318-i, 191); } for ( i = 0 ; i < 192 ; i += 2 ) { WaitTOF(); Move(grp, 0, i); Draw(grp, 319, i); Move(grp, 0, 191-i); Draw(grp, 319, 191-i); } } /*****************/ /* print message */ /*****************/ SHORT ret; if ( sound ) { PlaySound( End2Sound, MAXVOLUME, LEFT1, NORMALRATE, 1 ); Delay(5); PlaySound( End2Sound, MAXVOLUME, RIGHT1, NORMALRATE, 1 ); } StdColors[0] = 0x000; StdColors[1] = 0xFFF; StdColors[2] = 0xAAA; StdColors[3] = 0x888; LoadRGB4(gvp, StdColors, 16); if ( p1->Score > p2->Score ) { OPrintAt(grp, 160, 100, 0, "Player 1 wins"); p1->GamesWon++; ret = -1; } else if ( p1->Score < p2->Score ) { OPrintAt(grp, 160, 100, 0, "Player 2 wins"); p2->GamesWon++; ret = 1; } else { if ( p1->Collect > p2->Collect ) { OPrintAt(grp, 160, 100, 0, "Player 1 was faster"); p1->GamesWon++; ret = -1; } else if ( p1->Collect < p2->Collect ) { OPrintAt(grp, 160, 100, 0, "Player 2 was faster"); p2->GamesWon++; ret = 1; } else { OPrintAt(grp, 160, 100, 0, "No player wins"); ret = 0; } } p1->GamesPlayed++; p2->GamesPlayed++; while ( Joystick(PORT2) & 1 ); while ( !(Joystick(PORT2) & 1) ); while ( Joystick(PORT2) & 1 ); if ( !music ) InitPlayer(); return(ret); } /****************************/ /* DoPlayer() */ /****************************/ void DoPlayer(__A0 struct Player *p, __A1 struct Player *e) { SHORT channel; SHORT xpos = p->XPos, ypos = p->YPos; BOOL change = 0; /* increase collectcount */ p->Collect++; /* check for delay */ if ( p->Count-- > 0 ) return(); if ( p == p1 ) channel = LEFT1; else channel = RIGHT1; p->Count = 0; UBYTE joy; if ( channel == LEFT1 ) joy = Joystick(PORT2); else joy = Joystick(PORT1); joy &= 30; /**************/ /* move smily */ /**************/ if ( (joy == RIGHT) && ( xpos < 19 ) ) { xpos++; change = RIGHT; } if ( (joy == LEFT) && ( xpos > 0 ) ) { xpos--; change = LEFT; } if ( (joy == DOWN) && ( ypos < 11 ) ) { ypos++; change = DOWN; } if ( (joy == UP) && ( ypos > 0 ) ) { ypos--; change = UP; } /*****************/ /* check new pos */ /*****************/ if ( change && ( (xpos != e->XPos) || (ypos != e->YPos) ) ) { SHORT oldx = p->XPos, oldy = p->YPos; switch ( Area[ypos][xpos] ) { case P1BONUS : case P2BONUS : if ( (Area[ypos][xpos] == P1BONUS) && (channel == LEFT1) ) p->Score += 50; else if ( (Area[ypos][xpos] == P2BONUS) && (channel == RIGHT1) ) p->Score += 50; case BONUS : Bonus--; p->Score += 50; Area[ypos][xpos] = FLOOR; p->XPos = xpos; p->YPos = ypos; PutArea(oldy, oldx); PutArea(ypos, xpos); p->Count = 10; p->Collect = 0; if ( sound ) PlaySound( BonusSound, 32, channel, rand() & 127, 1 ); break; case KEY : p->Keys++; Area[ypos][xpos] = FLOOR; p->XPos = xpos; p->YPos = ypos; PutArea(oldy, oldx); PutArea(ypos, xpos); p->Count = 10; if ( sound ) PlaySound( BonusSound, 32, channel, rand() & 127, 1 ); break; case OPENEDDOOR : case FLOOR : p->XPos = xpos; p->YPos = ypos; PutArea(oldy, oldx); PutArea(ypos, xpos); p->Count = 10; if ( sound ) PlaySound( MoveSound, 32, channel, rand()&127, 1 ); break; case HOLE : p->XPos = -1; PutArea(oldy, oldx); if ( sound ) PlaySound( FallSound, 32, channel, NORMALRATE, 1 ); Delay(75); Bonus = 0; p->Score = 0; e->Score += 50; break; case CLOSEDDOOR : if ( p->Keys > 0 ) { p->Keys--; Area[ypos][xpos] = OPENEDDOOR; p->XPos = xpos; p->YPos = ypos; PutArea(oldy, oldx); PutArea(ypos, xpos); p->Count = 20; if ( sound ) PlaySound( DoorSound, 32, channel, NORMALRATE, 1 ); } break; case PINKWALL : case PINKWALL2 : if ( sound ) PlaySound(NoShuffleSound, 32, channel, rand()&127, 1 ); p->Count = 10; break; case GREYWALL : { SHORT i; BOOL ok = TRUE; SHORT pinkpos = -1; switch ( change ) { case RIGHT : /*****************/ /* scan to right */ /*****************/ for ( i = p->XPos + 1 ; (i != p->XPos) && ok ; i = (i + 1) % 20 ) switch ( Area[ypos][i] ) { case PINKWALL2 : pinkpos = i; case PINKWALL : case OPENEDDOOR : case CLOSEDDOOR : ok = FALSE; break; } /*******************/ /* if pink occured */ /*******************/ if ( !ok && (pinkpos == -1) ) { if ( sound ) PlaySound(NoShuffleSound, 32, channel, rand()&127, 1 ); break; } if ( pinkpos == -1 ) { /*************/ /* only grey */ /*************/ p->XPos = xpos; p->YPos = ypos; BYTE swap = Area[ypos][19]; for ( i = 19 ; i > 0 ; i-- ) Area[ypos][i] = Area[ypos][i-1]; Area[ypos][0] = swap; if ( e->YPos == ypos ) { e->XPos++; if ( e->XPos > 19 ) e->XPos = 0; } ScrollRaster(grp, -16, 0, 0, ypos*16, 319, ypos*16+15); PutArea(ypos, 0); if ( sound ) PlaySound(ShuffleSound, 32, channel, rand()&127, 1 ); } else { /***************/ /* found pink2 */ /***************/ SHORT wall; for ( wall = p->XPos+1 ; wall != pinkpos ; wall = (wall + 1) % 20 ) if ( Area[ypos][wall] == FLOOR ) break; /***************/ /* if no floor */ /***************/ if ( wall == pinkpos ) { if ( sound ) PlaySound(NoShuffleSound, 32, channel, rand()&127, 1 ); break; } if ( wall > oldx ) { /***************/ /* no clipping */ /***************/ /*******************/ /* if enemy blocks */ /*******************/ if ( (e->YPos == ypos) && (e->XPos == wall) ) { if ( sound ) PlaySound(NoShuffleSound, 32, channel, rand()&127, 1 ); break; } p->XPos = xpos; p->YPos = ypos; ScrollRaster(grp, -16, 0, oldx*16, ypos*16, wall*16+15, ypos*16+15); for ( i = wall-1 ; i > oldx ; i-- ) Area[ypos][i+1] = Area[ypos][i]; Area[ypos][oldx+1] = FLOOR; PutArea(ypos, oldx); if ( (e->YPos == ypos) && (e->XPos > oldx) && (e->XPos <= wall) ) { e->XPos++; if ( e->XPos > 19 ) e->XPos = 0; } } else { /*****************/ /* with clipping */ /*****************/ /*******************/ /* if enemy blocks */ /*******************/ if ( (e->YPos == ypos) && (e->XPos == wall) ) { if ( sound ) PlaySound(NoShuffleSound, 32, channel, rand()&127, 1 ); break; } p->XPos = xpos; p->YPos = ypos; ScrollRaster(grp, -16, 0, oldx*16, ypos*16, 319, ypos*16+15); ScrollRaster(grp, -16, 0, 0, ypos*16, wall*16+15, ypos*16+15); BYTE swap = Area[ypos][19]; for ( i = 18 ; i > oldx ; i-- ) Area[ypos][i+1] = Area[ypos][i]; for ( i = wall-1 ; i >= 0 ; i-- ) Area[ypos][i+1] = Area[ypos][i]; Area[ypos][0] = swap; PutArea(ypos, 0); Area[ypos][oldx+1] = FLOOR; PutArea(ypos, oldx); if ( (e->YPos == ypos) && ( (e->XPos > oldx) || (e->XPos <= wall) ) ) { e->XPos++; if ( e->XPos > 19 ) e->XPos = 0; } } } break; case LEFT : for ( i = p->XPos - 1 ; (i != p->XPos) && ok ; i = (i + 19) % 20 ) switch ( Area[ypos][i] ) { case PINKWALL2 : pinkpos = i; case PINKWALL : case OPENEDDOOR : case CLOSEDDOOR : ok = FALSE; break; } /*******************/ /* if pink occured */ /*******************/ if ( !ok && (pinkpos == -1) ) { if ( sound ) PlaySound(NoShuffleSound, 32, channel, rand()&127, 1 ); break; } if ( pinkpos == -1 ) { p->XPos = xpos; p->YPos = ypos; BYTE swap = Area[ypos][0]; for ( i = 0 ; i < 19 ; i++ ) Area[ypos][i] = Area[ypos][i+1]; Area[ypos][19] = swap; if ( e->YPos == ypos ) { e->XPos--; if ( e->XPos < 0 ) e->XPos = 19; } ScrollRaster(grp, 16, 0, 0, ypos*16, 319, ypos*16+15); PutArea(ypos, 19); if ( sound ) PlaySound(ShuffleSound, 32, channel, rand()&127, 1 ); } else { /***************/ /* pink2 found */ /***************/ SHORT wall; for ( wall = p->XPos-1 ; wall != pinkpos ; wall = (wall + 19) % 20 ) if ( Area[ypos][wall] == FLOOR ) break; /***************/ /* if no floor */ /***************/ if ( wall == pinkpos ) { if ( sound ) PlaySound(NoShuffleSound, 32, channel, rand()&127, 1 ); break; } if ( wall < oldx ) { /***************/ /* no clipping */ /***************/ /*******************/ /* if enemy blocks */ /*******************/ if ( (e->YPos == ypos) && (e->XPos == wall) ) { if ( sound ) PlaySound(NoShuffleSound, 32, channel, rand()&127, 1 ); break; } p->XPos = xpos; p->YPos = ypos; ScrollRaster(grp, 16, 0, wall*16, ypos*16, oldx*16+15, ypos*16+15); for ( i = wall+1 ; i < oldx ; i++ ) Area[ypos][i-1] = Area[ypos][i]; Area[ypos][oldx-1] = FLOOR; PutArea(ypos, oldx); if ( (e->YPos == ypos) && (e->XPos < oldx) && (e->XPos >= wall) ) { e->XPos--; if ( e->XPos < 0 ) e->XPos = 19; } } else { /*****************/ /* with clipping */ /*****************/ /*******************/ /* if enemy blocks */ /*******************/ if ( (e->YPos == ypos) && (e->XPos == wall) ) { if ( sound ) PlaySound(NoShuffleSound, 32, channel, rand()&127, 1 ); break; } p->XPos = xpos; p->YPos = ypos; ScrollRaster(grp, 16, 0, 0, ypos*16, oldx*16+15, ypos*16+15); ScrollRaster(grp, 16, 0, wall*16, ypos*16, 319, ypos*16+15); BYTE swap = Area[ypos][0]; for ( i = 1 ; i < oldx ; i++ ) Area[ypos][i-1] = Area[ypos][i]; for ( i = wall+1 ; i <= 19 ; i++ ) Area[ypos][i-1] = Area[ypos][i]; Area[ypos][19] = swap; PutArea(ypos, 19); Area[ypos][oldx-1] = FLOOR; PutArea(ypos, oldx); if ( (e->YPos == ypos) && ( (e->XPos < oldx) || (e->XPos >= wall) ) ) { e->XPos--; if ( e->XPos < 0 ) e->XPos = 19; } } } break; case DOWN : /*************/ /* scan down */ /*************/ for ( i = p->YPos + 1 ; (i != p->YPos) && ok ; i = (i + 1) % 12 ) switch ( Area[i][xpos] ) { case PINKWALL2 : pinkpos = i; case PINKWALL : case OPENEDDOOR : case CLOSEDDOOR : ok = FALSE; break; } /*******************/ /* if pink occured */ /*******************/ if ( !ok && (pinkpos == -1) ) { if ( sound ) PlaySound(NoShuffleSound, 32, channel, rand()&127, 1 ); break; } if ( pinkpos == -1 ) { /*************/ /* only grey */ /*************/ p->XPos = xpos; p->YPos = ypos; BYTE swap = Area[11][xpos]; for ( i = 11 ; i > 0 ; i-- ) Area[i][xpos] = Area[i-1][xpos]; Area[0][xpos] = swap; if ( e->XPos == xpos ) { e->YPos++; if ( e->YPos > 11 ) e->YPos = 0; } ScrollRaster(grp, 0, -16, xpos*16, 0, xpos*16+15, 191); PutArea(0, xpos); if ( sound ) PlaySound(ShuffleSound, 32, channel, rand()&127, 1 ); } else { /***************/ /* found pink2 */ /***************/ SHORT wall; for ( wall = p->YPos+1 ; wall != pinkpos ; wall = (wall + 1) % 12 ) if ( Area[wall][xpos] == FLOOR ) break; /***************/ /* if no floor */ /***************/ if ( wall == pinkpos ) { if ( sound ) PlaySound(NoShuffleSound, 32, channel, rand()&127, 1 ); break; } if ( wall > oldy ) { /***************/ /* no clipping */ /***************/ /*******************/ /* if enemy blocks */ /*******************/ if ( (e->XPos == xpos) && (e->YPos == wall) ) { if ( sound ) PlaySound(NoShuffleSound, 32, channel, rand()&127, 1 ); break; } p->XPos = xpos; p->YPos = ypos; ScrollRaster(grp, 0, -16, xpos*16, oldy*16, xpos*16+15, wall*16+15); for ( i = wall-1 ; i > oldy ; i-- ) Area[i+1][xpos] = Area[i][xpos]; Area[oldy+1][xpos] = FLOOR; PutArea(oldy, xpos); if ( (e->XPos == xpos) && (e->YPos > oldy) && (e->YPos <= wall) ) { e->YPos++; if ( e->YPos > 11 ) e->YPos = 0; } } else { /*****************/ /* with clipping */ /*****************/ /*******************/ /* if enemy blocks */ /*******************/ if ( (e->XPos == xpos) && (e->YPos == wall) ) { if ( sound ) PlaySound(NoShuffleSound, 32, channel, rand()&127, 1 ); break; } p->XPos = xpos; p->YPos = ypos; ScrollRaster(grp, 0, -16, xpos*16, oldy*16, xpos*16+15, 191); ScrollRaster(grp, 0, -16, xpos*16, 0, xpos*16+15, wall*16+15); BYTE swap = Area[11][xpos]; for ( i = 10 ; i > oldy ; i-- ) Area[i+1][xpos] = Area[i][xpos]; for ( i = wall-1 ; i >= 0 ; i-- ) Area[i+1][xpos] = Area[i][xpos]; Area[0][xpos] = swap; PutArea(0, xpos); Area[oldy+1][xpos] = FLOOR; PutArea(oldy, xpos); if ( (e->XPos == xpos) && ( (e->YPos > oldy) || (e->YPos <= wall) ) ) { e->YPos++; if ( e->YPos > 11 ) e->YPos = 0; } } } break; case UP : for ( i = p->YPos - 1 ; (i != p->YPos) && ok ; i = (i + 11) % 12 ) switch ( Area[i][xpos] ) { case PINKWALL2 : pinkpos = i; case PINKWALL : case OPENEDDOOR : case CLOSEDDOOR : ok = FALSE; break; } /*******************/ /* if pink occured */ /*******************/ if ( !ok && (pinkpos == -1) ) { if ( sound ) PlaySound(NoShuffleSound, 32, channel, rand()&127, 1 ); break; } if ( pinkpos == -1 ) { p->XPos = xpos; p->YPos = ypos; BYTE swap = Area[0][xpos]; for ( i = 0 ; i < 11 ; i++ ) Area[i][xpos] = Area[i+1][xpos]; Area[11][xpos] = swap; if ( e->XPos == xpos ) { e->YPos--; if ( e->YPos < 0 ) e->YPos = 11; } ScrollRaster(grp, 0, 16, xpos*16, 0, xpos*16+15, 191); PutArea(11, xpos); if ( sound ) PlaySound(ShuffleSound, 32, channel, rand()&127, 1 ); } else { SHORT wall; for ( wall = p->YPos-1 ; wall != pinkpos ; wall = (wall + 11) % 12 ) if ( Area[wall][xpos] == FLOOR ) break; /***************/ /* if no floor */ /***************/ if ( wall == pinkpos ) { if ( sound ) PlaySound(NoShuffleSound, 32, channel, rand()&127, 1 ); break; } if ( wall < oldy ) { /***************/ /* no clipping */ /***************/ /*******************/ /* if enemy blocks */ /*******************/ if ( (e->XPos == xpos) && (e->YPos == wall) ) { if ( sound ) PlaySound(NoShuffleSound, 32, channel, rand()&127, 1 ); break; } p->XPos = xpos; p->YPos = ypos; ScrollRaster(grp, 0, 16, xpos*16, wall*16, xpos*16+15, oldy*16+15); for ( i = wall+1 ; i < oldy ; i++ ) Area[i-1][xpos] = Area[i][xpos]; Area[oldy-1][xpos] = FLOOR; PutArea(oldy, xpos); if ( (e->XPos == xpos) && (e->YPos < oldy) && (e->YPos >= wall) ) { e->YPos--; if ( e->YPos < 0 ) e->YPos = 11; } } else { /*****************/ /* with clipping */ /*****************/ /*******************/ /* if enemy blocks */ /*******************/ if ( (e->XPos == xpos) && (e->YPos == wall) ) { if ( sound ) PlaySound(NoShuffleSound, 32, channel, rand()&127, 1 ); break; } p->XPos = xpos; p->YPos = ypos; ScrollRaster(grp, 0, 16, xpos*16, 0, xpos*16+15, oldy*16+15); ScrollRaster(grp, 0, 16, xpos*16, wall*16, xpos*16+15, 191); BYTE swap = Area[0][xpos]; for ( i = 1 ; i < oldy ; i++ ) Area[i-1][xpos] = Area[i][xpos]; for ( i = wall+1 ; i <= 11 ; i++ ) Area[i-1][xpos] = Area[i][xpos]; Area[11][xpos] = swap; PutArea(11, xpos); Area[oldy-1][xpos] = FLOOR; PutArea(oldy, xpos); if ( (e->XPos == xpos) && ( (e->YPos < oldy) || (e->YPos >= wall) ) ) { e->YPos--; if ( e->YPos < 0 ) e->YPos = 11; } } } break; } /* switch */ PutArea(e->YPos, e->XPos); p->Count = 15; } /* case GREYWALL */ break; } /* switch (Area.. */ } /* if ( change.. */ } /* do player 1 */ /****************************/ /* PutArea */ /****************************/ void PutArea(__D0 SHORT y, __D1 SHORT x) { if ( (p1->XPos == x) && (p1->YPos == y) ) { ClipBlit(grp, 96, 192, grp, x*16, y*16, 16, 16, 0xC0); } else if ( (p2->XPos == x) && (p2->YPos == y) ) { ClipBlit(grp, 96, 208, grp, x*16, y*16, 16, 16, 0xC0); } else { switch ( Area[y][x] ) { case FLOOR : ClipBlit(grp, 0, 192, grp, x*16, y*16, 16, 16, 0xC0); break; case GREYWALL : ClipBlit(grp, 16, 192, grp, x*16, y*16, 16, 16, 0xC0); break; case PINKWALL : ClipBlit(grp, 32, 192, grp, x*16, y*16, 16, 16, 0xC0); break; case PINKWALL2 : ClipBlit(grp, 48, 192, grp, x*16, y*16, 16, 16, 0xC0); break; case CLOSEDDOOR : ClipBlit(grp, 64, 192, grp, x*16, y*16, 16, 16, 0xC0); break; case OPENEDDOOR : ClipBlit(grp, 80, 192, grp, x*16, y*16, 16, 16, 0xC0); break; case HOLE : ClipBlit(grp, 0, 208, grp, x*16, y*16, 16, 16, 0xC0); break; case KEY : ClipBlit(grp, 16, 208, grp, x*16, y*16, 16, 16, 0xC0); break; case P1BONUS : ClipBlit(grp, 48, 208, grp, x*16, y*16, 16, 16, 0xC0); break; case P2BONUS : ClipBlit(grp, 32, 208, grp, x*16, y*16, 16, 16, 0xC0); break; case BONUS : ClipBlit(grp, 64, 208, grp, x*16, y*16, 16, 16, 0xC0); break; } } } /****************************/ /* LoadPanel */ /****************************/ void LoadPanel() { SHORT i; BPTR file; for ( i = 0 ; i < 16 ; i++ ) SetRGB4(pvp, i, 0, 0, 0); file = (BPTR)Open("Panel.data", MODE_OLDFILE); if ( !file ) CloseAll("No panel."); for ( i = 0 ; i < 4 ; i++ ) { Read(file, prp->BitMap->Planes[i], 2240); } Read(file, PanelColors, 32); Close(file); LoadRGB4(pvp, PanelColors, 16); } /****************************/ /* LoadLevel */ /****************************/ void LoadLevel() { struct FileHandle *file; if ( file = (struct FileHandle *)Open("Levels.data", MODE_OLDFILE) ) { LONG index = (Level-1) * 240; Seek(file, index, OFFSET_BEGINNING); Read(file, Area, 240); Close(file); } else { DisplayBeep(NULL); } } /****************************/ /* LoadGraphics */ /****************************/ void LoadGraphics() { SHORT i; struct FileHandle *file; file = (struct FileHandle *)Open("Graphics.data", MODE_OLDFILE); if ( !file ) CloseAll("No Graphics.data."); for ( i = 0 ; i < 4 ; i++ ) { Read(file, gplane[i]+192*40, 32*40); } Read(file, GameColors, 32); Close(file); } /****************************/ /* LoadSounds */ /****************************/ void LoadSounds() { MoveSound = PrepareSound("Move.snd"); if ( !MoveSound ) CloseAll("No Move.snd"); ShuffleSound = PrepareSound("Shuffle.snd"); if ( !ShuffleSound ) CloseAll("No Shuffle.snd"); NoShuffleSound = PrepareSound("NoShuffle.snd"); if ( !NoShuffleSound ) CloseAll("No NoShuffle.snd"); BonusSound = PrepareSound("Bonus.snd"); if ( !BonusSound ) CloseAll("No Bonus.snd"); FallSound = PrepareSound("Fall.snd"); if ( !FallSound ) CloseAll("No Fall.snd"); DoorSound = PrepareSound("Door.snd"); if ( !DoorSound ) CloseAll("No Door.snd"); End1Sound = PrepareSound("End1.snd"); if ( !End1Sound ) CloseAll("No End1.snd"); End2Sound = PrepareSound("End2.snd"); if ( !End2Sound ) CloseAll("No End2.snd"); song = LoadModule("Underground.song"); if ( !song ) music = FALSE; else { music = TRUE; InitPlayer(); PlayModule(song); } } /****************************/ /* OpenAll */ /****************************/ void OpenAll() { SHORT i; /* open font */ if ( !( font2 = (APTR)OpenDiskFont(&Font2DEF) ) ) CloseAll("No font2 !!"); /* open game screen */ if ( !( gscreen = (struct Screen *)OpenScreen(&GameScreenDEF) ) ) CloseAll("No game screen !!"); GameWindowDEF.Screen = gscreen; if ( !( gwindow = (struct Window *)OpenWindow(&GameWindowDEF) ) ) CloseAll("No game window !!"); grp = &gscreen->RastPort; gvp = &gscreen->ViewPort; for ( i = 0 ; i < 5 ; i++ ) gplane[i] = grp->BitMap->Planes[i]; SetPointer(gwindow, mousedata, 0, 0, 0, 0); SetDrMd(grp, JAM1); /* open panel screen */ if ( !( pscreen = (struct Screen *)OpenScreen(&PanelScreenDEF) ) ) CloseAll("No panel screen !!"); PanelWindowDEF.Screen = pscreen; if ( !( pwindow = (struct Window *)OpenWindow(&PanelWindowDEF) ) ) CloseAll("No panel window !!"); prp = &pscreen->RastPort; pvp = &pscreen->ViewPort; for ( i = 0 ; i < 4 ; i++ ) pplane[i] = prp->BitMap->Planes[i]; SetPointer(pwindow, mousedata, 0, 0, 0, 0); SetAPen(prp, 4); SetBPen(prp, 5); } /****************************/ /* CloseAll */ /****************************/ void CloseAll(__A0 char *text) { puts(text); StopPlayer(); RemMPlayer(); StopSound(LEFT0); StopSound(LEFT1); StopSound(RIGHT0); StopSound(RIGHT1); RemoveSound(MoveSound); RemoveSound(ShuffleSound); RemoveSound(NoShuffleSound); RemoveSound(BonusSound); RemoveSound(FallSound); RemoveSound(DoorSound); RemoveSound(End1Sound); RemoveSound(End2Sound); if (song) UnLoadModule(song); if (gwindow) CloseWindow(gwindow); if (gscreen) CloseScreen(gscreen); if (pwindow) CloseWindow(pwindow); if (pscreen) CloseScreen(pscreen); if (font2) CloseFont(font2); exit(0); } /****************************/ /* PrintAt */ /****************************/ void PrintAt(__A0 struct RastPort *rp, __D0 SHORT x, __D1 SHORT y, __D2 SHORT m, __D3 char *t) { SHORT l = strlen(t); switch (m) { case -1 : Move(rp, x, y); break; case 0 : Move(rp, x - TextLength(rp, t, l)/2, y); break; case 1 : Move(rp, x - TextLength(rp, t, l), y); break; } Text(rp, t, l); } /****************************/ /* OPrintAt */ /****************************/ void OPrintAt(__A0 struct RastPort *rp, __D0 SHORT x, __D1 SHORT y, __D2 SHORT m, __D3 char *t) { SHORT l = strlen(t); switch (m) { case 0 : x = x - TextLength(rp, t, l)/2; break; case 1 : x = x - TextLength(rp, t, l); break; } SetAPen(rp, 3); Move(rp, x+1, y); Text(rp, t, l); Move(rp, x, y+1); Text(rp, t, l); SetAPen(rp, 2); Move(rp, x-1, y); Text(rp, t, l); Move(rp, x, y-1); Text(rp, t, l); SetAPen(rp, 1); Move(rp, x, y); Text(rp, t, l); }