X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2Finit.cpp;h=b461e7bfad1de9906fbd893b3839544b5bd723e3;hb=87d49881e02bfd0ada60d183c71737205e688e9d;hp=66e09497829496cb02cf50bb91cf4996accc2efa;hpb=a882955f339b23b5e61f92ef7cb5aae76405d95b;p=quix0rs-blobwars.git diff --git a/src/init.cpp b/src/init.cpp index 66e0949..b461e7b 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -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,74 @@ void saveConfig() debug(("Output Type = %d\n", game.output)); } +// +// see if we can load the private keyState +// +int initMedalService(void *data) +{ + (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 +286,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 = {}; + 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 +353,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; } @@ -271,7 +369,6 @@ void initSystem() } SDL_ShowCursor(SDL_DISABLE); - SDL_EventState(SDL_MOUSEMOTION, SDL_DISABLE); graphics.registerEngine(&engine); graphics.mapColors(); @@ -290,41 +387,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 +431,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 +471,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 +493,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 +501,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 +514,9 @@ void cleanup() debug(("Closing TTF...\n")); TTF_Quit(); + + debug(("Closing NET...\n")); + SDLNet_Quit(); debug(("Closing SDL Sub System...\n")); SDL_Quit();