#include "input.h" #include #include "gui.h" /* Copyright (c) 2013-2021 Devine Lu Linvega 2018 web port by rezmason 2021 C89 port by rezmason Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE. */ static void (*_handler)(InputType, int); static int mousePressed; static void processKey(SDL_Keycode sym, int down) { int found = 1; InputType inputType = -1; switch(sym) { #ifdef DEBUG case SDLK_1: case SDLK_KP_1: inputType = DEBUGINPUTTYPE_ENERGY; break; case SDLK_2: case SDLK_KP_2: inputType = DEBUGINPUTTYPE_CLOCK; break; case SDLK_3: case SDLK_KP_3: inputType = DEBUGINPUTTYPE_STUDIO; break; case SDLK_4: case SDLK_KP_4: inputType = DEBUGINPUTTYPE_SEAL_1; break; case SDLK_5: case SDLK_KP_5: inputType = DEBUGINPUTTYPE_SEAL_2; break; case SDLK_6: case SDLK_KP_6: inputType = DEBUGINPUTTYPE_SECRET; break; case SDLK_7: case SDLK_KP_7: inputType = DEBUGINPUTTYPE_TIME; break; case SDLK_8: case SDLK_KP_8: inputType = DEBUGINPUTTYPE_CHAPTER; break; case SDLK_9: case SDLK_KP_9: inputType = DEBUGINPUTTYPE_UNLOCK_DOORS; break; #endif case SDLK_a: case SDLK_LEFT: inputType = INPUTTYPE_LEFT; break; case SDLK_d: case SDLK_RIGHT: inputType = INPUTTYPE_RIGHT; break; case SDLK_w: case SDLK_UP: inputType = INPUTTYPE_CENTER; break; case SDLK_s: case SDLK_DOWN: inputType = INPUTTYPE_BACK; break; case SDLK_r: inputType = INPUTTYPE_RESET; break; case SDLK_q: inputType = INPUTTYPE_WALKTHROUGH; break; default: found = 0; break; } if(found) { (*_handler)(inputType, down); } GUI_HideCursor(); } static void processClick(int mouseX, int mouseY) { int found = 1; InputType inputType; RegionName clickedRegionName = GUI_GetRegionNameAt(mouseX, mouseY); switch(clickedRegionName) { case TRIGGER_ACTION: inputType = INPUTTYPE_ACTION; break; case TRIGGER_MOVE_FORWARD: inputType = INPUTTYPE_FORWARD; break; case TRIGGER_MOVE_LEFT: inputType = INPUTTYPE_LEFT; break; case TRIGGER_MOVE_RIGHT: inputType = INPUTTYPE_RIGHT; break; default: found = 0; break; } if(found) { (*_handler)(inputType, 1); } } void Input_Init(void (*handler)(InputType, int)) { _handler = handler; mousePressed = 0; } void Input_Quit() { _handler = NULL; } void Input_ProcessEvent(SDL_Event *event) { switch(event->type) { case SDL_KEYDOWN: processKey(event->key.keysym.sym, 1); break; case SDL_KEYUP: processKey(event->key.keysym.sym, 0); break; case SDL_MOUSEMOTION: GUI_UpdateCursor(event->motion.x, event->motion.y, mousePressed); break; case SDL_MOUSEBUTTONDOWN: mousePressed = 1; processClick(event->button.x, event->button.y); GUI_UpdateCursor(event->motion.x, event->motion.y, mousePressed); break; case SDL_MOUSEBUTTONUP: mousePressed = 0; GUI_UpdateCursor(event->motion.x, event->motion.y, mousePressed); break; } }