#include "input_system.h" #include "game.h" #include "character_system.h" #include "message_system.h" #include "script_system.h" #include "transform_system.h" #include "animation_system.h" struct Input { bool left = false; bool right = false; bool up = false; bool down = false; }; void InputSystem::tick(double dt) { SDL_Event e; while (SDL_PollEvent(&e)) { if (e.type == SDL_QUIT || (e.type == SDL_KEYDOWN && e.key.keysym.sym == SDLK_ESCAPE)) { game_.quit(); return; } else if (e.type == SDL_KEYDOWN) { if (e.key.keysym.sym == SDLK_LSHIFT || e.key.keysym.sym == SDLK_RSHIFT) { for (int spriteId : game_.getSprites()) { Sprite& sprite = game_.getSprite(spriteId); if (sprite.controllable) { game_.getSystem().beginCrouch(spriteId); } } } else if (e.key.keysym.sym == SDLK_SPACE) { // If there is text on screen, try to advance it. if (game_.getSystem().getCutsceneBarsProgress() != 0.0) { game_.getSystem().advanceText(); } else { // Otherwise, check if there is a sprite in front of the player. bool inFrontOfSomething = false; bool activated = false; for (int spriteId : game_.getSprites()) { Sprite& sprite = game_.getSprite(spriteId); if (sprite.controllable) { vec2i checkLoc = sprite.loc + (unitVecInDirection(sprite.dir) * MOVEMENT_SPEED); CollisionResult collision = game_.getSystem().checkCollision(spriteId, checkLoc, sprite.dir); if (collision.horiz.blocked || collision.vert.blocked) { inFrontOfSomething = true; } // If there is a sprite to be interacted with, rotate that sprite so it is facing the player. // Then, run its interaction script if present. if (collision.horiz.colliderSprite != -1) { game_.getSystem().setSpriteDirection(collision.horiz.colliderSprite, oppositeDirection(sprite.dir)); Sprite& collider = game_.getSprite(collision.horiz.colliderSprite); if (collider.interactionScript != "") { game_.getSystem().runScript(collider.interactionScript); activated = true; } } else if (collision.vert.colliderSprite != -1) { game_.getSystem().setSpriteDirection(collision.vert.colliderSprite, oppositeDirection(sprite.dir)); Sprite& collider = game_.getSprite(collision.vert.colliderSprite); if (collider.interactionScript != "") { game_.getSystem().runScript(collider.interactionScript); activated = true; } } } } if (inFrontOfSomething && !activated) { game_.getSystem().runScript("default"); } } } } else if (e.type == SDL_KEYUP && (e.key.keysym.sym == SDLK_LSHIFT || e.key.keysym.sym == SDLK_RSHIFT)) { for (int spriteId : game_.getSprites()) { Sprite& sprite = game_.getSprite(spriteId); if (sprite.controllable) { game_.getSystem().endCrouch(spriteId); } } } } Input keystate; const Uint8* state = SDL_GetKeyboardState(NULL); keystate.left = state[SDL_SCANCODE_LEFT]; keystate.right = state[SDL_SCANCODE_RIGHT]; keystate.up = state[SDL_SCANCODE_UP]; keystate.down = state[SDL_SCANCODE_DOWN]; for (int spriteId : game_.getSprites()) { Sprite& sprite = game_.getSprite(spriteId); if (sprite.controllable) { bool directed = false; Direction dir = Direction::left; if (keystate.up) { directed = true; dir = Direction::up; } else if (keystate.down) { directed = true; dir = Direction::down; } if (keystate.left) { directed = true; if (dir == Direction::up) { dir = Direction::up_left; } else if (dir == Direction::down) { dir = Direction::down_left; } else { dir = Direction::left; } } else if (keystate.right) { directed = true; if (dir == Direction::up) { dir = Direction::up_right; } else if (dir == Direction::down) { dir = Direction::down_right; } else { dir = Direction::right; } } if (directed) { game_.getSystem().moveInDirection(spriteId, dir); } else { game_.getSystem().stopDirecting(spriteId); } } } }