/*
-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
#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;
bool Engine::compareLastKeyInputs()
{
- if (strstr(lastKeyEvents, "lockandload"))
+ if (strstr(lastKeyEvents, "LOCKANDLOAD"))
{
cheats = true;
return true;
{
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)
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;
allowJoypad = false;
}
- if (event.key.keysym.sym == SDLK_BACKSPACE)
+ if (event.key.keysym.scancode == SDL_SCANCODE_BACKSPACE)
{
lastButtonPressed = -2;
*highlightedWidget->value = -2;
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;
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;
}
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:
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;
}
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)
*/
bool Engine::unpack(const char *filename, int fileType)
{
+ bool ret = true;
+
if (fileType == PAK_DATA)
{
delete[] dataBuffer;
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;
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()
{
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);
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);
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)
{
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;
}