dsda: reduce copypaste

This commit is contained in:
feos 2025-02-23 09:33:17 +03:00
parent f444d6b0a5
commit 72070a63de
3 changed files with 100 additions and 210 deletions

View File

@ -9,202 +9,88 @@ namespace BizHawk.Emulation.Cores.Computers.Doom
public ControllerDefinition ControllerDefinition => _controllerDeck.Definition; public ControllerDefinition ControllerDefinition => _controllerDeck.Definition;
private delegate int ReadPot(IController c, int pot);
private delegate byte ReadPort(IController c);
public bool FrameAdvance(IController controller, bool renderVideo, bool renderAudio) public bool FrameAdvance(IController controller, bool renderVideo, bool renderAudio)
{ {
// Declaring inputs // Declaring inputs
PackedPlayerInput player1Inputs = new PackedPlayerInput(); PackedPlayerInput[] players = [
PackedPlayerInput player2Inputs = new PackedPlayerInput(); new PackedPlayerInput(),
PackedPlayerInput player3Inputs = new PackedPlayerInput(); new PackedPlayerInput(),
PackedPlayerInput player4Inputs = new PackedPlayerInput(); new PackedPlayerInput(),
new PackedPlayerInput()
];
if (_syncSettings.Player1Present) ReadPot[] potReaders =
[
_controllerDeck.ReadPot1,
_controllerDeck.ReadPot2,
_controllerDeck.ReadPot3,
_controllerDeck.ReadPot4,
];
ReadPort[] portReaders =
[
_controllerDeck.ReadPort1,
_controllerDeck.ReadPort2,
_controllerDeck.ReadPort3,
_controllerDeck.ReadPort4,
];
int playersPresent = Convert.ToInt32(_syncSettings.Player1Present)
| Convert.ToInt32(_syncSettings.Player2Present) << 1
| Convert.ToInt32(_syncSettings.Player3Present) << 2
| Convert.ToInt32(_syncSettings.Player4Present) << 3;
for (int i = 0; i < 4; i++)
{ {
player1Inputs._RunSpeed = _controllerDeck.ReadPot1(controller, 0); if ((playersPresent & (1 << i)) is not 0)
player1Inputs._StrafingSpeed = _controllerDeck.ReadPot1(controller, 1);
player1Inputs._TurningSpeed = _controllerDeck.ReadPot1(controller, 2);
player1Inputs._WeaponSelect = _controllerDeck.ReadPot1(controller, 3);
var actionsBitfield = _controllerDeck.ReadPort1(controller);
player1Inputs._Fire = actionsBitfield & 0b00001;
player1Inputs._Action = (actionsBitfield & 0b00010) >> 1;
player1Inputs._AltWeapon = (actionsBitfield & 0b00100) >> 2;
// Handling mouse-driven running
int mouseRunningSpeed = _controllerDeck.ReadPot1(controller, 4);
if (_player1LastMouseRunningValue > MOUSE_NO_INPUT)
{ {
int mouseRunningDelta = _player1LastMouseRunningValue - mouseRunningSpeed; players[i]._RunSpeed = potReaders[i](controller, 0);
player1Inputs._RunSpeed += mouseRunningDelta * _syncSettings.MouseRunSensitivity; players[i]._StrafingSpeed = potReaders[i](controller, 1);
if (player1Inputs._RunSpeed > 50) player1Inputs._RunSpeed = 50; players[i]._TurningSpeed = potReaders[i](controller, 2);
if (player1Inputs._RunSpeed < -50) player1Inputs._RunSpeed = -50; players[i]._WeaponSelect = potReaders[i](controller, 3);
}
_player1LastMouseRunningValue = mouseRunningSpeed;
// Handling mouse-driven turning var actionsBitfield = portReaders[i](controller);
int mouseTurningSpeed = _controllerDeck.ReadPot1(controller, 5); players[i]._Fire = actionsBitfield & 0b00001;
if (_player1LastMouseTurningValue > MOUSE_NO_INPUT) players[i]._Action = (actionsBitfield & 0b00010) >> 1;
{ players[i]._AltWeapon = (actionsBitfield & 0b00100) >> 2;
int mouseTurningDelta = _player1LastMouseTurningValue - mouseTurningSpeed;
player1Inputs._TurningSpeed += mouseTurningDelta * _syncSettings.MouseTurnSensitivity; // Handling mouse-driven running
if (_syncSettings.TurningResolution == TurningResolution.Shorttics) int mouseRunningSpeed = potReaders[i](controller, 4);
if (_lastMouseRunningValues[i] > MOUSE_NO_INPUT)
{ {
player1Inputs._TurningSpeed >>= 8; int mouseRunningDelta = _lastMouseRunningValues[i] - mouseRunningSpeed;
players[i]._RunSpeed += mouseRunningDelta * _syncSettings.MouseRunSensitivity;
if (players[i]._RunSpeed > 50) players[i]._RunSpeed = 50;
if (players[i]._RunSpeed < -50) players[i]._RunSpeed = -50;
} }
} _lastMouseRunningValues[i] = mouseRunningSpeed;
_player1LastMouseTurningValue = mouseTurningSpeed;
// Raven Games // Handling mouse-driven turning
if (_syncSettings.InputFormat is DoomControllerTypes.Heretic or DoomControllerTypes.Hexen) int mouseTurningSpeed = potReaders[i](controller, 5);
{ if (_lastMouseTurningValues[i] > MOUSE_NO_INPUT)
player1Inputs._FlyLook = _controllerDeck.ReadPot1(controller, 6);
player1Inputs._ArtifactUse = _controllerDeck.ReadPot1(controller, 7);
if (_syncSettings.InputFormat is DoomControllerTypes.Hexen)
{ {
player1Inputs._Jump = (actionsBitfield & 0b01000) >> 3; int mouseTurningDelta = _lastMouseTurningValues[i] - mouseTurningSpeed;
player1Inputs._EndPlayer = (actionsBitfield & 0b10000) >> 4; players[i]._TurningSpeed += mouseTurningDelta * _syncSettings.MouseTurnSensitivity;
if (_syncSettings.TurningResolution == TurningResolution.Shorttics)
{
players[i]._TurningSpeed >>= 8;
}
} }
} _lastMouseTurningValues[i] = mouseTurningSpeed;
}
if (_syncSettings.Player2Present) // Raven Games
{ if (_syncSettings.InputFormat is DoomControllerTypes.Heretic or DoomControllerTypes.Hexen)
player2Inputs._RunSpeed = _controllerDeck.ReadPot2(controller, 0);
player2Inputs._StrafingSpeed = _controllerDeck.ReadPot2(controller, 1);
player2Inputs._TurningSpeed = _controllerDeck.ReadPot2(controller, 2);
player2Inputs._WeaponSelect = _controllerDeck.ReadPot2(controller, 3);
var actionsBitfield = _controllerDeck.ReadPort2(controller);
player2Inputs._Fire = actionsBitfield & 0b00001;
player2Inputs._Action = (actionsBitfield & 0b00010) >> 1;
player2Inputs._AltWeapon = (actionsBitfield & 0b00100) >> 2;
// Handling mouse-driven running
int mouseRunningSpeed = _controllerDeck.ReadPot2(controller, 4);
if (_player2LastMouseRunningValue > MOUSE_NO_INPUT)
{
int mouseRunningDelta = _player2LastMouseRunningValue - mouseRunningSpeed;
player2Inputs._RunSpeed += mouseRunningDelta * _syncSettings.MouseRunSensitivity;
if (player2Inputs._RunSpeed > 50) player2Inputs._RunSpeed = 50;
if (player2Inputs._RunSpeed < -50) player2Inputs._RunSpeed = -50;
}
_player2LastMouseRunningValue = mouseRunningSpeed;
// Handling mouse-driven turning
int mouseTurningSpeed = _controllerDeck.ReadPot2(controller, 5);
if (_player2LastMouseTurningValue > MOUSE_NO_INPUT)
{
int mouseTurningDelta = _player2LastMouseTurningValue - mouseTurningSpeed;
player2Inputs._TurningSpeed += mouseTurningDelta * _syncSettings.MouseTurnSensitivity;
if (_syncSettings.TurningResolution == TurningResolution.Shorttics)
{ {
player2Inputs._TurningSpeed >>= 8; players[i]._FlyLook = potReaders[i](controller, 6);
} players[i]._ArtifactUse = potReaders[i](controller, 7);
} if (_syncSettings.InputFormat is DoomControllerTypes.Hexen)
_player2LastMouseTurningValue = mouseTurningSpeed; {
players[i]._Jump = (actionsBitfield & 0b01000) >> 3;
// Raven Games players[i]._EndPlayer = (actionsBitfield & 0b10000) >> 4;
if (_syncSettings.InputFormat is DoomControllerTypes.Heretic or DoomControllerTypes.Hexen) }
{
player2Inputs._FlyLook = _controllerDeck.ReadPot2(controller, 4);
player2Inputs._ArtifactUse = _controllerDeck.ReadPot2(controller, 5);
if (_syncSettings.InputFormat is DoomControllerTypes.Hexen)
{
player2Inputs._Jump = (actionsBitfield & 0b01000) >> 3;
player2Inputs._EndPlayer = (actionsBitfield & 0b10000) >> 4;
}
}
}
if (_syncSettings.Player3Present)
{
player3Inputs._RunSpeed = _controllerDeck.ReadPot3(controller, 0);
player3Inputs._StrafingSpeed = _controllerDeck.ReadPot3(controller, 1);
player3Inputs._TurningSpeed = _controllerDeck.ReadPot3(controller, 2);
player3Inputs._WeaponSelect = _controllerDeck.ReadPot3(controller, 3);
var actionsBitfield = _controllerDeck.ReadPort3(controller);
player3Inputs._Fire = actionsBitfield & 0b00001;
player3Inputs._Action = (actionsBitfield & 0b00010) >> 1;
player3Inputs._AltWeapon = (actionsBitfield & 0b00100) >> 2;
// Handling mouse-driven running
int mouseRunningSpeed = _controllerDeck.ReadPot3(controller, 4);
if (_player3LastMouseRunningValue > MOUSE_NO_INPUT)
{
int mouseRunningDelta = _player3LastMouseRunningValue - mouseRunningSpeed;
player3Inputs._RunSpeed += mouseRunningDelta * _syncSettings.MouseRunSensitivity;
if (player3Inputs._RunSpeed > 50) player3Inputs._RunSpeed = 50;
if (player3Inputs._RunSpeed < -50) player3Inputs._RunSpeed = -50;
}
_player3LastMouseRunningValue = mouseRunningSpeed;
// Handling mouse-driven turning
int mouseTurningSpeed = _controllerDeck.ReadPot3(controller, 5);
if (_player3LastMouseTurningValue > MOUSE_NO_INPUT)
{
int mouseTurningDelta = _player3LastMouseTurningValue - mouseTurningSpeed;
player3Inputs._TurningSpeed += mouseTurningDelta * _syncSettings.MouseTurnSensitivity;
if (_syncSettings.TurningResolution == TurningResolution.Shorttics)
{
player3Inputs._TurningSpeed >>= 8;
}
}
_player3LastMouseTurningValue = mouseTurningSpeed;
// Raven Games
if (_syncSettings.InputFormat is DoomControllerTypes.Heretic or DoomControllerTypes.Hexen)
{
player3Inputs._FlyLook = _controllerDeck.ReadPot3(controller, 6);
player3Inputs._ArtifactUse = _controllerDeck.ReadPot3(controller, 7);
if (_syncSettings.InputFormat is DoomControllerTypes.Hexen)
{
player3Inputs._Jump = (actionsBitfield & 0b01000) >> 3;
player3Inputs._EndPlayer = (actionsBitfield & 0b10000) >> 4;
}
}
}
if (_syncSettings.Player4Present)
{
player4Inputs._RunSpeed = _controllerDeck.ReadPot4(controller, 0);
player4Inputs._StrafingSpeed = _controllerDeck.ReadPot4(controller, 1);
player4Inputs._TurningSpeed = _controllerDeck.ReadPot4(controller, 2);
player4Inputs._WeaponSelect = _controllerDeck.ReadPot4(controller, 3);
var actionsBitfield = _controllerDeck.ReadPort4(controller);
player4Inputs._Fire = actionsBitfield & 0b00001;
player4Inputs._Action = (actionsBitfield & 0b00010) >> 1;
player4Inputs._AltWeapon = (actionsBitfield & 0b00100) >> 2;
// Handling mouse-driven running
int mouseRunningSpeed = _controllerDeck.ReadPot4(controller, 4);
if (_player4LastMouseRunningValue > MOUSE_NO_INPUT)
{
int mouseRunningDelta = _player4LastMouseRunningValue - mouseRunningSpeed;
player4Inputs._RunSpeed += mouseRunningDelta * _syncSettings.MouseRunSensitivity;
if (player4Inputs._RunSpeed > 50) player4Inputs._RunSpeed = 50;
if (player4Inputs._RunSpeed < -50) player4Inputs._RunSpeed = -50;
}
_player4LastMouseRunningValue = mouseRunningSpeed;
// Handling mouse-driven turning
int mouseTurningSpeed = _controllerDeck.ReadPot4(controller, 5);
if (_player4LastMouseTurningValue > MOUSE_NO_INPUT)
{
int mouseTurningDelta = _player4LastMouseTurningValue - mouseTurningSpeed;
player4Inputs._TurningSpeed += mouseTurningDelta * _syncSettings.MouseTurnSensitivity;
if (_syncSettings.TurningResolution == TurningResolution.Shorttics)
{
player4Inputs._TurningSpeed >>= 8;
}
}
_player4LastMouseTurningValue = mouseTurningSpeed;
// Raven Games
if (_syncSettings.InputFormat is DoomControllerTypes.Heretic or DoomControllerTypes.Hexen)
{
player4Inputs._FlyLook = _controllerDeck.ReadPot4(controller, 4);
player4Inputs._ArtifactUse = _controllerDeck.ReadPot4(controller, 5);
if (_syncSettings.InputFormat is DoomControllerTypes.Hexen)
{
player4Inputs._Jump = (actionsBitfield & 0b01000) >> 3;
player4Inputs._EndPlayer = (actionsBitfield & 0b10000) >> 4;
} }
} }
} }
@ -215,10 +101,10 @@ namespace BizHawk.Emulation.Cores.Computers.Doom
renderInfo._PlayerPointOfView = _settings.DisplayPlayer - 1; renderInfo._PlayerPointOfView = _settings.DisplayPlayer - 1;
Core.dsda_frame_advance( Core.dsda_frame_advance(
ref player1Inputs, ref players[0],
ref player2Inputs, ref players[1],
ref player3Inputs, ref players[2],
ref player4Inputs, ref players[3],
ref renderInfo); ref renderInfo);
if (renderVideo) if (renderVideo)

View File

@ -13,14 +13,14 @@ namespace BizHawk.Emulation.Cores.Computers.Doom
_elf.LoadStateBinary(reader); _elf.LoadStateBinary(reader);
// Getting last mouse positions // Getting last mouse positions
_player1LastMouseRunningValue = reader.ReadInt32(); _lastMouseRunningValues[0] = reader.ReadInt32();
_player1LastMouseTurningValue = reader.ReadInt32(); _lastMouseTurningValues[0] = reader.ReadInt32();
_player2LastMouseRunningValue = reader.ReadInt32(); _lastMouseRunningValues[1] = reader.ReadInt32();
_player2LastMouseTurningValue = reader.ReadInt32(); _lastMouseTurningValues[1] = reader.ReadInt32();
_player3LastMouseRunningValue = reader.ReadInt32(); _lastMouseRunningValues[2] = reader.ReadInt32();
_player3LastMouseTurningValue = reader.ReadInt32(); _lastMouseTurningValues[2] = reader.ReadInt32();
_player4LastMouseRunningValue = reader.ReadInt32(); _lastMouseRunningValues[3] = reader.ReadInt32();
_player4LastMouseTurningValue = reader.ReadInt32(); _lastMouseTurningValues[3] = reader.ReadInt32();
Frame = reader.ReadInt32(); Frame = reader.ReadInt32();
// any managed pointers that we sent to the core need to be resent now! // any managed pointers that we sent to the core need to be resent now!
@ -33,14 +33,14 @@ namespace BizHawk.Emulation.Cores.Computers.Doom
_elf.SaveStateBinary(writer); _elf.SaveStateBinary(writer);
// Writing last mouse positions // Writing last mouse positions
writer.Write(_player1LastMouseRunningValue); writer.Write(_lastMouseRunningValues[0]);
writer.Write(_player1LastMouseTurningValue); writer.Write(_lastMouseTurningValues[0]);
writer.Write(_player2LastMouseRunningValue); writer.Write(_lastMouseRunningValues[1]);
writer.Write(_player2LastMouseTurningValue); writer.Write(_lastMouseTurningValues[1]);
writer.Write(_player3LastMouseRunningValue); writer.Write(_lastMouseRunningValues[2]);
writer.Write(_player3LastMouseTurningValue); writer.Write(_lastMouseTurningValues[2]);
writer.Write(_player4LastMouseRunningValue); writer.Write(_lastMouseRunningValues[3]);
writer.Write(_player4LastMouseTurningValue); writer.Write(_lastMouseTurningValues[3]);
writer.Write(Frame); writer.Write(Frame);
} }

