/* BoxWorld (c) 20003-2004
   by Ventzislav Tzvetkov http://drhirudo.hit.bg

   Compile with: vc BoxWorld.s BoxWorld.c -lauto -o BoxWorld
*/

#include <stdio.h>

#include <intuition/intuition.h>

#include <hardware/custom.h>  /* These twos  are  for  */
#include <hardware/cia.h>    /*  the Joystick handler */

/* FileHandler for the save file */

FILE *SaveFile;

/* The Game uses dirty hardware access to read the Joystick positions  */
/* For speed. If this doesn't work under newer AmigaOS releases I will */
/* Change it. For now it will stuck. Look at the Joystick() function   */
/* For more information, how to adapt it for other platforms.          */

#include "BoxWorld.h"

#include <libraries/asl.h> /* For the ScreenMode Requester */


/* Place a sprite in the Title Screen */
void TitleSprite(SpriteNumber) {SetAPen(my_window->RPort,0);
RectFill(my_window->RPort,160,120,167,127);
DrawSprite(SpriteNumber,160,120);}

/* Place a sprite in the End Screen */
void EndSprite(SpriteNumber) {SetAPen(my_window->RPort,0);
RectFill(my_window->RPort,269,118,276,125);
DrawSprite(SpriteNumber,269,118);}

UBYTE Joystick()  /* Returns Joystick position and/or firebutton press */
{
  UBYTE data = 0;
  UWORD joy;
  /* PORT 2 ("JOYSTICK PORT") */
    joy = custom.joy1dat;
    data += !( ciaa.ciapra & 0x0080 ) ? FIRE : 0;

  data += joy & 0x0002 ? RIGHT : 0;
  data += joy & 0x0200 ? LEFT : 0;
  data += (joy >> 1 ^ joy) & 0x0001 ? DOWN : 0;
  data += (joy >> 1 ^ joy) & 0x0100 ? UP : 0;

  return( data );
}


/* Increase the number of the pushes and show it. */
void Push() {WorldPushes+=(WorldPushes!=9999);
NumberString[0]=WorldPushes/1000+'0';
NumberString[1]=(WorldPushes%1000)/100+'0';
NumberString[2]=(WorldPushes%100)/10+'0';
NumberString[3]=WorldPushes%10+'0';
SetAPen( my_window->RPort, 9);
Move (my_window->RPort, 181,228);
Text (my_window->RPort, &NumberString,4);
}

/* Increase the number of the moves and show it. */
void Moved() {WorldMoves+=(WorldMoves!=9999);
NumberString[0]=WorldMoves/1000+'0';
NumberString[1]=(WorldMoves%1000)/100+'0';
NumberString[2]=(WorldMoves%100)/10+'0';
NumberString[3]=WorldMoves%10+'0';
Move (my_window->RPort, 77,228);
SetAPen( my_window->RPort,11);
Text (my_window->RPort, &NumberString,4);
}

/* Title Screen */
void Title() {
if (ReplayFlag) if (Music) StopPlayer();
if (Music) StartSong(0);
Man=TotalMoves=TotalPushes=WorldPushes=WorldPushes=LoadFlag=0;
my_third_item.Flags=ITEMTEXT|COMMSEQ|HIGHCOMP;

Castle(); /* Draws Castle */

  /* Stay in the while loop until the end */
  while( close == FALSE )
  { /* As long as we can collect messages successfully we stay in the */
    /* while-loop: */

  while(my_message = (struct IntuiMessage *) GetMsg(my_window->UserPort))
   {CheckClass=my_message->Class;
    CheckCode=my_message->Code;
    ReplyMsg( my_message ); /* Work done. Reply. */}

if(CheckClass == MENUPICK)
  { if (CheckCode == NEW_GAME) {CheckClass=LoadFlag=ReplayFlag=0;break;} /* New  Game */
    if (CheckCode == LOADGAME) {LoadFlag=TRUE;CheckClass=ReplayFlag=0;
            if (SaveFile=fopen("BoxWorld.sav","rb")) {
            fseek(SaveFile,sizeof(ModeID),SEEK_SET);
            fread(&WorldNumber,sizeof(WorldNumber),1,SaveFile);
            fclose(SaveFile);} else WorldNumber=1;
            if (WorldNumber<2 || WorldNumber>WORLDS) {WorldNumber=1;
            LoadFlag=FALSE;}Lives=3;
             break;}  /* Load Game */
    if (CheckCode == QUITGAME) {close=TRUE;return;} /* Quit Game */
    if (CheckCode == INFOITEM) { /* About */
                      AutoRequest( my_window, &my_body_text, NULL,
                      &my_ok_text, NULL, NULL, 220, 102);}
  }
if(CheckClass == RAWKEY) {
    if (CheckCode==16 || CheckCode==69) {close=TRUE;return;}
    if (CheckCode==64) break;  /* Space Pressed */
    if (CheckCode==55) if (Music) {StopPlayer();Music=0;} else {Music=1;
   StartSong(0);} {}/* M key Pressed */
    if (CheckCode==68) loop=249; /* Return Pressed */
}
CheckClass=0;
if (Joystick() & FIRE) break;

   WaitTOF();

  switch (Man) {
  
  case 0:   TitleSprite(0);break;
  case 100: TitleSprite(1);break;
  case 130: TitleSprite(0);break;
  case 160: TitleSprite(2);break;
  case 190: TitleSprite(0);break;
  case 211: TitleSprite(3);break;
  case 228: TitleSprite(0);break; 
  case 242: TitleSprite(4);break;
  case 285: TitleSprite(0);break;
  case 320: TitleSprite(4);break;
  case 390: TitleSprite(0);break;
  case 440: TitleSprite(3);break;
  case 500: switch(rand()%6) {
    case 0: Man=100; break;
    case 1: Man=211; break;
    case 2: Man=160; break;
    case 3: Man=45; break;
    case 4: Man=320; break;
    default: Man=561;break;
     } break;
  case 580: TitleSprite(5);break;
  case 600: Man=0;break;

  default: break;
}

if (++loop==250) {loop=0;

SetAPen(my_window->RPort,0);
RectFill(my_window->RPort,58,110,271,117);
SetAPen(my_window->RPort,22);
Brick=strlen(Talk1[Line]);
Move(my_window->RPort,165-(Brick<<2),116);
Text(my_window->RPort,Talk1[Line],Brick);

if (++Line==69) {Delay(80);WaitTOF();
LoadRGB32(&my_screen->ViewPort,BlackRGB32);

SetRast(my_window->RPort,0);

for (i=18;i!=306;i+=8){
ClipBlit( &my_rast_port, 8, 0, my_window->RPort, i, 38, 8,8, 0xC0 );
ClipBlit( &my_rast_port, 8, 0, my_window->RPort, i, 246, 8,8, 0xC0 );
}

for (j=46;j!=246;j+=8){
ClipBlit( &my_rast_port, 8, 0, my_window->RPort, 18, j, 8,8, 0xC0 );
ClipBlit( &my_rast_port, 8, 0, my_window->RPort, 298,j, 8,8, 0xC0 );
}

for (i=26;i!=298;i+=8) for (j=46;j!=246;j+=8)
ClipBlit( &my_rast_port, 152, 0, my_window->RPort, i, j, 8,8, 0xC0 );

DrawFames();WaitTOF();LoadRGB32(&my_screen->ViewPort,BoxWorldPaletteRGB32);}
if (Line==84) {Line=0;Castle();}
}

  Man++;
 }
WaitTOF();
SetAPen(my_window->RPort,0);
RectFill(my_window->RPort,58,110,271,117);
for (Man=7;Man!=3;Man--)
{Delay(3);WaitTOF();
DrawEllipse( my_window->RPort, 163, 123, Man, 4 );
DrawEllipse( my_window->RPort, 163, 123, Man, 3 );}
for (;Man!=1;Man--)
{Delay(3);WaitTOF();
DrawEllipse( my_window->RPort, 163, 123, Man, 3 );
DrawEllipse( my_window->RPort, 163, 123, Man, 2 );}
WaitTOF();
Delay(2);
DrawEllipse( my_window->RPort, 163, 123, 2, 2 );
DrawEllipse( my_window->RPort, 163, 123, 1, 1 );
Delay(1);WaitTOF();RectFill(my_window->RPort,162,122,164,126);
Delay(15);
}

void Water() {          /* Water effect in the winning screen */
rx=ReadPixel(my_window->RPort,151,146);
lx=ReadPixel(my_window->RPort,151,147);
SetAPen(my_window->RPort,lx==15?20:22);
WaitTOF();
WritePixel(my_window->RPort,135,48);
ScrollRaster(my_window->RPort,-1,0,112,146,151,147);
SetAPen(my_window->RPort,rx);WritePixel(my_window->RPort,112,146);
SetAPen(my_window->RPort,lx);WritePixel(my_window->RPort,112,147);
SetAPen(my_window->RPort,0);
}


