]> git.mxchange.org Git - quix0rs-blobwars.git/blobdiff - src/init.cpp
Remove font size guessing hack.
[quix0rs-blobwars.git] / src / init.cpp
index 66e09497829496cb02cf50bb91cf4996accc2efa..3c333cc10d8d3ed632c712b57ad9fd174e55e5fb 100644 (file)
@@ -1,5 +1,6 @@
 /*
-Copyright (C) 2004 Parallel Realities
+Copyright (C) 2004-2011 Parallel Realities
+Copyright (C) 2011-2015 Perpendicular Dimensions
 
 This program is free software; you can redistribute it and/or
 modify it under the terms of the GNU General Public License
@@ -20,6 +21,8 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 
 #include "init.h"
 
+static bool displayLicense;
+
 void checkForLicense()
 {
        if (!engine.loadData(_("data/license")))
@@ -80,7 +83,7 @@ void showLicense()
                graphics.updateScreen();
                engine.getInput();
                config.populate();
-               if (engine.keyState[SDLK_SPACE])
+               if (engine.userAccepts())
                        break;
                SDL_Delay(16);
        }
@@ -103,16 +106,16 @@ void setupUserHomeDirectory()
        debug(("User Home = %s\n", userHome));
        
        char dir[PATH_MAX];
-       strcpy(dir, "");
+       dir[0] = 0;
 
-       sprintf(dir, "%s/.parallelrealities", userHome);
+       snprintf(dir, sizeof dir, "%s/.parallelrealities", userHome);
        if ((mkdir(dir, S_IRWXU|S_IRWXG|S_IROTH|S_IXOTH) != 0) && (errno != EEXIST))
        {
                printf("Couldn't create required directory '%s'", dir);
                exit(1);
        }
 
-       sprintf(dir, "%s/.parallelrealities/blobwars", userHome);
+       snprintf(dir, sizeof dir, "%s/.parallelrealities/blobwars", userHome);
        if ((mkdir(dir, S_IRWXU|S_IRWXG|S_IROTH|S_IXOTH) != 0) && (errno != EEXIST))
        {
                printf("Couldn't create required directory '%s'", dir);
@@ -120,7 +123,7 @@ void setupUserHomeDirectory()
        }
 
        char gameSavePath[PATH_MAX];
-       sprintf(gameSavePath, "%s/.parallelrealities/blobwars/", userHome);
+       snprintf(gameSavePath, sizeof gameSavePath, "%s/.parallelrealities/blobwars/", userHome);
        engine.setUserHome(gameSavePath);
 }
 #endif
@@ -133,7 +136,7 @@ bool loadConfig()
 
        char configPath[PATH_MAX];
 
-       sprintf(configPath, "%sconfig", engine.userHomeDirectory);
+       snprintf(configPath, sizeof configPath, "%sconfig", engine.userHomeDirectory);
 
        debug(("Loading Config from %s\n", configPath));
 
@@ -144,7 +147,10 @@ bool loadConfig()
                return true;
        }
 
-       fscanf(fp, "%f %d", &version, &release);
+       if (fscanf(fp, "%10f %10d", &version, &release) != 2)
+       {
+               rtn = true;
+       }
 
        debug(("Version = %.2f - Expected %.2f\n", version, VERSION));
        debug(("Release = %d - Expected %d\n", release, RELEASE));
@@ -154,7 +160,10 @@ bool loadConfig()
                rtn = true;
        }
 
-       fscanf(fp, "%d %d %d %d %d %d %d", &engine.fullScreen, &game.musicVol, &game.soundVol, &game.output, &game.brightness, &engine.extremeAvailable, &game.gore);
+       if (fscanf(fp, "%10d %10d %10d %10d %10d %10d %10d", &engine.fullScreen, &game.musicVol, &game.soundVol, &game.output, &game.brightness, &engine.extremeAvailable, &game.gore) != 7)
+       {
+               rtn = true;
+       }
 
        fclose(fp);
 
@@ -177,7 +186,7 @@ void saveConfig()
 {
        char configPath[PATH_MAX];
 
-       sprintf(configPath, "%sconfig", engine.userHomeDirectory);
+       snprintf(configPath, sizeof configPath, "%sconfig", engine.userHomeDirectory);
 
        FILE *fp = fopen(configPath, "wb");
 
@@ -195,18 +204,72 @@ void saveConfig()
        debug(("Output Type = %d\n", game.output));
 }
 
+//
+// see if we can load the private keyState
+//
+int initMedalService(void *data)
+{
+       SDL_mutexP(medalServer.lock);
+       
+       char connectMessage[1024];
+       snprintf(connectMessage, sizeof connectMessage, "Contacting Medal Server - %s:%d", MEDAL_SERVER_HOST, MEDAL_SERVER_PORT);
+       
+       graphics.showMedalMessage(-1, connectMessage);
+       
+       char keyPath[PATH_MAX];
+       char privateKey[20];
+
+       snprintf(keyPath, sizeof keyPath, "%smedalKey", engine.userHomeDirectory);
+       
+       debug(("Loading private key from %s\n", keyPath));
+       
+       FILE *fp = fopen(keyPath, "rb");
+       
+       if (!fp)
+       {
+               graphics.showMedalMessage(-1, "No Medal Key found - Online functions disabled");
+               SDL_mutexV(medalServer.lock);
+               return 0;
+       }
+       
+       if (fscanf(fp, "%19s", privateKey) != 1)
+       {
+               graphics.showMedalMessage(-1, "Medal Key file corrupt - Online functions disabled");
+               SDL_mutexV(medalServer.lock);
+               fclose(fp);
+               return 0;
+       }
+       
+       fclose(fp);
+               
+       if (!medalServer.connect(privateKey))
+       {
+               graphics.showMedalMessage(-1, "Medal Server Connection Failed - Online functions disabled");
+               return 0;
+       }
+       
+       graphics.showMedalMessage(-1, "Connected to Medal Server");
+       
+       SDL_mutexV(medalServer.lock);
+       
+       return 1;
+}
+
+void initConfig()
+{
+       #if UNIX
+       setupUserHomeDirectory();
+       #endif
+
+       displayLicense = loadConfig();
+}
+
 /*
 Chugg chugg chugg.... brrr... chugg chugg chugg...brrrrrr... chugg ch..
 BRRRRRRRRRRRRRRRRRMMMMMMMMMMMMMMMMMMM!! Well, hopefully anyway! ;)
 */
 void initSystem()
 {
-       #if UNIX
-       setupUserHomeDirectory();
-       #endif
-
-       bool displayLicense = loadConfig();
-       
        long flags = SDL_INIT_VIDEO|SDL_INIT_JOYSTICK;
                        
        if (engine.useAudio)
@@ -221,29 +284,62 @@ void initSystem()
                exit(1);
        }
 
