X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FCEngine.cpp;h=0f4721fd7c8cbe05704eb82770ba46abee65516c;hb=6671923e966e5fb82eeac52be174fb6295dc9ee7;hp=a5a75acd34702c8d312d2fa45762dc402e0d9e67;hpb=f252549ec2a5392f2be8bb5ca707b27a464b4583;p=quix0rs-blobwars.git diff --git a/src/CEngine.cpp b/src/CEngine.cpp index a5a75ac..0f4721f 100644 --- a/src/CEngine.cpp +++ b/src/CEngine.cpp @@ -1,5 +1,6 @@ /* -Copyright (C) 2004-2010 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 @@ -19,18 +20,14 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "headers.h" +#include +extern Graphics graphics; Engine::Engine() { - for (int i = 0 ; i < 350 ; i++) - { - keyState[i] = 0; - } - - for (int i = 0 ; i < 32 ; i++) - { - joystickState[i] = 0; - } + memset(keyState, 0, sizeof keyState); + + memset(joystickState, 0, sizeof joystickState); joyX = joyY = 0; @@ -114,7 +111,7 @@ void Engine::clearCheatVars() bool Engine::compareLastKeyInputs() { - if (strstr(lastKeyEvents, "lockandload")) + if (strstr(lastKeyEvents, "LOCKANDLOAD")) { cheats = true; return true; @@ -160,6 +157,12 @@ void Engine::getInput() { SDL_GetMouseState(&mouseX, &mouseY); + // Scale from window coordinates to graphics coordinates + int w, h; + SDL_GetWindowSize(graphics.window, &w, &h); + mouseX = mouseX * 640 / w; + mouseY = mouseY * 480 / h; + while (SDL_PollEvent(&event)) { switch (event.type) @@ -185,7 +188,7 @@ void Engine::getInput() if (waitForButton) { - if (event.key.keysym.sym == SDLK_ESCAPE) + if (event.key.keysym.scancode == SDL_SCANCODE_ESCAPE) { lastButtonPressed = -1; *highlightedWidget->value = abs(*highlightedWidget->value) - 1000; @@ -194,7 +197,7 @@ void Engine::getInput() allowJoypad = false; } - if (event.key.keysym.sym == SDLK_BACKSPACE) + if (event.key.keysym.scancode == SDL_SCANCODE_BACKSPACE) { lastButtonPressed = -2; *highlightedWidget->value = -2; @@ -208,13 +211,13 @@ void Engine::getInput() if (waitForKey) { - if (event.key.keysym.sym == SDLK_ESCAPE) + if (event.key.keysym.scancode == SDL_SCANCODE_ESCAPE) { *highlightedWidget->value = -*highlightedWidget->value; } else { - *highlightedWidget->value = event.key.keysym.sym; + *highlightedWidget->value = event.key.keysym.scancode; } lastButtonPressed = -1; @@ -226,29 +229,33 @@ void Engine::getInput() return; } - keyState[event.key.keysym.sym] = 1; - strlcpy(lastKeyPressed, SDL_GetKeyName(event.key.keysym.sym), sizeof lastKeyPressed); + keyState[event.key.keysym.scancode] = 1; + strlcpy(lastKeyPressed, SDL_GetKeyName(SDL_GetKeyFromScancode(event.key.keysym.scancode)), sizeof lastKeyPressed); addKeyEvent(); break; case SDL_KEYUP: - keyState[event.key.keysym.sym] = 0; + keyState[event.key.keysym.scancode] = 0; break; case SDL_JOYAXISMOTION: if (event.jaxis.axis == 0) { - joyX = event.jaxis.value; + joyX = event.jaxis.value; + int joycurX = joyX < -25000 ? -1 : joyX > 25000 ? 1 : 0; + if (joycurX != joyprevX) + joykeyX = joyprevX = joycurX; } else if (event.jaxis.axis == 1) { - joyY = event.jaxis.value; + joyY = event.jaxis.value; + int joycurY = joyY < -25000 ? -1 : joyY > 25000 ? 1 : 0; + if (joycurY != joyprevY) + joykeyY = joyprevY = joycurY; } - break; case SDL_JOYBUTTONDOWN: - if (waitForButton) { lastButtonPressed = event.jbutton.button; @@ -260,10 +267,17 @@ void Engine::getInput() } joystickState[event.jbutton.button] = 1; + joykeyFire = true; break; case SDL_JOYBUTTONUP: joystickState[event.jbutton.button] = 0; + joykeyFire = false; + break; + + case SDL_WINDOWEVENT: + if (event.window.event == SDL_WINDOWEVENT_FOCUS_LOST) + paused = true; break; default: @@ -284,12 +298,12 @@ int Engine::getMouseY() const void Engine::setMouse(int x, int y) { - SDL_WarpMouse(x, y); + SDL_WarpMouseInWindow(graphics.window, x, y); } bool Engine::userAccepts() { - if ((keyState[SDLK_SPACE]) || (keyState[SDLK_ESCAPE]) || (keyState[SDLK_LCTRL]) || (keyState[SDLK_RCTRL]) || (keyState[SDLK_RETURN]) || (keyState[SDLK_LCTRL])) + if ((keyState[SDL_SCANCODE_SPACE]) || (keyState[SDL_SCANCODE_ESCAPE]) || (keyState[SDL_SCANCODE_LCTRL]) || (keyState[SDL_SCANCODE_RCTRL]) || (keyState[SDL_SCANCODE_RETURN]) || (keyState[SDL_SCANCODE_LCTRL]) || joykeyFire) { return true; } @@ -304,10 +318,11 @@ void Engine::flushInput() void Engine::clearInput() { - for (int i = 0 ; i < 350 ; i++) - keyState[i] = 0; + memset(keyState, 0, sizeof keyState); mouseLeft = mouseRight = 0; + joykeyX = joykeyY = 0; + joykeyFire = false; } void Engine::setUserHome(const char *path) @@ -329,6 +344,8 @@ since SDL currently provides no means to load music directly from memory */ bool Engine::unpack(const char *filename, int fileType) { + bool ret = true; + if (fileType == PAK_DATA) { delete[] dataBuffer; @@ -365,7 +382,7 @@ bool Engine::unpack(const char *filename, int fileType) } } - if ((fileType == PAK_MUSIC) || (fileType == PAK_FONT)) + if ((fileType == PAK_MUSIC) || (fileType == PAK_FONT) || (fileType == PAK_TAGS)) { char tempPath[PATH_MAX]; @@ -376,8 +393,12 @@ bool Engine::unpack(const char *filename, int fileType) snprintf(tempPath, sizeof tempPath, "%smusic.mod", userHomeDirectory); fp = fopen(tempPath, "wb"); } - - if (fileType == PAK_FONT) + else if (fileType == PAK_TAGS) + { + snprintf(tempPath, sizeof tempPath, "%smusic.tags", userHomeDirectory); + fp = fopen(tempPath, "wb"); + } + else if (fileType == PAK_FONT) { snprintf(tempPath, sizeof tempPath, "%sfont.ttf", userHomeDirectory); fp = fopen(tempPath, "wb"); @@ -385,20 +406,27 @@ bool Engine::unpack(const char *filename, int fileType) if (!fp) { + printf("Fatal Error: could not open %s for writing: %s", tempPath, strerror(errno)); return false; } - fwrite(binaryBuffer, 1, pak.getUncompressedSize(), fp); + if (fwrite(binaryBuffer, 1, pak.getUncompressedSize(), fp) != pak.getUncompressedSize()) + { + printf("Fatal Error: could not write to %s: %s", tempPath, strerror(errno)); + ret = false; + } fclose(fp); } - debug(("unpack() : Loaded %s (%d)\n", filename, pak.getUncompressedSize())); + debug(("unpack() : Loaded %s (%d), ret: %d\n", filename, pak.getUncompressedSize(), (int)ret)); - return true; + return ret; } bool Engine::loadData(const char *filename) { + bool ret = true; + delete[] dataBuffer; dataBuffer = NULL; @@ -419,14 +447,16 @@ bool Engine::loadData(const char *filename) dataBuffer = new unsigned char[fSize + 1]; - fread(dataBuffer, 1, fSize, fp); + if (fread(dataBuffer, 1, fSize, fp) != (size_t)fSize) + ret = false; + dataBuffer[fSize] = 0; fclose(fp); - debug(("loadData() : Loaded %s (%d)\n", filename, fSize)); + debug(("loadData() : Loaded %s (%d), ret: %d\n", filename, fSize, (int)ret)); - return true; + return ret; } void Engine::reportFontFailure() @@ -714,21 +744,21 @@ int Engine::processWidgets() { int update = 0; - if (keyState[SDLK_UP]) + if (keyState[SDL_SCANCODE_UP] || joykeyY < 0) { highlightWidget(-1); update = 1; clearInput(); } - if (keyState[SDLK_DOWN]) + if (keyState[SDL_SCANCODE_DOWN] || joykeyY > 0) { highlightWidget(1); update = 1; clearInput(); } - if (keyState[SDLK_LEFT] && (highlightedWidget->type != WG_BUTTON && highlightedWidget->type != WG_JOYPAD)) + if ((keyState[SDL_SCANCODE_LEFT] || joykeyX < 0) && (highlightedWidget->type != WG_BUTTON && highlightedWidget->type != WG_JOYPAD)) { SDL_Delay(1); @@ -745,7 +775,7 @@ int Engine::processWidgets() clearInput(); } - if (keyState[SDLK_RIGHT] && (highlightedWidget->type != WG_BUTTON && highlightedWidget->type != WG_JOYPAD)) + if ((keyState[SDL_SCANCODE_RIGHT] || joykeyX > 0) && (highlightedWidget->type != WG_BUTTON && highlightedWidget->type != WG_JOYPAD)) { SDL_Delay(1); @@ -762,7 +792,7 @@ int Engine::processWidgets() clearInput(); } - if ((keyState[SDLK_RETURN]) || (keyState[SDLK_SPACE]) || (keyState[SDLK_LCTRL])) + if ((keyState[SDL_SCANCODE_RETURN]) || (keyState[SDL_SCANCODE_SPACE]) || (keyState[SDL_SCANCODE_LCTRL]) || (joykeyFire && highlightedWidget->type != WG_JOYPAD)) { if (highlightedWidget->value == NULL) { @@ -802,6 +832,39 @@ int Engine::processWidgets() clearInput(); } + if (joykeyX > 0 && highlightedWidget->type == WG_JOYPAD) + { + waitForButton = true; + waitForKey = false; + allowJoypad = true; + + if (*highlightedWidget->value > -1000) + { + *highlightedWidget->value = (-1000 - *highlightedWidget->value); + } + + clearInput(); + } + + if (joykeyX < 0 && highlightedWidget->type == WG_JOYPAD) + { + if (waitForButton) + { + lastButtonPressed = -1; + *highlightedWidget->value = abs(*highlightedWidget->value) - 1000; + } + else + { + lastButtonPressed = -2; + *highlightedWidget->value = -2; + } + + waitForButton = false; + allowJoypad = false; + highlightedWidget->redraw(); + clearInput(); + } + return update; } @@ -855,20 +918,18 @@ bool Engine::loadDefines() if (!loadData("data/defines.h")) return false; - char *token = strtok((char*)dataBuffer, "\n"); - - Data *data; + strtok((char*)dataBuffer, "\n"); while (true) { - token = strtok(NULL, "\n"); + char *token = strtok(NULL, "\n"); if (!token) break; if (!strstr(token, "/*")) { sscanf(token, "%*s %s %[^\n\r]", string[0], string[1]); - data = new Data(); + Data *data = new Data(); data->set(string[0], string[1], 1, 1); defineList.add(data); }