/* Show the stage. */
void World(ULONG WorldNumber){
WaitTOF();
LoadRGB32(&my_screen->ViewPort,BlackRGB32);
SetRast(my_window->RPort,0);
TotalMoves+=WorldMoves; TotalPushes+=WorldPushes;
if (!ReplayFlag) if (Music) StopPlayer(); 
if (WorldNumber>WORLDS){/* No more WORLDS. Game Completed */
my_third_item.Flags=ITEMTEXT|COMMSEQ|HIGHCOMP;
my_second_item.Flags=ITEMTEXT|COMMSEQ|HIGHCOMP;
Brick=(rand()%10)*8;
ClipBlit( &my_rast_port, Brick, 0, my_window->RPort, 96, 0, 8,8, 0xC0 );
ClipBlit( &my_rast_port, Brick, 0, my_window->RPort, 104,0, 8,8, 0xC0 );

for (loop=8;loop!=256;loop+=8) for (i=0;i!=112;i+=8)
ClipBlit( &my_rast_port, Brick, 0, my_window->RPort, i, loop, 8,8, 0xC0 );

for (;i!=152;i+=8) {
ClipBlit( &my_rast_port, 120, 0, my_window->RPort, i, 144, 8,8, 0xC0 );
}
SetAPen(my_window->RPort,15);
RectFill(my_window->RPort,112,152,151,255);

for (loop=128;loop!=256;loop+=8) for (i=152;i!=320;i+=8)
ClipBlit( &my_rast_port, 128, 0, my_window->RPort, i, loop, 8,8, 0xC0 );
for (i=152;i!=320;i+=8)
ClipBlit( &my_rast_port, 80, 6, my_window->RPort, i, 126, 8,2, 0xC0 );
ClipBlit( &my_rast_port, 88, 0, my_window->RPort, 230, 120, 32,8, 0xC0 );
ClipBlit( &my_rast_port, 184, 0, my_window->RPort, 279,5, 8,8, 0xC0 );
ClipBlit( &my_rast_port, 192, 0, my_window->RPort,  287,5, 8,8, 0xC0 );

Move (my_window->RPort,173,33);SetAPen(my_window->RPort,6);
Text(my_window->RPort,"Congratulations",15);
Move (my_window->RPort,201,48);SetAPen(my_window->RPort,25);
Text(my_window->RPort,"You have",8);
Move (my_window->RPort,201,58);SetAPen(my_window->RPort,2);
Text( my_window->RPort, "escaped.",8);
SetAPen(my_window->RPort,5);RectFill(my_window->RPort,191,66,273,74);
SetAPen(my_window->RPort,20);Move (my_window->RPort,194,73);
SetBPen(my_window->RPort,5);Text( my_window->RPort, "WELL DONE!",10);
SetBPen(my_window->RPort,0);
SetAPen(my_window->RPort,22);WritePixel(my_window->RPort,135,48);
SetAPen(my_window->RPort,30);WritePixel(my_window->RPort,155,12);
SetAPen(my_window->RPort,23);WritePixel(my_window->RPort,194,15);
SetAPen(my_window->RPort,10);WritePixel(my_window->RPort,231,7);
SetAPen(my_window->RPort,13);WritePixel(my_window->RPort,296,43);
SetAPen(my_window->RPort,0);
LoadRGB32(&my_screen->ViewPort,BoxWorldPaletteRGB32);
if (Music) StartSong(11);
WaitTOF();DrawSprite(0,269,118);loop=Line=0;
while (close == FALSE) {
  while(my_message = (struct IntuiMessage *) GetMsg(my_window->UserPort))
  {CheckClass=my_message->Class;
   CheckCode=my_message->Code;
   ReplyMsg( my_message ); /* Work done. Reply. */
   }

if(CheckClass == MENUPICK)
  {
   if(CheckCode == NEW_GAME) break; /* New Game */

   if (CheckCode == INFOITEM){          /* About */
                      AutoRequest( my_window, &my_body_text, NULL,
                      &my_ok_text, NULL, NULL, 220, 102);}
   if (CheckCode == QUITGAME) {close=TRUE;return;} /* Quit */    
   }
if(CheckClass == RAWKEY) {
    if (CheckCode==16 || CheckCode==69) {close=TRUE;return;}
    if (CheckCode==64) break;  /* Space Pressed */
    if (CheckCode==55) if (Music) {StopPlayer();Music=0;} else {Music=1;
   StartSong(0);} /* M key Pressed */
}
CheckClass=0;
if (Joystick() & FIRE) break;

WaitTOF();

  switch (Man) {

  case 0:   EndSprite(0);break;
  case 100: EndSprite(1);break;
  case 130: EndSprite(0);break;
  case 160: EndSprite(2);break;
  case 190: EndSprite(0);break;
  case 211: EndSprite(3);break;
  case 228: EndSprite(0);break; 
  case 242: EndSprite(4);break;
  case 285: EndSprite(0); break;
  case 320: EndSprite(4);break;
  case 390: EndSprite(0);break;
  case 440: EndSprite(4);break;
  case 500: switch(rand()%6) {
    case 0: Man=100; break;
    case 1: Man=211; break;
    case 2: Man=160; break;
    case 3: Man=45; break;
    case 4: Man=320; break;
    default: Man=561;break;
     } break;
  case 580: EndSprite(5);break;
  case 600: Man=0;break;

  default: break;

}

if (++r%15==0) Water();Man++;
if (++loop==250) {loop=0;
SetAPen(my_window->RPort,0);
RectFill(my_window->RPort,217,104,319,112);
SetAPen(my_window->RPort,22);Brick=strlen(Talk2[Line]);
Move(my_window->RPort,272-(Brick<<2),110);
Text(my_window->RPort,Talk2[Line],Brick);
if (++Line==17) break;}
 }
my_second_item.Flags=ITEMTEXT|ITEMENABLED|COMMSEQ|HIGHCOMP;
Lives=0;PlayerX=269;PlayerY=118;return;} 

 else

     {/* Render Level */Brick=(WorldNumber%10)*8;
ClipBlit( &my_rast_port, 152, 0, &my_rast_port, ImageBuffer[0], 0, 8,8, 0xC0 );
pWorld=LoadWorld(WorldNumber-1);
loop=Boxes=0;BlockX=80;BlockY=40;
do {
BlockX+=8; if (BlockX==216) {BlockY+=8;BlockX=88;}
CharBuffer=*pWorld;
switch (CharBuffer) {
case '@': ClipBlit( &my_rast_port, Brick, 0, my_window->RPort, BlockX, BlockY, 8,8, 0xC0 );break;
case 'G': ClipBlit( &my_rast_port, 152, 0, my_window->RPort, BlockX, BlockY, 8,8, 0xC0 );break;
case 'C': ClipBlit( &my_rast_port, 176, 0, my_window->RPort, BlockX, BlockY, 8,8, 0xC0 );break;
case 'B': ClipBlit( &my_rast_port, 160, 0, my_window->RPort, BlockX, BlockY, 8,8, 0xC0 );Boxes++;break;
case 'F': ClipBlit( &my_rast_port, 168, 0, my_window->RPort, BlockX, BlockY, 8,8, 0xC0 );break;
case 'P': ClipBlit( &my_rast_port, 152, 0, my_window->RPort, BlockX, BlockY, 8,8, 0xC0 );CharBuffer='G';
wx=loop%16;wy=loop/16;PlayerX=BlockX;PlayerY=BlockY;break;
default: break;
}

WorldBuffer[loop]=CharBuffer;
pWorld++;
}while (++loop!=224);
NumberString[0]='0'+WorldNumber/100;
NumberString[1]='0'+(WorldNumber%100)/10;
NumberString[2]='0'+WorldNumber%10;
SetAPen( my_window->RPort, 13);
Move (my_window->RPort, 115,20);
Text (my_window->RPort, "Stage ",6);
Text (my_window->RPort, &NumberString,3);
Move (my_window->RPort, 29,228);
NumberString[0]=NumberString[1]=NumberString[2]=NumberString[3]='0';
SetAPen( my_window->RPort,11);
Text (my_window->RPort, "Moves ",6);
Text (my_window->RPort, &NumberString,4);
SetAPen( my_window->RPort, 9);
Text (my_window->RPort, "  Pushes ",9);
Text (my_window->RPort, &NumberString,4);
SetAPen( my_window->RPort,21);
NumberString[0]='0'+Lives/100;
NumberString[1]='0'+(Lives%100)/10;
NumberString[2]='0'+Lives%10;
Text (my_window->RPort, "  Lives ",8);
Text (my_window->RPort, &NumberString,3);
WorldMoves=WorldPushes=BufferPointer=LevelCompleteFlag=0;
WaitTOF();
LoadRGB32(&my_screen->ViewPort,BoxWorldPaletteRGB32);
if (!ReplayFlag) if (Music) StartSong((WorldNumber%10)+1);
Delay(3);SetAPen(my_window->RPort,23);WaitTOF();
WritePixel(my_window->RPort, PlayerX+1, PlayerY+7);
WritePixel(my_window->RPort, PlayerX+2, PlayerY+7);
WritePixel(my_window->RPort, PlayerX+5, PlayerY+7);
WritePixel(my_window->RPort, PlayerX+6, PlayerY+7);
Delay(1);SetAPen(my_window->RPort,14);WaitTOF();
WritePixel(my_window->RPort, PlayerX+1, PlayerY+5);
WritePixel(my_window->RPort, PlayerX+6, PlayerY+5);
SetAPen(my_window->RPort,1);
WritePixel(my_window->RPort, PlayerX+3, PlayerY+5);
WritePixel(my_window->RPort, PlayerX+4, PlayerY+5);
Delay(1);SetAPen(my_window->RPort,14);WaitTOF();
WritePixel(my_window->RPort, PlayerX+3, PlayerY+3);
WritePixel(my_window->RPort, PlayerX+4, PlayerY+3);
Delay(1);WaitTOF();
RectFill(my_window->RPort, PlayerX+2, PlayerY+1,PlayerX+5,PlayerY+1);
Delay(1);SetAPen(my_window->RPort,1);WaitTOF();
RectFill(my_window->RPort, PlayerX+2, PlayerY+6,PlayerX+5,PlayerY+6);
Delay(1);WaitTOF();
RectFill(my_window->RPort, PlayerX+2, PlayerY+4,PlayerX+5,PlayerY+4);
Delay(1);SetAPen(my_window->RPort,14);WaitTOF();
RectFill(my_window->RPort, PlayerX+2, PlayerY+2,PlayerX+5,PlayerY+2);
Delay(1);SetAPen(my_window->RPort,6);WaitTOF();
WritePixel(my_window->RPort, PlayerX+3, PlayerY);
WritePixel(my_window->RPort, PlayerX+4, PlayerY);
ReplayFlag=TRUE;
my_third_item.Flags=ITEMTEXT|ITEMENABLED|COMMSEQ|HIGHCOMP;
 }
}

