Merge pull request #2613 from AdmiralCurtiss/netplay-sram-sync

Netplay: Sync GameCube SRAM.
This commit is contained in:
comex 2015-06-22 12:48:38 -04:00
commit afaa0d92df
8 changed files with 76 additions and 10 deletions

View File

@ -35,6 +35,7 @@
#include "Core/NetPlayProto.h"
#include "Core/HW/EXI.h"
#include "Core/HW/SI.h"
#include "Core/HW/Sram.h"
#include "Core/HW/WiimoteReal/WiimoteReal.h"
#include "DiscIO/Volume.h"
#include "DiscIO/VolumeCreator.h"
@ -187,12 +188,6 @@ bool BootCore(const std::string& _rFilename)
}
}
// Some NTSC GameCube games such as Baten Kaitos react strangely to language settings that would be invalid on an NTSC system
if (!StartUp.bOverrideGCLanguage && StartUp.bNTSC)
{
StartUp.SelectedLanguage = 0;
}
// Wii settings
if (StartUp.bWii)
{
@ -249,6 +244,8 @@ bool BootCore(const std::string& _rFilename)
StartUp.bDSPHLE = g_NetPlaySettings.m_DSPHLE;
StartUp.bEnableMemcardSaving = g_NetPlaySettings.m_WriteToMemcard;
StartUp.iCPUCore = g_NetPlaySettings.m_CPUcore;
StartUp.SelectedLanguage = g_NetPlaySettings.m_SelectedLanguage;
StartUp.bOverrideGCLanguage = g_NetPlaySettings.m_OverrideGCLanguage;
SConfig::GetInstance().m_DSPEnableJIT = g_NetPlaySettings.m_DSPEnableJIT;
SConfig::GetInstance().m_OCEnable = g_NetPlaySettings.m_OCEnable;
SConfig::GetInstance().m_OCFactor = g_NetPlaySettings.m_OCFactor;
@ -257,6 +254,17 @@ bool BootCore(const std::string& _rFilename)
config_cache.bSetEXIDevice[0] = true;
config_cache.bSetEXIDevice[1] = true;
}
else
{
g_SRAM_netplay_initialized = false;
}
// Apply overrides
// Some NTSC GameCube games such as Baten Kaitos react strangely to language settings that would be invalid on an NTSC system
if (!StartUp.bOverrideGCLanguage && StartUp.bNTSC)
{
StartUp.SelectedLanguage = 0;
}
// Some NTSC Wii games such as Doc Louis's Punch-Out!! and 1942 (Virtual Console) crash if the PAL60 option is enabled
if (StartUp.bWii && StartUp.bNTSC)

View File