-       if (!engine.fullScreen)
+       graphics.screen = SDL_CreateRGBSurface(0, 640, 480, 32, 0xff0000, 0xff00, 0xff, 0xff000000);
+
+       if (graphics.screen == NULL)
        {
-               graphics.screen = SDL_SetVideoMode(640, 480, 0, SDL_HWPALETTE);
+               printf("Couldn't set 640x480 video mode: %s\n", SDL_GetError());
+               exit(1);
        }
-       else
+
+       // Increase the size of the window if we have large desktop resolutions
+       SDL_DisplayMode displayMode{0};
+       SDL_GetDesktopDisplayMode(0, &displayMode);
+       int w = graphics.screen->w;
+       int h = graphics.screen->h;
+       while (displayMode.w > w * 2 && displayMode.h > h * 2)
        {
-               graphics.screen = SDL_SetVideoMode(640, 480, 0, SDL_HWPALETTE | SDL_FULLSCREEN);
+               w *= 2;
+               h *= 2;
        }
 
-       if (graphics.screen == NULL)
+       graphics.window = SDL_CreateWindow("Blobwars: Metal Blob Solid", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, w, h, SDL_WINDOW_RESIZABLE);
+
+       if (graphics.window == NULL)
        {
-               printf("Couldn't set 640x480 video mode: %s\n", SDL_GetError());
+               printf("Couldn't create %dx%d window: %s\n", w, h, SDL_GetError());
                exit(1);
        }
 
