Artifact 9240091586aaf1ca24364a75bb79bb19e57d86a73aa2adf50ebf0efeaa0c2834:
- File
src/platform/3DS/OFGameController.m
— part of check-in
[a0f4283e81]
at
2024-05-05 18:59:50
on branch gamecontroller
— Add OFGameController
Only supports Nintendo 3DS so far. (user: js, size: 3502) [annotate] [blame] [check-ins using]
- File src/platform/Nintendo3DS/OFGameController.m — part of check-in [a7a6705d90] at 2024-05-05 19:22:25 on branch gamecontroller — OFGameController: Add support for Nintendo DS (user: js, size: 3502) [annotate] [blame] [check-ins using]
/* * Copyright (c) 2008-2024 Jonathan Schleifer <js@nil.im> * * All rights reserved. * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License version 3.0 only, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * version 3.0 for more details. * * You should have received a copy of the GNU Lesser General Public License * version 3.0 along with this program. If not, see * <https://www.gnu.org/licenses/>. */ #include "config.h" #import "OFGameController.h" #import "OFSet.h" #import "OFOutOfRangeException.h" #define id id_3ds #include <3ds.h> #undef id @interface OFGameController () - (instancetype)of_init OF_METHOD_FAMILY(init); @end static OFGameController *controller; static void initController(void) { controller = [[OFGameController alloc] of_init]; } @implementation OFGameController + (size_t)numControllers { return 1; } + (OFGameController *)controllerWithIndex: (size_t)index { static OFOnceControl onceControl = OFOnceControlInitValue; if (index > 0) @throw [OFOutOfRangeException exception]; OFOnce(&onceControl, initController); return [[controller retain] autorelease]; } - (instancetype)init { OF_INVALID_INIT_METHOD } - (instancetype)of_init { return [super init]; } - (OFSet *)buttons { return [OFSet setWithObjects: @"A", @"B", @"Select", @"Start", @"D-Pad Right", @"D-Pad Left", @"D-Pad Up", @"D-Pad Down", @"R", @"L", @"X", @"Y", @"ZL", @"ZR", @"C-Stick Right", @"C-Stick Left", @"C-Stick Up", @"C-Stick Down", nil]; } - (OFSet *)pressedButtons { OFMutableSet *pressedButtons = [OFMutableSet setWithCapacity: 18]; u32 keys; hidScanInput(); keys = hidKeysHeld(); if (keys & KEY_A) [pressedButtons addObject: @"A"]; if (keys & KEY_B) [pressedButtons addObject: @"A"]; if (keys & KEY_SELECT) [pressedButtons addObject: @"Select"]; if (keys & KEY_START) [pressedButtons addObject: @"Start"]; if (keys & KEY_DRIGHT) [pressedButtons addObject: @"D-Pad Right"]; if (keys & KEY_DLEFT) [pressedButtons addObject: @"D-Pad Left"]; if (keys & KEY_DUP) [pressedButtons addObject: @"D-Pad Up"]; if (keys & KEY_DDOWN) [pressedButtons addObject: @"D-Pad Down"]; if (keys & KEY_R) [pressedButtons addObject: @"R"]; if (keys & KEY_L) [pressedButtons addObject: @"L"]; if (keys & KEY_X) [pressedButtons addObject: @"X"]; if (keys & KEY_Y) [pressedButtons addObject: @"Y"]; if (keys & KEY_ZL) [pressedButtons addObject: @"ZL"]; if (keys & KEY_ZR) [pressedButtons addObject: @"ZR"]; if (keys & KEY_CSTICK_RIGHT) [pressedButtons addObject: @"C-Stick Right"]; if (keys & KEY_CSTICK_LEFT) [pressedButtons addObject: @"C-Stick Left"]; if (keys & KEY_CSTICK_UP) [pressedButtons addObject: @"C-Stick Up"]; if (keys & KEY_CSTICK_DOWN) [pressedButtons addObject: @"C-Stick Down"]; [pressedButtons makeImmutable]; return pressedButtons; } - (size_t)numAxes { return 1; } - (OFPoint)positionOfAxisWithIndex: (size_t)index { circlePosition pos; if (index > 0) @throw [OFOutOfRangeException exception]; hidCircleRead(&pos); return OFMakePoint( (float)pos.dx / (pos.dx < 0 ? INT16_MIN : INT16_MAX), (float)pos.dy / (pos.dy < 0 ? INT16_MIN : INT16_MAX)); } @end