View File

@ -158,14 +158,18 @@ namespace BizHawk.Emulation.Cores.Computers.Doom
// Remembering mouse position // Remembering mouse position
private const int MOUSE_NO_INPUT = -65535; private const int MOUSE_NO_INPUT = -65535;
private int _player1LastMouseRunningValue = MOUSE_NO_INPUT; private int[] _lastMouseRunningValues = [
private int _player1LastMouseTurningValue = MOUSE_NO_INPUT; MOUSE_NO_INPUT,
private int _player2LastMouseRunningValue = MOUSE_NO_INPUT; MOUSE_NO_INPUT,
private int _player2LastMouseTurningValue = MOUSE_NO_INPUT; MOUSE_NO_INPUT,
private int _player3LastMouseRunningValue = MOUSE_NO_INPUT; MOUSE_NO_INPUT
private int _player3LastMouseTurningValue = MOUSE_NO_INPUT; ];
private int _player4LastMouseRunningValue = MOUSE_NO_INPUT; private int[] _lastMouseTurningValues = [
private int _player4LastMouseTurningValue = MOUSE_NO_INPUT; MOUSE_NO_INPUT,
MOUSE_NO_INPUT,
MOUSE_NO_INPUT,
MOUSE_NO_INPUT
];
private List<string> _args; private List<string> _args;
// IRegionable // IRegionable