Netplay: Sync GameCube SRAM.
This commit is contained in:
parent
9e00ddbdf7
commit
abb65515b9
|
@ -35,6 +35,7 @@
|
||||||
#include "Core/NetPlayProto.h"
|
#include "Core/NetPlayProto.h"
|
||||||
#include "Core/HW/EXI.h"
|
#include "Core/HW/EXI.h"
|
||||||
#include "Core/HW/SI.h"
|
#include "Core/HW/SI.h"
|
||||||
|
#include "Core/HW/Sram.h"
|
||||||
#include "Core/HW/WiimoteReal/WiimoteReal.h"
|
#include "Core/HW/WiimoteReal/WiimoteReal.h"
|
||||||
#include "DiscIO/Volume.h"
|
#include "DiscIO/Volume.h"
|
||||||
#include "DiscIO/VolumeCreator.h"
|
#include "DiscIO/VolumeCreator.h"
|
||||||
|
@ -246,6 +247,8 @@ bool BootCore(const std::string& _rFilename)
|
||||||
StartUp.bDSPHLE = g_NetPlaySettings.m_DSPHLE;
|
StartUp.bDSPHLE = g_NetPlaySettings.m_DSPHLE;
|
||||||
StartUp.bEnableMemcardSaving = g_NetPlaySettings.m_WriteToMemcard;
|
StartUp.bEnableMemcardSaving = g_NetPlaySettings.m_WriteToMemcard;
|
||||||
StartUp.iCPUCore = g_NetPlaySettings.m_CPUcore;
|
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_DSPEnableJIT = g_NetPlaySettings.m_DSPEnableJIT;
|
||||||
SConfig::GetInstance().m_OCEnable = g_NetPlaySettings.m_OCEnable;
|
SConfig::GetInstance().m_OCEnable = g_NetPlaySettings.m_OCEnable;
|
||||||
SConfig::GetInstance().m_OCFactor = g_NetPlaySettings.m_OCFactor;
|
SConfig::GetInstance().m_OCFactor = g_NetPlaySettings.m_OCFactor;
|
||||||
|
@ -254,6 +257,10 @@ bool BootCore(const std::string& _rFilename)
|
||||||
config_cache.bSetEXIDevice[0] = true;
|
config_cache.bSetEXIDevice[0] = true;
|
||||||
config_cache.bSetEXIDevice[1] = true;
|
config_cache.bSetEXIDevice[1] = true;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
g_SRAM_netplay_initialized = false;
|
||||||
|
}
|
||||||
|
|
||||||
SConfig::GetInstance().m_SYSCONF->SetData("IPL.PGS", StartUp.bProgressive);
|
SConfig::GetInstance().m_SYSCONF->SetData("IPL.PGS", StartUp.bProgressive);
|
||||||
|
|
||||||
|
|
|
@ -16,6 +16,7 @@
|
||||||
#include "Core/PowerPC/PowerPC.h"
|
#include "Core/PowerPC/PowerPC.h"
|
||||||
|
|
||||||
SRAM g_SRAM;
|
SRAM g_SRAM;
|
||||||
|
bool g_SRAM_netplay_initialized = false;
|
||||||
|
|
||||||
namespace ExpansionInterface
|
namespace ExpansionInterface
|
||||||
{
|
{
|
||||||
|
@ -29,8 +30,12 @@ static void ChangeDeviceCallback(u64 userdata, int cyclesLate);
|
||||||
static void UpdateInterruptsCallback(u64 userdata, int cycles_late);
|
static void UpdateInterruptsCallback(u64 userdata, int cycles_late);
|
||||||
|
|
||||||
void Init()
|
void Init()
|
||||||
|
{
|
||||||
|
if (!g_SRAM_netplay_initialized)
|
||||||
{
|
{
|
||||||
InitSRAM();
|
InitSRAM();
|
||||||
|
}
|
||||||
|
|
||||||
for (u32 i = 0; i < MAX_EXI_CHANNELS; i++)
|
for (u32 i = 0; i < MAX_EXI_CHANNELS; i++)
|
||||||
g_Channels[i] = new CEXIChannel(i);
|
g_Channels[i] = new CEXIChannel(i);
|
||||||
|
|
||||||
|
|
|
@ -128,9 +128,16 @@ CEXIIPL::~CEXIIPL()
|
||||||
m_pIPL = nullptr;
|
m_pIPL = nullptr;
|
||||||
|
|
||||||
// SRAM
|
// SRAM
|
||||||
|
if (!g_SRAM_netplay_initialized)
|
||||||
|
{
|
||||||
File::IOFile file(SConfig::GetInstance().m_strSRAM, "wb");
|
File::IOFile file(SConfig::GetInstance().m_strSRAM, "wb");
|
||||||
file.WriteArray(&g_SRAM, 1);
|
file.WriteArray(&g_SRAM, 1);
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
g_SRAM_netplay_initialized = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
void CEXIIPL::DoState(PointerWrap &p)
|
void CEXIIPL::DoState(PointerWrap &p)
|
||||||
{
|
{
|
||||||
p.Do(m_RTC);
|
p.Do(m_RTC);
|
||||||
|
|
|
@ -84,3 +84,4 @@ void FixSRAMChecksums();
|
||||||
|
|
||||||
extern SRAM sram_dump;
|
extern SRAM sram_dump;
|
||||||
extern SRAM g_SRAM;
|
extern SRAM g_SRAM;
|
||||||
|
extern bool g_SRAM_netplay_initialized;
|
||||||
|
|
|
@ -13,6 +13,7 @@
|
||||||
#include "Core/HW/SI_DeviceDanceMat.h"
|
#include "Core/HW/SI_DeviceDanceMat.h"
|
||||||
#include "Core/HW/SI_DeviceGCController.h"
|
#include "Core/HW/SI_DeviceGCController.h"
|
||||||
#include "Core/HW/SI_DeviceGCSteeringWheel.h"
|
#include "Core/HW/SI_DeviceGCSteeringWheel.h"
|
||||||
|
#include "Core/HW/Sram.h"
|
||||||
#include "Core/HW/WiimoteEmu/WiimoteEmu.h"
|
#include "Core/HW/WiimoteEmu/WiimoteEmu.h"
|
||||||
#include "Core/HW/WiimoteReal/WiimoteReal.h"
|
#include "Core/HW/WiimoteReal/WiimoteReal.h"
|
||||||
#include "Core/IPC_HLE/WII_IPC_HLE_Device_usb.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 >> m_current_game;
|
||||||
packet >> g_NetPlaySettings.m_CPUthread;
|
packet >> g_NetPlaySettings.m_CPUthread;
|
||||||
packet >> g_NetPlaySettings.m_CPUcore;
|
packet >> g_NetPlaySettings.m_CPUcore;
|
||||||
|
packet >> g_NetPlaySettings.m_SelectedLanguage;
|
||||||
|
packet >> g_NetPlaySettings.m_OverrideGCLanguage;
|
||||||
packet >> g_NetPlaySettings.m_DSPEnableJIT;
|
packet >> g_NetPlaySettings.m_DSPEnableJIT;
|
||||||
packet >> g_NetPlaySettings.m_DSPHLE;
|
packet >> g_NetPlaySettings.m_DSPHLE;
|
||||||
packet >> g_NetPlaySettings.m_WriteToMemcard;
|
packet >> g_NetPlaySettings.m_WriteToMemcard;
|
||||||
|
@ -462,6 +465,22 @@ unsigned int NetPlayClient::OnData(sf::Packet& packet)
|
||||||
}
|
}
|
||||||
break;
|
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:
|
default:
|
||||||
PanicAlertT("Unknown message received with id : %d", mid);
|
PanicAlertT("Unknown message received with id : %d", mid);
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -12,6 +12,8 @@ struct NetSettings
|
||||||
{
|
{
|
||||||
bool m_CPUthread;
|
bool m_CPUthread;
|
||||||
int m_CPUcore;
|
int m_CPUcore;
|
||||||
|
int m_SelectedLanguage;
|
||||||
|
bool m_OverrideGCLanguage;
|
||||||
bool m_DSPHLE;
|
bool m_DSPHLE;
|
||||||
bool m_DSPEnableJIT;
|
bool m_DSPEnableJIT;
|
||||||
bool m_WriteToMemcard;
|
bool m_WriteToMemcard;
|
||||||
|
@ -29,7 +31,7 @@ struct Rpt : public std::vector<u8>
|
||||||
|
|
||||||
typedef std::vector<u8> NetWiimote;
|
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;
|
extern u64 g_netplay_initial_gctime;
|
||||||
|
|
||||||
|
@ -62,6 +64,8 @@ enum
|
||||||
NP_MSG_PING = 0xE0,
|
NP_MSG_PING = 0xE0,
|
||||||
NP_MSG_PONG = 0xE1,
|
NP_MSG_PONG = 0xE1,
|
||||||
NP_MSG_PLAYER_PING_DATA = 0xE2,
|
NP_MSG_PLAYER_PING_DATA = 0xE2,
|
||||||
|
|
||||||
|
NP_MSG_SYNC_GC_SRAM = 0xF0,
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef u8 MessageId;
|
typedef u8 MessageId;
|
||||||
|
|
|
@ -5,12 +5,15 @@
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include "Common/ENetUtil.h"
|
#include "Common/ENetUtil.h"
|
||||||
|
#include "Common/FileUtil.h"
|
||||||
#include "Common/IniFile.h"
|
#include "Common/IniFile.h"
|
||||||
#include "Common/StdMakeUnique.h"
|
#include "Common/StdMakeUnique.h"
|
||||||
#include "Common/StringUtil.h"
|
#include "Common/StringUtil.h"
|
||||||
|
#include "Core/ConfigManager.h"
|
||||||
#include "Core/NetPlayClient.h" //for NetPlayUI
|
#include "Core/NetPlayClient.h" //for NetPlayUI
|
||||||
#include "Core/NetPlayServer.h"
|
#include "Core/NetPlayServer.h"
|
||||||
#include "Core/HW/EXI_DeviceIPL.h"
|
#include "Core/HW/EXI_DeviceIPL.h"
|
||||||
|
#include "Core/HW/Sram.h"
|
||||||
#include "InputCommon/GCPadStatus.h"
|
#include "InputCommon/GCPadStatus.h"
|
||||||
#if !defined(_WIN32)
|
#if !defined(_WIN32)
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
|
@ -303,6 +306,21 @@ unsigned int NetPlayServer::OnConnect(ENetPeer* socket)
|
||||||
spac << (u32)m_target_buffer_size;
|
spac << (u32)m_target_buffer_size;
|
||||||
Send(player.socket, spac);
|
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
|
// sync values with new client
|
||||||
for (const auto& p : m_players)
|
for (const auto& p : m_players)
|
||||||
{
|
{
|
||||||
|
@ -697,6 +715,8 @@ bool NetPlayServer::StartGame()
|
||||||
*spac << m_current_game;
|
*spac << m_current_game;
|
||||||
*spac << m_settings.m_CPUthread;
|
*spac << m_settings.m_CPUthread;
|
||||||
*spac << m_settings.m_CPUcore;
|
*spac << m_settings.m_CPUcore;
|
||||||
|
*spac << m_settings.m_SelectedLanguage;
|
||||||
|
*spac << m_settings.m_OverrideGCLanguage;
|
||||||
*spac << m_settings.m_DSPEnableJIT;
|
*spac << m_settings.m_DSPEnableJIT;
|
||||||
*spac << m_settings.m_DSPHLE;
|
*spac << m_settings.m_DSPHLE;
|
||||||
*spac << m_settings.m_WriteToMemcard;
|
*spac << m_settings.m_WriteToMemcard;
|
||||||
|
|
|
@ -252,6 +252,8 @@ void NetPlayDialog::GetNetSettings(NetSettings &settings)
|
||||||
SConfig &instance = SConfig::GetInstance();
|
SConfig &instance = SConfig::GetInstance();
|
||||||
settings.m_CPUthread = instance.bCPUThread;
|
settings.m_CPUthread = instance.bCPUThread;
|
||||||
settings.m_CPUcore = instance.iCPUCore;
|
settings.m_CPUcore = instance.iCPUCore;
|
||||||
|
settings.m_SelectedLanguage = instance.SelectedLanguage;
|
||||||
|
settings.m_OverrideGCLanguage = instance.bOverrideGCLanguage;
|
||||||
settings.m_DSPHLE = instance.bDSPHLE;
|
settings.m_DSPHLE = instance.bDSPHLE;
|
||||||
settings.m_DSPEnableJIT = instance.m_DSPEnableJIT;
|
settings.m_DSPEnableJIT = instance.m_DSPEnableJIT;
|
||||||
settings.m_WriteToMemcard = m_memcard_write->GetValue();
|
settings.m_WriteToMemcard = m_memcard_write->GetValue();
|
||||||
|
|
Loading…
Reference in New Issue