level.cpp level.h version.h OpenArena std // //Module:level.cpp //Author:TomHicks //Creation:09-01-2003 //LastEdit:06-20-2005 //Editors:TomHicks // //Purpose: //Toimplementtheworldoratleastareasonablecopy. // //SummaryofMethods: //Global //-functionname //description //blahClass //-functionname //description // //SummaryofProperties: //blahClass //-propertyname //description // #include"level.h" #include"version.h" #pragmacomment(lib,"bass.lib") #ifdefWIN32 #pragmawarning(disable:4996) #endif usingnamespacestd; namespaceOpenArena { Level::Level() { _window=NULL; textureNames=NULL; numTextures=0; screen.SetName(OPENARENA_VERSION); showFPS=false; showConsole=false; nextLevel="intro.map"; gamedir="oa/"; sound=true; defaultPlayer=newPlayer; numTriangles=0; triangles=NULL; /* for(intx=0;x<4;x++) LightAmbient[x]=5; */ //PlayerStuff mouseSpeed=5; turnSpeed=1.0f; moveSpeed=0.2f; mlook=true; } Level::~Level() { if(defaultPlayer) { deletedefaultPlayer; defaultPlayer=NULL; } } boolLevel::LoadMap(stringmapname) { ifstreaminput; stringreadBuffer; //players.Insert(*defaultPlayer); mapname=gamedir+"maps/"+mapname; if(tolower(Right(mapname,4))!=".map") mapname=mapname+".map"; input.open(mapname.c_str()); if(!input) { char*tmpChar=newchar[mapname.length()+41]; strcpy(tmpChar,"Unabletoloadlevelfile"); strcat(tmpChar,mapname.c_str()); strcat(tmpChar,"doesn'texist."); //Thisneedstobeabstractedsomehow #ifdefWIN32 MessageBox(NULL,tmpChar,"ERROR",MB_OK|MB_ICONEXCLAMATION); #endif delete[]tmpChar; returnfalse; } else { ConsolePrint("mapfile\""+mapname+"\"openedsuccessfully"); } //Gravity input>>readBuffer; gravity=(float)atof(readBuffer.c_str()); //Numberoftriangles input>>readBuffer; numTriangles=Integer(readBuffer); //TriangleData triangles=newTriangle[numTriangles]; for(unsignedinti=0;i<numTriangles;i++) { //TextureID input>>readBuffer; triangles[i].texID=Integer(readBuffer); for(unsignedinti2=0;i2<3;i2++) { //VertexData input>>readBuffer; triangles[i].vertecies[i2].x=atof(readBuffer.c_str()); input>>readBuffer; triangles[i].vertecies[i2].y=atof(readBuffer.c_str()); input>>readBuffer; triangles[i].vertecies[i2].z=atof(readBuffer.c_str()); input>>readBuffer; triangles[i].texCoords[i2].x=(float)atof(readBuffer.c_str()); input>>readBuffer; triangles[i].texCoords[i2].y=(float)atof(readBuffer.c_str()); } //Normal input>>readBuffer; triangles[i].normal.x=atof(readBuffer.c_str()); input>>readBuffer; triangles[i].normal.y=atof(readBuffer.c_str()); input>>readBuffer; triangles[i].normal.z=atof(readBuffer.c_str()); } charlpszNumTriangles[6]; sprintf(lpszNumTriangles,"%d",numTriangles); ConsolePrint(lpszNumTriangles+string("trianglessuccessfullyread")); //Numberoftextures; input>>readBuffer; numTextures=Integer(readBuffer); //Texturedata textureNames=newstring[numTextures]; for(unsignedinti=0;i<numTextures;i++) { input>>textureNames[i]; } LoadGLTextures(); charlpszNumTextures[6]; sprintf(lpszNumTextures,"%d",numTextures); ConsolePrint(lpszNumTextures+string("texturessuccessfullyread")); //BGM input>>bgm; //Builddisplaylist //Sound if(sound) { ConsolePrint("Startingsound"); //Thisneedstobeabstractedsomehow #ifdefWIN32 BASS_Init(-1,44100,BASS_DEVICE_LEAVEVOL,g_hWnd); BASS_Start(); BASS_CDInit(NULL,BASS_DEVICE_LEAVEVOL); #endif if(bgm.length()>=4) { if(toupper(bgm[0])=='C'&& toupper(bgm[1])=='D'&& toupper(bgm[2])=='A') { bgmCDA=Integer(bgm.substr(3,bgm.length())); //Thisneedstobeabstractedsomehow #ifdefWIN32 BASS_CDPlay(bgmCDA,1,0); #endif } else { bgmCDA=0; stringtmpstr=gamedir+"music/bgm/"+bgm; //Thisneedstobeabstractedsomehow #ifdefWIN32 bgmStream=BASS_StreamCreateFile(0,(void*)tmpstr.c_str(),0,0,BASS_STREAM_AUTOFREE); BASS_StreamPlay(bgmStream,1,BASS_SAMPLE_LOOP); #endif } } ConsolePrint("Soundinitcomplete"); } else { ConsolePrint("Sounddisabled"); } returntrue; } boolLevel::LoadMap() { returnLoadMap(nextLevel); } voidLevel::SaveMap(stringmapname) { ofstreamoutput; mapname=gamedir+"maps/"+mapname; if(tolower(Right(mapname,4))!=".map") mapname=mapname+".map"; output.open(mapname.c_str()); if(!output) { char*tmpChar=newchar[mapname.length()+42]; strcpy(tmpChar,"Unabletosavelevelfile"); strcat(tmpChar,mapname.c_str()); strcat(tmpChar,"alreadyexists."); //Thisneedstobeabstractedsomehow #ifdefWIN32 MessageBox(NULL,tmpChar,"ERROR",MB_OK|MB_ICONEXCLAMATION); #endif delete[]tmpChar; return; } //Gravity output<<gravity<<endl; //Numberoftriangles output<<numTriangles<<endl; //TriangleData for(unsignedinti=0;i<numTriangles;i++) { output<<triangles[i].texID<<endl; for(unsignedinti2=0;i2<3;i2++) { output<<triangles[i].vertecies[i2].x<<"" <<triangles[i].vertecies[i2].y<<"" <<triangles[i].vertecies[i2].z<<"" <<triangles[i].texCoords[i2].x<<"" <<triangles[i].texCoords[i2].y<<endl; } output<<triangles[i].normal.x<<"" <<triangles[i].normal.y<<"" <<triangles[i].normal.z<<endl; } //Numberoftextures; output<<numTextures; //Texturedata for(unsignedinti=0;i<numTextures;i++) { output<<textureNames[i]; } //BGM output<<bgm; } voidLevel::Render() { glPushMatrix(); glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); glLoadIdentity(); //Movethecameratowheretheplayeris defaultPlayer->camera.Look(); for(uint32i=0;i<numTriangles;i++) { glBindTexture(GL_TEXTURE_2D,textures[triangles[i].texID]->ID());//Bindthistriangle'stexture glBegin(GL_TRIANGLES); //glNormal3f((GLfloat)triangles[i].normal.x,(GLfloat)triangles[i].normal.y,(GLfloat)triangles[i].normal.z); for(uint32i2=0;i2<3;i2++) { glTexCoord2f(triangles[i].texCoords[i2].x, triangles[i].texCoords[i2].y); glVertex3f((GLfloat)triangles[i].vertecies[i2].x, (GLfloat)triangles[i].vertecies[i2].y, (GLfloat)triangles[i].vertecies[i2].z); } glEnd(); } glPopMatrix(); //DrawHUD //ummmnothinghereyet //DrawFPS //Thismaynotworkyet if(showFPS) { charfps[20]; sprintf(fps,"fps%d",FPS()); glPushMatrix(); glLoadIdentity(); glColor3f(1,1,1); glDisable(GL_DEPTH_TEST); glEnable(GL_BLEND); glFont.Print(glFont.ScreenWidth()-120,glFont.ScreenHeight()-30,fps,0); glDisable(GL_BLEND); glEnable(GL_DEPTH_TEST); glPopMatrix(); } if(showConsole) { glPushMatrix(); glLoadIdentity(); glColor3f(1,1,1); //disablelightinganddepthtesting glDisable(GL_DEPTH_TEST); glBindTexture(GL_TEXTURE_2D,menuTextures[GL_MY_TEXTURE_CONSOLEBACKGROUND].ID()); //glBindTexture(GL_TEXTURE_2D,4); glMatrixMode(GL_PROJECTION); glPushMatrix(); glLoadIdentity(); glOrtho(0,screen.GetWidth(),0,screen.GetHeight(),-1,1); glMatrixMode(GL_MODELVIEW); glPushMatrix(); glLoadIdentity(); glBegin(GL_QUADS); glTexCoord2f(0,0); glVertex2i(0,screen.GetHeight()/2); glTexCoord2f(0,1); glVertex2i(0,screen.GetHeight()); glTexCoord2f(1,1); glVertex2i(screen.GetWidth(),screen.GetHeight()); glTexCoord2f(1,0); glVertex2i(screen.GetWidth(),screen.GetHeight()/2); glEnd(); glMatrixMode(GL_PROJECTION); glPopMatrix(); glMatrixMode(GL_MODELVIEW); glPopMatrix(); glDisable(GL_LIGHTING); //enableblending glEnable(GL_BLEND); //rendertheconsolebackground //rendertheconsoleoutputtext unsignedinti; for(i=0;i<MAX_CONSOLE_LINES-1;i++) { Print(30,glFont.ScreenHeight()-i*20,consoleOutput[MAX_CONSOLE_LINES-i-2].c_str(),0); } //Renderthecurrentlytypedcommand Print(30,glFont.ScreenHeight()-i*20,consoleHistory[0].c_str(),0); //disableblending glDisable(GL_BLEND); //re-enablelightinganddepthtesting //glEnable(GL_LIGHTING); glEnable(GL_DEPTH_TEST); } } voidLevel::UnloadMap() { //Stopaudio //Thisneedstobeabstractedsomehow #ifdefWIN32 BASS_StreamFree(bgmStream); BASS_Stop(); BASS_CDFree(); BASS_Free(); #endif //Deletedisplaylist //Freeallpolygondata if(triangles) { delete[]triangles; triangles=NULL; } //Freeallmaptextures if(!textures.IsEmpty()) { //TODOiterateoverlistanddeleteallentries } textures.Clear(); //Freethearrayoftexturenames if(textureNames) { delete[]textureNames; textureNames=NULL; } } voidLevel::LoadGLTextures() { if(_window!=NULL) { /* GLfloatlight[4]={1.0f,1.0f,1.0f,0.5f}; glLightfv(GL_LIGHT1,GL_AMBIENT,light); glEnable(GL_LIGHT1); glEnable(GL_LIGHTING); */ textures.Clear(); for(uint32i=0;i<numTextures;i++) { Texture*texture=newTexture(); if(!texture->Load(gamedir+"textures/"+textureNames[i])) texture->Load(DEFAULT_TEXTURE_NAME); textures[i]=texture; } if(!glFont.BuildFont((gamedir+"textures/menu/font.bmp").c_str())) glFont.BuildFont("oa/textures/menu/font.bmp"); //Loadtheconsolebackgroundimage if(!menuTextures[GL_MY_TEXTURE_CONSOLEBACKGROUND].Load(gamedir+"textures/menu/con_back.tga")) { menuTextures[GL_MY_TEXTURE_CONSOLEBACKGROUND].Load("oa/textures/menu/con_back.bmp"); } } } uint32Level::FPS() { staticuint32fps=0; staticuint32fps2=0; staticfloatlast=0.0f;//mightneedtochangetodouble //hmmmwhatthehellisthiscalledinlinuxIshouldpossiblyabstractthis #ifdefWIN32 floattime=GetTickCount()*.001f; #else floattime=0; #endif ++fps; if(time>last+1) { last=time; fps2=fps; fps=0; } returnfps2; } voidLevel::Execute(stringcmd) { stringcommand; uint32i=0xFFFFFFFF; while(word(cmd,++i)!="") { command=tolower(word(cmd,i)); if(command=="set") { command=tolower(word(cmd,++i)); if(command=="turnspeed") { turnSpeed=(float)atof(word(cmd,++i).c_str());//Floating(word(cmd,++i)); } elseif(command=="movespeed") { moveSpeed=(float)atof(word(cmd,++i).c_str());//FLoating(word(cmd,++i)); } elseif(command=="mousespeed") { mouseSpeed=(float)atof(word(cmd,++i).c_str()); } elseif(command=="mouselook") { mlook=Truth(word(cmd,++i)); } elseif(command=="maxfps") { maxFPS=Integer(word(cmd,++i)); } elseif(command=="sound") { sound=Truth(word(cmd,++i)); } elseif(command=="game") { gamedir=word(cmd,++i); } elseif(command=="screenwidth") { screen.SetWidth(Integer(word(cmd,++i))); } elseif(command=="screenheight") { screen.SetHeight(Integer(word(cmd,++i))); } elseif(command=="fullscreen") { screen.SetFullscreen(Truth(word(cmd,++i))); } elseif(command=="colordepth") { screen.SetColorDepth(Integer(word(cmd,++i))); } else { ConsolePrint("Variable"+command+"doesn'texist"); } } elseif(command=="bind") { command=tolower(word(cmd,++i)); if(command=="forward") { if(!defaultPlayer[0].controls.Bind(OpenArena::ControlScheme::ACTION_FORWARD,KeyName(word(cmd,++i)))) { ConsolePrint("Couldn'tbind"+word(cmd,i)+"toactionforward"); } } elseif(command=="backward") { if(!defaultPlayer[0].controls.Bind(OpenArena::ControlScheme::ACTION_BACKWARD,KeyName(word(cmd,++i)))) { ConsolePrint("Couldn'tbind"+word(cmd,i)+"toactionbackward"); } } elseif(command=="lookleft") { if(!defaultPlayer[0].controls.Bind(OpenArena::ControlScheme::ACTION_LOOKLEFT,KeyName(word(cmd,++i)))) { ConsolePrint("Couldn'tbind"+word(cmd,i)+"toactionlookleft"); } } elseif(command=="lookright") { if(!defaultPlayer[0].controls.Bind(OpenArena::ControlScheme::ACTION_LOOKRIGHT,KeyName(word(cmd,++i)))) { ConsolePrint("Couldn'tbind"+word(cmd,i)+"toactionlookright"); } } elseif(command=="lookup") { if(!defaultPlayer[0].controls.Bind(OpenArena::ControlScheme::ACTION_LOOKUP,KeyName(word(cmd,++i)))) { ConsolePrint("Couldn'tbind"+word(cmd,i)+"toactionlookup"); } } elseif(command=="lookdown") { if(!defaultPlayer[0].controls.Bind(OpenArena::ControlScheme::ACTION_LOOKDOWN,KeyName(word(cmd,++i)))) { ConsolePrint("Couldn'tbind"+word(cmd,i)+"toactionlookdown"); } } elseif(command=="moveup") { if(!defaultPlayer[0].controls.Bind(OpenArena::ControlScheme::ACTION_MOVEUP,KeyName(word(cmd,++i)))) { ConsolePrint("Couldn'tbind"+word(cmd,i)+"toactionmoveup"); } } elseif(command=="movedown") { if(!defaultPlayer[0].controls.Bind(OpenArena::ControlScheme::ACTION_MOVEDOWN,KeyName(word(cmd,++i)))) { ConsolePrint("Couldn'tbind"+word(cmd,i)+"toactionmovedown"); } } elseif(command=="moveleft") { if(!defaultPlayer[0].controls.Bind(OpenArena::ControlScheme::ACTION_MOVELEFT,KeyName(word(cmd,++i)))) { ConsolePrint("Couldn'tbind"+word(cmd,i)+"toactionmoveleft"); } } elseif(command=="moveright") { if(!defaultPlayer[0].controls.Bind(OpenArena::ControlScheme::ACTION_MOVERIGHT,KeyName(word(cmd,++i)))) { ConsolePrint("Couldn'tbind"+word(cmd,i)+"toactionmoveright"); } } elseif(command=="fireprimary") { if(!defaultPlayer[0].controls.Bind(OpenArena::ControlScheme::ACTION_FIREPRIMARY,KeyName(word(cmd,++i)))) { ConsolePrint("Couldn'tbind"+word(cmd,i)+"toactionfireprimary"); } } elseif(command=="firesecondary") { if(!defaultPlayer[0].controls.Bind(OpenArena::ControlScheme::ACTION_FIRESECONDARY,KeyName(word(cmd,++i)))) { ConsolePrint("Couldn'tbind"+word(cmd,i)+"toactionfiresecondary"); } } elseif(command=="weapnext") { if(!defaultPlayer[0].controls.Bind(OpenArena::ControlScheme::ACTION_WEAPONNEXT,KeyName(word(cmd,++i)))) { ConsolePrint("Couldn'tbind"+word(cmd,i)+"toactionweapnext"); } } elseif(command=="weapprev") { if(!defaultPlayer[0].controls.Bind(OpenArena::ControlScheme::ACTION_WEAPONPREV,KeyName(word(cmd,++i)))) { ConsolePrint("Couldn'tbind"+word(cmd,i)+"toactionweapprev"); } } elseif(command=="togglelights"||command=="togglelighting") { if(!defaultPlayer[0].controls.Bind(OpenArena::ControlScheme::ACTION_TOGGLE_LIGHTS,KeyName(word(cmd,++i)))) { ConsolePrint("Couldn'tbind"+word(cmd,i)+"toactiontogglelights"); } } elseif(command=="togglefps") { if(!defaultPlayer[0].controls.Bind(OpenArena::ControlScheme::ACTION_TOGGLE_FPS,KeyName(word(cmd,++i)))) { ConsolePrint("Couldn'tbind"+word(cmd,i)+"toactiontogglefps"); } } elseif(command=="toggleconsole") { if(!defaultPlayer[0].controls.Bind(OpenArena::ControlScheme::ACTION_TOGGLE_CONSOLE,KeyName(word(cmd,++i)))) { ConsolePrint("Couldn'tbind"+word(cmd,i)+"toactiontoggleconsole"); } } elseif(command=="togglemouselook") { if(!defaultPlayer[0].controls.Bind(OpenArena::ControlScheme::ACTION_TOGGLE_MOUSELOOK,KeyName(word(cmd,++i)))) { ConsolePrint("Couldn'tbind"+word(cmd,i)+"toactiontogglemouselook"); } } elseif(command=="quickmouselook") { if(!defaultPlayer[0].controls.Bind(OpenArena::ControlScheme::ACTION_QUICKMOUSELOOK,KeyName(word(cmd,++i)))) { ConsolePrint("Couldn'tbind"+word(cmd,i)+"toactionquickmouselook"); } } elseif(command=="rollleft") { if(!defaultPlayer[0].controls.Bind(OpenArena::ControlScheme::ACTION_ROLLLEFT,KeyName(word(cmd,++i)))) { ConsolePrint("Couldn'tbind"+word(cmd,i)+"toactionrollleft"); } } elseif(command=="rollright") { if(!defaultPlayer[0].controls.Bind(OpenArena::ControlScheme::ACTION_ROLLRIGHT,KeyName(word(cmd,++i)))) { ConsolePrint("Couldn'tbind"+word(cmd,i)+"toactionrollright"); } } else { ConsolePrint("Noactionidentifiedby"+command); } } elseif(command=="map"||command=="map_load") { nextLevel=word(cmd,++i); UnloadMap(); if(!LoadMap()) { ConsolePrint("Unabletoloadlevel"+command); nextLevel="intro.map"; LoadMap(); } } elseif(command=="unbind") { command=tolower(word(cmd,++i)); if(command=="all") { defaultPlayer[0].controls.ClearControlScheme(); } else { defaultPlayer[0].controls.Unbind(KeyName(command)); } } elseif(command=="exec"||command=="config_load") { command=tolower(word(cmd,++i)); if(!LoadConfig(command)) { ConsolePrint("Unabletoloadconfigfile"+word(cmd,i)); } } elseif(command=="map_save") { command=tolower(word(cmd,++i)); SaveMap(command); } elseif(command=="config_save") { command=tolower(word(cmd,++i)); SaveConfig(command); } /* elseif(command=="map_add_triangle") { if(triangles!=NULL) { TRIANGLE*temp=triangles; triangles=newTRIANGLE[numTriangles+1]; for(inti=0;i<numTriangles;i++) { triangles[i]=temp[i]; } triangles[numTriangles].texID=0; for(inti=0;i<3;i++) { triangles[numTriangles].vertecies[i].x=0; triangles[numTriangles].vertecies[i].y=0; triangles[numTriangles].vertecies[i].z=0; triangles[numTriangles].texCoords[i].x=0; triangles[numTriangles].texCoords[i].y=0; } numTriangles++; } else { } } */ elseif(command=="quit") { //Thisneedstobeabstractedsomehow #ifdefWIN32 PostQuitMessage(0); #endif } else { ConsolePrint("Unknowncommand"+command); } } } voidLevel::ParseCmds(constchar*lpCmdLine) { stringcmd=lpCmdLine; stringcommand; uint32i=0xFFFFFFFF; while(word(cmd,++i)!="") { command=word(cmd,i); if(command=="+set") { command=tolower(word(cmd,++i)); if(command=="turnspeed") { turnSpeed=(float)atof(word(cmd,++i).c_str()); } elseif(command=="mousespeed") { mouseSpeed=(float)atof(word(cmd,++i).c_str()); } elseif(command=="maxfps") { maxFPS=Integer(word(cmd,++i)); } elseif(command=="sound") { sound=Truth(word(cmd,++i)); } elseif(command=="game") { gamedir=word(cmd,++i); } } elseif(command=="+bind") { command=tolower(word(cmd,++i)); if(command=="forward") { defaultPlayer[0].controls.Bind(OpenArena::ControlScheme::ACTION_FORWARD,KeyName(word(cmd,++i))); } elseif(command=="backward") { defaultPlayer[0].controls.Bind(OpenArena::ControlScheme::ACTION_BACKWARD,KeyName(word(cmd,++i))); } elseif(command=="lookleft") { defaultPlayer[0].controls.Bind(OpenArena::ControlScheme::ACTION_LOOKLEFT,KeyName(word(cmd,++i))); } elseif(command=="lookright") { defaultPlayer[0].controls.Bind(OpenArena::ControlScheme::ACTION_LOOKRIGHT,KeyName(word(cmd,++i))); } elseif(command=="lookup") { defaultPlayer[0].controls.Bind(OpenArena::ControlScheme::ACTION_LOOKUP,KeyName(word(cmd,++i))); } elseif(command=="lookdown") { defaultPlayer[0].controls.Bind(OpenArena::ControlScheme::ACTION_LOOKDOWN,KeyName(word(cmd,++i))); } elseif(command=="moveup") { defaultPlayer[0].controls.Bind(OpenArena::ControlScheme::ACTION_MOVEUP,KeyName(word(cmd,++i))); } elseif(command=="movedown") { defaultPlayer[0].controls.Bind(OpenArena::ControlScheme::ACTION_MOVEDOWN,KeyName(word(cmd,++i))); } elseif(command=="moveleft") { defaultPlayer[0].controls.Bind(OpenArena::ControlScheme::ACTION_MOVELEFT,KeyName(word(cmd,++i))); } elseif(command=="moveright") { defaultPlayer[0].controls.Bind(OpenArena::ControlScheme::ACTION_MOVERIGHT,KeyName(word(cmd,++i))); } elseif(command=="fireprimary") { defaultPlayer[0].controls.Bind(OpenArena::ControlScheme::ACTION_FIREPRIMARY,KeyName(word(cmd,++i))); } elseif(command=="firesecondary") { defaultPlayer[0].controls.Bind(OpenArena::ControlScheme::ACTION_FIRESECONDARY,KeyName(word(cmd,++i))); } elseif(command=="weapnext") { defaultPlayer[0].controls.Bind(OpenArena::ControlScheme::ACTION_WEAPONNEXT,KeyName(word(cmd,++i))); } elseif(command=="weapprev") { defaultPlayer[0].controls.Bind(OpenArena::ControlScheme::ACTION_WEAPONPREV,KeyName(word(cmd,++i))); } elseif(command=="togglelights"||command=="togglelighting") { defaultPlayer[0].controls.Bind(OpenArena::ControlScheme::ACTION_TOGGLE_LIGHTS,KeyName(word(cmd,++i))); } elseif(command=="togglefps") { defaultPlayer[0].controls.Bind(OpenArena::ControlScheme::ACTION_TOGGLE_FPS,KeyName(word(cmd,++i))); } elseif(command=="toggleconsole") { defaultPlayer[0].controls.Bind(OpenArena::ControlScheme::ACTION_TOGGLE_CONSOLE,KeyName(word(cmd,++i))); } elseif(command=="togglemouselook") { defaultPlayer[0].controls.Bind(OpenArena::ControlScheme::ACTION_TOGGLE_MOUSELOOK,KeyName(word(cmd,++i))); } elseif(command=="quickmouselook") { defaultPlayer[0].controls.Bind(OpenArena::ControlScheme::ACTION_QUICKMOUSELOOK,KeyName(word(cmd,++i))); } } elseif(command=="+map"||command=="+map_load") { nextLevel=word(cmd,++i); UnloadMap(); LoadMap(); } elseif(command=="+unbind") { command=tolower(word(cmd,++i)); if(command=="all") { defaultPlayer[0].controls.ClearControlScheme(); } else { defaultPlayer[0].controls.Unbind(KeyName(command)); } } elseif(command=="+exec"||command=="+config_load") { command=tolower(word(cmd,++i)); LoadConfig(command); } elseif(command=="+map_save") { command=tolower(word(cmd,++i)); SaveMap(command); } elseif(command=="+config_save") { command=tolower(word(cmd,++i)); SaveConfig(command); } } } voidLevel::LoadConfig() { showFPS=false; nextLevel="intro.map"; gamedir="oa/"; sound=true; mouseSpeed=5; turnSpeed=1.0f; moveSpeed=.2f; mlook=true; } boolLevel::LoadConfig(stringcfgname) { ifstreaminput; stringreadBuffer; cfgname=gamedir+"config/"+cfgname; if(tolower(Right(cfgname,4))!=".cfg") cfgname=cfgname+".cfg"; input.open(cfgname.c_str()); if(!input) returnfalse; getline(input,readBuffer); while(input) { uint32i=0xFFFFFFFF; if(readBuffer[0]=='/'&&readBuffer[1]=='/') { getline(input,readBuffer); } Execute(readBuffer); getline(input,readBuffer); } returntrue; } voidLevel::SaveConfig(stringcfgname) { ofstreamoutput; cfgname=gamedir+"config/"+cfgname; if(tolower(Right(cfgname,4))!=".cfg") cfgname=cfgname+".cfg"; output.open(cfgname.c_str()); if(!output) return; //ClientConfig output<<"setturnspeed"<<turnSpeed<<endl; output<<"setmousespeed"<<mouseSpeed<<endl; output<<"setmouselook"<<mlook<<endl; output<<"setscreenwidth"<<screen.GetWidth()<<endl; output<<"setscreenheight"<<screen.GetHeight()<<endl; output<<"setcolordepth"<<screen.GetColorDepth()<<endl; output<<"setfullscreen"<<screen.GetFullscreen()<<endl; output<<"setmaxfps"<<maxFPS<<endl; //ControlScheme //output<<"bind"<<action<<keyname<<endl; if(!defaultPlayer->controls.backward.IsEmpty()) { defaultPlayer->controls.backward.FirstPosition(); output<<"bindbackward"<<string(KeyString(defaultPlayer->controls.backward.Retrieve()))<<endl; while(defaultPlayer->controls.backward.NextPosition()) output<<"bindbackward"<<KeyString(defaultPlayer->controls.backward.Retrieve())<<endl; } if(!defaultPlayer->controls.firePrimary.IsEmpty()) { defaultPlayer->controls.firePrimary.FirstPosition(); output<<"bindfirePrimary"<<KeyString(defaultPlayer->controls.firePrimary.Retrieve())<<endl; while(defaultPlayer->controls.firePrimary.NextPosition()) output<<"bindfirePrimary"<<KeyString(defaultPlayer->controls.firePrimary.Retrieve())<<endl; } if(!defaultPlayer->controls.fireSecondary.IsEmpty()) { defaultPlayer->controls.fireSecondary.FirstPosition(); output<<"bindfireSecondary"<<KeyString(defaultPlayer->controls.fireSecondary.Retrieve())<<endl; while(defaultPlayer->controls.fireSecondary.NextPosition()) output<<"bindfireSecondary"<<KeyString(defaultPlayer->controls.fireSecondary.Retrieve())<<endl; } if(!defaultPlayer->controls.forward.IsEmpty()) { defaultPlayer->controls.forward.FirstPosition(); output<<"bindforward"<<KeyString(defaultPlayer->controls.forward.Retrieve())<<endl; while(defaultPlayer->controls.forward.NextPosition()) output<<"bindforward"<<KeyString(defaultPlayer->controls.forward.Retrieve())<<endl; } if(!defaultPlayer->controls.lookDown.IsEmpty()) { defaultPlayer->controls.lookDown.FirstPosition(); output<<"bindlookDown"<<KeyString(defaultPlayer->controls.lookDown.Retrieve())<<endl; while(defaultPlayer->controls.lookDown.NextPosition()) output<<"bindlookDown"<<KeyString(defaultPlayer->controls.lookDown.Retrieve())<<endl; } if(!defaultPlayer->controls.lookLeft.IsEmpty()) { defaultPlayer->controls.lookLeft.FirstPosition(); output<<"bindlookLeft"<<KeyString(defaultPlayer->controls.lookLeft.Retrieve())<<endl; while(defaultPlayer->controls.lookLeft.NextPosition()) output<<"bindlookLeft"<<KeyString(defaultPlayer->controls.lookLeft.Retrieve())<<endl; } if(!defaultPlayer->controls.lookRight.IsEmpty()) { defaultPlayer->controls.lookRight.FirstPosition(); output<<"bindlookRight"<<KeyString(defaultPlayer->controls.lookRight.Retrieve())<<endl; while(defaultPlayer->controls.lookRight.NextPosition()) output<<"bindlookRight"<<KeyString(defaultPlayer->controls.lookRight.Retrieve())<<endl; } if(!defaultPlayer->controls.lookUp.IsEmpty()) { defaultPlayer->controls.lookUp.FirstPosition(); output<<"bindlookUp"<<KeyString(defaultPlayer->controls.lookUp.Retrieve())<<endl; while(defaultPlayer->controls.lookUp.NextPosition()) output<<"bindlookUp"<<KeyString(defaultPlayer->controls.lookUp.Retrieve())<<endl; } if(!defaultPlayer->controls.moveDown.IsEmpty()) { defaultPlayer->controls.moveDown.FirstPosition(); output<<"bindmoveDown"<<KeyString(defaultPlayer->controls.moveDown.Retrieve())<<endl; while(defaultPlayer->controls.moveDown.NextPosition()) output<<"bindmoveDown"<<KeyString(defaultPlayer->controls.moveDown.Retrieve())<<endl; } if(!defaultPlayer->controls.moveLeft.IsEmpty()) { defaultPlayer->controls.moveLeft.FirstPosition(); output<<"bindmoveLeft"<<KeyString(defaultPlayer->controls.moveLeft.Retrieve())<<endl; while(defaultPlayer->controls.moveLeft.NextPosition()) output<<"bindmoveLeft"<<KeyString(defaultPlayer->controls.moveLeft.Retrieve())<<endl; } if(!defaultPlayer->controls.moveRight.IsEmpty()) { defaultPlayer->controls.moveRight.FirstPosition(); output<<"bindmoveRight"<<KeyString(defaultPlayer->controls.moveRight.Retrieve())<<endl; while(defaultPlayer->controls.moveRight.NextPosition()) output<<"bindmoveRight"<<KeyString(defaultPlayer->controls.moveRight.Retrieve())<<endl; } if(!defaultPlayer->controls.moveUp.IsEmpty()) { defaultPlayer->controls.moveUp.FirstPosition(); output<<"bindmoveUp"<<KeyString(defaultPlayer->controls.moveUp.Retrieve())<<endl; while(defaultPlayer->controls.moveUp.NextPosition()) output<<"bindmoveUp"<<KeyString(defaultPlayer->controls.moveUp.Retrieve())<<endl; } if(!defaultPlayer->controls.quickMouseLook.IsEmpty()) { defaultPlayer->controls.quickMouseLook.FirstPosition(); output<<"bindquickMouseLook"<<KeyString(defaultPlayer->controls.quickMouseLook.Retrieve())<<endl; while(defaultPlayer->controls.quickMouseLook.NextPosition()) output<<"bindquickMouseLook"<<KeyString(defaultPlayer->controls.quickMouseLook.Retrieve())<<endl; } if(!defaultPlayer->controls.rollLeft.IsEmpty()) { defaultPlayer->controls.rollLeft.FirstPosition(); output<<"bindrollLeft"<<KeyString(defaultPlayer->controls.rollLeft.Retrieve())<<endl; while(defaultPlayer->controls.rollLeft.NextPosition()) output<<"bindrollLeft"<<KeyString(defaultPlayer->controls.rollLeft.Retrieve())<<endl; } if(!defaultPlayer->controls.rollRight.IsEmpty()) { defaultPlayer->controls.rollRight.FirstPosition(); output<<"bindrollRight"<<KeyString(defaultPlayer->controls.rollRight.Retrieve())<<endl; while(defaultPlayer->controls.rollRight.NextPosition()) output<<"bindrollRight"<<KeyString(defaultPlayer->controls.rollRight.Retrieve())<<endl; } if(!defaultPlayer->controls.toggleConsole.IsEmpty()) { defaultPlayer->controls.toggleConsole.FirstPosition(); output<<"bindtoggleConsole"<<KeyString(defaultPlayer->controls.toggleConsole.Retrieve())<<endl; while(defaultPlayer->controls.toggleConsole.NextPosition()) output<<"bindtoggleConsole"<<KeyString(defaultPlayer->controls.toggleConsole.Retrieve())<<endl; } if(!defaultPlayer->controls.toggleFPS.IsEmpty()) { defaultPlayer->controls.toggleFPS.FirstPosition(); output<<"bindtoggleFPS"<<KeyString(defaultPlayer->controls.toggleFPS.Retrieve())<<endl; while(defaultPlayer->controls.toggleFPS.NextPosition()) output<<"bindtoggleFPS"<<KeyString(defaultPlayer->controls.toggleFPS.Retrieve())<<endl; } if(!defaultPlayer->controls.toggleLights.IsEmpty()) { defaultPlayer->controls.toggleLights.FirstPosition(); output<<"bindtoggleLights"<<KeyString(defaultPlayer->controls.toggleLights.Retrieve())<<endl; while(defaultPlayer->controls.toggleLights.NextPosition()) output<<"bindtoggleLights"<<KeyString(defaultPlayer->controls.toggleLights.Retrieve())<<endl; } if(!defaultPlayer->controls.toggleMouseLook.IsEmpty()) { defaultPlayer->controls.toggleMouseLook.FirstPosition(); output<<"bindtoggleMouseLook"<<KeyString(defaultPlayer->controls.toggleMouseLook.Retrieve())<<endl; while(defaultPlayer->controls.toggleMouseLook.NextPosition()) output<<"bindtoggleMouseLook"<<KeyString(defaultPlayer->controls.toggleMouseLook.Retrieve())<<endl; } if(!defaultPlayer->controls.weaponNext.IsEmpty()) { defaultPlayer->controls.weaponNext.FirstPosition(); output<<"bindweaponNext"<<KeyString(defaultPlayer->controls.weaponNext.Retrieve())<<endl; while(defaultPlayer->controls.weaponNext.NextPosition()) output<<"bindweaponNext"<<KeyString(defaultPlayer->controls.weaponNext.Retrieve())<<endl; } if(!defaultPlayer->controls.weaponPrev.IsEmpty()) { defaultPlayer->controls.weaponPrev.FirstPosition(); output<<"bindweaponPrev"<<KeyString(defaultPlayer->controls.weaponPrev.Retrieve())<<endl; while(defaultPlayer->controls.weaponPrev.NextPosition()) output<<"bindweaponPrev"<<KeyString(defaultPlayer->controls.weaponPrev.Retrieve())<<endl; } } voidLevel::Print(intx,inty,constchar*str,unsignedintset) { glFont.Print(x,y,str,set); } voidLevel::UpdateConsole(charnewChar) { if(newChar=='\n') { for(inti=MAX_CONSOLE_HISTORY_LINES-1;i>0;i--) { consoleHistory[i]=consoleHistory[i-1]; } consoleHistory[0]=""; ConsolePrint(consoleHistory[1]); Execute(tolower(consoleHistory[1])); } elseif(newChar==OpenArena::KEY_BACK) { consoleHistory[0]=Left(consoleHistory[0],consoleHistory[0].length()-1); } elseif(!(defaultPlayer->controls.toggleConsole.Contains(newChar))) { consoleHistory[0]=consoleHistory[0]+newChar; /* charerrmsg[256]; sprintf(errmsg,"Unhangledkeypress:%d",newChar); MessageBox(NULL,errmsg,"Balls",MB_OK); */ } } voidLevel::ConsolePrint(stringline) { for(inti=MAX_CONSOLE_OUTPUT_LINES-1;i>0;i--) { consoleOutput[i]=consoleOutput[i-1]; } consoleOutput[0]=line; } voidLevel::SetWindow(Window*window) { _window=window; } Window*Level::GetWindow() { return_window; } };