@ -16,6 +16,7 @@
#include "Core/PowerPC/PowerPC.h"
SRAM g_SRAM;
bool g_SRAM_netplay_initialized = false;
namespace ExpansionInterface
{
@ -30,7 +31,11 @@ static void UpdateInterruptsCallback(u64 userdata, int cycles_late);
void Init()
{
InitSRAM();
if (!g_SRAM_netplay_initialized)
{
InitSRAM();
}
for (u32 i = 0; i < MAX_EXI_CHANNELS; i++)
g_Channels[i] = new CEXIChannel(i);

View File

@ -128,8 +128,15 @@ CEXIIPL::~CEXIIPL()
m_pIPL = nullptr;
// SRAM
File::IOFile file(SConfig::GetInstance().m_strSRAM, "wb");
file.WriteArray(&g_SRAM, 1);
if (!g_SRAM_netplay_initialized)
{
File::IOFile file(SConfig::GetInstance().m_strSRAM, "wb");
file.WriteArray(&g_SRAM, 1);
}
else
{
g_SRAM_netplay_initialized = false;
}
}
void CEXIIPL::DoState(PointerWrap &p)
{

View File

@ -84,3 +84,4 @@ void FixSRAMChecksums();
extern SRAM sram_dump;
extern SRAM g_SRAM;
extern bool g_SRAM_netplay_initialized;

View File

@ -13,6 +13,7 @@
#include "Core/HW/SI_DeviceDanceMat.h"
#include "Core/HW/SI_DeviceGCController.h"
#include "Core/HW/SI_DeviceGCSteeringWheel.h"
#include "Core/HW/Sram.h"
#include "Core/HW/WiimoteEmu/WiimoteEmu.h"
#include "Core/HW/WiimoteReal/WiimoteReal.h"
#include "Core/IPC_HLE/WII_IPC_HLE_Device_usb.h"
@ -378,6 +379,8 @@ unsigned int NetPlayClient::OnData(sf::Packet& packet)
packet >> m_current_game;
packet >> g_NetPlaySettings.m_CPUthread;
packet >> g_NetPlaySettings.m_CPUcore;
packet >> g_NetPlaySettings.m_SelectedLanguage;
packet >> g_NetPlaySettings.m_OverrideGCLanguage;
packet >> g_NetPlaySettings.m_DSPEnableJIT;
packet >> g_NetPlaySettings.m_DSPHLE;
packet >> g_NetPlaySettings.m_WriteToMemcard;
@ -462,6 +465,22 @@ unsigned int NetPlayClient::OnData(sf::Packet& packet)
}
break;
case NP_MSG_SYNC_GC_SRAM:
{
u8 sram[sizeof(g_SRAM.p_SRAM)];
for (int i = 0; i < sizeof(g_SRAM.p_SRAM); ++i)
{
packet >> sram[i];
}
{
std::lock_guard<std::recursive_mutex> lkg(m_crit.game);
memcpy(g_SRAM.p_SRAM, sram, sizeof(g_SRAM.p_SRAM));
g_SRAM_netplay_initialized = true;
}
}
break;
default:
PanicAlertT("Unknown message received with id : %d", mid);
break;

View File

@ -12,6 +12,8 @@ struct NetSettings
{
bool m_CPUthread;
int m_CPUcore;
int m_SelectedLanguage;
bool m_OverrideGCLanguage;
bool m_DSPHLE;
bool m_DSPEnableJIT;
bool m_WriteToMemcard;
@ -29,7 +31,7 @@ struct Rpt : public std::vector<u8>
typedef std::vector<u8> NetWiimote;
#define NETPLAY_VERSION "Dolphin NetPlay 2015-03-10"
#define NETPLAY_VERSION "Dolphin NetPlay 2015-06-14"
extern u64 g_netplay_initial_gctime;
@ -62,6 +64,8 @@ enum
NP_MSG_PING = 0xE0,
NP_MSG_PONG = 0xE1,
NP_MSG_PLAYER_PING_DATA = 0xE2,
NP_MSG_SYNC_GC_SRAM = 0xF0,
};
typedef u8 MessageId;

View File

@ -5,12 +5,15 @@
#include <string>
#include <vector>
#include "Common/ENetUtil.h"
#include "Common/FileUtil.h"
#include "Common/IniFile.h"
#include "Common/StdMakeUnique.h"
#include "Common/StringUtil.h"
#include "Core/ConfigManager.h"
#include "Core/NetPlayClient.h" //for NetPlayUI
#include "Core/NetPlayServer.h"
#include "Core/HW/EXI_DeviceIPL.h"
#include "Core/HW/Sram.h"
#include "InputCommon/GCPadStatus.h"
#if !defined(_WIN32)
#include <sys/types.h>
@ -303,6 +306,21 @@ unsigned int NetPlayServer::OnConnect(ENetPeer* socket)
spac << (u32)m_target_buffer_size;
Send(player.socket, spac);
// sync GC SRAM with new client
if (!g_SRAM_netplay_initialized)
{
SConfig::GetInstance().m_strSRAM = File::GetUserPath(F_GCSRAM_IDX);
InitSRAM();
g_SRAM_netplay_initialized = true;
}
spac.clear();
spac << (MessageId)NP_MSG_SYNC_GC_SRAM;
for (int i = 0; i < sizeof(g_SRAM.p_SRAM); ++i)
{
spac << g_SRAM.p_SRAM[i];
}
Send(player.socket, spac);
// sync values with new client
for (const auto& p : m_players)
{
@ -697,6 +715,8 @@ bool NetPlayServer::StartGame()
*spac << m_current_game;
*spac << m_settings.m_CPUthread;
*spac << m_settings.m_CPUcore;
*spac << m_settings.m_SelectedLanguage;
*spac << m_settings.m_OverrideGCLanguage;
*spac << m_settings.m_DSPEnableJIT;
*spac << m_settings.m_DSPHLE;
*spac << m_settings.m_WriteToMemcard;

View File

@ -252,6 +252,8 @@ void NetPlayDialog::GetNetSettings(NetSettings &settings)
SConfig &instance = SConfig::GetInstance();
settings.m_CPUthread = instance.bCPUThread;
settings.m_CPUcore = instance.iCPUCore;
settings.m_SelectedLanguage = instance.SelectedLanguage;
settings.m_OverrideGCLanguage = instance.bOverrideGCLanguage;
settings.m_DSPHLE = instance.bDSPHLE;
settings.m_DSPEnableJIT = instance.m_DSPEnableJIT;
settings.m_WriteToMemcard = m_memcard_write->GetValue();