#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" #include "menu_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) { game_.quit(); return; } else if (e.type == SDL_TEXTINPUT) { debugText_.append(e.text.text); } else if (e.type == SDL_KEYDOWN) { if (e.key.keysym.sym == SDLK_ESCAPE) { if (debugConsole_) { debugConsole_ = false; game_.unpauseGameplay(); SDL_StopTextInput(); debugText_.clear(); } else { if (game_.getSystem().isMenuOpen()) { game_.getSystem().closePauseMenu(); } else if (!game_.isGameplayPaused()) { game_.getSystem().openPauseMenu(); } } } else if (e.key.keysym.sym == SDLK_BACKQUOTE) { #ifdef TANETANE_DEBUG if (!debugConsole_ && !game_.isGameplayPaused()) { debugConsole_ = true; game_.pauseGameplay(); SDL_StartTextInput(); debugText_.clear(); } #endif } else if (debugConsole_ && e.key.keysym.sym == SDLK_RETURN) { game_.getSystem().runDebugScript(debugText_); debugText_.clear(); } else if (debugConsole_ && e.key.keysym.sym == SDLK_BACKSPACE) { // Make sure to keep the backtick/heart. if (!debugText_.empty()) { debugText_.pop_back(); } } else if (debugConsole_ && e.key.keysym.sym == SDLK_v && SDL_GetModState() & (KMOD_CTRL | KMOD_GUI)) { // CTRL-V or CMD-V bc I have a Mac thanks char* clipboardText = SDL_GetClipboardText(); debugText_.append(clipboardText); SDL_free(clipboardText); } else if (e.key.keysym.sym == SDLK_m) { if (!debugConsole_ && !game_.getSystem().isMenuOpen()) { if (game_.getMixer().isMusicMuted()) { game_.getMixer().unmuteMusic(); } else { game_.getMixer().muteMusic(); } } } else if (e.key.keysym.sym == SDLK_LSHIFT || e.key.keysym.sym == SDLK_RSHIFT) { if (game_.isGameplayPaused()) continue; 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 (game_.getSystem().isMenuOpen()) { game_.getSystem().activateOption(); } if (game_.isGameplayPaused()) continue; // 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) { // Interacting with objects always uses Lucas's movement speed. vec2i checkLoc = sprite.loc + (unitVecInDirection(sprite.dir) * LUCAS_MOVEMENT_SPEED); CollisionResult collision = game_.getSystem().checkCollision(spriteId, sprite.loc, checkLoc, sprite.dir); if (collision.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. for (int colliderSpriteId : collision.colliders) { game_.getSystem().setSpriteDirection(colliderSpriteId, oppositeDirection(sprite.dir)); Sprite& collider = game_.getSprite(colliderSpriteId); if (!collider.interactionScript.empty()) { game_.getSystem().runScript(game_.getMap().getName(), collider.interactionScript); activated = true; } } } } if (inFrontOfSomething && !activated) { game_.getSystem().runScript("global", "no_problem_here"); } } } else if (e.key.keysym.sym == SDLK_LEFT) { if (game_.getSystem().isMenuOpen()) { game_.getSystem().pressedLeft(); } if (game_.isGameplayPaused()) continue; if (game_.getSystem().isChoiceActive()) { game_.getSystem().selectFirstChoice(); } } else if (e.key.keysym.sym == SDLK_RIGHT) { if (game_.getSystem().isMenuOpen()) { game_.getSystem().pressedRight(); } if (game_.isGameplayPaused()) continue; if (game_.getSystem().isChoiceActive()) { game_.getSystem().selectSecondChoice(); } } else if (e.key.keysym.sym == SDLK_UP) { if (game_.getSystem().isMenuOpen()) { game_.getSystem().pressedUp(); } } else if (e.key.keysym.sym == SDLK_DOWN) { if (game_.getSystem().isMenuOpen()) { game_.getSystem().pressedDown(); } } } else if (e.type == SDL_KEYUP && (e.key.keysym.sym == SDLK_LSHIFT || e.key.keysym.sym == SDLK_RSHIFT)) { if (game_.isGameplayPaused()) continue; for (int spriteId : game_.getSprites()) { Sprite& sprite = game_.getSprite(spriteId); if (sprite.controllable) { game_.getSystem().endCrouch(spriteId); } } } } if (game_.isGameplayPaused()) return; 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); } } } }