#include "core/input.h" #include #include #include #define MOUSE_SENSITIVITY 0.1f /* degrees per pixel */ void Input_poll(Input *input) { *input = (Input){ 0 }; SDL_Event event; while (SDL_PollEvent(&event)) { if (event.type == SDL_EVENT_QUIT) input->quit = true; if (event.type == SDL_EVENT_MOUSE_BUTTON_DOWN && event.button.button == SDL_BUTTON_LEFT) input->click = true; if (event.type == SDL_EVENT_MOUSE_BUTTON_DOWN && event.button.button == SDL_BUTTON_RIGHT) input->right_click = true; if (event.type == SDL_EVENT_TEXT_INPUT) { size_t have = strlen(input->text); snprintf(input->text + have, sizeof(input->text) - have, "%s", event.text.text); } if (event.type != SDL_EVENT_KEY_DOWN || event.key.repeat) continue; switch (event.key.scancode) { case SDL_SCANCODE_ESCAPE: input->escape = true; break; case SDL_SCANCODE_RETURN: case SDL_SCANCODE_KP_ENTER: input->enter = true; break; case SDL_SCANCODE_Q: input->use_left = true; break; case SDL_SCANCODE_E: input->use_right = true; break; case SDL_SCANCODE_V: input->toggle_view = true; break; case SDL_SCANCODE_G: input->call_help = true; break; case SDL_SCANCODE_T: input->throw_item = true; break; case SDL_SCANCODE_X: input->talk = true; break; case SDL_SCANCODE_C: input->sit = true; break; case SDL_SCANCODE_R: input->call = true; break; case SDL_SCANCODE_H: input->dismiss_help = true; break; case SDL_SCANCODE_BACKSPACE: input->cancel = input->erase = true; break; case SDL_SCANCODE_I: input->show_keys = true; break; case SDL_SCANCODE_TAB: input->show_stats = true; break; case SDL_SCANCODE_P: input->pee = true; break; case SDL_SCANCODE_K: input->smoke = true; break; case SDL_SCANCODE_B: input->pockets = true; break; case SDL_SCANCODE_J: input->notes = true; break; case SDL_SCANCODE_Z: input->sleep = true; break; case SDL_SCANCODE_LSHIFT: input->sprint_tap = true; break; case SDL_SCANCODE_1: input->choice = 1; break; case SDL_SCANCODE_2: input->choice = 2; break; case SDL_SCANCODE_3: input->choice = 3; break; case SDL_SCANCODE_4: input->choice = 4; break; case SDL_SCANCODE_5: input->choice = 5; break; case SDL_SCANCODE_RIGHT: input->page = 1; break; case SDL_SCANCODE_LEFT: input->page = -1; break; case SDL_SCANCODE_DOWN: input->menu_move = 1; break; case SDL_SCANCODE_UP: input->menu_move = -1; break; case SDL_SCANCODE_F1: input->dev_menu = true; break; case SDL_SCANCODE_F2: input->crew_menu = true; break; case SDL_SCANCODE_F5: input->quick_save = true; break; case SDL_SCANCODE_F9: input->quick_load = true; break; case SDL_SCANCODE_M: input->mute = true; break; default: break; } } const bool *keys = SDL_GetKeyboardState(NULL); if (keys[SDL_SCANCODE_W]) input->move_forward += 1.0f; if (keys[SDL_SCANCODE_S]) input->move_forward -= 1.0f; if (keys[SDL_SCANCODE_D]) input->move_right += 1.0f; if (keys[SDL_SCANCODE_A]) input->move_right -= 1.0f; input->jump = keys[SDL_SCANCODE_SPACE]; input->sprint = keys[SDL_SCANCODE_LSHIFT]; input->grab = keys[SDL_SCANCODE_F]; input->free_look = keys[SDL_SCANCODE_LCTRL] || keys[SDL_SCANCODE_RCTRL]; input->throw_held = keys[SDL_SCANCODE_T]; float dx = 0.0f, dy = 0.0f; SDL_GetRelativeMouseState(&dx, &dy); input->click_held = (SDL_GetMouseState(&input->mouse_x, &input->mouse_y) & SDL_BUTTON_LMASK) != 0; input->look_yaw = dx * MOUSE_SENSITIVITY; input->look_pitch = -dy * MOUSE_SENSITIVITY; }