/*
-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
#include "init.h"
+static bool displayLicense;
+
void checkForLicense()
{
if (!engine.loadData(_("data/license")))
graphics.updateScreen();
engine.getInput();
config.populate();
- if (engine.keyState[SDLK_SPACE])
+ if (engine.userAccepts())
break;
SDL_Delay(16);
}
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);
}
char gameSavePath[PATH_MAX];
- sprintf(gameSavePath, "%s/.parallelrealities/blobwars/", userHome);
+ snprintf(gameSavePath, sizeof gameSavePath, "%s/.parallelrealities/blobwars/", userHome);
engine.setUserHome(gameSavePath);
}
#endif
char configPath[PATH_MAX];
- sprintf(configPath, "%sconfig", engine.userHomeDirectory);
+ snprintf(configPath, sizeof configPath, "%sconfig", engine.userHomeDirectory);
debug(("Loading Config from %s\n", configPath));
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));
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);
{
char configPath[PATH_MAX];
- sprintf(configPath, "%sconfig", engine.userHomeDirectory);
+ snprintf(configPath, sizeof configPath, "%sconfig", engine.userHomeDirectory);
FILE *fp = fopen(configPath, "wb");
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)
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)
{
{
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;
}
}
SDL_ShowCursor(SDL_DISABLE);
- SDL_EventState(SDL_MOUSEMOTION, SDL_DISABLE);
graphics.registerEngine(&engine);
graphics.mapColors();
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");
-
-#ifndef SDL_FRAMEWORK
- SDL_WM_SetIcon(device, NULL);
-#endif
- SDL_WM_SetCaption("Blob Wars : Metal Blob Solid", "Blob Wars");
- SDL_EnableKeyRepeat(350, 80);
+ graphics.license[0] = graphics.loadImage("gfx/main/cc-by.png", true);
+ graphics.license[1] = graphics.loadImage("gfx/main/cc-by-sa.png", true);
+ SDL_Surface *device = graphics.loadImage("gfx/main/alienDevice.png");
+ SDL_SetWindowIcon(graphics.window, device);
SDL_FreeSurface(device);
if (strstr(engine.userHomeDirectory, "/root"))
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"));
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"));
}
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)
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);
}
}
debug(("Closing TTF...\n"));
TTF_Quit();
+
+ debug(("Closing NET...\n"));
+ SDLNet_Quit();
debug(("Closing SDL Sub System...\n"));
SDL_Quit();