aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorBad Diode <bd@badd10de.dev>2021-05-24 09:31:32 +0200
committerBad Diode <bd@badd10de.dev>2021-05-24 09:31:32 +0200
commite07f072de45d23ab17661e3ea6bd3c707f04aa35 (patch)
treed4b17b9e3b1ceaa502dbd5f19c0d7dda377d39fa /src
parent4814d3b4ab1df2d48ad4cd20be90ec06386d077f (diff)
downloaduxngba-e07f072de45d23ab17661e3ea6bd3c707f04aa35.tar.gz
uxngba-e07f072de45d23ab17661e3ea6bd3c707f04aa35.zip
Enable setting macros to control available ctrl devices
Diffstat (limited to 'src')
-rw-r--r--src/main.c30
-rw-r--r--src/uxn/devices/ppu.c4
2 files changed, 21 insertions, 13 deletions
diff --git a/src/main.c b/src/main.c
index b075f4a..e30035a 100644
--- a/src/main.c
+++ b/src/main.c
@@ -30,8 +30,8 @@ WITH REGARD TO THIS SOFTWARE.
30#define TEXT_LAYER ppu.fg 30#define TEXT_LAYER ppu.fg
31#endif 31#endif
32 32
33#ifndef DEFAULT_CONTROL 33#ifndef CONTROL_METHODS
34#define DEFAULT_CONTROL CONTROL_CONTROLLER 34#define CONTROL_METHODS CONTROL_CONTROLLER,CONTROL_MOUSE,CONTROL_KEYBOARD
35#endif 35#endif
36 36
37typedef enum { 37typedef enum {
@@ -40,7 +40,10 @@ typedef enum {
40 CONTROL_KEYBOARD, 40 CONTROL_KEYBOARD,
41} ControlMethod; 41} ControlMethod;
42 42
43static ControlMethod control_method = CONTROL_KEYBOARD; 43const ControlMethod ctrl_methods[] = {
44 CONTROL_METHODS
45};
46static ControlMethod ctrl_idx = 0;
44 47
45#define MOUSE_DELTA 1 48#define MOUSE_DELTA 1
46typedef struct Mouse { 49typedef struct Mouse {
@@ -167,12 +170,12 @@ void
167handle_input(Uxn *u) { 170handle_input(Uxn *u) {
168 poll_keys(); 171 poll_keys();
169 if (key_tap(KEY_SELECT)) { 172 if (key_tap(KEY_SELECT)) {
170 switch (control_method) { 173 // Reset control variables on method switch.
174 switch (ctrl_methods[ctrl_idx]) {
171 case CONTROL_CONTROLLER: { 175 case CONTROL_CONTROLLER: {
172 devctrl->dat[2] = 0; 176 devctrl->dat[2] = 0;
173 evaluxn(u, mempeek16(devctrl->dat, 0)); 177 evaluxn(u, mempeek16(devctrl->dat, 0));
174 devctrl->dat[3] = 0; 178 devctrl->dat[3] = 0;
175 control_method = CONTROL_MOUSE;
176 } break; 179 } break;
177 case CONTROL_MOUSE: { 180 case CONTROL_MOUSE: {
178 devmouse->dat[6] = 0; 181 devmouse->dat[6] = 0;
@@ -180,17 +183,22 @@ handle_input(Uxn *u) {
180 mempoke16(devmouse->dat, 0x2, -10); 183 mempoke16(devmouse->dat, 0x2, -10);
181 mempoke16(devmouse->dat, 0x4, -10); 184 mempoke16(devmouse->dat, 0x4, -10);
182 evaluxn(u, mempeek16(devmouse->dat, 0)); 185 evaluxn(u, mempeek16(devmouse->dat, 0));
183 toggle_keyboard();
184 control_method = CONTROL_KEYBOARD;
185 } break; 186 } break;
186 case CONTROL_KEYBOARD: { 187 case CONTROL_KEYBOARD: {
187 toggle_keyboard(); 188 toggle_keyboard();
188 control_method = CONTROL_CONTROLLER;
189 } break; 189 } break;
190 } 190 }
191
192 // Update ctrl_idx.
193 ctrl_idx = ctrl_idx + 1 > LEN(ctrl_methods) - 1 ? 0 : ctrl_idx + 1;
194
195 // Initialize controller variables here.
196 if (ctrl_methods[ctrl_idx] == CONTROL_KEYBOARD) {
197 toggle_keyboard();
198 }
191 } 199 }
192 200
193 if (control_method == CONTROL_CONTROLLER) { 201 if (ctrl_methods[ctrl_idx] == CONTROL_CONTROLLER) {
194 // TODO: We don't need ifs if we use KEY_INPUTS directly and mayvbe just 202 // TODO: We don't need ifs if we use KEY_INPUTS directly and mayvbe just
195 // swap some things if needed. 203 // swap some things if needed.
196 u8 *flag = &devctrl->dat[2]; 204 u8 *flag = &devctrl->dat[2];
@@ -237,7 +245,7 @@ handle_input(Uxn *u) {
237 245
238 evaluxn(u, mempeek16(devctrl->dat, 0)); 246 evaluxn(u, mempeek16(devctrl->dat, 0));
239 devctrl->dat[3] = 0; 247 devctrl->dat[3] = 0;
240 } else if (control_method == CONTROL_MOUSE) { 248 } else if (ctrl_methods[ctrl_idx] == CONTROL_MOUSE) {
241 // Detect "mouse key press". 249 // Detect "mouse key press".
242 u8 flag = devmouse->dat[6]; 250 u8 flag = devmouse->dat[6];
243 if (key_tap(KEY_B)) { 251 if (key_tap(KEY_B)) {
@@ -276,7 +284,7 @@ handle_input(Uxn *u) {
276 mempoke16(devmouse->dat, 0x2, mouse.x); 284 mempoke16(devmouse->dat, 0x2, mouse.x);
277 mempoke16(devmouse->dat, 0x4, mouse.y); 285 mempoke16(devmouse->dat, 0x4, mouse.y);
278 evaluxn(u, mempeek16(devmouse->dat, 0)); 286 evaluxn(u, mempeek16(devmouse->dat, 0));
279 } else if (control_method == CONTROL_KEYBOARD) { 287 } else if (ctrl_methods[ctrl_idx] == CONTROL_KEYBOARD) {
280 if (key_tap(KEY_LEFT)) { 288 if (key_tap(KEY_LEFT)) {
281 update_cursor(cursor_position - 1); 289 update_cursor(cursor_position - 1);
282 } else if (key_tap(KEY_RIGHT)) { 290 } else if (key_tap(KEY_RIGHT)) {
diff --git a/src/uxn/devices/ppu.c b/src/uxn/devices/ppu.c
index 7a4429c..f626604 100644
--- a/src/uxn/devices/ppu.c
+++ b/src/uxn/devices/ppu.c
@@ -401,7 +401,7 @@ initppu(Ppu *p, u8 hor, u8 ver, u8 pad) {
401 for (size_t i = 0; i < sizeof(keyboard) / sizeof(keyboard[0]); ++i) { 401 for (size_t i = 0; i < sizeof(keyboard) / sizeof(keyboard[0]); ++i) {
402 keyboard[i].x = tile_x * 8; 402 keyboard[i].x = tile_x * 8;
403 keyboard[i].y = tile_y * 8; 403 keyboard[i].y = tile_y * 8;
404 OBJ_ATTR_0(i) = OBJ_SHAPE_SQUARE | OBJ_Y_COORD(keyboard[i].y); 404 OBJ_ATTR_0(i) = OBJ_SHAPE_SQUARE | OBJ_Y_COORD(keyboard[i].y) | OBJ_HIDDEN;
405 OBJ_ATTR_1(i) = OBJ_SIZE_SMALL | OBJ_X_COORD(keyboard[i].x); 405 OBJ_ATTR_1(i) = OBJ_SIZE_SMALL | OBJ_X_COORD(keyboard[i].x);
406 OBJ_ATTR_2(i) = (SPRITE_START_IDX + keyboard[i].symbol) | OBJ_PAL_BANK(0); 406 OBJ_ATTR_2(i) = (SPRITE_START_IDX + keyboard[i].symbol) | OBJ_PAL_BANK(0);
407 tile_x++; 407 tile_x++;
@@ -410,7 +410,7 @@ initppu(Ppu *p, u8 hor, u8 ver, u8 pad) {
410 tile_y++; 410 tile_y++;
411 } 411 }
412 } 412 }
413 OBJ_ATTR_0(127) = OBJ_SHAPE_SQUARE | OBJ_Y_COORD(keyboard[cursor_position].y); 413 OBJ_ATTR_0(127) = OBJ_SHAPE_SQUARE | OBJ_Y_COORD(keyboard[cursor_position].y) | OBJ_HIDDEN;
414 OBJ_ATTR_1(127) = OBJ_SIZE_SMALL | OBJ_X_COORD(keyboard[cursor_position].x); 414 OBJ_ATTR_1(127) = OBJ_SIZE_SMALL | OBJ_X_COORD(keyboard[cursor_position].x);
415 OBJ_ATTR_2(127) = (SPRITE_START_IDX + 0xdb) | OBJ_PAL_BANK(3); 415 OBJ_ATTR_2(127) = (SPRITE_START_IDX + 0xdb) | OBJ_PAL_BANK(3);
416 416