]> git.mxchange.org Git - quix0rs-blobwars.git/blobdiff - src/CEngine.cpp
Added .gitignore to ignore certain files + fixed access rights on Makefile* as
[quix0rs-blobwars.git] / src / CEngine.cpp
index 45f30eff7d65632ea499b839addaa083a480a5d2..d1723aab14f883800b8fd099e87f9228be753456 100644 (file)
@@ -111,7 +111,7 @@ void Engine::clearCheatVars()
 
 bool Engine::compareLastKeyInputs()
 {
-       if (strstr(lastKeyEvents, "lockandload"))
+       if (strstr(lastKeyEvents, "LOCKANDLOAD"))
        {
                cheats = true;
                return true;
@@ -155,14 +155,6 @@ void Engine::addKeyEvent()
 
 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)
@@ -184,6 +176,11 @@ void Engine::getInput()
                                if (event.button.button == SDL_BUTTON_RIGHT) mouseRight = 0;
                                break;
 
+                       case SDL_MOUSEMOTION:
+                               mouseX = event.motion.x;
+                               mouseY = event.motion.y;
+                               break;
+
                        case SDL_KEYDOWN:
                                
                                if (waitForButton)
@@ -230,7 +227,7 @@ void Engine::getInput()
                                }
 
                                keyState[event.key.keysym.scancode] = 1;
-                               strlcpy(lastKeyPressed, SDL_GetKeyName(event.key.keysym.scancode), sizeof lastKeyPressed);
+                               strlcpy(lastKeyPressed, SDL_GetKeyName(SDL_GetKeyFromScancode(event.key.keysym.scancode)), sizeof lastKeyPressed);
                                addKeyEvent();
                                break;
 
@@ -241,17 +238,21 @@ void Engine::getInput()
                        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;
@@ -263,10 +264,41 @@ void Engine::getInput()
                                }
                                
                                joystickState[event.jbutton.button] = 1;
+                               joykeyFire = true;
                                break;
 
                        case SDL_JOYBUTTONUP:
                                joystickState[event.jbutton.button] = 0;
+                               joykeyFire = false;
+                               break;
+
+                       case SDL_JOYHATMOTION:
+                               switch (event.jhat.value) {
+                               case SDL_HAT_CENTERED:
+                                       joyX = 0,      joyY = 0;      break;
+                               case SDL_HAT_LEFT:
+                                       joyX = -32768, joyY = 0;      break;
+                               case SDL_HAT_LEFTUP:
+                                       joyX = -32768, joyY = -32768; break;
+                               case SDL_HAT_UP:
+                                       joyX = 0,      joyY = -32768; break;
+                               case SDL_HAT_RIGHTUP:
+                                       joyX = 32767,  joyY = -32768; break;
+                               case SDL_HAT_RIGHT:
+                                       joyX = 32767,  joyY = 0;      break;
+                               case SDL_HAT_RIGHTDOWN:
+                                       joyX = 32767,  joyY = 32767;  break;
+                               case SDL_HAT_DOWN:
+                                       joyX = 0,      joyY = 32767;  break;
+                               case SDL_HAT_LEFTDOWN:
+                                       joyX = -32768, joyY = 32767;  break;
+                               }
+
+                               if (joyX != joyprevX)
+                                       joykeyX = joyprevX = joyX;
+                               if (joyY != joyprevY)
+                                       joykeyY = joyprevY = joyY;
+
                                break;
 
                        case SDL_WINDOWEVENT:
@@ -290,14 +322,17 @@ int Engine::getMouseY() const
        return mouseY;
 }
 
-void Engine::setMouse(int x, int y)
+void Engine::moveMouse(int dx, int dy)
 {
-       SDL_WarpMouseInWindow(graphics.window, x, y);
+       mouseX += dx;
+       mouseY += dy;
+       Math::limitInt(&mouseX, 0, 640);
+       Math::limitInt(&mouseY, 0, 480);
 }
 
 bool Engine::userAccepts()
 {
-       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]))
+       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;
        }
@@ -315,6 +350,8 @@ void Engine::clearInput()
        memset(keyState, 0, sizeof keyState);
 
        mouseLeft = mouseRight = 0;
+       joykeyX = joykeyY = 0;
+       joykeyFire = false;
 }
 
 void Engine::setUserHome(const char *path)
@@ -385,14 +422,12 @@ bool Engine::unpack(const char *filename, int fileType)
                        snprintf(tempPath, sizeof tempPath, "%smusic.mod", userHomeDirectory);
                        fp = fopen(tempPath, "wb");
                }
-
-               if (fileType == PAK_TAGS)
+               else if (fileType == PAK_TAGS)
                {
                        snprintf(tempPath, sizeof tempPath, "%smusic.tags", userHomeDirectory);
                        fp = fopen(tempPath, "wb");
                }
-
-               if (fileType == PAK_FONT)
+               else if (fileType == PAK_FONT)
                {
                        snprintf(tempPath, sizeof tempPath, "%sfont.ttf", userHomeDirectory);
                        fp = fopen(tempPath, "wb");
@@ -738,21 +773,21 @@ int Engine::processWidgets()
 {
        int update = 0;
 
-       if (keyState[SDL_SCANCODE_UP])
+       if (keyState[SDL_SCANCODE_UP] || joykeyY < 0)
        {
                highlightWidget(-1);
                update = 1;
                clearInput();
        }
 
-       if (keyState[SDL_SCANCODE_DOWN])
+       if (keyState[SDL_SCANCODE_DOWN] || joykeyY > 0)
        {
                highlightWidget(1);
                update = 1;
                clearInput();
        }
 
-       if (keyState[SDL_SCANCODE_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);
 
@@ -769,7 +804,7 @@ int Engine::processWidgets()
                        clearInput();
        }
 
-       if (keyState[SDL_SCANCODE_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);
 
@@ -786,7 +821,7 @@ int Engine::processWidgets()
                        clearInput();
        }
 
-       if ((keyState[SDL_SCANCODE_RETURN]) || (keyState[SDL_SCANCODE_SPACE]) || (keyState[SDL_SCANCODE_LCTRL]))
+       if ((keyState[SDL_SCANCODE_RETURN]) || (keyState[SDL_SCANCODE_SPACE]) || (keyState[SDL_SCANCODE_LCTRL]) || (joykeyFire && highlightedWidget->type != WG_JOYPAD))
        {
                if (highlightedWidget->value == NULL)
                {
@@ -826,6 +861,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;
 }
 
@@ -879,20 +947,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);
                }