mirror of
https://github.com/RetroDECK/Supermodel.git
synced 2025-03-06 14:27:44 +00:00
- Added mappings for individual joysticks in Virtual On for dual-joystick gamepads.
- Input settings are now only read from "global" to avoid confusion.
This commit is contained in:
parent
a2ce64745f
commit
b19f600fec
|
@ -65,7 +65,7 @@ const char* CInput::GetInputGroup()
|
|||
case GAME_INPUT_SHIFT4: return "Racing Game Gear Shift";
|
||||
case GAME_INPUT_VR: return "Racing Game VR View Buttons";
|
||||
case GAME_INPUT_RALLY: return "Sega Rally Buttons";
|
||||
case GAME_INPUT_TWIN_JOYSTICKS: return "Virtua On Controls";
|
||||
case GAME_INPUT_TWIN_JOYSTICKS: return "Virtual On Controls";
|
||||
case GAME_INPUT_ANALOG_JOYSTICK: return "Analog Joystick";
|
||||
case GAME_INPUT_GUN1: // Fall through to below
|
||||
case GAME_INPUT_GUN2: return "Lightguns";
|
||||
|
|
|
@ -89,19 +89,27 @@ CInputs::CInputs(CInputSystem *system) : m_system(system)
|
|||
viewChange = AddSwitchInput("ViewChange", "View Change", GAME_INPUT_RALLY, "KEY_A,JOY1_BUTTON1");
|
||||
handBrake = AddSwitchInput("HandBrake", "Hand Brake", GAME_INPUT_RALLY, "KEY_S,JOY1_BUTTON2");
|
||||
|
||||
// Virtua On Controls
|
||||
twinJoyTurnLeft = AddSwitchInput("TwinJoyTurnLeft", "Turn Left", GAME_INPUT_TWIN_JOYSTICKS, "KEY_Q,JOY1_RXAXIS_NEG");
|
||||
twinJoyTurnRight = AddSwitchInput("TwinJoyTurnRight", "Turn Right", GAME_INPUT_TWIN_JOYSTICKS, "KEY_W,JOY1_RXAXIS_POS");
|
||||
twinJoyForward = AddSwitchInput("TwinJoyForward", "Forward", GAME_INPUT_TWIN_JOYSTICKS, "KEY_UP,JOY1_YAXIS_NEG");
|
||||
twinJoyReverse = AddSwitchInput("TwinJoyReverse", "Reverse", GAME_INPUT_TWIN_JOYSTICKS, "KEY_DOWN,JOY1_YAXIS_POS");
|
||||
twinJoyStrafeLeft = AddSwitchInput("TwinJoyStrafeLeft", "Strafe Left", GAME_INPUT_TWIN_JOYSTICKS, "KEY_LEFT,JOY1_XAXIS_NEG");
|
||||
twinJoyStrafeRight = AddSwitchInput("TwinJoyStrafeRight", "Strafe Right", GAME_INPUT_TWIN_JOYSTICKS, "KEY_RIGHT,JOY1_XAXIS_POS");
|
||||
twinJoyJump = AddSwitchInput("TwinJoyJump", "Jump", GAME_INPUT_TWIN_JOYSTICKS, "KEY_E,JOY1_BUTTON1");
|
||||
twinJoyCrouch = AddSwitchInput("TwinJoyCrouch", "Crouch", GAME_INPUT_TWIN_JOYSTICKS, "KEY_R,JOY1_BUTTON2");
|
||||
twinJoyLeftShot = AddSwitchInput("TwinJoyLeftShot", "Left Shot Trigger", GAME_INPUT_TWIN_JOYSTICKS, "KEY_A,JOY1_BUTTON5");
|
||||
twinJoyRightShot = AddSwitchInput("TwinJoyRightShot", "Right Shot Trigger", GAME_INPUT_TWIN_JOYSTICKS, "KEY_S,JOY1_BUTTON6");
|
||||
twinJoyLeftTurbo = AddSwitchInput("TwinJoyLeftTurbo", "Left Turbo", GAME_INPUT_TWIN_JOYSTICKS, "KEY_Z,JOY1_BUTTON7");
|
||||
twinJoyRightTurbo = AddSwitchInput("TwinJoyRightTurbo", "Right Turbo", GAME_INPUT_TWIN_JOYSTICKS, "KEY_X,JOY1_BUTTON8");
|
||||
// Virtual On Controls
|
||||
twinJoyTurnLeft = AddSwitchInput("TwinJoyTurnLeft", "Macro Turn Left", GAME_INPUT_TWIN_JOYSTICKS, "KEY_Q,JOY1_RXAXIS_NEG");
|
||||
twinJoyTurnRight = AddSwitchInput("TwinJoyTurnRight", "Macro Turn Right", GAME_INPUT_TWIN_JOYSTICKS, "KEY_W,JOY1_RXAXIS_POS");
|
||||
twinJoyForward = AddSwitchInput("TwinJoyForward", "Macro Forward", GAME_INPUT_TWIN_JOYSTICKS, "KEY_UP,JOY1_YAXIS_NEG");
|
||||
twinJoyReverse = AddSwitchInput("TwinJoyReverse", "Macro Reverse", GAME_INPUT_TWIN_JOYSTICKS, "KEY_DOWN,JOY1_YAXIS_POS");
|
||||
twinJoyStrafeLeft = AddSwitchInput("TwinJoyStrafeLeft", "Macro Strafe Left", GAME_INPUT_TWIN_JOYSTICKS, "KEY_LEFT,JOY1_XAXIS_NEG");
|
||||
twinJoyStrafeRight = AddSwitchInput("TwinJoyStrafeRight", "Macro Strafe Right", GAME_INPUT_TWIN_JOYSTICKS, "KEY_RIGHT,JOY1_XAXIS_POS");
|
||||
twinJoyJump = AddSwitchInput("TwinJoyJump", "Macro Jump", GAME_INPUT_TWIN_JOYSTICKS, "KEY_E,JOY1_BUTTON1");
|
||||
twinJoyCrouch = AddSwitchInput("TwinJoyCrouch", "Macro Crouch", GAME_INPUT_TWIN_JOYSTICKS, "KEY_R,JOY1_BUTTON2");
|
||||
twinJoyLeft1 = AddSwitchInput("TwinJoyLeft1", "Left Joystick Left", GAME_INPUT_TWIN_JOYSTICKS, "NONE");
|
||||
twinJoyLeft2 = AddSwitchInput("TwinJoyLeft2", "Right Joystick Left", GAME_INPUT_TWIN_JOYSTICKS, "NONE");
|
||||
twinJoyRight1 = AddSwitchInput("TwinJoyRight1", "Left Joystick Right", GAME_INPUT_TWIN_JOYSTICKS, "NONE");
|
||||
twinJoyRight2 = AddSwitchInput("TwinJoyRight2", "Right Joystick Right", GAME_INPUT_TWIN_JOYSTICKS, "NONE");
|
||||
twinJoyUp1 = AddSwitchInput("TwinJoyUp1", "Left Joystick Up", GAME_INPUT_TWIN_JOYSTICKS, "NONE");
|
||||
twinJoyUp2 = AddSwitchInput("TwinJoyUp2", "Right Joystick Up", GAME_INPUT_TWIN_JOYSTICKS, "NONE");
|
||||
twinJoyDown1 = AddSwitchInput("TwinJoyDown1", "Left Joystick Down", GAME_INPUT_TWIN_JOYSTICKS, "NONE");
|
||||
twinJoyDown2 = AddSwitchInput("TwinJoyDown2", "Right Joystick Down", GAME_INPUT_TWIN_JOYSTICKS, "NONE");
|
||||
twinJoyShot1 = AddSwitchInput("TwinJoyShot1", "Left Shot Trigger", GAME_INPUT_TWIN_JOYSTICKS, "KEY_A,JOY1_BUTTON5");
|
||||
twinJoyShot2 = AddSwitchInput("TwinJoyShot2", "Right Shot Trigger", GAME_INPUT_TWIN_JOYSTICKS, "KEY_S,JOY1_BUTTON6");
|
||||
twinJoyTurbo1 = AddSwitchInput("TwinJoyTurbo1", "Left Turbo", GAME_INPUT_TWIN_JOYSTICKS, "KEY_Z,JOY1_BUTTON7");
|
||||
twinJoyTurbo2 = AddSwitchInput("TwinJoyTurbo2", "Right Turbo", GAME_INPUT_TWIN_JOYSTICKS, "KEY_X,JOY1_BUTTON8");
|
||||
|
||||
// Analog Joystick
|
||||
CAnalogInput *analogJoyLeft = AddAnalogInput("AnalogJoyLeft", "Analog Left", GAME_INPUT_ANALOG_JOYSTICK, "KEY_LEFT");
|
||||
|
|
|
@ -64,82 +64,93 @@ private:
|
|||
|
||||
public:
|
||||
// UI controls
|
||||
CSwitchInput *uiExit;
|
||||
CSwitchInput *uiReset;
|
||||
CSwitchInput *uiPause;
|
||||
CSwitchInput *uiSaveState;
|
||||
CSwitchInput *uiChangeSlot;
|
||||
CSwitchInput *uiLoadState;
|
||||
CSwitchInput *uiDumpInpState;
|
||||
CSwitchInput *uiClearNVRAM;
|
||||
CSwitchInput *uiToggleCursor;
|
||||
CSwitchInput *uiToggleFrLimit;
|
||||
CSwitchInput *uiExit;
|
||||
CSwitchInput *uiReset;
|
||||
CSwitchInput *uiPause;
|
||||
CSwitchInput *uiSaveState;
|
||||
CSwitchInput *uiChangeSlot;
|
||||
CSwitchInput *uiLoadState;
|
||||
CSwitchInput *uiDumpInpState;
|
||||
CSwitchInput *uiClearNVRAM;
|
||||
CSwitchInput *uiToggleCursor;
|
||||
CSwitchInput *uiToggleFrLimit;
|
||||
#ifdef SUPERMODEL_DEBUGGER
|
||||
CSwitchInput *uiEnterDebugger;
|
||||
#endif
|
||||
|
||||
// Common controls between all games
|
||||
CSwitchInput *coin[2];
|
||||
CSwitchInput *start[2];
|
||||
CSwitchInput *test[2];
|
||||
CSwitchInput *service[2];
|
||||
CSwitchInput *coin[2];
|
||||
CSwitchInput *start[2];
|
||||
CSwitchInput *test[2];
|
||||
CSwitchInput *service[2];
|
||||
|
||||
// Joysticks (players 1 and 2)
|
||||
CSwitchInput *up[2];
|
||||
CSwitchInput *down[2];
|
||||
CSwitchInput *left[2];
|
||||
CSwitchInput *right[2];
|
||||
CSwitchInput *up[2];
|
||||
CSwitchInput *down[2];
|
||||
CSwitchInput *left[2];
|
||||
CSwitchInput *right[2];
|
||||
|
||||
// Fighting game controls (players 1 and 2)
|
||||
CSwitchInput *punch[2];
|
||||
CSwitchInput *kick[2];
|
||||
CSwitchInput *guard[2];
|
||||
CSwitchInput *escape[2];
|
||||
CSwitchInput *punch[2];
|
||||
CSwitchInput *kick[2];
|
||||
CSwitchInput *guard[2];
|
||||
CSwitchInput *escape[2];
|
||||
|
||||
// Soccer game controls (players 1 and 2)
|
||||
CSwitchInput *shortPass[2];
|
||||
CSwitchInput *longPass[2];
|
||||
CSwitchInput *shoot[2];
|
||||
CSwitchInput *shortPass[2];
|
||||
CSwitchInput *longPass[2];
|
||||
CSwitchInput *shoot[2];
|
||||
|
||||
// Vehicle controls
|
||||
CAxisInput *steering;
|
||||
CAnalogInput *accelerator;
|
||||
CAnalogInput *brake;
|
||||
CAxisInput *steering;
|
||||
CAnalogInput *accelerator;
|
||||
CAnalogInput *brake;
|
||||
|
||||
// VR view buttons: VR1 Red, VR2 Blue, VR3 Yellow, VR4 Green
|
||||
CSwitchInput *vr[4];
|
||||
CSwitchInput *vr[4];
|
||||
|
||||
// 4-speed gear shift
|
||||
CGearShift4Input *gearShift4;
|
||||
|
||||
// Rally controls
|
||||
CSwitchInput *viewChange;
|
||||
CSwitchInput *handBrake;
|
||||
CSwitchInput *viewChange;
|
||||
CSwitchInput *handBrake;
|
||||
|
||||
// Twin joysticks
|
||||
CSwitchInput *twinJoyTurnLeft;
|
||||
CSwitchInput *twinJoyTurnRight;
|
||||
CSwitchInput *twinJoyStrafeLeft;
|
||||
CSwitchInput *twinJoyStrafeRight;
|
||||
CSwitchInput *twinJoyForward;
|
||||
CSwitchInput *twinJoyReverse;
|
||||
CSwitchInput *twinJoyJump;
|
||||
CSwitchInput *twinJoyCrouch;
|
||||
CSwitchInput *twinJoyLeftShot;
|
||||
CSwitchInput *twinJoyRightShot;
|
||||
CSwitchInput *twinJoyLeftTurbo;
|
||||
CSwitchInput *twinJoyRightTurbo;
|
||||
// Twin joysticks (individually mapped version; 1 = left stick, 2 = right stick)
|
||||
CSwitchInput *twinJoyLeft1;
|
||||
CSwitchInput *twinJoyLeft2;
|
||||
CSwitchInput *twinJoyRight1;
|
||||
CSwitchInput *twinJoyRight2;
|
||||
CSwitchInput *twinJoyUp1;
|
||||
CSwitchInput *twinJoyUp2;
|
||||
CSwitchInput *twinJoyDown1;
|
||||
CSwitchInput *twinJoyDown2;
|
||||
CSwitchInput *twinJoyShot1;
|
||||
CSwitchInput *twinJoyShot2;
|
||||
CSwitchInput *twinJoyTurbo1;
|
||||
CSwitchInput *twinJoyTurbo2;
|
||||
|
||||
// Twin joysticks (macro mapping, for users w/out dual joysticks)
|
||||
CSwitchInput *twinJoyTurnLeft;
|
||||
CSwitchInput *twinJoyTurnRight;
|
||||
CSwitchInput *twinJoyStrafeLeft;
|
||||
CSwitchInput *twinJoyStrafeRight;
|
||||
CSwitchInput *twinJoyForward;
|
||||
CSwitchInput *twinJoyReverse;
|
||||
CSwitchInput *twinJoyJump;
|
||||
CSwitchInput *twinJoyCrouch;
|
||||
|
||||
|
||||
// Analog joystick
|
||||
CAxisInput *analogJoyX;
|
||||
CAxisInput *analogJoyY;
|
||||
CSwitchInput *analogJoyTrigger;
|
||||
CSwitchInput *analogJoyEvent;
|
||||
CAxisInput *analogJoyX;
|
||||
CAxisInput *analogJoyY;
|
||||
CSwitchInput *analogJoyTrigger;
|
||||
CSwitchInput *analogJoyEvent;
|
||||
|
||||
// Gun controls (players 1 and 2)
|
||||
CAxisInput *gunX[2];
|
||||
CAxisInput *gunY[2];
|
||||
CTriggerInput *trigger[2];
|
||||
CAxisInput *gunX[2];
|
||||
CAxisInput *gunY[2];
|
||||
CTriggerInput *trigger[2];
|
||||
|
||||
/*
|
||||
* Creates a set of inputs with the given input system.
|
||||
|
|
|
@ -291,6 +291,25 @@ UINT8 CModel3::ReadInputs(unsigned reg)
|
|||
|
||||
if ((Game->inputFlags&GAME_INPUT_TWIN_JOYSTICKS)) // First twin joystick
|
||||
{
|
||||
/*
|
||||
* Process left joystick inputs first
|
||||
*/
|
||||
|
||||
// Shot trigger and Turbo
|
||||
data &= ~(Inputs->twinJoyShot1->value<<0);
|
||||
data &= ~(Inputs->twinJoyTurbo1->value<<1);
|
||||
|
||||
// Stick
|
||||
data &= ~(Inputs->twinJoyLeft1->value<<7);
|
||||
data &= ~(Inputs->twinJoyRight1->value<<6);
|
||||
data &= ~(Inputs->twinJoyUp1->value<<5);
|
||||
data &= ~(Inputs->twinJoyDown1->value<<4);
|
||||
|
||||
/*
|
||||
* Next, process twin joystick macro inputs (higher level inputs
|
||||
* that map to actions on both joysticks simultaneously).
|
||||
*/
|
||||
|
||||
/*
|
||||
* Forward/reverse/turn are mutually exclusive.
|
||||
*
|
||||
|
@ -324,10 +343,6 @@ UINT8 CModel3::ReadInputs(unsigned reg)
|
|||
data &= ~0x80;
|
||||
else if (Inputs->twinJoyCrouch->value)
|
||||
data &= ~0x40;
|
||||
|
||||
// Shot trigger and Turbo
|
||||
data &= ~(Inputs->twinJoyLeftShot->value<<0);
|
||||
data &= ~(Inputs->twinJoyLeftTurbo->value<<1);
|
||||
}
|
||||
|
||||
return data;
|
||||
|
@ -360,6 +375,15 @@ UINT8 CModel3::ReadInputs(unsigned reg)
|
|||
|
||||
if ((Game->inputFlags&GAME_INPUT_TWIN_JOYSTICKS)) // Second twin joystick (see register 0x08 for comments)
|
||||
{
|
||||
|
||||
data &= ~(Inputs->twinJoyShot2->value<<0);
|
||||
data &= ~(Inputs->twinJoyTurbo2->value<<1);
|
||||
|
||||
data &= ~(Inputs->twinJoyLeft2->value<<7);
|
||||
data &= ~(Inputs->twinJoyRight2->value<<6);
|
||||
data &= ~(Inputs->twinJoyUp2->value<<5);
|
||||
data &= ~(Inputs->twinJoyDown2->value<<4);
|
||||
|
||||
if (Inputs->twinJoyTurnLeft->value)
|
||||
data &= ~0x20;
|
||||
else if (Inputs->twinJoyTurnRight->value)
|
||||
|
@ -377,9 +401,6 @@ UINT8 CModel3::ReadInputs(unsigned reg)
|
|||
data &= ~0x40;
|
||||
else if (Inputs->twinJoyCrouch->value)
|
||||
data &= ~0x80;
|
||||
|
||||
data &= ~(Inputs->twinJoyRightShot->value<<0);
|
||||
data &= ~(Inputs->twinJoyRightTurbo->value<<1);
|
||||
}
|
||||
|
||||
if ((Game->inputFlags&GAME_INPUT_GUN2))
|
||||
|
|
|
@ -348,8 +348,8 @@ static bool ConfigureInputs(CInputs *Inputs, bool configure)
|
|||
return OKAY;
|
||||
}
|
||||
|
||||
// Apply configuration settings from configuration file
|
||||
static void ApplySettings(CInputs *Inputs, CINIFile *INI, const char *section)
|
||||
// Apply configuration settings from configuration file (does NOT read input settings; see ConfigureInputs())
|
||||
static void ApplySettings(CINIFile *INI, const char *section)
|
||||
{
|
||||
unsigned x;
|
||||
string String;
|
||||
|
@ -383,21 +383,17 @@ static void ApplySettings(CInputs *Inputs, CINIFile *INI, const char *section)
|
|||
g_Config.throttle = x ? true : false;
|
||||
if (OKAY == INI->Get(section, "ShowFrameRate", x))
|
||||
g_Config.showFPS = x ? true : false;
|
||||
|
||||
// Inputs
|
||||
if (Inputs != NULL)
|
||||
Inputs->ReadFromINIFile(INI, section);
|
||||
}
|
||||
|
||||
// Read settings (from a specific section) from the config file
|
||||
static void ReadConfigFile(CInputs *Inputs, const char *section)
|
||||
static void ReadConfigFile(const char *section)
|
||||
{
|
||||
CINIFile INI;
|
||||
|
||||
INI.Open(CONFIG_FILE_PATH);
|
||||
INI.SetDefaultSectionName("Global"); // required to read settings not associated with a specific section
|
||||
INI.Parse();
|
||||
ApplySettings(Inputs, &INI, section);
|
||||
ApplySettings(&INI, section);
|
||||
INI.Close();
|
||||
}
|
||||
|
||||
|
@ -576,9 +572,7 @@ static void LoadNVRAM(CModel3 *Model3)
|
|||
|
||||
|
||||
/******************************************************************************
|
||||
Main Program Driver
|
||||
|
||||
All configuration management is done prior to calling Supermodel().
|
||||
Main Program Loop
|
||||
******************************************************************************/
|
||||
|
||||
#ifdef SUPERMODEL_DEBUGGER
|
||||
|
@ -606,8 +600,8 @@ int Supermodel(const char *zipFile, CInputs *Inputs, CINIFile *CmdLine)
|
|||
return 1;
|
||||
|
||||
// Apply game-specific settings and then, lastly, command line settings
|
||||
ReadConfigFile(Inputs, Model3->GetGameInfo()->id);
|
||||
ApplySettings(Inputs, CmdLine, "Global");
|
||||
ReadConfigFile(Model3->GetGameInfo()->id);
|
||||
ApplySettings(CmdLine, "Global");
|
||||
|
||||
// Load NVRAM
|
||||
LoadNVRAM(Model3);
|
||||
|
@ -1036,7 +1030,7 @@ int main(int argc, char **argv)
|
|||
InfoLog("");
|
||||
|
||||
// Read global settings from INI file
|
||||
ReadConfigFile(NULL, "Global");
|
||||
ReadConfigFile("Global");
|
||||
|
||||
/*
|
||||
* Parse command line.
|
||||
|
@ -1284,5 +1278,11 @@ Exit:
|
|||
if (InputSystem != NULL)
|
||||
delete InputSystem;
|
||||
SDL_Quit();
|
||||
|
||||
if (exitCode)
|
||||
InfoLog("Program terminated due to an error.");
|
||||
else
|
||||
InfoLog("Program terminated normally.");
|
||||
|
||||
return exitCode;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue