extern bool buttons[3];
extern float multiplier;
-extern float screenwidth,screenheight;
extern float sps;
extern float realmultiplier;
extern int slomo;
-extern bool ismotionblur;
-extern float usermousesensitivity;
-extern int detail;
-extern bool floatjump;
extern bool cellophane;
// MODIFIED GWC
//extern int terraindetail;
//extern int texdetail;
extern float terraindetail;
extern float texdetail;
-extern int bloodtoggle;
+
extern bool osx;
-extern bool autoslomo;
-extern bool foliage;
-extern bool musictoggle;
-extern bool trilinear;
-extern float gamespeed;
-extern int difficulty;
-extern bool damageeffects;
extern int numplayers;
-extern bool decals;
-extern bool invertmouse;
-extern bool texttoggle;
-extern bool ambientsound;
-extern bool mousejump;
extern bool freeze;
extern Person player[maxplayers];
-extern bool vblsync;
extern bool stillloading;
-extern bool showpoints;
-extern bool alwaysblur;
-extern bool immediate;
-extern bool velocityblur;
-extern bool debugmode;
extern int mainmenu;
/*extern*/ bool gameFocused;
-extern int kBitsPerPixel;
+
extern float slomospeed;
extern float slomofreq;
-extern float oldgamespeed;
-extern float volume;
+
+
#include <math.h>
#include <stdio.h>
#include <iostream>
#include "gamegl.h"
#include "MacCompatibility.h"
-
+#include "Settings.h"
#ifdef WIN32
#include <shellapi.h>
unsigned int resolutionDepths[8][2] = {0};
-bool selectDetail(int & width, int & height, int & bpp, int & detail);
int closestResolution(int width, int height);
int resolutionID(int width, int height);
void ReportError (char * strError);
-void SetupDSpFullScreen();
-void ShutdownDSp();
-
void DrawGL(Game & game);
void CreateGLWindow (void);
void sdlGetCursorPos(POINT *pt)
{
- int x, y;
- SDL_GetMouseState(&x, &y);
- pt->x = x;
- pt->y = y;
+ SDL_GetMouseState(&(pt->x), &(pt->y));
}
#define GetCursorPos(x) sdlGetCursorPos(x)
#define SetCursorPos(x, y) SDL_WarpMouse(x, y)
*/
}
-void SetupDSpFullScreen ()
-{
-}
-
-
-void ShutdownDSp ()
-{
-}
-
-
//-----------------------------------------------------------------------------------------------------------------------
// OpenGL Drawing
randSeed = UpTime().lo;
osx = 0;
- ifstream ipstream(ConvertFileName(":Data:config.txt"), std::ios::in /*| std::ios::nocreate*/);
- detail=1;
- ismotionblur=0;
- usermousesensitivity=1;
- kContextWidth=640;
- kContextHeight=480;
- kBitsPerPixel = 32;
- floatjump=0;
cellophane=0;
texdetail=4;
- autoslomo=1;
- decals=1;
- invertmouse=0;
- bloodtoggle=0;
terraindetail=2;
- foliage=1;
- musictoggle=1;
- trilinear=1;
- gamespeed=1;
- difficulty=1;
- damageeffects=0;
- texttoggle=1;
- alwaysblur=0;
- showpoints=0;
- immediate=0;
- velocityblur=0;
-
slomospeed=0.25;
slomofreq=8012;
-
- volume = 0.8f;
-
- game.crouchkey=MAC_SHIFT_KEY;
- game.jumpkey=MAC_SPACE_KEY;
- game.leftkey=MAC_A_KEY;
- game.forwardkey=MAC_W_KEY;
- game.backkey=MAC_S_KEY;
- game.rightkey=MAC_D_KEY;
- game.drawkey=MAC_E_KEY;
- game.throwkey=MAC_Q_KEY;
- game.attackkey=MAC_MOUSEBUTTON1;
- game.chatkey=MAC_T_KEY;
numplayers=1;
- ambientsound=1;
- vblsync=0;
- debugmode=0;
-
- selectDetail(kContextWidth, kContextHeight, kBitsPerPixel, detail);
-
- if(!ipstream) {
- ofstream opstream(ConvertFileName(":Data:config.txt", "w"));
- opstream << "Screenwidth:\n";
- opstream << kContextWidth;
- opstream << "\nScreenheight:\n";
- opstream << kContextHeight;
- opstream << "\nMouse sensitivity:\n";
- opstream << usermousesensitivity;
- opstream << "\nBlur(0,1):\n";
- opstream << ismotionblur;
- opstream << "\nOverall Detail(0,1,2) higher=better:\n";
- opstream << detail;
- 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";
- opstream << gamespeed;
- 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(game.forwardkey);
- opstream << "\nBack key:\n";
- opstream << KeyToChar(game.backkey);
- opstream << "\nLeft key:\n";
- opstream << KeyToChar(game.leftkey);
- opstream << "\nRight key:\n";
- opstream << KeyToChar(game.rightkey);
- opstream << "\nJump key:\n";
- opstream << KeyToChar(game.jumpkey);
- opstream << "\nCrouch key:\n";
- opstream << KeyToChar(game.crouchkey);
- opstream << "\nDraw key:\n";
- opstream << KeyToChar(game.drawkey);
- opstream << "\nThrow key:\n";
- opstream << KeyToChar(game.throwkey);
- opstream << "\nAttack key:\n";
- opstream << KeyToChar(game.attackkey);
- opstream << "\nChat key:\n";
- opstream << KeyToChar(game.chatkey);
- opstream << "\nStereoMode:\n";
- opstream << stereomode;
- opstream << "\nStereoSeparation:\n";
- opstream << stereoseparation;
- opstream << "\nStereoReverse:\n";
- opstream << stereoreverse;
- opstream.close();
- }
- if(ipstream){
- int i;
- ipstream.ignore(256,'\n');
- ipstream >> kContextWidth;
- ipstream.ignore(256,'\n');
- ipstream.ignore(256,'\n');
- ipstream >> kContextHeight;
- ipstream.ignore(256,'\n');
- ipstream.ignore(256,'\n');
- ipstream >> usermousesensitivity;
- ipstream.ignore(256,'\n');
- ipstream.ignore(256,'\n');
- ipstream >> i;
- ismotionblur = (i != 0);
- ipstream.ignore(256,'\n');
- ipstream.ignore(256,'\n');
- ipstream >> detail;
- if(detail!=0)kBitsPerPixel=32;
- else kBitsPerPixel=16;
- ipstream.ignore(256,'\n');
- ipstream.ignore(256,'\n');
- ipstream >> i;
- floatjump = (i != 0);
- ipstream.ignore(256,'\n');
- ipstream.ignore(256,'\n');
- ipstream >> i;
- mousejump = (i != 0);
- ipstream.ignore(256,'\n');
- ipstream.ignore(256,'\n');
- ipstream >> i;
- ambientsound = (i != 0);
- ipstream.ignore(256,'\n');
- ipstream.ignore(256,'\n');
- ipstream >> bloodtoggle;
- ipstream.ignore(256,'\n');
- ipstream.ignore(256,'\n');
- ipstream >> i;
- autoslomo = (i != 0);
- ipstream.ignore(256,'\n');
- ipstream.ignore(256,'\n');
- ipstream >> i;
- foliage = (i != 0);
- ipstream.ignore(256,'\n');
- ipstream.ignore(256,'\n');
- ipstream >> i;
- musictoggle = (i != 0);
- ipstream.ignore(256,'\n');
- ipstream.ignore(256,'\n');
- ipstream >> i;
- trilinear = (i != 0);
- ipstream.ignore(256,'\n');
- ipstream.ignore(256,'\n');
- ipstream >> i;
- decals = (i != 0);
- ipstream.ignore(256,'\n');
- ipstream.ignore(256,'\n');
- ipstream >> i;
- invertmouse = (i != 0);
- ipstream.ignore(256,'\n');
- ipstream.ignore(256,'\n');
- ipstream >> gamespeed;
- oldgamespeed=gamespeed;
- if(oldgamespeed==0){
- gamespeed=1;
- oldgamespeed=1;
- }
- ipstream.ignore(256,'\n');
- ipstream.ignore(256,'\n');
- ipstream >> difficulty;
- ipstream.ignore(256,'\n');
- ipstream.ignore(256,'\n');
- ipstream >> i;
- damageeffects = (i != 0);
- ipstream.ignore(256,'\n');
- ipstream.ignore(256,'\n');
- ipstream >> i;
- texttoggle = (i != 0);
- ipstream.ignore(256,'\n');
- ipstream.ignore(256,'\n');
- ipstream >> i;
- debugmode = (i != 0);
- ipstream.ignore(256,'\n');
- ipstream.ignore(256,'\n');
- ipstream >> i;
- vblsync = (i != 0);
- ipstream.ignore(256,'\n');
- ipstream.ignore(256,'\n');
- ipstream >> i;
- showpoints = (i != 0);
- ipstream.ignore(256,'\n');
- ipstream.ignore(256,'\n');
- ipstream >> i;
- alwaysblur = (i != 0);
- ipstream.ignore(256,'\n');
- ipstream.ignore(256,'\n');
- ipstream >> i;
- immediate = (i != 0);
- ipstream.ignore(256,'\n');
- ipstream.ignore(256,'\n');
- ipstream >> i;
- velocityblur = (i != 0);
- ipstream.ignore(256,'\n');
- ipstream.ignore(256,'\n');
- ipstream >> volume;
- ipstream.ignore(256,'\n');
- ipstream.ignore(256,'\n');
- ipstream >> string;
- game.forwardkey=CharToKey(string);
- ipstream.ignore(256,'\n');
- ipstream.ignore(256,'\n');
- ipstream >> string;
- game.backkey=CharToKey(string);
- ipstream.ignore(256,'\n');
- ipstream.ignore(256,'\n');
- ipstream >> string;
- game.leftkey=CharToKey(string);
- ipstream.ignore(256,'\n');
- ipstream.ignore(256,'\n');
- ipstream >> string;
- game.rightkey=CharToKey(string);
- ipstream.ignore(256,'\n');
- ipstream.ignore(256,'\n');
- ipstream >> string;
- game.jumpkey=CharToKey(string);
- ipstream.ignore(256,'\n');
- ipstream.ignore(256,'\n');
- ipstream >> string;
- game.crouchkey=CharToKey(string);
- ipstream.ignore(256,'\n');
- ipstream.ignore(256,'\n');
- ipstream >> string;
- game.drawkey=CharToKey(string);
- ipstream.ignore(256,'\n');
- ipstream.ignore(256,'\n');
- ipstream >> string;
- game.throwkey=CharToKey(string);
- ipstream.ignore(256,'\n');
- ipstream.ignore(256,'\n');
- ipstream >> string;
- game.attackkey=CharToKey(string);
- ipstream.ignore(256,'\n');
- ipstream.ignore(256,'\n');
- ipstream >> string;
- game.chatkey=CharToKey(string);
- ipstream.ignore(256,'\n');
- ipstream.ignore(256,'\n');
- ipstream >> i;
- stereomode = (StereoMode)i;
- ipstream.ignore(256,'\n');
- ipstream.ignore(256,'\n');
- ipstream >> stereoseparation;
- ipstream.ignore(256,'\n');
- ipstream.ignore(256,'\n');
- ipstream >> stereoreverse;
-
- ipstream.close();
-
- if(detail>2)detail=2;
- if(detail<0)detail=0;
- if(screenwidth<0)screenwidth=640;
- if(screenheight<0)screenheight=480;
-
- }
- if(kBitsPerPixel!=32&&kBitsPerPixel!=16){
- kBitsPerPixel=16;
- }
-
-
- selectDetail(kContextWidth, kContextHeight, kBitsPerPixel, detail);
-
- SetupDSpFullScreen();
-
+
+ DefaultSettings(game);
if (!SDL_WasInit(SDL_INIT_VIDEO))
- {
if (SDL_Init(SDL_INIT_VIDEO) == -1)
{
fprintf(stderr, "SDL_Init() failed: %s\n", SDL_GetError());
return false;
}
+ if(!LoadSettings(game)) {
+ fprintf(stderr, "Failed to load config, creating default\n");
+ SaveSettings(game);
+ }
+ if(kBitsPerPixel!=32&&kBitsPerPixel!=16){
+ kBitsPerPixel=16;
+ }
- if (SDL_GL_LoadLibrary(NULL) == -1)
- {
- fprintf(stderr, "SDL_GL_LoadLibrary() failed: %s\n", SDL_GetError());
- SDL_Quit();
- return false;
- }
+ if (SDL_GL_LoadLibrary(NULL) == -1)
+ {
+ fprintf(stderr, "SDL_GL_LoadLibrary() failed: %s\n", SDL_GetError());
+ SDL_Quit();
+ return false;
+ }
- SDL_Rect **res = SDL_ListModes(NULL, SDL_FULLSCREEN|SDL_OPENGL);
- if ( (res == NULL) || (res == ((SDL_Rect **)-1)) || (res[0] == NULL) || (res[0]->w < 640) || (res[0]->h < 480) )
- res = hardcoded_resolutions;
+ SDL_Rect **res = SDL_ListModes(NULL, SDL_FULLSCREEN|SDL_OPENGL);
+ if ( (res == NULL) || (res == ((SDL_Rect **)-1)) || (res[0] == NULL) || (res[0]->w < 640) || (res[0]->h < 480) )
+ res = hardcoded_resolutions;
- // reverse list (it was sorted biggest to smallest by SDL)...
- int count;
- for (count = 0; res[count]; count++)
- {
- if ((res[count]->w < 640) || (res[count]->h < 480))
- break; // sane lower limit.
- }
+ // reverse list (it was sorted biggest to smallest by SDL)...
+ int count;
+ for (count = 0; res[count]; count++)
+ {
+ if ((res[count]->w < 640) || (res[count]->h < 480))
+ break; // sane lower limit.
+ }
- static SDL_Rect *resolutions_block = NULL;
- resolutions_block = (SDL_Rect*) realloc(resolutions_block, sizeof (SDL_Rect) * count);
- resolutions = (SDL_Rect**) realloc(resolutions, sizeof (SDL_Rect *) * (count + 1));
- if ((resolutions_block == NULL) || (resolutions == NULL))
- {
- SDL_Quit();
- fprintf(stderr, "Out of memory!\n");
- return false;
- }
+ static SDL_Rect *resolutions_block = NULL;
+ resolutions_block = (SDL_Rect*) realloc(resolutions_block, sizeof (SDL_Rect) * count);
+ resolutions = (SDL_Rect**) realloc(resolutions, sizeof (SDL_Rect *) * (count + 1));
+ if ((resolutions_block == NULL) || (resolutions == NULL))
+ {
+ SDL_Quit();
+ fprintf(stderr, "Out of memory!\n");
+ return false;
+ }
- resolutions[count--] = NULL;
- for (int i = 0; count >= 0; i++, count--)
- {
- memcpy(&resolutions_block[count], res[i], sizeof (SDL_Rect));
- resolutions[count] = &resolutions_block[count];
- }
+ resolutions[count--] = NULL;
+ for (int i = 0; count >= 0; i++, count--)
+ {
+ memcpy(&resolutions_block[count], res[i], sizeof (SDL_Rect));
+ resolutions[count] = &resolutions_block[count];
+ }
- if (cmdline("showresolutions"))
- {
- printf("Resolutions we think are okay:\n");
- for (int i = 0; resolutions[i]; i++)
- printf(" %d x %d\n", (int) resolutions[i]->w, (int) resolutions[i]->h);
- }
- }
+ if (cmdline("showresolutions"))
+ {
+ printf("Resolutions we think are okay:\n");
+ for (int i = 0; resolutions[i]; i++)
+ printf(" %d x %d\n", (int) resolutions[i]->w, (int) resolutions[i]->h);
+ }
Uint32 sdlflags = SDL_OPENGL;
if (!cmdline("windowed"))
game.newscreenwidth=screenwidth;
game.newscreenheight=screenheight;
- GLint stencilbits = 0;
- glGetIntegerv(GL_STENCIL_BITS, &stencilbits);
- if ( stencilbits < 1 ) {
- fprintf(stderr, "Failed to get a stencil buffer!\n");
- SDL_Quit();
- return false;
- }
-
- if ( stereomode == stereoHorizontalInterlaced || stereomode == stereoVerticalInterlaced ) {
- fprintf(stderr, "Stencil buffer has %i bits, good.\n", stencilbits);
- fprintf(stderr, "Screen width is %i, height is %i\n", kContextWidth, kContextHeight);
-
- glEnable( GL_STENCIL_TEST);
- glClearStencil(0);
- glClear( GL_STENCIL_BUFFER_BIT );
- glStencilFunc(GL_ALWAYS, 0x1, 0x1);
- glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE);
-
-
- glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
- glPixelStorei(GL_UNPACK_ROW_LENGTH, 3);
- glPixelStorei(GL_UNPACK_SKIP_ROWS, 0);
- glPixelStorei(GL_UNPACK_SKIP_PIXELS, 0);
- glColorMask( 1.0, 1.0, 1.0, 1.0 );
- char stencil[] = {64,127,255};
-
- glViewport(0,0, kContextWidth, kContextHeight);
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- glOrtho((GLdouble)0, (GLdouble)kContextWidth, (GLdouble)kContextHeight, 0, -1, 1);
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
-
- for(int y=0;y<kContextHeight;y+=2) {
-
- for(int x=0;x<kContextWidth;x++) {
- glRasterPos2i(x, y);
- glDrawPixels(1, 1, GL_RGB, GL_UNSIGNED_BYTE, &stencil);
- }
- }
-
- glStencilFunc(GL_NOTEQUAL, 0x01, 0x01);
- glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
-
- // Something gets screwed up due to the changes above
- // revert to default.
- glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
- glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
- glPixelStorei(GL_UNPACK_SKIP_ROWS, 0);
- glPixelStorei(GL_UNPACK_SKIP_PIXELS, 0);
+ if ( CanInitStereo(stereomode) ) {
+ InitStereo(stereomode);
+ } else {
+ fprintf(stderr, "Failed to initialize stereo, disabling.\n");
+ stereomode = stereoNone;
}
game.InitGame();
deltaTime /= 1000.0;
multiplier=deltaTime;
- if(multiplier<.001)multiplier=.001;
- if(multiplier>10)multiplier=10;
- if(update)frametime = currTime; // reset for next time interval
+ if(multiplier<.001) multiplier=.001;
+ if(multiplier>10) multiplier=10;
+ if(update) frametime = currTime; // reset for next time interval
deltaTime = (float) AbsoluteDeltaToDuration (currTime, time);
}
// game is not in focus, give CPU time to other apps by waiting for messages instead of 'peeking'
- STUBBED("give up CPU but sniff the event queue");
+ SDL_ActiveEvent evt;
+ SDL_WaitEvent((SDL_Event*)&evt);
+ if (evt.type == SDL_ACTIVEEVENT && evt.gain == 1)
+ gameFocused = true;
+ else if (evt.type == SDL_QUIT)
+ gDone = true;
}
}
// --------------------------------------------------------------------------
-
-
- bool selectDetail(int & width, int & height, int & bpp, int & detail)
- {
- bool res = true;
-
- // currently with SDL, we just use whatever is requested
- // and don't care. --ryan.
-
-
- return res;
- }
-
extern int channels[100];
extern OPENAL_SAMPLE * samp[100];
extern OPENAL_STREAM * strm[20];
bool LoadImage(const char * fname, TGAImageRec & tex)
{
- bool res = true;
-
if ( tex.data == NULL )
- {
return false;
- }
-
-
- res = load_image(fname, tex);
-
-
- return res;
+ else
+ return load_image(fname, tex);
}
void ScreenShot(const char * fname)
{
-
save_image(fname);
-
}