//#include <titanone.gph>

// Script to use PS1/N64/SS/DC Densha de GO! controllers with Densha de GO! Hashirou Yamanote Sen (PS4/Switch)
// Written by Marc Riera, 2021

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