Path: blob/master/src/pc/controller/controller_keyboard.c
7861 views
#include <stdbool.h>1#include <ultra64.h>23#include "controller_api.h"45#ifdef TARGET_WEB6#include "controller_emscripten_keyboard.h"7#endif89#include "game/settings.h"1011static int keyboard_buttons_down;1213static long mouse_x;14static long mouse_y;15static s8 mouse_wheel;1617static int keyboard_mapping[15][2];1819static int keyboard_map_scancode(int scancode) {20int ret = 0;21for (size_t i = 0; i < sizeof(keyboard_mapping) / sizeof(keyboard_mapping[0]); i++) {22if (keyboard_mapping[i][0] == scancode) {23ret |= keyboard_mapping[i][1];24}25}26return ret;27}2829bool keyboard_on_key_down(int scancode) {30int mapped = keyboard_map_scancode(scancode);31keyboard_buttons_down |= mapped;32return mapped != 0;33}3435bool keyboard_on_key_up(int scancode) {36int mapped = keyboard_map_scancode(scancode);37keyboard_buttons_down &= ~mapped;38return mapped != 0;39}4041void keyboard_on_all_keys_up(void) {42keyboard_buttons_down = 0;43}4445void keyboard_on_mouse_move(long x, long y) {46mouse_x = x;47mouse_y = y;48}4950void keyboard_on_mouse_press(s8 left, s8 right, s8 middle, s8 wheel) {51if (!configMouseCam)52return;5354if (left > 0)55keyboard_buttons_down |= configMouseLeft;56if (left < 0)57keyboard_buttons_down &= ~configMouseLeft;5859if (right > 0)60keyboard_buttons_down |= configMouseRight;61if (right < 0)62keyboard_buttons_down &= ~configMouseRight;6364if (middle > 0)65keyboard_buttons_down |= configMouseMiddle;66if (middle < 0)67keyboard_buttons_down &= ~configMouseMiddle;6869if (wheel < 0) {70keyboard_buttons_down |= configMouseWheelDown;71mouse_wheel = wheel;72}73if (wheel > 0) {74keyboard_buttons_down |= configMouseWheelUp;75mouse_wheel = wheel;76}77}7879static void set_keyboard_mapping(int index, int mask, int scancode) {80keyboard_mapping[index][0] = scancode;81keyboard_mapping[index][1] = mask;82}8384static void keyboard_init(void) {85int i = 0;8687set_keyboard_mapping(i++, 0x80000, configKeyStickUp);88set_keyboard_mapping(i++, 0x10000, configKeyStickLeft);89set_keyboard_mapping(i++, 0x40000, configKeyStickDown);90set_keyboard_mapping(i++, 0x20000, configKeyStickRight);91set_keyboard_mapping(i++, A_BUTTON, configKeyA);92set_keyboard_mapping(i++, B_BUTTON, configKeyB);93set_keyboard_mapping(i++, Z_TRIG, configKeyZ);94if (configImprovedCamera) {95set_keyboard_mapping(i++, U_CBUTTONS, configKeyCUp);96set_keyboard_mapping(i++, 0x100000, configKeyCLeft);97set_keyboard_mapping(i++, D_CBUTTONS, configKeyCDown);98set_keyboard_mapping(i++, 0x200000, configKeyCRight);99}100else {101set_keyboard_mapping(i++, U_CBUTTONS, configKeyCUp);102set_keyboard_mapping(i++, L_CBUTTONS, configKeyCLeft);103set_keyboard_mapping(i++, D_CBUTTONS, configKeyCDown);104set_keyboard_mapping(i++, R_CBUTTONS, configKeyCRight);105}106set_keyboard_mapping(i++, L_TRIG, configKeyL);107set_keyboard_mapping(i++, R_TRIG, configKeyR);108set_keyboard_mapping(i++, START_BUTTON, configKeyStart);109set_keyboard_mapping(i++, 0x1000000, configKeyWalk);110111#ifdef TARGET_WEB112controller_emscripten_keyboard_init();113#endif114}115116static void keyboard_read(OSContPad *pad) {117// Camera movement with mouse118if (configMouseCam) {119if (mouse_x != 0)120pad->stick2_x = mouse_x*configMouseSensitivity;121if (mouse_y != 0)122pad->stick2_y = mouse_y*configMouseSensitivity;123if (mouse_wheel < -1) {124keyboard_buttons_down &= ~configMouseWheelDown;125mouse_wheel = 0;126}127if (mouse_wheel > 1) {128keyboard_buttons_down &= ~configMouseWheelUp;129mouse_wheel = 0;130}131mouse_wheel *= 2;132}133134pad->button |= keyboard_buttons_down;135if ((keyboard_buttons_down & 0x30000) == 0x10000) {136pad->stick_x = (keyboard_buttons_down & 0x1000000) ? -32 : -128;137}138if ((keyboard_buttons_down & 0x30000) == 0x20000) {139pad->stick_x = (keyboard_buttons_down & 0x1000000) ? 32 : 127;140}141if ((keyboard_buttons_down & 0xc0000) == 0x40000) {142pad->stick_y = (keyboard_buttons_down & 0x1000000) ? -32 : -128;143}144if ((keyboard_buttons_down & 0xc0000) == 0x80000) {145pad->stick_y = (keyboard_buttons_down & 0x1000000) ? 32 : 127;146}147148if ((keyboard_buttons_down & 0x300000) == 0x100000) {149pad->stick2_x = -80;150}151if ((keyboard_buttons_down & 0x300000) == 0x200000) {152pad->stick2_x = 80;153}154if ((keyboard_buttons_down & 0xc00000) == 0x400000) {155pad->stick2_y = -80;156}157if ((keyboard_buttons_down & 0xc00000) == 0x800000) {158pad->stick2_y = 80;159}160}161162struct ControllerAPI controller_keyboard = {163keyboard_init,164keyboard_read,165NULL,166NULL167};168169