]> git.mxchange.org Git - quix0rs-blobwars.git/blobdiff - src/CEngine.cpp
Fix all issues found by the Clang Static Analyzer.
[quix0rs-blobwars.git] / src / CEngine.cpp
index 02175277e4df59843a4fd77b278d0aaa7364cd19..0f4721fd7c8cbe05704eb82770ba46abee65516c 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
@@ -19,18 +20,14 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 */
 
 #include "headers.h"
+#include <errno.h>
+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;
 
@@ -96,12 +93,10 @@ void Engine::destroy()
        deleteWidgets();
 
        debug(("engine: free databuffer\n"));
-       if (dataBuffer != NULL)
-               delete[] dataBuffer;
+       delete[] dataBuffer;
 
        debug(("engine: free binarybuffer\n"));
-       if (binaryBuffer != NULL)
-               delete[] binaryBuffer;
+       delete[] binaryBuffer;
 
        debug(("Clearing Define List...\n"));
        defineList.clear();
@@ -116,7 +111,7 @@ void Engine::clearCheatVars()
 
 bool Engine::compareLastKeyInputs()
 {
-       if (strstr(lastKeyEvents, "lockandload"))
+       if (strstr(lastKeyEvents, "LOCKANDLOAD"))
        {
                cheats = true;
                return true;
@@ -145,7 +140,7 @@ void Engine::addKeyEvent()
 
        if (index == -1)
        {
-               for (int i = 0 ; i < 25 ; i++)
+               for (int i = 0 ; i < 24 ; i++)
                {
                        lastKeyEvents[i] = lastKeyEvents[i + 1];
                }
@@ -162,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)
@@ -187,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;
@@ -196,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;
@@ -210,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;
@@ -228,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;
@@ -262,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:
@@ -274,24 +286,24 @@ void Engine::getInput()
        }
 }
 
-int Engine::getMouseX()
+int Engine::getMouseX() const
 {
        return mouseX;
 }
 
-int Engine::getMouseY()
+int Engine::getMouseY() const
 {
        return mouseY;
 }
 
 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;
        }
@@ -306,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)
@@ -331,18 +344,16 @@ 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)
        {
-               if (dataBuffer != NULL)
-                       delete[] dataBuffer;
-
+               delete[] dataBuffer;
                dataBuffer = NULL;
        }
        else
        {
-               if (binaryBuffer != NULL)
-                       delete[] binaryBuffer;
-
+               delete[] binaryBuffer;
                binaryBuffer = NULL;
        }
 
@@ -371,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];
                
@@ -382,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");
@@ -391,25 +406,29 @@ 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)
 {
-       if (dataBuffer != NULL)
-       {
-               delete[] dataBuffer;
-               dataBuffer = NULL;
-       }
+       bool ret = true;
+
+       delete[] dataBuffer;
+       dataBuffer = NULL;
        
        #if USEPAK
                return unpack(filename, PAK_DATA);
@@ -428,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()
@@ -458,7 +479,7 @@ void Engine::setPlayerPosition(int x, int y, int limitLeft, int limitRight, int
        Math::limitInt(&playerPosY, limitUp, limitDown);
 }
 
-int Engine::getFrameLoop()
+int Engine::getFrameLoop() const
 {
        return frameLoop;
 }
@@ -475,7 +496,7 @@ void Engine::doTimeDifference()
        time2 = SDL_GetTicks();
 }
 
-float Engine::getTimeDifference()
+float Engine::getTimeDifference() const
 {
        return timeDifference;
 }
@@ -723,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);
 
@@ -754,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);
 
@@ -771,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)
                {
@@ -811,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;
 }
 
@@ -864,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);
                }