BOOL HallOfFame(){
WaitTOF();LoadRGB32(&my_screen->ViewPort,BlackRGB32);
SetRast(my_window->RPort,0);SetAPen(my_window->RPort,21);
Move(my_window->RPort,22,20);Text(my_window->RPort,"Stage ",6);
NumberString[0]='0'+WorldNumber/100;NumberString[1]='0'+(WorldNumber%100)/10;
NumberString[2]='0'+WorldNumber%10;Text(my_window->RPort,&NumberString,3);
SetAPen(my_window->RPort,10);Text(my_window->RPort," Pushes ",8);
sprintf((TEXT *) pText,"%d",(int) TotalPushes);
Text(my_window->RPort,pText,strlen(pText));
SetAPen(my_window->RPort,11);Text(my_window->RPort," Moves ",7);
sprintf((TEXT *) pText,"%d",(int) TotalMoves);
Text(my_window->RPort,pText,strlen(pText));

for (i=18;i!=306;i+=8){
ClipBlit( &my_rast_port, 8, 0, my_window->RPort, i, 38, 8,8, 0xC0 );
ClipBlit( &my_rast_port, 8, 0, my_window->RPort, i, 246, 8,8, 0xC0 );
}

for (j=46;j!=246;j+=8){
ClipBlit( &my_rast_port, 8, 0, my_window->RPort, 18, j, 8,8, 0xC0 );
ClipBlit( &my_rast_port, 8, 0, my_window->RPort, 298,j, 8,8, 0xC0 );
}

for (i=26;i!=298;i+=8) for (j=46;j!=246;j+=8)
ClipBlit( &my_rast_port, 152, 0, my_window->RPort, i, j, 8,8, 0xC0 );

DrawFames();

LoadFlag=FALSE;
if ((WorldNumber>HiNames[9].WorldN) || (WorldNumber==HiNames[9].WorldN && ((TotalPushes*3+TotalMoves)<
   (HiNames[9].ToTalPushes*3+HiNames[9].TotalMoVes)))) LoadFlag=TRUE;

WaitTOF();
LoadRGB32(&my_screen->ViewPort,BoxWorldPaletteRGB32);

if (LoadFlag == TRUE) {
 SetAPen(my_window->RPort,22);Move(my_window->RPort,52,34);
 WaitTOF();
 Text(my_window->RPort,"Enter Your Name -> .........",28);
 SetAPen(my_window->RPort,6);ModifyIDCMP(my_window, MENUPICK|VANILLAKEY);
 loop=0;HiNames[0].Name[0]='M';HiNames[0].Name[1]='r';
        HiNames[0].Name[2]='.';HiNames[0].Name[3]='E';
        HiNames[0].Name[4]='n';HiNames[0].Name[5]='t';
        HiNames[0].Name[6]='e';HiNames[0].Name[7]='r';
 BlockX=204;BlockY=0;
 while (close == FALSE){
  WaitTOF();
  Move(my_window->RPort,BlockX,34);Text(my_window->RPort,".",1);
   while(my_message = (struct IntuiMessage *) GetMsg(my_window->UserPort))
    {CheckClass=my_message->Class;CheckCode=my_message->Code;
    ReplyMsg( my_message );/* Work done. Reply. */}

 if(CheckClass == MENUPICK)
  { if (CheckCode == NEW_GAME) {Lives=3;ReplayFlag=TotalPushes=TotalMoves=LoadFlag=CheckCode=0;World(WorldNumber=1);
          ModifyIDCMP(my_window, MENUPICK|RAWKEY);return FALSE;} /* New Game */
    if (CheckCode == LOADGAME) {LoadFlag=TRUE;CheckClass=ReplayFlag=0;
            if (SaveFile=fopen("BoxWorld.sav","rb")) {
            fseek(SaveFile,sizeof(ModeID),SEEK_SET);
            fread(&WorldNumber,sizeof(WorldNumber),1,SaveFile);
            fclose(SaveFile);} else WorldNumber=1;
            if (WorldNumber<2 || WorldNumber>WORLDS) {WorldNumber=1;
            LoadFlag=FALSE;}Lives=3;World(WorldNumber);
            ModifyIDCMP(my_window, MENUPICK|RAWKEY);return FALSE;}

    if (CheckCode == INFOITEM){    /* About */
                      AutoRequest( my_window, &my_body_text, NULL,
                      &my_ok_text, NULL, NULL, 220, 102);}
    if (CheckCode == QUITGAME) return TRUE; /* Quit */
   }
if(CheckClass == VANILLAKEY) {
    if (CheckCode==13 || CheckCode==27) break;
    if ((CheckCode>64 && CheckCode<123) || CheckCode==32)
    {HiNames[0].Name[BlockY++]=NumberString[0]=CheckCode;
     Move(my_window->RPort,BlockX,34);
     Text(my_window->RPort,NumberString,1);
     HiNames[0].Name[BlockY]=0;BlockX+=8;}
   }
  if ((CheckCode==8 || CheckCode==127) && BlockY>0) {BlockY--;SetAPen(my_window->RPort,22);
    Move(my_window->RPort,BlockX,34);
    Text(my_window->RPort,".",1);SetAPen(my_window->RPort,6);
       BlockX-=8;HiNames[0].Name[BlockY]=0;
    }
CheckCode=0;
  if (++loop>7279 || BlockY==9) break;
}
HiNames[0].Name[strlen(HiNames[0].Name)]=0;
HiNames[9].WorldN=WorldNumber;
HiNames[9].ToTalPushes=TotalPushes;
HiNames[9].TotalMoVes=TotalMoves;
strcpy(HiNames[9].Name,HiNames[0].Name);/* Assume last position for a start.*/

/* Sort the Name in the HighScore table (modified BubbleSort) */
for (i=8;i>0;i--)
{if (WorldNumber>HiNames[i].WorldN || (WorldNumber==HiNames[i].WorldN &&
((TotalPushes*3+TotalMoves)<(HiNames[i].ToTalPushes*3+HiNames[i].TotalMoVes))))
 {strcpy(HiNames[i+1].Name,HiNames[i].Name);
 strcpy(HiNames[i].Name,HiNames[0].Name);HiNames[i+1].WorldN=HiNames[i].WorldN;
 HiNames[i+1].ToTalPushes=HiNames[i].ToTalPushes;
 HiNames[i+1].TotalMoVes=HiNames[i].TotalMoVes;
 HiNames[i].WorldN=WorldNumber;HiNames[i].ToTalPushes=TotalPushes;
 HiNames[i].TotalMoVes=TotalMoves;}}
SetAPen(my_window->RPort,0);
WaitTOF();RectFill(my_window->RPort,53,28,276,36);DrawFames();
ModifyIDCMP(my_window, MENUPICK|RAWKEY);
}

LoadFlag = FALSE;

loop=0;

while( close == FALSE )
  {
    /* As long as we can collect messages successfully we stay in the */
    /* while-loop: */
WaitTOF();
  while(my_message = (struct IntuiMessage *) GetMsg(my_window->UserPort))
   {CheckClass=my_message->Class;CheckCode=my_message->Code;
    ReplyMsg( my_message );/* Work done. Reply. */}

if(CheckClass == MENUPICK)
  { if (CheckCode == NEW_GAME) {Lives=3;ReplayFlag=TotalPushes=TotalMoves=CheckCode=0;World(WorldNumber=1);
                           break;} /* New Game */
    if (CheckCode == LOADGAME) {LoadFlag=TRUE;CheckClass=ReplayFlag=0;
            if (SaveFile=fopen("BoxWorld.sav","rb")) {
            fseek(SaveFile,sizeof(ModeID),SEEK_SET);
            fread(&WorldNumber,sizeof(WorldNumber),1,SaveFile);
            fclose(SaveFile);} else WorldNumber=1;
            if (WorldNumber<2 || WorldNumber>WORLDS) {WorldNumber=1;
            LoadFlag=FALSE;}Lives=3;World(WorldNumber);
             return FALSE;}
    if (CheckCode == INFOITEM){    /* About */
                      AutoRequest( my_window, &my_body_text, NULL,
                      &my_ok_text, NULL, NULL, 220, 102);}
    if (CheckCode == QUITGAME) return TRUE; /* Quit */
   }
if(CheckClass == RAWKEY) {
    if (CheckCode==16 || CheckCode==69) return TRUE;
    if (CheckCode==64) {TitleBool=TRUE;CheckClass=0;break;}  /* Space Pressed */
    if (CheckCode==55) if (Music) {StopPlayer();Music=0;} else {Music=1;
   StartSong(0);} /* M key Pressed */
    if (CheckCode==68) loop+=249; /* Return Pressed */
}
CheckClass=0;
if (Joystick() & FIRE) {TitleBool=TRUE;break;}

if (++loop>3500) {TitleBool=TRUE;break;}
  }

return FALSE;

}