+       graphics.renderer = SDL_CreateRenderer(graphics.window, -1, SDL_RENDERER_PRESENTVSYNC);
+
+       if (graphics.renderer == NULL)
+       {
+               printf("Couldn't create renderer: %s\n", SDL_GetError());
+               exit(1);
+       }
+
+       SDL_RenderSetLogicalSize(graphics.renderer, graphics.screen->w, graphics.screen->h);
+       graphics.texture = SDL_CreateTexture(graphics.renderer, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_STREAMING, graphics.screen->w, graphics.screen->h);
+
+       if (graphics.texture == NULL)
+       {
+               printf("Could not create %dx%d texture: %s\n", graphics.screen->w, graphics.screen->h, SDL_GetError());
+               exit(1);
+       }
+
+       SDL_SetWindowFullscreen(graphics.window, engine.fullScreen ? SDL_WINDOW_FULLSCREEN_DESKTOP : 0);
+
        // This (attempts to) set the gamma correction. We attempt to catch an error here
        // in case someone has done something really stupid in the config file(!!)
-    if (game.brightness != -1) {
-        Math::limitInt(&game.brightness, 1, 20);
-        float brightness = game.brightness;
-        brightness /= 10;
-        SDL_SetGamma(brightness, brightness, brightness);
-    }
+       if (game.brightness != -1) {
+               Math::limitInt(&game.brightness, 1, 20);
+               float brightness = game.brightness;
+               brightness /= 10;
+               uint16_t ramp[256];
+               SDL_CalculateGammaRamp(brightness, ramp);
+               SDL_SetWindowGammaRamp(graphics.window, ramp, ramp, ramp);
+       }
 
        if (TTF_Init() < 0)
        {
@@ -255,7 +351,7 @@ void initSystem()
        {
                if (Mix_OpenAudio(22050, AUDIO_S16, engine.useAudio, 1024) < 0)
                {
-                       printf("Warning: Couldn't set 22050 Hz 16-bit audio - Reason: %s\n", Mix_GetError());
+                       printf("Warning: Couldn't set 44100 Hz 16-bit audio - Reason: %s\n", Mix_GetError());
                        printf("Sound and Music will be disabled\n");
                        engine.useAudio = 0;
                }
@@ -290,41 +386,33 @@ void initSystem()
        debug(("Loading Fonts...\n"));
 
        #if USEPAK
-                       
-               char tempPath[PATH_MAX];
-               sprintf(tempPath, "%sfont.ttf", engine.userHomeDirectory);      
-               remove(tempPath);
-               
-               SDL_Delay(1000); // wait one second, just to be sure!
-               
                if (!engine.unpack("data/vera.ttf", PAK_FONT))
                {
                        engine.reportFontFailure();
                }
        #endif
 
-       debug(("Trying to load correct font pixel sizes using a really half arsed routine!\n"));
-       debug(("If it crashes then you'll know why!\n"));
-                       
-       graphics.loadFont(0, "data/vera.ttf", 7);
-       graphics.loadFont(1, "data/vera.ttf", 9);
-       graphics.loadFont(2, "data/vera.ttf", 11);
-       graphics.loadFont(3, "data/vera.ttf", 13);
-       graphics.loadFont(4, "data/vera.ttf", 15);
-       
+       graphics.loadFont(0, "data/vera.ttf", 12);
+       graphics.loadFont(1, "data/vera.ttf", 15);
+       graphics.loadFont(2, "data/vera.ttf", 19);
+       graphics.loadFont(3, "data/vera.ttf", 23);
+       graphics.loadFont(4, "data/vera.ttf", 24);
+
        debug(("Font sizes all loaded!!\n"));
 
        audio.loadSound(SND_CHEAT, "sound/Lock And Load!!!");
-       audio.loadSound(SND_HIGHLIGHT, "sound/menu.wav");
-       audio.loadSound(SND_SELECT, "sound/select.wav");
+       audio.loadSound(SND_HIGHLIGHT, "sound/menu");
+       audio.loadSound(SND_SELECT, "sound/select");
+       
+       graphics.medal[0] = graphics.loadImage("gfx/main/medal_bronze_1.png");
+       graphics.medal[1] = graphics.loadImage("gfx/main/award_star_silver_3.png");
+       graphics.medal[2] = graphics.loadImage("gfx/main/shield.png");
+       graphics.medal[3] = graphics.loadImage("gfx/main/ruby.png");
 
-       SDL_Surface *device = graphics.loadImage("gfx/main/alienDevice.png");
+       graphics.license[0] = graphics.loadImage("gfx/main/cc-by.png", true);
+       graphics.license[1] = graphics.loadImage("gfx/main/cc-by-sa.png", true);
 
-#ifndef SDL_FRAMEWORK
-       SDL_WM_SetIcon(device, NULL);
-#endif
-       SDL_WM_SetCaption("Blob Wars : Metal Blob Solid", "Blob Wars");
-       SDL_EnableKeyRepeat(350, 80);
+       SDL_Surface *device = graphics.loadImage("gfx/main/alienDevice.png");
 
        SDL_FreeSurface(device);
        
@@ -342,6 +430,23 @@ void initSystem()
                checkForLicense();
        }
        
+       if (SDLNet_Init() < 0)
+       {
+               printf("SDLNet_Init: %s\n", SDLNet_GetError());
+       }
+       else
+       {
+               SDL_Thread *thread = SDL_CreateThread(initMedalService, "MedalService", NULL);
+       
+               if (thread == NULL)
+               {
+                       printf("Unable to create thread: %s\n", SDL_GetError());
+                       printf("Calling medal server directly\n");
+                       initMedalService(NULL);
+                       return;
+               }
+       }
+       
        engine.saveConfig = true;
 
        debug(("Init Complete...\n"));
@@ -365,7 +470,7 @@ void cleanup()
        audio.destroy();
 
        debug(("Removing Music...\n"));
-       sprintf(tempPath, "%smusic.mod", engine.userHomeDirectory);
+       snprintf(tempPath, sizeof tempPath, "%smusic.mod", engine.userHomeDirectory);
        remove(tempPath);
 
        debug(("Freeing Game Info...\n"));
@@ -387,7 +492,7 @@ void cleanup()
        }
 
        debug(("Removing Font File...\n"));
-       sprintf(tempPath, "%sfont.ttf", engine.userHomeDirectory);
+       snprintf(tempPath, sizeof tempPath, "%sfont.ttf", engine.userHomeDirectory);
        remove(tempPath);
        
        if (SDL_NumJoysticks() > 0)
@@ -395,7 +500,7 @@ void cleanup()
                SDL_JoystickEventState(SDL_DISABLE);
                for (int i = 0 ; i < SDL_NumJoysticks() ; i++)
                {
-                       debug(("Closing Joystick #%d - %s...\n", i, SDL_JoystickName(i)));
+                       debug(("Closing Joystick #%d\n", i));
                        SDL_JoystickClose(config.sdlJoystick);
                }
        }
@@ -408,6 +513,9 @@ void cleanup()
 
        debug(("Closing TTF...\n"));
        TTF_Quit();
+       
+       debug(("Closing NET...\n"));
+       SDLNet_Quit();
 
        debug(("Closing SDL Sub System...\n"));
        SDL_Quit();