Nimbin[12]?Games / Entropie / entropie/src/core/input.c

Entropie git · main

Entropie festival game; first steps

sdl c game entropie cmake · first commit 2026-10-10 · last commit 2026-11-02 (18 hours ago) · synced 10 hours ago

C 88.5% Markdown 9.1% GLSL 2.3%
git clone https://git.christianimmanuel.de/games/Entropie.gitwget https://git.christianimmanuel.de/games/Entropie/archive/Entropie.tar.gz
entropie/src/core/input.c 4 KB · 78 lines raw
#include "core/input.h"

#include <SDL3/SDL.h>
#include <stdio.h>
#include <string.h>

#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;
}