int main() /* No arguments */
{

int direction=0;

struct ScreenModeRequester *ScreenRequest;

/* Open the Intuition library: */
  IntuitionBase = (struct IntuitionBase *)
    OpenLibrary( "intuition.library", 0 );
  if( !IntuitionBase )
    exit(-1);
/* Open the Graphics library: */
  GfxBase = (struct GfxBase *)
    OpenLibrary( "graphics.library", 0 );
  if( !GfxBase )
  {
  CloseLibrary( IntuitionBase );
  exit(-1);
  }
/* We will now try to open the screen: */
/* Random seed */
CurrentTime( &ModeID, &ModeID );
srand( (ULONG) ( ModeID)  );

ModeID=0;

/* Open the SaveFile */

if (SaveFile=fopen("BoxWorld.sav","rb")) {
fread(&ModeID,sizeof(ModeID),1,SaveFile);
fseek(SaveFile,sizeof(WorldNumber),SEEK_CUR);
fread(&HiNames,sizeof(HiNames),1,SaveFile);
fclose(SaveFile);}

else 
    if (ScreenRequest=(struct ScreenModeRequester *)AllocAslRequestTags(
                                 ASL_ScreenModeRequest,
                                 ASLSM_TitleText, (ULONG) "Pick 320x256 Screenmode ",
                                 ASLSM_PositiveText, (ULONG) "Ok",
                                 ASLSM_NegativeText, (ULONG) "Cancel",
                                 ASLSM_MinWidth, 320,
                                 ASLSM_MinHeight, 256,
                                 ASLSM_MinDepth, 8,
                                 ASLSM_MaxDepth, 8,
                                 TAG_DONE))
    {
    if (!AslRequestTags(ScreenRequest,    ASLSM_TitleText, (ULONG) "Pick 4Bit 320x256 Screenmode ",
                                 ASLSM_PositiveText, (ULONG) "Ok",
                                 ASLSM_NegativeText, (ULONG) "Cancel",
                                 ASLSM_MinWidth, 320,
                                 ASLSM_MinHeight, 256,
                                 ASLSM_MinDepth, 4,
                                 ASLSM_MaxDepth, 8,
                                 TAG_DONE))
        {printf("Error: Invalid ScreenMode\n");
        CloseLibrary( GfxBase );CloseLibrary( IntuitionBase );exit(-1);
        } else ModeID=ScreenRequest->sm_DisplayID;
    }

 my_screen = (struct Screen *)
 OpenScreenTags( NULL, SA_DisplayID,ModeID,SA_Width,320,
 SA_Height, 256, SA_Depth, DEPTH,
 SA_Colors32, BlackRGB32,
 SA_Font,&my_font,
 SA_ShowTitle,FALSE,
 SA_Title,"BoxWorld",
  TAG_DONE );

  if( !my_screen )
  {
   CloseLibrary( GfxBase );
   CloseLibrary( IntuitionBase );
   exit(-1);
   }

 my_new_window.Screen = my_screen;
 my_window = (struct Window *) OpenWindow( &my_new_window );

if ( !my_window )
  {
    /* Could NOT open the Window! */
    
    /* Close the Intuition Library since we have opened it: */
   CloseScreen( my_screen );
   CloseLibrary( GfxBase );   
   CloseLibrary( IntuitionBase );
   exit(-1);
  }

  /* Prepare spare BitMap: */
  InitBitMap( &my_bit_map, DEPTH, WIDTH, HEIGHT );

  /* Allocate memory for the Raster: */ 
  for( lx = 0; lx < DEPTH; lx++ )
  {
    my_bit_map.Planes[ lx ] = (PLANEPTR) AllocRaster( WIDTH, HEIGHT );
    if( my_bit_map.Planes[ lx ] == NULL ) close=TRUE;
  }

  if (!close)  {InitRastPort( &my_rast_port );
  my_rast_port.BitMap = &my_bit_map;
  DrawImage(&my_rast_port,&BoxWorldGraphics,0,0); /* Set the graphics in the
                                                  spare RastPort.*/ }
if (!close) {SetMenuStrip( my_window, &my_menu );Title();}
if (!close) World(WorldNumber);

  /* Stay in the while loop until the end */
  while( close == FALSE )
  {
/* Game here */

if (TitleBool) {Title();TitleBool=FALSE;if (!close) {ReplayFlag=0;World(WorldNumber);} else break;}
    /* As long as we can collect messages successfully we stay in the */
    /* while-loop: */
WaitTOF();
  while(my_message = (struct IntuiMessage *) GetMsg(my_window->UserPort))
   {
    CheckClass=my_message->Class;
    CheckCode=my_message->Code;
    ReplyMsg( my_message ); /* Work done. Reply. */
   }
if(CheckClass == MENUPICK){
if (CheckCode == LOADGAME) {LoadFlag=TRUE;CheckClass=ReplayFlag=0;
            if (SaveFile=fopen("BoxWorld.sav","rb")) {
            fseek(SaveFile,sizeof(ModeID),SEEK_SET);
            fread(&WorldNumber,sizeof(WorldNumber),1,SaveFile);
            fclose(SaveFile);} else WorldNumber=1;
            if (WorldNumber<2 || WorldNumber>WORLDS) {WorldNumber=1;
            LoadFlag=FALSE;}Lives=3;
             World(WorldNumber);}

    if (CheckCode == QUITGAME) close=TRUE;
    if (CheckCode == INFOITEM)
        {AutoRequest( my_window, &my_body_text, NULL,
         &my_ok_text, NULL, NULL, 220, 102);}
    if (CheckCode == SAVEGAME) {
       if (SaveFile=fopen("BoxWorld.sav","wb")) {
       fwrite(&ModeID,sizeof(ModeID),1,SaveFile);
       fwrite(&WorldNumber,sizeof(WorldNumber),1,SaveFile);
       fwrite(&HiNames,sizeof(HiNames),1,SaveFile);
       fclose(SaveFile);}} /* Save Game */
    if (CheckCode == NEW_GAME){Lives=3;ReplayFlag=TotalPushes=TotalMoves=CheckClass=LoadFlag=0;World(WorldNumber=1);}
                          } /* New Game */

if(CheckClass == RAWKEY) {
    if (CheckCode==16 || CheckCode==69) {Lives=0;direction=GAMEOVER;}
    if (CheckCode==78) direction=RIGHT;
    if (CheckCode==79) direction=LEFT;
    if (CheckCode==77) direction=DOWN;
    if (CheckCode==76) direction=UP;
    if (CheckCode==55) if (Music) {StopPlayer();Music=0;} else {Music=1;
   StartSong((WorldNumber%10)+1);} /* M pressed */

#ifdef TESTVERSION
    if (CheckCode==64) {ReplayFlag=0;Lives++;World(++WorldNumber);}  /* Space Pressed */
#endif

    if (CheckCode==19) direction=DEAD;}

CheckClass=Joystick();

if (CheckClass & RIGHT ) direction=RIGHT;
if (CheckClass & LEFT  ) direction=LEFT;
if (CheckClass & DOWN  ) direction=DOWN;
if (CheckClass & UP    ) direction=UP;

CheckClass=0;

Line=wy*16+wx;

if (direction==LEFT) {
if (WorldBuffer[Line-1]=='G' || WorldBuffer[Line-1]=='C') {PlayerX-=8;
ClipBlit( my_window->RPort, PlayerX, PlayerY, &my_rast_port, ImageBuffer[!BufferPointer], 0, 8,8, 0xC0 );
wx--;BlockX=6;
for (loop=8;loop!=0;loop--) {WaitTOF();
ClipBlit( &my_rast_port, ImageBuffer[!BufferPointer], 0, my_window->RPort, PlayerX, PlayerY, 8,8, 0xC0 );
ClipBlit( &my_rast_port, ImageBuffer[BufferPointer], 0, my_window->RPort, PlayerX+8, PlayerY, 8,8, 0xC0 );
DrawSprite(BlockX,PlayerX+loop-1,PlayerY);if (++BlockX==9) BlockX=6;}
BufferPointer=!BufferPointer;Moved();}

if (WorldBuffer[Line-1]=='B')
  {if (WorldBuffer[Line-2]=='G') {
    WorldBuffer[Line-1]='G';WorldBuffer[Line-2]='B';wx--;
    ClipBlit( &my_rast_port, 152, 0, &my_rast_port, ImageBuffer[!BufferPointer], 0, 8,8, 0xC0 );
BlockX=0;WaitTOF();
    ClipBlit( &my_rast_port, ImageBuffer[BufferPointer], 0, my_window->RPort, PlayerX, PlayerY, 8,8, 0xC0 );
    DrawPSprite(2,PlayerX-2,PlayerY);
 for (loop=2;loop!=9;)
   {WaitTOF();
    ClipBlit( &my_rast_port, ImageBuffer[BufferPointer], 0, my_window->RPort, PlayerX, PlayerY, 8,8, 0xC0 );
    ScrollRaster(my_window->RPort,1,0,PlayerX-loop-7,PlayerY,PlayerX-loop,PlayerY+7);
    ClipBlit( &my_rast_port, ImageBuffer[!BufferPointer]+(9-loop), 0, my_window->RPort, PlayerX-(loop-1), PlayerY, loop-1,8, 0xC0 );
    DrawPSprite(BlockX,PlayerX-(++loop),PlayerY);
    if (++BlockX==3) BlockX=0;}

    WaitTOF();
    ScrollRaster(my_window->RPort,1,0,PlayerX-16,PlayerY,PlayerX-9,PlayerY+7);
    Moved();Push();BufferPointer=!BufferPointer;PlayerX-=8;}

   if (WorldBuffer[Line-2]=='C') {WorldBuffer[Line-1]='G';WorldBuffer[Line-2]='F';wx--;
    ClipBlit( &my_rast_port, 152, 0, &my_rast_port, ImageBuffer[!BufferPointer], 0, 8,8, 0xC0 );
BlockX=0;WaitTOF();
    ClipBlit( &my_rast_port, ImageBuffer[BufferPointer], 0, my_window->RPort, PlayerX, PlayerY, 8,8, 0xC0 );
    DrawPSprite(2,PlayerX-2,PlayerY);
 for (loop=2;loop!=9;)
   {WaitTOF();
    ClipBlit( &my_rast_port, ImageBuffer[BufferPointer], 0, my_window->RPort, PlayerX, PlayerY, 8,8, 0xC0 );
    if (loop==6) ClipBlit( &my_rast_port, 168, 0, my_window->RPort, PlayerX-13, PlayerY, 7,8, 0xC0 ); else
    ScrollRaster(my_window->RPort,1,0,PlayerX-loop-7,PlayerY,PlayerX-loop,PlayerY+7);
    ClipBlit( &my_rast_port, ImageBuffer[!BufferPointer]+(9-loop), 0, my_window->RPort, PlayerX-(loop-1), PlayerY, loop-1,8, 0xC0 );
    DrawPSprite(BlockX,PlayerX-(++loop),PlayerY);
    if (++BlockX==3) BlockX=0;}

    WaitTOF();
    ScrollRaster(my_window->RPort,1,0,PlayerX-16,PlayerY,PlayerX-9,PlayerY+7);
    Moved();Push();BufferPointer=!BufferPointer;PlayerX-=8;
    Boxes--;if (!Boxes) LevelCompleteFlag=TRUE;}
   }
if (WorldBuffer[Line-1]=='F')
  {if (WorldBuffer[Line-2]=='G')
    {WorldBuffer[Line-1]='C';WorldBuffer[Line-2]='B';wx--;
    ClipBlit( &my_rast_port, 176, 0, &my_rast_port, ImageBuffer[!BufferPointer], 0, 8,8, 0xC0 );

BlockX=0;WaitTOF();
    ClipBlit( &my_rast_port, ImageBuffer[BufferPointer], 0, my_window->RPort, PlayerX, PlayerY, 8,8, 0xC0 );
    DrawPSprite(2,PlayerX-2,PlayerY);
 for (loop=2;loop!=9;)
   {WaitTOF();
    ClipBlit( &my_rast_port, ImageBuffer[BufferPointer], 0, my_window->RPort, PlayerX, PlayerY, 8,8, 0xC0 );
    if (loop==6) ClipBlit( &my_rast_port, 160, 0, my_window->RPort, PlayerX-13, PlayerY, 7,8, 0xC0 ); else
    ScrollRaster(my_window->RPort,1,0,PlayerX-loop-7,PlayerY,PlayerX-loop,PlayerY+7);
    ClipBlit( &my_rast_port, ImageBuffer[!BufferPointer]+(9-loop), 0, my_window->RPort, PlayerX-(loop-1), PlayerY, loop-1,8, 0xC0 );
    DrawPSprite(BlockX,PlayerX-(++loop),PlayerY);
    if (++BlockX==3) BlockX=0;}
    WaitTOF();
    ScrollRaster(my_window->RPort,1,0,PlayerX-16,PlayerY,PlayerX-9,PlayerY+7);
    Moved();Push();BufferPointer=!BufferPointer;PlayerX-=8;Boxes++;}

   if (WorldBuffer[Line-2]=='C')
    {WorldBuffer[Line-1]='C';WorldBuffer[Line-2]='F';wx--;
    ClipBlit( &my_rast_port, 176, 0, &my_rast_port, ImageBuffer[!BufferPointer], 0, 8,8, 0xC0 );
BlockX=0;WaitTOF();
    ClipBlit( &my_rast_port, ImageBuffer[BufferPointer], 0, my_window->RPort, PlayerX, PlayerY, 8,8, 0xC0 );
    DrawPSprite(2,PlayerX-2,PlayerY);
 for (loop=2;loop!=9;)
   {WaitTOF();
    ClipBlit( &my_rast_port, ImageBuffer[BufferPointer], 0, my_window->RPort, PlayerX, PlayerY, 8,8, 0xC0 );
    ScrollRaster(my_window->RPort,1,0,PlayerX-loop-7,PlayerY,PlayerX-loop,PlayerY+7);
    ClipBlit( &my_rast_port, ImageBuffer[!BufferPointer]+(9-loop), 0, my_window->RPort, PlayerX-(loop-1), PlayerY, loop-1,8, 0xC0 );
    DrawPSprite(BlockX,PlayerX-(++loop),PlayerY);if (++BlockX==3) BlockX=0;}

    WaitTOF();
    ScrollRaster(my_window->RPort,1,0,PlayerX-16,PlayerY,PlayerX-9,PlayerY+7);
    Moved();Push();BufferPointer=!BufferPointer;PlayerX-=8;}
   }
  }

if (direction==RIGHT) {
if (WorldBuffer[Line+1]=='G' || WorldBuffer[Line+1]=='C') {
ClipBlit( my_window->RPort, PlayerX+8, PlayerY, &my_rast_port, ImageBuffer[!BufferPointer], 0, 8,8, 0xC0 );
wx++;BlockX=9; for (loop=0;loop!=8;loop++) {WaitTOF();
ClipBlit( &my_rast_port, ImageBuffer[BufferPointer], 0, my_window->RPort, PlayerX, PlayerY, 8,8, 0xC0 );
ClipBlit( &my_rast_port, ImageBuffer[!BufferPointer], 0, my_window->RPort, PlayerX+8, PlayerY, 8,8, 0xC0 );
DrawSprite(BlockX,PlayerX+loop,PlayerY);if (++BlockX==12) BlockX=9;}
BufferPointer=!BufferPointer;Moved();PlayerX+=8;}

if (WorldBuffer[Line+1]=='B') 
  {if (WorldBuffer[Line+2]=='G') {WorldBuffer[Line+1]='G';WorldBuffer[Line+2]='B';wx++;PlayerX+=8;
    ClipBlit( &my_rast_port, 152, 0, &my_rast_port, ImageBuffer[!BufferPointer], 0, 8,8, 0xC0 );
BlockX=3;WaitTOF();
    ClipBlit( &my_rast_port, ImageBuffer[BufferPointer], 0, my_window->RPort, PlayerX-8, PlayerY, 8,8, 0xC0 );
    DrawPSprite(5,PlayerX-7,PlayerY);
 for (loop=2;loop!=9;)
   {WaitTOF();
    ClipBlit( &my_rast_port, ImageBuffer[BufferPointer], 0, my_window->RPort, PlayerX-8, PlayerY, 8,8, 0xC0 );
    ScrollRaster(my_window->RPort,-1,0,PlayerX+(loop-2),PlayerY,PlayerX+loop+5,PlayerY+7);
    ClipBlit( &my_rast_port, ImageBuffer[!BufferPointer], 0, my_window->RPort, PlayerX, PlayerY, loop-1,8, 0xC0 );
    DrawPSprite(BlockX,PlayerX-9+(++loop),PlayerY);
    if (++BlockX==6) BlockX=3;}
    WaitTOF();
    ClipBlit( &my_rast_port, 160, 0, my_window->RPort, PlayerX+8, PlayerY, 8,8, 0xC0 );
    Moved();Push();BufferPointer=!BufferPointer;}

   if (WorldBuffer[Line+2]=='C') {
    WorldBuffer[Line+1]='G';WorldBuffer[Line+2]='F';PlayerX+=8;wx++;
    ClipBlit( &my_rast_port, 152, 0, &my_rast_port, ImageBuffer[!BufferPointer], 0, 8,8, 0xC0 );
BlockX=3;WaitTOF();
    ClipBlit( &my_rast_port, ImageBuffer[BufferPointer], 0, my_window->RPort, PlayerX-8, PlayerY, 8,8, 0xC0 );
    DrawPSprite(5,PlayerX-7,PlayerY); for (loop=2;loop!=9;)
   {WaitTOF();
    ClipBlit( &my_rast_port, ImageBuffer[BufferPointer], 0, my_window->RPort, PlayerX-8, PlayerY, 8,8, 0xC0 );
    if (loop==6) ClipBlit( &my_rast_port, 168, 0, my_window->RPort, PlayerX+5, PlayerY, 7,8, 0xC0 ); else
    ScrollRaster(my_window->RPort,-1,0,PlayerX+(loop-2),PlayerY,PlayerX+loop+5,PlayerY+7);
    ClipBlit( &my_rast_port, ImageBuffer[!BufferPointer], 0, my_window->RPort, PlayerX, PlayerY, loop-1,8, 0xC0 );
    DrawPSprite(BlockX,PlayerX-9+(++loop),PlayerY);
    if (++BlockX==6) BlockX=3;}
    WaitTOF();
    ClipBlit( &my_rast_port, 168, 0, my_window->RPort, PlayerX+8, PlayerY, 8,8, 0xC0 );
    Moved();Push();BufferPointer=!BufferPointer;Boxes--;if (!Boxes) LevelCompleteFlag=TRUE;}
   }
if (WorldBuffer[Line+1]=='F')
   {if (WorldBuffer[Line+2]=='G') 
    {WorldBuffer[Line+1]='C';WorldBuffer[Line+2]='B';PlayerX+=8;wx++;
    ClipBlit( &my_rast_port, 176, 0, &my_rast_port, ImageBuffer[!BufferPointer], 0, 8,8, 0xC0 );
BlockX=3;WaitTOF();
    ClipBlit( &my_rast_port, ImageBuffer[BufferPointer], 0, my_window->RPort, PlayerX-8, PlayerY, 8,8, 0xC0 );
    DrawPSprite(5,PlayerX-7,PlayerY); for (loop=2;loop!=9;)
   {WaitTOF();
    ClipBlit( &my_rast_port, ImageBuffer[BufferPointer], 0, my_window->RPort, PlayerX-8, PlayerY, 8,8, 0xC0 );
    if (loop==6) ClipBlit( &my_rast_port, 160, 0, my_window->RPort, PlayerX+5, PlayerY, 7,8, 0xC0 ); else
    ScrollRaster(my_window->RPort,-1,0,PlayerX+(loop-2),PlayerY,PlayerX+loop+5,PlayerY+7);
    ClipBlit( &my_rast_port, ImageBuffer[!BufferPointer], 0, my_window->RPort, PlayerX, PlayerY, loop-1,8, 0xC0 );
    DrawPSprite(BlockX,PlayerX-9+(++loop),PlayerY);
    if (++BlockX==6) BlockX=3;}
    WaitTOF();
    ClipBlit( &my_rast_port, 160, 0, my_window->RPort, PlayerX+8, PlayerY, 8,8, 0xC0 );
    Moved();Push();BufferPointer=!BufferPointer;Boxes++;
    }
if (WorldBuffer[Line+2]=='C')
   {WorldBuffer[Line+1]='C';WorldBuffer[Line+2]='F';PlayerX+=8;wx++;
    ClipBlit( &my_rast_port, 176, 0, &my_rast_port, ImageBuffer[!BufferPointer], 0, 8,8, 0xC0 );
BlockX=3;WaitTOF();
    ClipBlit( &my_rast_port, ImageBuffer[BufferPointer], 0, my_window->RPort, PlayerX-8, PlayerY, 8,8, 0xC0 );
    DrawPSprite(5,PlayerX-7,PlayerY);
 for (loop=2;loop!=9;)
   {WaitTOF();
    ClipBlit( &my_rast_port, ImageBuffer[BufferPointer], 0, my_window->RPort, PlayerX-8, PlayerY, 8,8, 0xC0 );
    ScrollRaster(my_window->RPort,-1,0,PlayerX+(loop-2),PlayerY,PlayerX+loop+5,PlayerY+7);
    ClipBlit( &my_rast_port, ImageBuffer[!BufferPointer], 0, my_window->RPort, PlayerX, PlayerY, loop-1,8, 0xC0 );
    DrawPSprite(BlockX,PlayerX-9+(++loop),PlayerY);
    if (++BlockX==6) BlockX=3;}
    WaitTOF();
    ClipBlit( &my_rast_port, 168, 0, my_window->RPort, PlayerX+8, PlayerY, 8,8, 0xC0 );
    Moved();Push();BufferPointer=!BufferPointer;}
   }
  }

if (direction==UP) {
if (WorldBuffer[Line-16]=='G' || WorldBuffer[Line-16]=='C') {PlayerY-=8;
ClipBlit( my_window->RPort, PlayerX, PlayerY, &my_rast_port, ImageBuffer[!BufferPointer], 0, 8,8, 0xC0 );
wy--;BlockX=12;
for (loop=8;loop!=0;loop--) {WaitTOF();
ClipBlit( &my_rast_port, ImageBuffer[!BufferPointer], 0, my_window->RPort, PlayerX, PlayerY, 8,8, 0xC0 );
ClipBlit( &my_rast_port, ImageBuffer[BufferPointer], 0, my_window->RPort, PlayerX, PlayerY+8, 8,8, 0xC0 );
DrawSprite(BlockX,PlayerX,PlayerY+loop-1);if (++BlockX==15) BlockX=12;}
BufferPointer=!BufferPointer;Moved();}
if (WorldBuffer[Line-16]=='B') 
   {if (WorldBuffer[Line-32]=='G') {WorldBuffer[Line-16]='G';WorldBuffer[Line-32]='B';wy--;
    ClipBlit( &my_rast_port, 152, 0, &my_rast_port, ImageBuffer[!BufferPointer], 0, 8,8, 0xC0 );
 BlockX=6;WaitTOF();
    ClipBlit( &my_rast_port, ImageBuffer[BufferPointer], 0, my_window->RPort, PlayerX, PlayerY, 8,8, 0xC0 );
    DrawPSprite(8,PlayerX,PlayerY-1);
 for (loop=2;loop!=9;)
   {WaitTOF();
    ClipBlit( &my_rast_port, ImageBuffer[BufferPointer], 0, my_window->RPort, PlayerX, PlayerY, 8,8, 0xC0 );
    ScrollRaster(my_window->RPort,0,1,PlayerX,PlayerY-loop-7,PlayerX+7,PlayerY-loop);
    ClipBlit( &my_rast_port, ImageBuffer[!BufferPointer], 0+(9-loop), my_window->RPort, PlayerX, PlayerY-(loop-1), 8,loop-1, 0xC0 );
    DrawPSprite(BlockX,PlayerX,PlayerY-(loop++));
    if (++BlockX==9) BlockX=6;}

    WaitTOF();
    ScrollRaster(my_window->RPort,0,1,PlayerX,PlayerY-16,PlayerX+7,PlayerY-9);
    Moved();Push();PlayerY-=8;BufferPointer=!BufferPointer;}

  if (WorldBuffer[Line-32]=='C') {WorldBuffer[Line-16]='G';WorldBuffer[Line-32]='F';wy--;
    ClipBlit( &my_rast_port, 152, 0, &my_rast_port, ImageBuffer[!BufferPointer], 0, 8,8, 0xC0 );
 BlockX=6;WaitTOF();
    ClipBlit( &my_rast_port, ImageBuffer[BufferPointer], 0, my_window->RPort, PlayerX, PlayerY, 8,8, 0xC0 );
    DrawPSprite(8,PlayerX,PlayerY-1);
 for (loop=2;loop!=9;)
   {WaitTOF();
    ClipBlit( &my_rast_port, ImageBuffer[BufferPointer], 0, my_window->RPort, PlayerX, PlayerY, 8,8, 0xC0 );
    if (loop==6) ClipBlit( &my_rast_port, 168, 0, my_window->RPort, PlayerX, PlayerY-loop-7, 8,7, 0xC0 ); else
    ScrollRaster(my_window->RPort,0,1,PlayerX,PlayerY-loop-7,PlayerX+7,PlayerY-loop);
    ClipBlit( &my_rast_port, ImageBuffer[!BufferPointer], 0+(9-loop), my_window->RPort, PlayerX, PlayerY-(loop-1), 8,loop-1, 0xC0 );
    DrawPSprite(BlockX,PlayerX,PlayerY-(loop++));
    if (++BlockX==9) BlockX=6;}
    WaitTOF();
    ScrollRaster(my_window->RPort,0,1,PlayerX,PlayerY-16,PlayerX+7,PlayerY-9);
    Moved();Push();PlayerY-=8;
    BufferPointer=!BufferPointer;Boxes--;if (!Boxes) LevelCompleteFlag=TRUE;}
   }
if (WorldBuffer[Line-16]=='F')
   {if (WorldBuffer[Line-32]=='G')
    {WorldBuffer[Line-16]='C';WorldBuffer[Line-32]='B';wy--;
    ClipBlit( &my_rast_port, 176, 0, &my_rast_port, ImageBuffer[!BufferPointer], 0, 8,8, 0xC0 );
 BlockX=6;WaitTOF();
    ClipBlit( &my_rast_port, ImageBuffer[BufferPointer], 0, my_window->RPort, PlayerX, PlayerY, 8,8, 0xC0 );
    DrawPSprite(8,PlayerX,PlayerY-1);
 for (loop=2;loop!=9;)
   {WaitTOF();
    ClipBlit( &my_rast_port, ImageBuffer[BufferPointer], 0, my_window->RPort, PlayerX, PlayerY, 8,8, 0xC0 );
    if (loop==6) ClipBlit( &my_rast_port, 160, 0, my_window->RPort, PlayerX, PlayerY-loop-7, 8,7, 0xC0 ); else
    ScrollRaster(my_window->RPort,0,1,PlayerX,PlayerY-loop-7,PlayerX+7,PlayerY-loop);
    ClipBlit( &my_rast_port, ImageBuffer[!BufferPointer], 0+(9-loop), my_window->RPort, PlayerX, PlayerY-(loop-1), 8,loop-1, 0xC0 );
    DrawPSprite(BlockX,PlayerX,PlayerY-(loop++));
    if (++BlockX==9) BlockX=6;}
    WaitTOF();
    ScrollRaster(my_window->RPort,0,1,PlayerX,PlayerY-16,PlayerX+7,PlayerY-9);
    Moved();Push();PlayerY-=8;
    BufferPointer=!BufferPointer;Boxes++;
    }
if (WorldBuffer[Line-32]=='C')
   {WorldBuffer[Line-16]='C';WorldBuffer[Line-32]='F';wy--;
    ClipBlit( &my_rast_port, 176, 0, &my_rast_port, ImageBuffer[!BufferPointer], 0, 8,8, 0xC0 );
 BlockX=6;WaitTOF();
    ClipBlit( &my_rast_port, ImageBuffer[BufferPointer], 0, my_window->RPort, PlayerX, PlayerY, 8,8, 0xC0 );
    DrawPSprite(8,PlayerX,PlayerY-1);
 for (loop=2;loop!=9;)
   {WaitTOF();
    ClipBlit( &my_rast_port, ImageBuffer[BufferPointer], 0, my_window->RPort, PlayerX, PlayerY, 8,8, 0xC0 );
    ScrollRaster(my_window->RPort,0,1,PlayerX,PlayerY-loop-7,PlayerX+7,PlayerY-loop);
    ClipBlit( &my_rast_port, ImageBuffer[!BufferPointer], 0+(9-loop), my_window->RPort, PlayerX, PlayerY-(loop-1), 8,loop-1, 0xC0 );
    DrawPSprite(BlockX,PlayerX,PlayerY-(loop++));
    if (++BlockX==9) BlockX=6;}
    WaitTOF();
    ScrollRaster(my_window->RPort,0,1,PlayerX,PlayerY-16,PlayerX+7,PlayerY-9);
    Moved();Push();PlayerY-=8;BufferPointer=!BufferPointer;}
   }
  }

if (direction==DOWN) {
if (WorldBuffer[Line+16]=='G' || WorldBuffer[Line+16]=='C') {
ClipBlit( my_window->RPort, PlayerX, PlayerY+8, &my_rast_port, ImageBuffer[!BufferPointer], 0, 8,8, 0xC0 );
wy++;BlockX=15;
for (loop=1;loop!=9;loop++) {WaitTOF();
ClipBlit( &my_rast_port, ImageBuffer[BufferPointer], 0, my_window->RPort, PlayerX, PlayerY, 8,8, 0xC0 );
ClipBlit( &my_rast_port, ImageBuffer[!BufferPointer], 0, my_window->RPort, PlayerX, PlayerY+8, 8,8, 0xC0 );
DrawSprite(BlockX,PlayerX,PlayerY+loop);if (++BlockX==18) BlockX=15;}
BufferPointer=!BufferPointer;Moved();PlayerY+=8;}

if (WorldBuffer[Line+16]=='B') 
   {if (WorldBuffer[Line+32]=='G') {WorldBuffer[Line+16]='G';WorldBuffer[Line+32]='B';PlayerY+=8;wy++;
    ClipBlit( &my_rast_port, 152, 0, &my_rast_port, ImageBuffer[!BufferPointer], 0, 8,8, 0xC0 );
 BlockX=9;WaitTOF();
    ClipBlit( &my_rast_port, ImageBuffer[BufferPointer], 0, my_window->RPort, PlayerX, PlayerY-8, 8,8, 0xC0 );
    DrawPSprite(11,PlayerX,PlayerY-7);
 for (loop=2;loop!=9;)
   {WaitTOF();
    ClipBlit( &my_rast_port, ImageBuffer[BufferPointer], 0, my_window->RPort, PlayerX, PlayerY-8, 8,8, 0xC0 );
    ScrollRaster(my_window->RPort,0,-1,PlayerX,PlayerY+(loop-2),PlayerX+7,PlayerY+loop+5);
    ClipBlit( &my_rast_port, ImageBuffer[!BufferPointer], 0, my_window->RPort, PlayerX, PlayerY, 8,loop-1, 0xC0 );
    DrawPSprite(BlockX,PlayerX,PlayerY-9+(++loop));
    if (++BlockX==12) BlockX=9;}
    WaitTOF();
    ClipBlit( &my_rast_port, 160, 0, my_window->RPort, PlayerX, PlayerY+8, 8,8, 0xC0 );
    Moved();Push();BufferPointer=!BufferPointer;}

if (WorldBuffer[Line+32]=='C') {
    WorldBuffer[Line+16]='G';WorldBuffer[Line+32]='F';PlayerY+=8;wy++;
    ClipBlit( &my_rast_port, 152, 0, &my_rast_port, ImageBuffer[!BufferPointer], 0, 8,8, 0xC0 );
 BlockX=9;WaitTOF();
    ClipBlit( &my_rast_port, ImageBuffer[BufferPointer], 0, my_window->RPort, PlayerX, PlayerY-8, 8,8, 0xC0 );
    DrawPSprite(11,PlayerX,PlayerY-7);
 for (loop=2;loop!=9;)
   {WaitTOF();
    ClipBlit( &my_rast_port, ImageBuffer[BufferPointer], 0, my_window->RPort, PlayerX, PlayerY-8, 8,8, 0xC0 );
    if (loop==6) ClipBlit( &my_rast_port, 168, 0, my_window->RPort, PlayerX, PlayerY+(loop-2), 8,7, 0xC0 ); else
    ScrollRaster(my_window->RPort,0,-1,PlayerX,PlayerY+(loop-2),PlayerX+7,PlayerY+loop+5);
    ClipBlit( &my_rast_port, ImageBuffer[!BufferPointer], 0, my_window->RPort, PlayerX, PlayerY, 8,loop-1, 0xC0 );
    DrawPSprite(BlockX,PlayerX,PlayerY-9+(++loop));
    if (++BlockX==12) BlockX=9;}
    WaitTOF();
    ClipBlit( &my_rast_port, 168, 0, my_window->RPort, PlayerX, PlayerY+8, 8,8, 0xC0 );
    Moved();Push();
    BufferPointer=!BufferPointer;Boxes--;if (!Boxes) LevelCompleteFlag=TRUE;}
   }
if (WorldBuffer[Line+16]=='F')
   {if (WorldBuffer[Line+32]=='G') 
    {WorldBuffer[Line+16]='C';WorldBuffer[Line+32]='B';PlayerY+=8;wy++;
    ClipBlit( &my_rast_port, 176, 0, &my_rast_port, ImageBuffer[!BufferPointer], 0, 8,8, 0xC0 );
 BlockX=9;WaitTOF();
    ClipBlit( &my_rast_port, ImageBuffer[BufferPointer], 0, my_window->RPort, PlayerX, PlayerY-8, 8,8, 0xC0 );
    DrawPSprite(11,PlayerX,PlayerY-7);
 for (loop=2;loop!=9;)
   {WaitTOF();
    ClipBlit( &my_rast_port, ImageBuffer[BufferPointer], 0, my_window->RPort, PlayerX, PlayerY-8, 8,8, 0xC0 );
    if (loop==6) ClipBlit( &my_rast_port, 160, 0, my_window->RPort, PlayerX, PlayerY+(loop-2), 8,7, 0xC0 ); else
    ScrollRaster(my_window->RPort,0,-1,PlayerX,PlayerY+(loop-2),PlayerX+7,PlayerY+loop+5);
    ClipBlit( &my_rast_port, ImageBuffer[!BufferPointer], 0, my_window->RPort, PlayerX, PlayerY, 8,loop-1, 0xC0 );
    DrawPSprite(BlockX,PlayerX,PlayerY-9+(++loop));
    if (++BlockX==12) BlockX=9;}
    WaitTOF();
    ClipBlit( &my_rast_port, 160, 0, my_window->RPort, PlayerX, PlayerY+8, 8,8, 0xC0 );
    Moved();Push();BufferPointer=!BufferPointer;Boxes++;}
if (WorldBuffer[Line+32]=='C') 
   {WorldBuffer[Line+16]='C';WorldBuffer[Line+32]='F';PlayerY+=8;wy++;
    ClipBlit( &my_rast_port, 176, 0, &my_rast_port, ImageBuffer[!BufferPointer], 0, 8,8, 0xC0 );
 BlockX=9;WaitTOF();
    ClipBlit( &my_rast_port, ImageBuffer[BufferPointer], 0, my_window->RPort, PlayerX, PlayerY-8, 8,8, 0xC0 );
    DrawPSprite(11,PlayerX,PlayerY-7);
 for (loop=2;loop!=9;)
   {WaitTOF();
    ClipBlit( &my_rast_port, ImageBuffer[BufferPointer], 0, my_window->RPort, PlayerX, PlayerY-8, 8,8, 0xC0 );
    ScrollRaster(my_window->RPort,0,-1,PlayerX,PlayerY+(loop-2),PlayerX+7,PlayerY+loop+5);
    ClipBlit( &my_rast_port, ImageBuffer[!BufferPointer], 0, my_window->RPort, PlayerX, PlayerY, 8,loop-1, 0xC0 );
    DrawPSprite(BlockX,PlayerX,PlayerY-9+(++loop));
    if (++BlockX==12) BlockX=9;}
    WaitTOF();
    ClipBlit( &my_rast_port, 168, 0, my_window->RPort, PlayerX, PlayerY+8, 8,8, 0xC0 );
    Moved();Push();BufferPointer=!BufferPointer;}
   }
  }

if (LevelCompleteFlag) {
WaitTOF();ClipBlit( &my_rast_port, ImageBuffer[BufferPointer], 0, my_window->RPort, PlayerX, PlayerY, 8,8, 0xC0 );
DrawPSprite(12,PlayerX,PlayerY);
PlayerY-=2;SetAPen(my_window->RPort,20);
SetBPen(my_window->RPort,5);WaitTOF();
switch (rand()%11)
{
case 0: Move(my_window->RPort,PlayerX-24,PlayerY);
         Text( my_window->RPort,"Hurray!",7);break;

case 1: Move(my_window->RPort,PlayerX-24,PlayerY);
         Text( my_window->RPort,"Hurrah!",7);break;

case 2: Move(my_window->RPort,PlayerX-32,PlayerY);
         Text( my_window->RPort,"Yes-Yes!",8);break;

case 3: Move(my_window->RPort,PlayerX-16,PlayerY);
         Text( my_window->RPort,"Great!",6);break;

case 4: Move(my_window->RPort,PlayerX-32,PlayerY);
         Text( my_window->RPort,"Yee-hah!",8);break;

case 5: Move(my_window->RPort,PlayerX-32,PlayerY);
         Text( my_window->RPort,"Yay-yia!",8);break;

case 6: Move(my_window->RPort,PlayerX-24,PlayerY);
         Text( my_window->RPort,"Yuppie!",7);break;

case 7: Move(my_window->RPort,PlayerX-32,PlayerY);
         Text( my_window->RPort,"Success!",8);break;

case 8: Move(my_window->RPort,PlayerX-24,PlayerY);
         Text( my_window->RPort,"SuperB!",7);break;

case 9: Move(my_window->RPort,PlayerX-24,PlayerY);
         Text( my_window->RPort,"Groovy!",7);break;

default: Move(my_window->RPort,PlayerX-24,PlayerY);
         Text( my_window->RPort,"Suppaah!",8);break;
   }
Delay(79);SetBPen(my_window->RPort,0);Lives++;ReplayFlag=0;World(++WorldNumber);}

if (direction==DEAD) {Lives--;if (Lives>0){
SetAPen(my_window->RPort,4);SetBPen(my_window->RPort,5);
Move(my_window->RPort,PlayerX-16,PlayerY-2);WaitTOF();
Text( my_window->RPort, ARGH[rand()%9],5);SetBPen(my_window->RPort,0);WaitTOF();
ClipBlit( &my_rast_port, ImageBuffer[BufferPointer], 0, my_window->RPort, PlayerX, PlayerY, 8,8, 0xC0 );
SetAPen(my_window->RPort,6);
WritePixel(my_window->RPort,PlayerX+3,PlayerY+2);
WritePixel(my_window->RPort,PlayerX+4,PlayerY+2);
SetAPen(my_window->RPort,14);
RectFill(my_window->RPort,PlayerX+2,PlayerY+3,PlayerX+5,PlayerY+4);
WritePixel(my_window->RPort,PlayerX+1,PlayerY+5);
WritePixel(my_window->RPort,PlayerX+3,PlayerY+5);
WritePixel(my_window->RPort,PlayerX+4,PlayerY+5);
WritePixel(my_window->RPort,PlayerX+6,PlayerY+5);
SetAPen(my_window->RPort,13);
WritePixel(my_window->RPort,PlayerX,PlayerY+6);
WritePixel(my_window->RPort,PlayerX+1,PlayerY+6);
WritePixel(my_window->RPort,PlayerX+6,PlayerY+6);
WritePixel(my_window->RPort,PlayerX+7,PlayerY+6);
SetAPen(my_window->RPort,1);
RectFill(my_window->RPort,PlayerX+2,PlayerY+6,PlayerX+5,PlayerY+6);
WritePixel(my_window->RPort,PlayerX+3,PlayerY+7);
WritePixel(my_window->RPort,PlayerX+4,PlayerY+7);
Delay(5);WaitTOF();
ClipBlit( &my_rast_port, ImageBuffer[BufferPointer], 2, my_window->RPort, PlayerX, PlayerY+2, 8,4, 0xC0 );
SetAPen(my_window->RPort,6);
WritePixel(my_window->RPort,PlayerX+3,PlayerY+3);
WritePixel(my_window->RPort,PlayerX+4,PlayerY+3);
SetAPen(my_window->RPort,14);
RectFill(my_window->RPort,PlayerX+2,PlayerY+4,PlayerX+5,PlayerY+5);
Delay(5);WaitTOF();
ClipBlit( &my_rast_port, ImageBuffer[BufferPointer], 3, my_window->RPort, PlayerX, PlayerY+3, 8,2, 0xC0 );
SetAPen(my_window->RPort,6);
WritePixel(my_window->RPort,PlayerX+3,PlayerY+4);
WritePixel(my_window->RPort,PlayerX+4,PlayerY+4);
SetAPen(my_window->RPort,14);
RectFill(my_window->RPort,PlayerX+2,PlayerY+5,PlayerX+5,PlayerY+5);
Delay(7);WaitTOF();
ClipBlit( &my_rast_port, ImageBuffer[BufferPointer], 4, my_window->RPort, PlayerX, PlayerY+4, 8,4, 0xC0 );
SetAPen(my_window->RPort,1);
WritePixel(my_window->RPort,PlayerX+3,PlayerY+5);
WritePixel(my_window->RPort,PlayerX+4,PlayerY+5);
RectFill(my_window->RPort,PlayerX+1,PlayerY+6,PlayerX+6,PlayerY+6);
WritePixel(my_window->RPort,PlayerX+3,PlayerY+7);
WritePixel(my_window->RPort,PlayerX+4,PlayerY+7);
SetAPen(my_window->RPort,13);
RectFill(my_window->RPort,PlayerX,PlayerY+7,PlayerX+1,PlayerY+7);
RectFill(my_window->RPort,PlayerX+6,PlayerY+7,PlayerX+7,PlayerY+7);
Delay(100);World(WorldNumber);
 }}

if (Lives==0) {my_third_item.Flags=ITEMTEXT|COMMSEQ|HIGHCOMP;WaitTOF();
SetAPen(my_window->RPort,4);SetBPen(my_window->RPort,5);
Move(my_window->RPort,PlayerX-36,PlayerY-2);
Text(my_window->RPort,"GAME OVER!",10);SetBPen(my_window->RPort,0);
SetAPen(my_window->RPort,21);
Move(my_window->RPort,277,228);Text(my_window->RPort,"000",3);
WaitTOF();ClipBlit( &my_rast_port, ImageBuffer[BufferPointer], 0, my_window->RPort, PlayerX, PlayerY, 8,8, 0xC0 );
SetAPen(my_window->RPort,1);
WritePixel(my_window->RPort,PlayerX+3,PlayerY+5);
WritePixel(my_window->RPort,PlayerX+4,PlayerY+5);
RectFill(my_window->RPort,PlayerX+1,PlayerY+6,PlayerX+6,PlayerY+6);
WritePixel(my_window->RPort,PlayerX+3,PlayerY+7);
WritePixel(my_window->RPort,PlayerX+4,PlayerY+7);
SetAPen(my_window->RPort,13);
RectFill(my_window->RPort,PlayerX,PlayerY+7,PlayerX+1,PlayerY+7);
RectFill(my_window->RPort,PlayerX+6,PlayerY+7,PlayerX+7,PlayerY+7);
if (Music) {StopPlayer();Delay(30);StartSong(12+(rand()%2));}
 loop=0;Delay(100);
if (LoadFlag)
  while( close == FALSE )
  {
    /* As long as we can collect messages successfully we stay in the */
    /* while-loop: */

  while(my_message = (struct IntuiMessage *) GetMsg(my_window->UserPort))
   { 
    CheckClass=my_message->Class;
    CheckCode=my_message->Code;
    ReplyMsg( my_message ); /* Work done. Reply. */
     }

if(CheckClass == MENUPICK)
  {
   if(CheckCode == NEW_GAME) {Lives=3;ReplayFlag=TotalPushes=TotalMoves=CheckClass=LoadFlag=0;World(WorldNumber=1);
                           break;} /* New Game */

   if(CheckCode == LOADGAME) {LoadFlag=TRUE;CheckClass=ReplayFlag=0;
            if (SaveFile=fopen("BoxWorld.sav","rb")) {
            fseek(SaveFile,sizeof(ModeID),SEEK_SET);
            fread(&WorldNumber,sizeof(WorldNumber),1,SaveFile);
            fclose(SaveFile);} else WorldNumber=1;
            if (WorldNumber<2 || WorldNumber>WORLDS) {WorldNumber=1;
            LoadFlag=FALSE;}Lives=3;World(WorldNumber);
             break;}
    if (CheckCode == INFOITEM){    /* About */
                      AutoRequest( my_window, &my_body_text, NULL,
                      &my_ok_text, NULL, NULL, 220, 102);}
    if (CheckCode == QUITGAME) close=TRUE; /* Quit */
   }
if(CheckClass == RAWKEY) {
    if (CheckCode==16 || CheckCode==69) close=TRUE;
    if (CheckCode==64) {TitleBool=TRUE;CheckClass=0;break;}  /* Space Pressed */
    if (CheckCode==55) if (Music) {StopPlayer();Music=0;} else {Music=1;
   StartSong(0);} /* M key Pressed */
    if (CheckCode==68) loop+=249; /* Return Pressed */
}
CheckClass=0;
if (Joystick() & FIRE) {TitleBool=TRUE;break;}

 WaitTOF();if (++loop>3800) {TitleBool=TRUE;break;}
    } else close=HallOfFame();
  }

if (direction==0 && !TitleBool) {WaitTOF();
ClipBlit( &my_rast_port, ImageBuffer[BufferPointer], 0, my_window->RPort, PlayerX, PlayerY, 8,8, 0xC0 );
DrawSprite(0,PlayerX,PlayerY);}

direction=loop=0;
}

LoadRGB32(&my_screen->ViewPort,BlackRGB32);

/* We should always close the screens we have opened before we leave: */

 for( BlockX = 0; BlockX < DEPTH; BlockX++ )
  if( my_bit_map.Planes[ BlockX ] )

  /* Free the spare RastPort: */
  FreeRaster( my_bit_map.Planes[ BlockX ], WIDTH, HEIGHT );

 ClearMenuStrip( my_window );
 if (Music) StopPlayer();
 CloseWindow ( my_window ); 

 CloseScreen( my_screen );

if (SaveFile=fopen("BoxWorld.sav","rb")) {
fseek(SaveFile,sizeof(ModeID),SEEK_CUR);
fread(&WorldNumber,sizeof(WorldNumber),1,SaveFile);
fclose(SaveFile);} else WorldNumber=1;

if (SaveFile=fopen("BoxWorld.sav","wb")) {
fwrite(&ModeID,sizeof(ModeID),1,SaveFile);
fwrite(&WorldNumber,sizeof(WorldNumber),1,SaveFile);
fwrite(&HiNames,sizeof(HiNames),1,SaveFile);
fclose(SaveFile);}

/* Close the Graphics Library since we have opened it: */
  CloseLibrary( GfxBase );

  /* Close the Intuition Library since we have opened it: */
  CloseLibrary( IntuitionBase );

  /* THE END */
exit(0);
}
