]> git.jsancho.org Git - lugaru.git/commitdiff
Merge
authorVadim Trochinsky <vadim.trochinsky@gmail.com>
Sun, 16 May 2010 19:51:31 +0000 (23:51 +0400)
committerVadim Trochinsky <vadim.trochinsky@gmail.com>
Sun, 16 May 2010 19:51:31 +0000 (23:51 +0400)
1  2 
Source/GameTick.cpp

index 4bcb66c07ae657b55880ff5c8a41cea3d1648df1,1d2fea295805ae5db2f783f0f7241139c5c4ebd8..4a055ad600ecbf6bcb5e7958bcffadc474a4808f
@@@ -252,5037 -257,3919 +257,3956 @@@ extern OPENAL_STREAM * strm[20]
  extern "C"    void PlaySoundEx(int channel, OPENAL_SAMPLE *sptr, OPENAL_DSPUNIT *dsp, signed char startpaused);
  extern "C" void PlayStreamEx(int chan, OPENAL_STREAM *sptr, OPENAL_DSPUNIT *dsp, signed char startpaused);
  
- extern void ScreenShot(const char * fname);
- void Screenshot       (void)
- {
-       char temp[1024];
-       time_t  t = time(NULL);
-       struct  tm *tme = localtime(&t);
-       sprintf(temp, "Screenshots\\Screenshot_%04d_%02d_%02d--%02d_%02d_%02d.png", tme->tm_year + 1900, tme->tm_mon + 1, tme->tm_mday, tme->tm_hour, tme->tm_min, tme->tm_sec);
  
-       #if defined(_WIN32)
-       mkdir("Screenshots");
-       #else
-       mkdir("Screenshots", S_IRWXU);
-       #endif
+ static const char *cmd_names[] = {
+ #define DECLARE_COMMAND(cmd) #cmd " ",
+ #include "ConsoleCmds.h"
+ #undef  DECLARE_COMMAND
+ };
  
      ScreenShot(temp/*"Screenshots\\Screenshot.png"*/);
typedef void (*console_handler)(Game *game, const char *args);
  
-       /*FSSpec                                MAC_file;
-       GraphicsExportComponent QT_exporter;
-       OSErr                           MAC_error_code;
-       CGrafPtr                        MAC_currentPort;
-       GDHandle                        MAC_currentDevice;
-       unsigned char*          MAC_pixels;
-       Rect                            MAC_picture_rectangle;
-       GWorldPtr                       MAC_offscreen_graphics_port;
+ #define DECLARE_COMMAND(cmd) static void ch_##cmd(Game *game, const char *args);
+ #include "ConsoleCmds.h"
+ #undef  DECLARE_COMMAND
  
-       static int numscreenshots=0;
+ static console_handler cmd_handlers[] = {
+ #define DECLARE_COMMAND(cmd) ch_##cmd,
+ #include "ConsoleCmds.h"
+ #undef  DECLARE_COMMAND
+ };
  
-       // Make an FSSpec
-       static char buf[256];
-       if(numscreenshots==0){
-       buf[0]=26;
-       buf[1]=':';
-       buf[2]='S';
-       buf[3]='c';
-       buf[4]='r';
-       buf[5]='e';
-       buf[6]='e';
-       buf[7]='n';
-       buf[8]='s';
-       buf[9]='h';
-       buf[10]='o';
-       buf[11]='t';
-       buf[12]='s';
-       buf[13]=':';
-       buf[14]='S';
-       buf[15]='c';
-       buf[16]='r';
-       buf[17]='e';
-       buf[18]='e';
-       buf[19]='n';
-       buf[20]='s';
-       buf[21]='h';
-       buf[22]='o';
-       buf[23]='t';
-       buf[24]='0';
-       buf[25]='0';
-       buf[26]='0';
-       }
+ static void ch_quit(Game *game, const char *args)
+ {
+   game->tryquit = 1;
+ }
  
-       FInfo *fndrInfo;
-       FSMakeFSSpec(0, 0, (unsigned char*)buf, &MAC_file);
-       while(!FSpGetFInfo (&MAC_file, fndrInfo)){
-       FSMakeFSSpec(0, 0, (unsigned char*)buf, &MAC_file);
-       if(!FSpGetFInfo (&MAC_file, fndrInfo)){
-       numscreenshots++;
-       buf[26]++;
-       if(buf[26]==':'){
-       buf[26]='0';
-       buf[25]++;
-       if(buf[25]==':'){
-       buf[25]='0';
-       buf[24]++;
-       if(buf[24]==':'){
-       buf[24]='9';
-       buf[25]='9';
-       buf[26]='9';
-       }
+ static void ch_map(Game *game, const char *args)
+ {
+   char buf[64];
+   snprintf(buf, 63, ":Data:Maps:%s", args);
+   game->Loadlevel(buf);
+   game->whichlevel = -2;
+   campaign = 0;
+ }
+ static void ch_save(Game *game, const char *args)
+ {
+   char buf[64];
+   int i, j, k, l, m, templength;
+   float headprop, bodyprop, armprop, legprop;
+   snprintf(buf, 63, ":Data:Maps:%s", args);
+   int mapvers = 12;;
+   FILE                        *tfile;
+   tfile=fopen( ConvertFileName(buf), "wb" );
+   fpackf(tfile, "Bi", mapvers);
+   fpackf(tfile, "Bi", maptype);
+   fpackf(tfile, "Bi", hostile);
+   fpackf(tfile, "Bf Bf", viewdistance, fadestart);
+   fpackf(tfile, "Bb Bf Bf Bf", skyboxtexture, skyboxr, skyboxg, skyboxb);
+   fpackf(tfile, "Bf Bf Bf", skyboxlightr, skyboxlightg, skyboxlightb);
+   fpackf(tfile, "Bf Bf Bf Bf Bf Bi", player[0].coords.x, player[0].coords.y, player[0].coords.z, player[0].rotation, player[0].targetrotation, player[0].num_weapons);
+   if(player[0].num_weapons>0&&player[0].num_weapons<5)
+     for(j=0;j<player[0].num_weapons;j++){
+       fpackf(tfile, "Bi", weapons.type[player[0].weaponids[j]]);
+     }
+   fpackf(tfile, "Bf Bf Bf", player[0].armorhead, player[0].armorhigh, player[0].armorlow);
+   fpackf(tfile, "Bf Bf Bf", player[0].protectionhead, player[0].protectionhigh, player[0].protectionlow);
+   fpackf(tfile, "Bf Bf Bf", player[0].metalhead, player[0].metalhigh, player[0].metallow);
+   fpackf(tfile, "Bf Bf", player[0].power, player[0].speedmult);
+   fpackf(tfile, "Bi", player[0].numclothes);
+   fpackf(tfile, "Bi Bi", player[0].whichskin, player[0].creature);
+   fpackf(tfile, "Bi", numdialogues);
+   if(numdialogues)
+     for(k=0;k<numdialogues;k++){
+       fpackf(tfile, "Bi", numdialogueboxes[k]);
+       fpackf(tfile, "Bi", dialoguetype[k]);
+       for(l=0;l<10;l++){
+       fpackf(tfile, "Bf Bf Bf", participantlocation[k][l].x, participantlocation[k][l].y, participantlocation[k][l].z);
+       fpackf(tfile, "Bf", participantrotation[k][l]);
+       }
+       if(numdialogueboxes)
+       for(l=0;l<numdialogueboxes[k];l++){
+         fpackf(tfile, "Bi", dialogueboxlocation[k][l]);
+         fpackf(tfile, "Bf", dialogueboxcolor[k][l][0]);
+         fpackf(tfile, "Bf", dialogueboxcolor[k][l][1]);
+         fpackf(tfile, "Bf", dialogueboxcolor[k][l][2]);
+         fpackf(tfile, "Bi", dialogueboxsound[k][l]);
+         templength=strlen(dialoguetext[k][l]);
+         fpackf(tfile, "Bi",(templength));
+         for(m=0;m<templength;m++){
+           fpackf(tfile, "Bb", dialoguetext[k][l][m]);
+           if(dialoguetext[k][l][m]=='\0')break;
+         }
+         templength=strlen(dialoguename[k][l]);
+         fpackf(tfile, "Bi",templength);
+         for(m=0;m<templength;m++){
+           fpackf(tfile, "Bb", dialoguename[k][l][m]);
+           if(dialoguename[k][l][m]=='\0')break;
+         }
+         fpackf(tfile, "Bf Bf Bf", dialoguecamera[k][l].x, dialoguecamera[k][l].y, dialoguecamera[k][l].z);
+         fpackf(tfile, "Bi", participantfocus[k][l]);
+         fpackf(tfile, "Bi", participantaction[k][l]);
+         for(m=0;m<10;m++)
+           fpackf(tfile, "Bf Bf Bf", participantfacing[k][l][m].x, participantfacing[k][l][m].y, participantfacing[k][l][m].z);
+         fpackf(tfile, "Bf Bf",dialoguecamerarotation[k][l],dialoguecamerarotation2[k][l]);
        }
+     }
+   if(player[0].numclothes)
+     for(k=0;k<player[0].numclothes;k++){
+       templength=strlen(player[0].clothes[k]);
+       fpackf(tfile, "Bi", templength);
+       for(l=0;l<templength;l++)
+       fpackf(tfile, "Bb", player[0].clothes[k][l]);
+       fpackf(tfile, "Bf Bf Bf", player[0].clothestintr[k], player[0].clothestintg[k], player[0].clothestintb[k]);
+     }
+   fpackf(tfile, "Bi", environment);
+   fpackf(tfile, "Bi", objects.numobjects);
+   if(objects.numobjects)
+     for(k=0;k<objects.numobjects;k++){
+       fpackf(tfile, "Bi Bf Bf Bf Bf Bf Bf", objects.type[k], objects.rotation[k], objects.rotation2[k], objects.position[k].x, objects.position[k].y, objects.position[k].z, objects.scale[k]);
+     }
+   fpackf(tfile, "Bi", numhotspots);
+   if(numhotspots)
+     for(i=0;i<numhotspots;i++){
+       fpackf(tfile, "Bi Bf Bf Bf Bf", hotspottype[i],hotspotsize[i],hotspot[i].x,hotspot[i].y,hotspot[i].z);
+       templength=strlen(hotspottext[i]);
+       fpackf(tfile, "Bi",templength);
+       for(l=0;l<templength;l++)
+       fpackf(tfile, "Bb", hotspottext[i][l]);
+     }
+   fpackf(tfile, "Bi", numplayers);
+   if(numplayers>1&&numplayers<maxplayers)
+     for(j=1;j<numplayers;j++){
+       fpackf(tfile, "Bi Bi Bf Bf Bf Bi Bi Bf Bb Bf", player[j].whichskin, player[j].creature, player[j].coords.x, player[j].coords.y, player[j].coords.z, player[j].num_weapons, player[j].howactive, player[j].scale, player[j].immobile, player[j].rotation);
+       if(player[j].num_weapons>0&&player[j].num_weapons<5)
+       for(k=0;k<player[j].num_weapons;k++){
+         fpackf(tfile, "Bi", weapons.type[player[j].weaponids[k]]);
        }
+       if(player[j].numwaypoints<30){
+       fpackf(tfile, "Bi", player[j].numwaypoints);
+       for(k=0;k<player[j].numwaypoints;k++){
+         fpackf(tfile, "Bf", player[j].waypoints[k].x);
+         fpackf(tfile, "Bf", player[j].waypoints[k].y);
+         fpackf(tfile, "Bf", player[j].waypoints[k].z);
+         fpackf(tfile, "Bi", player[j].waypointtype[k]);
        }
+       fpackf(tfile, "Bi", player[j].waypoint);
+       }
+       else{
+       player[j].numwaypoints=0;
+       player[j].waypoint=0;
+       fpackf(tfile, "Bi Bi Bi", player[j].numwaypoints, player[j].waypoint, player[j].waypoint);
+       }
+       fpackf(tfile, "Bf Bf Bf", player[j].armorhead, player[j].armorhigh, player[j].armorlow);
+       fpackf(tfile, "Bf Bf Bf", player[j].protectionhead, player[j].protectionhigh, player[j].protectionlow);
+       fpackf(tfile, "Bf Bf Bf", player[j].metalhead, player[j].metalhigh, player[j].metallow);
+       fpackf(tfile, "Bf Bf", player[j].power, player[j].speedmult);
+       if(player[j].creature==wolftype){
+       headprop=player[j].proportionhead.x/1.1;
+       bodyprop=player[j].proportionbody.x/1.1;
+       armprop=player[j].proportionarms.x/1.1;
+       legprop=player[j].proportionlegs.x/1.1;
+       }
+       if(player[j].creature==rabbittype){
+       headprop=player[j].proportionhead.x/1.2;
+       bodyprop=player[j].proportionbody.x/1.05;
+       armprop=player[j].proportionarms.x/1.00;
+       legprop=player[j].proportionlegs.x/1.1;
+       }
+       fpackf(tfile, "Bf Bf Bf Bf", headprop, bodyprop, armprop, legprop);
+       fpackf(tfile, "Bi", player[j].numclothes);
+       if(player[j].numclothes)
+       for(k=0;k<player[j].numclothes;k++){
+         int templength;
+         templength=strlen(player[j].clothes[k]);
+         fpackf(tfile, "Bi", templength);
+         for(l=0;l<templength;l++)
+           fpackf(tfile, "Bb", player[j].clothes[k][l]);
+         fpackf(tfile, "Bf Bf Bf", player[j].clothestintr[k], player[j].clothestintg[k], player[j].clothestintb[k]);
        }
+     }
  
+   fpackf(tfile, "Bi", game->numpathpoints);
+   if(game->numpathpoints)
+     for(j=0;j<game->numpathpoints;j++){
+       fpackf(tfile, "Bf Bf Bf Bi", game->pathpoint[j].x, game->pathpoint[j].y, game->pathpoint[j].z, game->numpathpointconnect[j]);
+       for(k=0;k<game->numpathpointconnect[j];k++){
+       fpackf(tfile, "Bi", game->pathpointconnect[j][k]);
+       }
+     }
  
-       // Get the GWorld
-       GWorldPtr                       MAC_gWorld = (CGrafPtr) FrontWindow();
-       //assert(MAC_gWorld != NULL);
+   fpackf(tfile, "Bf Bf Bf Bf", game->mapcenter.x, game->mapcenter.y, game->mapcenter.z, game->mapradius);
  
-       // Allocate memory for loading image
-       MAC_pixels = new unsigned char[(int)(screenheight * screenwidth * 4)];
-       if (MAC_pixels == NULL) {
-       //UTIL_Error("Could not create Texture data.");
-       return;
-       }
+   fclose(tfile);
+ }
  
-       // Get GWorld
-       ::GetGWorld(&MAC_currentPort, &MAC_currentDevice);
+ static void ch_cellar(Game *game, const char *args)
+ {
+   game->LoadTextureSave(":Data:Textures:Furdarko.jpg",&player[0].skeleton.drawmodel.textureptr,1,&player[0].skeleton.skinText[0],&player[0].skeleton.skinsize);
+ }
  
-       // Make a picture Rectangle
-       MAC_picture_rectangle.left = 0;
-       MAC_picture_rectangle.right = screenwidth;
-       MAC_picture_rectangle.top = 0;
-       MAC_picture_rectangle.bottom = screenheight;
+ static void ch_tint(Game *game, const char *args)
+ {
+   sscanf(args, "%f%f%f", &tintr, &tintg, &tintb);
+ }
  
-       // Create new offscreen GWorld
-       MAC_error_code = ::QTNewGWorldFromPtr (&MAC_offscreen_graphics_port, k32ARGBPixelFormat, &MAC_picture_rectangle, NULL, NULL, 0, (char *) MAC_pixels, screenwidth * 4);
-       if (MAC_error_code)     {
-       ::SetGWorld(MAC_currentPort, MAC_currentDevice);
-       delete MAC_pixels;
-       //UTIL_Error("Could not create offscreen GWorld. ");
-       return;
+ static void ch_tintr(Game *game, const char *args)
+ {
+   tintr = atof(args);
+ }
  
-       }
+ static void ch_tintg(Game *game, const char *args)
+ {
+   tintg = atof(args);
+ }
  
-       // Copy OpenGL Context to new GWorld
-       glReadBuffer(GL_FRONT);
-       glReadPixels(0,0,screenwidth,screenheight,GL_RGBA,GL_UNSIGNED_BYTE,MAC_pixels);
+ static void ch_tintb(Game *game, const char *args)
+ {
+   tintb = atof(args);
+ }
  
-       // Swizzle texture
-       for (unsigned long byte = 0; byte < screenheight * screenwidth * 4; byte+=4) {
-       unsigned char temp = MAC_pixels[byte+0];
-       MAC_pixels[byte+0] = MAC_pixels[byte+3];
-       MAC_pixels[byte+3] = MAC_pixels[byte+2];
-       MAC_pixels[byte+2] = MAC_pixels[byte+1];
-       MAC_pixels[byte+1] = temp;
-       }
+ static void ch_speed(Game *game, const char *args)
+ {
+   player[0].speedmult = atof(args);
+ }
  
-       // Flip the image  :(   This could probably be optimized
-       int vert;
-       int src_index;
-       int dst_index;
-       unsigned char temp;
-       for (int horz = 0; horz < screenwidth; ++horz)
-       for (vert = 0; vert < screenheight / 2; ++vert) {
-       src_index = (screenwidth * vert + horz) * 4;
-       dst_index = (screenwidth * (screenheight - vert - 1) + horz) * 4;
+ static void ch_strength(Game *game, const char *args)
+ {
+   player[0].power = atof(args);
+ }
  
-       temp=MAC_pixels[src_index+0];
-       MAC_pixels[src_index+0]=MAC_pixels[dst_index+0];
-       MAC_pixels[dst_index+0]=temp;
+ static void ch_power(Game *game, const char *args)
+ {
+   player[0].power = atof(args);
+ }
  
-       temp=MAC_pixels[src_index+1];
-       MAC_pixels[src_index+1]=MAC_pixels[dst_index+1];
-       MAC_pixels[dst_index+1]=temp;
+ static void ch_size(Game *game, const char *args)
+ {
+   player[0].scale = atof(args) * .2;
+ }
  
-       temp=MAC_pixels[src_index+2];
-       MAC_pixels[src_index+2]=MAC_pixels[dst_index+2];
-       MAC_pixels[dst_index+2]=temp;
+ static int find_closest()
+ {
+   int closest = 0;
+   float closestdist = 1.0/0.0;
+   for (int i = 1; i < numplayers; i++) {
+     float distance;
+     distance = findDistancefast(&player[i].coords,&player[0].coords);
+     if (distance < closestdist) {
+       closestdist = distance;
+       closest = i;
+     }
+   }
+   return closest;
+ }
  
-       temp=MAC_pixels[src_index+3];
-       MAC_pixels[src_index+3]=MAC_pixels[dst_index+3];
-       MAC_pixels[dst_index+3]=temp;
-       }
+ static void ch_sizenear(Game *game, const char *args)
+ {
+   int closest = find_closest();
  
+   if (closest)
+     player[closest].scale = atof(args) * .2;
+ }
  
+ static void set_proportion(int pnum, const char *args)
+ {
+   float headprop,bodyprop,armprop,legprop;
+   sscanf(args, "%f%f%f%f", &headprop, &bodyprop, &armprop, &legprop);
+   if(player[pnum].creature==wolftype){
+     player[pnum].proportionhead=1.1*headprop;
+     player[pnum].proportionbody=1.1*bodyprop;
+     player[pnum].proportionarms=1.1*armprop;
+     player[pnum].proportionlegs=1.1*legprop;
+   }
+   if(player[pnum].creature==rabbittype){
+     player[pnum].proportionhead=1.2*headprop;
+     player[pnum].proportionbody=1.05*bodyprop;
+     player[pnum].proportionarms=1.00*armprop;
+     player[pnum].proportionlegs=1.1*legprop;
+     player[pnum].proportionlegs.y=1.05*legprop;
+   }
+ }
  
-       // Export the Gworld
-       MAC_error_code =  OpenADefaultComponent(GraphicsExporterComponentType, kQTFileTypeBMP, &QT_exporter);
-       if (MAC_error_code) {
-       //UTIL_Warning("Unable to export screenshot.");
-       ::SetGWorld(MAC_currentPort, MAC_currentDevice);
-       ::DisposeGWorld(MAC_offscreen_graphics_port);
-       delete MAC_pixels;
-       return;
-       }
+ static void ch_proportion(Game *game, const char *args)
+ {
+   set_proportion(0, args);
+ }
  
-       MAC_error_code =  GraphicsExportSetInputGWorld(QT_exporter,MAC_offscreen_graphics_port);
-       if (MAC_error_code) {
-       ::CloseComponent(QT_exporter);
-       ::SetGWorld(MAC_currentPort, MAC_currentDevice);
-       ::DisposeGWorld(MAC_offscreen_graphics_port);
-       delete MAC_pixels;
-       //UTIL_Warning("Unable to export screenshot.");
-       return;
-       }
+ static void ch_proportionnear(Game *game, const char *args)
+ {
+   int closest = find_closest();
+   if (closest)
+     set_proportion(closest, args);
+ }
  
-       MAC_error_code = GraphicsExportSetOutputFile(QT_exporter,&MAC_file);
-       if (MAC_error_code) {
-       ::CloseComponent(QT_exporter);
-       ::SetGWorld(MAC_currentPort, MAC_currentDevice);
-       ::DisposeGWorld(MAC_offscreen_graphics_port);
-       delete MAC_pixels;
-       //UTIL_Warning("Unable to export screenshot.");
-       return;
-       }
+ static void set_protection(int pnum, const char *args)
+ {
+   float head, high, low;
+   sscanf(args, "%f%f%f", &head, &high, &low);
  
-       MAC_error_code = GraphicsExportDoExport(QT_exporter,NULL);
-       if (MAC_error_code) {
-       ::CloseComponent(QT_exporter);
-       ::SetGWorld(MAC_currentPort, MAC_currentDevice);
-       ::DisposeGWorld(MAC_offscreen_graphics_port);
-       delete MAC_pixels;
-       //UTIL_Warning("Unable to export screenshot.");
-       return;
-       }
+   player[pnum].protectionhead = head;
+   player[pnum].protectionhigh = high;
+   player[pnum].protectionlow  = low;
+ }
  
-       ::CloseComponent(QT_exporter);
-       ::SetGWorld(MAC_currentPort, MAC_currentDevice);
-       ::DisposeGWorld(MAC_offscreen_graphics_port);
+ static void ch_protection(Game *game, const char *args)
+ {
+   set_protection(0, args);
+ }
  
-       delete MAC_pixels;*/
+ static void ch_protectionnear(Game *game, const char *args)
+ {
+   int closest = find_closest();
+   if (closest)
+     set_protection(closest, args);
  }
  
+ static void set_armor(int pnum, const char *args)
+ {
+   float head, high, low;
+   sscanf(args, "%f%f%f", &head, &high, &low);
  
+   player[pnum].armorhead = head;
+   player[pnum].armorhigh = high;
+   player[pnum].armorlow  = low;
+ }
  
- void  Game::SetUpLighting(){
-       if(environment==snowyenvironment){
-               light.color[0]=.65;
-               light.color[1]=.65;
-               light.color[2]=.7;
-               light.ambient[0]=.4;
-               light.ambient[1]=.4;
-               light.ambient[2]=.44;
-       }
-       if(environment==desertenvironment){
-               light.color[0]=.95;
-               light.color[1]=.95;
-               light.color[2]=.95;
-               light.ambient[0]=.4;
-               light.ambient[1]=.35;
-               light.ambient[2]=.3;
-       }
+ static void ch_armor(Game *game, const char *args)
+ {
+   set_armor(0, args);
+ }
  
-       if(environment==grassyenvironment){
-               light.color[0]=.95;
-               light.color[1]=.95;
-               light.color[2]=1;
-               light.ambient[0]=.4;
-               light.ambient[1]=.4;
-               light.ambient[2]=.44;
-       }
-       if(!skyboxtexture){
-               light.color[0]=1;
-               light.color[1]=1;
-               light.color[2]=1;
-               light.ambient[0]=.4;
-               light.ambient[1]=.4;
-               light.ambient[2]=.4;
-       }
-       float average;
-       average=(skyboxlightr+skyboxlightg+skyboxlightb)/3;
-       light.color[0]*=(skyboxlightr+average)/2;
-       light.color[1]*=(skyboxlightg+average)/2;
-       light.color[2]*=(skyboxlightb+average)/2;
-       light.ambient[0]=light.ambient[0]*(skyboxlightr+average)/2*1;
-       light.ambient[1]=light.ambient[1]*(skyboxlightg+average)/2*1;
-       light.ambient[2]=light.ambient[2]*(skyboxlightb+average)/2*1;
-       /*
-       light.ambient[0]=0;
-       light.ambient[1]=0;
-       light.ambient[2]=0;     */
+ static void ch_armornear(Game *game, const char *args)
+ {
+   int closest = find_closest();
+   if (closest)
+     set_armor(closest, args);
  }
  
- int Game::findPathDist(int start,int end){
-       int i,j,k,smallestcount,count,connected;
-       int last,last2,last3,last4;
-       int closest;
+ static void ch_protectionreset(Game *game, const char *args)
+ {
+   set_protection(0, "1 1 1");
+   set_armor(0, "1 1 1");
+ }
  
-       smallestcount=1000;
-       for(i=0;i<50;i++){
-               count=0;
-               last=start;
-               last2=-1;
-               last3=-1;
-               last4=-1;
-               while(last!=end&&count<30){
-                       closest=-1;
-                       for(j=0;j<numpathpoints;j++){
-                               if(j!=last&&j!=last2&&j!=last3&&j!=last4)
-                               {
-                                       connected=0;
-                                       if(numpathpointconnect[j])
-                                               for(k=0;k<numpathpointconnect[j];k++){
-                                                       if(pathpointconnect[j][k]==last)connected=1;
-                                               }
-                                               if(!connected)
-                                                       if(numpathpointconnect[last])
-                                                               for(k=0;k<numpathpointconnect[last];k++){
-                                                                       if(pathpointconnect[last][k]==j)connected=1;
-                                                               }
-                                                               if(connected)
-                                                                       if(closest==-1||Random()%2==0){
-                                                                               closest=j;
-                                                                       }
-                               }
-                       }
-                       last4=last3;
-                       last3=last2;
-                       last2=last;
-                       last=closest;
-                       count++;
-               }
-               if(count<smallestcount)smallestcount=count;
-       }
-       return smallestcount;
+ static void set_metal(int pnum, const char *args)
+ {
+   float head, high, low;
+   sscanf(args, "%f%f%f", &head, &high, &low);
+   player[pnum].metalhead = head;
+   player[pnum].metalhigh = high;
+   player[pnum].metallow  = low;
  }
  
- int Game::checkcollide(XYZ startpoint,XYZ endpoint){
-       static XYZ colpoint,colviewer,coltarget;
-       static float minx,minz,maxx,maxz,miny,maxy;
-       static int i;
+ static void ch_metal(Game *game, const char *args)
+ {
+   set_metal(0, args);
+ }
  
-       //startpoint.y+=.7;
-       //endpoint.y+=.7;
-       //startpoint.y-=.1;
-       //endpoint.y-=.1;
+ static void set_noclothes(int pnum, Game *game, const char *args)
+ {
+   player[pnum].numclothes = 0;
+   game->LoadTextureSave(creatureskin[player[pnum].creature][player[pnum].whichskin],
+                       &player[pnum].skeleton.drawmodel.textureptr,1,
+                       &player[pnum].skeleton.skinText[0],&player[pnum].skeleton.skinsize);
+ }
  
-       minx=startpoint.x;
-       if(minx>endpoint.x)minx=endpoint.x;
-       miny=startpoint.y;
-       if(miny>endpoint.y)miny=endpoint.y;
-       minz=startpoint.z;
-       if(minz>endpoint.z)minz=endpoint.z;
+ static void ch_noclothes(Game *game, const char *args)
+ {
+   set_noclothes(0, game, args);
+ }
  
-       maxx=startpoint.x;
-       if(maxx<endpoint.x)maxx=endpoint.x;
-       maxy=startpoint.y;
-       if(maxy<endpoint.y)maxy=endpoint.y;
-       maxz=startpoint.z;
-       if(maxz<endpoint.z)maxz=endpoint.z;
+ static void ch_noclothesnear(Game *game, const char *args)
+ {
+   int closest = find_closest();
+   if (closest)
+     set_noclothes(closest, game, args);
+ }
  
-       minx-=1;
-       miny-=1;
-       minz-=1;
-       maxx+=1;
-       maxy+=1;
-       maxz+=1;
  
-       for(i=0;i<objects.numobjects;i++){
-               if(objects.position[i].x>minx-objects.model[i].boundingsphereradius&&objects.position[i].x<maxx+objects.model[i].boundingsphereradius&&objects.position[i].y>miny-objects.model[i].boundingsphereradius&&objects.position[i].y<maxy+objects.model[i].boundingsphereradius&&objects.position[i].z>minz-objects.model[i].boundingsphereradius&&objects.position[i].z<maxz+objects.model[i].boundingsphereradius){
-                       if(objects.type[i]!=treeleavestype&&objects.type[i]!=bushtype&&objects.type[i]!=firetype){
-                               colviewer=startpoint;
-                               coltarget=endpoint;
-                               if(objects.model[i].LineCheck(&colviewer,&coltarget,&colpoint,&objects.position[i],&objects.rotation[i])!=-1)return i;
-                       }
-               }
-       }
+ static void set_clothes(int pnum, Game *game, const char *args)
+ {
+   char buf[64];
+   snprintf(buf, 63, ":Data:Textures:%s.png", args);
+   if (!game->AddClothes(buf,0,1,&player[pnum].skeleton.skinText[pnum],&player[pnum].skeleton.skinsize))
+     return;
+   player[pnum].DoMipmaps(5,0,0,player[pnum].skeleton.skinsize,player[pnum].skeleton.skinsize);
+   strcpy(player[pnum].clothes[player[pnum].numclothes],buf);
+   player[pnum].clothestintr[player[pnum].numclothes]=tintr;
+   player[pnum].clothestintg[player[pnum].numclothes]=tintg;
+   player[pnum].clothestintb[player[pnum].numclothes]=tintb;
+   player[pnum].numclothes++;
+ }
  
-       //if(terrain.lineTerrain(startpoint,endpoint,&colpoint)!=-1)return 1000;
+ static void ch_clothes(Game *game, const char *args)
+ {
+   set_clothes(0, game, args);
+ }
  
-       return -1;
+ static void ch_clothesnear(Game *game, const char *args)
+ {
+   int closest = find_closest();
+   if (closest)
+     set_clothes(closest, game, args);
  }
  
- int Game::checkcollide(XYZ startpoint,XYZ endpoint,int what){
-       static XYZ colpoint,colviewer,coltarget;
-       static float minx,minz,maxx,maxz,miny,maxy;
-       static int i;
+ static void ch_belt(Game *game, const char *args)
+ {
+   player[0].skeleton.clothes = !player[0].skeleton.clothes;
+ }
  
-       //startpoint.y+=.7;
-       //endpoint.y+=.7;
-       //startpoint.y-=.1;
-       //endpoint.y-=.1;
  
-       minx=startpoint.x;
-       if(minx>endpoint.x)minx=endpoint.x;
-       miny=startpoint.y;
-       if(miny>endpoint.y)miny=endpoint.y;
-       minz=startpoint.z;
-       if(minz>endpoint.z)minz=endpoint.z;
+ static void ch_cellophane(Game *game, const char *args)
+ {
+   cellophane = !cellophane;
+   float mul = cellophane ? 0 : 1;
+   for (int i = 0; i < numplayers; i++) {
+     player[i].proportionhead.z = player[i].proportionhead.x * mul;
+     player[i].proportionbody.z = player[i].proportionbody.x * mul;
+     player[i].proportionarms.z = player[i].proportionarms.x * mul;
+     player[i].proportionlegs.z = player[i].proportionlegs.x * mul;
+   }
+ }
  
-       maxx=startpoint.x;
-       if(maxx<endpoint.x)maxx=endpoint.x;
-       maxy=startpoint.y;
-       if(maxy<endpoint.y)maxy=endpoint.y;
-       maxz=startpoint.z;
-       if(maxz<endpoint.z)maxz=endpoint.z;
+ static void ch_funnybunny(Game *game, const char *args)
+ {
+   player[0].skeleton.id=0;
+   player[0].skeleton.Load(":Data:Skeleton:Basic Figure",":Data:Skeleton:Basic Figurelow",
+                         ":Data:Skeleton:Rabbitbelt",":Data:Models:Body.solid",
+                         ":Data:Models:Body2.solid",":Data:Models:Body3.solid",
+                         ":Data:Models:Body4.solid",":Data:Models:Body5.solid",
+                         ":Data:Models:Body6.solid",":Data:Models:Body7.solid",
+                         ":Data:Models:Bodylow.solid",":Data:Models:Belt.solid",1);
+   game->LoadTextureSave(":Data:Textures:fur3.jpg",&player[0].skeleton.drawmodel.textureptr,1,
+                       &player[0].skeleton.skinText[0],&player[0].skeleton.skinsize);
+   player[0].creature=rabbittype;
+   player[0].scale=.2;
+   player[0].headless=0;
+   player[0].damagetolerance=200;
+   set_proportion(0, "1 1 1 1");
+ }
  
-       minx-=1;
-       miny-=1;
-       minz-=1;
-       maxx+=1;
-       maxy+=1;
-       maxz+=1;
+ static void ch_wolfie(Game *game, const char *args)
+ {
+   player[0].skeleton.id=0;
+   player[0].skeleton.Load(":Data:Skeleton:Basic Figure Wolf",":Data:Skeleton:Basic Figure Wolf Low",
+                         ":Data:Skeleton:Rabbitbelt",":Data:Models:Wolf.solid",
+                         ":Data:Models:Wolf2.solid",":Data:Models:Wolf3.solid",
+                         ":Data:Models:Wolf4.solid",":Data:Models:Wolf5.solid",
+                         ":Data:Models:Wolf6.solid",":Data:Models:Wolf7.solid",
+                         ":Data:Models:Wolflow.solid",":Data:Models:Belt.solid",0);
+   game->LoadTextureSave(":Data:Textures:Wolf.jpg",&player[0].skeleton.drawmodel.textureptr,1,
+                       &player[0].skeleton.skinText[0],&player[0].skeleton.skinsize);
+   player[0].creature=wolftype;
+   player[0].damagetolerance=300;
+   set_proportion(0, "1 1 1 1");
+ }
  
-       if(what!=1000){
-               if(objects.position[what].x>minx-objects.model[what].boundingsphereradius&&objects.position[what].x<maxx+objects.model[what].boundingsphereradius&&objects.position[what].y>miny-objects.model[what].boundingsphereradius&&objects.position[what].y<maxy+objects.model[what].boundingsphereradius&&objects.position[what].z>minz-objects.model[what].boundingsphereradius&&objects.position[what].z<maxz+objects.model[what].boundingsphereradius){
-                       if(objects.type[what]!=treeleavestype&&objects.type[what]!=bushtype&&objects.type[what]!=firetype){
-                               colviewer=startpoint;
-                               coltarget=endpoint;
-                               if(objects.model[what].LineCheck(&colviewer,&coltarget,&colpoint,&objects.position[what],&objects.rotation[what])!=-1)return i;
-                       }
-               }
-       }
+ static void ch_wolf(Game *game, const char *args)
+ {
+   game->LoadTextureSave(":Data:Textures:Wolf.jpg",&player[0].skeleton.drawmodel.textureptr,1,
+                       &player[0].skeleton.skinText[0],&player[0].skeleton.skinsize);
+ }
  
-       if(what==1000)if(terrain.lineTerrain(startpoint,endpoint,&colpoint)!=-1)return 1000;
+ static void ch_snowwolf(Game *game, const char *args)
+ {
+   game->LoadTextureSave(":Data:Textures:SnowWolf.jpg",&player[0].skeleton.drawmodel.textureptr,1,
+                       &player[0].skeleton.skinText[0],&player[0].skeleton.skinsize);
+ }
  
-       return -1;
+ static void ch_darkwolf(Game *game, const char *args)
+ {
+   game->LoadTextureSave(":Data:Textures:DarkWolf.jpg",&player[0].skeleton.drawmodel.textureptr,1,
+                       &player[0].skeleton.skinText[0],&player[0].skeleton.skinsize);
  }
  
void  Game::Setenvironment(int which)
static void ch_white(Game *game, const char *args)
  {
-       LOGFUNC;
+   game->LoadTextureSave(":Data:Textures:fur.jpg",&player[0].skeleton.drawmodel.textureptr,1,
+                       &player[0].skeleton.skinText[0],&player[0].skeleton.skinsize);
+ }
  
-       LOG(" Setting environment...");
+ static void ch_brown(Game *game, const char *args)
+ {
+   game->LoadTextureSave(":Data:Textures:fur3.jpg",&player[0].skeleton.drawmodel.textureptr,1,
+                       &player[0].skeleton.skinText[0],&player[0].skeleton.skinsize);
+ }
  
-       float temptexdetail;
-       environment=which;
- /*
-       OPENAL_SetPaused(channels[music1snow], true);
-       OPENAL_SetPaused(channels[music1grass], true);
-       OPENAL_SetPaused(channels[music1desert], true);
-       OPENAL_SetPaused(channels[wind], true);
-       OPENAL_SetPaused(channels[desertambient], true);
- */
-       OPENAL_SetPaused(channels[stream_music1snow], true);
-       OPENAL_SetPaused(channels[stream_music1grass], true);
-       OPENAL_SetPaused(channels[stream_music1desert], true);
-       OPENAL_SetPaused(channels[stream_wind], true);
-       OPENAL_SetPaused(channels[stream_desertambient], true);
+ static void ch_black(Game *game, const char *args)
+ {
+   game->LoadTextureSave(":Data:Textures:fur2.jpg",&player[0].skeleton.drawmodel.textureptr,1,
+                       &player[0].skeleton.skinText[0],&player[0].skeleton.skinsize);
+ }
  
+ static void ch_sizemin(Game *game, const char *args)
+ {
+   int i;
+   for (i = 1; i < numplayers; i++)
+     if (player[i].scale < 0.8 * 0.2)
+       player[i].scale = 0.8 * 0.2;
+ }
  
-       if(environment==snowyenvironment){
-               windvector=0;
-               windvector.z=3;
-               if(ambientsound){
-                       //PlaySoundEx( wind, samp[wind], NULL, true);
-                       PlayStreamEx(stream_wind, strm[stream_wind], 0, true);
-                       OPENAL_SetPaused(channels[stream_wind], false);
-                       OPENAL_SetVolume(channels[stream_wind], 256);
-               }
+ static void ch_tutorial(Game *game, const char *args)
+ {
+   tutoriallevel = atoi(args);
+ }
  
-               LoadTexture(":Data:Textures:snowtree.png",&objects.treetextureptr,0,1);
-               LoadTexture(":Data:Textures:bushsnow.png",&objects.bushtextureptr,0,1);
-               LoadTexture(":Data:Textures:bouldersnow.jpg",&objects.rocktextureptr,1,0);
-               LoadTexture(":Data:Textures:snowbox.jpg",&objects.boxtextureptr,1,0);
+ static void ch_hostile(Game *game, const char *args)
+ {
+   hostile = atoi(args);
+ }
  
-               OPENAL_Sample_Free(samp[footstepsound]);
-               OPENAL_Sample_Free(samp[footstepsound2]);
-               OPENAL_Sample_Free(samp[footstepsound3]);
-               OPENAL_Sample_Free(samp[footstepsound4]);
-               samp[footstepsound] = OPENAL_Sample_Load(OPENAL_FREE, ConvertFileName(":Data:Sounds:footstepsnow1.ogg"), OPENAL_HW3D, 0, 0);
-               samp[footstepsound2] = OPENAL_Sample_Load(OPENAL_FREE, ConvertFileName(":Data:Sounds:footstepsnow2.ogg"), OPENAL_HW3D, 0, 0);
-               samp[footstepsound3] = OPENAL_Sample_Load(OPENAL_FREE, ConvertFileName(":Data:Sounds:footstepstone1.ogg"), OPENAL_HW3D, 0, 0);
-               samp[footstepsound4] = OPENAL_Sample_Load(OPENAL_FREE, ConvertFileName(":Data:Sounds:footstepstone2.ogg"), OPENAL_HW3D, 0, 0);
-               OPENAL_Sample_SetMinMaxDistance(samp[footstepsound], 4.0f, 1000.0f);
-               OPENAL_Sample_SetMinMaxDistance(samp[footstepsound2], 4.0f, 1000.0f);
-               OPENAL_Sample_SetMinMaxDistance(samp[footstepsound3], 4.0f, 1000.0f);
-               OPENAL_Sample_SetMinMaxDistance(samp[footstepsound4], 4.0f, 1000.0f);
+ static void ch_indemo(Game *game, const char *args)
+ {
+   game->indemo=1;
+   hotspot[numhotspots]=player[0].coords;
+   hotspotsize[numhotspots]=0;
+   hotspottype[numhotspots]=-111;
+   strcpy(hotspottext[numhotspots],"mapname");
+   numhotspots++;
+ }
  
-               LoadTexture(":Data:Textures:snow.jpg",&terraintexture,1,0);
+ static void ch_notindemo(Game *game, const char *args)
+ {
+   game->indemo=0;
+   numhotspots--;
+ }
  
-               LoadTexture(":Data:Textures:rock.jpg",&terraintexture2,1,0);
+ static void ch_type(Game *game, const char *args)
+ {
+   int i, n = sizeof(editortypenames) / sizeof(editortypenames[0]);
+   for (i = 0; i < n; i++)
+     if (stripfx(args, editortypenames[i]))
+       {
+       editoractive = i;
+       break;
+       }
+ }
  
-               //LoadTexture(":Data:Textures:detailgrain.png",&terraintexture3,1);
+ static void ch_path(Game *game, const char *args)
+ {
+   int i, n = sizeof(pathtypenames) / sizeof(pathtypenames[0]);
+   for (i = 0; i < n; i++)
+     if (stripfx(args, pathtypenames[i]))
+       {
+       editorpathtype = i;
+       break;
+       }
+ }
  
+ static void ch_hs(Game *game, const char *args)
+ {
+   hotspot[numhotspots]=player[0].coords;
  
+   float size;
+   int type, shift;
+   sscanf(args, "%f%d %n", &size, &type, &shift);
  
+   hotspotsize[numhotspots] = size;
+   hotspottype[numhotspots] = type;
  
-               temptexdetail=texdetail;
-               if(texdetail>1)texdetail=4;
-               skybox.load(    ":Data:Textures:Skybox(snow):Front.jpg",
-                       ":Data:Textures:Skybox(snow):Left.jpg",
-                       ":Data:Textures:Skybox(snow):Back.jpg",
-                       ":Data:Textures:Skybox(snow):Right.jpg",
-                       ":Data:Textures:Skybox(snow):Up.jpg",
-                       ":Data:Textures:Skybox(snow):Down.jpg",
-                       ":Data:Textures:Skybox(snow):Cloud.jpg",
-                       ":Data:Textures:Skybox(snow):Reflect.jpg");
+   strcpy(hotspottext[numhotspots], args + shift);
+   strcat(hotspottext[numhotspots], "\n");
  
+   numhotspots++;
+ }
  
+ static void ch_dialogue(Game *game, const char *args)
+ {
+   int dlg, i, j;
+   char buf1[32], buf2[64];
+   sscanf(args, "%d %31s", &dlg, buf1);
+   snprintf(buf2, 63, ":Data:Dialogues:%s.txt", buf1);
+   dialoguetype[numdialogues] = dlg;
+   memset(dialoguetext[numdialogues], 0, sizeof(dialoguetext[numdialogues]));
+   memset(dialoguename[numdialogues], 0, sizeof(dialoguename[numdialogues]));
+   ifstream ipstream(ConvertFileName(buf2));
+   ipstream.ignore(256,':');
+   ipstream >> numdialogueboxes[numdialogues];
+   for(i=0;i<numdialogueboxes[numdialogues];i++){
+     ipstream.ignore(256,':');
+     ipstream.ignore(256,':');
+     ipstream.ignore(256,' ');
+     ipstream >> dialogueboxlocation[numdialogues][i];
+     ipstream.ignore(256,':');
+     ipstream >> dialogueboxcolor[numdialogues][i][0];
+     ipstream >> dialogueboxcolor[numdialogues][i][1];
+     ipstream >> dialogueboxcolor[numdialogues][i][2];
+     ipstream.ignore(256,':');
+     ipstream.getline(dialoguename[numdialogues][i],64);
+     ipstream.ignore(256,':');
+     ipstream.ignore(256,' ');
+     ipstream.getline(dialoguetext[numdialogues][i],128);
+     for(j=0;j<128;j++){
+       if(dialoguetext[numdialogues][i][j]=='\\')dialoguetext[numdialogues][i][j]='\n';
+     }
+     ipstream.ignore(256,':');
+     ipstream >> dialogueboxsound[numdialogues][i];
+   }
+   for(i=0;i<numdialogueboxes[numdialogues];i++){
+     for(j=0;j<numplayers;j++){
+       participantfacing[numdialogues][i][j]=player[j].facing;
+     }
+   }
+   ipstream.close();
+   directing=1;
+   indialogue=0;
+   whichdialogue=numdialogues;
+   numdialogues++;
+ }
  
+ static void ch_fixdialogue(Game *game, const char *args)
+ {
+   char buf1[32], buf2[64];
+   int whichdi, i, j;
+   sscanf(args, "%d %31s", &whichdi, buf1);
+   snprintf(buf2, 63, ":Data:Dialogues:%s.txt", buf1);
+   memset(dialoguetext[whichdi], 0, sizeof(dialoguetext[whichdi]));
+   memset(dialoguename[whichdi], 0, sizeof(dialoguename[whichdi]));
+   ifstream ipstream(ConvertFileName(buf2));
+   ipstream.ignore(256,':');
+   ipstream >> numdialogueboxes[whichdi];
+   for(i=0;i<numdialogueboxes[whichdi];i++){
+     ipstream.ignore(256,':');
+     ipstream.ignore(256,':');
+     ipstream.ignore(256,' ');
+     ipstream >> dialogueboxlocation[whichdi][i];
+     ipstream.ignore(256,':');
+     ipstream >> dialogueboxcolor[whichdi][i][0];
+     ipstream >> dialogueboxcolor[whichdi][i][1];
+     ipstream >> dialogueboxcolor[whichdi][i][2];
+     ipstream.ignore(256,':');
+     ipstream.getline(dialoguename[whichdi][i],64);
+     ipstream.ignore(256,':');
+     ipstream.ignore(256,' ');
+     ipstream.getline(dialoguetext[whichdi][i],128);
+     for(j=0;j<128;j++){
+       if(dialoguetext[whichdi][i][j]=='\\')dialoguetext[whichdi][i][j]='\n';
+     }
+     ipstream.ignore(256,':');
+     ipstream >> dialogueboxsound[whichdi][i];
+   }
+   ipstream.close();
+ }
  
-               texdetail=temptexdetail;
-       }
-       if(environment==desertenvironment){
-               windvector=0;
-               windvector.z=2;
-               LoadTexture(":Data:Textures:deserttree.png",&objects.treetextureptr,0,1);
-               LoadTexture(":Data:Textures:bushdesert.png",&objects.bushtextureptr,0,1);
-               LoadTexture(":Data:Textures:boulderdesert.jpg",&objects.rocktextureptr,1,0);
-               LoadTexture(":Data:Textures:desertbox.jpg",&objects.boxtextureptr,1,0);
+ static void ch_fixtype(Game *game, const char *args)
+ {
+   int dlg;
+   sscanf(args, "%d", &dlg);
+   dialoguetype[0] = dlg;
+ }
  
+ static void ch_fixrotation(Game *game, const char *args)
+ {
+   participantrotation[whichdialogue][participantfocus[whichdialogue][indialogue]]=player[participantfocus[whichdialogue][indialogue]].rotation;
+ }
  
-               if(ambientsound){
-                       //PlaySoundEx( desertambient, samp[desertambient], NULL, true);
-                       PlayStreamEx( stream_desertambient, strm[stream_desertambient], NULL, true);
-                       OPENAL_SetPaused(channels[stream_desertambient], false);
-                       OPENAL_SetVolume(channels[stream_desertambient], 256);
-               }
+ static void ch_ddialogue(Game *game, const char *args)
+ {
+   if (numdialogues)
+     numdialogues--;
+ }
  
-               OPENAL_Sample_Free(samp[footstepsound]);
-               OPENAL_Sample_Free(samp[footstepsound2]);
-               OPENAL_Sample_Free(samp[footstepsound3]);
-               OPENAL_Sample_Free(samp[footstepsound4]);
-               samp[footstepsound] = OPENAL_Sample_Load(OPENAL_FREE, ConvertFileName(":Data:Sounds:footstepsnow1.ogg"), OPENAL_HW3D, 0, 0);
-               samp[footstepsound2] = OPENAL_Sample_Load(OPENAL_FREE, ConvertFileName(":Data:Sounds:footstepsnow2.ogg"), OPENAL_HW3D, 0, 0);
-               samp[footstepsound3] = OPENAL_Sample_Load(OPENAL_FREE, ConvertFileName(":Data:Sounds:footstepsnow1.ogg"), OPENAL_HW3D, 0, 0);
-               samp[footstepsound4] = OPENAL_Sample_Load(OPENAL_FREE, ConvertFileName(":Data:Sounds:footstepsnow2.ogg"), OPENAL_HW3D, 0, 0);
-               OPENAL_Sample_SetMinMaxDistance(samp[footstepsound], 4.0f, 1000.0f);
-               OPENAL_Sample_SetMinMaxDistance(samp[footstepsound2], 4.0f, 1000.0f);
-               OPENAL_Sample_SetMinMaxDistance(samp[footstepsound3], 4.0f, 1000.0f);
-               OPENAL_Sample_SetMinMaxDistance(samp[footstepsound4], 4.0f, 1000.0f);
-               LoadTexture(":Data:Textures:sand.jpg",&terraintexture,1,0);
-               LoadTexture(":Data:Textures:sandslope.jpg",&terraintexture2,1,0);
+ static void ch_dhs(Game *game, const char *args)
+ {
+   if (numhotspots)
+     numhotspots--;
+ }
  
-               //LoadTexture(":Data:Textures:detailgrain.png",&terraintexture3,1);
+ static void ch_immobile(Game *game, const char *args)
+ {
+   player[0].immobile = 1;
+ }
  
+ static void ch_allimmobile(Game *game, const char *args)
+ {
+   for (int i = 1; i < numplayers; i++)
+     player[i].immobile = 1;
+ }
  
+ static void ch_mobile(Game *game, const char *args)
+ {
+   player[0].immobile = 0;
+ }
  
-               temptexdetail=texdetail;
-               if(texdetail>1)texdetail=4;
-               skybox.load(    ":Data:Textures:Skybox(sand):Front.jpg",
-                       ":Data:Textures:Skybox(sand):Left.jpg",
-                       ":Data:Textures:Skybox(sand):Back.jpg",
-                       ":Data:Textures:Skybox(sand):Right.jpg",
-                       ":Data:Textures:Skybox(sand):Up.jpg",
-                       ":Data:Textures:Skybox(sand):Down.jpg",
-                       ":Data:Textures:Skybox(sand):Cloud.jpg",
-                       ":Data:Textures:Skybox(sand):Reflect.jpg");
+ static void ch_default(Game *game, const char *args)
+ {
+   player[0].armorhead=1;
+   player[0].armorhigh=1;
+   player[0].armorlow=1;
+   player[0].protectionhead=1;
+   player[0].protectionhigh=1;
+   player[0].protectionlow=1;
+   player[0].metalhead=1;
+   player[0].metalhigh=1;
+   player[0].metallow=1;
+   player[0].power=1;
+   player[0].speedmult=1;
+   player[0].scale=1;
+   if(player[0].creature==wolftype){
+     player[0].proportionhead=1.1;
+     player[0].proportionbody=1.1;
+     player[0].proportionarms=1.1;
+     player[0].proportionlegs=1.1;
+   }
+   if(player[0].creature==rabbittype){
+     player[0].proportionhead=1.2;
+     player[0].proportionbody=1.05;
+     player[0].proportionarms=1.00;
+     player[0].proportionlegs=1.1;
+     player[0].proportionlegs.y=1.05;
+   }
+   player[0].numclothes=0;
+   game->LoadTextureSave(creatureskin[player[0].creature][player[0].whichskin],
+                       &player[0].skeleton.drawmodel.textureptr,1,&player[0].skeleton.skinText[0],
+                       &player[0].skeleton.skinsize);
+   editoractive=typeactive;
+   player[0].immobile=0;
+ }
  
+ static void ch_play(Game *game, const char *args)
+ {
+   int dlg, i;
+   sscanf(args, "%d", &dlg);
+   whichdialogue = dlg;
+   if (whichdialogue >= numdialogues)
+     return;
+   for(i=0;i<numdialogueboxes[whichdialogue];i++){
+     player[participantfocus[whichdialogue][i]].coords=participantlocation[whichdialogue][participantfocus[whichdialogue][i]];
+     player[participantfocus[whichdialogue][i]].rotation=participantrotation[whichdialogue][participantfocus[whichdialogue][i]];
+     player[participantfocus[whichdialogue][i]].targetrotation=participantrotation[whichdialogue][participantfocus[whichdialogue][i]];
+     player[participantfocus[whichdialogue][i]].velocity=0;
+     player[participantfocus[whichdialogue][i]].targetanimation=player[participantfocus[whichdialogue][i]].getIdle();
+     player[participantfocus[whichdialogue][i]].targetframe=0;
+   }
+   directing=0;
+   indialogue=0;
+   float gLoc[3];
+   float vel[3];
+   XYZ temppos;
+   temppos=player[participantfocus[whichdialogue][indialogue]].coords;
+   temppos=temppos-viewer;
+   Normalise(&temppos);
+   temppos+=viewer;
+   gLoc[0]=temppos.x;
+   gLoc[1]=temppos.y;
+   gLoc[2]=temppos.z;
+   vel[0]=0;
+   vel[1]=0;
+   vel[2]=0;
+   int whichsoundplay;
+   whichsoundplay=rabbitchitter;
+   if(dialogueboxsound[whichdialogue][indialogue]==2)whichsoundplay=rabbitchitter2;
+   if(dialogueboxsound[whichdialogue][indialogue]==3)whichsoundplay=rabbitpainsound;
+   if(dialogueboxsound[whichdialogue][indialogue]==4)whichsoundplay=rabbitpain1sound;
+   if(dialogueboxsound[whichdialogue][indialogue]==5)whichsoundplay=rabbitattacksound;
+   if(dialogueboxsound[whichdialogue][indialogue]==6)whichsoundplay=rabbitattack2sound;
+   if(dialogueboxsound[whichdialogue][indialogue]==7)whichsoundplay=rabbitattack3sound;
+   if(dialogueboxsound[whichdialogue][indialogue]==8)whichsoundplay=rabbitattack4sound;
+   if(dialogueboxsound[whichdialogue][indialogue]==9)whichsoundplay=growlsound;
+   if(dialogueboxsound[whichdialogue][indialogue]==10)whichsoundplay=growl2sound;
+   if(dialogueboxsound[whichdialogue][indialogue]==11)whichsoundplay=snarlsound;
+   if(dialogueboxsound[whichdialogue][indialogue]==12)whichsoundplay=snarl2sound;
+   if(dialogueboxsound[whichdialogue][indialogue]==13)whichsoundplay=barksound;
+   if(dialogueboxsound[whichdialogue][indialogue]==14)whichsoundplay=bark2sound;
+   if(dialogueboxsound[whichdialogue][indialogue]==15)whichsoundplay=bark3sound;
+   if(dialogueboxsound[whichdialogue][indialogue]==16)whichsoundplay=barkgrowlsound;
+   if(dialogueboxsound[whichdialogue][indialogue]==-1)whichsoundplay=fireendsound;
+   if(dialogueboxsound[whichdialogue][indialogue]==-2)whichsoundplay=firestartsound;
+   if(dialogueboxsound[whichdialogue][indialogue]==-3)whichsoundplay=consolesuccesssound;
+   if(dialogueboxsound[whichdialogue][indialogue]==-4)whichsoundplay=consolefailsound;
+   PlaySoundEx( whichsoundplay, samp[whichsoundplay], NULL, true);
+   OPENAL_3D_SetAttributes(channels[whichsoundplay], gLoc, vel);
+   OPENAL_SetVolume(channels[whichsoundplay], 256);
+   OPENAL_SetPaused(channels[whichsoundplay], false);
+ }
  
+ static void ch_mapkilleveryone(Game *game, const char *args)
+ {
+   maptype = mapkilleveryone;
+ }
  
+ static void ch_mapkillmost(Game *game, const char *args)
+ {
+   maptype = mapkillmost;
+ }
  
-               texdetail=temptexdetail;
-       }
-       if(environment==grassyenvironment){
-               windvector=0;
-               windvector.z=2;
-               LoadTexture(":Data:Textures:tree.png",&objects.treetextureptr,0,1);
-               LoadTexture(":Data:Textures:bush.png",&objects.bushtextureptr,0,1);
-               LoadTexture(":Data:Textures:boulder.jpg",&objects.rocktextureptr,1,0);
-               LoadTexture(":Data:Textures:grassbox.jpg",&objects.boxtextureptr,1,0);
+ static void ch_mapkillsomeone(Game *game, const char *args)
+ {
+   maptype = mapkillsomeone;
+ }
  
-               if(ambientsound){
-                       PlayStreamEx( stream_wind, strm[stream_wind], NULL, true);
-                       OPENAL_SetPaused(channels[stream_wind], false);
-                       OPENAL_SetVolume(channels[stream_wind], 100);
-               }
+ static void ch_mapgosomewhere(Game *game, const char *args)
+ {
+   maptype = mapgosomewhere;
+ }
  
-               OPENAL_Sample_Free(samp[footstepsound]);
-               OPENAL_Sample_Free(samp[footstepsound2]);
-               OPENAL_Sample_Free(samp[footstepsound3]);
-               OPENAL_Sample_Free(samp[footstepsound4]);
-               samp[footstepsound] = OPENAL_Sample_Load(OPENAL_FREE, ConvertFileName(":Data:Sounds:footstepgrass1.ogg"), OPENAL_HW3D, 0, 0);
-               samp[footstepsound2] = OPENAL_Sample_Load(OPENAL_FREE, ConvertFileName(":Data:Sounds:footstepgrass2.ogg"), OPENAL_HW3D, 0, 0);
-               samp[footstepsound3] = OPENAL_Sample_Load(OPENAL_FREE, ConvertFileName(":Data:Sounds:footstepstone1.ogg"), OPENAL_HW3D, 0, 0);
-               samp[footstepsound4] = OPENAL_Sample_Load(OPENAL_FREE, ConvertFileName(":Data:Sounds:footstepstone2.ogg"), OPENAL_HW3D, 0, 0);
-               OPENAL_Sample_SetMinMaxDistance(samp[footstepsound], 4.0f, 1000.0f);
-               OPENAL_Sample_SetMinMaxDistance(samp[footstepsound2], 4.0f, 1000.0f);
-               OPENAL_Sample_SetMinMaxDistance(samp[footstepsound3], 4.0f, 1000.0f);
-               OPENAL_Sample_SetMinMaxDistance(samp[footstepsound4], 4.0f, 1000.0f);
+ static void ch_viewdistance(Game *game, const char *args)
+ {
+   viewdistance = atof(args)*100;
+ }
  
-               LoadTexture(":Data:Textures:grassdirt.jpg",&terraintexture,1,0);
+ static void ch_fadestart(Game *game, const char *args)
+ {
+   fadestart = atof(args);
+ }
  
-               LoadTexture(":Data:Textures:mossrock.jpg",&terraintexture2,1,0);
+ static void ch_slomo(Game *game, const char *args)
+ {
+   slomospeed = atof(args);
+   slomo = !slomo;
+   slomodelay = 1000;
+ }
  
-               //LoadTexture(":Data:Textures:detail.png",&terraintexture3,1);
+ static void ch_slofreq(Game *game, const char *args)
+ {
+   slomofreq = atof(args);
+ }
  
+ static void ch_skytint(Game *game, const char *args)
+ {
+   sscanf(args, "%f%f%f", &skyboxr, &skyboxg, &skyboxb);
  
+   skyboxlightr=skyboxr;
+   skyboxlightg=skyboxg;
+   skyboxlightb=skyboxb;
  
-               temptexdetail=texdetail;
-               if(texdetail>1)texdetail=4;
-               skybox.load(    ":Data:Textures:Skybox(grass):Front.jpg",
-                       ":Data:Textures:Skybox(grass):Left.jpg",
-                       ":Data:Textures:Skybox(grass):Back.jpg",
-                       ":Data:Textures:Skybox(grass):Right.jpg",
-                       ":Data:Textures:Skybox(grass):Up.jpg",
-                       ":Data:Textures:Skybox(grass):Down.jpg",
-                       ":Data:Textures:Skybox(grass):Cloud.jpg",
-                       ":Data:Textures:Skybox(grass):Reflect.jpg");
+   game->SetUpLighting();
  
+   terrain.DoShadows();
+   objects.DoShadows();
+ }
  
+ static void ch_skylight(Game *game, const char *args)
+ {
+   sscanf(args, "%f%f%f", &skyboxlightr, &skyboxlightg, &skyboxlightb);
  
-               texdetail=temptexdetail;
-       }
-       temptexdetail=texdetail;
-       texdetail=1;
-       terrain.load(":Data:Textures:heightmap.png");
+   game->SetUpLighting();
  
-       texdetail=temptexdetail;
+   terrain.DoShadows();
+   objects.DoShadows();
  }
  
+ static void ch_skybox(Game *game, const char *args)
+ {
+   skyboxtexture = !skyboxtexture;
  
- void  Game::Loadlevel(int which){
-       stealthloading=0;
+   game->SetUpLighting();
  
-       if(which==0)Loadlevel((char *)":Data:Maps:map1");
-       else if(which==1)Loadlevel((char *)":Data:Maps:map2");
-       else if(which==2)Loadlevel((char *)":Data:Maps:map3");
-       else if(which==3)Loadlevel((char *)":Data:Maps:map4");
-       else if(which==4)Loadlevel((char *)":Data:Maps:map5");
-       else if(which==5)Loadlevel((char *)":Data:Maps:map6");
-       else if(which==6)Loadlevel((char *)":Data:Maps:map7");
-       else if(which==7)Loadlevel((char *)":Data:Maps:map8");
-       else if(which==8)Loadlevel((char *)":Data:Maps:map9");
-       else if(which==9)Loadlevel((char *)":Data:Maps:map10");
-       else if(which==10)Loadlevel((char *)":Data:Maps:map11");
-       else if(which==11)Loadlevel((char *)":Data:Maps:map12");
-       else if(which==12)Loadlevel((char *)":Data:Maps:map13");
-       else if(which==13)Loadlevel((char *)":Data:Maps:map14");
-       else if(which==14)Loadlevel((char *)":Data:Maps:map15");
-       else if(which==15)Loadlevel((char *)":Data:Maps:map16");
-       else if(which==-1){tutoriallevel=-1;Loadlevel((char *)":Data:Maps:tutorial");}
-       else Loadlevel((char *)":Data:Maps:mapsave");
+   terrain.DoShadows();
+   objects.DoShadows();
+ }
  
-       whichlevel=which;
+ static void cmd_dispatch(Game *game, const char *cmd)
+ {
+   int i, n_cmds = sizeof(cmd_names) / sizeof(cmd_names[0]);
+   for (i = 0; i < n_cmds; i++)
+     if (stripfx(cmd, cmd_names[i]))
+       {
+       cmd_handlers[i](game, cmd + strlen(cmd_names[i]));
+       break;
+       }
+   if (i < n_cmds)
+     {
+       PlaySoundEx(consolesuccesssound, samp[consolesuccesssound], NULL, true);
+       OPENAL_SetVolume(channels[consolesuccesssound], 256);
+       OPENAL_SetPaused(channels[consolesuccesssound], false);
+     }
+   else
+     {
+       PlaySoundEx(consolefailsound, samp[consolefailsound], NULL, true);
+       OPENAL_SetVolume(channels[consolefailsound], 256);
+       OPENAL_SetPaused(channels[consolefailsound], false);
+     }
  }
  
- /*char * Game::MD5_string (unsigned char *string){
- char temp[50];
- char temp2[100];
  
- strcpy(temp2,(const char *)string);
- strcat((char *)temp2,(const char *)"Lugaru");
- sprintf (temp, "%d",strlen((char *)temp2));
- strcat((char *)temp2,temp);
  
- MD5 context;
- unsigned int len = strlen ( (char *)temp2);
+ /********************> Tick() <*****/
+ extern void ScreenShot(const char * fname);
+ void Screenshot       (void)
+ {
+       char temp[1024];
+       time_t  t = time(NULL);
+       struct  tm *tme = localtime(&t);
+       sprintf(temp, "Screenshots\\Screenshot_%04d_%02d_%02d--%02d_%02d_%02d.png", tme->tm_year + 1900, tme->tm_mon + 1, tme->tm_mday, tme->tm_hour, tme->tm_min, tme->tm_sec);
  
- context.update   ((unsigned char *)temp2, len);
- context.finalize ();
+       #if defined(_WIN32)
+       mkdir("Screenshots");
+       #else
+       mkdir("Screenshots", S_IRWXU);
+       #endif
  
- return context.hex_digest();
- }*/
+       ScreenShot(temp/*"Screenshots\\Screenshot.png"*/);
  
+       /*FSSpec                                MAC_file;
+       GraphicsExportComponent QT_exporter;
+       OSErr                           MAC_error_code;
+       CGrafPtr                        MAC_currentPort;
+       GDHandle                        MAC_currentDevice;
+       unsigned char*          MAC_pixels;
+       Rect                            MAC_picture_rectangle;
+       GWorldPtr                       MAC_offscreen_graphics_port;
  
+       static int numscreenshots=0;
  
- void  Game::Loadlevel(char *name){
-       int i,j,k,l,m;
-       static int oldlevel;
-       int templength;
-       float lamefloat;
-       int lameint;
+       // Make an FSSpec
+       static char buf[256];
+       if(numscreenshots==0){
+       buf[0]=26;
+       buf[1]=':';
+       buf[2]='S';
+       buf[3]='c';
+       buf[4]='r';
+       buf[5]='e';
+       buf[6]='e';
+       buf[7]='n';
+       buf[8]='s';
+       buf[9]='h';
+       buf[10]='o';
+       buf[11]='t';
+       buf[12]='s';
+       buf[13]=':';
+       buf[14]='S';
+       buf[15]='c';
+       buf[16]='r';
+       buf[17]='e';
+       buf[18]='e';
+       buf[19]='n';
+       buf[20]='s';
+       buf[21]='h';
+       buf[22]='o';
+       buf[23]='t';
+       buf[24]='0';
+       buf[25]='0';
+       buf[26]='0';
+       }
  
-       float headprop,legprop,armprop,bodyprop;
+       FInfo *fndrInfo;
+       FSMakeFSSpec(0, 0, (unsigned char*)buf, &MAC_file);
+       while(!FSpGetFInfo (&MAC_file, fndrInfo)){
+       FSMakeFSSpec(0, 0, (unsigned char*)buf, &MAC_file);
+       if(!FSpGetFInfo (&MAC_file, fndrInfo)){
+       numscreenshots++;
+       buf[26]++;
+       if(buf[26]==':'){
+       buf[26]='0';
+       buf[25]++;
+       if(buf[25]==':'){
+       buf[25]='0';
+       buf[24]++;
+       if(buf[24]==':'){
+       buf[24]='9';
+       buf[25]='9';
+       buf[26]='9';
+       }
+       }
+       }
+       }
+       }
  
-       LOGFUNC;
  
-       LOG(std::string("Loading level...") + name);
+       // Get the GWorld
+       GWorldPtr                       MAC_gWorld = (CGrafPtr) FrontWindow();
+       //assert(MAC_gWorld != NULL);
  
-       if(!gameon)visibleloading=1;
+       // Allocate memory for loading image
+       MAC_pixels = new unsigned char[(int)(screenheight * screenwidth * 4)];
+       if (MAC_pixels == NULL) {
+       //UTIL_Error("Could not create Texture data.");
+       return;
+       }
  
-       if(stealthloading)visibleloading=0;
+       // Get GWorld
+       ::GetGWorld(&MAC_currentPort, &MAC_currentDevice);
  
-       if(!stillloading)loadtime=0;
-       gamestarted=1;
+       // Make a picture Rectangle
+       MAC_picture_rectangle.left = 0;
+       MAC_picture_rectangle.right = screenwidth;
+       MAC_picture_rectangle.top = 0;
+       MAC_picture_rectangle.bottom = screenheight;
  
-       numenvsounds=0;
-       //visibleloading=1;
-       if(tutoriallevel!=-1)tutoriallevel=0;
-       else tutoriallevel=1;
+       // Create new offscreen GWorld
+       MAC_error_code = ::QTNewGWorldFromPtr (&MAC_offscreen_graphics_port, k32ARGBPixelFormat, &MAC_picture_rectangle, NULL, NULL, 0, (char *) MAC_pixels, screenwidth * 4);
+       if (MAC_error_code)     {
+       ::SetGWorld(MAC_currentPort, MAC_currentDevice);
+       delete MAC_pixels;
+       //UTIL_Error("Could not create offscreen GWorld. ");
+       return;
  
-       if(tutoriallevel==1)tutorialstage=0;
-       if(tutorialstage==0){
-               tutorialstagetime=0;
-               tutorialmaxtime=1;
-       }
-       loadingstuff=1;
-       if(!firstload){
-               oldlevel=50;
        }
-       OPENAL_SetPaused(channels[whooshsound], true);
-       OPENAL_SetPaused(channels[stream_firesound], true);
  
-       // Change the map filename into something that is os specific
-       char *FixedFN = ConvertFileName(name);
-       int mapvers;
-       FILE                    *tfile;
-       tfile=fopen( FixedFN, "rb" );
-       if(tfile)
-       {
-               OPENAL_SetPaused(channels[stream_firesound], true);
+       // Copy OpenGL Context to new GWorld
+       glReadBuffer(GL_FRONT);
+       glReadPixels(0,0,screenwidth,screenheight,GL_RGBA,GL_UNSIGNED_BYTE,MAC_pixels);
  
+       // Swizzle texture
+       for (unsigned long byte = 0; byte < screenheight * screenwidth * 4; byte+=4) {
+       unsigned char temp = MAC_pixels[byte+0];
+       MAC_pixels[byte+0] = MAC_pixels[byte+3];
+       MAC_pixels[byte+3] = MAC_pixels[byte+2];
+       MAC_pixels[byte+2] = MAC_pixels[byte+1];
+       MAC_pixels[byte+1] = temp;
+       }
  
-               scoreadded=0;
-               windialogue=0;
+       // Flip the image  :(   This could probably be optimized
+       int vert;
+       int src_index;
+       int dst_index;
+       unsigned char temp;
+       for (int horz = 0; horz < screenwidth; ++horz)
+       for (vert = 0; vert < screenheight / 2; ++vert) {
+       src_index = (screenwidth * vert + horz) * 4;
+       dst_index = (screenwidth * (screenheight - vert - 1) + horz) * 4;
  
-               hostiletime=0;
+       temp=MAC_pixels[src_index+0];
+       MAC_pixels[src_index+0]=MAC_pixels[dst_index+0];
+       MAC_pixels[dst_index+0]=temp;
  
-               won=0;
+       temp=MAC_pixels[src_index+1];
+       MAC_pixels[src_index+1]=MAC_pixels[dst_index+1];
+       MAC_pixels[dst_index+1]=temp;
  
-               //campaign=0;
-               animation[bounceidleanim].Load((char *)":Data:Animations:Idle",middleheight,neutral);
+       temp=MAC_pixels[src_index+2];
+       MAC_pixels[src_index+2]=MAC_pixels[dst_index+2];
+       MAC_pixels[dst_index+2]=temp;
  
-               numdialogues=0;
+       temp=MAC_pixels[src_index+3];
+       MAC_pixels[src_index+3]=MAC_pixels[dst_index+3];
+       MAC_pixels[dst_index+3]=temp;
+       }
  
-               for(i=0;i<20;i++)
-               {
-                       dialoguegonethrough[i]=0;
-               }
  
-               indialogue=-1;
-               cameramode=0;
  
-               damagedealt=0;
-               damagetaken=0;
+       // Export the Gworld
+       MAC_error_code =  OpenADefaultComponent(GraphicsExporterComponentType, kQTFileTypeBMP, &QT_exporter);
+       if (MAC_error_code) {
+       //UTIL_Warning("Unable to export screenshot.");
+       ::SetGWorld(MAC_currentPort, MAC_currentDevice);
+       ::DisposeGWorld(MAC_offscreen_graphics_port);
+       delete MAC_pixels;
+       return;
+       }
  
-               if(accountactive!=-1)difficulty=accountdifficulty[accountactive];
+       MAC_error_code =  GraphicsExportSetInputGWorld(QT_exporter,MAC_offscreen_graphics_port);
+       if (MAC_error_code) {
+       ::CloseComponent(QT_exporter);
+       ::SetGWorld(MAC_currentPort, MAC_currentDevice);
+       ::DisposeGWorld(MAC_offscreen_graphics_port);
+       delete MAC_pixels;
+       //UTIL_Warning("Unable to export screenshot.");
+       return;
+       }
  
-               if(difficulty!=2)minimap=1;
-               else minimap=0;
+       MAC_error_code = GraphicsExportSetOutputFile(QT_exporter,&MAC_file);
+       if (MAC_error_code) {
+       ::CloseComponent(QT_exporter);
+       ::SetGWorld(MAC_currentPort, MAC_currentDevice);
+       ::DisposeGWorld(MAC_offscreen_graphics_port);
+       delete MAC_pixels;
+       //UTIL_Warning("Unable to export screenshot.");
+       return;
+       }
  
-               numhotspots=0;
-               currenthotspot=-1;
-               bonustime=1;
+       MAC_error_code = GraphicsExportDoExport(QT_exporter,NULL);
+       if (MAC_error_code) {
+       ::CloseComponent(QT_exporter);
+       ::SetGWorld(MAC_currentPort, MAC_currentDevice);
+       ::DisposeGWorld(MAC_offscreen_graphics_port);
+       delete MAC_pixels;
+       //UTIL_Warning("Unable to export screenshot.");
+       return;
+       }
  
-               skyboxtexture=1;
-               skyboxr=1;
-               skyboxg=1;
-               skyboxb=1;
+       ::CloseComponent(QT_exporter);
+       ::SetGWorld(MAC_currentPort, MAC_currentDevice);
+       ::DisposeGWorld(MAC_offscreen_graphics_port);
  
-               freeze=0;
-               winfreeze=0;
+       delete MAC_pixels;*/
+ }
  
-               for(i=0;i<100;i++)
-               {
-                       bonusnum[i]=0;
-               }
  
-               numfalls=0;
-               numflipfail=0;
-               numseen=0;
-               numstaffattack=0;
-               numswordattack=0;
-               numknifeattack=0;
-               numunarmedattack=0;
-               numescaped=0;
-               numflipped=0;
-               numwallflipped=0;
-               numthrowkill=0;
-               numafterkill=0;
-               numreversals=0;
-               numattacks=0;
-               maxalarmed=0;
-               numresponded=0;
  
-               bonustotal=startbonustotal;
-               bonus=0;
-               gameon=1;
-               changedelay=0;
-               if(console)
-               {
-                       PlaySoundEx( consolesuccesssound, samp[consolesuccesssound], NULL, true);
-                       OPENAL_SetVolume(channels[consolesuccesssound], 256);
-                       OPENAL_SetPaused(channels[consolesuccesssound], false);
-                       freeze=0;
-                       console=0;
-               }
+ void  Game::SetUpLighting(){
+       if(environment==snowyenvironment){
+               light.color[0]=.65;
+               light.color[1]=.65;
+               light.color[2]=.7;
+               light.ambient[0]=.4;
+               light.ambient[1]=.4;
+               light.ambient[2]=.44;
+       }
+       if(environment==desertenvironment){
+               light.color[0]=.95;
+               light.color[1]=.95;
+               light.color[2]=.95;
+               light.ambient[0]=.4;
+               light.ambient[1]=.35;
+               light.ambient[2]=.3;
+       }
  
-               if(!stealthloading)
-               {
-                       terrain.numdecals=0;
-                       sprites.numsprites=0;
-                       for(i=0;i<objects.numobjects;i++)
-                       {
-                               objects.model[i].numdecals=0;
-                       }
+       if(environment==grassyenvironment){
+               light.color[0]=.95;
+               light.color[1]=.95;
+               light.color[2]=1;
+               light.ambient[0]=.4;
+               light.ambient[1]=.4;
+               light.ambient[2]=.44;
+       }
+       if(!skyboxtexture){
+               light.color[0]=1;
+               light.color[1]=1;
+               light.color[2]=1;
+               light.ambient[0]=.4;
+               light.ambient[1]=.4;
+               light.ambient[2]=.4;
+       }
+       float average;
+       average=(skyboxlightr+skyboxlightg+skyboxlightb)/3;
+       light.color[0]*=(skyboxlightr+average)/2;
+       light.color[1]*=(skyboxlightg+average)/2;
+       light.color[2]*=(skyboxlightb+average)/2;
+       light.ambient[0]=light.ambient[0]*(skyboxlightr+average)/2*1;
+       light.ambient[1]=light.ambient[1]*(skyboxlightg+average)/2*1;
+       light.ambient[2]=light.ambient[2]*(skyboxlightb+average)/2*1;
+       /*
+       light.ambient[0]=0;
+       light.ambient[1]=0;
+       light.ambient[2]=0;     */
+ }
  
-                       j=objects.numobjects;
-                       for(i=0;i<j;i++)
-                       {
-                               objects.DeleteObject(0);
-                               if(visibleloading){loadscreencolor=4; LoadingScreen();}
-                       }
+ int Game::findPathDist(int start,int end){
+       int i,j,k,smallestcount,count,connected;
+       int last,last2,last3,last4;
+       int closest;
  
-                       for(i=0;i<subdivision;i++)
-                       {
-                               for(j=0;j<subdivision;j++)
+       smallestcount=1000;
+       for(i=0;i<50;i++){
+               count=0;
+               last=start;
+               last2=-1;
+               last3=-1;
+               last4=-1;
+               while(last!=end&&count<30){
+                       closest=-1;
+                       for(j=0;j<numpathpoints;j++){
+                               if(j!=last&&j!=last2&&j!=last3&&j!=last4)
                                {
-                                       terrain.patchobjectnum[i][j]=0;
+                                       connected=0;
+                                       if(numpathpointconnect[j])
+                                               for(k=0;k<numpathpointconnect[j];k++){
+                                                       if(pathpointconnect[j][k]==last)connected=1;
+                                               }
+                                               if(!connected)
+                                                       if(numpathpointconnect[last])
+                                                               for(k=0;k<numpathpointconnect[last];k++){
+                                                                       if(pathpointconnect[last][k]==j)connected=1;
+                                                               }
+                                                               if(connected)
+                                                                       if(closest==-1||Random()%2==0){
+                                                                               closest=j;
+                                                                       }
                                }
                        }
-                       if(visibleloading){loadscreencolor=4; LoadingScreen();}
+                       last4=last3;
+                       last3=last2;
+                       last2=last;
+                       last=closest;
+                       count++;
                }
+               if(count<smallestcount)smallestcount=count;
+       }
+       return smallestcount;
+ }
  
-               weapons.numweapons=0;
-               funpackf(tfile, "Bi", &mapvers);
-               if(mapvers>=15)funpackf(tfile, "Bi", &indemo);
-               else indemo=0;
-               if(mapvers>=5)funpackf(tfile, "Bi", &maptype);
-               else maptype=mapkilleveryone;
-               if(mapvers>=6)funpackf(tfile, "Bi", &hostile);
-               else hostile=1;
-               if(mapvers>=4)funpackf(tfile, "Bf Bf", &viewdistance, &fadestart);
-               else
-               {
-                       viewdistance=100;
-                       fadestart=.6;
-               }
-               if(mapvers>=2)funpackf(tfile, "Bb Bf Bf Bf", &skyboxtexture, &skyboxr, &skyboxg, &skyboxb);
-               else
-               {
-                       skyboxtexture=1;
-                       skyboxr=1;
-                       skyboxg=1;
-                       skyboxb=1;
-               }
-               if(mapvers>=10)funpackf(tfile, "Bf Bf Bf", &skyboxlightr, &skyboxlightg, &skyboxlightb);
-               else
-               {
-                       skyboxlightr=skyboxr;
-                       skyboxlightg=skyboxg;
-                       skyboxlightb=skyboxb;
-               }
-               if(!stealthloading)funpackf(tfile, "Bf Bf Bf Bf Bf Bi", &player[0].coords.x,&player[0].coords.y,&player[0].coords.z,&player[0].rotation,&player[0].targetrotation, &player[0].num_weapons);
-               if(stealthloading)funpackf(tfile, "Bf Bf Bf Bf Bf Bi", &lamefloat,&lamefloat,&lamefloat,&lamefloat,&lamefloat, &player[0].num_weapons);
-               player[0].originalcoords=player[0].coords;
-               if(player[0].num_weapons>0&&player[0].num_weapons<5)
-               {
-                       for(j=0;j<player[0].num_weapons;j++)
-                       {
-                               player[0].weaponids[j]=weapons.numweapons;
-                               funpackf(tfile, "Bi", &weapons.type[weapons.numweapons]);
-                               weapons.owner[weapons.numweapons]=0;
-                               weapons.numweapons++;
-                       }
-               }
+ int Game::checkcollide(XYZ startpoint,XYZ endpoint){
+       static XYZ colpoint,colviewer,coltarget;
+       static float minx,minz,maxx,maxz,miny,maxy;
+       static int i;
  
-               if(visibleloading){loadscreencolor=4; LoadingScreen();}
+       //startpoint.y+=.7;
+       //endpoint.y+=.7;
+       //startpoint.y-=.1;
+       //endpoint.y-=.1;
  
-               funpackf(tfile, "Bf Bf Bf", &player[0].armorhead, &player[0].armorhigh, &player[0].armorlow);
-               funpackf(tfile, "Bf Bf Bf", &player[0].protectionhead, &player[0].protectionhigh, &player[0].protectionlow);
-               funpackf(tfile, "Bf Bf Bf", &player[0].metalhead, &player[0].metalhigh, &player[0].metallow);
-               funpackf(tfile, "Bf Bf", &player[0].power, &player[0].speedmult);
+       minx=startpoint.x;
+       if(minx>endpoint.x)minx=endpoint.x;
+       miny=startpoint.y;
+       if(miny>endpoint.y)miny=endpoint.y;
+       minz=startpoint.z;
+       if(minz>endpoint.z)minz=endpoint.z;
  
-               funpackf(tfile, "Bi", &player[0].numclothes);
+       maxx=startpoint.x;
+       if(maxx<endpoint.x)maxx=endpoint.x;
+       maxy=startpoint.y;
+       if(maxy<endpoint.y)maxy=endpoint.y;
+       maxz=startpoint.z;
+       if(maxz<endpoint.z)maxz=endpoint.z;
  
-               if(mapvers>=9)
-               {
-                       funpackf(tfile, "Bi Bi", &player[0].whichskin, &player[0].creature);
-               }
-               else
-               {
-                       player[0].whichskin=0;
-                       player[0].creature=rabbittype;
-               }
+       minx-=1;
+       miny-=1;
+       minz-=1;
+       maxx+=1;
+       maxy+=1;
+       maxz+=1;
  
-               for(i=0;i<max_dialogues;i++)
-               {
-                       for(j=0;j<max_dialoguelength;j++)
-                       {
-                               for(k=0;k<128;k++)
-                               {
-                                       dialoguetext[i][j][k]='\0';
-                               }
-                               for(k=0;k<64;k++)
-                               {
-                                       dialoguename[i][j][k]='\0';
-                               }
+       for(i=0;i<objects.numobjects;i++){
+               if(objects.position[i].x>minx-objects.model[i].boundingsphereradius&&objects.position[i].x<maxx+objects.model[i].boundingsphereradius&&objects.position[i].y>miny-objects.model[i].boundingsphereradius&&objects.position[i].y<maxy+objects.model[i].boundingsphereradius&&objects.position[i].z>minz-objects.model[i].boundingsphereradius&&objects.position[i].z<maxz+objects.model[i].boundingsphereradius){
+                       if(objects.type[i]!=treeleavestype&&objects.type[i]!=bushtype&&objects.type[i]!=firetype){
+                               colviewer=startpoint;
+                               coltarget=endpoint;
+                               if(objects.model[i].LineCheck(&colviewer,&coltarget,&colpoint,&objects.position[i],&objects.rotation[i])!=-1)return i;
                        }
                }
+       }
  
-               player[0].lastattack=-1;
-               player[0].lastattack2=-1;
-               player[0].lastattack3=-1;
+       //if(terrain.lineTerrain(startpoint,endpoint,&colpoint)!=-1)return 1000;
  
-               if(mapvers>=8)
-               {
-                       funpackf(tfile, "Bi", &numdialogues);
-                       if(numdialogues)
-                       {
-                               for(k=0;k<numdialogues;k++)
-                               {
-                                       funpackf(tfile, "Bi", &numdialogueboxes[k]);
-                                       funpackf(tfile, "Bi", &dialoguetype[k]);
-                                       for(l=0;l<10;l++)
-                                       {
-                                               funpackf(tfile, "Bf Bf Bf", &participantlocation[k][l].x, &participantlocation[k][l].y, &participantlocation[k][l].z);
-                                               funpackf(tfile, "Bf", &participantrotation[k][l]);
-                                       }
-                                       if(numdialogueboxes)
-                                       {
-                                               for(l=0;l<numdialogueboxes[k];l++)
-                                               {
-                                                       funpackf(tfile, "Bi", &dialogueboxlocation[k][l]);
-                                                       funpackf(tfile, "Bf", &dialogueboxcolor[k][l][0]);
-                                                       funpackf(tfile, "Bf", &dialogueboxcolor[k][l][1]);
-                                                       funpackf(tfile, "Bf", &dialogueboxcolor[k][l][2]);
-                                                       funpackf(tfile, "Bi", &dialogueboxsound[k][l]);
+       return -1;
+ }
  
-                                                       bool doneread;
+ int Game::checkcollide(XYZ startpoint,XYZ endpoint,int what){
+       static XYZ colpoint,colviewer,coltarget;
+       static float minx,minz,maxx,maxz,miny,maxy;
+       static int i;
  
-                                                       funpackf(tfile, "Bi",&templength);
-                                                       if(templength>128||templength<=0)templength=128;
-                                                       for(m=0;m<templength;m++){
-                                                               funpackf(tfile, "Bb", &dialoguetext[k][l][m]);
-                                                               if(dialoguetext[k][l][m]=='\0')break;
-                                                       }
+       //startpoint.y+=.7;
+       //endpoint.y+=.7;
+       //startpoint.y-=.1;
+       //endpoint.y-=.1;
  
-                                                       funpackf(tfile, "Bi",&templength);
-                                                       if(templength>64||templength<=0)templength=64;
-                                                       for(m=0;m<templength;m++){
-                                                               funpackf(tfile, "Bb", &dialoguename[k][l][m]);
-                                                               if(dialoguename[k][l][m]=='\0'){
-                                                                       break;
-                                                               }
-                                                       }
-                                                       funpackf(tfile, "Bf Bf Bf", &dialoguecamera[k][l].x, &dialoguecamera[k][l].y, &dialoguecamera[k][l].z);
-                                                       funpackf(tfile, "Bi", &participantfocus[k][l]);
-                                                       funpackf(tfile, "Bi", &participantaction[k][l]);
+       minx=startpoint.x;
+       if(minx>endpoint.x)minx=endpoint.x;
+       miny=startpoint.y;
+       if(miny>endpoint.y)miny=endpoint.y;
+       minz=startpoint.z;
+       if(minz>endpoint.z)minz=endpoint.z;
  
-                                                       for(m=0;m<10;m++)
-                                                               funpackf(tfile, "Bf Bf Bf", &participantfacing[k][l][m].x, &participantfacing[k][l][m].y, &participantfacing[k][l][m].z);
+       maxx=startpoint.x;
+       if(maxx<endpoint.x)maxx=endpoint.x;
+       maxy=startpoint.y;
+       if(maxy<endpoint.y)maxy=endpoint.y;
+       maxz=startpoint.z;
+       if(maxz<endpoint.z)maxz=endpoint.z;
  
-                                                       funpackf(tfile, "Bf Bf",&dialoguecamerarotation[k][l],&dialoguecamerarotation2[k][l]);
-                                               }
-                                       }
-                               }
-                       }
-               }
-               else numdialogues=0;
+       minx-=1;
+       miny-=1;
+       minz-=1;
+       maxx+=1;
+       maxy+=1;
+       maxz+=1;
  
-               if(player[0].numclothes)
-               {
-                       for(k=0;k<player[0].numclothes;k++)
-                       {
-                               funpackf(tfile, "Bi", &templength);
-                               for(l=0;l<templength;l++)
-                                       funpackf(tfile, "Bb", &player[0].clothes[k][l]);
-                               player[0].clothes[k][templength]='\0';
-                               funpackf(tfile, "Bf Bf Bf", &player[0].clothestintr[k], &player[0].clothestintg[k], &player[0].clothestintb[k]);
+       if(what!=1000){
+               if(objects.position[what].x>minx-objects.model[what].boundingsphereradius&&objects.position[what].x<maxx+objects.model[what].boundingsphereradius&&objects.position[what].y>miny-objects.model[what].boundingsphereradius&&objects.position[what].y<maxy+objects.model[what].boundingsphereradius&&objects.position[what].z>minz-objects.model[what].boundingsphereradius&&objects.position[what].z<maxz+objects.model[what].boundingsphereradius){
+                       if(objects.type[what]!=treeleavestype&&objects.type[what]!=bushtype&&objects.type[what]!=firetype){
+                               colviewer=startpoint;
+                               coltarget=endpoint;
+                               if(objects.model[what].LineCheck(&colviewer,&coltarget,&colpoint,&objects.position[what],&objects.rotation[what])!=-1)return i;
                        }
                }
+       }
  
-               funpackf(tfile, "Bi", &environment);
+       if(what==1000)if(terrain.lineTerrain(startpoint,endpoint,&colpoint)!=-1)return 1000;
  
-               funpackf(tfile, "Bi", &objects.numobjects);
-               if(objects.numobjects)
-               {
-                       for(i=0;i<objects.numobjects;i++)
-                       {
-                               funpackf(tfile, "Bi Bf Bf Bf Bf Bf Bf", &objects.type[i],&objects.rotation[i],&objects.rotation2[i], &objects.position[i].x, &objects.position[i].y, &objects.position[i].z,&objects.scale[i]);
-                               if(objects.type[i]==treeleavestype)objects.scale[i]=objects.scale[i-1];
-                       }
-               }
+       return -1;
+ }
  
-               if(mapvers>=7)
-               {
-                       funpackf(tfile, "Bi", &numhotspots);
-                       if(numhotspots)
-                       {
-                               for(i=0;i<numhotspots;i++)
-                               {
-                                       funpackf(tfile, "Bi Bf Bf Bf Bf", &hotspottype[i],&hotspotsize[i],&hotspot[i].x,&hotspot[i].y,&hotspot[i].z);
-                                       funpackf(tfile, "Bi", &templength);
-                                       if(templength)
-                                               for(l=0;l<templength;l++)
-                                                       funpackf(tfile, "Bb", &hotspottext[i][l]);
-                                       hotspottext[i][templength]='\0';
-                                       if(hotspottype[i]==-111)indemo=1;
-                               }
-                       }
-               }
-               else numhotspots=0;
+ void  Game::Setenvironment(int which)
+ {
+       LOGFUNC;
  
-               if(visibleloading){loadscreencolor=4; LoadingScreen();}
+       LOG(" Setting environment...");
  
-               if(!stealthloading)
-               {
-                       objects.center=0;
-                       for(i=0;i<objects.numobjects;i++)
-                       {
-                               objects.center+=objects.position[i];
-                       }
-                       objects.center/=objects.numobjects;
+       float temptexdetail;
+       environment=which;
+ /*
+       OPENAL_SetPaused(channels[music1snow], true);
+       OPENAL_SetPaused(channels[music1grass], true);
+       OPENAL_SetPaused(channels[music1desert], true);
+       OPENAL_SetPaused(channels[wind], true);
+       OPENAL_SetPaused(channels[desertambient], true);
+ */
+       OPENAL_SetPaused(channels[stream_music1snow], true);
+       OPENAL_SetPaused(channels[stream_music1grass], true);
+       OPENAL_SetPaused(channels[stream_music1desert], true);
+       OPENAL_SetPaused(channels[stream_wind], true);
+       OPENAL_SetPaused(channels[stream_desertambient], true);
  
  
-                       if(visibleloading){loadscreencolor=4; LoadingScreen();}
-                       float maxdistance=0;
-                       float tempdist;
-                       int whichclosest;
-                       for(i=0;i<objects.numobjects;i++)
-                       {
-                               tempdist=findDistancefast(&objects.center,&objects.position[i]);
-                               if(tempdist>maxdistance)
-                               {
-                                       whichclosest=i;
-                                       maxdistance=tempdist;
-                               }
-                       }
-                       objects.radius=fast_sqrt(maxdistance);
+       if(environment==snowyenvironment){
+               windvector=0;
+               windvector.z=3;
+               if(ambientsound){
+                       //PlaySoundEx( wind, samp[wind], NULL, true);
+                       PlayStreamEx(stream_wind, strm[stream_wind], 0, true);
+                       OPENAL_SetPaused(channels[stream_wind], false);
+                       OPENAL_SetVolume(channels[stream_wind], 256);
                }
  
-               if(visibleloading){loadscreencolor=4; LoadingScreen();}
-               //mapcenter=objects.center;
-               //mapradius=objects.radius;
+               LoadTexture(":Data:Textures:snowtree.png",&objects.treetextureptr,0,1);
+               LoadTexture(":Data:Textures:bushsnow.png",&objects.bushtextureptr,0,1);
+               LoadTexture(":Data:Textures:bouldersnow.jpg",&objects.rocktextureptr,1,0);
+               LoadTexture(":Data:Textures:snowbox.jpg",&objects.boxtextureptr,1,0);
  
-               funpackf(tfile, "Bi", &numplayers);
-               int howmanyremoved=0;
-               bool removeanother=0;
-               if(numplayers>1&&numplayers<maxplayers)
-               {
-                       for(i=1;i<numplayers;i++)
-                       {
-                               if(visibleloading){loadscreencolor=4; LoadingScreen();}
-                               removeanother=0;
+               OPENAL_Sample_Free(samp[footstepsound]);
+               OPENAL_Sample_Free(samp[footstepsound2]);
+               OPENAL_Sample_Free(samp[footstepsound3]);
+               OPENAL_Sample_Free(samp[footstepsound4]);
+               samp[footstepsound] = OPENAL_Sample_Load(OPENAL_FREE, ConvertFileName(":Data:Sounds:footstepsnow1.ogg"), OPENAL_HW3D, 0, 0);
+               samp[footstepsound2] = OPENAL_Sample_Load(OPENAL_FREE, ConvertFileName(":Data:Sounds:footstepsnow2.ogg"), OPENAL_HW3D, 0, 0);
+               samp[footstepsound3] = OPENAL_Sample_Load(OPENAL_FREE, ConvertFileName(":Data:Sounds:footstepstone1.ogg"), OPENAL_HW3D, 0, 0);
+               samp[footstepsound4] = OPENAL_Sample_Load(OPENAL_FREE, ConvertFileName(":Data:Sounds:footstepstone2.ogg"), OPENAL_HW3D, 0, 0);
+               OPENAL_Sample_SetMinMaxDistance(samp[footstepsound], 4.0f, 1000.0f);
+               OPENAL_Sample_SetMinMaxDistance(samp[footstepsound2], 4.0f, 1000.0f);
+               OPENAL_Sample_SetMinMaxDistance(samp[footstepsound3], 4.0f, 1000.0f);
+               OPENAL_Sample_SetMinMaxDistance(samp[footstepsound4], 4.0f, 1000.0f);
  
-                               funpackf(tfile, "Bi Bi Bf Bf Bf Bi",&player[i-howmanyremoved].whichskin,&player[i-howmanyremoved].creature, &player[i-howmanyremoved].coords.x,&player[i-howmanyremoved].coords.y,&player[i-howmanyremoved].coords.z,&player[i-howmanyremoved].num_weapons);
-                               if(mapvers>=5)funpackf(tfile, "Bi", &player[i-howmanyremoved].howactive);
-                               else player[i-howmanyremoved].howactive=typeactive;
-                               if(mapvers>=3)funpackf(tfile, "Bf",&player[i-howmanyremoved].scale);
-                               else player[i-howmanyremoved].scale=-1;
-                               if(mapvers>=11)funpackf(tfile, "Bb",&player[i-howmanyremoved].immobile);
-                               else player[i-howmanyremoved].immobile=0;
-                               if(mapvers>=12)funpackf(tfile, "Bf",&player[i-howmanyremoved].rotation);
-                               else player[i-howmanyremoved].rotation=0;
-                               player[i-howmanyremoved].targetrotation=player[i-howmanyremoved].rotation;
-                               if(player[i-howmanyremoved].num_weapons<0||player[i-howmanyremoved].num_weapons>5){
-                                       removeanother=1;
-                                       howmanyremoved++;
-                               }
-                               if(!removeanother)
-                               {
-                                       if(player[i-howmanyremoved].num_weapons>0&&player[i-howmanyremoved].num_weapons<5)
-                                       {
-                                               for(j=0;j<player[i-howmanyremoved].num_weapons;j++)
-                                               {
-                                                       player[i-howmanyremoved].weaponids[j]=weapons.numweapons;
-                                                       funpackf(tfile, "Bi", &weapons.type[player[i-howmanyremoved].weaponids[j]]);
-                                                       weapons.owner[player[i-howmanyremoved].weaponids[j]]=i;
-                                                       weapons.numweapons++;
-                                               }
-                                       }
-                                       funpackf(tfile, "Bi", &player[i-howmanyremoved].numwaypoints);
-                                       //player[i-howmanyremoved].numwaypoints=10;
-                                       for(j=0;j<player[i-howmanyremoved].numwaypoints;j++)
-                                       {
-                                               funpackf(tfile, "Bf", &player[i-howmanyremoved].waypoints[j].x);
-                                               funpackf(tfile, "Bf", &player[i-howmanyremoved].waypoints[j].y);
-                                               funpackf(tfile, "Bf", &player[i-howmanyremoved].waypoints[j].z);
-                                               if(mapvers>=5)funpackf(tfile, "Bi", &player[i-howmanyremoved].waypointtype[j]);
-                                               else player[i-howmanyremoved].waypointtype[j] = wpkeepwalking;
-                                       }
+               LoadTexture(":Data:Textures:snow.jpg",&terraintexture,1,0);
  
-                                       funpackf(tfile, "Bi", &player[i-howmanyremoved].waypoint);
-                                       if(player[i-howmanyremoved].waypoint>player[i-howmanyremoved].numwaypoints-1)player[i-howmanyremoved].waypoint=0;
+               LoadTexture(":Data:Textures:rock.jpg",&terraintexture2,1,0);
  
-                                       funpackf(tfile, "Bf Bf Bf", &player[i-howmanyremoved].armorhead, &player[i-howmanyremoved].armorhigh, &player[i-howmanyremoved].armorlow);
-                                       funpackf(tfile, "Bf Bf Bf", &player[i-howmanyremoved].protectionhead, &player[i-howmanyremoved].protectionhigh, &player[i-howmanyremoved].protectionlow);
-                                       funpackf(tfile, "Bf Bf Bf", &player[i-howmanyremoved].metalhead, &player[i-howmanyremoved].metalhigh, &player[i-howmanyremoved].metallow);
-                                       funpackf(tfile, "Bf Bf", &player[i-howmanyremoved].power, &player[i-howmanyremoved].speedmult);
+               //LoadTexture(":Data:Textures:detailgrain.png",&terraintexture3,1);
  
-                                       if(mapvers>=4)funpackf(tfile, "Bf Bf Bf Bf", &headprop, &bodyprop, &armprop, &legprop);
-                                       else
-                                       {
-                                               headprop=1;
-                                               bodyprop=1;
-                                               armprop=1;
-                                               legprop=1;
-                                       }
-                                       if(player[i-howmanyremoved].creature==wolftype)
-                                       {
-                                               player[i-howmanyremoved].proportionhead=1.1*headprop;
-                                               player[i-howmanyremoved].proportionbody=1.1*bodyprop;
-                                               player[i-howmanyremoved].proportionarms=1.1*armprop;
-                                               player[i-howmanyremoved].proportionlegs=1.1*legprop;
-                                       }
  
-                                       if(player[i-howmanyremoved].creature==rabbittype)
-                                       {
-                                               player[i-howmanyremoved].proportionhead=1.2*headprop;
-                                               player[i-howmanyremoved].proportionbody=1.05*bodyprop;
-                                               player[i-howmanyremoved].proportionarms=1.00*armprop;
-                                               player[i-howmanyremoved].proportionlegs=1.1*legprop;
-                                               player[i-howmanyremoved].proportionlegs.y=1.05*legprop;
-                                       }
  
-                                       funpackf(tfile, "Bi", &player[i-howmanyremoved].numclothes);
-                                       if(player[i-howmanyremoved].numclothes)
-                                       {
-                                               for(k=0;k<player[i-howmanyremoved].numclothes;k++)
-                                               {
-                                                       int templength;
-                                                       funpackf(tfile, "Bi", &templength);
-                                                       for(l=0;l<templength;l++)
-                                                               funpackf(tfile, "Bb", &player[i-howmanyremoved].clothes[k][l]);
-                                                       player[i-howmanyremoved].clothes[k][templength]='\0';
-                                                       funpackf(tfile, "Bf Bf Bf", &player[i-howmanyremoved].clothestintr[k], &player[i-howmanyremoved].clothestintg[k], &player[i-howmanyremoved].clothestintb[k]);
-                                               }
-                                       }
-                               }
-                       }
-               }
-               if(visibleloading){loadscreencolor=4; LoadingScreen();}
  
-               numplayers-=howmanyremoved;
-               funpackf(tfile, "Bi", &numpathpoints);
-               if(numpathpoints>30||numpathpoints<0)
-                       numpathpoints=0;
-               if(numpathpoints)
-               {
-                       for(j=0;j<numpathpoints;j++)
-                       {
-                               funpackf(tfile, "Bf Bf Bf Bi", &pathpoint[j].x,&pathpoint[j].y,&pathpoint[j].z,&numpathpointconnect[j]);
-                               for(k=0;k<numpathpointconnect[j];k++){
-                                       funpackf(tfile, "Bi", &pathpointconnect[j][k]);
-                               }
-                       }
-               }
-               if(visibleloading){loadscreencolor=4; LoadingScreen();}
+               temptexdetail=texdetail;
+               if(texdetail>1)texdetail=4;
+               skybox.load(    ":Data:Textures:Skybox(snow):Front.jpg",
+                       ":Data:Textures:Skybox(snow):Left.jpg",
+                       ":Data:Textures:Skybox(snow):Back.jpg",
+                       ":Data:Textures:Skybox(snow):Right.jpg",
+                       ":Data:Textures:Skybox(snow):Up.jpg",
+                       ":Data:Textures:Skybox(snow):Down.jpg",
+                       ":Data:Textures:Skybox(snow):Cloud.jpg",
+                       ":Data:Textures:Skybox(snow):Reflect.jpg");
  
-               funpackf(tfile, "Bf Bf Bf Bf", &mapcenter.x,&mapcenter.y,&mapcenter.z,&mapradius);
  
-               SetUpLighting();
-               if(environment!=oldenvironment)Setenvironment(environment);
-               oldenvironment=environment;
  
-               if(!stealthloading)
-               {
-                       j=objects.numobjects;
-                       objects.numobjects=0;
-                       for(i=0;i<j;i++)
-                       {
-                               //if(objects.type[i]!=spiketype)
-                               objects.MakeObject(objects.type[i],objects.position[i],objects.rotation[i],objects.rotation2[i],objects.scale[i]);
-                               if(visibleloading){loadscreencolor=4; LoadingScreen();}
-                       }
  
-                       //if(skyboxtexture){
-                       terrain.DoShadows();
-                       if(visibleloading){loadscreencolor=4; LoadingScreen();}
-                       objects.DoShadows();
-                       if(visibleloading){loadscreencolor=4; LoadingScreen();}
-                       /*}
-                       else terrain.DoLighting();
-                       */
-               }
+               texdetail=temptexdetail;
+       }
+       if(environment==desertenvironment){
+               windvector=0;
+               windvector.z=2;
+               LoadTexture(":Data:Textures:deserttree.png",&objects.treetextureptr,0,1);
+               LoadTexture(":Data:Textures:bushdesert.png",&objects.bushtextureptr,0,1);
+               LoadTexture(":Data:Textures:boulderdesert.jpg",&objects.rocktextureptr,1,0);
+               LoadTexture(":Data:Textures:desertbox.jpg",&objects.boxtextureptr,1,0);
  
-               fclose(tfile);
  
-               oldlevel=whichlevel;
+               if(ambientsound){
+                       //PlaySoundEx( desertambient, samp[desertambient], NULL, true);
+                       PlayStreamEx( stream_desertambient, strm[stream_desertambient], NULL, true);
+                       OPENAL_SetPaused(channels[stream_desertambient], false);
+                       OPENAL_SetVolume(channels[stream_desertambient], 256);
+               }
  
+               OPENAL_Sample_Free(samp[footstepsound]);
+               OPENAL_Sample_Free(samp[footstepsound2]);
+               OPENAL_Sample_Free(samp[footstepsound3]);
+               OPENAL_Sample_Free(samp[footstepsound4]);
+               samp[footstepsound] = OPENAL_Sample_Load(OPENAL_FREE, ConvertFileName(":Data:Sounds:footstepsnow1.ogg"), OPENAL_HW3D, 0, 0);
+               samp[footstepsound2] = OPENAL_Sample_Load(OPENAL_FREE, ConvertFileName(":Data:Sounds:footstepsnow2.ogg"), OPENAL_HW3D, 0, 0);
+               samp[footstepsound3] = OPENAL_Sample_Load(OPENAL_FREE, ConvertFileName(":Data:Sounds:footstepsnow1.ogg"), OPENAL_HW3D, 0, 0);
+               samp[footstepsound4] = OPENAL_Sample_Load(OPENAL_FREE, ConvertFileName(":Data:Sounds:footstepsnow2.ogg"), OPENAL_HW3D, 0, 0);
+               OPENAL_Sample_SetMinMaxDistance(samp[footstepsound], 4.0f, 1000.0f);
+               OPENAL_Sample_SetMinMaxDistance(samp[footstepsound2], 4.0f, 1000.0f);
+               OPENAL_Sample_SetMinMaxDistance(samp[footstepsound3], 4.0f, 1000.0f);
+               OPENAL_Sample_SetMinMaxDistance(samp[footstepsound4], 4.0f, 1000.0f);
  
-               if(numplayers>maxplayers-1)numplayers=maxplayers-1;
-               for(i=0;i<numplayers;i++)
-               {
-                       if(visibleloading){loadscreencolor=4; LoadingScreen();}
-                       player[i].burnt=0;
-                       player[i].bled=0;
-                       player[i].onfire=0;
-                       if(i==0||player[i].scale<0)player[i].scale=.2;
-                       player[i].skeleton.free=0;
-                       player[i].skeleton.id=i;
-                       //if(Random()%2==0)player[i].creature=wolftype;
-                       //else player[i].creature=rabbittype;
-                       if(i==0&&mapvers<9)player[i].creature=rabbittype;
-                       if(player[i].creature!=wolftype)player[i].skeleton.Load((char *)":Data:Skeleton:Basic Figure",(char *)":Data:Skeleton:Basic Figurelow",(char *)":Data:Skeleton:Rabbitbelt",(char *)":Data:Models:Body.solid",(char *)":Data:Models:Body2.solid",(char *)":Data:Models:Body3.solid",(char *)":Data:Models:Body4.solid",(char *)":Data:Models:Body5.solid",(char *)":Data:Models:Body6.solid",(char *)":Data:Models:Body7.solid",(char *)":Data:Models:Bodylow.solid",(char *)":Data:Models:Belt.solid",0);
-                       else
-                       {
-                               if(player[i].creature!=wolftype){
-                                       player[i].skeleton.Load((char *)":Data:Skeleton:Basic Figure",(char *)":Data:Skeleton:Basic Figurelow",(char *)":Data:Skeleton:Rabbitbelt",(char *)":Data:Models:Body.solid",(char *)":Data:Models:Body2.solid",(char *)":Data:Models:Body3.solid",(char *)":Data:Models:Body4.solid",(char *)":Data:Models:Body5.solid",(char *)":Data:Models:Body6.solid",(char *)":Data:Models:Body7.solid",(char *)":Data:Models:Bodylow.solid",(char *)":Data:Models:Belt.solid",1);
-                                       LoadTexture(":Data:Textures:Belt.png",&player[i].skeleton.drawmodelclothes.textureptr,1,1);
-                               }
-                               if(player[i].creature==wolftype){
-                                       player[i].skeleton.Load((char *)":Data:Skeleton:Basic Figure Wolf",(char *)":Data:Skeleton:Basic Figure Wolf Low",(char *)":Data:Skeleton:Rabbitbelt",(char *)":Data:Models:Wolf.solid",(char *)":Data:Models:Wolf2.solid",(char *)":Data:Models:Wolf3.solid",(char *)":Data:Models:Wolf4.solid",(char *)":Data:Models:Wolf5.solid",(char *)":Data:Models:Wolf6.solid",(char *)":Data:Models:Wolf7.solid",(char *)":Data:Models:Wolflow.solid",(char *)":Data:Models:Belt.solid",0);
-                               }
-                       }
+               LoadTexture(":Data:Textures:sand.jpg",&terraintexture,1,0);
  
+               LoadTexture(":Data:Textures:sandslope.jpg",&terraintexture2,1,0);
  
-                       int texsize;
-                       texsize=512*512*3/texdetail/texdetail;
-                       //if(!player[i].loaded)player[i].skeleton.skinText = new GLubyte[texsize];
-                       //player[i].skeleton.skinText.resize(texsize);
+               //LoadTexture(":Data:Textures:detailgrain.png",&terraintexture3,1);
  
-                       LoadTextureSave(creatureskin[player[i].creature][player[i].whichskin],&player[i].skeleton.drawmodel.textureptr,1,&player[i].skeleton.skinText[0],&player[i].skeleton.skinsize);
  
-                       if(player[i].numclothes)
-                       {
-                               for(j=0;j<player[i].numclothes;j++)
-                               {
-                                       tintr=player[i].clothestintr[j];
-                                       tintg=player[i].clothestintg[j];
-                                       tintb=player[i].clothestintb[j];
-                                       AddClothes((char *)player[i].clothes[j],0,1,&player[i].skeleton.skinText[0],&player[i].skeleton.skinsize);
-                               }
-                               player[i].DoMipmaps(5,0,0,player[i].skeleton.skinsize,player[i].skeleton.skinsize);
-                       }
  
-                       player[i].currentanimation=bounceidleanim;
-                       player[i].targetanimation=bounceidleanim;
-                       player[i].currentframe=0;
-                       player[i].targetframe=1;
-                       player[i].target=0;
-                       player[i].speed=1+(float)(Random()%100)/1000;
-                       if(difficulty==0)player[i].speed-=.2;
-                       if(difficulty==1)player[i].speed-=.1;
+               temptexdetail=texdetail;
+               if(texdetail>1)texdetail=4;
+               skybox.load(    ":Data:Textures:Skybox(sand):Front.jpg",
+                       ":Data:Textures:Skybox(sand):Left.jpg",
+                       ":Data:Textures:Skybox(sand):Back.jpg",
+                       ":Data:Textures:Skybox(sand):Right.jpg",
+                       ":Data:Textures:Skybox(sand):Up.jpg",
+                       ":Data:Textures:Skybox(sand):Down.jpg",
+                       ":Data:Textures:Skybox(sand):Cloud.jpg",
+                       ":Data:Textures:Skybox(sand):Reflect.jpg");
  
-                       player[i].velocity=0;
-                       player[i].oldcoords=player[i].coords;
-                       player[i].realoldcoords=player[i].coords;
  
-                       player[i].id=i;
-                       player[i].skeleton.id=i;
-                       player[i].updatedelay=0;
-                       player[i].normalsupdatedelay=0;
  
-                       player[i].aitype=passivetype;
-                       player[i].aitarget=0;
-                       player[i].madskills=0;
  
-                       if(i==0)
-                       {
-                               player[i].proportionhead=1.2;
-                               player[i].proportionbody=1.05;
-                               player[i].proportionarms=1.00;
-                               player[i].proportionlegs=1.1;
-                               player[i].proportionlegs.y=1.05;
-                       }
-                       player[i].headless=0;
-                       player[i].currentoffset=0;
-                       player[i].targetoffset=0;
-                       /*player[i].armorhead=1;
-                       player[i].armorhigh=1;
-                       player[i].armorlow=1;
-                       player[i].protectionhead=1;
-                       player[i].protectionhigh=1;
-                       player[i].protectionlow=1;
-                       player[i].metalhead=1;
-                       player[i].metalhigh=1;
-                       player[i].metallow=1;
-                       player[i].power=1;
-                       player[i].speedmult=1;*/
+               texdetail=temptexdetail;
+       }
+       if(environment==grassyenvironment){
+               windvector=0;
+               windvector.z=2;
+               LoadTexture(":Data:Textures:tree.png",&objects.treetextureptr,0,1);
+               LoadTexture(":Data:Textures:bush.png",&objects.bushtextureptr,0,1);
+               LoadTexture(":Data:Textures:boulder.jpg",&objects.rocktextureptr,1,0);
+               LoadTexture(":Data:Textures:grassbox.jpg",&objects.boxtextureptr,1,0);
  
-                       player[i].damagetolerance=200;
+               if(ambientsound){
+                       PlayStreamEx( stream_wind, strm[stream_wind], NULL, true);
+                       OPENAL_SetPaused(channels[stream_wind], false);
+                       OPENAL_SetVolume(channels[stream_wind], 100);
+               }
  
-                       if(player[i].creature==wolftype)
-                       {
-                               /*player[i].proportionhead=1.1;
-                               player[i].proportionbody=1.1;
-                               player[i].proportionarms=1.1;
-                               player[i].proportionlegs=1.1;
-                               player[i].proportionlegs.y=1.1;*/
-                               if(i==0||player[i].scale<0)player[i].scale=.23;
+               OPENAL_Sample_Free(samp[footstepsound]);
+               OPENAL_Sample_Free(samp[footstepsound2]);
+               OPENAL_Sample_Free(samp[footstepsound3]);
+               OPENAL_Sample_Free(samp[footstepsound4]);
+               samp[footstepsound] = OPENAL_Sample_Load(OPENAL_FREE, ConvertFileName(":Data:Sounds:footstepgrass1.ogg"), OPENAL_HW3D, 0, 0);
+               samp[footstepsound2] = OPENAL_Sample_Load(OPENAL_FREE, ConvertFileName(":Data:Sounds:footstepgrass2.ogg"), OPENAL_HW3D, 0, 0);
+               samp[footstepsound3] = OPENAL_Sample_Load(OPENAL_FREE, ConvertFileName(":Data:Sounds:footstepstone1.ogg"), OPENAL_HW3D, 0, 0);
+               samp[footstepsound4] = OPENAL_Sample_Load(OPENAL_FREE, ConvertFileName(":Data:Sounds:footstepstone2.ogg"), OPENAL_HW3D, 0, 0);
+               OPENAL_Sample_SetMinMaxDistance(samp[footstepsound], 4.0f, 1000.0f);
+               OPENAL_Sample_SetMinMaxDistance(samp[footstepsound2], 4.0f, 1000.0f);
+               OPENAL_Sample_SetMinMaxDistance(samp[footstepsound3], 4.0f, 1000.0f);
+               OPENAL_Sample_SetMinMaxDistance(samp[footstepsound4], 4.0f, 1000.0f);
  
-                               player[i].damagetolerance=300;
-                       }
+               LoadTexture(":Data:Textures:grassdirt.jpg",&terraintexture,1,0);
  
-                       if(visibleloading){loadscreencolor=4; LoadingScreen();}
-                       if(cellophane)
-                       {
-                               player[i].proportionhead.z=0;
-                               player[i].proportionbody.z=0;
-                               player[i].proportionarms.z=0;
-                               player[i].proportionlegs.z=0;
-                       }
+               LoadTexture(":Data:Textures:mossrock.jpg",&terraintexture2,1,0);
  
-                       player[i].tempanimation.Load((char *)":Data:Animations:Tempanim",0,0);
+               //LoadTexture(":Data:Textures:detail.png",&terraintexture3,1);
  
-                       player[i].headmorphness=0;
-                       player[i].targetheadmorphness=1;
-                       player[i].headmorphstart=0;
-                       player[i].headmorphend=0;
  
-                       player[i].pausetime=0;
  
-                       player[i].dead=0;
-                       player[i].jumppower=5;
-                       player[i].damage=0;
-                       player[i].permanentdamage=0;
-                       player[i].superpermanentdamage=0;
+               temptexdetail=texdetail;
+               if(texdetail>1)texdetail=4;
+               skybox.load(    ":Data:Textures:Skybox(grass):Front.jpg",
+                       ":Data:Textures:Skybox(grass):Left.jpg",
+                       ":Data:Textures:Skybox(grass):Back.jpg",
+                       ":Data:Textures:Skybox(grass):Right.jpg",
+                       ":Data:Textures:Skybox(grass):Up.jpg",
+                       ":Data:Textures:Skybox(grass):Down.jpg",
+                       ":Data:Textures:Skybox(grass):Cloud.jpg",
+                       ":Data:Textures:Skybox(grass):Reflect.jpg");
  
-                       player[i].forwardkeydown=0;
-                       player[i].leftkeydown=0;
-                       player[i].backkeydown=0;
-                       player[i].rightkeydown=0;
-                       player[i].jumpkeydown=0;
-                       player[i].crouchkeydown=0;
-                       player[i].throwkeydown=0;
  
-                       player[i].collided=-10;
-                       player[i].loaded=1;
-                       player[i].bloodloss=0;
-                       player[i].weaponactive=-1;
-                       player[i].weaponstuck=-1;
-                       player[i].bleeding=0;
-                       player[i].deathbleeding=0;
-                       player[i].stunned=0;
-                       player[i].hasvictim=0;
-                       player[i].wentforweapon=0;
-               }
  
-               player[0].aitype=playercontrolled;
-               player[0].weaponactive=-1;
+               texdetail=temptexdetail;
+       }
+       temptexdetail=texdetail;
+       texdetail=1;
+       terrain.load(":Data:Textures:heightmap.png");
  
-               if(difficulty==1)
-               {
-                       //player[0].speedmult=1/.9;
-                       player[0].power=1/.9;
-               }
+       texdetail=temptexdetail;
+ }
  
-               if(difficulty==0)
-               {
-                       //player[0].speedmult=1/.8;
-                       player[0].power=1/.8;
-               }
  
-               //player[0].weaponstuck=1;
+ void  Game::Loadlevel(int which){
+       stealthloading=0;
  
-               if(difficulty==1)player[0].damagetolerance=250;
-               if(difficulty==0)player[0].damagetolerance=300;
-               if(difficulty==0)player[0].armorhead*=1.5;
-               if(difficulty==0)player[0].armorhigh*=1.5;
-               if(difficulty==0)player[0].armorlow*=1.5;
-               cameraloc=player[0].coords;
-               cameraloc.y+=5;
-               rotation=player[0].rotation;
+       if(which==0)Loadlevel((char *)":Data:Maps:map1");
+       else if(which==1)Loadlevel((char *)":Data:Maps:map2");
+       else if(which==2)Loadlevel((char *)":Data:Maps:map3");
+       else if(which==3)Loadlevel((char *)":Data:Maps:map4");
+       else if(which==4)Loadlevel((char *)":Data:Maps:map5");
+       else if(which==5)Loadlevel((char *)":Data:Maps:map6");
+       else if(which==6)Loadlevel((char *)":Data:Maps:map7");
+       else if(which==7)Loadlevel((char *)":Data:Maps:map8");
+       else if(which==8)Loadlevel((char *)":Data:Maps:map9");
+       else if(which==9)Loadlevel((char *)":Data:Maps:map10");
+       else if(which==10)Loadlevel((char *)":Data:Maps:map11");
+       else if(which==11)Loadlevel((char *)":Data:Maps:map12");
+       else if(which==12)Loadlevel((char *)":Data:Maps:map13");
+       else if(which==13)Loadlevel((char *)":Data:Maps:map14");
+       else if(which==14)Loadlevel((char *)":Data:Maps:map15");
+       else if(which==15)Loadlevel((char *)":Data:Maps:map16");
+       else if(which==-1){tutoriallevel=-1;Loadlevel((char *)":Data:Maps:tutorial");}
+       else Loadlevel((char *)":Data:Maps:mapsave");
  
-               hawkcoords=player[0].coords;
-               hawkcoords.y+=30;
+       whichlevel=which;
+ }
  
-               if(visibleloading){loadscreencolor=4; LoadingScreen();}
-               //weapons.numweapons=numplayers;
-               for(i=0;i<weapons.numweapons;i++)
-               {
-                       weapons.bloody[i]=0;
-                       weapons.blooddrip[i]=0;
-                       weapons.blooddripdelay[i]=0;
-                       weapons.onfire[i]=0;
-                       weapons.flamedelay[i]=0;
-                       weapons.damage[i]=0;
-                       //weapons.type[i]=sword;
-                       if(weapons.type[i]==sword){
-                               weapons.mass[i]=1.5;
-                               weapons.tipmass[i]=1;
-                               weapons.length[i]=.8;
-                       }
-                       if(weapons.type[i]==staff){
-                               weapons.mass[i]=2;
-                               weapons.tipmass[i]=1;
-                               weapons.length[i]=1.5;
-                       }
-                       if(weapons.type[i]==knife){
-                               weapons.mass[i]=1;
-                               weapons.tipmass[i]=1.2;
-                               weapons.length[i]=.25;
-                       }
-                       weapons.position[i]=-1000;
-                       weapons.tippoint[i]=-1000;
-               }
+ /*char * Game::MD5_string (unsigned char *string){
+ char temp[50];
+ char temp2[100];
  
- /*            for(i=0;i<32;i++){
-                       //if(i<16||i>20)
-                       OPENAL_StopSound(i);
-               }
- */
-               LOG("Starting background music...");
+ strcpy(temp2,(const char *)string);
+ strcat((char *)temp2,(const char *)"Lugaru");
+ sprintf (temp, "%d",strlen((char *)temp2));
+ strcat((char *)temp2,temp);
  
-               OPENAL_StopSound(OPENAL_ALL);
-               if(environment==snowyenvironment)
-               {
-                       if(ambientsound)
-                       {
-                               PlayStreamEx(stream_wind, strm[stream_wind], NULL, true);
-                               OPENAL_SetPaused(channels[stream_wind], false);
-                               OPENAL_SetVolume(channels[stream_wind], 256);
-                       }
-               }
-               else if(environment==desertenvironment)
-               {
-                       if(ambientsound)
-                       {
-                               //PlaySoundEx(desertambient,
-                               //      samp[desertambient], NULL, true);
-                               PlayStreamEx(stream_desertambient,
-                                       strm[stream_desertambient], NULL, true);
-                               OPENAL_SetPaused(channels[stream_desertambient], false);
-                               OPENAL_SetVolume(channels[stream_desertambient], 256);
-                       }
-               }
-               else if(environment==grassyenvironment)
-               {
-                       if(ambientsound)
-                       {
-                               //PlaySoundEx(wind, samp[wind], NULL, true);
-                               PlayStreamEx(stream_wind, strm[stream_wind], NULL, true);
-                               OPENAL_SetPaused(channels[stream_wind], false);
-                               OPENAL_SetVolume(channels[stream_wind], 100);
-                       }
-               }
-               oldmusicvolume[0]=0;
-               oldmusicvolume[1]=0;
-               oldmusicvolume[2]=0;
-               oldmusicvolume[3]=0;
+ MD5 context;
+ unsigned int len = strlen ( (char *)temp2);
  
+ context.update   ((unsigned char *)temp2, len);
+ context.finalize ();
  
-               /*LoadTexture(":Data:Textures:cloud.png",&sprites.cloudtexture,1,1);
-               LoadTexture(":Data:Textures:cloudimpact.png",&sprites.cloudimpacttexture,1,1);
-               LoadTexture(":Data:Textures:bloodparticle.png",&sprites.bloodtexture,1,1);
-               LoadTexture(":Data:Textures:snowflake.png",&sprites.snowflaketexture,1,1);
-               LoadTexture(":Data:Textures:flame.png",&sprites.flametexture,1,1);
-               LoadTexture(":Data:Textures:bloodflame.png",&sprites.bloodflametexture,1,1);
-               LoadTexture(":Data:Textures:smoke.png",&sprites.smoketexture,1,1);
-               LoadTexture(":Data:Textures:shine.png",&sprites.shinetexture,1,0);
-               */
+ return context.hex_digest();
+ }*/
  
-               if(!firstload)
-               {
-                       firstload=1;
-               }
-       }
-       leveltime=0;
-       loadingstuff=0;
-       visibleloading=0;
- }
  
- void  Game::Tick()
- {
-       static int i,k,j,l,m;
-       static XYZ facing,flatfacing,absflatfacing;
-       static XYZ rotatetarget;
-       static bool oldkey;
-       static float oldtargetrotation;
-       static int target, numgood;
-       static XYZ tempcoords1,tempcoords2;
-       static XYZ test;
-       static XYZ test2;
-       static XYZ lowpoint,lowpointtarget,lowpoint2,lowpointtarget2,lowpoint3,lowpointtarget3,lowpoint4,lowpointtarget4,lowpoint5,lowpointtarget5,lowpoint6,lowpointtarget6,lowpoint7,lowpointtarget7,colpoint,colpoint2;
-       static int whichhit;
-       static bool donesomething;
-       static bool oldjumpkeydown;
  
+ void  Game::Loadlevel(char *name){
+       int i,j,k,l,m;
+       static int oldlevel;
        int templength;
+       float lamefloat;
+       int lameint;
  
-       float headprop,bodyprop,armprop,legprop;
+       float headprop,legprop,armprop,bodyprop;
  
-       for(i=0;i<15;i++){
-               displaytime[i]+=multiplier;
-       }
+       LOGFUNC;
  
-       static unsigned char    theKeyMap[16];
-       GetKeys( theKeyMap );
+       LOG(std::string("Loading level...") + name);
  
-       keyboardfrozen=0;
+       if(!gameon)visibleloading=1;
  
+       if(stealthloading)visibleloading=0;
  
-       static bool mainmenutogglekeydown;
+       if(!stillloading)loadtime=0;
+       gamestarted=1;
  
-       if (IsKeyDown(theKeyMap, MAC_F6_KEY) && !freezetogglekeydown) {
-               if (IsKeyDown(theKeyMap, MAC_SHIFT_KEY)) {
-                       stereoreverse=true;
-               } else {
-                       stereoreverse=false;
-               }
+       numenvsounds=0;
+       //visibleloading=1;
+       if(tutoriallevel!=-1)tutoriallevel=0;
+       else tutoriallevel=1;
  
-               if (stereoreverse) {
-                       printf("Stereo reversed\n");
-               } else {
-                       printf("Stereo unreversed\n");
-               }
-               freezetogglekeydown=1;
+       if(tutoriallevel==1)tutorialstage=0;
+       if(tutorialstage==0){
+               tutorialstagetime=0;
+               tutorialmaxtime=1;
+       }
+       loadingstuff=1;
+       if(!firstload){
+               oldlevel=50;
        }
+       OPENAL_SetPaused(channels[whooshsound], true);
+       OPENAL_SetPaused(channels[stream_firesound], true);
  
-       if (IsKeyDown(theKeyMap, MAC_F7_KEY)) {
-               if (IsKeyDown(theKeyMap, MAC_SHIFT_KEY)) {
-                       stereoseparation -= 0.001;
-               } else {
-                       stereoseparation -= 0.010;
-               }
+       // Change the map filename into something that is os specific
+       char *FixedFN = ConvertFileName(name);
  
-               printf("Stereo decreased increased to %f\n", stereoseparation);
-       }
+       int mapvers;
+       FILE                    *tfile;
+       tfile=fopen( FixedFN, "rb" );
+       if(tfile)
+       {
+               OPENAL_SetPaused(channels[stream_firesound], true);
  
-       if (IsKeyDown(theKeyMap, MAC_F8_KEY)) {
-               if (IsKeyDown(theKeyMap, MAC_SHIFT_KEY)) {
-                       stereoseparation += 0.001;
-               } else {
-                       stereoseparation += 0.010;
-               }
  
-               printf("Stereo separation increased to %f\n", stereoseparation);
-       }
+               scoreadded=0;
+               windialogue=0;
  
+               hostiletime=0;
  
-       if(!console){
-               if(mainmenu&&endgame==1)mainmenu=10;
-               if(IsKeyDown(theKeyMap, MAC_ESCAPE_KEY)&&!mainmenutogglekeydown&&(mainmenu==7&&entername)){
-                       for(j=0;j<255;j++){
-                               displaytext[0][j]=' ';
-                       }
-                       displaychars[0]=0;
-                       displayselected=0;
-                       entername=0;
-                       mainmenutogglekeydown=1;
-               }
-               if((IsKeyDown(theKeyMap, MAC_ESCAPE_KEY)||(mainmenu==0&&((IsKeyDown(theKeyMap, jumpkey)||IsKeyDown(theKeyMap, MAC_SPACE_KEY)||(campaign)))&&!oldjumpkeydown&&campaign&&winfreeze))&&!mainmenutogglekeydown&&(!mainmenu||gameon||mainmenu==3||mainmenu==4||mainmenu==5||mainmenu==6||(mainmenu==7&&!entername)||mainmenu==9||mainmenu==11||mainmenu==13||mainmenu==17||mainmenu==10)){
-                       selected=-1;
-                       if(mainmenu==1||mainmenu==2||mainmenu==0){
-                               if(mainmenu==0&&!winfreeze)mainmenu=2;
-                               else if(mainmenu==0&&winfreeze&&(campaignchoosenext[campaignchoicewhich[whichchoice]])==1)mainmenu=100;
-                               else if(mainmenu==0&&winfreeze){
-                                       /*      if(campaignchoosenext[campaignchoicewhich[whichchoice]]==2)
-                                       stealthloading=1;
-                                       else stealthloading=0;
+               won=0;
  
-                                       if(!stealthloading){
-                                       float gLoc[3]={0,0,0};
-                                       float vel[3]={0,0,0};
-                                       OPENAL_Sample_SetMinMaxDistance(samp[firestartsound], 9999.0f, 99999.0f);
-                                       PlaySoundEx( firestartsound, samp[firestartsound], NULL, true);
-                                       OPENAL_3D_SetAttributes(channels[firestartsound], gLoc, vel);
-                                       OPENAL_SetVolume(channels[firestartsound], 256);
-                                       OPENAL_SetPaused(channels[firestartsound], false);
-                                       OPENAL_Sample_SetMinMaxDistance(samp[firestartsound], 8.0f, 2000.0f);
+               //campaign=0;
+               animation[bounceidleanim].Load((char *)":Data:Animations:Idle",middleheight,neutral);
  
-                                       flashr=1;
-                                       flashg=0;
-                                       flashb=0;
-                                       flashamount=1;
-                                       flashdelay=1;
-                                       }
+               numdialogues=0;
  
-                                       startbonustotal=0;
+               for(i=0;i<20;i++)
+               {
+                       dialoguegonethrough[i]=0;
+               }
  
-                                       for(i=0;i<campaignnumlevels;i++){
-                                       levelvisible[i]=0;
-                                       levelhighlight[i]=0;
-                                       }
+               indialogue=-1;
+               cameramode=0;
  
-                                       levelorder[0]=0;
-                                       levelvisible[0]=1;
-                                       if(accountcampaignchoicesmade[accountactive])
-                                       for(i=0;i<accountcampaignchoicesmade[accountactive];i++){
-                                       levelorder[i+1]=campaignnextlevel[levelorder[i]][accountcampaignchoices[accountactive][i]];
-                                       levelvisible[levelorder[i+1]]=1;
-                                       }
-                                       int whichlevelstart;
-                                       whichlevelstart=accountcampaignchoicesmade[accountactive]-1;
-                                       if(whichlevelstart<0){
-                                       campaignchoicenum=1;
-                                       campaignchoicewhich[0]=0;
-                                       }
-                                       else
-                                       {
-                                       campaignchoicenum=campaignnumnext[levelorder[whichlevelstart]];
-                                       if(campaignchoicenum)
-                                       for(i=0;i<campaignchoicenum;i++){
-                                       campaignchoicewhich[i]=campaignnextlevel[levelorder[whichlevelstart]][i];
-                                       levelvisible[campaignnextlevel[levelorder[whichlevelstart]][i]]=1;
-                                       levelhighlight[campaignnextlevel[levelorder[whichlevelstart]][i]]=1;
-                                       }
-                                       }
+               damagedealt=0;
+               damagetaken=0;
  
-                                       loading=2;
-                                       loadtime=0;
-                                       targetlevel=7;
-                                       if(firstload)TickOnceAfter();
-                                       if(!firstload)LoadStuff();
-                                       //else {
-                                       for(i=0;i<255;i++){
-                                       mapname[i]='\0';
-                                       }
-                                       mapname[0]=':';
-                                       mapname[1]='D';
-                                       mapname[2]='a';
-                                       mapname[3]='t';
-                                       mapname[4]='a';
-                                       mapname[5]=':';
-                                       mapname[6]='M';
-                                       mapname[7]='a';
-                                       mapname[8]='p';
-                                       mapname[9]='s';
-                                       mapname[10]=':';
+               if(accountactive!=-1)difficulty=accountdifficulty[accountactive];
  
-                                       //accountcampaignchoices[accountactive][accountcampaignchoicesmade[accountactive]]=whichchoice;
-                                       //accountcampaignchoicesmade[accountactive]++;
+               if(difficulty!=2)minimap=1;
+               else minimap=0;
  
+               numhotspots=0;
+               currenthotspot=-1;
+               bonustime=1;
  
-                                       strcat(mapname,campaignmapname[campaignchoicewhich[0]]);
-                                       whichchoice=0;
-                                       visibleloading=1;
-                                       stillloading=1;
-                                       Loadlevel(mapname);
-                                       campaign=1;
-                                       mainmenu=0;
-                                       gameon=1;
-                                       OPENAL_SetPaused(channels[music3], true);
+               skyboxtexture=1;
+               skyboxr=1;
+               skyboxg=1;
+               skyboxb=1;
  
-                                       stealthloading=0;*/
-                               }
-                               else if(mainmenu==1||mainmenu==2)mainmenu=0;
-                               if(mainmenu&&musictoggle){
-                                       if(mainmenu==1||mainmenu==2||mainmenu==100){
-                                               OPENAL_SetFrequency(OPENAL_ALL, 0.001);
-                                               PlayStreamEx( stream_music3, strm[stream_music3], NULL, true);
-                                               OPENAL_SetPaused(channels[stream_music3], false);
-                                               OPENAL_SetVolume(channels[stream_music3], 256);
-                                               OPENAL_SetPaused(channels[music1], true);
-                                       }
-                               }
-                               if(!mainmenu){
-                                       OPENAL_SetPaused(channels[stream_music3], true);
-                                       OPENAL_SetPaused(channels[music1], false);
-                               }
-                       }
-                       if(mainmenu==3){
-                               float gLoc[3]={0,0,0};
-                               float vel[3]={0,0,0};
-                               OPENAL_Sample_SetMinMaxDistance(samp[fireendsound], 9999.0f, 99999.0f);
-                               PlaySoundEx( fireendsound, samp[fireendsound], NULL, true);
-                               OPENAL_3D_SetAttributes(channels[fireendsound], gLoc, vel);
-                               OPENAL_SetVolume(channels[fireendsound], 256);
-                               OPENAL_SetPaused(channels[fireendsound], false);
-                               OPENAL_Sample_SetMinMaxDistance(samp[fireendsound], 8.0f, 2000.0f);
-                               flashr=1;
-                               flashg=0;
-                               flashb=0;
-                               flashamount=1;
-                               flashdelay=1;
-                               if(newdetail>2)newdetail=detail;
-                               if(newdetail<0)newdetail=detail;
-                               if(newscreenwidth<0)newscreenwidth=screenwidth;
-                               if(newscreenheight<0)newscreenheight=screenheight;
-                               ofstream opstream(ConvertFileName(":Data:config.txt", "w"));
-                               opstream << "Screenwidth:\n";
-                               opstream << newscreenwidth;
-                               opstream << "\nScreenheight:\n";
-                               opstream << newscreenheight;
-                               opstream << "\nMouse sensitivity:\n";
-                               opstream << usermousesensitivity;
-                               opstream << "\nBlur(0,1):\n";
-                               opstream << ismotionblur;
-                               opstream << "\nOverall Detail(0,1,2) higher=better:\n";
-                               opstream << newdetail;
-                               opstream << "\nFloating jump:\n";
-                               opstream << floatjump;
-                               opstream << "\nMouse jump:\n";
-                               opstream << mousejump;
-                               opstream << "\nAmbient sound:\n";
-                               opstream << ambientsound;
-                               opstream << "\nBlood (0,1,2):\n";
-                               opstream << bloodtoggle;
-                               opstream << "\nAuto slomo:\n";
-                               opstream << autoslomo;
-                               opstream << "\nFoliage:\n";
-                               opstream << foliage;
-                               opstream << "\nMusic:\n";
-                               opstream << musictoggle;
-                               opstream << "\nTrilinear:\n";
-                               opstream << trilinear;
-                               opstream << "\nDecals(shadows,blood puddles,etc):\n";
-                               opstream << decals;
-                               opstream << "\nInvert mouse:\n";
-                               opstream << invertmouse;
-                               opstream << "\nGamespeed:\n";
-                               if(oldgamespeed==0)oldgamespeed=1;
-                               opstream << oldgamespeed;
-                               opstream << "\nDifficulty(0,1,2) higher=harder:\n";
-                               opstream << difficulty;
-                               opstream << "\nDamage effects(blackout, doublevision):\n";
-                               opstream << damageeffects;
-                               opstream << "\nText:\n";
-                               opstream << texttoggle;
-                               opstream << "\nDebug:\n";
-                               opstream << debugmode;
-                               opstream << "\nVBL Sync:\n";
-                               opstream << vblsync;
-                               opstream << "\nShow Points:\n";
-                               opstream << showpoints;
-                               opstream << "\nAlways Blur:\n";
-                               opstream << alwaysblur;
-                               opstream << "\nImmediate mode (turn on on G5):\n";
-                               opstream << immediate;
-                               opstream << "\nVelocity blur:\n";
-                               opstream << velocityblur;
-                           opstream << "\nVolume:\n";
-                       opstream << volume;
-                               opstream << "\nForward key:\n";
-                               opstream << KeyToChar(forwardkey);
-                               opstream << "\nBack key:\n";
-                               opstream << KeyToChar(backkey);
-                               opstream << "\nLeft key:\n";
-                               opstream << KeyToChar(leftkey);
-                               opstream << "\nRight key:\n";
-                               opstream << KeyToChar(rightkey);
-                               opstream << "\nJump key:\n";
-                               opstream << KeyToChar(jumpkey);
-                               opstream << "\nCrouch key:\n";
-                               opstream << KeyToChar(crouchkey);
-                               opstream << "\nDraw key:\n";
-                               opstream << KeyToChar(drawkey);
-                               opstream << "\nThrow key:\n";
-                               opstream << KeyToChar(throwkey);
-                               opstream << "\nAttack key:\n";
-                               opstream << KeyToChar(attackkey);
-                               opstream << "\nChat key:\n";
-                               opstream << KeyToChar(chatkey);
-                               opstream.close();
-                       }
-                       if(mainmenu==4||mainmenu==5||mainmenu==6||mainmenu==7||mainmenu==9||mainmenu==13||mainmenu==10||mainmenu==11||mainmenu==100){
-                               float gLoc[3]={0,0,0};
-                               float vel[3]={0,0,0};
-                               OPENAL_Sample_SetMinMaxDistance(samp[fireendsound], 9999.0f, 99999.0f);
-                               PlaySoundEx( fireendsound, samp[fireendsound], NULL, true);
-                               OPENAL_3D_SetAttributes(channels[fireendsound], gLoc, vel);
-                               OPENAL_SetVolume(channels[fireendsound], 256);
-                               OPENAL_SetPaused(channels[fireendsound], false);
-                               OPENAL_Sample_SetMinMaxDistance(samp[fireendsound], 8.0f, 2000.0f);
-                               flashr=1;
-                               flashg=0;
-                               flashb=0;
-                               flashamount=1;
-                               flashdelay=1;
-                       }
-                       if(mainmenu==3&&gameon)mainmenu=2;
-                       if(mainmenu==3&&!gameon)mainmenu=1;
-                       if(mainmenu==5&&gameon)mainmenu=2;
-                       if(mainmenu==5&&!gameon)mainmenu=1;
-                       if(mainmenu==4)mainmenu=3;
-                       if(mainmenu==6)mainmenu=5;
-                       if(mainmenu==7)mainmenu=1;
-                       if(mainmenu==9)mainmenu=5;
-                       if(mainmenu==11)mainmenu=5;
-                       if(mainmenu==13)mainmenu=12;
-                       if(mainmenu==10)mainmenu=5;
-                       if(mainmenu==100){
-                               mainmenu=5;
-                               gameon=0;
-                               winfreeze=0;
-                       }
-                       mainmenutogglekeydown=1;
-               }
-               if(!IsKeyDown(theKeyMap, MAC_ESCAPE_KEY)){
-                       mainmenutogglekeydown=0;
-               }
-       }
-       /*static bool minimaptogglekeydown;
-       if(IsKeyDown(theKeyMap, MAC_TAB_KEY)&&!minimaptogglekeydown){
-       minimap=1-minimap;
-       minimaptogglekeydown=1;
-       }
-       if(!IsKeyDown(theKeyMap, MAC_TAB_KEY)){
-       minimaptogglekeydown=0;
-       }
-       */
-       static bool minimaptogglekeydown;
-       if(IsKeyDown(theKeyMap, MAC_TAB_KEY)&&!minimaptogglekeydown&&tutoriallevel){
-               if(tutorialstage!=51)
-                       tutorialstagetime=tutorialmaxtime;
-               PlaySoundEx( consolefailsound, samp[consolefailsound], NULL, true);
-               OPENAL_SetVolume(channels[consolefailsound], 128);
-               OPENAL_SetPaused(channels[consolefailsound], false);
-               minimaptogglekeydown=1;
-       }
-       if(!IsKeyDown(theKeyMap, MAC_TAB_KEY)){
-               minimaptogglekeydown=0;
-       }
-       if(mainmenu){
-               //menu buttons
-               if(mainmenu==1||mainmenu==2){
-                       if(Button()&&!oldbutton&&selected==1){
-                               if(!gameon){
-                                       float gLoc[3]={0,0,0};
-                                       float vel[3]={0,0,0};
-                                       OPENAL_Sample_SetMinMaxDistance(samp[firestartsound], 9999.0f, 99999.0f);
-                                       PlaySoundEx( firestartsound, samp[firestartsound], NULL, true);
-                                       OPENAL_3D_SetAttributes(channels[firestartsound], gLoc, vel);
-                                       OPENAL_SetVolume(channels[firestartsound], 256);
-                                       OPENAL_SetPaused(channels[firestartsound], false);
-                                       OPENAL_Sample_SetMinMaxDistance(samp[firestartsound], 8.0f, 2000.0f);
-                                       flashr=1;
-                                       flashg=0;
-                                       flashb=0;
-                                       flashamount=1;
-                                       flashdelay=1;
-                                       //new game
-                                       if(accountactive!=-1)mainmenu=5;
-                                       else mainmenu=7;
-                                       /*
-                                       startbonustotal=0;
-                                       loading=2;
-                                       loadtime=0;
-                                       if(firstload)TickOnceAfter();
-                                       if(!firstload)LoadStuff();
-                                       else {
-                                       Loadlevel(0);
-                                       }
-                                       mainmenu=0;
-                                       gameon=1;
-                                       OPENAL_SetPaused(channels[music3], true);       */
-                               }
-                               else
-                               {
-                                       //resume
-                                       mainmenu=0;
-                                       OPENAL_SetPaused(channels[stream_music3], true);
-                                       OPENAL_SetPaused(channels[music1], false);
-                               }
-                       }
-                       if(Button()&&!oldbutton&&selected==2){
-                               float gLoc[3]={0,0,0};
-                               float vel[3]={0,0,0};
-                               OPENAL_Sample_SetMinMaxDistance(samp[firestartsound], 9999.0f, 99999.0f);
-                               PlaySoundEx( firestartsound, samp[firestartsound], NULL, true);
-                               OPENAL_3D_SetAttributes(channels[firestartsound], gLoc, vel);
-                               OPENAL_SetVolume(channels[firestartsound], 256);
-                               OPENAL_SetPaused(channels[firestartsound], false);
-                               OPENAL_Sample_SetMinMaxDistance(samp[firestartsound], 8.0f, 2000.0f);
-                               flashr=1;
-                               flashg=0;
-                               flashb=0;
-                               flashamount=1;
-                               flashdelay=1;
-                               //options
-                               mainmenu=3;
-                               if(newdetail>2)newdetail=detail;
-                               if(newdetail<0)newdetail=detail;
-                               if(newscreenwidth>3000)newscreenwidth=screenwidth;
-                               if(newscreenwidth<0)newscreenwidth=screenwidth;
-                               if(newscreenheight>3000)newscreenheight=screenheight;
-                               if(newscreenheight<0)newscreenheight=screenheight;
-                       }
-                       if(Button()&&!oldbutton&&selected==3){
-                               float gLoc[3]={0,0,0};
-                               float vel[3]={0,0,0};
-                               OPENAL_Sample_SetMinMaxDistance(samp[fireendsound], 9999.0f, 99999.0f);
-                               PlaySoundEx( fireendsound, samp[fireendsound], NULL, true);
-                               OPENAL_3D_SetAttributes(channels[fireendsound], gLoc, vel);
-                               OPENAL_SetVolume(channels[fireendsound], 256);
-                               OPENAL_SetPaused(channels[fireendsound], false);
-                               OPENAL_Sample_SetMinMaxDistance(samp[fireendsound], 8.0f, 2000.0f);
-                               flashr=1;
-                               flashg=0;
-                               flashb=0;
-                               flashamount=1;
-                               flashdelay=1;
-                               if(!gameon){
-                                       //quit
-                                       tryquit=1;
-                                       OPENAL_SetPaused(channels[stream_music3], true);
-                               }
-                               else{
-                                       //end game
-                                       gameon=0;
-                                       mainmenu=1;
-                               }
-                       }
-                       if(Button())oldbutton=1;
-                       else oldbutton=0;
-               }
-               if(mainmenu==3){
-                       if(Button()&&!oldbutton&&selected!=-1){
-                               float gLoc[3]={0,0,0};
-                               float vel[3]={0,0,0};
-                               OPENAL_Sample_SetMinMaxDistance(samp[firestartsound], 9999.0f, 99999.0f);
-                               PlaySoundEx( firestartsound, samp[firestartsound], NULL, true);
-                               OPENAL_3D_SetAttributes(channels[firestartsound], gLoc, vel);
-                               OPENAL_SetVolume(channels[firestartsound], 256);
-                               OPENAL_SetPaused(channels[firestartsound], false);
-                               OPENAL_Sample_SetMinMaxDistance(samp[firestartsound], 8.0f, 2000.0f);
-                       }
-                       if(Button()&&!oldbutton&&selected==0){
-                       
-                               extern SDL_Rect **resolutions;
-                               bool isCustomResolution = true;
-                               bool found = false;
-                               for (int i = 0; (!found) && (resolutions[i]); i++)
-                               {
-                                       if ((resolutions[i]->w == screenwidth) && (resolutions[i]->h == screenwidth))
-                                               isCustomResolution = false;
-                                       if ((resolutions[i]->w == newscreenwidth) && (resolutions[i]->h == newscreenheight))
-                                       {
-                                               i++;
-                                               if (resolutions[i] != NULL)
-                                               {
-                                                       newscreenwidth = (int) resolutions[i]->w;
-                                                       newscreenheight = (int) resolutions[i]->h;
-                                               }
-                                               else if (isCustomResolution)
-                                               {
-                                                       if ((screenwidth == newscreenwidth) && (screenheight == newscreenheight))
-                                                       {
-                                                               newscreenwidth = (int) resolutions[0]->w;
-                                                               newscreenheight = (int) resolutions[0]->h;
-                                                       }
-                                                       else
-                                                       {
-                                                               newscreenwidth = screenwidth;
-                                                               newscreenheight = screenheight;
-                                                       }
-                                               }
-                                               else
-                                               {
-                                                       newscreenwidth = (int) resolutions[0]->w;
-                                                       newscreenheight = (int) resolutions[0]->h;
-                                               }
-                                               found = true;
-                                       }
-                               }
-                               if (!found)
-                               {
-                                       newscreenwidth = (int) resolutions[0]->w;
-                                       newscreenheight = (int) resolutions[0]->h;
-                               }
-                               
-                       }
-                       if(Button()&&!oldbutton&&selected==1){
-                               newdetail++;
-                               if(newdetail>2)newdetail=0;
-                       }
-                       if(Button()&&!oldbutton&&selected==2){
-                               bloodtoggle++;
-                               if(bloodtoggle>2)bloodtoggle=0;
-                       }
-                       if(Button()&&!oldbutton&&selected==3){
-                               difficulty++;
-                               if(difficulty>2)difficulty=0;
-                       }
-                       if(Button()&&!oldbutton&&selected==4){
-                               ismotionblur=1-ismotionblur;
-                       }
-                       if(Button()&&!oldbutton&&selected==5){
-                               decals=1-decals;
-                       }
-                       if(Button()&&!oldbutton&&selected==6){
-                               musictoggle=1-musictoggle;
-                               if(!musictoggle){
-                                       OPENAL_SetPaused(channels[music1], true);
-                                       OPENAL_SetPaused(channels[stream_music2], true);
-                                       OPENAL_SetPaused(channels[stream_music3], true);
-                                       for(i=0;i<4;i++){
-                                               oldmusicvolume[i]=0;
-                                               musicvolume[i]=0;
-                                       }
-                               }
-                               if(musictoggle){
-                                       PlayStreamEx( stream_music3, strm[stream_music3], NULL, true);
-                                       OPENAL_SetPaused(channels[stream_music3], false);
-                                       OPENAL_SetVolume(channels[stream_music3], 256);
-                               }
-                       }
-                       if(Button()&&!oldbutton&&selected==9){
-                               invertmouse=1-invertmouse;
-                       }
-                       if(Button()&&!oldbutton&&selected==10){
-                               usermousesensitivity+=.2;
-                               if(usermousesensitivity>2)usermousesensitivity=.2;
-                       }
-                       if(Button()&&!oldbutton&&selected==11){
-                               volume+=.1f;
-                               if(volume>1.0001f)volume=0;
-                               OPENAL_SetSFXMasterVolume((int)(volume*255));
-                       }
-                       if(Button()&&!oldbutton&&selected==7){
-                               /*float gLoc[3]={0,0,0};
-                               float vel[3]={0,0,0};
-                               OPENAL_Sample_SetMinMaxDistance(samp[firestartsound], 9999.0f, 99999.0f);
-                               PlaySoundEx( firestartsound, samp[firestartsound], NULL, true);
-                               OPENAL_3D_SetAttributes(channels[firestartsound], gLoc, vel);
-                               OPENAL_SetVolume(channels[firestartsound], 256);
-                               OPENAL_SetPaused(channels[firestartsound], false);
-                               OPENAL_Sample_SetMinMaxDistance(samp[firestartsound], 8.0f, 2000.0f);
-                               */
-                               flashr=1;
-                               flashg=0;
-                               flashb=0;
-                               flashamount=1;
-                               flashdelay=1;
-                               //options
-                               mainmenu=4;
-                               keyselect=-1;
-                       }
-                       if(Button()&&!oldbutton&&selected==8){
-                               float gLoc[3]={0,0,0};
-                               float vel[3]={0,0,0};
-                               OPENAL_Sample_SetMinMaxDistance(samp[fireendsound], 9999.0f, 99999.0f);
-                               PlaySoundEx( fireendsound, samp[fireendsound], NULL, true);
-                               OPENAL_3D_SetAttributes(channels[fireendsound], gLoc, vel);
-                               OPENAL_SetVolume(channels[fireendsound], 256);
-                               OPENAL_SetPaused(channels[fireendsound], false);
-                               OPENAL_Sample_SetMinMaxDistance(samp[fireendsound], 8.0f, 2000.0f);
-                               flashr=1;
-                               flashg=0;
-                               flashb=0;
-                               flashamount=1;
-                               flashdelay=1;
-                               if(newdetail>2)newdetail=detail;
-                               if(newdetail<0)newdetail=detail;
-                               if(newscreenwidth<0)newscreenwidth=screenwidth;
-                               if(newscreenheight<0)newscreenheight=screenheight;
-                               ofstream opstream(ConvertFileName(":Data:config.txt", "w"));
-                               opstream << "Screenwidth:\n";
-                               opstream << newscreenwidth;
-                               opstream << "\nScreenheight:\n";
-                               opstream << newscreenheight;
-                               opstream << "\nMouse sensitivity:\n";
-                               opstream << usermousesensitivity;
-                               opstream << "\nBlur(0,1):\n";
-                               opstream << ismotionblur;
-                               opstream << "\nOverall Detail(0,1,2) higher=better:\n";
-                               opstream << newdetail;
-                               opstream << "\nFloating jump:\n";
-                               opstream << floatjump;
-                               opstream << "\nMouse jump:\n";
-                               opstream << mousejump;
-                               opstream << "\nAmbient sound:\n";
-                               opstream << ambientsound;
-                               opstream << "\nBlood (0,1,2):\n";
-                               opstream << bloodtoggle;
-                               opstream << "\nAuto slomo:\n";
-                               opstream << autoslomo;
-                               opstream << "\nFoliage:\n";
-                               opstream << foliage;
-                               opstream << "\nMusic:\n";
-                               opstream << musictoggle;
-                               opstream << "\nTrilinear:\n";
-                               opstream << trilinear;
-                               opstream << "\nDecals(shadows,blood puddles,etc):\n";
-                               opstream << decals;
-                               opstream << "\nInvert mouse:\n";
-                               opstream << invertmouse;
-                               opstream << "\nGamespeed:\n";
-                               if(oldgamespeed==0)oldgamespeed=1;
-                               opstream << oldgamespeed;
-                               opstream << "\nDifficulty(0,1,2) higher=harder:\n";
-                               opstream << difficulty;
-                               opstream << "\nDamage effects(blackout, doublevision):\n";
-                               opstream << damageeffects;
-                               opstream << "\nText:\n";
-                               opstream << texttoggle;
-                               opstream << "\nDebug:\n";
-                               opstream << debugmode;
-                               opstream << "\nVBL Sync:\n";
-                               opstream << vblsync;
-                               opstream << "\nShow Points:\n";
-                               opstream << showpoints;
-                               opstream << "\nAlways Blur:\n";
-                               opstream << alwaysblur;
-                               opstream << "\nImmediate mode (turn on on G5):\n";
-                               opstream << immediate;
-                               opstream << "\nVelocity blur:\n";
-                               opstream << velocityblur;
-                           opstream << "\nVolume:\n";
-                       opstream << volume;
-                               opstream << "\nForward key:\n";
-                               opstream << KeyToChar(forwardkey);
-                               opstream << "\nBack key:\n";
-                               opstream << KeyToChar(backkey);
-                               opstream << "\nLeft key:\n";
-                               opstream << KeyToChar(leftkey);
-                               opstream << "\nRight key:\n";
-                               opstream << KeyToChar(rightkey);
-                               opstream << "\nJump key:\n";
-                               opstream << KeyToChar(jumpkey);
-                               opstream << "\nCrouch key:\n";
-                               opstream << KeyToChar(crouchkey);
-                               opstream << "\nDraw key:\n";
-                               opstream << KeyToChar(drawkey);
-                               opstream << "\nThrow key:\n";
-                               opstream << KeyToChar(throwkey);
-                               opstream << "\nAttack key:\n";
-                               opstream << KeyToChar(attackkey);
-                               opstream << "\nChat key:\n";
-                               opstream << KeyToChar(chatkey);
-                               opstream.close();
-                               if(mainmenu==3&&gameon)mainmenu=2;
-                               if(mainmenu==3&&!gameon)mainmenu=1;
-                       }
-                       if(Button())oldbutton=1;
-                       else oldbutton=0;
-               }
-               if(mainmenu==4){
-                       if(Button()&&!oldbutton&&selected!=-1&&keyselect==-1){
-                               float gLoc[3]={0,0,0};
-                               float vel[3]={0,0,0};
-                               OPENAL_Sample_SetMinMaxDistance(samp[firestartsound], 9999.0f, 99999.0f);
-                               PlaySoundEx( firestartsound, samp[firestartsound], NULL, true);
-                               OPENAL_3D_SetAttributes(channels[firestartsound], gLoc, vel);
-                               OPENAL_SetVolume(channels[firestartsound], 256);
-                               OPENAL_SetPaused(channels[firestartsound], false);
-                               OPENAL_Sample_SetMinMaxDistance(samp[firestartsound], 8.0f, 2000.0f);
-                       }
-                       if(Button()&&!oldbutton&&selected<9&&keyselect==-1){
-                               keyselect=selected;
-                               oldbuttons[0]=1;
-                               oldbuttons[1]=1;
-                               oldbuttons[2]=1;
-                       }
-                       if(keyselect!=-1){
-                               for(i=0;i<3;i++)
-                                       if(!buttons[i]&&!oldbutton&&!Button())oldbuttons[i]=0;
-                               for(i=0;i<140;i++){
-                                       if((IsKeyDown(theKeyMap, i)||(buttons[0]&&!oldbuttons[0]&&!oldbutton)||(buttons[1]&&!oldbuttons[1]&&!oldbutton))&&keyselect!=-1){
-                                               if(i!=MAC_ESCAPE_KEY&&(strcmp(KeyToChar(i),"unknown")||(buttons[0]&&!oldbuttons[0]&&!oldbutton)||(buttons[1]&&!oldbuttons[1]&&!oldbutton))){
-                                                       float gLoc[3]={0,0,0};
-                                                       float vel[3]={0,0,0};
-                                                       OPENAL_Sample_SetMinMaxDistance(samp[fireendsound], 9999.0f, 99999.0f);
-                                                       PlaySoundEx( fireendsound, samp[fireendsound], NULL, true);
-                                                       OPENAL_3D_SetAttributes(channels[fireendsound], gLoc, vel);
-                                                       OPENAL_SetVolume(channels[fireendsound], 256);
-                                                       OPENAL_SetPaused(channels[fireendsound], false);
-                                                       OPENAL_Sample_SetMinMaxDistance(samp[fireendsound], 8.0f, 2000.0f);
-                                                       int keynum;
-                                                       keynum=i;
-                                                       if(buttons[0]&&!oldbuttons[0])keynum=MAC_MOUSEBUTTON1;
-                                                       if(buttons[1]&&!oldbuttons[1])keynum=MAC_MOUSEBUTTON2;
-                                                       if(keyselect==0)forwardkey=keynum;
-                                                       if(keyselect==1)backkey=keynum;
-                                                       if(keyselect==2)leftkey=keynum;
-                                                       if(keyselect==3)rightkey=keynum;
-                                                       if(keyselect==4)crouchkey=keynum;
-                                                       if(keyselect==5)jumpkey=keynum;
-                                                       if(keyselect==6)drawkey=keynum;
-                                                       if(keyselect==7)throwkey=keynum;
-                                                       if(keyselect==8)attackkey=keynum;
-                                                       keyselect=-1;
-                                               }
-                                       }
-                               }}
-                       if(Button()&&!oldbutton&&selected==9){
-                               float gLoc[3]={0,0,0};
-                               float vel[3]={0,0,0};
-                               OPENAL_Sample_SetMinMaxDistance(samp[fireendsound], 9999.0f, 99999.0f);
-                               PlaySoundEx( fireendsound, samp[fireendsound], NULL, true);
-                               OPENAL_3D_SetAttributes(channels[fireendsound], gLoc, vel);
-                               OPENAL_SetVolume(channels[fireendsound], 256);
-                               OPENAL_SetPaused(channels[fireendsound], false);
-                               OPENAL_Sample_SetMinMaxDistance(samp[fireendsound], 8.0f, 2000.0f);
-                               flashr=1;
-                               flashg=0;
-                               flashb=0;
-                               flashamount=1;
-                               flashdelay=1;
-                               mainmenu=3;
-                               if(newdetail>2)newdetail=detail;
-                               if(newdetail<0)newdetail=detail;
-                               if(newscreenwidth>3000)newscreenwidth=screenwidth;
-                               if(newscreenwidth<0)newscreenwidth=screenwidth;
-                               if(newscreenheight>3000)newscreenheight=screenheight;
-                               if(newscreenheight<0)newscreenheight=screenheight;
-                       }
-               }
-               if(mainmenu==5){
-                       if(endgame==2){
-                               accountcampaignchoicesmade[accountactive]=0;
-                               accountcampaignscore[accountactive]=0;
-                               accountcampaigntime[accountactive]=0;
-                               endgame=0;
-                       }
-                       if(Button()&&!oldbutton&&selected==1){
-                               float gLoc[3]={0,0,0};
-                               float vel[3]={0,0,0};
-                               OPENAL_Sample_SetMinMaxDistance(samp[firestartsound], 9999.0f, 99999.0f);
-                               PlaySoundEx( firestartsound, samp[firestartsound], NULL, true);
-                               OPENAL_3D_SetAttributes(channels[firestartsound], gLoc, vel);
-                               OPENAL_SetVolume(channels[firestartsound], 256);
-                               OPENAL_SetPaused(channels[firestartsound], false);
-                               OPENAL_Sample_SetMinMaxDistance(samp[firestartsound], 8.0f, 2000.0f);
-                               flashr=1;
-                               flashg=0;
-                               flashb=0;
-                               flashamount=1;
-                               flashdelay=1;
-                               startbonustotal=0;
-                               loading=2;
-                               loadtime=0;
-                               targetlevel=-1;
-                               if(firstload)TickOnceAfter();
-                               if(!firstload)LoadStuff();
-                               else {
-                                       Loadlevel(-1);
-                               }
-                               mainmenu=0;
-                               gameon=1;
-                               OPENAL_SetPaused(channels[stream_music3], true);
-                       }
-                       if(Button()&&!oldbutton&&selected-7>=accountcampaignchoicesmade[accountactive]){//selected>=7&&(selected-7<=campaignnumchoices)){
-                               float gLoc[3]={0,0,0};
-                               float vel[3]={0,0,0};
-                               OPENAL_Sample_SetMinMaxDistance(samp[firestartsound], 9999.0f, 99999.0f);
-                               PlaySoundEx( firestartsound, samp[firestartsound], NULL, true);
-                               OPENAL_3D_SetAttributes(channels[firestartsound], gLoc, vel);
-                               OPENAL_SetVolume(channels[firestartsound], 256);
-                               OPENAL_SetPaused(channels[firestartsound], false);
-                               OPENAL_Sample_SetMinMaxDistance(samp[firestartsound], 8.0f, 2000.0f);
-                               flashr=1;
-                               flashg=0;
-                               flashb=0;
-                               flashamount=1;
-                               flashdelay=1;
-                               startbonustotal=0;
-                               loading=2;
-                               loadtime=0;
-                               targetlevel=7;
-                               if(firstload)TickOnceAfter();
-                               if(!firstload)LoadStuff();
-                               //else {
-                               for(i=0;i<255;i++){
-                                       mapname[i]='\0';
-                               }
-                               mapname[0]=':';
-                               mapname[1]='D';
-                               mapname[2]='a';
-                               mapname[3]='t';
-                               mapname[4]='a';
-                               mapname[5]=':';
-                               mapname[6]='M';
-                               mapname[7]='a';
-                               mapname[8]='p';
-                               mapname[9]='s';
-                               mapname[10]=':';
-                               strcat(mapname,campaignmapname[campaignchoicewhich[selected-7-accountcampaignchoicesmade[accountactive]]]);
-                               whichchoice=selected-7-accountcampaignchoicesmade[accountactive];
-                               visibleloading=1;
-                               stillloading=1;
-                               Loadlevel(mapname);
-                               //Loadlevel(campaignmapname[levelorder[selected-7]]);
-                               //}
-                               campaign=1;
-                               mainmenu=0;
-                               gameon=1;
-                               OPENAL_SetPaused(channels[stream_music3], true);
-                       }
-                       if(Button()&&!oldbutton&&selected==4){
-                               float gLoc[3]={0,0,0};
-                               float vel[3]={0,0,0};
-                               OPENAL_Sample_SetMinMaxDistance(samp[fireendsound], 9999.0f, 99999.0f);
-                               PlaySoundEx( fireendsound, samp[fireendsound], NULL, true);
-                               OPENAL_3D_SetAttributes(channels[fireendsound], gLoc, vel);
-                               OPENAL_SetVolume(channels[fireendsound], 256);
-                               OPENAL_SetPaused(channels[fireendsound], false);
-                               OPENAL_Sample_SetMinMaxDistance(samp[fireendsound], 8.0f, 2000.0f);
-                               flashr=1;
-                               flashg=0;
-                               flashb=0;
-                               flashamount=1;
-                               flashdelay=1;
-                               if(mainmenu==5&&gameon)mainmenu=2;
-                               if(mainmenu==5&&!gameon)mainmenu=1;
-                       }
-                       if(Button()&&!oldbutton&&selected==5){
-                               float gLoc[3]={0,0,0};
-                               float vel[3]={0,0,0};
-                               OPENAL_Sample_SetMinMaxDistance(samp[fireendsound], 9999.0f, 99999.0f);
-                               PlaySoundEx( fireendsound, samp[fireendsound], NULL, true);
-                               OPENAL_3D_SetAttributes(channels[fireendsound], gLoc, vel);
-                               OPENAL_SetVolume(channels[fireendsound], 256);
-                               OPENAL_SetPaused(channels[fireendsound], false);
-                               OPENAL_Sample_SetMinMaxDistance(samp[fireendsound], 8.0f, 2000.0f);
-                               flashr=1;
-                               flashg=0;
-                               flashb=0;
-                               flashamount=1;
-                               flashdelay=1;
-                               mainmenu=7;
-                       }
-                       if(Button()&&!oldbutton&&selected==3){
-                               float gLoc[3]={0,0,0};
-                               float vel[3]={0,0,0};
-                               OPENAL_Sample_SetMinMaxDistance(samp[firestartsound], 9999.0f, 99999.0f);
-                               PlaySoundEx( firestartsound, samp[firestartsound], NULL, true);
-                               OPENAL_3D_SetAttributes(channels[firestartsound], gLoc, vel);
-                               OPENAL_SetVolume(channels[firestartsound], 256);
-                               OPENAL_SetPaused(channels[firestartsound], false);
-                               OPENAL_Sample_SetMinMaxDistance(samp[firestartsound], 8.0f, 2000.0f);
-                               flashr=1;
-                               flashg=0;
-                               flashb=0;
-                               flashamount=1;
-                               flashdelay=1;
-                               mainmenu=6;
-                       }
-                       if(Button()&&!oldbutton&&selected==2){
-                               float gLoc[3]={0,0,0};
-                               float vel[3]={0,0,0};
-                               OPENAL_Sample_SetMinMaxDistance(samp[firestartsound], 9999.0f, 99999.0f);
-                               PlaySoundEx( firestartsound, samp[firestartsound], NULL, true);
-                               OPENAL_3D_SetAttributes(channels[firestartsound], gLoc, vel);
-                               OPENAL_SetVolume(channels[firestartsound], 256);
-                               OPENAL_SetPaused(channels[firestartsound], false);
-                               OPENAL_Sample_SetMinMaxDistance(samp[firestartsound], 8.0f, 2000.0f);
-                               flashr=1;
-                               flashg=0;
-                               flashb=0;
-                               flashamount=1;
-                               flashdelay=1;
-                               mainmenu=9;
-                       }
-                       if(Button())oldbutton=1;
-                       else oldbutton=0;
-               }
-               if(mainmenu==9){
-                       if(Button()&&!oldbutton&&selected<numchallengelevels&&selected>=0&&selected<=accountprogress[accountactive]){
-                               float gLoc[3]={0,0,0};
-                               float vel[3]={0,0,0};
-                               OPENAL_Sample_SetMinMaxDistance(samp[firestartsound], 9999.0f, 99999.0f);
-                               PlaySoundEx( firestartsound, samp[firestartsound], NULL, true);
-                               OPENAL_3D_SetAttributes(channels[firestartsound], gLoc, vel);
-                               OPENAL_SetVolume(channels[firestartsound], 256);
-                               OPENAL_SetPaused(channels[firestartsound], false);
-                               OPENAL_Sample_SetMinMaxDistance(samp[firestartsound], 8.0f, 2000.0f);
-                               flashr=1;
-                               flashg=0;
-                               flashb=0;
-                               flashamount=1;
-                               flashdelay=1;
-                               startbonustotal=0;
-                               loading=2;
-                               loadtime=0;
-                               targetlevel=selected;
-                               if(firstload)TickOnceAfter();
-                               if(!firstload)LoadStuff();
-                               else {
-                                       Loadlevel(selected);
-                               }
-                               campaign=0;
-                               mainmenu=0;
-                               gameon=1;
-                               OPENAL_SetPaused(channels[stream_music3], true);
-                       }
-                       if(Button()&&!oldbutton&&selected==numchallengelevels){
-                               float gLoc[3]={0,0,0};
-                               float vel[3]={0,0,0};
-                               OPENAL_Sample_SetMinMaxDistance(samp[fireendsound], 9999.0f, 99999.0f);
-                               PlaySoundEx( fireendsound, samp[fireendsound], NULL, true);
-                               OPENAL_3D_SetAttributes(channels[fireendsound], gLoc, vel);
-                               OPENAL_SetVolume(channels[fireendsound], 256);
-                               OPENAL_SetPaused(channels[fireendsound], false);
-                               OPENAL_Sample_SetMinMaxDistance(samp[fireendsound], 8.0f, 2000.0f);
-                               flashr=1;
-                               flashg=0;
-                               flashb=0;
-                               flashamount=1;
-                               flashdelay=1;
-                               mainmenu=5;
-                       }
-                       if(Button())oldbutton=1;
-                       else oldbutton=0;
-               }
-               if(mainmenu==11){
-                       if(Button()&&!oldbutton&&selected<numchallengelevels&&selected>=0&&selected<=accountprogress[accountactive]){
-                               float gLoc[3]={0,0,0};
-                               float vel[3]={0,0,0};
-                               OPENAL_Sample_SetMinMaxDistance(samp[firestartsound], 9999.0f, 99999.0f);
-                               PlaySoundEx( firestartsound, samp[firestartsound], NULL, true);
-                               OPENAL_3D_SetAttributes(channels[firestartsound], gLoc, vel);
-                               OPENAL_SetVolume(channels[firestartsound], 256);
-                               OPENAL_SetPaused(channels[firestartsound], false);
-                               OPENAL_Sample_SetMinMaxDistance(samp[firestartsound], 8.0f, 2000.0f);
-                               flashr=1;
-                               flashg=0;
-                               flashb=0;
-                               flashamount=1;
-                               flashdelay=1;
-                               startbonustotal=0;
-                               loading=2;
-                               loadtime=0;
-                               targetlevel=selected;
-                               if(firstload)TickOnceAfter();
-                               if(!firstload)LoadStuff();
-                               else {
-                                       Loadlevel(selected);
-                               }
-                               campaign=0;
-                               mainmenu=0;
-                               gameon=1;
-                               OPENAL_SetPaused(channels[stream_music3], true);
-                       }
-                       if(Button()&&!oldbutton&&selected==numchallengelevels){
-                               float gLoc[3]={0,0,0};
-                               float vel[3]={0,0,0};
-                               OPENAL_Sample_SetMinMaxDistance(samp[fireendsound], 9999.0f, 99999.0f);
-                               PlaySoundEx( fireendsound, samp[fireendsound], NULL, true);
-                               OPENAL_3D_SetAttributes(channels[fireendsound], gLoc, vel);
-                               OPENAL_SetVolume(channels[fireendsound], 256);
-                               OPENAL_SetPaused(channels[fireendsound], false);
-                               OPENAL_Sample_SetMinMaxDistance(samp[fireendsound], 8.0f, 2000.0f);
-                               flashr=1;
-                               flashg=0;
-                               flashb=0;
-                               flashamount=1;
-                               flashdelay=1;
-                               mainmenu=5;
-                       }
-                       if(Button())oldbutton=1;
-                       else oldbutton=0;
-               }
-               if(mainmenu==10){
-                       endgame=2;
-                       if(Button()&&!oldbutton&&selected==3){
-                               float gLoc[3]={0,0,0};
-                               float vel[3]={0,0,0};
-                               OPENAL_Sample_SetMinMaxDistance(samp[fireendsound], 9999.0f, 99999.0f);
-                               PlaySoundEx( fireendsound, samp[fireendsound], NULL, true);
-                               OPENAL_3D_SetAttributes(channels[fireendsound], gLoc, vel);
-                               OPENAL_SetVolume(channels[fireendsound], 256);
-                               OPENAL_SetPaused(channels[fireendsound], false);
-                               OPENAL_Sample_SetMinMaxDistance(samp[fireendsound], 8.0f, 2000.0f);
-                               flashr=1;
-                               flashg=0;
-                               flashb=0;
-                               flashamount=1;
-                               flashdelay=1;
-                               mainmenu=5;
-                       }
-                       if(Button())oldbutton=1;
-                       else oldbutton=0;
-               }
-               if(mainmenu==6){
-                       if(Button()&&!oldbutton&&selected!=-1){
-                               float gLoc[3]={0,0,0};
-                               float vel[3]={0,0,0};
-                               OPENAL_Sample_SetMinMaxDistance(samp[firestartsound], 9999.0f, 99999.0f);
-                               PlaySoundEx( firestartsound, samp[firestartsound], NULL, true);
-                               OPENAL_3D_SetAttributes(channels[firestartsound], gLoc, vel);
-                               OPENAL_SetVolume(channels[firestartsound], 256);
-                               OPENAL_SetPaused(channels[firestartsound], false);
-                               OPENAL_Sample_SetMinMaxDistance(samp[firestartsound], 8.0f, 2000.0f);
-                       }
-                       if(Button()&&!oldbutton&&selected==1){
-                               float gLoc[3]={0,0,0};
-                               float vel[3]={0,0,0};
-                               OPENAL_Sample_SetMinMaxDistance(samp[fireendsound], 9999.0f, 99999.0f);
-                               PlaySoundEx( fireendsound, samp[fireendsound], NULL, true);
-                               OPENAL_3D_SetAttributes(channels[fireendsound], gLoc, vel);
-                               OPENAL_SetVolume(channels[fireendsound], 256);
-                               OPENAL_SetPaused(channels[fireendsound], false);
-                               OPENAL_Sample_SetMinMaxDistance(samp[fireendsound], 8.0f, 2000.0f);
-                               flashr=1;
-                               flashg=0;
-                               flashb=0;
-                               flashamount=1;
-                               flashdelay=1;
-                               for(i=accountactive;i<numaccounts-1;i++){
-                                       accountdifficulty[i]=accountdifficulty[i+1];
-                                       accountcampaignchoicesmade[i]=accountcampaignchoicesmade[i+1];
-                                       for(j=0;j<accountcampaignchoicesmade[i+1];j++){
-                                               accountcampaignchoices[i][j]=accountcampaignchoices[i+1][j];
-                                       }
-                                       accountpoints[i]=accountpoints[i+1];
-                                       for(j=0;j<50;j++){
-                                               accounthighscore[i][j]=accounthighscore[i+1][j];
-                                               accountfasttime[i][j]=accountfasttime[i+1][j];
-                                       }
-                                       for(j=0;j<60;j++){
-                                               accountunlocked[i][j]=accountunlocked[i+1][j];
-                                       }
-                                       for(j=0;j<256;j++){
-                                               accountname[i][j]=accountname[i+1][j];
-                                       }
-                                       accountcampaignhighscore[i]=accountcampaignhighscore[i+1];
-                                       accountprogress[i]=accountprogress[i+1];
-                                       accountcampaignfasttime[i]=accountcampaignfasttime[i+1];
-                                       accountcampaignscore[i]=accountcampaignscore[i+1];
-                                       accountcampaigntime[i]=accountcampaigntime[i+1];
-                               }
-                               numaccounts--;
-                               accountactive=-1;
-                               mainmenu=7;
-                       }
-                       if(Button()&&!oldbutton&&selected==2){
-                               float gLoc[3]={0,0,0};
-                               float vel[3]={0,0,0};
-                               OPENAL_Sample_SetMinMaxDistance(samp[fireendsound], 9999.0f, 99999.0f);
-                               PlaySoundEx( fireendsound, samp[fireendsound], NULL, true);
-                               OPENAL_3D_SetAttributes(channels[fireendsound], gLoc, vel);
-                               OPENAL_SetVolume(channels[fireendsound], 256);
-                               OPENAL_SetPaused(channels[fireendsound], false);
-                               OPENAL_Sample_SetMinMaxDistance(samp[fireendsound], 8.0f, 2000.0f);
-                               flashr=1;
-                               flashg=0;
-                               flashb=0;
-                               flashamount=1;
-                               flashdelay=1;
-                               mainmenu=5;
-                       }
-                       if(Button())oldbutton=1;
-                       else oldbutton=0;
-               }
-               if(mainmenu==7){
-                       if(Button()&&!oldbutton&&selected!=-1){
-                               float gLoc[3]={0,0,0};
-                               float vel[3]={0,0,0};
-                               OPENAL_Sample_SetMinMaxDistance(samp[firestartsound], 9999.0f, 99999.0f);
-                               PlaySoundEx( firestartsound, samp[firestartsound], NULL, true);
-                               OPENAL_3D_SetAttributes(channels[firestartsound], gLoc, vel);
-                               OPENAL_SetVolume(channels[firestartsound], 256);
-                               OPENAL_SetPaused(channels[firestartsound], false);
-                               OPENAL_Sample_SetMinMaxDistance(samp[firestartsound], 8.0f, 2000.0f);
-                       }
-                       if(Button()&&!oldbutton&&selected==0&&numaccounts<8){
-                               entername=1;
-                       }
-                       if(Button()&&!oldbutton&&selected>0&&selected<numaccounts+1){
-                               accountactive=selected-1;
-                               mainmenu=5;
-                               flashr=1;
-                               flashg=0;
-                               flashb=0;
-                               flashamount=1;
-                               flashdelay=1;
-                       }
-                       if(Button()&&!oldbutton&&selected==numaccounts+1){
-                               float gLoc[3]={0,0,0};
-                               float vel[3]={0,0,0};
-                               OPENAL_Sample_SetMinMaxDistance(samp[fireendsound], 9999.0f, 99999.0f);
-                               PlaySoundEx( fireendsound, samp[fireendsound], NULL, true);
-                               OPENAL_3D_SetAttributes(channels[fireendsound], gLoc, vel);
-                               OPENAL_SetVolume(channels[fireendsound], 256);
-                               OPENAL_SetPaused(channels[fireendsound], false);
-                               OPENAL_Sample_SetMinMaxDistance(samp[fireendsound], 8.0f, 2000.0f);
-                               flashr=1;
-                               flashg=0;
-                               flashb=0;
-                               flashamount=1;
-                               flashdelay=1;
-                               mainmenu=1;
-                               for(j=0;j<255;j++){
-                                       displaytext[0][j]=' ';
-                               }
-                               displaychars[0]=0;
-                               displayselected=0;
-                               entername=0;
-                       }
-                       if(Button())oldbutton=1;
-                       else oldbutton=0;
-               }
-               if(mainmenu==8){
-                       if(Button()&&!oldbutton&&selected!=-1){
-                               float gLoc[3]={0,0,0};
-                               float vel[3]={0,0,0};
-                               OPENAL_Sample_SetMinMaxDistance(samp[firestartsound], 9999.0f, 99999.0f);
-                               PlaySoundEx( firestartsound, samp[firestartsound], NULL, true);
-                               OPENAL_3D_SetAttributes(channels[firestartsound], gLoc, vel);
-                               OPENAL_SetVolume(channels[firestartsound], 256);
-                               OPENAL_SetPaused(channels[firestartsound], false);
-                               OPENAL_Sample_SetMinMaxDistance(samp[firestartsound], 8.0f, 2000.0f);
-                               if(selected==0)accountdifficulty[accountactive]=0;
-                               if(selected==1)accountdifficulty[accountactive]=1;
-                               if(selected==2)accountdifficulty[accountactive]=2;
-                               mainmenu=5;
-                               flashr=1;
-                               flashg=0;
-                               flashb=0;
-                               flashamount=1;
-                               flashdelay=1;
-                       }
-                       if(Button())oldbutton=1;
-                       else oldbutton=0;
-               }
-               if(Button())oldbutton=1;
-               else oldbutton=0;
-               if(IsKeyDown(theKeyMap, MAC_Q_KEY)&&IsKeyDown(theKeyMap, MAC_COMMAND_KEY)){
-                       tryquit=1;
-                       if(mainmenu==3){
-                               if(newdetail>2)newdetail=detail;
-                               if(newdetail<0)newdetail=detail;
-                               if(newscreenwidth<0)newscreenwidth=screenwidth;
-                               if(newscreenheight<0)newscreenheight=screenheight;
-                               ofstream opstream(ConvertFileName(":Data:config.txt", "w"));
-                               opstream << "Screenwidth:\n";
-                               opstream << newscreenwidth;
-                               opstream << "\nScreenheight:\n";
-                               opstream << newscreenheight;
-                               opstream << "\nMouse sensitivity:\n";
-                               opstream << usermousesensitivity;
-                               opstream << "\nBlur(0,1):\n";
-                               opstream << ismotionblur;
-                               opstream << "\nOverall Detail(0,1,2) higher=better:\n";
-                               opstream << newdetail;
-                               opstream << "\nFloating jump:\n";
-                               opstream << floatjump;
-                               opstream << "\nMouse jump:\n";
-                               opstream << mousejump;
-                               opstream << "\nAmbient sound:\n";
-                               opstream << ambientsound;
-                               opstream << "\nBlood (0,1,2):\n";
-                               opstream << bloodtoggle;
-                               opstream << "\nAuto slomo:\n";
-                               opstream << autoslomo;
-                               opstream << "\nFoliage:\n";
-                               opstream << foliage;
-                               opstream << "\nMusic:\n";
-                               opstream << musictoggle;
-                               opstream << "\nTrilinear:\n";
-                               opstream << trilinear;
-                               opstream << "\nDecals(shadows,blood puddles,etc):\n";
-                               opstream << decals;
-                               opstream << "\nInvert mouse:\n";
-                               opstream << invertmouse;
-                               opstream << "\nGamespeed:\n";
-                               if(oldgamespeed==0)oldgamespeed=1;
-                               opstream << oldgamespeed;
-                               opstream << "\nDifficulty(0,1,2) higher=harder:\n";
-                               opstream << difficulty;
-                               opstream << "\nDamage effects(blackout, doublevision):\n";
-                               opstream << damageeffects;
-                               opstream << "\nText:\n";
-                               opstream << texttoggle;
-                               opstream << "\nDebug:\n";
-                               opstream << debugmode;
-                               opstream << "\nVBL Sync:\n";
-                               opstream << vblsync;
-                               opstream << "\nShow Points:\n";
-                               opstream << showpoints;
-                               opstream << "\nAlways Blur:\n";
-                               opstream << alwaysblur;
-                               opstream << "\nImmediate mode (turn on on G5):\n";
-                               opstream << immediate;
-                               opstream << "\nVelocity blur:\n";
-                               opstream << velocityblur;
-                           opstream << "\nVolume:\n";
-                       opstream << volume;
-                               opstream << "\nForward key:\n";
-                               opstream << KeyToChar(forwardkey);
-                               opstream << "\nBack key:\n";
-                               opstream << KeyToChar(backkey);
-                               opstream << "\nLeft key:\n";
-                               opstream << KeyToChar(leftkey);
-                               opstream << "\nRight key:\n";
-                               opstream << KeyToChar(rightkey);
-                               opstream << "\nJump key:\n";
-                               opstream << KeyToChar(jumpkey);
-                               opstream << "\nCrouch key:\n";
-                               opstream << KeyToChar(crouchkey);
-                               opstream << "\nDraw key:\n";
-                               opstream << KeyToChar(drawkey);
-                               opstream << "\nThrow key:\n";
-                               opstream << KeyToChar(throwkey);
-                               opstream << "\nAttack key:\n";
-                               opstream << KeyToChar(attackkey);
-                               opstream << "\nChat key:\n";
-                               opstream << KeyToChar(chatkey);
-                               opstream.close();
-                       }
-               }
-               if(mainmenu==1||mainmenu==2){
-                       if(loaddistrib>4)transition+=multiplier/8;
-                       if(transition>1){
-                               transition=0;
-                               anim++;
-                               if(anim>4)anim=0;
-                               loaddistrib=0;
-                       }
-               }
-               OPENAL_SetFrequency(channels[stream_music3], 22050);
-               if(entername){
-                       for(i=0;i<140;i++){
-                               if(IsKeyDown(theKeyMap, i)){
-                                       togglekeydelay[i]+=multiplier;
-                                       if(togglekeydelay[i]>.4){
-                                               togglekey[i]=0;
-                                               togglekeydelay[i]=.36;
-                                       }
-                                       if(!togglekey[i]){
-                                               if(KeyToSingleChar(i)!='\0'&&displaychars[0]<60){
-                                                       for(j=255;j>=displayselected+1;j--){
-                                                               displaytext[0][j]=displaytext[0][j-1];
-                                                       }
-                                                       displaytext[0][displayselected]=KeyToSingleChar(i);
-                                                       if(IsKeyDown(theKeyMap, MAC_SHIFT_KEY))displaytext[0][displayselected]=Shift(displaytext[0][displayselected]);
-                                                       displayselected++;
-                                                       displaychars[0]++;
-                                               }
-                                               if(i==MAC_DELETE_KEY&&displayselected!=0){
-                                                       for(j=displayselected-1;j<255;j++){
-                                                               displaytext[0][j]=displaytext[0][j+1];
-                                                       }
-                                                       displaytext[0][255]=' ';
-                                                       displayselected--;
-                                                       displaychars[0]--;
-                                               }
-                                               if(i==MAC_ARROW_LEFT_KEY&&displayselected!=0){
-                                                       displayselected--;
-                                               }
-                                               if(i==MAC_ARROW_RIGHT_KEY&&displayselected<displaychars[0]){
-                                                       displayselected++;
-                                               }
-                                               if(i==MAC_RETURN_KEY&&entername){
-                                                       if(displaychars[0]){
-                                                               numaccounts++;
-                                                               strcpy(accountname[numaccounts-1],displaytext[0]);
-                                                               accountactive=numaccounts-1;
-                                                               accountdifficulty[accountactive]=1;
-                                                               accountprogress[accountactive]=0;
-                                                               accountpoints[accountactive]=0;
-                                                               accountcampaigntime[accountactive]=0;
-                                                               accountcampaignscore[accountactive]=0;
-                                                               accountcampaignfasttime[accountactive]=0;
-                                                               accountcampaignhighscore[accountactive]=0;
-                                                               for(j=0;j<50;j++){
-                                                                       accounthighscore[accountactive][j]=0;
-                                                                       accountfasttime[accountactive][j]=0;
-                                                               }
-                                                               for(j=0;j<60;j++){
-                                                                       accountunlocked[accountactive][j]=0;
-                                                               }
-                                                               accountcampaignchoicesmade[accountactive]=0;
-                                                               for(j=0;j<255;j++){
-                                                                       displaytext[0][j]=' ';
-                                                               }
-                                                               displaychars[0]=0;
-                                                               displayselected=0;
-                                                               entername=0;
-                                                               mainmenu=8;
-                                                               flashr=1;
-                                                               flashg=0;
-                                                               flashb=0;
-                                                               flashamount=1;
-                                                               flashdelay=1;
-                                                               float gLoc[3]={0,0,0};
-                                                               float vel[3]={0,0,0};
-                                                               OPENAL_Sample_SetMinMaxDistance(samp[firestartsound], 9999.0f, 99999.0f);
-                                                               PlaySoundEx( firestartsound, samp[firestartsound], NULL, true);
-                                                               OPENAL_3D_SetAttributes(channels[firestartsound], gLoc, vel);
-                                                               OPENAL_SetVolume(channels[firestartsound], 256);
-                                                               OPENAL_SetPaused(channels[firestartsound], false);
-                                                               OPENAL_Sample_SetMinMaxDistance(samp[firestartsound], 8.0f, 2000.0f);
-                                                               for(j=0;j<255;j++){
-                                                                       displaytext[0][j]=' ';
-                                                               }
-                                                               displaychars[0]=0;
-                                                               displayselected=0;
-                                                       }}
-                                               if(i==MAC_RETURN_KEY&&mainmenu==13){
-                                                       if(displaychars[0]){
-                                                               sprintf (registrationname, "%s", displaytext[0]);
-                                                               if(displaychars[0]<254)registrationname[displaychars[0]]='\0';
-                                                               mainmenu=5;
-                         
-                                                               flashr=1;
-                                                               flashg=0;
-                                                               flashb=0;
-                                                               flashamount=1;
-                                                               flashdelay=1;
-                                                               float gLoc[3]={0,0,0};
-                                                               float vel[3]={0,0,0};
-                                                               OPENAL_Sample_SetMinMaxDistance(samp[firestartsound], 9999.0f, 99999.0f);
-                                                               PlaySoundEx( firestartsound, samp[firestartsound], NULL, true);
-                                                               OPENAL_3D_SetAttributes(channels[firestartsound], gLoc, vel);
-                                                               OPENAL_SetVolume(channels[firestartsound], 256);
-                                                               OPENAL_SetPaused(channels[firestartsound], false);
-                                                               OPENAL_Sample_SetMinMaxDistance(samp[firestartsound], 8.0f, 2000.0f);
-                                                               for(j=0;j<255;j++){
-                                                                       displaytext[0][j]=' ';
-                                                               }
-                                                               displaychars[0]=0;
-                         
-                                                               displayselected=0;
-                                                       }}
-                                       }
-                                       togglekey[i]=1;
-                               }
-                               else {
-                                       togglekey[i]=0;
-                                       togglekeydelay[i]=0;
-                               }
-                       }
-                       displayblinkdelay-=multiplier;
-                       if(displayblinkdelay<=0){
-                               displayblinkdelay=.3;
-                               displayblink=1-displayblink;
-                       }
-               }
-       }
-       if(!mainmenu){
-               if(hostile==1)hostiletime+=multiplier;
-               else hostiletime=0;
-               if(!winfreeze)leveltime+=multiplier;
-               if(IsKeyDown(theKeyMap, MAC_ESCAPE_KEY)){
-                       chatting=0;
-                       console=0;
-                       freeze=0;
-                       displaychars[0]=0;
-               }
-               if(IsKeyDown(theKeyMap, chatkey)&&!chattogglekeydown&&!console&&!chatting&&debugmode){
-                       chatting=1;
-                       chattogglekeydown=1;
-                       togglekey[chatkey]=1;
-                       togglekeydelay[chatkey]=-20;
-               }
-               if(!IsKeyDown(theKeyMap, chatkey)){
-                       chattogglekeydown=0;
-               }
-               if(chatting){
-                       for(i=0;i<140;i++){
-                               if(IsKeyDown(theKeyMap, i)){
-                                       togglekeydelay[i]+=multiplier;
-                                       if(togglekeydelay[i]>.4){
-                                               togglekey[i]=0;
-                                               togglekeydelay[i]=.36;
-                                       }
-                                       if(!togglekey[i]){
-                                               if(KeyToSingleChar(i)!='\0'&&displaychars[0]<60){
-                                                       for(j=255;j>=displayselected+1;j--){
-                                                               displaytext[0][j]=displaytext[0][j-1];
-                                                       }
-                                                       displaytext[0][displayselected]=KeyToSingleChar(i);
-                                                       if(IsKeyDown(theKeyMap, MAC_SHIFT_KEY))displaytext[0][displayselected]=Shift(displaytext[0][displayselected]);
-                                                       displayselected++;
-                                                       displaychars[0]++;
-                                               }
-                                               if(i==MAC_DELETE_KEY&&displayselected!=0){
-                                                       for(j=displayselected-1;j<255;j++){
-                                                               displaytext[0][j]=displaytext[0][j+1];
-                                                       }
-                                                       displaytext[0][255]=' ';
-                                                       displayselected--;
-                                                       displaychars[0]--;
-                                               }
-                                               if(i==MAC_ARROW_LEFT_KEY&&displayselected!=0){
-                                                       displayselected--;
-                                               }
-                                               if(i==MAC_ARROW_RIGHT_KEY&&displayselected<displaychars[0]){
-                                                       displayselected++;
-                                               }
-                                               if(i==MAC_RETURN_KEY){
-                                                       if(displaychars[0]){
-                                                               /*for(j=0;j<displaychars[0];j++){
-                                                               talkname[j]=displaytext[0][j];
-                                                               }
-                                                               talkname[displaychars[0]]='\0';
-                                                               sprintf (chatname, "%s: %s",playerName,talkname);
-                                                               //NetworkSendInformation(chatname);
-                                                               */
-                                                               for(j=0;j<255;j++){
-                                                                       displaytext[0][j]=' ';
-                                                               }
-                                                               displaychars[0]=0;
-                                                               displayselected=0;
-                                                               chatting=0;
-                                                       }
-                                               }
-                                       }
-                                       togglekey[i]=1;
-                               }
-                               else {
-                                       togglekey[i]=0;
-                                       togglekeydelay[i]=0;
-                               }
-                       }
-                       displayblinkdelay-=multiplier;
-                       if(displayblinkdelay<=0){
-                               displayblinkdelay=.3;
-                               displayblink=1-displayblink;
-                       }
-               }
-               if(chatting)keyboardfrozen=1;
-               if(IsKeyDown(theKeyMap, MAC_V_KEY)&&!freezetogglekeydown&&debugmode){
-                       freeze=1-freeze;
-                       if(freeze){
-                               OPENAL_SetFrequency(OPENAL_ALL, 0.001);
-                       }
-                       freezetogglekeydown=1;
-               }
-               if(!IsKeyDown(theKeyMap, MAC_V_KEY)&&!IsKeyDown(theKeyMap, MAC_F1_KEY)){
-                       freezetogglekeydown=0;
-               }
-               if(IsKeyDown(theKeyMap, MAC_TILDE_KEY)&&!consoletogglekeydown&&debugmode){
-                       console=1-console;
-                       if(!console)freeze=0;
-                       if(console){
-                               OPENAL_SetFrequency(OPENAL_ALL, 0.001);
-                       }
-                       consoletogglekeydown=1;
-               }
-               if(!IsKeyDown(theKeyMap, MAC_TILDE_KEY)){
-                       consoletogglekeydown=0;
-               }
-               if(console)freeze=1;
-               if(console&&!IsKeyDown(theKeyMap,MAC_COMMAND_KEY)){
-                       for(i=0;i<140;i++){
-                               if(IsKeyDown(theKeyMap, i)){
-                                       togglekeydelay[i]+=multiplier;
-                                       if(togglekeydelay[i]>.4){
-                                               togglekey[i]=0;
-                                               togglekeydelay[i]=.36;
-                                       }
-                                       if(!togglekey[i]){
-                                               if(KeyToSingleChar(i)!='\0'&&consolechars[0]<255){
-                                                       for(j=255;j>=consoleselected+1;j--){
-                                                               consoletext[0][j]=consoletext[0][j-1];
-                                                       }
-                                                       consoletext[0][consoleselected]=KeyToSingleChar(i);
-                                                       if(IsKeyDown(theKeyMap, MAC_SHIFT_KEY))consoletext[0][consoleselected]=Shift(consoletext[0][consoleselected]);
-                                                       consoleselected++;
-                                                       consolechars[0]++;
-                                               }
-                                               else if(i==MAC_ENTER_KEY){
-                                                       for(j=255;j>=consoleselected+1;j--){
-                                                               consoletext[0][j]=consoletext[0][j-1];
-                                                       }
-                                                       consoletext[0][consoleselected]='\n';
-                                                       consoleselected++;
-                                                       consolechars[0]++;
-                                               }
-                                               if(i==MAC_DELETE_KEY&&consoleselected!=0){
-                                                       for(j=consoleselected-1;j<255;j++){
-                                                               consoletext[0][j]=consoletext[0][j+1];
-                                                       }
-                                                       consoletext[0][255]=' ';
-                                                       consoleselected--;
-                                                       consolechars[0]--;
-                                               }
-                                               if(i==MAC_ARROW_UP_KEY){
-                                                       if(archiveselected<14)archiveselected++;
-                                                       for(j=0;j<255;j++){
-                                                               consolechars[0]=consolechars[archiveselected];
-                                                               consoletext[0][j]=consoletext[archiveselected][j];
-                                                               consoleselected=consolechars[0];
-                                                       }
-                                               }
-                                               if(i==MAC_ARROW_DOWN_KEY){
-                                                       if(archiveselected>0)archiveselected--;
-                                                       for(j=0;j<255;j++){
-                                                               consolechars[0]=consolechars[archiveselected];
-                                                               consoletext[0][j]=consoletext[archiveselected][j];
-                                                               consoleselected=consolechars[0];
-                                                       }
-                                               }
-                                               if(i==MAC_ARROW_LEFT_KEY&&consoleselected!=0){
-                                                       consoleselected--;
-                                               }
-                                               if(i==MAC_ARROW_RIGHT_KEY&&consoleselected<consolechars[0]){
-                                                       consoleselected++;
-                                               }
-                                               if(i==MAC_RETURN_KEY){
-                                                       archiveselected=0;
-                                                       donesomething=0;
-                                                       if(Compare(consoletext[0],"quit ",0,4)||Compare(consoletext[0],"exit ",0,4)){
-                                                               PlaySoundEx( consolesuccesssound, samp[consolesuccesssound], NULL, true);
-                                                               OPENAL_SetVolume(channels[consolesuccesssound], 256);
-                                                               OPENAL_SetPaused(channels[consolesuccesssound], false);
-                                                               donesomething=1;
-                                                               tryquit=1;
-                                                       }
-                                                       /*if(Compare(consoletext[0],"send ",0,4)){
-                                                       for(j=5;j<consolechars[0];j++){
-                                                       talkname[j-5]=consoletext[0][j];
-                                                       }
-                                                       talkname[consolechars[0]-5]='\0';
-                                                       sprintf (chatname, "%s: %s",playerName,talkname);
-                                                       //NetworkSendInformation(chatname);
-                                                       donesomething=1;
-                                                       }
-                                                       if(Compare(consoletext[0],"name ",0,4)){
-                                                       int numchars;
-                                                       numchars=consolechars[0]-5;
-                                                       if(numchars>32)numchars=32;
-                                                       for(j=5;j<numchars+5;j++){
-                                                       talkname[j-5]=consoletext[0][j];
-                                                       }
-                                                       talkname[numchars]='\0';
-                                                       sprintf (chatname, "Player %s is now known as %s.",playerName,talkname);
-                                                       //NetworkSendInformation(chatname);
-                                                       sprintf (playerName, "%s",talkname);
-                                                       //NetworkSendName(playerName);
-                                                       donesomething=1;
-                                                       }*/
-                                                       if(Compare(consoletext[0],"map ",0,3)){
-                                                               mapname[0]=':';
-                                                               mapname[1]='D';
-                                                               mapname[2]='a';
-                                                               mapname[3]='t';
-                                                               mapname[4]='a';
-                                                               mapname[5]=':';
-                                                               mapname[6]='M';
-                                                               mapname[7]='a';
-                                                               mapname[8]='p';
-                                                               mapname[9]='s';
-                                                               mapname[10]=':';
-                                                               for(j=4;j<consolechars[0];j++){
-                                                                       mapname[j-4+11]=consoletext[0][j];
-                                                               }
-                                                               mapname[consolechars[0]-4+11]='\0';
-                                                               Loadlevel(mapname);
-                                                               whichlevel=-2;
-                                                               campaign=0;
-                                                               donesomething=1;
-                                                       }
-                                                       /*if(Compare(consoletext[0],"connect ",0,7)&&!ishost){
-                                                       int v;
-                                                       unsigned char playerNameStr[32];
-                                                       char theIPAddress[256];
-                                                       char thePort[32];
-                                                       NMUInt32 port = 25710;
-                                                       strcpy(playerName, "Client");
-                                                       GameC2PStr( playerName, playerNameStr );
-                                                       for(j=0;j<consolechars[0]-8;j++){
-                                                       theIPAddress[j]=consoletext[0][j+8];
-                                                       }
-                                                       theIPAddress[consolechars[0]-8]='\0';
-                                                       sprintf( thePort, "%li", port );
-                                                       v=NetworkStartClient( theIPAddress, thePort, playerNameStr );
-                                                       if(v)
-                                                       {
-                                                       if(consolechars[0]>0){
-                                                       for(k=14;k>=1;k--){
-                                                       for(j=0;j<255;j++){
-                                                       consoletext[k][j]=consoletext[k-1][j];
-                                                       }
-                                                       consolechars[k]=consolechars[k-1];
-                                                       }
-                                                       for(j=0;j<255;j++){
-                                                       consoletext[0][j]=' ';
-                                                       }
-                                                       if(v!=-4994)sprintf (consoletext[0], "Error #%d!!!",v);
-                                                       else sprintf (consoletext[0], "Could not open connection");
-                                                       consolechars[0]=255;
-                                                       consoleselected=0;
-                                                       }
-                                                       }
-                                                       else
-                                                       {
-                                                       donesomething=1;
-                                                       PlaySoundEx( consolesuccesssound, samp[consolesuccesssound], NULL, true);
-                                                       OPENAL_SetVolume(channels[consolesuccesssound], 256);
-                                                       OPENAL_SetPaused(channels[consolesuccesssound], false);
-                                                       if(consolechars[0]>0){
-                                                       for(k=14;k>=1;k--){
-                                                       for(j=0;j<255;j++){
-                                                       consoletext[k][j]=consoletext[k-1][j];
-                                                       }
-                                                       consolechars[k]=consolechars[k-1];
-                                                       }
-                                                       for(j=0;j<255;j++){
-                                                       consoletext[0][j]=' ';
-                                                       }
-                                                       sprintf (consoletext[0], "Connected to %s",theIPAddress);
-                                                       consolechars[0]=255;
-                                                       consoleselected=0;
-                                                       }
-                                                       }
-                                                       }
-                                                       if(Compare(consoletext[0],"host ",0,4)){
-                                                       unsigned char gameNameStr[32], playerNameStr[32];
-                                                       char gameName[32];//, playerName[32];
-                                                       NMUInt32 port;
-                                                       int players;
-                                                       int v;
-                                                       port = 25710;
-                                                       players =4;
+               freeze=0;
+               winfreeze=0;
  
-                                                       strcpy(gameName, "Host's game");
-                                                       strcpy(playerName, "Host");
-                                                       GameC2PStr( gameName, gameNameStr );
-                                                       GameC2PStr( playerName, playerNameStr );
+               for(i=0;i<100;i++)
+               {
+                       bonusnum[i]=0;
+               }
  
-                                                       v=NetworkStartServer( (NMUInt16)port, players, gameNameStr, playerNameStr );
-                                                       if(v)
-                                                       {
-                                                       if(consolechars[0]>0){
-                                                       for(k=14;k>=1;k--){
-                                                       for(j=0;j<255;j++){
-                                                       consoletext[k][j]=consoletext[k-1][j];
-                                                       }
-                                                       consolechars[k]=consolechars[k-1];
-                                                       }
-                                                       for(j=0;j<255;j++){
-                                                       consoletext[0][j]=' ';
-                                                       }
-                                                       sprintf (consoletext[0], "Error #%d!!!",v);
+               numfalls=0;
+               numflipfail=0;
+               numseen=0;
+               numstaffattack=0;
+               numswordattack=0;
+               numknifeattack=0;
+               numunarmedattack=0;
+               numescaped=0;
+               numflipped=0;
+               numwallflipped=0;
+               numthrowkill=0;
+               numafterkill=0;
+               numreversals=0;
+               numattacks=0;
+               maxalarmed=0;
+               numresponded=0;
  
-                                                       consolechars[0]=255;
-                                                       consoleselected=0;
-                                                       }
-                                                       }
-                                                       else
-                                                       {
-                                                       donesomething=1;
-                                                       PlaySoundEx( consolesuccesssound, samp[consolesuccesssound], NULL, true);
-                                                       OPENAL_SetVolume(channels[consolesuccesssound], 256);
-                                                       OPENAL_SetPaused(channels[consolesuccesssound], false);
+               bonustotal=startbonustotal;
+               bonus=0;
+               gameon=1;
+               changedelay=0;
+               if(console)
+               {
+                       PlaySoundEx( consolesuccesssound, samp[consolesuccesssound], NULL, true);
+                       OPENAL_SetVolume(channels[consolesuccesssound], 256);
+                       OPENAL_SetPaused(channels[consolesuccesssound], false);
+                       freeze=0;
+                       console=0;
+               }
  
-                                                       if(consolechars[0]>0){
-                                                       for(k=14;k>=1;k--){
-                                                       for(j=0;j<255;j++){
-                                                       consoletext[k][j]=consoletext[k-1][j];
-                                                       }
-                                                       consolechars[k]=consolechars[k-1];
-                                                       }
-                                                       for(j=0;j<255;j++){
-                                                       consoletext[0][j]=' ';
-                                                       }
-                                                       sprintf (consoletext[0], "Game hosted");
+               if(!stealthloading)
+               {
+                       terrain.numdecals=0;
+                       sprites.numsprites=0;
+                       for(i=0;i<objects.numobjects;i++)
+                       {
+                               objects.model[i].numdecals=0;
+                       }
  
-                                                       consolechars[0]=255;
-                                                       consoleselected=0;
-                                                       }
-                                                       }
-                                                       }
-                                                       */
-                                                       if(Compare(consoletext[0],"save ",0,4)){
-                                                               mapname[0]=':';
-                                                               mapname[1]='D';
-                                                               mapname[2]='a';
-                                                               mapname[3]='t';
-                                                               mapname[4]='a';
-                                                               mapname[5]=':';
-                                                               mapname[6]='M';
-                                                               mapname[7]='a';
-                                                               mapname[8]='p';
-                                                               mapname[9]='s';
-                                                               mapname[10]=':';
-                                                               for(j=5;j<consolechars[0];j++){
-                                                                       mapname[j-5+11]=consoletext[0][j];
-                                                               }
-                                                               mapname[consolechars[0]-5+11]='\0';
-                                                               PlaySoundEx( consolesuccesssound, samp[consolesuccesssound], NULL, true);
-                                                               OPENAL_SetVolume(channels[consolesuccesssound], 256);
-                                                               OPENAL_SetPaused(channels[consolesuccesssound], false);
-                                                               int mapvers;
-                                                               mapvers=12;
-                                                               FILE                    *tfile;
-                                                               tfile=fopen( ConvertFileName(mapname), "wb" );
-                                                               fpackf(tfile, "Bi", mapvers);
-                                                               //fpackf(tfile, "Bi", indemo);
-                                                               fpackf(tfile, "Bi", maptype);
-                                                               fpackf(tfile, "Bi", hostile);
-                                                               fpackf(tfile, "Bf Bf", viewdistance, fadestart);
-                                                               fpackf(tfile, "Bb Bf Bf Bf", skyboxtexture, skyboxr, skyboxg, skyboxb);
-                                                               fpackf(tfile, "Bf Bf Bf", skyboxlightr, skyboxlightg, skyboxlightb);
-                                                               fpackf(tfile, "Bf Bf Bf Bf Bf Bi", player[0].coords.x, player[0].coords.y, player[0].coords.z, player[0].rotation, player[0].targetrotation, player[0].num_weapons);
-                                                               if(player[0].num_weapons>0&&player[0].num_weapons<5)
-                                                                       for(j=0;j<player[0].num_weapons;j++){
-                                                                               fpackf(tfile, "Bi", weapons.type[player[0].weaponids[j]]);
-                                                                       }
+                       j=objects.numobjects;
+                       for(i=0;i<j;i++)
+                       {
+                               objects.DeleteObject(0);
+                               if(visibleloading){loadscreencolor=4; LoadingScreen();}
+                       }
  
-                                                                       fpackf(tfile, "Bf Bf Bf", player[0].armorhead, player[0].armorhigh, player[0].armorlow);
-                                                                       fpackf(tfile, "Bf Bf Bf", player[0].protectionhead, player[0].protectionhigh, player[0].protectionlow);
-                                                                       fpackf(tfile, "Bf Bf Bf", player[0].metalhead, player[0].metalhigh, player[0].metallow);
-                                                                       fpackf(tfile, "Bf Bf", player[0].power, player[0].speedmult);
-                                                                       fpackf(tfile, "Bi", player[0].numclothes);
-                                                                       fpackf(tfile, "Bi Bi", player[0].whichskin, player[0].creature);
-                                                                       fpackf(tfile, "Bi", numdialogues);
-                                                                       if(numdialogues)
-                                                                               for(k=0;k<numdialogues;k++){
-                                                                                       fpackf(tfile, "Bi", numdialogueboxes[k]);
-                                                                                       fpackf(tfile, "Bi", dialoguetype[k]);
-                                                                                       for(l=0;l<10;l++){
-                                                                                               fpackf(tfile, "Bf Bf Bf", participantlocation[k][l].x, participantlocation[k][l].y, participantlocation[k][l].z);
-                                                                                               fpackf(tfile, "Bf", participantrotation[k][l]);
-                                                                                       }
-                                                                                       if(numdialogueboxes)
-                                                                                               for(l=0;l<numdialogueboxes[k];l++){
-                                                                                                       fpackf(tfile, "Bi", dialogueboxlocation[k][l]);
-                                                                                                       fpackf(tfile, "Bf", dialogueboxcolor[k][l][0]);
-                                                                                                       fpackf(tfile, "Bf", dialogueboxcolor[k][l][1]);
-                                                                                                       fpackf(tfile, "Bf", dialogueboxcolor[k][l][2]);
-                                                                                                       fpackf(tfile, "Bi", dialogueboxsound[k][l]);
-                                                                                                       templength=strlen(dialoguetext[k][l]);
-                                                                                                       fpackf(tfile, "Bi",(templength));
-                                                                                                       for(m=0;m<templength;m++){
-                                                                                                               fpackf(tfile, "Bb", dialoguetext[k][l][m]);
-                                                                                                               if(dialoguetext[k][l][m]=='\0')break;
-                                                                                                       }
-                                                                                                       templength=strlen(dialoguename[k][l]);
-                                                                                                       fpackf(tfile, "Bi",templength);
-                                                                                                       for(m=0;m<templength;m++){
-                                                                                                               fpackf(tfile, "Bb", dialoguename[k][l][m]);
-                                                                                                               if(dialoguename[k][l][m]=='\0')break;
-                                                                                                       }
-                                                                                                       fpackf(tfile, "Bf Bf Bf", dialoguecamera[k][l].x, dialoguecamera[k][l].y, dialoguecamera[k][l].z);
-                                                                                                       fpackf(tfile, "Bi", participantfocus[k][l]);
-                                                                                                       fpackf(tfile, "Bi", participantaction[k][l]);
-                                                                                                       for(m=0;m<10;m++)
-                                                                                                               fpackf(tfile, "Bf Bf Bf", participantfacing[k][l][m].x, participantfacing[k][l][m].y, participantfacing[k][l][m].z);
-                                                                                                       fpackf(tfile, "Bf Bf",dialoguecamerarotation[k][l],dialoguecamerarotation2[k][l]);
-                                                                                               }
-                                                                               }
-                                                                               if(player[0].numclothes)
-                                                                                       for(k=0;k<player[0].numclothes;k++){
-                                                                                               templength=strlen(player[0].clothes[k]);
-                                                                                               fpackf(tfile, "Bi", templength);
-                                                                                               for(l=0;l<templength;l++)
-                                                                                                       fpackf(tfile, "Bb", player[0].clothes[k][l]);
-                                                                                               fpackf(tfile, "Bf Bf Bf", player[0].clothestintr[k], player[0].clothestintg[k], player[0].clothestintb[k]);
-                                                                                       }
-                                                                                       fpackf(tfile, "Bi", environment);
-                                                                                       fpackf(tfile, "Bi", objects.numobjects);
-                                                                                       if(objects.numobjects)
-                                                                                               for(k=0;k<objects.numobjects;k++){
-                                                                                                       fpackf(tfile, "Bi Bf Bf Bf Bf Bf Bf", objects.type[k], objects.rotation[k], objects.rotation2[k], objects.position[k].x, objects.position[k].y, objects.position[k].z, objects.scale[k]);
-                                                                                               }
-                                                                                               fpackf(tfile, "Bi", numhotspots);
-                                                                                               if(numhotspots)
-                                                                                                       for(i=0;i<numhotspots;i++){
-                                                                                                               fpackf(tfile, "Bi Bf Bf Bf Bf", hotspottype[i],hotspotsize[i],hotspot[i].x,hotspot[i].y,hotspot[i].z);
-                                                                                                               templength=strlen(hotspottext[i]);
-                                                                                                               fpackf(tfile, "Bi",templength);
-                                                                                                               for(l=0;l<templength;l++)
-                                                                                                                       fpackf(tfile, "Bb", hotspottext[i][l]);
-                                                                                                       }
-                                                                                                       fpackf(tfile, "Bi", numplayers);
-                                                                                                       if(numplayers>1&&numplayers<maxplayers)
-                                                                                                               for(j=1;j<numplayers;j++){
-                                                                                                                       fpackf(tfile, "Bi Bi Bf Bf Bf Bi Bi Bf Bb Bf", player[j].whichskin, player[j].creature, player[j].coords.x, player[j].coords.y, player[j].coords.z, player[j].num_weapons, player[j].howactive, player[j].scale, player[j].immobile, player[j].rotation);
-                                                                                                                       if(player[j].num_weapons>0&&player[j].num_weapons<5)
-                                                                                                                               for(k=0;k<player[j].num_weapons;k++){
-                                                                                                                                       fpackf(tfile, "Bi", weapons.type[player[j].weaponids[k]]);
-                                                                                                                               }
-                                                                                                                               if(player[j].numwaypoints<30){
-                                                                                                                                       fpackf(tfile, "Bi", player[j].numwaypoints);
-                                                                                                                                       for(k=0;k<player[j].numwaypoints;k++){
-                                                                                                                                               fpackf(tfile, "Bf", player[j].waypoints[k].x);
-                                                                                                                                               fpackf(tfile, "Bf", player[j].waypoints[k].y);
-                                                                                                                                               fpackf(tfile, "Bf", player[j].waypoints[k].z);
-                                                                                                                                               fpackf(tfile, "Bi", player[j].waypointtype[k]);
-                                                                                                                                       }
-                                                                                                                                       fpackf(tfile, "Bi", player[j].waypoint);
-                                                                                                                               }
-                                                                                                                               else{
-                                                                                                                                       player[j].numwaypoints=0;
-                                                                                                                                       player[j].waypoint=0;
-                                                                                                                                       fpackf(tfile, "Bi Bi Bi", player[j].numwaypoints, player[j].waypoint, player[j].waypoint);
-                                                                                                                               }
-                                                                                                                               fpackf(tfile, "Bf Bf Bf", player[j].armorhead, player[j].armorhigh, player[j].armorlow);
-                                                                                                                               fpackf(tfile, "Bf Bf Bf", player[j].protectionhead, player[j].protectionhigh, player[j].protectionlow);
-                                                                                                                               fpackf(tfile, "Bf Bf Bf", player[j].metalhead, player[j].metalhigh, player[j].metallow);
-                                                                                                                               fpackf(tfile, "Bf Bf", player[j].power, player[j].speedmult);
-                                                                                                                               if(player[j].creature==wolftype){
-                                                                                                                                       headprop=player[j].proportionhead.x/1.1;
-                                                                                                                                       bodyprop=player[j].proportionbody.x/1.1;
-                                                                                                                                       armprop=player[j].proportionarms.x/1.1;
-                                                                                                                                       legprop=player[j].proportionlegs.x/1.1;
-                                                                                                                               }
-                                                                                                                               if(player[j].creature==rabbittype){
-                                                                                                                                       headprop=player[j].proportionhead.x/1.2;
-                                                                                                                                       bodyprop=player[j].proportionbody.x/1.05;
-                                                                                                                                       armprop=player[j].proportionarms.x/1.00;
-                                                                                                                                       legprop=player[j].proportionlegs.x/1.1;
-                                                                                                                               }
-                                                                                                                               fpackf(tfile, "Bf Bf Bf Bf", headprop, bodyprop, armprop, legprop);
-                                                                                                                               fpackf(tfile, "Bi", player[j].numclothes);
-                                                                                                                               if(player[j].numclothes)
-                                                                                                                                       for(k=0;k<player[j].numclothes;k++){
-                                                                                                                                               int templength;
-                                                                                                                                               templength=strlen(player[j].clothes[k]);
-                                                                                                                                               fpackf(tfile, "Bi", templength);
-                                                                                                                                               for(l=0;l<templength;l++)
-                                                                                                                                                       fpackf(tfile, "Bb", player[j].clothes[k][l]);
-                                                                                                                                               fpackf(tfile, "Bf Bf Bf", player[j].clothestintr[k], player[j].clothestintg[k], player[j].clothestintb[k]);
-                                                                                                                                       }
-                                                                                                               }
-                                                                                                               fpackf(tfile, "Bi", numpathpoints);
-                                                                                                               if(numpathpoints)
-                                                                                                                       for(j=0;j<numpathpoints;j++){
-                                                                                                                               fpackf(tfile, "Bf Bf Bf Bi", pathpoint[j].x, pathpoint[j].y, pathpoint[j].z, numpathpointconnect[j]);
-                                                                                                                               for(k=0;k<numpathpointconnect[j];k++){
-                                                                                                                                       fpackf(tfile, "Bi", pathpointconnect[j][k]);
-                                                                                                                               }
-                                                                                                                       }
-                                                                                                                       fpackf(tfile, "Bf Bf Bf Bf", mapcenter.x, mapcenter.y, mapcenter.z, mapradius);
-                                                                                                                       fclose(tfile);
-                                                                                                                       donesomething=1;
-                                                                                                                       /*
-                                                                                                                       FILE                    *tfile;
-                                                                                                                       tfile=fopen( mapname, "wb" );
-                                                                                                                       fwrite( &mapvers, 1, sizeof(int), tfile );
-                                                                                                                       fwrite( &player[0].coords.x, 1, sizeof(float), tfile );
-                                                                                                                       fwrite( &player[0].coords.y, 1, sizeof(float), tfile );
-                                                                                                                       fwrite( &player[0].coords.z, 1, sizeof(float), tfile );
-                                                                                                                       fwrite( &player[0].rotation, 1, sizeof(float), tfile );
-                                                                                                                       fwrite( &player[0].targetrotation, 1, sizeof(float), tfile );
-                                                                                                                       fwrite( &player[0].num_weapons, 1, sizeof(int), tfile );
-                                                                                                                       if(player[0].num_weapons>0&&player[0].num_weapons<5)
-                                                                                                                       for(j=0;j<player[0].num_weapons;j++){
-                                                                                                                       fwrite( &weapons.type[player[0].weaponids[j]], 1, sizeof(int), tfile );
-                                                                                                                       }
-                                                                                                                       fwrite( &player[0].armorhead, 1, sizeof(int), tfile );
-                                                                                                                       fwrite( &player[0].armorhigh, 1, sizeof(int), tfile );
-                                                                                                                       fwrite( &player[0].armorlow, 1, sizeof(int), tfile );
-                                                                                                                       fwrite( &player[0].protectionhead, 1, sizeof(int), tfile );
-                                                                                                                       fwrite( &player[0].protectionhigh, 1, sizeof(int), tfile );
-                                                                                                                       fwrite( &player[0].protectionlow, 1, sizeof(int), tfile );
-                                                                                                                       fwrite( &player[0].metalhead, 1, sizeof(int), tfile );
-                                                                                                                       fwrite( &player[0].metalhigh, 1, sizeof(int), tfile );
-                                                                                                                       fwrite( &player[0].metallow, 1, sizeof(int), tfile );
-                                                                                                                       fwrite( &player[0].power, 1, sizeof(int), tfile );
-                                                                                                                       fwrite( &player[0].speedmult, 1, sizeof(int), tfile );
-                                                                                                                       fwrite( &player[0].numclothes, 1, sizeof(int), tfile );
-                                                                                                                       if(player[0].numclothes)
-                                                                                                                       for(k=0;k<player[0].numclothes;k++){
-                                                                                                                       int templength;
-                                                                                                                       templength=strlen(player[0].clothes[k]);
-                                                                                                                       fwrite( &templength,1,sizeof(int),tfile);
-                                                                                                                       for(l=0;l<templength;l++)
-                                                                                                                       fwrite( &player[0].clothes[k][l],1,sizeof(char),tfile);
-                                                                                                                       fwrite( &player[0].clothestintr[k],1,sizeof(float),tfile);
-                                                                                                                       fwrite( &player[0].clothestintg[k],1,sizeof(float),tfile);
-                                                                                                                       fwrite( &player[0].clothestintb[k],1,sizeof(float),tfile);
-                                                                                                                       }
-                                                                                                                       fwrite( &environment, 1, sizeof(int), tfile );
-                                                                                                                       fwrite( &objects.numobjects, 1, sizeof(int), tfile );
-                                                                                                                       for(k=0;k<objects.numobjects;k++){
-                                                                                                                       fwrite( &objects.type[k], 1, sizeof(int), tfile );
-                                                                                                                       fwrite( &objects.rotation[k], 1, sizeof(float), tfile );
-                                                                                                                       fwrite( &objects.rotation2[k], 1, sizeof(float), tfile );
-                                                                                                                       fwrite( &objects.position[k].x, 1, sizeof(float), tfile );
-                                                                                                                       fwrite( &objects.position[k].y, 1, sizeof(float), tfile );
-                                                                                                                       fwrite( &objects.position[k].z, 1, sizeof(float), tfile );
-                                                                                                                       fwrite( &objects.scale[k], 1, sizeof(float), tfile );
-                                                                                                                       }
-                                                                                                                       fwrite( &numplayers, 1, sizeof(int), tfile );
-                                                                                                                       if(numplayers>1&&numplayers<maxplayers)
-                                                                                                                       for(j=1;j<numplayers;j++){
-                                                                                                                       fwrite( &player[j].whichskin, 1, sizeof(int), tfile );
-                                                                                                                       fwrite( &player[j].creature, 1, sizeof(int), tfile );
-                                                                                                                       fwrite( &player[j].coords.x, 1, sizeof(float), tfile );
-                                                                                                                       fwrite( &player[j].coords.y, 1, sizeof(float), tfile );
-                                                                                                                       fwrite( &player[j].coords.z, 1, sizeof(float), tfile );
-                                                                                                                       fwrite( &player[j].num_weapons, 1, sizeof(int), tfile );
-                                                                                                                       if(player[j].num_weapons>0&&player[j].num_weapons<5)
-                                                                                                                       for(k=0;k<player[j].num_weapons;k++){
-                                                                                                                       fwrite( &weapons.type[player[j].weaponids[k]], 1, sizeof(int), tfile );
-                                                                                                                       }
-                                                                                                                       if(player[j].numwaypoints<30){
-                                                                                                                       fwrite( &player[j].numwaypoints, 1, sizeof(int), tfile );
-                                                                                                                       for(k=0;k<player[j].numwaypoints;k++){
-                                                                                                                       fwrite( &player[j].waypoints[k].x, 1, sizeof(float), tfile );
-                                                                                                                       fwrite( &player[j].waypoints[k].y, 1, sizeof(float), tfile );
-                                                                                                                       fwrite( &player[j].waypoints[k].z, 1, sizeof(float), tfile );
-                                                                                                                       }
-                                                                                                                       fwrite( &player[j].waypoint, 1, sizeof(int), tfile );
-                                                                                                                       //fwrite( &player[j].jumppath, 1, sizeof(bool), tfile );
-                                                                                                                       }
-                                                                                                                       else{
-                                                                                                                       player[j].numwaypoints=0;
-                                                                                                                       player[j].waypoint=0;
-                                                                                                                       fwrite( &player[j].numwaypoints, 1, sizeof(int), tfile );
-                                                                                                                       fwrite( &player[j].waypoint, 1, sizeof(int), tfile );
-                                                                                                                       fwrite( &player[j].waypoint, 1, sizeof(int), tfile );
-                                                                                                                       }
-                                                                                                                       fwrite( &player[j].armorhead, 1, sizeof(int), tfile );
-                                                                                                                       fwrite( &player[j].armorhigh, 1, sizeof(int), tfile );
-                                                                                                                       fwrite( &player[j].armorlow, 1, sizeof(int), tfile );
-                                                                                                                       fwrite( &player[j].protectionhead, 1, sizeof(int), tfile );
-                                                                                                                       fwrite( &player[j].protectionhigh, 1, sizeof(int), tfile );
-                                                                                                                       fwrite( &player[j].protectionlow, 1, sizeof(int), tfile );
-                                                                                                                       fwrite( &player[j].metalhead, 1, sizeof(int), tfile );
-                                                                                                                       fwrite( &player[j].metalhigh, 1, sizeof(int), tfile );
-                                                                                                                       fwrite( &player[j].metallow, 1, sizeof(int), tfile );
-                                                                                                                       fwrite( &player[j].power, 1, sizeof(int), tfile );
-                                                                                                                       fwrite( &player[j].speedmult, 1, sizeof(int), tfile );
-                                                                                                                       fwrite( &player[j].numclothes, 1, sizeof(int), tfile );
-                                                                                                                       if(player[j].numclothes)
-                                                                                                                       for(k=0;k<player[j].numclothes;k++){
-                                                                                                                       int templength;
-                                                                                                                       templength=strlen(player[j].clothes[k]);
-                                                                                                                       fwrite( &templength,1,sizeof(int),tfile);
-                                                                                                                       for(l=0;l<templength;l++)
-                                                                                                                       fwrite( &player[j].clothes[k][l],1,sizeof(char),tfile);
-                                                                                                                       fwrite( &player[j].clothestintr[k],1,sizeof(float),tfile);
-                                                                                                                       fwrite( &player[j].clothestintg[k],1,sizeof(float),tfile);
-                                                                                                                       fwrite( &player[j].clothestintb[k],1,sizeof(float),tfile);
-                                                                                                                       }
-                                                                                                                       }
-                                                                                                                       fwrite( &numpathpoints, 1, sizeof(int), tfile );
-                                                                                                                       if(numpathpoints)
-                                                                                                                       for(j=0;j<numpathpoints;j++){
-                                                                                                                       fwrite( &pathpoint[j].x, 1, sizeof(float), tfile );
-                                                                                                                       fwrite( &pathpoint[j].y, 1, sizeof(float), tfile );
-                                                                                                                       fwrite( &pathpoint[j].z, 1, sizeof(float), tfile );
-                                                                                                                       fwrite( &numpathpointconnect[j], 1, sizeof(int), tfile );
-                                                                                                                       for(k=0;k<numpathpointconnect[j];k++){
-                                                                                                                       fwrite( &pathpointconnect[j][k], 1, sizeof(int), tfile );
-                                                                                                                       }
-                                                                                                                       }
-                                                                                                                       fwrite( &mapcenter.x, 1, sizeof(float), tfile );
-                                                                                                                       fwrite( &mapcenter.y, 1, sizeof(float), tfile );
-                                                                                                                       fwrite( &mapcenter.z, 1, sizeof(float), tfile );
-                                                                                                                       fwrite( &mapradius, 1, sizeof(float), tfile );
-                                                                                                                       fclose(tfile);
-                                                                                                                       donesomething=1;*/
-                                                       }
-                                                       /*
-                                                       if(Compare(consoletext[0],"save ",0,4)){
-                                                       mapname[0]=':';
-                                                       mapname[1]='D';
-                                                       mapname[2]='a';
-                                                       mapname[3]='t';
-                                                       mapname[4]='a';
-                                                       mapname[5]=':';
-                                                       mapname[6]='M';
-                                                       mapname[7]='a';
-                                                       mapname[8]='p';
-                                                       mapname[9]='s';
-                                                       mapname[10]=':';
-                                                       for(j=5;j<consolechars[0];j++){
-                                                       mapname[j-5+11]=consoletext[0][j];
-                                                       }
-                                                       mapname[consolechars[0]-5+11]='\0';
-                                                       PlaySoundEx( consolesuccesssound, samp[consolesuccesssound], NULL, true);
-                                                       OPENAL_SetVolume(channels[consolesuccesssound], 256);
-                                                       OPENAL_SetPaused(channels[consolesuccesssound], false);
-                                                       FILE                    *tfile;
-                                                       tfile=fopen( mapname, "wb" );
-                                                       fwrite( &player[0].coords, 1, sizeof(XYZ), tfile );
-                                                       fwrite( &player[0].rotation, 1, sizeof(float), tfile );
-                                                       fwrite( &player[0].targetrotation, 1, sizeof(float), tfile );
-                                                       fwrite( &player[0].num_weapons, 1, sizeof(int), tfile );
-                                                       if(player[0].num_weapons>0&&player[0].num_weapons<5)
-                                                       for(j=0;j<player[0].num_weapons;j++){
-                                                       fwrite( &weapons.type[player[0].weaponids[j]], 1, sizeof(int), tfile );
-                                                       }
-                                                       fwrite( &environment, 1, sizeof(int), tfile );
-                                                       fwrite( &objects.numobjects, 1, sizeof(int), tfile );
-                                                       fwrite( &objects.type, 1, sizeof(int)*objects.numobjects, tfile );
-                                                       fwrite( &objects.rotation, 1, sizeof(float)*objects.numobjects, tfile );
-                                                       fwrite( &objects.position, 1, sizeof(XYZ)*objects.numobjects, tfile );
-                                                       fwrite( &objects.scale, 1, sizeof(float)*objects.numobjects, tfile );
-                                                       fwrite( &numplayers, 1, sizeof(int), tfile );
-                                                       if(numplayers>1&&numplayers<maxplayers)
-                                                       for(j=1;j<numplayers;j++){
-                                                       fwrite( &player[j].coords, 1, sizeof(XYZ), tfile );
-                                                       fwrite( &player[j].num_weapons, 1, sizeof(int), tfile );
-                                                       if(player[j].num_weapons>0&&player[j].num_weapons<5)
-                                                       for(k=0;k<player[j].num_weapons;k++){
-                                                       fwrite( &weapons.type[player[j].weaponids[k]], 1, sizeof(int), tfile );
-                                                       }
-                                                       if(player[j].numwaypoints<30){
-                                                       fwrite( &player[j].numwaypoints, 1, sizeof(int), tfile );
-                                                       fwrite( &player[j].waypoints, 1, sizeof(XYZ)*player[j].numwaypoints, tfile );
-                                                       fwrite( &player[j].waypoint, 1, sizeof(int), tfile );
-                                                       //fwrite( &player[j].jumppath, 1, sizeof(bool), tfile );
-                                                       }
-                                                       else{
-                                                       player[j].numwaypoints=0;
-                                                       player[j].waypoint=0;
-                                                       fwrite( &player[j].numwaypoints, 1, sizeof(int), tfile );
-                                                       fwrite( &player[j].waypoint, 1, sizeof(int), tfile );
-                                                       fwrite( &player[j].waypoint, 1, sizeof(int), tfile );
-                                                       }
-                                                       }
-                                                       fwrite( &numpathpoints, 1, sizeof(int), tfile );
-                                                       if(numpathpoints)
-                                                       for(j=0;j<numpathpoints;j++){
-                                                       fwrite( &pathpoint[j], 1, sizeof(XYZ), tfile );
-                                                       fwrite( &numpathpointconnect[j], 1, sizeof(int), tfile );
-                                                       for(k=0;k<numpathpointconnect[j];k++){
-                                                       fwrite( &pathpointconnect[j][k], 1, sizeof(int), tfile );
-                                                       }
-                                                       }
-                                                       fclose(tfile);
-                                                       donesomething=1;
-                                                       }*/
-                                                       if(Compare(consoletext[0],"cellar door ",0,11)||Compare(consoletext[0],"cellardoor ",0,10)){
-                                                               LoadTextureSave(":Data:Textures:Furdarko.jpg",&player[0].skeleton.drawmodel.textureptr,1,&player[0].skeleton.skinText[0],&player[0].skeleton.skinsize);
-                                                               donesomething=1;
-                                                       }
-                                                       /*if(Compare(consoletext[0],"Pants ",0,5)){
-                                                       AddClothes(":Data:Textures:Pants.png",0,1,&player[i].skeleton.skinText[0],&player[i].skeleton.skinsize);
-                                                       player[i].DoMipmaps(5,0,0,player[i].skeleton.skinsize,player[i].skeleton.skinsize);
-                                                       donesomething=1;
-                                                       }*/
-                                                       if(Compare(consoletext[0],"tintr ",0,5)||Compare(consoletext[0],"Tintr ",0,5)){
-                                                               for(j=6;j<consolechars[0];j++){
-                                                                       mapname[j-6]=consoletext[0][j];
-                                                               }
+                       for(i=0;i<subdivision;i++)
+                       {
+                               for(j=0;j<subdivision;j++)
+                               {
+                                       terrain.patchobjectnum[i][j]=0;
+                               }
+                       }
+                       if(visibleloading){loadscreencolor=4; LoadingScreen();}
+               }
  
-                                                               tintr=atof(mapname);
+               weapons.numweapons=0;
  
-                                                               donesomething=1;
-                                                       }
+               funpackf(tfile, "Bi", &mapvers);
+               if(mapvers>=15)funpackf(tfile, "Bi", &indemo);
+               else indemo=0;
+               if(mapvers>=5)funpackf(tfile, "Bi", &maptype);
+               else maptype=mapkilleveryone;
+               if(mapvers>=6)funpackf(tfile, "Bi", &hostile);
+               else hostile=1;
+               if(mapvers>=4)funpackf(tfile, "Bf Bf", &viewdistance, &fadestart);
+               else
+               {
+                       viewdistance=100;
+                       fadestart=.6;
+               }
+               if(mapvers>=2)funpackf(tfile, "Bb Bf Bf Bf", &skyboxtexture, &skyboxr, &skyboxg, &skyboxb);
+               else
+               {
+                       skyboxtexture=1;
+                       skyboxr=1;
+                       skyboxg=1;
+                       skyboxb=1;
+               }
+               if(mapvers>=10)funpackf(tfile, "Bf Bf Bf", &skyboxlightr, &skyboxlightg, &skyboxlightb);
+               else
+               {
+                       skyboxlightr=skyboxr;
+                       skyboxlightg=skyboxg;
+                       skyboxlightb=skyboxb;
+               }
+               if(!stealthloading)funpackf(tfile, "Bf Bf Bf Bf Bf Bi", &player[0].coords.x,&player[0].coords.y,&player[0].coords.z,&player[0].rotation,&player[0].targetrotation, &player[0].num_weapons);
+               if(stealthloading)funpackf(tfile, "Bf Bf Bf Bf Bf Bi", &lamefloat,&lamefloat,&lamefloat,&lamefloat,&lamefloat, &player[0].num_weapons);
+               player[0].originalcoords=player[0].coords;
+               if(player[0].num_weapons>0&&player[0].num_weapons<5)
+               {
+                       for(j=0;j<player[0].num_weapons;j++)
+                       {
+                               player[0].weaponids[j]=weapons.numweapons;
+                               funpackf(tfile, "Bi", &weapons.type[weapons.numweapons]);
+                               weapons.owner[weapons.numweapons]=0;
+                               weapons.numweapons++;
+                       }
+               }
  
-                                                       if(Compare(consoletext[0],"speed ",0,5)||Compare(consoletext[0],"Speed ",0,5)){
-                                                               for(j=6;j<consolechars[0];j++){
-                                                                       mapname[j-6]=consoletext[0][j];
-                                                               }
+               if(visibleloading){loadscreencolor=4; LoadingScreen();}
  
-                                                               player[0].speedmult=atof(mapname);
+               funpackf(tfile, "Bf Bf Bf", &player[0].armorhead, &player[0].armorhigh, &player[0].armorlow);
+               funpackf(tfile, "Bf Bf Bf", &player[0].protectionhead, &player[0].protectionhigh, &player[0].protectionlow);
+               funpackf(tfile, "Bf Bf Bf", &player[0].metalhead, &player[0].metalhigh, &player[0].metallow);
+               funpackf(tfile, "Bf Bf", &player[0].power, &player[0].speedmult);
  
-                                                               donesomething=1;
-                                                       }
+               funpackf(tfile, "Bi", &player[0].numclothes);
  
-                                                       if(Compare(consoletext[0],"strength ",0,8)||Compare(consoletext[0],"Strength ",0,8)){
-                                                               for(j=9;j<consolechars[0];j++){
-                                                                       mapname[j-9]=consoletext[0][j];
-                                                               }
+               if(mapvers>=9)
+               {
+                       funpackf(tfile, "Bi Bi", &player[0].whichskin, &player[0].creature);
+               }
+               else
+               {
+                       player[0].whichskin=0;
+                       player[0].creature=rabbittype;
+               }
  
-                                                               player[0].power=atof(mapname);
+               for(i=0;i<max_dialogues;i++)
+               {
+                       for(j=0;j<max_dialoguelength;j++)
+                       {
+                               for(k=0;k<128;k++)
+                               {
+                                       dialoguetext[i][j][k]='\0';
+                               }
+                               for(k=0;k<64;k++)
+                               {
+                                       dialoguename[i][j][k]='\0';
+                               }
+                       }
+               }
  
-                                                               donesomething=1;
-                                                       }
+               player[0].lastattack=-1;
+               player[0].lastattack2=-1;
+               player[0].lastattack3=-1;
  
-                                                       if(Compare(consoletext[0],"viewdistance ",0,12)||Compare(consoletext[0],"Viewdistance ",0,12)){
-                                                               for(j=13;j<consolechars[0];j++){
-                                                                       mapname[j-13]=consoletext[0][j];
-                                                               }
+               if(mapvers>=8)
+               {
+                       funpackf(tfile, "Bi", &numdialogues);
+                       if(numdialogues)
+                       {
+                               for(k=0;k<numdialogues;k++)
+                               {
+                                       funpackf(tfile, "Bi", &numdialogueboxes[k]);
+                                       funpackf(tfile, "Bi", &dialoguetype[k]);
+                                       for(l=0;l<10;l++)
+                                       {
+                                               funpackf(tfile, "Bf Bf Bf", &participantlocation[k][l].x, &participantlocation[k][l].y, &participantlocation[k][l].z);
+                                               funpackf(tfile, "Bf", &participantrotation[k][l]);
+                                       }
+                                       if(numdialogueboxes)
+                                       {
+                                               for(l=0;l<numdialogueboxes[k];l++)
+                                               {
+                                                       funpackf(tfile, "Bi", &dialogueboxlocation[k][l]);
+                                                       funpackf(tfile, "Bf", &dialogueboxcolor[k][l][0]);
+                                                       funpackf(tfile, "Bf", &dialogueboxcolor[k][l][1]);
+                                                       funpackf(tfile, "Bf", &dialogueboxcolor[k][l][2]);
+                                                       funpackf(tfile, "Bi", &dialogueboxsound[k][l]);
  
-                                                               viewdistance=atof(mapname)*100;
+                                                       bool doneread;
  
-                                                               donesomething=1;
+                                                       funpackf(tfile, "Bi",&templength);
+                                                       if(templength>128||templength<=0)templength=128;
+                                                       for(m=0;m<templength;m++){
+                                                               funpackf(tfile, "Bb", &dialoguetext[k][l][m]);
+                                                               if(dialoguetext[k][l][m]=='\0')break;
                                                        }
  
-                                                       if(Compare(consoletext[0],"fadestart ",0,9)||Compare(consoletext[0],"Fadestart ",0,9)){
-                                                               for(j=10;j<consolechars[0];j++){
-                                                                       mapname[j-10]=consoletext[0][j];
+                                                       funpackf(tfile, "Bi",&templength);
+                                                       if(templength>64||templength<=0)templength=64;
+                                                       for(m=0;m<templength;m++){
+                                                               funpackf(tfile, "Bb", &dialoguename[k][l][m]);
+                                                               if(dialoguename[k][l][m]=='\0'){
+                                                                       break;
                                                                }
-                                                               fadestart=atof(mapname);
-                                                               donesomething=1;
                                                        }
+                                                       funpackf(tfile, "Bf Bf Bf", &dialoguecamera[k][l].x, &dialoguecamera[k][l].y, &dialoguecamera[k][l].z);
+                                                       funpackf(tfile, "Bi", &participantfocus[k][l]);
+                                                       funpackf(tfile, "Bi", &participantaction[k][l]);
  
-                                                       if(Compare(consoletext[0],"power ",0,5)||Compare(consoletext[0],"Power ",0,5)){
-                                                               for(j=6;j<consolechars[0];j++){
-                                                                       mapname[j-6]=consoletext[0][j];
-                                                               }
-                                                               player[0].power=atof(mapname);
-                                                               donesomething=1;
-                                                       }
+                                                       for(m=0;m<10;m++)
+                                                               funpackf(tfile, "Bf Bf Bf", &participantfacing[k][l][m].x, &participantfacing[k][l][m].y, &participantfacing[k][l][m].z);
  
-                                                       if(Compare(consoletext[0],"slomo ",0,5)||Compare(consoletext[0],"Slomo ",0,5)){
-                                                               for(j=6;j<consolechars[0];j++){
-                                                                       mapname[j-6]=consoletext[0][j];
-                                                               }
+                                                       funpackf(tfile, "Bf Bf",&dialoguecamerarotation[k][l],&dialoguecamerarotation2[k][l]);
+                                               }
+                                       }
+                               }
+                       }
+               }
+               else numdialogues=0;
  
-                                                               slomospeed=atof(mapname);
-                                                               slomo=1-slomo;
-                                                               slomodelay=1000;
+               if(player[0].numclothes)
+               {
+                       for(k=0;k<player[0].numclothes;k++)
+                       {
+                               funpackf(tfile, "Bi", &templength);
+                               for(l=0;l<templength;l++)
+                                       funpackf(tfile, "Bb", &player[0].clothes[k][l]);
+                               player[0].clothes[k][templength]='\0';
+                               funpackf(tfile, "Bf Bf Bf", &player[0].clothestintr[k], &player[0].clothestintg[k], &player[0].clothestintb[k]);
+                       }
+               }
  
-                                                               donesomething=1;
-                                                       }
+               funpackf(tfile, "Bi", &environment);
  
-                                                       if(Compare(consoletext[0],"slofreq ",0,7)||Compare(consoletext[0],"Slofreq ",0,7)){
-                                                               for(j=8;j<consolechars[0];j++){
-                                                                       mapname[j-8]=consoletext[0][j];
-                                                               }
+               funpackf(tfile, "Bi", &objects.numobjects);
+               if(objects.numobjects)
+               {
+                       for(i=0;i<objects.numobjects;i++)
+                       {
+                               funpackf(tfile, "Bi Bf Bf Bf Bf Bf Bf", &objects.type[i],&objects.rotation[i],&objects.rotation2[i], &objects.position[i].x, &objects.position[i].y, &objects.position[i].z,&objects.scale[i]);
+                               if(objects.type[i]==treeleavestype)objects.scale[i]=objects.scale[i-1];
+                       }
+               }
  
-                                                               slomofreq=atoi(mapname);
+               if(mapvers>=7)
+               {
+                       funpackf(tfile, "Bi", &numhotspots);
+                       if(numhotspots)
+                       {
+                               for(i=0;i<numhotspots;i++)
+                               {
+                                       funpackf(tfile, "Bi Bf Bf Bf Bf", &hotspottype[i],&hotspotsize[i],&hotspot[i].x,&hotspot[i].y,&hotspot[i].z);
+                                       funpackf(tfile, "Bi", &templength);
+                                       if(templength)
+                                               for(l=0;l<templength;l++)
+                                                       funpackf(tfile, "Bb", &hotspottext[i][l]);
+                                       hotspottext[i][templength]='\0';
+                                       if(hotspottype[i]==-111)indemo=1;
+                               }
+                       }
+               }
+               else numhotspots=0;
  
-                                                               donesomething=1;
-                                                       }
+               if(visibleloading){loadscreencolor=4; LoadingScreen();}
  
-                                                       if(Compare(consoletext[0],"size ",0,4)||Compare(consoletext[0],"Size ",0,4)){
-                                                               for(j=5;j<consolechars[0];j++){
-                                                                       mapname[j-5]=consoletext[0][j];
-                                                               }
+               if(!stealthloading)
+               {
+                       objects.center=0;
+                       for(i=0;i<objects.numobjects;i++)
+                       {
+                               objects.center+=objects.position[i];
+                       }
+                       objects.center/=objects.numobjects;
  
-                                                               player[0].scale=atof(mapname)*.2;
  
-                                                               donesomething=1;
-                                                       }
+                       if(visibleloading){loadscreencolor=4; LoadingScreen();}
  
-                                                       if(Compare(consoletext[0],"sizenear ",0,8)||Compare(consoletext[0],"Sizenear ",0,8)){
-                                                               int closest=-1;
-                                                               float closestdist=-1;
-                                                               float distance;
-                                                               if(numplayers>1)
-                                                                       for(i=1;i<numplayers;i++){
-                                                                               distance=findDistancefast(&player[i].coords,&player[0].coords);
-                                                                               if(closestdist==-1||distance<closestdist){
-                                                                                       closestdist=distance;
-                                                                                       closest=i;
-                                                                               }
-                                                                       }
+                       float maxdistance=0;
+                       float tempdist;
+                       int whichclosest;
+                       for(i=0;i<objects.numobjects;i++)
+                       {
+                               tempdist=findDistancefast(&objects.center,&objects.position[i]);
+                               if(tempdist>maxdistance)
+                               {
+                                       whichclosest=i;
+                                       maxdistance=tempdist;
+                               }
+                       }
+                       objects.radius=fast_sqrt(maxdistance);
+               }
  
-                                                                       for(j=9;j<consolechars[0];j++){
-                                                                               mapname[j-9]=consoletext[0][j];
-                                                                       }
+               if(visibleloading){loadscreencolor=4; LoadingScreen();}
+               //mapcenter=objects.center;
+               //mapradius=objects.radius;
  
-                                                                       player[closest].scale=atof(mapname)*.2;
+               funpackf(tfile, "Bi", &numplayers);
+               int howmanyremoved=0;
+               bool removeanother=0;
+               if(numplayers>1&&numplayers<maxplayers)
+               {
+                       for(i=1;i<numplayers;i++)
+                       {
+                               if(visibleloading){loadscreencolor=4; LoadingScreen();}
+                               removeanother=0;
  
-                                                                       donesomething=1;
-                                                       }
+                               funpackf(tfile, "Bi Bi Bf Bf Bf Bi",&player[i-howmanyremoved].whichskin,&player[i-howmanyremoved].creature, &player[i-howmanyremoved].coords.x,&player[i-howmanyremoved].coords.y,&player[i-howmanyremoved].coords.z,&player[i-howmanyremoved].num_weapons);
+                               if(mapvers>=5)funpackf(tfile, "Bi", &player[i-howmanyremoved].howactive);
+                               else player[i-howmanyremoved].howactive=typeactive;
+                               if(mapvers>=3)funpackf(tfile, "Bf",&player[i-howmanyremoved].scale);
+                               else player[i-howmanyremoved].scale=-1;
+                               if(mapvers>=11)funpackf(tfile, "Bb",&player[i-howmanyremoved].immobile);
+                               else player[i-howmanyremoved].immobile=0;
+                               if(mapvers>=12)funpackf(tfile, "Bf",&player[i-howmanyremoved].rotation);
+                               else player[i-howmanyremoved].rotation=0;
+                               player[i-howmanyremoved].targetrotation=player[i-howmanyremoved].rotation;
+                               if(player[i-howmanyremoved].num_weapons<0||player[i-howmanyremoved].num_weapons>5){
+                                       removeanother=1;
+                                       howmanyremoved++;
+                               }
+                               if(!removeanother)
+                               {
+                                       if(player[i-howmanyremoved].num_weapons>0&&player[i-howmanyremoved].num_weapons<5)
+                                       {
+                                               for(j=0;j<player[i-howmanyremoved].num_weapons;j++)
+                                               {
+                                                       player[i-howmanyremoved].weaponids[j]=weapons.numweapons;
+                                                       funpackf(tfile, "Bi", &weapons.type[player[i-howmanyremoved].weaponids[j]]);
+                                                       weapons.owner[player[i-howmanyremoved].weaponids[j]]=i;
+                                                       weapons.numweapons++;
+                                               }
+                                       }
+                                       funpackf(tfile, "Bi", &player[i-howmanyremoved].numwaypoints);
+                                       //player[i-howmanyremoved].numwaypoints=10;
+                                       for(j=0;j<player[i-howmanyremoved].numwaypoints;j++)
+                                       {
+                                               funpackf(tfile, "Bf", &player[i-howmanyremoved].waypoints[j].x);
+                                               funpackf(tfile, "Bf", &player[i-howmanyremoved].waypoints[j].y);
+                                               funpackf(tfile, "Bf", &player[i-howmanyremoved].waypoints[j].z);
+                                               if(mapvers>=5)funpackf(tfile, "Bi", &player[i-howmanyremoved].waypointtype[j]);
+                                               else player[i-howmanyremoved].waypointtype[j] = wpkeepwalking;
+                                       }
  
-                                                       if(Compare(consoletext[0],"proportionnear ",0,14)||Compare(consoletext[0],"Proportionnear ",0,14)){
-                                                               int startpoint;
-                                                               int alldone;
-                                                               int closest=-1;
-                                                               float closestdist=-1;
-                                                               float distance;
-                                                               if(numplayers>1)
-                                                                       for(i=1;i<numplayers;i++){
-                                                                               distance=findDistancefast(&player[i].coords,&player[0].coords);
-                                                                               if(closestdist==-1||distance<closestdist){
-                                                                                       closestdist=distance;
-                                                                                       closest=i;
-                                                                               }
-                                                                       }
+                                       funpackf(tfile, "Bi", &player[i-howmanyremoved].waypoint);
+                                       if(player[i-howmanyremoved].waypoint>player[i-howmanyremoved].numwaypoints-1)player[i-howmanyremoved].waypoint=0;
  
-                                                                       alldone=0;
-                                                                       startpoint=15;
-                                                                       j=startpoint;
-                                                                       while(consoletext[0][j]!='\0'&&consoletext[0][j]!=' '&&!alldone&&j<255){
-                                                                               mapname[j-startpoint]=consoletext[0][j];
-                                                                               j++;
-                                                                               if(consoletext[0][j]=='\0')alldone=1;
-                                                                       }
-                                                                       mapname[j-startpoint]='\0';
+                                       funpackf(tfile, "Bf Bf Bf", &player[i-howmanyremoved].armorhead, &player[i-howmanyremoved].armorhigh, &player[i-howmanyremoved].armorlow);
+                                       funpackf(tfile, "Bf Bf Bf", &player[i-howmanyremoved].protectionhead, &player[i-howmanyremoved].protectionhigh, &player[i-howmanyremoved].protectionlow);
+                                       funpackf(tfile, "Bf Bf Bf", &player[i-howmanyremoved].metalhead, &player[i-howmanyremoved].metalhigh, &player[i-howmanyremoved].metallow);
+                                       funpackf(tfile, "Bf Bf", &player[i-howmanyremoved].power, &player[i-howmanyremoved].speedmult);
  
-                                                                       headprop=atof(mapname);
+                                       if(mapvers>=4)funpackf(tfile, "Bf Bf Bf Bf", &headprop, &bodyprop, &armprop, &legprop);
+                                       else
+                                       {
+                                               headprop=1;
+                                               bodyprop=1;
+                                               armprop=1;
+                                               legprop=1;
+                                       }
+                                       if(player[i-howmanyremoved].creature==wolftype)
+                                       {
+                                               player[i-howmanyremoved].proportionhead=1.1*headprop;
+                                               player[i-howmanyremoved].proportionbody=1.1*bodyprop;
+                                               player[i-howmanyremoved].proportionarms=1.1*armprop;
+                                               player[i-howmanyremoved].proportionlegs=1.1*legprop;
+                                       }
  
-                                                                       j++;
-                                                                       startpoint=j;
-                                                                       while(consoletext[0][j]!='\0'&&consoletext[0][j]!=' '&&!alldone&&j<255){
-                                                                               mapname[j-startpoint]=consoletext[0][j];
-                                                                               j++;
-                                                                               if(consoletext[0][j]=='\0')alldone=1;
-                                                                       }
-                                                                       mapname[j-startpoint]='\0';
+                                       if(player[i-howmanyremoved].creature==rabbittype)
+                                       {
+                                               player[i-howmanyremoved].proportionhead=1.2*headprop;
+                                               player[i-howmanyremoved].proportionbody=1.05*bodyprop;
+                                               player[i-howmanyremoved].proportionarms=1.00*armprop;
+                                               player[i-howmanyremoved].proportionlegs=1.1*legprop;
+                                               player[i-howmanyremoved].proportionlegs.y=1.05*legprop;
+                                       }
  
-                                                                       bodyprop=atof(mapname);
+                                       funpackf(tfile, "Bi", &player[i-howmanyremoved].numclothes);
+                                       if(player[i-howmanyremoved].numclothes)
+                                       {
+                                               for(k=0;k<player[i-howmanyremoved].numclothes;k++)
+                                               {
+                                                       int templength;
+                                                       funpackf(tfile, "Bi", &templength);
+                                                       for(l=0;l<templength;l++)
+                                                               funpackf(tfile, "Bb", &player[i-howmanyremoved].clothes[k][l]);
+                                                       player[i-howmanyremoved].clothes[k][templength]='\0';
+                                                       funpackf(tfile, "Bf Bf Bf", &player[i-howmanyremoved].clothestintr[k], &player[i-howmanyremoved].clothestintg[k], &player[i-howmanyremoved].clothestintb[k]);
+                                               }
+                                       }
+                               }
+                       }
+               }
+               if(visibleloading){loadscreencolor=4; LoadingScreen();}
  
-                                                                       j++;
-                                                                       startpoint=j;
-                                                                       while(consoletext[0][j]!='\0'&&consoletext[0][j]!=' '&&!alldone&&j<255){
-                                                                               mapname[j-startpoint]=consoletext[0][j];
-                                                                               j++;
-                                                                               if(consoletext[0][j]=='\0')alldone=1;
-                                                                       }
-                                                                       mapname[j-startpoint]='\0';
+               numplayers-=howmanyremoved;
+               funpackf(tfile, "Bi", &numpathpoints);
+               if(numpathpoints>30||numpathpoints<0)
+                       numpathpoints=0;
+               if(numpathpoints)
+               {
+                       for(j=0;j<numpathpoints;j++)
+                       {
+                               funpackf(tfile, "Bf Bf Bf Bi", &pathpoint[j].x,&pathpoint[j].y,&pathpoint[j].z,&numpathpointconnect[j]);
+                               for(k=0;k<numpathpointconnect[j];k++){
+                                       funpackf(tfile, "Bi", &pathpointconnect[j][k]);
+                               }
+                       }
+               }
+               if(visibleloading){loadscreencolor=4; LoadingScreen();}
  
-                                                                       armprop=atof(mapname);
+               funpackf(tfile, "Bf Bf Bf Bf", &mapcenter.x,&mapcenter.y,&mapcenter.z,&mapradius);
  
-                                                                       j++;
-                                                                       startpoint=j;
-                                                                       while(consoletext[0][j]!='\0'&&consoletext[0][j]!=' '&&!alldone&&j<255){
-                                                                               mapname[j-startpoint]=consoletext[0][j];
-                                                                               j++;
-                                                                               if(consoletext[0][j]=='\0')alldone=1;
-                                                                       }
-                                                                       mapname[j-startpoint]='\0';
+               SetUpLighting();
+               if(environment!=oldenvironment)Setenvironment(environment);
+               oldenvironment=environment;
  
-                                                                       legprop=atof(mapname);
+               if(!stealthloading)
+               {
+                       j=objects.numobjects;
+                       objects.numobjects=0;
+                       for(i=0;i<j;i++)
+                       {
+                               //if(objects.type[i]!=spiketype)
+                               objects.MakeObject(objects.type[i],objects.position[i],objects.rotation[i],objects.rotation2[i],objects.scale[i]);
+                               if(visibleloading){loadscreencolor=4; LoadingScreen();}
+                       }
  
-                                                                       if(player[closest].creature==wolftype){
-                                                                               player[closest].proportionhead=1.1*headprop;
-                                                                               player[closest].proportionbody=1.1*bodyprop;
-                                                                               player[closest].proportionarms=1.1*armprop;
-                                                                               player[closest].proportionlegs=1.1*legprop;
-                                                                       }
+                       //if(skyboxtexture){
+                       terrain.DoShadows();
+                       if(visibleloading){loadscreencolor=4; LoadingScreen();}
+                       objects.DoShadows();
+                       if(visibleloading){loadscreencolor=4; LoadingScreen();}
+                       /*}
+                       else terrain.DoLighting();
+                       */
+               }
  
-                                                                       if(player[closest].creature==rabbittype){
-                                                                               player[closest].proportionhead=1.2*headprop;
-                                                                               player[closest].proportionbody=1.05*bodyprop;
-                                                                               player[closest].proportionarms=1.00*armprop;
-                                                                               player[closest].proportionlegs=1.1*legprop;
-                                                                               player[closest].proportionlegs.y=1.05*legprop;
-                                                                       }
+               fclose(tfile);
  
-                                                                       donesomething=1;
-                                                       }
+               oldlevel=whichlevel;
  
  
-                                                       if(Compare(consoletext[0],"sizemin ",0,7)||Compare(consoletext[0],"Sizemin ",0,7)){
-                                                               for(i=1;i<numplayers;i++){
-                                                                       if(player[i].scale<0.8*0.2)player[i].scale=0.8*0.2;
-                                                               }
+               if(numplayers>maxplayers-1)numplayers=maxplayers-1;
+               for(i=0;i<numplayers;i++)
+               {
+                       if(visibleloading){loadscreencolor=4; LoadingScreen();}
+                       player[i].burnt=0;
+                       player[i].bled=0;
+                       player[i].onfire=0;
+                       if(i==0||player[i].scale<0)player[i].scale=.2;
+                       player[i].skeleton.free=0;
+                       player[i].skeleton.id=i;
+                       //if(Random()%2==0)player[i].creature=wolftype;
+                       //else player[i].creature=rabbittype;
+                       if(i==0&&mapvers<9)player[i].creature=rabbittype;
+                       if(player[i].creature!=wolftype)player[i].skeleton.Load((char *)":Data:Skeleton:Basic Figure",(char *)":Data:Skeleton:Basic Figurelow",(char *)":Data:Skeleton:Rabbitbelt",(char *)":Data:Models:Body.solid",(char *)":Data:Models:Body2.solid",(char *)":Data:Models:Body3.solid",(char *)":Data:Models:Body4.solid",(char *)":Data:Models:Body5.solid",(char *)":Data:Models:Body6.solid",(char *)":Data:Models:Body7.solid",(char *)":Data:Models:Bodylow.solid",(char *)":Data:Models:Belt.solid",0);
+                       else
+                       {
+                               if(player[i].creature!=wolftype){
+                                       player[i].skeleton.Load((char *)":Data:Skeleton:Basic Figure",(char *)":Data:Skeleton:Basic Figurelow",(char *)":Data:Skeleton:Rabbitbelt",(char *)":Data:Models:Body.solid",(char *)":Data:Models:Body2.solid",(char *)":Data:Models:Body3.solid",(char *)":Data:Models:Body4.solid",(char *)":Data:Models:Body5.solid",(char *)":Data:Models:Body6.solid",(char *)":Data:Models:Body7.solid",(char *)":Data:Models:Bodylow.solid",(char *)":Data:Models:Belt.solid",1);
+                                       LoadTexture(":Data:Textures:Belt.png",&player[i].skeleton.drawmodelclothes.textureptr,1,1);
+                               }
+                               if(player[i].creature==wolftype){
+                                       player[i].skeleton.Load((char *)":Data:Skeleton:Basic Figure Wolf",(char *)":Data:Skeleton:Basic Figure Wolf Low",(char *)":Data:Skeleton:Rabbitbelt",(char *)":Data:Models:Wolf.solid",(char *)":Data:Models:Wolf2.solid",(char *)":Data:Models:Wolf3.solid",(char *)":Data:Models:Wolf4.solid",(char *)":Data:Models:Wolf5.solid",(char *)":Data:Models:Wolf6.solid",(char *)":Data:Models:Wolf7.solid",(char *)":Data:Models:Wolflow.solid",(char *)":Data:Models:Belt.solid",0);
+                               }
+                       }
  
-                                                               donesomething=1;
-                                                       }
  
-                                                       if(Compare(consoletext[0],"tutorial ",0,8)||Compare(consoletext[0],"Tutorial ",0,8)){
-                                                               for(j=9;j<consolechars[0];j++){
-                                                                       mapname[j-9]=consoletext[0][j];
-                                                               }
+                       int texsize;
+                       texsize=512*512*3/texdetail/texdetail;
+                       //if(!player[i].loaded)player[i].skeleton.skinText = new GLubyte[texsize];
+                       //player[i].skeleton.skinText.resize(texsize);
  
-                                                               tutoriallevel=atoi(mapname);
+                       LoadTextureSave(creatureskin[player[i].creature][player[i].whichskin],&player[i].skeleton.drawmodel.textureptr,1,&player[i].skeleton.skinText[0],&player[i].skeleton.skinsize);
  
-                                                               donesomething=1;
-                                                       }
+                       if(player[i].numclothes)
+                       {
+                               for(j=0;j<player[i].numclothes;j++)
+                               {
+                                       tintr=player[i].clothestintr[j];
+                                       tintg=player[i].clothestintg[j];
+                                       tintb=player[i].clothestintb[j];
+                                       AddClothes((char *)player[i].clothes[j],0,1,&player[i].skeleton.skinText[0],&player[i].skeleton.skinsize);
+                               }
+                               player[i].DoMipmaps(5,0,0,player[i].skeleton.skinsize,player[i].skeleton.skinsize);
+                       }
  
+                       player[i].currentanimation=bounceidleanim;
+                       player[i].targetanimation=bounceidleanim;
+                       player[i].currentframe=0;
+                       player[i].targetframe=1;
+                       player[i].target=0;
+                       player[i].speed=1+(float)(Random()%100)/1000;
+                       if(difficulty==0)player[i].speed-=.2;
+                       if(difficulty==1)player[i].speed-=.1;
  
-                                                       if(Compare(consoletext[0],"tintg ",0,5)||Compare(consoletext[0],"Tintg ",0,5)){
-                                                               for(j=6;j<consolechars[0];j++){
-                                                                       mapname[j-6]=consoletext[0][j];
-                                                               }
+                       player[i].velocity=0;
+                       player[i].oldcoords=player[i].coords;
+                       player[i].realoldcoords=player[i].coords;
  
-                                                               tintg=atof(mapname);
+                       player[i].id=i;
+                       player[i].skeleton.id=i;
+                       player[i].updatedelay=0;
+                       player[i].normalsupdatedelay=0;
  
-                                                               donesomething=1;
-                                                       }
+                       player[i].aitype=passivetype;
+                       player[i].aitarget=0;
+                       player[i].madskills=0;
  
-                                                       if(Compare(consoletext[0],"tintb ",0,5)||Compare(consoletext[0],"Tintb ",0,5)){
-                                                               for(j=6;j<consolechars[0];j++){
-                                                                       mapname[j-6]=consoletext[0][j];
-                                                               }
+                       if(i==0)
+                       {
+                               player[i].proportionhead=1.2;
+                               player[i].proportionbody=1.05;
+                               player[i].proportionarms=1.00;
+                               player[i].proportionlegs=1.1;
+                               player[i].proportionlegs.y=1.05;
+                       }
+                       player[i].headless=0;
+                       player[i].currentoffset=0;
+                       player[i].targetoffset=0;
+                       /*player[i].armorhead=1;
+                       player[i].armorhigh=1;
+                       player[i].armorlow=1;
+                       player[i].protectionhead=1;
+                       player[i].protectionhigh=1;
+                       player[i].protectionlow=1;
+                       player[i].metalhead=1;
+                       player[i].metalhigh=1;
+                       player[i].metallow=1;
+                       player[i].power=1;
+                       player[i].speedmult=1;*/
  
-                                                               tintb=atof(mapname);
+                       player[i].damagetolerance=200;
  
-                                                               donesomething=1;
-                                                       }
+                       if(player[i].creature==wolftype)
+                       {
+                               /*player[i].proportionhead=1.1;
+                               player[i].proportionbody=1.1;
+                               player[i].proportionarms=1.1;
+                               player[i].proportionlegs=1.1;
+                               player[i].proportionlegs.y=1.1;*/
+                               if(i==0||player[i].scale<0)player[i].scale=.23;
  
-                                                       if(Compare(consoletext[0],"hostile ",0,7)){
-                                                               for(j=8;j<consolechars[0];j++){
-                                                                       mapname[j-8]=consoletext[0][j];
-                                                               }
+                               player[i].damagetolerance=300;
+                       }
  
-                                                               hostile=atoi(mapname);
+                       if(visibleloading){loadscreencolor=4; LoadingScreen();}
+                       if(cellophane)
+                       {
+                               player[i].proportionhead.z=0;
+                               player[i].proportionbody.z=0;
+                               player[i].proportionarms.z=0;
+                               player[i].proportionlegs.z=0;
+                       }
  
-                                                               donesomething=1;
-                                                       }
+                       player[i].tempanimation.Load((char *)":Data:Animations:Tempanim",0,0);
  
+                       player[i].headmorphness=0;
+                       player[i].targetheadmorphness=1;
+                       player[i].headmorphstart=0;
+                       player[i].headmorphend=0;
  
-                                                       if(Compare(consoletext[0],"type active ",0,11)){
-                                                               editoractive=typeactive;
+                       player[i].pausetime=0;
  
-                                                               donesomething=1;
-                                                       }
+                       player[i].dead=0;
+                       player[i].jumppower=5;
+                       player[i].damage=0;
+                       player[i].permanentdamage=0;
+                       player[i].superpermanentdamage=0;
  
-                                                       if(Compare(consoletext[0],"indemo ",0,6)){
-                                                               indemo=1;
-                                                               hotspot[numhotspots]=player[0].coords;
-                                                               hotspotsize[numhotspots]=0;
-                                                               hotspottype[numhotspots]=-111;
-                                                               mapname[0]='\0';
-                                                               strcpy(hotspottext[numhotspots],"mapname");
-                                                               numhotspots++;
+                       player[i].forwardkeydown=0;
+                       player[i].leftkeydown=0;
+                       player[i].backkeydown=0;
+                       player[i].rightkeydown=0;
+                       player[i].jumpkeydown=0;
+                       player[i].crouchkeydown=0;
+                       player[i].throwkeydown=0;
  
-                                                               donesomething=1;
-                                                       }
+                       player[i].collided=-10;
+                       player[i].loaded=1;
+                       player[i].bloodloss=0;
+                       player[i].weaponactive=-1;
+                       player[i].weaponstuck=-1;
+                       player[i].bleeding=0;
+                       player[i].deathbleeding=0;
+                       player[i].stunned=0;
+                       player[i].hasvictim=0;
+                       player[i].wentforweapon=0;
+               }
  
-                                                       if(Compare(consoletext[0],"notindemo ",0,9)){
-                                                               indemo=0;
-                                                               numhotspots--;
+               player[0].aitype=playercontrolled;
+               player[0].weaponactive=-1;
  
-                                                               donesomething=1;
-                                                       }
+               if(difficulty==1)
+               {
+                       //player[0].speedmult=1/.9;
+                       player[0].power=1/.9;
+               }
  
-                                                       if(Compare(consoletext[0],"type sitting ",0,12)){
-                                                               editoractive=typesitting;
+               if(difficulty==0)
+               {
+                       //player[0].speedmult=1/.8;
+                       player[0].power=1/.8;
+               }
  
-                                                               donesomething=1;
-                                                       }
+               //player[0].weaponstuck=1;
  
-                                                       if(Compare(consoletext[0],"type sitting wall ",0,17)){
-                                                               editoractive=typesittingwall;
+               if(difficulty==1)player[0].damagetolerance=250;
+               if(difficulty==0)player[0].damagetolerance=300;
+               if(difficulty==0)player[0].armorhead*=1.5;
+               if(difficulty==0)player[0].armorhigh*=1.5;
+               if(difficulty==0)player[0].armorlow*=1.5;
+               cameraloc=player[0].coords;
+               cameraloc.y+=5;
+               rotation=player[0].rotation;
  
-                                                               donesomething=1;
-                                                       }
+               hawkcoords=player[0].coords;
+               hawkcoords.y+=30;
  
-                                                       if(Compare(consoletext[0],"type sleeping ",0,13)){
-                                                               editoractive=typesleeping;
+               if(visibleloading){loadscreencolor=4; LoadingScreen();}
+               //weapons.numweapons=numplayers;
+               for(i=0;i<weapons.numweapons;i++)
+               {
+                       weapons.bloody[i]=0;
+                       weapons.blooddrip[i]=0;
+                       weapons.blooddripdelay[i]=0;
+                       weapons.onfire[i]=0;
+                       weapons.flamedelay[i]=0;
+                       weapons.damage[i]=0;
+                       //weapons.type[i]=sword;
+                       if(weapons.type[i]==sword){
+                               weapons.mass[i]=1.5;
+                               weapons.tipmass[i]=1;
+                               weapons.length[i]=.8;
+                       }
+                       if(weapons.type[i]==staff){
+                               weapons.mass[i]=2;
+                               weapons.tipmass[i]=1;
+                               weapons.length[i]=1.5;
+                       }
+                       if(weapons.type[i]==knife){
+                               weapons.mass[i]=1;
+                               weapons.tipmass[i]=1.2;
+                               weapons.length[i]=.25;
+                       }
+                       weapons.position[i]=-1000;
+                       weapons.tippoint[i]=-1000;
+               }
  
-                                                               donesomething=1;
-                                                       }
-                                                       if(Compare(consoletext[0],"type dead1 ",0,10)){
-                                                               editoractive=typedead1;
+ /*            for(i=0;i<32;i++){
+                       //if(i<16||i>20)
+                       OPENAL_StopSound(i);
+               }
+ */
+               LOG("Starting background music...");
  
-                                                               donesomething=1;
-                                                       }
-                                                       if(Compare(consoletext[0],"type dead2 ",0,10)){
-                                                               editoractive=typedead2;
+               OPENAL_StopSound(OPENAL_ALL);
+               if(environment==snowyenvironment)
+               {
+                       if(ambientsound)
+                       {
+                               PlayStreamEx(stream_wind, strm[stream_wind], NULL, true);
+                               OPENAL_SetPaused(channels[stream_wind], false);
+                               OPENAL_SetVolume(channels[stream_wind], 256);
+                       }
+               }
+               else if(environment==desertenvironment)
+               {
+                       if(ambientsound)
+                       {
+                               //PlaySoundEx(desertambient,
+                               //      samp[desertambient], NULL, true);
+                               PlayStreamEx(stream_desertambient,
+                                       strm[stream_desertambient], NULL, true);
+                               OPENAL_SetPaused(channels[stream_desertambient], false);
+                               OPENAL_SetVolume(channels[stream_desertambient], 256);
+                       }
+               }
+               else if(environment==grassyenvironment)
+               {
+                       if(ambientsound)
+                       {
+                               //PlaySoundEx(wind, samp[wind], NULL, true);
+                               PlayStreamEx(stream_wind, strm[stream_wind], NULL, true);
+                               OPENAL_SetPaused(channels[stream_wind], false);
+                               OPENAL_SetVolume(channels[stream_wind], 100);
+                       }
+               }
+               oldmusicvolume[0]=0;
+               oldmusicvolume[1]=0;
+               oldmusicvolume[2]=0;
+               oldmusicvolume[3]=0;
  
-                                                               donesomething=1;
-                                                       }
-                                                       if(Compare(consoletext[0],"type dead3 ",0,10)){
-                                                               editoractive=typedead3;
-                                                               donesomething=1;
-                                                       }
-                                                       if(Compare(consoletext[0],"type dead4 ",0,10)){
-                                                               editoractive=typedead4;
  
-                                                               donesomething=1;
-                                                       }
+               /*LoadTexture(":Data:Textures:cloud.png",&sprites.cloudtexture,1,1);
+               LoadTexture(":Data:Textures:cloudimpact.png",&sprites.cloudimpacttexture,1,1);
+               LoadTexture(":Data:Textures:bloodparticle.png",&sprites.bloodtexture,1,1);
+               LoadTexture(":Data:Textures:snowflake.png",&sprites.snowflaketexture,1,1);
+               LoadTexture(":Data:Textures:flame.png",&sprites.flametexture,1,1);
+               LoadTexture(":Data:Textures:bloodflame.png",&sprites.bloodflametexture,1,1);
+               LoadTexture(":Data:Textures:smoke.png",&sprites.smoketexture,1,1);
+               LoadTexture(":Data:Textures:shine.png",&sprites.shinetexture,1,0);
+               */
  
-                                                       if(Compare(consoletext[0],"path keepwalking ",0,16)){
-                                                               editorpathtype=wpkeepwalking;
+               if(!firstload)
+               {
+                       firstload=1;
+               }
+       }
+       leveltime=0;
+       loadingstuff=0;
+       visibleloading=0;
+ }
  
-                                                               donesomething=1;
-                                                       }
+ void  Game::Tick()
+ {
+       static int i,k,j,l,m;
+       static XYZ facing,flatfacing,absflatfacing;
+       static XYZ rotatetarget;
+       static bool oldkey;
+       static float oldtargetrotation;
+       static int target, numgood;
+       static XYZ tempcoords1,tempcoords2;
+       static XYZ test;
+       static XYZ test2;
+       static XYZ lowpoint,lowpointtarget,lowpoint2,lowpointtarget2,lowpoint3,lowpointtarget3,lowpoint4,lowpointtarget4,lowpoint5,lowpointtarget5,lowpoint6,lowpointtarget6,lowpoint7,lowpointtarget7,colpoint,colpoint2;
+       static int whichhit;
+       static bool oldjumpkeydown;
  
-                                                       if(Compare(consoletext[0],"path pause ",0,10)){
-                                                               editorpathtype=wppause;
+       int templength;
  
-                                                               donesomething=1;
-                                                       }
+       float headprop,bodyprop,armprop,legprop;
  
-                                                       if(Compare(consoletext[0],"mapkilleveryone ",0,15)){
-                                                               maptype=mapkilleveryone;
+       for(i=0;i<15;i++){
+               displaytime[i]+=multiplier;
+       }
  
-                                                               donesomething=1;
-                                                       }
+       static unsigned char    theKeyMap[16];
+       GetKeys( theKeyMap );
  
-                                                       if(Compare(consoletext[0],"mapgosomewhere ",0,14)){
-                                                               maptype=mapgosomewhere;
+       keyboardfrozen=0;
  
-                                                               donesomething=1;
-                                                       }
  
-                                                       if(Compare(consoletext[0],"mapkillsomeone ",0,14)){
-                                                               maptype=mapkillsomeone;
+       static bool mainmenutogglekeydown;
 +
-                                                               donesomething=1;
++      if (IsKeyDown(theKeyMap, MAC_F6_KEY) && !freezetogglekeydown) {
++              if (IsKeyDown(theKeyMap, MAC_SHIFT_KEY)) {
++                      stereoreverse=true;
++              } else {
++                      stereoreverse=false;
++              }
 +
-                                                       }
++              if (stereoreverse) {
++                      printf("Stereo reversed\n");
++              } else {
++                      printf("Stereo unreversed\n");
++              }
++              freezetogglekeydown=1;
++      }
 +
-                                                       if(Compare(consoletext[0],"mapkillmost ",0,11)){
-                                                               maptype=mapkillmost;
++      if (IsKeyDown(theKeyMap, MAC_F7_KEY)) {
++              if (IsKeyDown(theKeyMap, MAC_SHIFT_KEY)) {
++                      stereoseparation -= 0.001;
++              } else {
++                      stereoseparation -= 0.010;
++              }
 +
-                                                               donesomething=1;
++              printf("Stereo decreased increased to %f\n", stereoseparation);
++      }
 +
-                                                       }
++      if (IsKeyDown(theKeyMap, MAC_F8_KEY)) {
++              if (IsKeyDown(theKeyMap, MAC_SHIFT_KEY)) {
++                      stereoseparation += 0.001;
++              } else {
++                      stereoseparation += 0.010;
++              }
 +
-                                                       if(Compare(consoletext[0],"hs ",0,2)){
-                                                               int startpoint;
-                                                               int alldone;
++              printf("Stereo separation increased to %f\n", stereoseparation);
++      }
 +
-                                                               hotspot[numhotspots]=player[0].coords;
 +
-                                                               alldone=0;
-                                                               startpoint=3;
-                                                               j=startpoint;
-                                                               while(consoletext[0][j]!='\0'&&consoletext[0][j]!=' '&&!alldone&&j<255){
-                                                                       mapname[j-startpoint]=consoletext[0][j];
-                                                                       j++;
-                                                                       if(consoletext[0][j]=='\0')alldone=1;
-                                                               }
-                                                               mapname[j-startpoint]='\0';
+       if(!console){
+               if(mainmenu&&endgame==1)mainmenu=10;
+               if(IsKeyDown(theKeyMap, MAC_ESCAPE_KEY)&&!mainmenutogglekeydown&&(mainmenu==7&&entername)){
+                       for(j=0;j<255;j++){
+                               displaytext[0][j]=' ';
+                       }
+                       displaychars[0]=0;
+                       displayselected=0;
+                       entername=0;
+                       mainmenutogglekeydown=1;
+               }
+               if((IsKeyDown(theKeyMap, MAC_ESCAPE_KEY)||(mainmenu==0&&((IsKeyDown(theKeyMap, jumpkey)||IsKeyDown(theKeyMap, MAC_SPACE_KEY)||(campaign)))&&!oldjumpkeydown&&campaign&&winfreeze))&&!mainmenutogglekeydown&&(!mainmenu||gameon||mainmenu==3||mainmenu==4||mainmenu==5||mainmenu==6||(mainmenu==7&&!entername)||mainmenu==9||mainmenu==11||mainmenu==13||mainmenu==17||mainmenu==10)){
+                       selected=-1;
+                       if(mainmenu==1||mainmenu==2||mainmenu==0){
+                               if(mainmenu==0&&!winfreeze)mainmenu=2;
+                               else if(mainmenu==0&&winfreeze&&(campaignchoosenext[campaignchoicewhich[whichchoice]])==1)mainmenu=100;
+                               else if(mainmenu==0&&winfreeze){
+                                       /*      if(campaignchoosenext[campaignchoicewhich[whichchoice]]==2)
+                                       stealthloading=1;
+                                       else stealthloading=0;
  
-                                                               hotspotsize[numhotspots]=atof(mapname);
+                                       if(!stealthloading){
+                                       float gLoc[3]={0,0,0};
+                                       float vel[3]={0,0,0};
+                                       OPENAL_Sample_SetMinMaxDistance(samp[firestartsound], 9999.0f, 99999.0f);
+                                       PlaySoundEx( firestartsound, samp[firestartsound], NULL, true);
+                                       OPENAL_3D_SetAttributes(channels[firestartsound], gLoc, vel);
+                                       OPENAL_SetVolume(channels[firestartsound], 256);
+                                       OPENAL_SetPaused(channels[firestartsound], false);
+                                       OPENAL_Sample_SetMinMaxDistance(samp[firestartsound], 8.0f, 2000.0f);
  
-                                                               j++;
-                                                               startpoint=j;
-                                                               while(consoletext[0][j]!='\0'&&consoletext[0][j]!=' '&&!alldone&&j<255){
-                                                                       mapname[j-startpoint]=consoletext[0][j];
-                                                                       j++;
-                                                                       if(consoletext[0][j]=='\0')alldone=1;
-                                                               }
-                                                               mapname[j-startpoint]='\0';
+                                       flashr=1;
+                                       flashg=0;
+                                       flashb=0;
+                                       flashamount=1;
+                                       flashdelay=1;
+                                       }
  
-                                                               hotspottype[numhotspots]=atoi(mapname);
+                                       startbonustotal=0;
  
-                                                               j++;
-                                                               startpoint=j;
-                                                               while(consoletext[0][j]!='\0'&&!alldone&&j<255){
-                                                                       mapname[j-startpoint]=consoletext[0][j];
-                                                                       j++;
-                                                                       if(consoletext[0][j]=='\0')alldone=1;
-                                                               }
-                                                               mapname[j-startpoint]='\n';
-                                                               mapname[j-startpoint+1]='\0';
+                                       for(i=0;i<campaignnumlevels;i++){
+                                       levelvisible[i]=0;
+                                       levelhighlight[i]=0;
+                                       }
  
-                                                               strcpy(hotspottext[numhotspots],mapname);
+                                       levelorder[0]=0;
+                                       levelvisible[0]=1;
+                                       if(accountcampaignchoicesmade[accountactive])
+                                       for(i=0;i<accountcampaignchoicesmade[accountactive];i++){
+                                       levelorder[i+1]=campaignnextlevel[levelorder[i]][accountcampaignchoices[accountactive][i]];
+                                       levelvisible[levelorder[i+1]]=1;
+                                       }
+                                       int whichlevelstart;
+                                       whichlevelstart=accountcampaignchoicesmade[accountactive]-1;
+                                       if(whichlevelstart<0){
+                                       campaignchoicenum=1;
+                                       campaignchoicewhich[0]=0;
+                                       }
+                                       else
+                                       {
+                                       campaignchoicenum=campaignnumnext[levelorder[whichlevelstart]];
+                                       if(campaignchoicenum)
+                                       for(i=0;i<campaignchoicenum;i++){
+                                       campaignchoicewhich[i]=campaignnextlevel[levelorder[whichlevelstart]][i];
+                                       levelvisible[campaignnextlevel[levelorder[whichlevelstart]][i]]=1;
+                                       levelhighlight[campaignnextlevel[levelorder[whichlevelstart]][i]]=1;
+                                       }
+                                       }
  
-                                                               numhotspots++;
+                                       loading=2;
+                                       loadtime=0;
+                                       targetlevel=7;
+                                       if(firstload)TickOnceAfter();
+                                       if(!firstload)LoadStuff();
+                                       //else {
+                                       for(i=0;i<255;i++){
+                                       mapname[i]='\0';
+                                       }
+                                       mapname[0]=':';
+                                       mapname[1]='D';
+                                       mapname[2]='a';
+                                       mapname[3]='t';
+                                       mapname[4]='a';
+                                       mapname[5]=':';
+                                       mapname[6]='M';
+                                       mapname[7]='a';
+                                       mapname[8]='p';
+                                       mapname[9]='s';
+                                       mapname[10]=':';
  
-                                                               donesomething=1;
-                                                       }
+                                       //accountcampaignchoices[accountactive][accountcampaignchoicesmade[accountactive]]=whichchoice;
+                                       //accountcampaignchoicesmade[accountactive]++;
  
-                                                       if(Compare(consoletext[0],"dialogue ",0,8)){
-                                                               int startpoint;
-                                                               int alldone;
-                                                               alldone=0;
-                                                               startpoint=9;
-                                                               j=startpoint;
-                                                               while(consoletext[0][j]!='\0'&&consoletext[0][j]!=' '&&!alldone&&j<255){
-                                                                       mapname[j-startpoint]=consoletext[0][j];
-                                                                       j++;
-                                                                       if(consoletext[0][j]=='\0')alldone=1;
-                                                               }
-                                                               mapname[j-startpoint]='\0';
-                                                               startpoint=j+1;
-                                                               dialoguetype[numdialogues]=atoi(mapname);
-                                                               mapname[0]=':';
-                                                               mapname[1]='D';
-                                                               mapname[2]='a';
-                                                               mapname[3]='t';
-                                                               mapname[4]='a';
-                                                               mapname[5]=':';
-                                                               mapname[6]='D';
-                                                               mapname[7]='i';
-                                                               mapname[8]='a';
-                                                               mapname[9]='l';
-                                                               mapname[10]='o';
-                                                               mapname[11]='g';
-                                                               mapname[12]='u';
-                                                               mapname[13]='e';
-                                                               mapname[14]='s';
-                                                               mapname[15]=':';
-                                                               for(j=startpoint;j<consolechars[0];j++){
-                                                                       mapname[j-startpoint+16]=consoletext[0][j];
-                                                               }
-                                                               mapname[consolechars[0]-startpoint+16]='.';
-                                                               mapname[consolechars[0]-startpoint+17]='t';
-                                                               mapname[consolechars[0]-startpoint+18]='x';
-                                                               mapname[consolechars[0]-startpoint+19]='t';
-                                                               mapname[consolechars[0]-startpoint+20]='\0';
-                                                               for(j=0;j<max_dialoguelength;j++){
-                                                                       for(k=0;k<128;k++){
-                                                                               dialoguetext[numdialogues][j][k]='\0';
-                                                                       }
-                                                                       for(k=0;k<64;k++){
-                                                                               dialoguename[numdialogues][j][k]='\0';
-                                                                       }
-                                                               }
  
-                                                               ifstream ipstream(ConvertFileName(mapname));
-                                                               ipstream.ignore(256,':');
-                                                               ipstream >> numdialogueboxes[numdialogues];
-                                                               for(i=0;i<numdialogueboxes[numdialogues];i++){
-                                                                       ipstream.ignore(256,':');
-                                                                       ipstream.ignore(256,':');
-                                                                       ipstream.ignore(256,' ');
-                                                                       ipstream >> dialogueboxlocation[numdialogues][i];
-                                                                       ipstream.ignore(256,':');
-                                                                       ipstream >> dialogueboxcolor[numdialogues][i][0];
-                                                                       ipstream >> dialogueboxcolor[numdialogues][i][1];
-                                                                       ipstream >> dialogueboxcolor[numdialogues][i][2];
-                                                                       ipstream.ignore(256,':');
-                                                                       ipstream.getline(dialoguename[numdialogues][i],64);
-                                                                       ipstream.ignore(256,':');
-                                                                       ipstream.ignore(256,' ');
-                                                                       ipstream.getline(dialoguetext[numdialogues][i],128);
-                                                                       for(j=0;j<128;j++){
-                                                                               if(dialoguetext[numdialogues][i][j]=='\\')dialoguetext[numdialogues][i][j]='\n';
-                                                                       }
-                                                                       ipstream.ignore(256,':');
-                                                                       ipstream >> dialogueboxsound[numdialogues][i];
-                                                               }
+                                       strcat(mapname,campaignmapname[campaignchoicewhich[0]]);
+                                       whichchoice=0;
+                                       visibleloading=1;
+                                       stillloading=1;
+                                       Loadlevel(mapname);
+                                       campaign=1;
+                                       mainmenu=0;
+                                       gameon=1;
+                                       OPENAL_SetPaused(channels[music3], true);
  
-                                                               for(i=0;i<numdialogueboxes[numdialogues];i++){
-                                                                       for(j=0;j<numplayers;j++){
-                                                                               participantfacing[numdialogues][i][j]=player[j].facing;
-                                                                       }
-                                                               }
-                                                               ipstream.close();
+                                       stealthloading=0;*/
+                               }
+                               else if(mainmenu==1||mainmenu==2)mainmenu=0;
+                               if(mainmenu&&musictoggle){
+                                       if(mainmenu==1||mainmenu==2||mainmenu==100){
+                                               OPENAL_SetFrequency(OPENAL_ALL, 0.001);
+                                               PlayStreamEx( stream_music3, strm[stream_music3], NULL, true);
+                                               OPENAL_SetPaused(channels[stream_music3], false);
+                                               OPENAL_SetVolume(channels[stream_music3], 256);
+                                               OPENAL_SetPaused(channels[music1], true);
+                                       }
+                               }
+                               if(!mainmenu){
+                                       OPENAL_SetPaused(channels[stream_music3], true);
+                                       OPENAL_SetPaused(channels[music1], false);
+                               }
+                       }
+                       if(mainmenu==3){
+                               float gLoc[3]={0,0,0};
+                               float vel[3]={0,0,0};
+                               OPENAL_Sample_SetMinMaxDistance(samp[fireendsound], 9999.0f, 99999.0f);
+                               PlaySoundEx( fireendsound, samp[fireendsound], NULL, true);
+                               OPENAL_3D_SetAttributes(channels[fireendsound], gLoc, vel);
+                               OPENAL_SetVolume(channels[fireendsound], 256);
+                               OPENAL_SetPaused(channels[fireendsound], false);
+                               OPENAL_Sample_SetMinMaxDistance(samp[fireendsound], 8.0f, 2000.0f);
  
-                                                               directing=1;
-                                                               indialogue=0;
-                                                               whichdialogue=numdialogues;
+                               flashr=1;
+                               flashg=0;
+                               flashb=0;
+                               flashamount=1;
+                               flashdelay=1;
  
+                               if(newdetail>2)newdetail=detail;
+                               if(newdetail<0)newdetail=detail;
+                               if(newscreenwidth<0)newscreenwidth=screenwidth;
+                               if(newscreenheight<0)newscreenheight=screenheight;
  
-                                                               numdialogues++;
+                               ofstream opstream(ConvertFileName(":Data:config.txt", "w"));
+                               opstream << "Screenwidth:\n";
+                               opstream << newscreenwidth;
+                               opstream << "\nScreenheight:\n";
+                               opstream << newscreenheight;
+                               opstream << "\nMouse sensitivity:\n";
+                               opstream << usermousesensitivity;
+                               opstream << "\nBlur(0,1):\n";
+                               opstream << ismotionblur;
+                               opstream << "\nOverall Detail(0,1,2) higher=better:\n";
+                               opstream << newdetail;
+                               opstream << "\nFloating jump:\n";
+                               opstream << floatjump;
+                               opstream << "\nMouse jump:\n";
+                               opstream << mousejump;
+                               opstream << "\nAmbient sound:\n";
+                               opstream << ambientsound;
+                               opstream << "\nBlood (0,1,2):\n";
+                               opstream << bloodtoggle;
+                               opstream << "\nAuto slomo:\n";
+                               opstream << autoslomo;
+                               opstream << "\nFoliage:\n";
+                               opstream << foliage;
+                               opstream << "\nMusic:\n";
+                               opstream << musictoggle;
+                               opstream << "\nTrilinear:\n";
+                               opstream << trilinear;
+                               opstream << "\nDecals(shadows,blood puddles,etc):\n";
+                               opstream << decals;
+                               opstream << "\nInvert mouse:\n";
+                               opstream << invertmouse;
+                               opstream << "\nGamespeed:\n";
+                               if(oldgamespeed==0)oldgamespeed=1;
+                               opstream << oldgamespeed;
+                               opstream << "\nDifficulty(0,1,2) higher=harder:\n";
+                               opstream << difficulty;
+                               opstream << "\nDamage effects(blackout, doublevision):\n";
+                               opstream << damageeffects;
+                               opstream << "\nText:\n";
+                               opstream << texttoggle;
+                               opstream << "\nDebug:\n";
+                               opstream << debugmode;
+                               opstream << "\nVBL Sync:\n";
+                               opstream << vblsync;
+                               opstream << "\nShow Points:\n";
+                               opstream << showpoints;
+                               opstream << "\nAlways Blur:\n";
+                               opstream << alwaysblur;
+                               opstream << "\nImmediate mode (turn on on G5):\n";
+                               opstream << immediate;
+                               opstream << "\nVelocity blur:\n";
+                               opstream << velocityblur;
+                           opstream << "\nVolume:\n";
+                       opstream << volume;
+                               opstream << "\nForward key:\n";
+                               opstream << KeyToChar(forwardkey);
+                               opstream << "\nBack key:\n";
+                               opstream << KeyToChar(backkey);
+                               opstream << "\nLeft key:\n";
+                               opstream << KeyToChar(leftkey);
+                               opstream << "\nRight key:\n";
+                               opstream << KeyToChar(rightkey);
+                               opstream << "\nJump key:\n";
+                               opstream << KeyToChar(jumpkey);
+                               opstream << "\nCrouch key:\n";
+                               opstream << KeyToChar(crouchkey);
+                               opstream << "\nDraw key:\n";
+                               opstream << KeyToChar(drawkey);
+                               opstream << "\nThrow key:\n";
+                               opstream << KeyToChar(throwkey);
+                               opstream << "\nAttack key:\n";
+                               opstream << KeyToChar(attackkey);
+                               opstream << "\nChat key:\n";
+                               opstream << KeyToChar(chatkey);
+                               opstream.close();
+                       }
+                       if(mainmenu==4||mainmenu==5||mainmenu==6||mainmenu==7||mainmenu==9||mainmenu==13||mainmenu==10||mainmenu==11||mainmenu==100){
+                               float gLoc[3]={0,0,0};
+                               float vel[3]={0,0,0};
+                               OPENAL_Sample_SetMinMaxDistance(samp[fireendsound], 9999.0f, 99999.0f);
+                               PlaySoundEx( fireendsound, samp[fireendsound], NULL, true);
+                               OPENAL_3D_SetAttributes(channels[fireendsound], gLoc, vel);
+                               OPENAL_SetVolume(channels[fireendsound], 256);
+                               OPENAL_SetPaused(channels[fireendsound], false);
+                               OPENAL_Sample_SetMinMaxDistance(samp[fireendsound], 8.0f, 2000.0f);
  
-                                                               donesomething=1;
-                                                       }
+                               flashr=1;
+                               flashg=0;
+                               flashb=0;
+                               flashamount=1;
+                               flashdelay=1;
+                       }
+                       if(mainmenu==3&&gameon)mainmenu=2;
+                       if(mainmenu==3&&!gameon)mainmenu=1;
+                       if(mainmenu==5&&gameon)mainmenu=2;
+                       if(mainmenu==5&&!gameon)mainmenu=1;
+                       if(mainmenu==4)mainmenu=3;
+                       if(mainmenu==6)mainmenu=5;
+                       if(mainmenu==7)mainmenu=1;
+                       if(mainmenu==9)mainmenu=5;
+                       if(mainmenu==11)mainmenu=5;
+                       if(mainmenu==13)mainmenu=12;
+                       if(mainmenu==10)mainmenu=5;
+                       if(mainmenu==100){
+                               mainmenu=5;
+                               gameon=0;
+                               winfreeze=0;
+                       }
+                       mainmenutogglekeydown=1;
+               }
+               if(!IsKeyDown(theKeyMap, MAC_ESCAPE_KEY)){
+                       mainmenutogglekeydown=0;
+               }
+       }
  
-                                                       if(Compare(consoletext[0],"fixdialogue ",0,11)){
-                                                               int startpoint;
-                                                               int alldone;
-                                                               int whichdi;
-                                                               alldone=0;
-                                                               startpoint=12;
-                                                               j=startpoint;
-                                                               while(consoletext[0][j]!='\0'&&consoletext[0][j]!=' '&&!alldone&&j<255){
-                                                                       mapname[j-startpoint]=consoletext[0][j];
-                                                                       j++;
-                                                                       if(consoletext[0][j]=='\0')alldone=1;
-                                                               }
-                                                               mapname[j-startpoint]='\0';
-                                                               startpoint=j+1;
-                                                               whichdi=atoi(mapname);
-                                                               mapname[0]=':';
-                                                               mapname[1]='D';
-                                                               mapname[2]='a';
-                                                               mapname[3]='t';
-                                                               mapname[4]='a';
-                                                               mapname[5]=':';
-                                                               mapname[6]='D';
-                                                               mapname[7]='i';
-                                                               mapname[8]='a';
-                                                               mapname[9]='l';
-                                                               mapname[10]='o';
-                                                               mapname[11]='g';
-                                                               mapname[12]='u';
-                                                               mapname[13]='e';
-                                                               mapname[14]='s';
-                                                               mapname[15]=':';
-                                                               for(j=startpoint;j<consolechars[0];j++){
-                                                                       mapname[j-startpoint+16]=consoletext[0][j];
-                                                               }
-                                                               mapname[consolechars[0]-startpoint+16]='.';
-                                                               mapname[consolechars[0]-startpoint+17]='t';
-                                                               mapname[consolechars[0]-startpoint+18]='x';
-                                                               mapname[consolechars[0]-startpoint+19]='t';
-                                                               mapname[consolechars[0]-startpoint+20]='\0';
-                                                               for(j=0;j<max_dialoguelength;j++){
-                                                                       for(k=0;k<128;k++){
-                                                                               dialoguetext[whichdi][j][k]='\0';
-                                                                       }
-                                                                       for(k=0;k<64;k++){
-                                                                               dialoguename[whichdi][j][k]='\0';
-                                                                       }
-                                                               }
+       /*static bool minimaptogglekeydown;
+       if(IsKeyDown(theKeyMap, MAC_TAB_KEY)&&!minimaptogglekeydown){
+       minimap=1-minimap;
+       minimaptogglekeydown=1;
+       }
+       if(!IsKeyDown(theKeyMap, MAC_TAB_KEY)){
+       minimaptogglekeydown=0;
+       }
+       */
  
-                                                               ifstream ipstream(ConvertFileName(mapname));
-                                                               ipstream.ignore(256,':');
-                                                               ipstream >> numdialogueboxes[whichdi];
-                                                               for(i=0;i<numdialogueboxes[whichdi];i++){
-                                                                       ipstream.ignore(256,':');
-                                                                       ipstream.ignore(256,':');
-                                                                       ipstream.ignore(256,' ');
-                                                                       ipstream >> dialogueboxlocation[whichdi][i];
-                                                                       ipstream.ignore(256,':');
-                                                                       ipstream >> dialogueboxcolor[whichdi][i][0];
-                                                                       ipstream >> dialogueboxcolor[whichdi][i][1];
-                                                                       ipstream >> dialogueboxcolor[whichdi][i][2];
-                                                                       ipstream.ignore(256,':');
-                                                                       ipstream.getline(dialoguename[whichdi][i],64);
-                                                                       ipstream.ignore(256,':');
-                                                                       ipstream.ignore(256,' ');
-                                                                       ipstream.getline(dialoguetext[whichdi][i],128);
-                                                                       for(j=0;j<128;j++){
-                                                                               if(dialoguetext[whichdi][i][j]=='\\')dialoguetext[whichdi][i][j]='\n';
-                                                                       }
-                                                                       ipstream.ignore(256,':');
-                                                                       ipstream >> dialogueboxsound[whichdi][i];
-                                                               }
+       static bool minimaptogglekeydown;
+       if(IsKeyDown(theKeyMap, MAC_TAB_KEY)&&!minimaptogglekeydown&&tutoriallevel){
+               if(tutorialstage!=51)
+                       tutorialstagetime=tutorialmaxtime;
+               PlaySoundEx( consolefailsound, samp[consolefailsound], NULL, true);
+               OPENAL_SetVolume(channels[consolefailsound], 128);
+               OPENAL_SetPaused(channels[consolefailsound], false);
+               minimaptogglekeydown=1;
+       }
+       if(!IsKeyDown(theKeyMap, MAC_TAB_KEY)){
+               minimaptogglekeydown=0;
+       }
  
-                                                               ipstream.close();
+       if(mainmenu){
+               //menu buttons
+               if(mainmenu==1||mainmenu==2){
+                       if(Button()&&!oldbutton&&selected==1){
+                               if(!gameon){
+                                       float gLoc[3]={0,0,0};
+                                       float vel[3]={0,0,0};
+                                       OPENAL_Sample_SetMinMaxDistance(samp[firestartsound], 9999.0f, 99999.0f);
+                                       PlaySoundEx( firestartsound, samp[firestartsound], NULL, true);
+                                       OPENAL_3D_SetAttributes(channels[firestartsound], gLoc, vel);
+                                       OPENAL_SetVolume(channels[firestartsound], 256);
+                                       OPENAL_SetPaused(channels[firestartsound], false);
+                                       OPENAL_Sample_SetMinMaxDistance(samp[firestartsound], 8.0f, 2000.0f);
  
-                                                               donesomething=1;
-                                                       }
+                                       flashr=1;
+                                       flashg=0;
+                                       flashb=0;
+                                       flashamount=1;
+                                       flashdelay=1;
  
-                                                       if(Compare(consoletext[0],"fixtype ",0,7)){
-                                                               int startpoint;
-                                                               int alldone;
-                                                               int whichdi;
-                                                               alldone=0;
-                                                               startpoint=8;
-                                                               j=startpoint;
-                                                               while(consoletext[0][j]!='\0'&&consoletext[0][j]!=' '&&!alldone&&j<255){
-                                                                       mapname[j-startpoint]=consoletext[0][j];
-                                                                       j++;
-                                                                       if(consoletext[0][j]=='\0')alldone=1;
-                                                               }
-                                                               mapname[j-startpoint]='\0';
-                                                               dialoguetype[0]=atoi(mapname);
+                                       //new game
+                                       if(accountactive!=-1)mainmenu=5;
+                                       else mainmenu=7;
+                                       /*
+                                       startbonustotal=0;
  
-                                                               startpoint=j+1;
+                                       loading=2;
+                                       loadtime=0;
+                                       if(firstload)TickOnceAfter();
+                                       if(!firstload)LoadStuff();
+                                       else {
+                                       Loadlevel(0);
+                                       }
+                                       mainmenu=0;
+                                       gameon=1;
+                                       OPENAL_SetPaused(channels[music3], true);       */
+                               }
+                               else
+                               {
+                                       //resume
+                                       mainmenu=0;
+                                       OPENAL_SetPaused(channels[stream_music3], true);
+                                       OPENAL_SetPaused(channels[music1], false);
+                               }
+                       }
  
-                                                               donesomething=1;
-                                                       }
+                       if(Button()&&!oldbutton&&selected==2){
+                               float gLoc[3]={0,0,0};
+                               float vel[3]={0,0,0};
+                               OPENAL_Sample_SetMinMaxDistance(samp[firestartsound], 9999.0f, 99999.0f);
+                               PlaySoundEx( firestartsound, samp[firestartsound], NULL, true);
+                               OPENAL_3D_SetAttributes(channels[firestartsound], gLoc, vel);
+                               OPENAL_SetVolume(channels[firestartsound], 256);
+                               OPENAL_SetPaused(channels[firestartsound], false);
+                               OPENAL_Sample_SetMinMaxDistance(samp[firestartsound], 8.0f, 2000.0f);
  
+                               flashr=1;
+                               flashg=0;
+                               flashb=0;
+                               flashamount=1;
+                               flashdelay=1;
  
-                                                       if(Compare(consoletext[0],"fixrotation ",0,11)){
-                                                               participantrotation[whichdialogue][participantfocus[whichdialogue][indialogue]]=player[participantfocus[whichdialogue][indialogue]].rotation;
+                               //options
  
-                                                               donesomething=1;
-                                                       }
+                               mainmenu=3;
  
-                                                       if(Compare(consoletext[0],"ddialogue ",0,9)){
-                                                               numdialogues--;
-                                                               if(numdialogues<0)numdialogues=0;
+                               if(newdetail>2)newdetail=detail;
+                               if(newdetail<0)newdetail=detail;
+                               if(newscreenwidth>3000)newscreenwidth=screenwidth;
+                               if(newscreenwidth<0)newscreenwidth=screenwidth;
+                               if(newscreenheight>3000)newscreenheight=screenheight;
+                               if(newscreenheight<0)newscreenheight=screenheight;
+                       }
  
-                                                               donesomething=1;
-                                                       }
+                       if(Button()&&!oldbutton&&selected==3){
+                               float gLoc[3]={0,0,0};
+                               float vel[3]={0,0,0};
+                               OPENAL_Sample_SetMinMaxDistance(samp[fireendsound], 9999.0f, 99999.0f);
+                               PlaySoundEx( fireendsound, samp[fireendsound], NULL, true);
+                               OPENAL_3D_SetAttributes(channels[fireendsound], gLoc, vel);
+                               OPENAL_SetVolume(channels[fireendsound], 256);
+                               OPENAL_SetPaused(channels[fireendsound], false);
+                               OPENAL_Sample_SetMinMaxDistance(samp[fireendsound], 8.0f, 2000.0f);
  
-                                                       if(Compare(consoletext[0],"immobile ",0,8)){
-                                                               player[0].immobile=1;
-                                                               donesomething=1;
-                                                       }
+                               flashr=1;
+                               flashg=0;
+                               flashb=0;
+                               flashamount=1;
+                               flashdelay=1;
  
-                                                       if(Compare(consoletext[0],"mobile ",0,6)){
-                                                               player[0].immobile=0;
-                                                               donesomething=1;
-                                                       }
+                               if(!gameon){
+                                       //quit
+                                       tryquit=1;
+                                       OPENAL_SetPaused(channels[stream_music3], true);
+                               }
+                               else{
+                                       //end game
+                                       gameon=0;
+                                       mainmenu=1;
+                               }
+                       }
+                       if(Button())oldbutton=1;
+                       else oldbutton=0;
+               }
  
-                                                       if(Compare(consoletext[0],"play ",0,4)){
-                                                               int startpoint;
-                                                               int alldone;
-                                                               alldone=0;
-                                                               startpoint=5;
-                                                               j=startpoint;
-                                                               while(consoletext[0][j]!='\0'&&consoletext[0][j]!=' '&&!alldone&&j<255){
-                                                                       mapname[j-startpoint]=consoletext[0][j];
-                                                                       j++;
-                                                                       if(consoletext[0][j]=='\0')alldone=1;
-                                                               }
-                                                               mapname[j-startpoint]='\0';
-                                                               startpoint=j+1;
-                                                               whichdialogue=atoi(mapname);
-                                                               if(numdialogues>whichdialogue){
-                                                                       for(i=0;i<numdialogueboxes[whichdialogue];i++){
-                                                                               player[participantfocus[whichdialogue][i]].coords=participantlocation[whichdialogue][participantfocus[whichdialogue][i]];
-                                                                               player[participantfocus[whichdialogue][i]].rotation=participantrotation[whichdialogue][participantfocus[whichdialogue][i]];
-                                                                               player[participantfocus[whichdialogue][i]].targetrotation=participantrotation[whichdialogue][participantfocus[whichdialogue][i]];
-                                                                               player[participantfocus[whichdialogue][i]].velocity=0;
-                                                                               player[participantfocus[whichdialogue][i]].targetanimation=player[participantfocus[whichdialogue][i]].getIdle();
-                                                                               player[participantfocus[whichdialogue][i]].targetframe=0;
-                                                                       }
+               if(mainmenu==3){
+                       if(Button()&&!oldbutton&&selected!=-1){
+                               float gLoc[3]={0,0,0};
+                               float vel[3]={0,0,0};
+                               OPENAL_Sample_SetMinMaxDistance(samp[firestartsound], 9999.0f, 99999.0f);
+                               PlaySoundEx( firestartsound, samp[firestartsound], NULL, true);
+                               OPENAL_3D_SetAttributes(channels[firestartsound], gLoc, vel);
+                               OPENAL_SetVolume(channels[firestartsound], 256);
+                               OPENAL_SetPaused(channels[firestartsound], false);
+                               OPENAL_Sample_SetMinMaxDistance(samp[firestartsound], 8.0f, 2000.0f);
+                       }
+                       if(Button()&&!oldbutton&&selected==0){
+                       
+                               extern SDL_Rect **resolutions;
+                               bool isCustomResolution = true;
+                               bool found = false;
+                               for (int i = 0; (!found) && (resolutions[i]); i++)
+                               {
+                                       if ((resolutions[i]->w == screenwidth) && (resolutions[i]->h == screenwidth))
+                                               isCustomResolution = false;
  
-                                                                       directing=0;
-                                                                       indialogue=0;
-                                                                       donesomething=1;
-                                                                       //if(dialogueboxsound[whichdialogue][indialogue]!=0){
-                                                                       float gLoc[3];
-                                                                       float vel[3];
-                                                                       XYZ temppos;
-                                                                       temppos=player[participantfocus[whichdialogue][indialogue]].coords;
-                                                                       temppos=temppos-viewer;
-                                                                       Normalise(&temppos);
-                                                                       temppos+=viewer;
-                                                                       gLoc[0]=temppos.x;
-                                                                       gLoc[1]=temppos.y;
-                                                                       gLoc[2]=temppos.z;
-                                                                       vel[0]=0;
-                                                                       vel[1]=0;
-                                                                       vel[2]=0;
-                                                                       int whichsoundplay;
-                                                                       whichsoundplay=rabbitchitter;
-                                                                       if(dialogueboxsound[whichdialogue][indialogue]==2)whichsoundplay=rabbitchitter2;
-                                                                       if(dialogueboxsound[whichdialogue][indialogue]==3)whichsoundplay=rabbitpainsound;
-                                                                       if(dialogueboxsound[whichdialogue][indialogue]==4)whichsoundplay=rabbitpain1sound;
-                                                                       if(dialogueboxsound[whichdialogue][indialogue]==5)whichsoundplay=rabbitattacksound;
-                                                                       if(dialogueboxsound[whichdialogue][indialogue]==6)whichsoundplay=rabbitattack2sound;
-                                                                       if(dialogueboxsound[whichdialogue][indialogue]==7)whichsoundplay=rabbitattack3sound;
-                                                                       if(dialogueboxsound[whichdialogue][indialogue]==8)whichsoundplay=rabbitattack4sound;
-                                                                       if(dialogueboxsound[whichdialogue][indialogue]==9)whichsoundplay=growlsound;
-                                                                       if(dialogueboxsound[whichdialogue][indialogue]==10)whichsoundplay=growl2sound;
-                                                                       if(dialogueboxsound[whichdialogue][indialogue]==11)whichsoundplay=snarlsound;
-                                                                       if(dialogueboxsound[whichdialogue][indialogue]==12)whichsoundplay=snarl2sound;
-                                                                       if(dialogueboxsound[whichdialogue][indialogue]==13)whichsoundplay=barksound;
-                                                                       if(dialogueboxsound[whichdialogue][indialogue]==14)whichsoundplay=bark2sound;
-                                                                       if(dialogueboxsound[whichdialogue][indialogue]==15)whichsoundplay=bark3sound;
-                                                                       if(dialogueboxsound[whichdialogue][indialogue]==16)whichsoundplay=barkgrowlsound;
-                                                                       if(dialogueboxsound[whichdialogue][indialogue]==-1)whichsoundplay=fireendsound;
-                                                                       if(dialogueboxsound[whichdialogue][indialogue]==-2)whichsoundplay=firestartsound;
-                                                                       if(dialogueboxsound[whichdialogue][indialogue]==-3)whichsoundplay=consolesuccesssound;
-                                                                       if(dialogueboxsound[whichdialogue][indialogue]==-4)whichsoundplay=consolefailsound;
-                                                                       PlaySoundEx( whichsoundplay, samp[whichsoundplay], NULL, true);
-                                                                       OPENAL_3D_SetAttributes(channels[whichsoundplay], gLoc, vel);
-                                                                       OPENAL_SetVolume(channels[whichsoundplay], 256);
-                                                                       OPENAL_SetPaused(channels[whichsoundplay], false);
-                                                                       //}
-                                                               }
+                                       if ((resolutions[i]->w == newscreenwidth) && (resolutions[i]->h == newscreenheight))
+                                       {
+                                               i++;
+                                               if (resolutions[i] != NULL)
+                                               {
+                                                       newscreenwidth = (int) resolutions[i]->w;
+                                                       newscreenheight = (int) resolutions[i]->h;
+                                               }
+                                               else if (isCustomResolution)
+                                               {
+                                                       if ((screenwidth == newscreenwidth) && (screenheight == newscreenheight))
+                                                       {
+                                                               newscreenwidth = (int) resolutions[0]->w;
+                                                               newscreenheight = (int) resolutions[0]->h;
                                                        }
-                                                       if(Compare(consoletext[0],"dhs ",0,3)){
-                                                               numhotspots--;
-                                                               if(numhotspots<0)numhotspots=0;
-                                                               donesomething=1;
+                                                       else
+                                                       {
+                                                               newscreenwidth = screenwidth;
+                                                               newscreenheight = screenheight;
                                                        }
+                                               }
+                                               else
+                                               {
+                                                       newscreenwidth = (int) resolutions[0]->w;
+                                                       newscreenheight = (int) resolutions[0]->h;
+                                               }
+                                               found = true;
+                                       }
+                               }
  
+                               if (!found)
+                               {
+                                       newscreenwidth = (int) resolutions[0]->w;
+                                       newscreenheight = (int) resolutions[0]->h;
+                               }
  
-                                                       if(Compare(consoletext[0],"proportion ",0,10)||Compare(consoletext[0],"Proportion ",0,4)){
-                                                               int startpoint;
-                                                               int alldone;
+                               
+                       }
+                       if(Button()&&!oldbutton&&selected==1){
+                               newdetail++;
+                               if(newdetail>2)newdetail=0;
+                       }
+                       if(Button()&&!oldbutton&&selected==2){
+                               bloodtoggle++;
+                               if(bloodtoggle>2)bloodtoggle=0;
+                       }
+                       if(Button()&&!oldbutton&&selected==3){
+                               difficulty++;
+                               if(difficulty>2)difficulty=0;
+                       }
+                       if(Button()&&!oldbutton&&selected==4){
+                               ismotionblur=1-ismotionblur;
+                       }
+                       if(Button()&&!oldbutton&&selected==5){
+                               decals=1-decals;
+                       }
+                       if(Button()&&!oldbutton&&selected==6){
+                               musictoggle=1-musictoggle;
  
-                                                               alldone=0;
-                                                               startpoint=11;
-                                                               j=startpoint;
-                                                               while(consoletext[0][j]!='\0'&&consoletext[0][j]!=' '&&!alldone&&j<255){
-                                                                       mapname[j-startpoint]=consoletext[0][j];
-                                                                       j++;
-                                                                       if(consoletext[0][j]=='\0')alldone=1;
-                                                               }
-                                                               mapname[j-startpoint]='\0';
+                               if(!musictoggle){
+                                       OPENAL_SetPaused(channels[music1], true);
+                                       OPENAL_SetPaused(channels[stream_music2], true);
+                                       OPENAL_SetPaused(channels[stream_music3], true);
  
-                                                               headprop=atof(mapname);
+                                       for(i=0;i<4;i++){
+                                               oldmusicvolume[i]=0;
+                                               musicvolume[i]=0;
+                                       }
+                               }
  
-                                                               j++;
-                                                               startpoint=j;
-                                                               while(consoletext[0][j]!='\0'&&consoletext[0][j]!=' '&&!alldone&&j<255){
-                                                                       mapname[j-startpoint]=consoletext[0][j];
-                                                                       j++;
-                                                                       if(consoletext[0][j]=='\0')alldone=1;
-                                                               }
-                                                               mapname[j-startpoint]='\0';
+                               if(musictoggle){
+                                       PlayStreamEx( stream_music3, strm[stream_music3], NULL, true);
+                                       OPENAL_SetPaused(channels[stream_music3], false);
+                                       OPENAL_SetVolume(channels[stream_music3], 256);
+                               }
+                       }
+                       if(Button()&&!oldbutton&&selected==9){
+                               invertmouse=1-invertmouse;
+                       }
+                       if(Button()&&!oldbutton&&selected==10){
+                               usermousesensitivity+=.2;
+                               if(usermousesensitivity>2)usermousesensitivity=.2;
+                       }
+                       if(Button()&&!oldbutton&&selected==11){
+                               volume+=.1f;
+                               if(volume>1.0001f)volume=0;
+                               OPENAL_SetSFXMasterVolume((int)(volume*255));
+                       }
+                       if(Button()&&!oldbutton&&selected==7){
+                               /*float gLoc[3]={0,0,0};
+                               float vel[3]={0,0,0};
+                               OPENAL_Sample_SetMinMaxDistance(samp[firestartsound], 9999.0f, 99999.0f);
+                               PlaySoundEx( firestartsound, samp[firestartsound], NULL, true);
+                               OPENAL_3D_SetAttributes(channels[firestartsound], gLoc, vel);
+                               OPENAL_SetVolume(channels[firestartsound], 256);
+                               OPENAL_SetPaused(channels[firestartsound], false);
+                               OPENAL_Sample_SetMinMaxDistance(samp[firestartsound], 8.0f, 2000.0f);
+                               */
+                               flashr=1;
+                               flashg=0;
+                               flashb=0;
+                               flashamount=1;
+                               flashdelay=1;
  
-                                                               bodyprop=atof(mapname);
+                               //options
  
-                                                               j++;
-                                                               startpoint=j;
-                                                               while(consoletext[0][j]!='\0'&&consoletext[0][j]!=' '&&!alldone&&j<255){
-                                                                       mapname[j-startpoint]=consoletext[0][j];
-                                                                       j++;
-                                                                       if(consoletext[0][j]=='\0')alldone=1;
-                                                               }
-                                                               mapname[j-startpoint]='\0';
+                               mainmenu=4;
+                               keyselect=-1;
+                       }
+                       if(Button()&&!oldbutton&&selected==8){
+                               float gLoc[3]={0,0,0};
+                               float vel[3]={0,0,0};
+                               OPENAL_Sample_SetMinMaxDistance(samp[fireendsound], 9999.0f, 99999.0f);
+                               PlaySoundEx( fireendsound, samp[fireendsound], NULL, true);
+                               OPENAL_3D_SetAttributes(channels[fireendsound], gLoc, vel);
+                               OPENAL_SetVolume(channels[fireendsound], 256);
+                               OPENAL_SetPaused(channels[fireendsound], false);
+                               OPENAL_Sample_SetMinMaxDistance(samp[fireendsound], 8.0f, 2000.0f);
  
-                                                               armprop=atof(mapname);
+                               flashr=1;
+                               flashg=0;
+                               flashb=0;
+                               flashamount=1;
+                               flashdelay=1;
  
-                                                               j++;
-                                                               startpoint=j;
-                                                               while(consoletext[0][j]!='\0'&&consoletext[0][j]!=' '&&!alldone&&j<255){
-                                                                       mapname[j-startpoint]=consoletext[0][j];
-                                                                       j++;
-                                                                       if(consoletext[0][j]=='\0')alldone=1;
-                                                               }
-                                                               mapname[j-startpoint]='\0';
+                               if(newdetail>2)newdetail=detail;
+                               if(newdetail<0)newdetail=detail;
+                               if(newscreenwidth<0)newscreenwidth=screenwidth;
+                               if(newscreenheight<0)newscreenheight=screenheight;
  
-                                                               legprop=atof(mapname);
  
-                                                               if(player[0].creature==wolftype){
-                                                                       player[0].proportionhead=1.1*headprop;
-                                                                       player[0].proportionbody=1.1*bodyprop;
-                                                                       player[0].proportionarms=1.1*armprop;
-                                                                       player[0].proportionlegs=1.1*legprop;
-                                                               }
+                               ofstream opstream(ConvertFileName(":Data:config.txt", "w"));
+                               opstream << "Screenwidth:\n";
+                               opstream << newscreenwidth;
+                               opstream << "\nScreenheight:\n";
+                               opstream << newscreenheight;
+                               opstream << "\nMouse sensitivity:\n";
+                               opstream << usermousesensitivity;
+                               opstream << "\nBlur(0,1):\n";
+                               opstream << ismotionblur;
+                               opstream << "\nOverall Detail(0,1,2) higher=better:\n";
+                               opstream << newdetail;
+                               opstream << "\nFloating jump:\n";
+                               opstream << floatjump;
+                               opstream << "\nMouse jump:\n";
+                               opstream << mousejump;
+                               opstream << "\nAmbient sound:\n";
+                               opstream << ambientsound;
+                               opstream << "\nBlood (0,1,2):\n";
+                               opstream << bloodtoggle;
+                               opstream << "\nAuto slomo:\n";
+                               opstream << autoslomo;
+                               opstream << "\nFoliage:\n";
+                               opstream << foliage;
+                               opstream << "\nMusic:\n";
+                               opstream << musictoggle;
+                               opstream << "\nTrilinear:\n";
+                               opstream << trilinear;
+                               opstream << "\nDecals(shadows,blood puddles,etc):\n";
+                               opstream << decals;
+                               opstream << "\nInvert mouse:\n";
+                               opstream << invertmouse;
+                               opstream << "\nGamespeed:\n";
+                               if(oldgamespeed==0)oldgamespeed=1;
+                               opstream << oldgamespeed;
+                               opstream << "\nDifficulty(0,1,2) higher=harder:\n";
+                               opstream << difficulty;
+                               opstream << "\nDamage effects(blackout, doublevision):\n";
+                               opstream << damageeffects;
+                               opstream << "\nText:\n";
+                               opstream << texttoggle;
+                               opstream << "\nDebug:\n";
+                               opstream << debugmode;
+                               opstream << "\nVBL Sync:\n";
+                               opstream << vblsync;
+                               opstream << "\nShow Points:\n";
+                               opstream << showpoints;
+                               opstream << "\nAlways Blur:\n";
+                               opstream << alwaysblur;
+                               opstream << "\nImmediate mode (turn on on G5):\n";
+                               opstream << immediate;
+                               opstream << "\nVelocity blur:\n";
+                               opstream << velocityblur;
+                           opstream << "\nVolume:\n";
+                       opstream << volume;
+                               opstream << "\nForward key:\n";
+                               opstream << KeyToChar(forwardkey);
+                               opstream << "\nBack key:\n";
+                               opstream << KeyToChar(backkey);
+                               opstream << "\nLeft key:\n";
+                               opstream << KeyToChar(leftkey);
+                               opstream << "\nRight key:\n";
+                               opstream << KeyToChar(rightkey);
+                               opstream << "\nJump key:\n";
+                               opstream << KeyToChar(jumpkey);
+                               opstream << "\nCrouch key:\n";
+                               opstream << KeyToChar(crouchkey);
+                               opstream << "\nDraw key:\n";
+                               opstream << KeyToChar(drawkey);
+                               opstream << "\nThrow key:\n";
+                               opstream << KeyToChar(throwkey);
+                               opstream << "\nAttack key:\n";
+                               opstream << KeyToChar(attackkey);
+                               opstream << "\nChat key:\n";
+                               opstream << KeyToChar(chatkey);
+                               opstream.close();
  
-                                                               if(player[0].creature==rabbittype){
-                                                                       player[0].proportionhead=1.2*headprop;
-                                                                       player[0].proportionbody=1.05*bodyprop;
-                                                                       player[0].proportionarms=1.00*armprop;
-                                                                       player[0].proportionlegs=1.1*legprop;
-                                                                       player[0].proportionlegs.y=1.05*legprop;
-                                                               }
+                               if(mainmenu==3&&gameon)mainmenu=2;
+                               if(mainmenu==3&&!gameon)mainmenu=1;
+                       }
+                       if(Button())oldbutton=1;
+                       else oldbutton=0;
+               }
+               if(mainmenu==4){
+                       if(Button()&&!oldbutton&&selected!=-1&&keyselect==-1){
+                               float gLoc[3]={0,0,0};
+                               float vel[3]={0,0,0};
+                               OPENAL_Sample_SetMinMaxDistance(samp[firestartsound], 9999.0f, 99999.0f);
+                               PlaySoundEx( firestartsound, samp[firestartsound], NULL, true);
+                               OPENAL_3D_SetAttributes(channels[firestartsound], gLoc, vel);
+                               OPENAL_SetVolume(channels[firestartsound], 256);
+                               OPENAL_SetPaused(channels[firestartsound], false);
+                               OPENAL_Sample_SetMinMaxDistance(samp[firestartsound], 8.0f, 2000.0f);
+                       }
+                       if(Button()&&!oldbutton&&selected<9&&keyselect==-1){
+                               keyselect=selected;
+                               oldbuttons[0]=1;
+                               oldbuttons[1]=1;
+                               oldbuttons[2]=1;
+                       }
+                       if(keyselect!=-1){
+                               for(i=0;i<3;i++)
+                                       if(!buttons[i]&&!oldbutton&&!Button())oldbuttons[i]=0;
+                               for(i=0;i<140;i++){
+                                       if((IsKeyDown(theKeyMap, i)||(buttons[0]&&!oldbuttons[0]&&!oldbutton)||(buttons[1]&&!oldbuttons[1]&&!oldbutton))&&keyselect!=-1){
+                                               if(i!=MAC_ESCAPE_KEY&&(strcmp(KeyToChar(i),"unknown")||(buttons[0]&&!oldbuttons[0]&&!oldbutton)||(buttons[1]&&!oldbuttons[1]&&!oldbutton))){
+                                                       float gLoc[3]={0,0,0};
+                                                       float vel[3]={0,0,0};
+                                                       OPENAL_Sample_SetMinMaxDistance(samp[fireendsound], 9999.0f, 99999.0f);
+                                                       PlaySoundEx( fireendsound, samp[fireendsound], NULL, true);
+                                                       OPENAL_3D_SetAttributes(channels[fireendsound], gLoc, vel);
+                                                       OPENAL_SetVolume(channels[fireendsound], 256);
+                                                       OPENAL_SetPaused(channels[fireendsound], false);
+                                                       OPENAL_Sample_SetMinMaxDistance(samp[fireendsound], 8.0f, 2000.0f);
  
-                                                               donesomething=1;
-                                                       }
+                                                       int keynum;
+                                                       keynum=i;
+                                                       if(buttons[0]&&!oldbuttons[0])keynum=MAC_MOUSEBUTTON1;
+                                                       if(buttons[1]&&!oldbuttons[1])keynum=MAC_MOUSEBUTTON2;
  
-                                                       if(Compare(consoletext[0],"allimmobile ",0,11)||Compare(consoletext[0],"Allimmobile ",0,11)){
-                                                               for(i=0;i<numplayers;i++){
-                                                                       if(i>0)player[i].immobile=1;
-                                                               }
-                                                               donesomething=1;
-                                                       }
  
  
-                                                       if(Compare(consoletext[0],"default ",0,7)||Compare(consoletext[0],"Default ",0,7)){
-                                                               player[0].armorhead=1;
-                                                               player[0].armorhigh=1;
-                                                               player[0].armorlow=1;
-                                                               player[0].protectionhead=1;
-                                                               player[0].protectionhigh=1;
-                                                               player[0].protectionlow=1;
-                                                               player[0].metalhead=1;
-                                                               player[0].metalhigh=1;
-                                                               player[0].metallow=1;
-                                                               player[0].power=1;
-                                                               player[0].speedmult=1;
-                                                               player[0].scale=1;
-                                                               if(player[0].creature==wolftype){
-                                                                       player[0].proportionhead=1.1;
-                                                                       player[0].proportionbody=1.1;
-                                                                       player[0].proportionarms=1.1;
-                                                                       player[0].proportionlegs=1.1;
-                                                               }
+                                                       if(keyselect==0)forwardkey=keynum;
+                                                       if(keyselect==1)backkey=keynum;
+                                                       if(keyselect==2)leftkey=keynum;
+                                                       if(keyselect==3)rightkey=keynum;
+                                                       if(keyselect==4)crouchkey=keynum;
+                                                       if(keyselect==5)jumpkey=keynum;
+                                                       if(keyselect==6)drawkey=keynum;
+                                                       if(keyselect==7)throwkey=keynum;
+                                                       if(keyselect==8)attackkey=keynum;
+                                                       keyselect=-1;
+                                               }
+                                       }
+                               }}
+                       if(Button()&&!oldbutton&&selected==9){
+                               float gLoc[3]={0,0,0};
+                               float vel[3]={0,0,0};
+                               OPENAL_Sample_SetMinMaxDistance(samp[fireendsound], 9999.0f, 99999.0f);
+                               PlaySoundEx( fireendsound, samp[fireendsound], NULL, true);
+                               OPENAL_3D_SetAttributes(channels[fireendsound], gLoc, vel);
+                               OPENAL_SetVolume(channels[fireendsound], 256);
+                               OPENAL_SetPaused(channels[fireendsound], false);
+                               OPENAL_Sample_SetMinMaxDistance(samp[fireendsound], 8.0f, 2000.0f);
  
-                                                               if(player[0].creature==rabbittype){
-                                                                       player[0].proportionhead=1.2;
-                                                                       player[0].proportionbody=1.05;
-                                                                       player[0].proportionarms=1.00;
-                                                                       player[0].proportionlegs=1.1;
-                                                                       player[0].proportionlegs.y=1.05;
-                                                               }
+                               flashr=1;
+                               flashg=0;
+                               flashb=0;
+                               flashamount=1;
+                               flashdelay=1;
  
-                                                               player[0].numclothes=0;
-                                                               LoadTextureSave(creatureskin[player[0].creature][player[0].whichskin],
-                                                                               &player[0].skeleton.drawmodel.textureptr,1,&player[0].skeleton.skinText[0],&player[0].skeleton.skinsize);
+                               mainmenu=3;
  
-                                                               editoractive=typeactive;
-                                                               player[0].immobile=0;
+                               if(newdetail>2)newdetail=detail;
+                               if(newdetail<0)newdetail=detail;
+                               if(newscreenwidth>3000)newscreenwidth=screenwidth;
+                               if(newscreenwidth<0)newscreenwidth=screenwidth;
+                               if(newscreenheight>3000)newscreenheight=screenheight;
+                               if(newscreenheight<0)newscreenheight=screenheight;
+                       }
+               }
  
+               if(mainmenu==5){
  
+                       if(endgame==2){
+                               accountcampaignchoicesmade[accountactive]=0;
+                               accountcampaignscore[accountactive]=0;
+                               accountcampaigntime[accountactive]=0;
+                               endgame=0;
+                       }
  
-                                                               donesomething=1;
-                                                       }
+                       if(Button()&&!oldbutton&&selected==1){
+                               float gLoc[3]={0,0,0};
+                               float vel[3]={0,0,0};
+                               OPENAL_Sample_SetMinMaxDistance(samp[firestartsound], 9999.0f, 99999.0f);
+                               PlaySoundEx( firestartsound, samp[firestartsound], NULL, true);
+                               OPENAL_3D_SetAttributes(channels[firestartsound], gLoc, vel);
+                               OPENAL_SetVolume(channels[firestartsound], 256);
+                               OPENAL_SetPaused(channels[firestartsound], false);
+                               OPENAL_Sample_SetMinMaxDistance(samp[firestartsound], 8.0f, 2000.0f);
  
-                                                       if(Compare(consoletext[0],"tint ",0,4)||Compare(consoletext[0],"Tint ",0,4)){
-                                                               int startpoint;
-                                                               int alldone;
-                                                               alldone=0;
-                                                               startpoint=5;
-                                                               j=startpoint;
-                                                               while(consoletext[0][j]!='\0'&&consoletext[0][j]!=' '&&!alldone&&j<255){
-                                                                       mapname[j-startpoint]=consoletext[0][j];
-                                                                       j++;
-                                                                       if(consoletext[0][j]=='\0')alldone=1;
-                                                               }
-                                                               mapname[j-startpoint]='\0';
+                               flashr=1;
+                               flashg=0;
+                               flashb=0;
+                               flashamount=1;
+                               flashdelay=1;
  
-                                                               tintr=atof(mapname);
+                               startbonustotal=0;
  
-                                                               j++;
-                                                               startpoint=j;
-                                                               while(consoletext[0][j]!='\0'&&consoletext[0][j]!=' '&&!alldone&&j<255){
-                                                                       mapname[j-startpoint]=consoletext[0][j];
-                                                                       j++;
-                                                                       if(consoletext[0][j]=='\0')alldone=1;
-                                                               }
-                                                               mapname[j-startpoint]='\0';
+                               loading=2;
+                               loadtime=0;
+                               targetlevel=-1;
+                               if(firstload)TickOnceAfter();
+                               if(!firstload)LoadStuff();
+                               else {
+                                       Loadlevel(-1);
+                               }
  
-                                                               tintg=atof(mapname);
+                               mainmenu=0;
+                               gameon=1;
+                               OPENAL_SetPaused(channels[stream_music3], true);
+                       }
+                       if(Button()&&!oldbutton&&selected-7>=accountcampaignchoicesmade[accountactive]){//selected>=7&&(selected-7<=campaignnumchoices)){
+                               float gLoc[3]={0,0,0};
+                               float vel[3]={0,0,0};
+                               OPENAL_Sample_SetMinMaxDistance(samp[firestartsound], 9999.0f, 99999.0f);
+                               PlaySoundEx( firestartsound, samp[firestartsound], NULL, true);
+                               OPENAL_3D_SetAttributes(channels[firestartsound], gLoc, vel);
+                               OPENAL_SetVolume(channels[firestartsound], 256);
+                               OPENAL_SetPaused(channels[firestartsound], false);
+                               OPENAL_Sample_SetMinMaxDistance(samp[firestartsound], 8.0f, 2000.0f);
  
-                                                               j++;
-                                                               startpoint=j;
-                                                               while(consoletext[0][j]!='\0'&&consoletext[0][j]!=' '&&!alldone&&j<255){
-                                                                       mapname[j-startpoint]=consoletext[0][j];
-                                                                       j++;
-                                                                       if(consoletext[0][j]=='\0')alldone=1;
-                                                               }
-                                                               mapname[j-startpoint]='\0';
+                               flashr=1;
+                               flashg=0;
+                               flashb=0;
+                               flashamount=1;
+                               flashdelay=1;
  
-                                                               tintb=atof(mapname);
+                               startbonustotal=0;
  
-                                                               donesomething=1;
-                                                       }
+                               loading=2;
+                               loadtime=0;
+                               targetlevel=7;
+                               if(firstload)TickOnceAfter();
+                               if(!firstload)LoadStuff();
+                               //else {
+                               for(i=0;i<255;i++){
+                                       mapname[i]='\0';
+                               }
+                               mapname[0]=':';
+                               mapname[1]='D';
+                               mapname[2]='a';
+                               mapname[3]='t';
+                               mapname[4]='a';
+                               mapname[5]=':';
+                               mapname[6]='M';
+                               mapname[7]='a';
+                               mapname[8]='p';
+                               mapname[9]='s';
+                               mapname[10]=':';
+                               strcat(mapname,campaignmapname[campaignchoicewhich[selected-7-accountcampaignchoicesmade[accountactive]]]);
+                               whichchoice=selected-7-accountcampaignchoicesmade[accountactive];
+                               visibleloading=1;
+                               stillloading=1;
+                               Loadlevel(mapname);
+                               //Loadlevel(campaignmapname[levelorder[selected-7]]);
+                               //}
+                               campaign=1;
+                               mainmenu=0;
+                               gameon=1;
+                               OPENAL_SetPaused(channels[stream_music3], true);
+                       }
+                       if(Button()&&!oldbutton&&selected==4){
+                               float gLoc[3]={0,0,0};
+                               float vel[3]={0,0,0};
+                               OPENAL_Sample_SetMinMaxDistance(samp[fireendsound], 9999.0f, 99999.0f);
+                               PlaySoundEx( fireendsound, samp[fireendsound], NULL, true);
+                               OPENAL_3D_SetAttributes(channels[fireendsound], gLoc, vel);
+                               OPENAL_SetVolume(channels[fireendsound], 256);
+                               OPENAL_SetPaused(channels[fireendsound], false);
+                               OPENAL_Sample_SetMinMaxDistance(samp[fireendsound], 8.0f, 2000.0f);
  
-                                                       if(Compare(consoletext[0],"sky tint ",0,8)||Compare(consoletext[0],"Sky Tint ",0,8)){
-                                                               int startpoint;
-                                                               int alldone;
-                                                               alldone=0;
-                                                               startpoint=9;
-                                                               j=startpoint;
-                                                               while(consoletext[0][j]!='\0'&&consoletext[0][j]!=' '&&!alldone&&j<255){
-                                                                       mapname[j-startpoint]=consoletext[0][j];
-                                                                       j++;
-                                                                       if(consoletext[0][j]=='\0')alldone=1;
-                                                               }
-                                                               mapname[j-startpoint]='\0';
+                               flashr=1;
+                               flashg=0;
+                               flashb=0;
+                               flashamount=1;
+                               flashdelay=1;
  
-                                                               skyboxr=atof(mapname);
+                               if(mainmenu==5&&gameon)mainmenu=2;
+                               if(mainmenu==5&&!gameon)mainmenu=1;
+                       }
+                       if(Button()&&!oldbutton&&selected==5){
+                               float gLoc[3]={0,0,0};
+                               float vel[3]={0,0,0};
+                               OPENAL_Sample_SetMinMaxDistance(samp[fireendsound], 9999.0f, 99999.0f);
+                               PlaySoundEx( fireendsound, samp[fireendsound], NULL, true);
+                               OPENAL_3D_SetAttributes(channels[fireendsound], gLoc, vel);
+                               OPENAL_SetVolume(channels[fireendsound], 256);
+                               OPENAL_SetPaused(channels[fireendsound], false);
+                               OPENAL_Sample_SetMinMaxDistance(samp[fireendsound], 8.0f, 2000.0f);
  
-                                                               j++;
-                                                               startpoint=j;
-                                                               while(consoletext[0][j]!='\0'&&consoletext[0][j]!=' '&&!alldone&&j<255){
-                                                                       mapname[j-startpoint]=consoletext[0][j];
-                                                                       j++;
-                                                                       if(consoletext[0][j]=='\0')alldone=1;
-                                                               }
-                                                               mapname[j-startpoint]='\0';
+                               flashr=1;
+                               flashg=0;
+                               flashb=0;
+                               flashamount=1;
+                               flashdelay=1;
  
-                                                               skyboxg=atof(mapname);
+                               mainmenu=7;
+                       }
+                       if(Button()&&!oldbutton&&selected==3){
+                               float gLoc[3]={0,0,0};
+                               float vel[3]={0,0,0};
+                               OPENAL_Sample_SetMinMaxDistance(samp[firestartsound], 9999.0f, 99999.0f);
+                               PlaySoundEx( firestartsound, samp[firestartsound], NULL, true);
+                               OPENAL_3D_SetAttributes(channels[firestartsound], gLoc, vel);
+                               OPENAL_SetVolume(channels[firestartsound], 256);
+                               OPENAL_SetPaused(channels[firestartsound], false);
+                               OPENAL_Sample_SetMinMaxDistance(samp[firestartsound], 8.0f, 2000.0f);
  
-                                                               j++;
-                                                               startpoint=j;
-                                                               while(consoletext[0][j]!='\0'&&consoletext[0][j]!=' '&&!alldone&&j<255){
-                                                                       mapname[j-startpoint]=consoletext[0][j];
-                                                                       j++;
-                                                                       if(consoletext[0][j]=='\0')alldone=1;
-                                                               }
-                                                               mapname[j-startpoint]='\0';
+                               flashr=1;
+                               flashg=0;
+                               flashb=0;
+                               flashamount=1;
+                               flashdelay=1;
  
-                                                               skyboxb=atof(mapname);
+                               mainmenu=6;
+                       }
+                       if(Button()&&!oldbutton&&selected==2){
+                               float gLoc[3]={0,0,0};
+                               float vel[3]={0,0,0};
+                               OPENAL_Sample_SetMinMaxDistance(samp[firestartsound], 9999.0f, 99999.0f);
+                               PlaySoundEx( firestartsound, samp[firestartsound], NULL, true);
+                               OPENAL_3D_SetAttributes(channels[firestartsound], gLoc, vel);
+                               OPENAL_SetVolume(channels[firestartsound], 256);
+                               OPENAL_SetPaused(channels[firestartsound], false);
+                               OPENAL_Sample_SetMinMaxDistance(samp[firestartsound], 8.0f, 2000.0f);
  
-                                                               skyboxlightr=skyboxr;
-                                                               skyboxlightg=skyboxg;
-                                                               skyboxlightb=skyboxb;
+                               flashr=1;
+                               flashg=0;
+                               flashb=0;
+                               flashamount=1;
+                               flashdelay=1;
  
-                                                               SetUpLighting();
+                               mainmenu=9;
+                       }
+                       if(Button())oldbutton=1;
+                       else oldbutton=0;
+               }
+               if(mainmenu==9){
+                       if(Button()&&!oldbutton&&selected<numchallengelevels&&selected>=0&&selected<=accountprogress[accountactive]){
+                               float gLoc[3]={0,0,0};
+                               float vel[3]={0,0,0};
+                               OPENAL_Sample_SetMinMaxDistance(samp[firestartsound], 9999.0f, 99999.0f);
+                               PlaySoundEx( firestartsound, samp[firestartsound], NULL, true);
+                               OPENAL_3D_SetAttributes(channels[firestartsound], gLoc, vel);
+                               OPENAL_SetVolume(channels[firestartsound], 256);
+                               OPENAL_SetPaused(channels[firestartsound], false);
+                               OPENAL_Sample_SetMinMaxDistance(samp[firestartsound], 8.0f, 2000.0f);
  
-                                                               //if(skyboxtexture){
-                                                               terrain.DoShadows();
-                                                               objects.DoShadows();
-                                                               /*}
-                                                               else terrain.DoLighting();
-                                                               */
-                                                               donesomething=1;
-                                                       }
+                               flashr=1;
+                               flashg=0;
+                               flashb=0;
+                               flashamount=1;
+                               flashdelay=1;
  
-                                                       if(Compare(consoletext[0],"sky light ",0,9)||Compare(consoletext[0],"Sky Light ",0,9)){
-                                                               int startpoint;
-                                                               int alldone;
-                                                               alldone=0;
-                                                               startpoint=10;
-                                                               j=startpoint;
-                                                               while(consoletext[0][j]!='\0'&&consoletext[0][j]!=' '&&!alldone&&j<255){
-                                                                       mapname[j-startpoint]=consoletext[0][j];
-                                                                       j++;
-                                                                       if(consoletext[0][j]=='\0')alldone=1;
-                                                               }
-                                                               mapname[j-startpoint]='\0';
+                               startbonustotal=0;
  
-                                                               skyboxlightr=atof(mapname);
+                               loading=2;
+                               loadtime=0;
+                               targetlevel=selected;
+                               if(firstload)TickOnceAfter();
+                               if(!firstload)LoadStuff();
+                               else {
+                                       Loadlevel(selected);
+                               }
+                               campaign=0;
  
-                                                               j++;
-                                                               startpoint=j;
-                                                               while(consoletext[0][j]!='\0'&&consoletext[0][j]!=' '&&!alldone&&j<255){
-                                                                       mapname[j-startpoint]=consoletext[0][j];
-                                                                       j++;
-                                                                       if(consoletext[0][j]=='\0')alldone=1;
-                                                               }
-                                                               mapname[j-startpoint]='\0';
+                               mainmenu=0;
+                               gameon=1;
+                               OPENAL_SetPaused(channels[stream_music3], true);
+                       }
+                       if(Button()&&!oldbutton&&selected==numchallengelevels){
+                               float gLoc[3]={0,0,0};
+                               float vel[3]={0,0,0};
+                               OPENAL_Sample_SetMinMaxDistance(samp[fireendsound], 9999.0f, 99999.0f);
+                               PlaySoundEx( fireendsound, samp[fireendsound], NULL, true);
+                               OPENAL_3D_SetAttributes(channels[fireendsound], gLoc, vel);
+                               OPENAL_SetVolume(channels[fireendsound], 256);
+                               OPENAL_SetPaused(channels[fireendsound], false);
+                               OPENAL_Sample_SetMinMaxDistance(samp[fireendsound], 8.0f, 2000.0f);
  
-                                                               skyboxlightg=atof(mapname);
+                               flashr=1;
+                               flashg=0;
+                               flashb=0;
+                               flashamount=1;
+                               flashdelay=1;
  
-                                                               j++;
-                                                               startpoint=j;
-                                                               while(consoletext[0][j]!='\0'&&consoletext[0][j]!=' '&&!alldone&&j<255){
-                                                                       mapname[j-startpoint]=consoletext[0][j];
-                                                                       j++;
-                                                                       if(consoletext[0][j]=='\0')alldone=1;
-                                                               }
-                                                               mapname[j-startpoint]='\0';
+                               mainmenu=5;
+                       }
+                       if(Button())oldbutton=1;
+                       else oldbutton=0;
+               }
+               if(mainmenu==11){
+                       if(Button()&&!oldbutton&&selected<numchallengelevels&&selected>=0&&selected<=accountprogress[accountactive]){
+                               float gLoc[3]={0,0,0};
+                               float vel[3]={0,0,0};
+                               OPENAL_Sample_SetMinMaxDistance(samp[firestartsound], 9999.0f, 99999.0f);
+                               PlaySoundEx( firestartsound, samp[firestartsound], NULL, true);
+                               OPENAL_3D_SetAttributes(channels[firestartsound], gLoc, vel);
+                               OPENAL_SetVolume(channels[firestartsound], 256);
+                               OPENAL_SetPaused(channels[firestartsound], false);
+                               OPENAL_Sample_SetMinMaxDistance(samp[firestartsound], 8.0f, 2000.0f);
  
-                                                               skyboxlightb=atof(mapname);
+                               flashr=1;
+                               flashg=0;
+                               flashb=0;
+                               flashamount=1;
+                               flashdelay=1;
  
-                                                               SetUpLighting();
+                               startbonustotal=0;
  
-                                                               //if(skyboxtexture){
-                                                               terrain.DoShadows();
-                                                               objects.DoShadows();
-                                                               /*}
-                                                               else terrain.DoLighting();
-                                                               */
-                                                               donesomething=1;
-                                                       }
+                               loading=2;
+                               loadtime=0;
+                               targetlevel=selected;
+                               if(firstload)TickOnceAfter();
+                               if(!firstload)LoadStuff();
+                               else {
+                                       Loadlevel(selected);
+                               }
+                               campaign=0;
  
-                                                       if(Compare(consoletext[0],"skybox ",0,6)||Compare(consoletext[0],"Skybox ",0,6)){
-                                                               skyboxtexture=1-skyboxtexture;
+                               mainmenu=0;
+                               gameon=1;
+                               OPENAL_SetPaused(channels[stream_music3], true);
+                       }
+                       if(Button()&&!oldbutton&&selected==numchallengelevels){
+                               float gLoc[3]={0,0,0};
+                               float vel[3]={0,0,0};
+                               OPENAL_Sample_SetMinMaxDistance(samp[fireendsound], 9999.0f, 99999.0f);
+                               PlaySoundEx( fireendsound, samp[fireendsound], NULL, true);
+                               OPENAL_3D_SetAttributes(channels[fireendsound], gLoc, vel);
+                               OPENAL_SetVolume(channels[fireendsound], 256);
+                               OPENAL_SetPaused(channels[fireendsound], false);
+                               OPENAL_Sample_SetMinMaxDistance(samp[fireendsound], 8.0f, 2000.0f);
  
-                                                               SetUpLighting();
-                                                               //if(skyboxtexture){
-                                                               terrain.DoShadows();
-                                                               objects.DoShadows();
-                                                               /*}
-                                                               else terrain.DoLighting();
-                                                               */
-                                                               donesomething=1;
-                                                       }
+                               flashr=1;
+                               flashg=0;
+                               flashb=0;
+                               flashamount=1;
+                               flashdelay=1;
  
-                                                       if(Compare(consoletext[0],"protection ",0,10)||Compare(consoletext[0],"Protection ",0,10)){
-                                                               int startpoint;
-                                                               int alldone;
-                                                               alldone=0;
-                                                               startpoint=11;
-                                                               j=startpoint;
-                                                               while(consoletext[0][j]!='\0'&&consoletext[0][j]!=' '&&!alldone&&j<255){
-                                                                       mapname[j-startpoint]=consoletext[0][j];
-                                                                       j++;
-                                                                       if(consoletext[0][j]=='\0')alldone=1;
-                                                               }
-                                                               mapname[j-startpoint]='\0';
+                               mainmenu=5;
+                       }
+                       if(Button())oldbutton=1;
+                       else oldbutton=0;
+               }
+               if(mainmenu==10){
+                       endgame=2;
+                       if(Button()&&!oldbutton&&selected==3){
+                               float gLoc[3]={0,0,0};
+                               float vel[3]={0,0,0};
+                               OPENAL_Sample_SetMinMaxDistance(samp[fireendsound], 9999.0f, 99999.0f);
+                               PlaySoundEx( fireendsound, samp[fireendsound], NULL, true);
+                               OPENAL_3D_SetAttributes(channels[fireendsound], gLoc, vel);
+                               OPENAL_SetVolume(channels[fireendsound], 256);
+                               OPENAL_SetPaused(channels[fireendsound], false);
+                               OPENAL_Sample_SetMinMaxDistance(samp[fireendsound], 8.0f, 2000.0f);
  
-                                                               player[0].protectionhead=atof(mapname);
+                               flashr=1;
+                               flashg=0;
+                               flashb=0;
+                               flashamount=1;
+                               flashdelay=1;
  
-                                                               j++;
-                                                               startpoint=j;
-                                                               while(consoletext[0][j]!='\0'&&consoletext[0][j]!=' '&&!alldone&&j<255){
-                                                                       mapname[j-startpoint]=consoletext[0][j];
-                                                                       j++;
-                                                                       if(consoletext[0][j]=='\0')alldone=1;
-                                                               }
-                                                               mapname[j-startpoint]='\0';
+                               mainmenu=5;
+                       }
+                       if(Button())oldbutton=1;
+                       else oldbutton=0;
+               }
  
-                                                               player[0].protectionhigh=atof(mapname);
+               if(mainmenu==6){
+                       if(Button()&&!oldbutton&&selected!=-1){
+                               float gLoc[3]={0,0,0};
+                               float vel[3]={0,0,0};
+                               OPENAL_Sample_SetMinMaxDistance(samp[firestartsound], 9999.0f, 99999.0f);
+                               PlaySoundEx( firestartsound, samp[firestartsound], NULL, true);
+                               OPENAL_3D_SetAttributes(channels[firestartsound], gLoc, vel);
+                               OPENAL_SetVolume(channels[firestartsound], 256);
+                               OPENAL_SetPaused(channels[firestartsound], false);
+                               OPENAL_Sample_SetMinMaxDistance(samp[firestartsound], 8.0f, 2000.0f);
+                       }
+                       if(Button()&&!oldbutton&&selected==1){
+                               float gLoc[3]={0,0,0};
+                               float vel[3]={0,0,0};
+                               OPENAL_Sample_SetMinMaxDistance(samp[fireendsound], 9999.0f, 99999.0f);
+                               PlaySoundEx( fireendsound, samp[fireendsound], NULL, true);
+                               OPENAL_3D_SetAttributes(channels[fireendsound], gLoc, vel);
+                               OPENAL_SetVolume(channels[fireendsound], 256);
+                               OPENAL_SetPaused(channels[fireendsound], false);
+                               OPENAL_Sample_SetMinMaxDistance(samp[fireendsound], 8.0f, 2000.0f);
  
-                                                               j++;
-                                                               startpoint=j;
-                                                               while(consoletext[0][j]!='\0'&&consoletext[0][j]!=' '&&!alldone&&j<255){
-                                                                       mapname[j-startpoint]=consoletext[0][j];
-                                                                       j++;
-                                                                       if(consoletext[0][j]=='\0')alldone=1;
-                                                               }
-                                                               mapname[j-startpoint]='\0';
+                               flashr=1;
+                               flashg=0;
+                               flashb=0;
+                               flashamount=1;
+                               flashdelay=1;
  
-                                                               player[0].protectionlow=atof(mapname);
+                               for(i=accountactive;i<numaccounts-1;i++){
+                                       accountdifficulty[i]=accountdifficulty[i+1];
+                                       accountcampaignchoicesmade[i]=accountcampaignchoicesmade[i+1];
+                                       for(j=0;j<accountcampaignchoicesmade[i+1];j++){
+                                               accountcampaignchoices[i][j]=accountcampaignchoices[i+1][j];
+                                       }
+                                       accountpoints[i]=accountpoints[i+1];
+                                       for(j=0;j<50;j++){
+                                               accounthighscore[i][j]=accounthighscore[i+1][j];
+                                               accountfasttime[i][j]=accountfasttime[i+1][j];
+                                       }
+                                       for(j=0;j<60;j++){
+                                               accountunlocked[i][j]=accountunlocked[i+1][j];
+                                       }
+                                       for(j=0;j<256;j++){
+                                               accountname[i][j]=accountname[i+1][j];
+                                       }
+                                       accountcampaignhighscore[i]=accountcampaignhighscore[i+1];
+                                       accountprogress[i]=accountprogress[i+1];
+                                       accountcampaignfasttime[i]=accountcampaignfasttime[i+1];
+                                       accountcampaignscore[i]=accountcampaignscore[i+1];
+                                       accountcampaigntime[i]=accountcampaigntime[i+1];
+                               }
  
-                                                               donesomething=1;
-                                                       }
+                               numaccounts--;
+                               accountactive=-1;
  
-                                                       if(Compare(consoletext[0],"armor ",0,5)||Compare(consoletext[0],"Armor ",0,5)){
-                                                               int startpoint;
-                                                               int alldone;
-                                                               alldone=0;
-                                                               startpoint=6;
-                                                               j=startpoint;
-                                                               while(consoletext[0][j]!='\0'&&consoletext[0][j]!=' '&&!alldone&&j<255){
-                                                                       mapname[j-startpoint]=consoletext[0][j];
-                                                                       j++;
-                                                                       if(consoletext[0][j]=='\0')alldone=1;
-                                                               }
-                                                               mapname[j-startpoint]='\0';
  
-                                                               player[0].armorhead=atof(mapname);
+                               mainmenu=7;
+                       }
+                       if(Button()&&!oldbutton&&selected==2){
+                               float gLoc[3]={0,0,0};
+                               float vel[3]={0,0,0};
+                               OPENAL_Sample_SetMinMaxDistance(samp[fireendsound], 9999.0f, 99999.0f);
+                               PlaySoundEx( fireendsound, samp[fireendsound], NULL, true);
+                               OPENAL_3D_SetAttributes(channels[fireendsound], gLoc, vel);
+                               OPENAL_SetVolume(channels[fireendsound], 256);
+                               OPENAL_SetPaused(channels[fireendsound], false);
+                               OPENAL_Sample_SetMinMaxDistance(samp[fireendsound], 8.0f, 2000.0f);
  
-                                                               j++;
-                                                               startpoint=j;
-                                                               while(consoletext[0][j]!='\0'&&consoletext[0][j]!=' '&&!alldone&&j<255){
-                                                                       mapname[j-startpoint]=consoletext[0][j];
-                                                                       j++;
-                                                                       if(consoletext[0][j]=='\0')alldone=1;
-                                                               }
-                                                               mapname[j-startpoint]='\0';
+                               flashr=1;
+                               flashg=0;
+                               flashb=0;
+                               flashamount=1;
+                               flashdelay=1;
  
-                                                               player[0].armorhigh=atof(mapname);
+                               mainmenu=5;
+                       }
+                       if(Button())oldbutton=1;
+                       else oldbutton=0;
+               }
+               if(mainmenu==7){
+                       if(Button()&&!oldbutton&&selected!=-1){
+                               float gLoc[3]={0,0,0};
+                               float vel[3]={0,0,0};
+                               OPENAL_Sample_SetMinMaxDistance(samp[firestartsound], 9999.0f, 99999.0f);
+                               PlaySoundEx( firestartsound, samp[firestartsound], NULL, true);
+                               OPENAL_3D_SetAttributes(channels[firestartsound], gLoc, vel);
+                               OPENAL_SetVolume(channels[firestartsound], 256);
+                               OPENAL_SetPaused(channels[firestartsound], false);
+                               OPENAL_Sample_SetMinMaxDistance(samp[firestartsound], 8.0f, 2000.0f);
+                       }
+                       if(Button()&&!oldbutton&&selected==0&&numaccounts<8){
+                               entername=1;
+                       }
+                       if(Button()&&!oldbutton&&selected>0&&selected<numaccounts+1){
+                               accountactive=selected-1;
+                               mainmenu=5;
+                               flashr=1;
+                               flashg=0;
+                               flashb=0;
+                               flashamount=1;
+                               flashdelay=1;
+                       }
+                       if(Button()&&!oldbutton&&selected==numaccounts+1){
+                               float gLoc[3]={0,0,0};
+                               float vel[3]={0,0,0};
+                               OPENAL_Sample_SetMinMaxDistance(samp[fireendsound], 9999.0f, 99999.0f);
+                               PlaySoundEx( fireendsound, samp[fireendsound], NULL, true);
+                               OPENAL_3D_SetAttributes(channels[fireendsound], gLoc, vel);
+                               OPENAL_SetVolume(channels[fireendsound], 256);
+                               OPENAL_SetPaused(channels[fireendsound], false);
+                               OPENAL_Sample_SetMinMaxDistance(samp[fireendsound], 8.0f, 2000.0f);
  
-                                                               j++;
-                                                               startpoint=j;
-                                                               while(consoletext[0][j]!='\0'&&consoletext[0][j]!=' '&&!alldone&&j<255){
-                                                                       mapname[j-startpoint]=consoletext[0][j];
-                                                                       j++;
-                                                                       if(consoletext[0][j]=='\0')alldone=1;
-                                                               }
-                                                               mapname[j-startpoint]='\0';
+                               flashr=1;
+                               flashg=0;
+                               flashb=0;
+                               flashamount=1;
+                               flashdelay=1;
  
-                                                               player[0].armorlow=atof(mapname);
+                               mainmenu=1;
  
-                                                               donesomething=1;
-                                                       }
+                               for(j=0;j<255;j++){
+                                       displaytext[0][j]=' ';
+                               }
+                               displaychars[0]=0;
+                               displayselected=0;
+                               entername=0;
+                       }
+                       if(Button())oldbutton=1;
+                       else oldbutton=0;
+               }
+               if(mainmenu==8){
+                       if(Button()&&!oldbutton&&selected!=-1){
+                               float gLoc[3]={0,0,0};
+                               float vel[3]={0,0,0};
+                               OPENAL_Sample_SetMinMaxDistance(samp[firestartsound], 9999.0f, 99999.0f);
+                               PlaySoundEx( firestartsound, samp[firestartsound], NULL, true);
+                               OPENAL_3D_SetAttributes(channels[firestartsound], gLoc, vel);
+                               OPENAL_SetVolume(channels[firestartsound], 256);
+                               OPENAL_SetPaused(channels[firestartsound], false);
+                               OPENAL_Sample_SetMinMaxDistance(samp[firestartsound], 8.0f, 2000.0f);
  
-                                                       if(Compare(consoletext[0],"protectionreset ",0,15)||Compare(consoletext[0],"Protectionreset ",0,15)){
-                                                               for(i=0;i<numplayers;i++){
-                                                                       player[i].protectionhead=1.0;
-                                                                       player[i].protectionhigh=1.0;
-                                                                       player[i].protectionlow=1.0;
-                                                                       player[i].armorhead=1.0;
-                                                                       player[i].armorhigh=1.0;
-                                                                       player[i].armorlow=1.0;
-                                                               }
+                               if(selected==0)accountdifficulty[accountactive]=0;
+                               if(selected==1)accountdifficulty[accountactive]=1;
+                               if(selected==2)accountdifficulty[accountactive]=2;
  
-                                                               donesomething=1;
-                                                       }
+                               mainmenu=5;
  
-                                                       if(Compare(consoletext[0],"protectionnear ",0,14)||Compare(consoletext[0],"Protectionnear ",0,14)){
-                                                               int closest=-1;
-                                                               float closestdist=-1;
-                                                               float distance;
-                                                               if(numplayers>1)
-                                                                       for(i=1;i<numplayers;i++){
-                                                                               distance=findDistancefast(&player[i].coords,&player[0].coords);
-                                                                               if(closestdist==-1||distance<closestdist){
-                                                                                       closestdist=distance;
-                                                                                       closest=i;
-                                                                               }
-                                                                       }
+                               flashr=1;
+                               flashg=0;
+                               flashb=0;
+                               flashamount=1;
+                               flashdelay=1;
  
-                                                                       int startpoint;
-                                                                       int alldone;
-                                                                       alldone=0;
-                                                                       startpoint=15;
-                                                                       j=startpoint;
-                                                                       while(consoletext[0][j]!='\0'&&consoletext[0][j]!=' '&&!alldone&&j<255){
-                                                                               mapname[j-startpoint]=consoletext[0][j];
-                                                                               j++;
-                                                                               if(consoletext[0][j]=='\0')alldone=1;
-                                                                       }
-                                                                       mapname[j-startpoint]='\0';
+                       }
+                       if(Button())oldbutton=1;
+                       else oldbutton=0;
+               }
  
-                                                                       player[closest].protectionhead=atof(mapname);
  
-                                                                       j++;
-                                                                       startpoint=j;
-                                                                       while(consoletext[0][j]!='\0'&&consoletext[0][j]!=' '&&!alldone&&j<255){
-                                                                               mapname[j-startpoint]=consoletext[0][j];
-                                                                               j++;
-                                                                               if(consoletext[0][j]=='\0')alldone=1;
-                                                                       }
-                                                                       mapname[j-startpoint]='\0';
+               if(Button())oldbutton=1;
+               else oldbutton=0;
  
-                                                                       player[closest].protectionhigh=atof(mapname);
+               if(IsKeyDown(theKeyMap, MAC_Q_KEY)&&IsKeyDown(theKeyMap, MAC_COMMAND_KEY)){
+                       tryquit=1;
+                       if(mainmenu==3){
+                               if(newdetail>2)newdetail=detail;
+                               if(newdetail<0)newdetail=detail;
+                               if(newscreenwidth<0)newscreenwidth=screenwidth;
+                               if(newscreenheight<0)newscreenheight=screenheight;
  
-                                                                       j++;
-                                                                       startpoint=j;
-                                                                       while(consoletext[0][j]!='\0'&&consoletext[0][j]!=' '&&!alldone&&j<255){
-                                                                               mapname[j-startpoint]=consoletext[0][j];
-                                                                               j++;
-                                                                               if(consoletext[0][j]=='\0')alldone=1;
-                                                                       }
-                                                                       mapname[j-startpoint]='\0';
+                               ofstream opstream(ConvertFileName(":Data:config.txt", "w"));
+                               opstream << "Screenwidth:\n";
+                               opstream << newscreenwidth;
+                               opstream << "\nScreenheight:\n";
+                               opstream << newscreenheight;
+                               opstream << "\nMouse sensitivity:\n";
+                               opstream << usermousesensitivity;
+                               opstream << "\nBlur(0,1):\n";
+                               opstream << ismotionblur;
+                               opstream << "\nOverall Detail(0,1,2) higher=better:\n";
+                               opstream << newdetail;
+                               opstream << "\nFloating jump:\n";
+                               opstream << floatjump;
+                               opstream << "\nMouse jump:\n";
+                               opstream << mousejump;
+                               opstream << "\nAmbient sound:\n";
+                               opstream << ambientsound;
+                               opstream << "\nBlood (0,1,2):\n";
+                               opstream << bloodtoggle;
+                               opstream << "\nAuto slomo:\n";
+                               opstream << autoslomo;
+                               opstream << "\nFoliage:\n";
+                               opstream << foliage;
+                               opstream << "\nMusic:\n";
+                               opstream << musictoggle;
+                               opstream << "\nTrilinear:\n";
+                               opstream << trilinear;
+                               opstream << "\nDecals(shadows,blood puddles,etc):\n";
+                               opstream << decals;
+                               opstream << "\nInvert mouse:\n";
+                               opstream << invertmouse;
+                               opstream << "\nGamespeed:\n";
+                               if(oldgamespeed==0)oldgamespeed=1;
+                               opstream << oldgamespeed;
+                               opstream << "\nDifficulty(0,1,2) higher=harder:\n";
+                               opstream << difficulty;
+                               opstream << "\nDamage effects(blackout, doublevision):\n";
+                               opstream << damageeffects;
+                               opstream << "\nText:\n";
+                               opstream << texttoggle;
+                               opstream << "\nDebug:\n";
+                               opstream << debugmode;
+                               opstream << "\nVBL Sync:\n";
+                               opstream << vblsync;
+                               opstream << "\nShow Points:\n";
+                               opstream << showpoints;
+                               opstream << "\nAlways Blur:\n";
+                               opstream << alwaysblur;
+                               opstream << "\nImmediate mode (turn on on G5):\n";
+                               opstream << immediate;
+                               opstream << "\nVelocity blur:\n";
+                               opstream << velocityblur;
+                           opstream << "\nVolume:\n";
+                       opstream << volume;
+                               opstream << "\nForward key:\n";
+                               opstream << KeyToChar(forwardkey);
+                               opstream << "\nBack key:\n";
+                               opstream << KeyToChar(backkey);
+                               opstream << "\nLeft key:\n";
+                               opstream << KeyToChar(leftkey);
+                               opstream << "\nRight key:\n";
+                               opstream << KeyToChar(rightkey);
+                               opstream << "\nJump key:\n";
+                               opstream << KeyToChar(jumpkey);
+                               opstream << "\nCrouch key:\n";
+                               opstream << KeyToChar(crouchkey);
+                               opstream << "\nDraw key:\n";
+                               opstream << KeyToChar(drawkey);
+                               opstream << "\nThrow key:\n";
+                               opstream << KeyToChar(throwkey);
+                               opstream << "\nAttack key:\n";
+                               opstream << KeyToChar(attackkey);
+                               opstream << "\nChat key:\n";
+                               opstream << KeyToChar(chatkey);
+                               opstream.close();
+                       }
+               }
  
-                                                                       player[closest].protectionlow=atof(mapname);
+               if(mainmenu==1||mainmenu==2){
+                       if(loaddistrib>4)transition+=multiplier/8;
+                       if(transition>1){
+                               transition=0;
+                               anim++;
+                               if(anim>4)anim=0;
+                               loaddistrib=0;
+                       }
+               }
+               OPENAL_SetFrequency(channels[stream_music3], 22050);
  
-                                                                       donesomething=1;
+               if(entername){
+                       for(i=0;i<140;i++){
+                               if(IsKeyDown(theKeyMap, i)){
+                                       togglekeydelay[i]+=multiplier;
+                                       if(togglekeydelay[i]>.4){
+                                               togglekey[i]=0;
+                                               togglekeydelay[i]=.36;
+                                       }
+                                       if(!togglekey[i]){
+                                               if(KeyToSingleChar(i)!='\0'&&displaychars[0]<60){
+                                                       for(j=255;j>=displayselected+1;j--){
+                                                               displaytext[0][j]=displaytext[0][j-1];
                                                        }
+                                                       displaytext[0][displayselected]=KeyToSingleChar(i);
+                                                       if(IsKeyDown(theKeyMap, MAC_SHIFT_KEY))displaytext[0][displayselected]=Shift(displaytext[0][displayselected]);
+                                                       displayselected++;
+                                                       displaychars[0]++;
+                                               }
+                                               if(i==MAC_DELETE_KEY&&displayselected!=0){
+                                                       for(j=displayselected-1;j<255;j++){
+                                                               displaytext[0][j]=displaytext[0][j+1];
+                                                       }
+                                                       displaytext[0][255]=' ';
+                                                       displayselected--;
+                                                       displaychars[0]--;
+                                               }
+                                               if(i==MAC_ARROW_LEFT_KEY&&displayselected!=0){
+                                                       displayselected--;
+                                               }
+                                               if(i==MAC_ARROW_RIGHT_KEY&&displayselected<displaychars[0]){
+                                                       displayselected++;
+                                               }
+                                               if(i==MAC_RETURN_KEY&&entername){
+                                                       if(displaychars[0]){
+                                                               numaccounts++;
+                                                               strcpy(accountname[numaccounts-1],displaytext[0]);
+                                                               accountactive=numaccounts-1;
+                                                               accountdifficulty[accountactive]=1;
+                                                               accountprogress[accountactive]=0;
+                                                               accountpoints[accountactive]=0;
+                                                               accountcampaigntime[accountactive]=0;
+                                                               accountcampaignscore[accountactive]=0;
+                                                               accountcampaignfasttime[accountactive]=0;
+                                                               accountcampaignhighscore[accountactive]=0;
+                                                               for(j=0;j<50;j++){
+                                                                       accounthighscore[accountactive][j]=0;
+                                                                       accountfasttime[accountactive][j]=0;
+                                                               }
+                                                               for(j=0;j<60;j++){
+                                                                       accountunlocked[accountactive][j]=0;
+                                                               }
+                                                               accountcampaignchoicesmade[accountactive]=0;
  
-                                                       if(Compare(consoletext[0],"armornear ",0,9)||Compare(consoletext[0],"Armornear ",0,9)){
-                                                               int closest=-1;
-                                                               float closestdist=-1;
-                                                               float distance;
-                                                               if(numplayers>1)
-                                                                       for(i=1;i<numplayers;i++){
-                                                                               distance=findDistancefast(&player[i].coords,&player[0].coords);
-                                                                               if(closestdist==-1||distance<closestdist){
-                                                                                       closestdist=distance;
-                                                                                       closest=i;
-                                                                               }
-                                                                       }
-                                                                       int startpoint;
-                                                                       int alldone;
-                                                                       alldone=0;
-                                                                       startpoint=10;
-                                                                       j=startpoint;
-                                                                       while(consoletext[0][j]!='\0'&&consoletext[0][j]!=' '&&!alldone&&j<255){
-                                                                               mapname[j-startpoint]=consoletext[0][j];
-                                                                               j++;
-                                                                               if(consoletext[0][j]=='\0')alldone=1;
-                                                                       }
-                                                                       mapname[j-startpoint]='\0';
-                                                                       player[closest].armorhead=atof(mapname);
-                                                                       j++;
-                                                                       startpoint=j;
-                                                                       while(consoletext[0][j]!='\0'&&consoletext[0][j]!=' '&&!alldone&&j<255){
-                                                                               mapname[j-startpoint]=consoletext[0][j];
-                                                                               j++;
-                                                                               if(consoletext[0][j]=='\0')alldone=1;
-                                                                       }
-                                                                       mapname[j-startpoint]='\0';
+                                                               for(j=0;j<255;j++){
+                                                                       displaytext[0][j]=' ';
+                                                               }
+                                                               displaychars[0]=0;
+                                                               displayselected=0;
+                                                               entername=0;
  
-                                                                       player[closest].armorhigh=atof(mapname);
+                                                               mainmenu=8;
  
-                                                                       j++;
-                                                                       startpoint=j;
-                                                                       while(consoletext[0][j]!='\0'&&consoletext[0][j]!=' '&&!alldone&&j<255){
-                                                                               mapname[j-startpoint]=consoletext[0][j];
-                                                                               j++;
-                                                                               if(consoletext[0][j]=='\0')alldone=1;
-                                                                       }
-                                                                       mapname[j-startpoint]='\0';
+                                                               flashr=1;
+                                                               flashg=0;
+                                                               flashb=0;
+                                                               flashamount=1;
+                                                               flashdelay=1;
  
-                                                                       player[closest].armorlow=atof(mapname);
+                                                               float gLoc[3]={0,0,0};
+                                                               float vel[3]={0,0,0};
+                                                               OPENAL_Sample_SetMinMaxDistance(samp[firestartsound], 9999.0f, 99999.0f);
+                                                               PlaySoundEx( firestartsound, samp[firestartsound], NULL, true);
+                                                               OPENAL_3D_SetAttributes(channels[firestartsound], gLoc, vel);
+                                                               OPENAL_SetVolume(channels[firestartsound], 256);
+                                                               OPENAL_SetPaused(channels[firestartsound], false);
+                                                               OPENAL_Sample_SetMinMaxDistance(samp[firestartsound], 8.0f, 2000.0f);
  
-                                                                       donesomething=1;
-                                                       }
+                                                               for(j=0;j<255;j++){
+                                                                       displaytext[0][j]=' ';
+                                                               }
+                                                               displaychars[0]=0;
  
  
-                                                       if(Compare(consoletext[0],"metal ",0,5)||Compare(consoletext[0],"Metal ",0,5)){
-                                                               int startpoint;
-                                                               int alldone;
-                                                               alldone=0;
-                                                               startpoint=6;
-                                                               j=startpoint;
-                                                               while(consoletext[0][j]!='\0'&&consoletext[0][j]!=' '&&!alldone&&j<255){
-                                                                       mapname[j-startpoint]=consoletext[0][j];
-                                                                       j++;
-                                                                       if(consoletext[0][j]=='\0')alldone=1;
-                                                               }
-                                                               mapname[j-startpoint]='\0';
+                                                               displayselected=0;
+                                                       }}
  
-                                                               player[0].metalhead=atof(mapname);
+                                               if(i==MAC_RETURN_KEY&&mainmenu==13){
+                                                       if(displaychars[0]){
+                                                               sprintf (registrationname, "%s", displaytext[0]);
+                                                               if(displaychars[0]<254)registrationname[displaychars[0]]='\0';
  
-                                                               j++;
-                                                               startpoint=j;
-                                                               while(consoletext[0][j]!='\0'&&consoletext[0][j]!=' '&&!alldone&&j<255){
-                                                                       mapname[j-startpoint]=consoletext[0][j];
-                                                                       j++;
-                                                                       if(consoletext[0][j]=='\0')alldone=1;
-                                                               }
-                                                               mapname[j-startpoint]='\0';
+                                                               mainmenu=5;
+                         
+                                                               flashr=1;
+                                                               flashg=0;
+                                                               flashb=0;
+                                                               flashamount=1;
+                                                               flashdelay=1;
  
-                                                               player[0].metalhigh=atof(mapname);
+                                                               float gLoc[3]={0,0,0};
+                                                               float vel[3]={0,0,0};
+                                                               OPENAL_Sample_SetMinMaxDistance(samp[firestartsound], 9999.0f, 99999.0f);
+                                                               PlaySoundEx( firestartsound, samp[firestartsound], NULL, true);
+                                                               OPENAL_3D_SetAttributes(channels[firestartsound], gLoc, vel);
+                                                               OPENAL_SetVolume(channels[firestartsound], 256);
+                                                               OPENAL_SetPaused(channels[firestartsound], false);
+                                                               OPENAL_Sample_SetMinMaxDistance(samp[firestartsound], 8.0f, 2000.0f);
  
-                                                               j++;
-                                                               startpoint=j;
-                                                               while(consoletext[0][j]!='\0'&&consoletext[0][j]!=' '&&!alldone&&j<255){
-                                                                       mapname[j-startpoint]=consoletext[0][j];
-                                                                       j++;
-                                                                       if(consoletext[0][j]=='\0')alldone=1;
+                                                               for(j=0;j<255;j++){
+                                                                       displaytext[0][j]=' ';
                                                                }
+                                                               displaychars[0]=0;
+                         
+                                                               displayselected=0;
+                                                       }}
+                                       }
+                                       togglekey[i]=1;
+                               }
+                               else {
+                                       togglekey[i]=0;
+                                       togglekeydelay[i]=0;
+                               }
+                       }
  
-                                                               mapname[j-startpoint]='\0';
+                       displayblinkdelay-=multiplier;
+                       if(displayblinkdelay<=0){
+                               displayblinkdelay=.3;
+                               displayblink=1-displayblink;
+                       }
+               }
+       }
  
-                                                               player[0].metallow=atof(mapname);
+       if(!mainmenu){
+               if(hostile==1)hostiletime+=multiplier;
+               else hostiletime=0;
+               if(!winfreeze)leveltime+=multiplier;
+               if(IsKeyDown(theKeyMap, MAC_ESCAPE_KEY)){
+                       chatting=0;
+                       console=0;
+                       freeze=0;
+                       displaychars[0]=0;
+               }
  
-                                                               donesomething=1;
-                                                       }
+               if(IsKeyDown(theKeyMap, chatkey)&&!chattogglekeydown&&!console&&!chatting&&debugmode){
+                       chatting=1;
+                       chattogglekeydown=1;
+                       togglekey[chatkey]=1;
+                       togglekeydelay[chatkey]=-20;
+               }
  
-                                                       if(Compare(consoletext[0],"noclothesnear ",0,13)||Compare(consoletext[0],"Noclothesnear ",0,13)){
-                                                               int closest=-1;
-                                                               float closestdist=-1;
-                                                               float distance;
-                                                               if(numplayers>1)
-                                                                       for(i=1;i<numplayers;i++){
-                                                                               distance=findDistancefast(&player[i].coords,&player[0].coords);
-                                                                               if(closestdist==-1||distance<closestdist){
-                                                                                       closestdist=distance;
-                                                                                       closest=i;
-                                                                               }
-                                                                       }
-                                                                       player[closest].numclothes=0;
-                                                                       LoadTextureSave(creatureskin[player[closest].creature][player[closest].whichskin],
-                                                                                       &player[closest].skeleton.drawmodel.textureptr,1,&player[closest].skeleton.skinText[0],&player[closest].skeleton.skinsize);
+               if(!IsKeyDown(theKeyMap, chatkey)){
+                       chattogglekeydown=0;
+               }
  
-                                                                       donesomething=1;
+               if(chatting){
+                       for(i=0;i<140;i++){
+                               if(IsKeyDown(theKeyMap, i)){
+                                       togglekeydelay[i]+=multiplier;
+                                       if(togglekeydelay[i]>.4){
+                                               togglekey[i]=0;
+                                               togglekeydelay[i]=.36;
+                                       }
+                                       if(!togglekey[i]){
+                                               if(KeyToSingleChar(i)!='\0'&&displaychars[0]<60){
+                                                       for(j=255;j>=displayselected+1;j--){
+                                                               displaytext[0][j]=displaytext[0][j-1];
                                                        }
-                                                       if(Compare(consoletext[0],"noclothes ",0,9)||Compare(consoletext[0],"Noclothes ",0,9)){
-                                                               int closest=0;
-                                                               player[closest].numclothes=0;
-                                                               LoadTextureSave(creatureskin[player[closest].creature][player[closest].whichskin],
-                                                                               &player[closest].skeleton.drawmodel.textureptr,1,&player[closest].skeleton.skinText[0],&player[closest].skeleton.skinsize);
-                                                               donesomething=1;
+                                                       displaytext[0][displayselected]=KeyToSingleChar(i);
+                                                       if(IsKeyDown(theKeyMap, MAC_SHIFT_KEY))displaytext[0][displayselected]=Shift(displaytext[0][displayselected]);
+                                                       displayselected++;
+                                                       displaychars[0]++;
+                                               }
+                                               if(i==MAC_DELETE_KEY&&displayselected!=0){
+                                                       for(j=displayselected-1;j<255;j++){
+                                                               displaytext[0][j]=displaytext[0][j+1];
                                                        }
-                                                       if((Compare(consoletext[0],"Clothes ",0,7)||Compare(consoletext[0],"clothes ",0,7))){
-                                                               mapname[0]=':';
-                                                               mapname[1]='D';
-                                                               mapname[2]='a';
-                                                               mapname[3]='t';
-                                                               mapname[4]='a';
-                                                               mapname[5]=':';
-                                                               mapname[6]='T';
-                                                               mapname[7]='e';
-                                                               mapname[8]='x';
-                                                               mapname[9]='t';
-                                                               mapname[10]='u';
-                                                               mapname[11]='r';
-                                                               mapname[12]='e';
-                                                               mapname[13]='s';
-                                                               mapname[14]=':';
-                                                               for(j=8;j<consolechars[0];j++){
-                                                                       mapname[j-8+15]=consoletext[0][j];
+                                                       displaytext[0][255]=' ';
+                                                       displayselected--;
+                                                       displaychars[0]--;
+                                               }
+                                               if(i==MAC_ARROW_LEFT_KEY&&displayselected!=0){
+                                                       displayselected--;
+                                               }
+                                               if(i==MAC_ARROW_RIGHT_KEY&&displayselected<displaychars[0]){
+                                                       displayselected++;
+                                               }
+                                               if(i==MAC_RETURN_KEY){
+                                                       if(displaychars[0]){
+                                                               /*for(j=0;j<displaychars[0];j++){
+                                                               talkname[j]=displaytext[0][j];
                                                                }
-                                                               mapname[consolechars[0]-8+15]='.';
-                                                               mapname[consolechars[0]-8+16]='p';
-                                                               mapname[consolechars[0]-8+17]='n';
-                                                               mapname[consolechars[0]-8+18]='g';
-                                                               mapname[consolechars[0]-8+19]='\0';
-                                                               //:Data:Textures:Pants.png
-                                                               if(AddClothes((char *)mapname,0,1,&player[0].skeleton.skinText[0],&player[0].skeleton.skinsize)){
-                                                                       player[0].DoMipmaps(5,0,0,player[0].skeleton.skinsize,player[0].skeleton.skinsize);
-                                                                       strcpy(player[0].clothes[player[0].numclothes],mapname);
-                                                                       player[0].clothestintr[player[0].numclothes]=tintr;
-                                                                       player[0].clothestintg[player[0].numclothes]=tintg;
-                                                                       player[0].clothestintb[player[0].numclothes]=tintb;
-                                                                       player[0].numclothes++;
+                                                               talkname[displaychars[0]]='\0';
+                                                               sprintf (chatname, "%s: %s",playerName,talkname);
+                                                               //NetworkSendInformation(chatname);
+                                                               */
+                                                               for(j=0;j<255;j++){
+                                                                       displaytext[0][j]=' ';
                                                                }
-                                                               donesomething=1;
-                                                       }
-                                                       if(Compare(consoletext[0],"belt ",0,4)||Compare(consoletext[0],"belt ",0,4)){
-                                                               player[0].skeleton.clothes = 1-player[0].skeleton.clothes;
-                                                               donesomething=1;
+                                                               displaychars[0]=0;
+                                                               displayselected=0;
+                                                               chatting=0;
                                                        }
+                                               }
+                                       }
+                                       togglekey[i]=1;
+                               }
+                               else {
+                                       togglekey[i]=0;
+                                       togglekeydelay[i]=0;
+                               }
+                       }
  
-                                                       if(Compare(consoletext[0],"Cellophane ",0,10)||Compare(consoletext[0],"cellophane ",0,10)){
-                                                               cellophane=1-cellophane;
-                                                               if(cellophane){
-                                                                       for(i=0;i<numplayers;i++){
-                                                                               player[i].proportionhead.z=0;
-                                                                               player[i].proportionbody.z=0;
-                                                                               player[i].proportionarms.z=0;
-                                                                               player[i].proportionlegs.z=0;
-                                                                       }
-                                                               }
-                                                               if(!cellophane){
-                                                                       for(i=0;i<numplayers;i++){
-                                                                               player[i].proportionhead.z=player[i].proportionhead.x;
-                                                                               player[i].proportionbody.z=player[i].proportionbody.x;
-                                                                               player[i].proportionarms.z=player[i].proportionarms.x;
-                                                                               player[i].proportionlegs.z=player[i].proportionlegs.x;
-                                                                       }
-                                                               }
-                                                               donesomething=1;
-                                                       }
+                       displayblinkdelay-=multiplier;
+                       if(displayblinkdelay<=0){
+                               displayblinkdelay=.3;
+                               displayblink=1-displayblink;
+                       }
+               }
  
-                                                       if((Compare(consoletext[0],"Clothesnear ",0,11)||Compare(consoletext[0],"clothesnear ",0,11))){
-                                                               mapname[0]=':';
-                                                               mapname[1]='D';
-                                                               mapname[2]='a';
-                                                               mapname[3]='t';
-                                                               mapname[4]='a';
-                                                               mapname[5]=':';
-                                                               mapname[6]='T';
-                                                               mapname[7]='e';
-                                                               mapname[8]='x';
-                                                               mapname[9]='t';
-                                                               mapname[10]='u';
-                                                               mapname[11]='r';
-                                                               mapname[12]='e';
-                                                               mapname[13]='s';
-                                                               mapname[14]=':';
-                                                               for(j=12;j<consolechars[0];j++){
-                                                                       mapname[j-12+15]=consoletext[0][j];
-                                                               }
-                                                               mapname[consolechars[0]-12+15]='.';
-                                                               mapname[consolechars[0]-12+16]='p';
-                                                               mapname[consolechars[0]-12+17]='n';
-                                                               mapname[consolechars[0]-12+18]='g';
-                                                               mapname[consolechars[0]-12+19]='\0';
-                                                               //:Data:Textures:Pants.png
-                                                               int closest=-1;
-                                                               float closestdist=-1;
-                                                               float distance;
-                                                               if(numplayers>1)
-                                                                       for(i=1;i<numplayers;i++){
-                                                                               distance=findDistancefast(&player[i].coords,&player[0].coords);
-                                                                               if(closestdist==-1||distance<closestdist){
-                                                                                       closestdist=distance;
-                                                                                       closest=i;
-                                                                               }
-                                                                       }
+               if(chatting)keyboardfrozen=1;
  
-                                                                       if(AddClothes((char *)mapname,0,1,&player[closest].skeleton.skinText[0],&player[closest].skeleton.skinsize)){
-                                                                               player[closest].DoMipmaps(5,0,0,player[closest].skeleton.skinsize,player[closest].skeleton.skinsize);
-                                                                               strcpy(player[closest].clothes[player[closest].numclothes],mapname);
-                                                                               player[closest].clothestintr[player[closest].numclothes]=tintr;
-                                                                               player[closest].clothestintg[player[closest].numclothes]=tintg;
-                                                                               player[closest].clothestintb[player[closest].numclothes]=tintb;
-                                                                               player[closest].numclothes++;
-                                                                       }
+               if(IsKeyDown(theKeyMap, MAC_V_KEY)&&!freezetogglekeydown&&debugmode){
+                       freeze=1-freeze;
+                       if(freeze){
+                               OPENAL_SetFrequency(OPENAL_ALL, 0.001);
+                       }
+                       freezetogglekeydown=1;
+               }
  
-                                                                       donesomething=1;
-                                                       }
+               if(!IsKeyDown(theKeyMap, MAC_V_KEY)&&!IsKeyDown(theKeyMap, MAC_F1_KEY)){
+                       freezetogglekeydown=0;
+               }
  
-                                                       if(Compare(consoletext[0],"funnybunny ",0,10)||Compare(consoletext[0],"funny bunny ",0,11)){
-                                                               player[0].skeleton.id=0;
-                                                               player[0].skeleton.Load((char *)":Data:Skeleton:Basic Figure",(char *)":Data:Skeleton:Basic Figurelow",(char *)":Data:Skeleton:Rabbitbelt",(char *)":Data:Models:Body.solid",(char *)":Data:Models:Body2.solid",(char *)":Data:Models:Body3.solid",(char *)":Data:Models:Body4.solid",(char *)":Data:Models:Body5.solid",(char *)":Data:Models:Body6.solid",(char *)":Data:Models:Body7.solid",(char *)":Data:Models:Bodylow.solid",(char *)":Data:Models:Belt.solid",1);
-                                                               LoadTextureSave(":Data:Textures:fur3.jpg",&player[0].skeleton.drawmodel.textureptr,1,&player[0].skeleton.skinText[0],&player[0].skeleton.skinsize);
-                                                               player[0].creature=rabbittype;
-                                                               player[0].scale=.2;
+               if(IsKeyDown(theKeyMap, MAC_TILDE_KEY)&&!consoletogglekeydown&&debugmode){
+                       console=1-console;
+                       if(!console)freeze=0;
+                       if(console){
+                               OPENAL_SetFrequency(OPENAL_ALL, 0.001);
+                       }
+                       consoletogglekeydown=1;
+               }
  
-                                                               player[0].proportionhead=1.2;
-                                                               player[0].proportionbody=1.05;
-                                                               player[0].proportionarms=1.00;
-                                                               player[0].proportionlegs=1.1;
-                                                               player[0].proportionlegs.y=1.05;
-                                                               player[0].headless=0;
+               if(!IsKeyDown(theKeyMap, MAC_TILDE_KEY)){
+                       consoletogglekeydown=0;
+               }
  
-                                                               player[0].damagetolerance=200;
+               if(console)freeze=1;
  
-                                                               donesomething=1;
-                                                       }
-                                                       if(Compare(consoletext[0],"wolfieisgod ",0,11)||Compare(consoletext[0],"wolfie is god ",0,12)){
-                                                               player[0].skeleton.id=0;
-                                                               player[0].skeleton.Load((char *)":Data:Skeleton:Basic Figure Wolf",(char *)":Data:Skeleton:Basic Figure Wolf Low",(char *)":Data:Skeleton:Rabbitbelt",(char *)":Data:Models:Wolf.solid",(char *)":Data:Models:Wolf2.solid",(char *)":Data:Models:Wolf3.solid",(char *)":Data:Models:Wolf4.solid",(char *)":Data:Models:Wolf5.solid",(char *)":Data:Models:Wolf6.solid",(char *)":Data:Models:Wolf7.solid",(char *)":Data:Models:Wolflow.solid",(char *)":Data:Models:Belt.solid",0);
-                                                               LoadTextureSave(":Data:Textures:Wolf.jpg",&player[0].skeleton.drawmodel.textureptr,1,&player[0].skeleton.skinText[0],&player[0].skeleton.skinsize);
-                                                               player[0].creature=wolftype;
-                                                               player[0].proportionhead=1.1;
-                                                               player[0].proportionbody=1.1;
-                                                               player[0].proportionarms=1.1;
-                                                               player[0].proportionlegs=1.1;
-                                                               player[0].proportionlegs.y=1.1;
-                                                               player[0].scale=.23;
-                                                               player[0].damagetolerance=300;
-                                                               donesomething=1;
-                                                       }
-                                                       /*if(Compare(consoletext[0],"kungfu ",0,6)||Compare(consoletext[0],"kung fu ",0,7)){
-                                                       LoadTextureSave(":Data:Textures:Kungfu.jpg",&player[0].skeleton.drawmodel.textureptr,1,&player[0].skeleton.skinText[0],&player[0].skeleton.skinsize);
-                                                       donesomething=1;
-                                                       }
-                                                       if(Compare(consoletext[0],"rambo ",0,5)){
-                                                       LoadTextureSave(":Data:Textures:Leather.jpg",&player[0].skeleton.drawmodel.textureptr,1,&player[0].skeleton.skinText[0],&player[0].skeleton.skinsize);
-                                                       donesomething=1;
-                                                       }
-                                                       if(Compare(consoletext[0],"david ",0,5)){
-                                                       LoadTextureSave(":Data:Textures:David.jpg",&player[0].skeleton.drawmodel.textureptr,1,&player[0].skeleton.skinText[0],&player[0].skeleton.skinsize);
-                                                       donesomething=1;
-                                                       }*/
-                                                       if(Compare(consoletext[0],"wolf ",0,4)){
-                                                               LoadTextureSave(":Data:Textures:Wolf.jpg",&player[0].skeleton.drawmodel.textureptr,1,&player[0].skeleton.skinText[0],&player[0].skeleton.skinsize);
-                                                               donesomething=1;
+               if(console&&!IsKeyDown(theKeyMap,MAC_COMMAND_KEY)){
+                       for(i=0;i<140;i++){
+                               if(IsKeyDown(theKeyMap, i)){
+                                       togglekeydelay[i]+=multiplier;
+                                       if(togglekeydelay[i]>.4){
+                                               togglekey[i]=0;
+                                               togglekeydelay[i]=.36;
+                                       }
+                                       if(!togglekey[i]){
+                                               if(KeyToSingleChar(i)!='\0'&&consolechars[0]<255){
+                                                       for(j=255;j>=consoleselected+1;j--){
+                                                               consoletext[0][j]=consoletext[0][j-1];
                                                        }
-                                                       if(Compare(consoletext[0],"darkwolf ",0,8)){
-                                                               LoadTextureSave(":Data:Textures:DarkWolf.jpg",&player[0].skeleton.drawmodel.textureptr,1,&player[0].skeleton.skinText[0],&player[0].skeleton.skinsize);
-                                                               donesomething=1;
+                                                       consoletext[0][consoleselected]=KeyToSingleChar(i);
+                                                       if(IsKeyDown(theKeyMap, MAC_SHIFT_KEY))consoletext[0][consoleselected]=Shift(consoletext[0][consoleselected]);
+                                                       consoleselected++;
+                                                       consolechars[0]++;
+                                               }
+                                               else if(i==MAC_ENTER_KEY){
+                                                       for(j=255;j>=consoleselected+1;j--){
+                                                               consoletext[0][j]=consoletext[0][j-1];
                                                        }
-                                                       if(Compare(consoletext[0],"snowwolf ",0,8)){
-                                                               LoadTextureSave(":Data:Textures:Snowwolf.jpg",&player[0].skeleton.drawmodel.textureptr,1,&player[0].skeleton.skinText[0],&player[0].skeleton.skinsize);
-                                                               donesomething=1;
-                                                       }/*
-                                                        if(Compare(consoletext[0],"lizardwolf ",0,10)){
-                                                        LoadTextureSave(":Data:Textures:Lizardwolf.jpg",&player[0].skeleton.drawmodel.textureptr,1,&player[0].skeleton.skinText[0],&player[0].skeleton.skinsize);
-                                                        donesomething=1;
-                                                        }*/
-                                                       if(Compare(consoletext[0],"white ",0,5)){
-                                                               LoadTextureSave(":Data:Textures:fur.jpg",&player[0].skeleton.drawmodel.textureptr,1,&player[0].skeleton.skinText[0],&player[0].skeleton.skinsize);
-                                                               donesomething=1;
+                                                       consoletext[0][consoleselected]='\n';
+                                                       consoleselected++;
+                                                       consolechars[0]++;
+                                               }
+                                               if(i==MAC_DELETE_KEY&&consoleselected!=0){
+                                                       for(j=consoleselected-1;j<255;j++){
+                                                               consoletext[0][j]=consoletext[0][j+1];
                                                        }
-                                                       if(Compare(consoletext[0],"brown ",0,5)){
-                                                               LoadTextureSave(":Data:Textures:fur3.jpg",&player[0].skeleton.drawmodel.textureptr,1,&player[0].skeleton.skinText[0],&player[0].skeleton.skinsize);
-                                                               donesomething=1;
+                                                       consoletext[0][255]=' ';
+                                                       consoleselected--;
+                                                       consolechars[0]--;
+                                               }
+                                               if(i==MAC_ARROW_UP_KEY){
+                                                       if(archiveselected<14)archiveselected++;
+                                                       for(j=0;j<255;j++){
+                                                               consolechars[0]=consolechars[archiveselected];
+                                                               consoletext[0][j]=consoletext[archiveselected][j];
+                                                               consoleselected=consolechars[0];
                                                        }
-                                                       if(Compare(consoletext[0],"black ",0,5)){
-                                                               LoadTextureSave(":Data:Textures:fur2.jpg",&player[0].skeleton.drawmodel.textureptr,1,&player[0].skeleton.skinText[0],&player[0].skeleton.skinsize);
-                                                               donesomething=1;
+                                               }
+                                               if(i==MAC_ARROW_DOWN_KEY){
+                                                       if(archiveselected>0)archiveselected--;
+                                                       for(j=0;j<255;j++){
+                                                               consolechars[0]=consolechars[archiveselected];
+                                                               consoletext[0][j]=consoletext[archiveselected][j];
+                                                               consoleselected=consolechars[0];
                                                        }
+                                               }
+                                               if(i==MAC_ARROW_LEFT_KEY&&consoleselected!=0){
+                                                       consoleselected--;
+                                               }
+                                               if(i==MAC_ARROW_RIGHT_KEY&&consoleselected<consolechars[0]){
+                                                       consoleselected++;
+                                               }
+                                               if(i==MAC_RETURN_KEY){
+                                                       archiveselected=0;
+                                                       cmd_dispatch(this, consoletext[0]);
                                                        if(consolechars[0]>0){
                                                                for(k=14;k>=1;k--){
                                                                        for(j=0;j<255;j++){