From 6b829894aa3194329ddd696109a4ec75c61be903 Mon Sep 17 00:00:00 2001 From: Marc Riera Irigoyen Date: Wed, 19 May 2021 12:31:03 +0200 Subject: [PATCH] Add 103 series scripts and D-pad support --- ...S4-T1.gpc => DenshaDeGoPS1ToPS4_103-T1.gpc | 105 ++++++-- DenshaDeGoPS1ToPS4_General-T1.gpc | 241 ++++++++++++++++++ ...T1.gpc => DenshaDeGoPS1ToSwitch_103-T1.gpc | 105 ++++++-- DenshaDeGoPS1ToSwitch_General-T1.gpc | 241 ++++++++++++++++++ README.md | 9 + 5 files changed, 665 insertions(+), 36 deletions(-) rename DenshaDeGoPS1ToPS4-T1.gpc => DenshaDeGoPS1ToPS4_103-T1.gpc (72%) mode change 100644 => 100755 create mode 100755 DenshaDeGoPS1ToPS4_General-T1.gpc rename DenshaDeGoPS1ToSwitch-T1.gpc => DenshaDeGoPS1ToSwitch_103-T1.gpc (72%) mode change 100644 => 100755 create mode 100755 DenshaDeGoPS1ToSwitch_General-T1.gpc diff --git a/DenshaDeGoPS1ToPS4-T1.gpc b/DenshaDeGoPS1ToPS4_103-T1.gpc old mode 100644 new mode 100755 similarity index 72% rename from DenshaDeGoPS1ToPS4-T1.gpc rename to DenshaDeGoPS1ToPS4_103-T1.gpc index 001919b..31b0872 --- a/DenshaDeGoPS1ToPS4-T1.gpc +++ b/DenshaDeGoPS1ToPS4_103-T1.gpc @@ -3,9 +3,13 @@ // Based on the code by EddieLau for the Titan Two: https://github.com/tylau0/DenGo/blob/main/DenshaDeGoPS1ToPS4MayFlash.gpc // Requires enabling advanced controls (analog pressure + non-step) +// Holding START enables the use of buttons as a D-Pad (to navigate menus) + // Adjust the following values to the input indices from your adapter +define DPAD_UP = HID_BUTTON_10; +define DPAD_DOWN = HID_BUTTON_11; define DPAD_LEFT = HID_BUTTON_12; define DPAD_RIGHT = HID_BUTTON_13; @@ -35,72 +39,81 @@ remap BUTTON_L2 -> PS4_L2; remap HID_STICK_2_X -> PS4_LX; remap HID_STICK_2_Y -> PS4_LY; remap HID_STICK_1_X -> PS4_RX; +remap DPAD_UP -> PS4_UP; +remap DPAD_DOWN -> PS4_DOWN; +remap DPAD_LEFT -> PS4_LEFT; +remap DPAD_RIGHT -> PS4_RIGHT; int LAST_PS4_RX = 0; int LAST_PS4_LX = 0; int LAST_PS4_LY = 0; int LAST_PS4_L2 = 0; +int DPAD_MODE = 0; +int START_HOLD = 0; + main { - // Green light - set_led(LED_1, 0); - set_led(LED_2, 0); - set_led(LED_3, 1); + // Green light + set_led(LED_1, 0); + set_led(LED_2, 0); + set_led(LED_3, 1); + + toggle_dpad_mode(); // Brake if (!get_val(BUTTON_L1) && !get_val(BUTTON_L2) && !get_val(BUTTON_R1) && !get_val(BUTTON_R2) && LAST_PS4_LY <= 0) { // EB LAST_PS4_RX = 100; LAST_PS4_LX = 0; - LAST_PS4_LY = -100; + LAST_PS4_LY = 0; LAST_PS4_L2 = 100; } else if (!get_val(BUTTON_L1) && get_val(BUTTON_L2) && get_val(BUTTON_R1) && !get_val(BUTTON_R2) && LAST_PS4_LY <= 0) { // B8 LAST_PS4_RX = 100; LAST_PS4_LX = 0; - LAST_PS4_LY = -100; + LAST_PS4_LY = 0; LAST_PS4_L2 = 0; } else if (get_val(BUTTON_L1) && get_val(BUTTON_L2) && get_val(BUTTON_R1) && !get_val(BUTTON_R2) && LAST_PS4_LY <= 0) { // B7 LAST_PS4_RX = 90; LAST_PS4_LX = 0; - LAST_PS4_LY = -90; + LAST_PS4_LY = 0; LAST_PS4_L2 = 0; } else if (!get_val(BUTTON_L1) && !get_val(BUTTON_L2) && !get_val(BUTTON_R1) && get_val(BUTTON_R2) && LAST_PS4_LY <= 0) { // B6 LAST_PS4_RX = 80; LAST_PS4_LX = 0; - LAST_PS4_LY = -80; + LAST_PS4_LY = 0; LAST_PS4_L2 = 0; } else if (get_val(BUTTON_L1) && !get_val(BUTTON_L2) && !get_val(BUTTON_R1) && get_val(BUTTON_R2) && LAST_PS4_LY <= 0) { // B5 LAST_PS4_RX = 70; LAST_PS4_LX = 0; - LAST_PS4_LY = -70 + LAST_PS4_LY = 0; LAST_PS4_L2 = 0; } else if (!get_val(BUTTON_L1) && get_val(BUTTON_L2) && !get_val(BUTTON_R1) && get_val(BUTTON_R2) && LAST_PS4_LY <= 0) { // B4 LAST_PS4_RX = 60; LAST_PS4_LX = 0; - LAST_PS4_LY = -60; + LAST_PS4_LY = 0; LAST_PS4_L2 = 0; } else if (get_val(BUTTON_L1) && get_val(BUTTON_L2) && !get_val(BUTTON_R1) && get_val(BUTTON_R2) && LAST_PS4_LY <= 0) { // B3 LAST_PS4_RX = 50; LAST_PS4_LX = 0; - LAST_PS4_LY = -50; + LAST_PS4_LY = 0; LAST_PS4_L2 = 0; } else if (!get_val(BUTTON_L1) && !get_val(BUTTON_L2) && get_val(BUTTON_R1) && get_val(BUTTON_R2) && LAST_PS4_LY <= 0) { // B2 LAST_PS4_RX = 40; LAST_PS4_LX = 0; - LAST_PS4_LY = -40; + LAST_PS4_LY = 0; LAST_PS4_L2 = 0; } else if (get_val(BUTTON_L1) && !get_val(BUTTON_L2) && get_val(BUTTON_R1) && get_val(BUTTON_R2) && LAST_PS4_LY <= 0) { // B1 LAST_PS4_RX = 30; LAST_PS4_LX = 0; - LAST_PS4_LY = -30; + LAST_PS4_LY = 0; LAST_PS4_L2 = 0; } else if (!get_val(BUTTON_L1) && get_val(BUTTON_L2) && get_val(BUTTON_R1) && get_val(BUTTON_R2) && LAST_PS4_LY <= 0) { // B0 @@ -114,14 +127,14 @@ main { if (get_val(BUTTON_TRIANGLE) && !get_val(DPAD_LEFT) && !get_val(DPAD_RIGHT) && LAST_PS4_LY >= 0) { // P5 LAST_PS4_RX = 0; LAST_PS4_LX = -100; - LAST_PS4_LY = 100; + LAST_PS4_LY = 0; LAST_PS4_L2 = 0; } else if (!get_val(BUTTON_TRIANGLE) && get_val(DPAD_LEFT) && !get_val(DPAD_RIGHT) && LAST_PS4_LY >= 0) { // P4 if (LAST_PS4_LY >= 70) { LAST_PS4_RX = 0; LAST_PS4_LX = -85; - LAST_PS4_LY = 85; + LAST_PS4_LY = 0; LAST_PS4_L2 = 0; } else { // P0 for adapters which don't support simultaneous DPAD presses @@ -134,19 +147,19 @@ main { else if (get_val(BUTTON_TRIANGLE) && get_val(DPAD_LEFT) && !get_val(DPAD_RIGHT) && LAST_PS4_LY >= 0) { // P3 LAST_PS4_RX = 0; LAST_PS4_LX = -70; - LAST_PS4_LY = 70; + LAST_PS4_LY = 0; LAST_PS4_L2 = 0; } else if (!get_val(BUTTON_TRIANGLE) && !get_val(DPAD_LEFT) && get_val(DPAD_RIGHT) && LAST_PS4_LY >= 0) { // P2 LAST_PS4_RX = 0; LAST_PS4_LX = -50; - LAST_PS4_LY = 50; + LAST_PS4_LY = 0; LAST_PS4_L2 = 0; } else if (get_val(BUTTON_TRIANGLE) && !get_val(DPAD_LEFT) && get_val(DPAD_RIGHT) && LAST_PS4_LY >= 0) { // P1 LAST_PS4_RX = 0; LAST_PS4_LX = -30; - LAST_PS4_LY = 30; + LAST_PS4_LY = 0; LAST_PS4_L2 = 0; } else if (!get_val(BUTTON_TRIANGLE) && get_val(DPAD_LEFT) && get_val(DPAD_RIGHT) && LAST_PS4_LY >= 0) { // P0 @@ -162,6 +175,62 @@ main { set_val(PS4_L2, LAST_PS4_L2); clear_input(); + + // Press SELECT+START to use buttons as D-pad + if (DPAD_MODE == 1) { + if (get_val(BUTTON_SELECT)) { + set_val(PS4_UP, 100); + } + else { + set_val(PS4_UP, 0); + } + if (get_val(BUTTON_CROSS)) { + set_val(PS4_DOWN, 100); + } + else { + set_val(PS4_DOWN, 0); + } + if (get_val(BUTTON_SQUARE)) { + set_val(PS4_LEFT, 100); + } + else { + set_val(PS4_LEFT, 0); + } + if (get_val(BUTTON_CIRCLE)) { + set_val(PS4_RIGHT, 100); + } + else { + set_val(PS4_RIGHT, 0); + } + set_val(BUTTON_SELECT, 0); + set_val(BUTTON_SQUARE, 0); + set_val(BUTTON_CIRCLE, 0); + set_val(BUTTON_CROSS, 0); + } + else { + set_val(PS4_UP, 0); + set_val(PS4_DOWN, 0); + set_val(PS4_LEFT, 0); + set_val(PS4_RIGHT, 0); + } +} + +function toggle_dpad_mode() { // Toggle D-Pad mode + if (get_val(BUTTON_START)) { + START_HOLD = START_HOLD + 1; + } + else { + START_HOLD = 0; + } + + if (START_HOLD > 15) { + set_val(BUTTON_START, 0); + DPAD_MODE = 1; + } + else { + DPAD_MODE = 0; + } + return; } function clear_input() { // Clear unwanted input diff --git a/DenshaDeGoPS1ToPS4_General-T1.gpc b/DenshaDeGoPS1ToPS4_General-T1.gpc new file mode 100755 index 0000000..4937b87 --- /dev/null +++ b/DenshaDeGoPS1ToPS4_General-T1.gpc @@ -0,0 +1,241 @@ +// Script to use PS1/N64/SS/DC Densha de GO! controllers with Densha de GO! Hashirou Yamanote Sen (PS4/Switch) + +// Based on the code by EddieLau for the Titan Two: https://github.com/tylau0/DenGo/blob/main/DenshaDeGoPS1ToPS4MayFlash.gpc +// Requires enabling advanced controls (analog pressure + non-step) + +// Holding START enables the use of buttons as a D-Pad (to navigate menus) + + +// Adjust the following values to the input indices from your adapter + +define DPAD_UP = HID_BUTTON_10; +define DPAD_DOWN = HID_BUTTON_11; +define DPAD_LEFT = HID_BUTTON_12; +define DPAD_RIGHT = HID_BUTTON_13; + +define BUTTON_SELECT = HID_BUTTON_2; +define BUTTON_START = HID_BUTTON_3; + +define BUTTON_R1 = HID_BUTTON_4; +define BUTTON_R2 = HID_BUTTON_5; +define BUTTON_L1 = HID_BUTTON_7; +define BUTTON_L2 = HID_BUTTON_8; + +define BUTTON_TRIANGLE = HID_BUTTON_14; +define BUTTON_SQUARE = HID_BUTTON_15; +define BUTTON_CIRCLE = HID_BUTTON_16; +define BUTTON_CROSS = HID_BUTTON_17; + + +// Do not modify anything from here on + +unmap ALL_REMAPS; +remap BUTTON_SELECT -> PS4_TRIANGLE; +remap BUTTON_START -> PS4_OPTIONS; +remap BUTTON_SQUARE -> PS4_SQUARE; +remap BUTTON_CIRCLE -> PS4_CIRCLE; +remap BUTTON_CROSS -> PS4_CROSS; +remap BUTTON_L2 -> PS4_L2; +remap HID_STICK_2_X -> PS4_LX; +remap HID_STICK_2_Y -> PS4_LY; +remap HID_STICK_1_X -> PS4_RX; +remap DPAD_UP -> PS4_UP; +remap DPAD_DOWN -> PS4_DOWN; +remap DPAD_LEFT -> PS4_LEFT; +remap DPAD_RIGHT -> PS4_RIGHT; + +int LAST_PS4_RX = 0; +int LAST_PS4_LX = 0; +int LAST_PS4_LY = 0; +int LAST_PS4_L2 = 0; + +int DPAD_MODE = 0; +int START_HOLD = 0; + +main { + + // Green light + set_led(LED_1, 0); + set_led(LED_2, 0); + set_led(LED_3, 1); + + toggle_dpad_mode(); + + // Brake + if (!get_val(BUTTON_L1) && !get_val(BUTTON_L2) && !get_val(BUTTON_R1) && !get_val(BUTTON_R2) && LAST_PS4_LY <= 0) { // EB + LAST_PS4_RX = 0; + LAST_PS4_LX = 0; + LAST_PS4_LY = -100; + LAST_PS4_L2 = 100; + } + else if (!get_val(BUTTON_L1) && get_val(BUTTON_L2) && get_val(BUTTON_R1) && !get_val(BUTTON_R2) && LAST_PS4_LY <= 0) { // B8 + LAST_PS4_RX = 0; + LAST_PS4_LX = 0; + LAST_PS4_LY = -100; + LAST_PS4_L2 = 0; + } + else if (get_val(BUTTON_L1) && get_val(BUTTON_L2) && get_val(BUTTON_R1) && !get_val(BUTTON_R2) && LAST_PS4_LY <= 0) { // B7 + LAST_PS4_RX = 0; + LAST_PS4_LX = 0; + LAST_PS4_LY = -90; + LAST_PS4_L2 = 0; + } + else if (!get_val(BUTTON_L1) && !get_val(BUTTON_L2) && !get_val(BUTTON_R1) && get_val(BUTTON_R2) && LAST_PS4_LY <= 0) { // B6 + LAST_PS4_RX = 0; + LAST_PS4_LX = 0; + LAST_PS4_LY = -80; + LAST_PS4_L2 = 0; + } + else if (get_val(BUTTON_L1) && !get_val(BUTTON_L2) && !get_val(BUTTON_R1) && get_val(BUTTON_R2) && LAST_PS4_LY <= 0) { // B5 + LAST_PS4_RX = 0; + LAST_PS4_LX = 0; + LAST_PS4_LY = -70; + LAST_PS4_L2 = 0; + } + else if (!get_val(BUTTON_L1) && get_val(BUTTON_L2) && !get_val(BUTTON_R1) && get_val(BUTTON_R2) && LAST_PS4_LY <= 0) { // B4 + LAST_PS4_RX = 0; + LAST_PS4_LX = 0; + LAST_PS4_LY = -60; + LAST_PS4_L2 = 0; + } + else if (get_val(BUTTON_L1) && get_val(BUTTON_L2) && !get_val(BUTTON_R1) && get_val(BUTTON_R2) && LAST_PS4_LY <= 0) { // B3 + LAST_PS4_RX = 0; + LAST_PS4_LX = 0; + LAST_PS4_LY = -50; + LAST_PS4_L2 = 0; + } + else if (!get_val(BUTTON_L1) && !get_val(BUTTON_L2) && get_val(BUTTON_R1) && get_val(BUTTON_R2) && LAST_PS4_LY <= 0) { // B2 + LAST_PS4_RX = 0; + LAST_PS4_LX = 0; + LAST_PS4_LY = -40; + LAST_PS4_L2 = 0; + } + else if (get_val(BUTTON_L1) && !get_val(BUTTON_L2) && get_val(BUTTON_R1) && get_val(BUTTON_R2) && LAST_PS4_LY <= 0) { // B1 + LAST_PS4_RX = 0; + LAST_PS4_LX = 0; + LAST_PS4_LY = -30; + LAST_PS4_L2 = 0; + } + else if (!get_val(BUTTON_L1) && get_val(BUTTON_L2) && get_val(BUTTON_R1) && get_val(BUTTON_R2) && LAST_PS4_LY <= 0) { // B0 + LAST_PS4_RX = 0; + LAST_PS4_LX = 0; + LAST_PS4_LY = 0; + LAST_PS4_L2 = 0; + } + + // Power + if (get_val(BUTTON_TRIANGLE) && !get_val(DPAD_LEFT) && !get_val(DPAD_RIGHT) && LAST_PS4_LY >= 0) { // P5 + LAST_PS4_RX = 0; + LAST_PS4_LX = 0; + LAST_PS4_LY = 100; + LAST_PS4_L2 = 0; + } + else if (!get_val(BUTTON_TRIANGLE) && get_val(DPAD_LEFT) && !get_val(DPAD_RIGHT) && LAST_PS4_LY >= 0) { // P4 + if (LAST_PS4_LY >= 70) { + LAST_PS4_RX = 0; + LAST_PS4_LX = 0; + LAST_PS4_LY = 85; + LAST_PS4_L2 = 0; + } + else { // P0 for adapters which don't support simultaneous DPAD presses + LAST_PS4_RX = 0; + LAST_PS4_LX = 0; + LAST_PS4_LY = 0; + LAST_PS4_L2 = 0; + } + } + else if (get_val(BUTTON_TRIANGLE) && get_val(DPAD_LEFT) && !get_val(DPAD_RIGHT) && LAST_PS4_LY >= 0) { // P3 + LAST_PS4_RX = 0; + LAST_PS4_LX = 0; + LAST_PS4_LY = 70; + LAST_PS4_L2 = 0; + } + else if (!get_val(BUTTON_TRIANGLE) && !get_val(DPAD_LEFT) && get_val(DPAD_RIGHT) && LAST_PS4_LY >= 0) { // P2 + LAST_PS4_RX = 0; + LAST_PS4_LX = 0; + LAST_PS4_LY = 50; + LAST_PS4_L2 = 0; + } + else if (get_val(BUTTON_TRIANGLE) && !get_val(DPAD_LEFT) && get_val(DPAD_RIGHT) && LAST_PS4_LY >= 0) { // P1 + LAST_PS4_RX = 0; + LAST_PS4_LX = 0; + LAST_PS4_LY = 30; + LAST_PS4_L2 = 0; + } + else if (!get_val(BUTTON_TRIANGLE) && get_val(DPAD_LEFT) && get_val(DPAD_RIGHT) && LAST_PS4_LY >= 0) { // P0 + LAST_PS4_RX = 0; + LAST_PS4_LX = 0; + LAST_PS4_LY = 0; + LAST_PS4_L2 = 0; + } + + set_val(PS4_RX, LAST_PS4_RX); + set_val(PS4_LX, LAST_PS4_LX); + set_val(PS4_LY, LAST_PS4_LY); + set_val(PS4_L2, LAST_PS4_L2); + + clear_input(); + + // Press SELECT+START to use buttons as D-pad + if (DPAD_MODE == 1) { + if (get_val(BUTTON_SELECT)) { + set_val(PS4_UP, 100); + } + else { + set_val(PS4_UP, 0); + } + if (get_val(BUTTON_CROSS)) { + set_val(PS4_DOWN, 100); + } + else { + set_val(PS4_DOWN, 0); + } + if (get_val(BUTTON_SQUARE)) { + set_val(PS4_LEFT, 100); + } + else { + set_val(PS4_LEFT, 0); + } + if (get_val(BUTTON_CIRCLE)) { + set_val(PS4_RIGHT, 100); + } + else { + set_val(PS4_RIGHT, 0); + } + set_val(BUTTON_SELECT, 0); + set_val(BUTTON_SQUARE, 0); + set_val(BUTTON_CIRCLE, 0); + set_val(BUTTON_CROSS, 0); + } + else { + set_val(PS4_UP, 0); + set_val(PS4_DOWN, 0); + set_val(PS4_LEFT, 0); + set_val(PS4_RIGHT, 0); + } +} + +function toggle_dpad_mode() { // Toggle D-Pad mode + if (get_val(BUTTON_START)) { + START_HOLD = START_HOLD + 1; + } + else { + START_HOLD = 0; + } + + if (START_HOLD > 15) { + set_val(BUTTON_START, 0); + DPAD_MODE = 1; + } + else { + DPAD_MODE = 0; + } + return; +} + +function clear_input() { // Clear unwanted input + set_val(PS4_L1, 0); + set_val(PS4_R1, 0); + set_val(PS4_R2, 0); + return; +} diff --git a/DenshaDeGoPS1ToSwitch-T1.gpc b/DenshaDeGoPS1ToSwitch_103-T1.gpc old mode 100644 new mode 100755 similarity index 72% rename from DenshaDeGoPS1ToSwitch-T1.gpc rename to DenshaDeGoPS1ToSwitch_103-T1.gpc index de87035..5ee906a --- a/DenshaDeGoPS1ToSwitch-T1.gpc +++ b/DenshaDeGoPS1ToSwitch_103-T1.gpc @@ -3,9 +3,13 @@ // Based on the code by EddieLau for the Titan Two: https://github.com/tylau0/DenGo/blob/main/DenshaDeGoPS1ToPS4MayFlash.gpc // Requires enabling advanced controls (analog pressure + non-step) +// Holding START enables the use of buttons as a D-Pad (to navigate menus) + // Adjust the following values to the input indices from your adapter +define DPAD_UP = HID_BUTTON_10; +define DPAD_DOWN = HID_BUTTON_11; define DPAD_LEFT = HID_BUTTON_12; define DPAD_RIGHT = HID_BUTTON_13; @@ -35,72 +39,81 @@ remap BUTTON_L2 -> PS4_L2; remap HID_STICK_2_X -> PS4_LX; remap HID_STICK_2_Y -> PS4_LY; remap HID_STICK_1_X -> PS4_RX; +remap DPAD_UP -> PS4_UP; +remap DPAD_DOWN -> PS4_DOWN; +remap DPAD_LEFT -> PS4_LEFT; +remap DPAD_RIGHT -> PS4_RIGHT; int LAST_PS4_RX = 0; int LAST_PS4_LX = 0; int LAST_PS4_LY = 0; int LAST_PS4_L2 = 0; +int DPAD_MODE = 0; +int START_HOLD = 0; + main { - // Green light - set_led(LED_1, 0); - set_led(LED_2, 0); - set_led(LED_3, 1); + // Green light + set_led(LED_1, 0); + set_led(LED_2, 0); + set_led(LED_3, 1); + + toggle_dpad_mode(); // Brake if (!get_val(BUTTON_L1) && !get_val(BUTTON_L2) && !get_val(BUTTON_R1) && !get_val(BUTTON_R2) && LAST_PS4_LY <= 0) { // EB LAST_PS4_RX = 100; LAST_PS4_LX = 0; - LAST_PS4_LY = -100; + LAST_PS4_LY = 0; LAST_PS4_L2 = 100; } else if (!get_val(BUTTON_L1) && get_val(BUTTON_L2) && get_val(BUTTON_R1) && !get_val(BUTTON_R2) && LAST_PS4_LY <= 0) { // B8 LAST_PS4_RX = 100; LAST_PS4_LX = 0; - LAST_PS4_LY = -100; + LAST_PS4_LY = 0; LAST_PS4_L2 = 0; } else if (get_val(BUTTON_L1) && get_val(BUTTON_L2) && get_val(BUTTON_R1) && !get_val(BUTTON_R2) && LAST_PS4_LY <= 0) { // B7 LAST_PS4_RX = 85; LAST_PS4_LX = 0; - LAST_PS4_LY = -85; + LAST_PS4_LY = 0; LAST_PS4_L2 = 0; } else if (!get_val(BUTTON_L1) && !get_val(BUTTON_L2) && !get_val(BUTTON_R1) && get_val(BUTTON_R2) && LAST_PS4_LY <= 0) { // B6 LAST_PS4_RX = 75; LAST_PS4_LX = 0; - LAST_PS4_LY = -75; + LAST_PS4_LY = 0; LAST_PS4_L2 = 0; } else if (get_val(BUTTON_L1) && !get_val(BUTTON_L2) && !get_val(BUTTON_R1) && get_val(BUTTON_R2) && LAST_PS4_LY <= 0) { // B5 LAST_PS4_RX = 70; LAST_PS4_LX = 0; - LAST_PS4_LY = -70 + LAST_PS4_LY = 0; LAST_PS4_L2 = 0; } else if (!get_val(BUTTON_L1) && get_val(BUTTON_L2) && !get_val(BUTTON_R1) && get_val(BUTTON_R2) && LAST_PS4_LY <= 0) { // B4 LAST_PS4_RX = 60; LAST_PS4_LX = 0; - LAST_PS4_LY = -60; + LAST_PS4_LY = 0; LAST_PS4_L2 = 0; } else if (get_val(BUTTON_L1) && get_val(BUTTON_L2) && !get_val(BUTTON_R1) && get_val(BUTTON_R2) && LAST_PS4_LY <= 0) { // B3 LAST_PS4_RX = 50; LAST_PS4_LX = 0; - LAST_PS4_LY = -50; + LAST_PS4_LY = 0; LAST_PS4_L2 = 0; } else if (!get_val(BUTTON_L1) && !get_val(BUTTON_L2) && get_val(BUTTON_R1) && get_val(BUTTON_R2) && LAST_PS4_LY <= 0) { // B2 LAST_PS4_RX = 40; LAST_PS4_LX = 0; - LAST_PS4_LY = -40; + LAST_PS4_LY = 0; LAST_PS4_L2 = 0; } else if (get_val(BUTTON_L1) && !get_val(BUTTON_L2) && get_val(BUTTON_R1) && get_val(BUTTON_R2) && LAST_PS4_LY <= 0) { // B1 LAST_PS4_RX = 30; LAST_PS4_LX = 0; - LAST_PS4_LY = -30; + LAST_PS4_LY = 0; LAST_PS4_L2 = 0; } else if (!get_val(BUTTON_L1) && get_val(BUTTON_L2) && get_val(BUTTON_R1) && get_val(BUTTON_R2) && LAST_PS4_LY <= 0) { // B0 @@ -114,14 +127,14 @@ main { if (get_val(BUTTON_TRIANGLE) && !get_val(DPAD_LEFT) && !get_val(DPAD_RIGHT) && LAST_PS4_LY >= 0) { // P5 LAST_PS4_RX = 0; LAST_PS4_LX = -100; - LAST_PS4_LY = 100; + LAST_PS4_LY = 0; LAST_PS4_L2 = 0; } else if (!get_val(BUTTON_TRIANGLE) && get_val(DPAD_LEFT) && !get_val(DPAD_RIGHT) && LAST_PS4_LY >= 0) { // P4 if (LAST_PS4_LY >= 70) { LAST_PS4_RX = 0; LAST_PS4_LX = -85; - LAST_PS4_LY = 85; + LAST_PS4_LY = 0; LAST_PS4_L2 = 0; } else { // P0 for adapters which don't support simultaneous DPAD presses @@ -134,19 +147,19 @@ main { else if (get_val(BUTTON_TRIANGLE) && get_val(DPAD_LEFT) && !get_val(DPAD_RIGHT) && LAST_PS4_LY >= 0) { // P3 LAST_PS4_RX = 0; LAST_PS4_LX = -70; - LAST_PS4_LY = 70; + LAST_PS4_LY = 0; LAST_PS4_L2 = 0; } else if (!get_val(BUTTON_TRIANGLE) && !get_val(DPAD_LEFT) && get_val(DPAD_RIGHT) && LAST_PS4_LY >= 0) { // P2 LAST_PS4_RX = 0; LAST_PS4_LX = -50; - LAST_PS4_LY = 50; + LAST_PS4_LY = 0; LAST_PS4_L2 = 0; } else if (get_val(BUTTON_TRIANGLE) && !get_val(DPAD_LEFT) && get_val(DPAD_RIGHT) && LAST_PS4_LY >= 0) { // P1 LAST_PS4_RX = 0; LAST_PS4_LX = -30; - LAST_PS4_LY = 30; + LAST_PS4_LY = 0; LAST_PS4_L2 = 0; } else if (!get_val(BUTTON_TRIANGLE) && get_val(DPAD_LEFT) && get_val(DPAD_RIGHT) && LAST_PS4_LY >= 0) { // P0 @@ -162,6 +175,62 @@ main { set_val(PS4_L2, LAST_PS4_L2); clear_input(); + + // Press SELECT+START to use buttons as D-pad + if (DPAD_MODE == 1) { + if (get_val(BUTTON_SELECT)) { + set_val(PS4_UP, 100); + } + else { + set_val(PS4_UP, 0); + } + if (get_val(BUTTON_CROSS)) { + set_val(PS4_DOWN, 100); + } + else { + set_val(PS4_DOWN, 0); + } + if (get_val(BUTTON_SQUARE)) { + set_val(PS4_LEFT, 100); + } + else { + set_val(PS4_LEFT, 0); + } + if (get_val(BUTTON_CIRCLE)) { + set_val(PS4_RIGHT, 100); + } + else { + set_val(PS4_RIGHT, 0); + } + set_val(BUTTON_SELECT, 0); + set_val(BUTTON_SQUARE, 0); + set_val(BUTTON_CIRCLE, 0); + set_val(BUTTON_CROSS, 0); + } + else { + set_val(PS4_UP, 0); + set_val(PS4_DOWN, 0); + set_val(PS4_LEFT, 0); + set_val(PS4_RIGHT, 0); + } +} + +function toggle_dpad_mode() { // Toggle D-Pad mode + if (get_val(BUTTON_START)) { + START_HOLD = START_HOLD + 1; + } + else { + START_HOLD = 0; + } + + if (START_HOLD > 15) { + set_val(BUTTON_START, 0); + DPAD_MODE = 1; + } + else { + DPAD_MODE = 0; + } + return; } function clear_input() { // Clear unwanted input diff --git a/DenshaDeGoPS1ToSwitch_General-T1.gpc b/DenshaDeGoPS1ToSwitch_General-T1.gpc new file mode 100755 index 0000000..8d3b0dd --- /dev/null +++ b/DenshaDeGoPS1ToSwitch_General-T1.gpc @@ -0,0 +1,241 @@ +// Script to use PS1/N64/SS/DC Densha de GO! controllers with Densha de GO! Hashirou Yamanote Sen (PS4/Switch) + +// Based on the code by EddieLau for the Titan Two: https://github.com/tylau0/DenGo/blob/main/DenshaDeGoPS1ToPS4MayFlash.gpc +// Requires enabling advanced controls (analog pressure + non-step) + +// Holding START enables the use of buttons as a D-Pad (to navigate menus) + + +// Adjust the following values to the input indices from your adapter + +define DPAD_UP = HID_BUTTON_10; +define DPAD_DOWN = HID_BUTTON_11; +define DPAD_LEFT = HID_BUTTON_12; +define DPAD_RIGHT = HID_BUTTON_13; + +define BUTTON_SELECT = HID_BUTTON_2; +define BUTTON_START = HID_BUTTON_3; + +define BUTTON_R1 = HID_BUTTON_4; +define BUTTON_R2 = HID_BUTTON_5; +define BUTTON_L1 = HID_BUTTON_7; +define BUTTON_L2 = HID_BUTTON_8; + +define BUTTON_TRIANGLE = HID_BUTTON_14; +define BUTTON_SQUARE = HID_BUTTON_15; +define BUTTON_CIRCLE = HID_BUTTON_16; +define BUTTON_CROSS = HID_BUTTON_17; + + +// Do not modify anything from here on + +unmap ALL_REMAPS; +remap BUTTON_SELECT -> PS4_TRIANGLE; +remap BUTTON_START -> PS4_OPTIONS; +remap BUTTON_SQUARE -> PS4_SQUARE; +remap BUTTON_CIRCLE -> PS4_CIRCLE; +remap BUTTON_CROSS -> PS4_CROSS; +remap BUTTON_L2 -> PS4_L2; +remap HID_STICK_2_X -> PS4_LX; +remap HID_STICK_2_Y -> PS4_LY; +remap HID_STICK_1_X -> PS4_RX; +remap DPAD_UP -> PS4_UP; +remap DPAD_DOWN -> PS4_DOWN; +remap DPAD_LEFT -> PS4_LEFT; +remap DPAD_RIGHT -> PS4_RIGHT; + +int LAST_PS4_RX = 0; +int LAST_PS4_LX = 0; +int LAST_PS4_LY = 0; +int LAST_PS4_L2 = 0; + +int DPAD_MODE = 0; +int START_HOLD = 0; + +main { + + // Green light + set_led(LED_1, 0); + set_led(LED_2, 0); + set_led(LED_3, 1); + + toggle_dpad_mode(); + + // Brake + if (!get_val(BUTTON_L1) && !get_val(BUTTON_L2) && !get_val(BUTTON_R1) && !get_val(BUTTON_R2) && LAST_PS4_LY <= 0) { // EB + LAST_PS4_RX = 0; + LAST_PS4_LX = 0; + LAST_PS4_LY = -100; + LAST_PS4_L2 = 100; + } + else if (!get_val(BUTTON_L1) && get_val(BUTTON_L2) && get_val(BUTTON_R1) && !get_val(BUTTON_R2) && LAST_PS4_LY <= 0) { // B8 + LAST_PS4_RX = 0; + LAST_PS4_LX = 0; + LAST_PS4_LY = -100; + LAST_PS4_L2 = 0; + } + else if (get_val(BUTTON_L1) && get_val(BUTTON_L2) && get_val(BUTTON_R1) && !get_val(BUTTON_R2) && LAST_PS4_LY <= 0) { // B7 + LAST_PS4_RX = 0; + LAST_PS4_LX = 0; + LAST_PS4_LY = -85; + LAST_PS4_L2 = 0; + } + else if (!get_val(BUTTON_L1) && !get_val(BUTTON_L2) && !get_val(BUTTON_R1) && get_val(BUTTON_R2) && LAST_PS4_LY <= 0) { // B6 + LAST_PS4_RX = 0; + LAST_PS4_LX = 0; + LAST_PS4_LY = -75; + LAST_PS4_L2 = 0; + } + else if (get_val(BUTTON_L1) && !get_val(BUTTON_L2) && !get_val(BUTTON_R1) && get_val(BUTTON_R2) && LAST_PS4_LY <= 0) { // B5 + LAST_PS4_RX = 0; + LAST_PS4_LX = 0; + LAST_PS4_LY = -70; + LAST_PS4_L2 = 0; + } + else if (!get_val(BUTTON_L1) && get_val(BUTTON_L2) && !get_val(BUTTON_R1) && get_val(BUTTON_R2) && LAST_PS4_LY <= 0) { // B4 + LAST_PS4_RX = 0; + LAST_PS4_LX = 0; + LAST_PS4_LY = -60; + LAST_PS4_L2 = 0; + } + else if (get_val(BUTTON_L1) && get_val(BUTTON_L2) && !get_val(BUTTON_R1) && get_val(BUTTON_R2) && LAST_PS4_LY <= 0) { // B3 + LAST_PS4_RX = 0; + LAST_PS4_LX = 0; + LAST_PS4_LY = -50; + LAST_PS4_L2 = 0; + } + else if (!get_val(BUTTON_L1) && !get_val(BUTTON_L2) && get_val(BUTTON_R1) && get_val(BUTTON_R2) && LAST_PS4_LY <= 0) { // B2 + LAST_PS4_RX = 0; + LAST_PS4_LX = 0; + LAST_PS4_LY = -40; + LAST_PS4_L2 = 0; + } + else if (get_val(BUTTON_L1) && !get_val(BUTTON_L2) && get_val(BUTTON_R1) && get_val(BUTTON_R2) && LAST_PS4_LY <= 0) { // B1 + LAST_PS4_RX = 0; + LAST_PS4_LX = 0; + LAST_PS4_LY = -30; + LAST_PS4_L2 = 0; + } + else if (!get_val(BUTTON_L1) && get_val(BUTTON_L2) && get_val(BUTTON_R1) && get_val(BUTTON_R2) && LAST_PS4_LY <= 0) { // B0 + LAST_PS4_RX = 0; + LAST_PS4_LX = 0; + LAST_PS4_LY = 0; + LAST_PS4_L2 = 0; + } + + // Power + if (get_val(BUTTON_TRIANGLE) && !get_val(DPAD_LEFT) && !get_val(DPAD_RIGHT) && LAST_PS4_LY >= 0) { // P5 + LAST_PS4_RX = 0; + LAST_PS4_LX = 0; + LAST_PS4_LY = 100; + LAST_PS4_L2 = 0; + } + else if (!get_val(BUTTON_TRIANGLE) && get_val(DPAD_LEFT) && !get_val(DPAD_RIGHT) && LAST_PS4_LY >= 0) { // P4 + if (LAST_PS4_LY >= 70) { + LAST_PS4_RX = 0; + LAST_PS4_LX = 0; + LAST_PS4_LY = 85; + LAST_PS4_L2 = 0; + } + else { // P0 for adapters which don't support simultaneous DPAD presses + LAST_PS4_RX = 0; + LAST_PS4_LX = 0; + LAST_PS4_LY = 0; + LAST_PS4_L2 = 0; + } + } + else if (get_val(BUTTON_TRIANGLE) && get_val(DPAD_LEFT) && !get_val(DPAD_RIGHT) && LAST_PS4_LY >= 0) { // P3 + LAST_PS4_RX = 0; + LAST_PS4_LX = 0; + LAST_PS4_LY = 70; + LAST_PS4_L2 = 0; + } + else if (!get_val(BUTTON_TRIANGLE) && !get_val(DPAD_LEFT) && get_val(DPAD_RIGHT) && LAST_PS4_LY >= 0) { // P2 + LAST_PS4_RX = 0; + LAST_PS4_LX = 0; + LAST_PS4_LY = 50; + LAST_PS4_L2 = 0; + } + else if (get_val(BUTTON_TRIANGLE) && !get_val(DPAD_LEFT) && get_val(DPAD_RIGHT) && LAST_PS4_LY >= 0) { // P1 + LAST_PS4_RX = 0; + LAST_PS4_LX = 0; + LAST_PS4_LY = 30; + LAST_PS4_L2 = 0; + } + else if (!get_val(BUTTON_TRIANGLE) && get_val(DPAD_LEFT) && get_val(DPAD_RIGHT) && LAST_PS4_LY >= 0) { // P0 + LAST_PS4_RX = 0; + LAST_PS4_LX = 0; + LAST_PS4_LY = 0; + LAST_PS4_L2 = 0; + } + + set_val(PS4_RX, LAST_PS4_RX); + set_val(PS4_LX, LAST_PS4_LX); + set_val(PS4_LY, LAST_PS4_LY); + set_val(PS4_L2, LAST_PS4_L2); + + clear_input(); + + // Press SELECT+START to use buttons as D-pad + if (DPAD_MODE == 1) { + if (get_val(BUTTON_SELECT)) { + set_val(PS4_UP, 100); + } + else { + set_val(PS4_UP, 0); + } + if (get_val(BUTTON_CROSS)) { + set_val(PS4_DOWN, 100); + } + else { + set_val(PS4_DOWN, 0); + } + if (get_val(BUTTON_SQUARE)) { + set_val(PS4_LEFT, 100); + } + else { + set_val(PS4_LEFT, 0); + } + if (get_val(BUTTON_CIRCLE)) { + set_val(PS4_RIGHT, 100); + } + else { + set_val(PS4_RIGHT, 0); + } + set_val(BUTTON_SELECT, 0); + set_val(BUTTON_SQUARE, 0); + set_val(BUTTON_CIRCLE, 0); + set_val(BUTTON_CROSS, 0); + } + else { + set_val(PS4_UP, 0); + set_val(PS4_DOWN, 0); + set_val(PS4_LEFT, 0); + set_val(PS4_RIGHT, 0); + } +} + +function toggle_dpad_mode() { // Toggle D-Pad mode + if (get_val(BUTTON_START)) { + START_HOLD = START_HOLD + 1; + } + else { + START_HOLD = 0; + } + + if (START_HOLD > 15) { + set_val(BUTTON_START, 0); + DPAD_MODE = 1; + } + else { + DPAD_MODE = 0; + } + return; +} + +function clear_input() { // Clear unwanted input + set_val(PS4_L1, 0); + set_val(PS4_R1, 0); + set_val(PS4_R2, 0); + return; +} diff --git a/README.md b/README.md index d118640..0778ed1 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,12 @@ # Densha de GO! scripts for the Titan One This repository contains GPC scripts for the Titan One to use several controllers with the PS4/Switch game "Densha de GO! Hashirou Yamanote Sen". + +There are four scripts: + +- **DenshaDeGoPS1ToPS4_General-T1.gpc**: to connect PS1 controllers to a PS4. For use with all trains except 103 series. +- **DenshaDeGoPS1ToPS4_103-T1.gpc**: to connect PS1 controllers to a PS4. For use with the 103 series train. +- **DenshaDeGoPS1ToSwitch_General-T1.gpc**: to connect PS1 controllers to a Switch. For use with all trains except 103 series. +- **DenshaDeGoPS1ToSwitch_103-T1.gpc**: to connect PS1 controllers to a Switch. For use with the 103 series train. + +All scripts support holding **START** to use **A**, **B**, **C** and **SELECT** as a D-pad and navigate game menus.