mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-08-25 19:55:50 +00:00
pull in project-slippi/Ishiiruka/commit/abf44c428f91fa1f947bb44ce0b31b1b96c4f64f
This commit is contained in:
parent
a0535a494f
commit
7abc89b39c
4 changed files with 36 additions and 34 deletions
|
@ -248,8 +248,7 @@ CEXISlippi::~CEXISlippi()
|
||||||
m_fileWriteThread.join();
|
m_fileWriteThread.join();
|
||||||
}
|
}
|
||||||
|
|
||||||
SlippiSpectateServer::getInstance().write(&empty[0], 0);
|
SlippiSpectateServer::getInstance().endGame(true);
|
||||||
SlippiSpectateServer::getInstance().endGame();
|
|
||||||
|
|
||||||
localSelections.Reset();
|
localSelections.Reset();
|
||||||
|
|
||||||
|
|
|
@ -40,15 +40,22 @@ void SlippiSpectateServer::startGame()
|
||||||
{
|
{
|
||||||
m_event_queue.Push("START_GAME");
|
m_event_queue.Push("START_GAME");
|
||||||
}
|
}
|
||||||
|
json start_game_message;
|
||||||
|
start_game_message["type"] = "start_game";
|
||||||
|
m_event_queue.Push(start_game_message.dump());
|
||||||
}
|
}
|
||||||
|
|
||||||
// CALLED FROM DOLPHIN MAIN THREAD
|
// CALLED FROM DOLPHIN MAIN THREAD
|
||||||
void SlippiSpectateServer::endGame()
|
void SlippiSpectateServer::endGame(bool dolphin_closed)
|
||||||
{
|
{
|
||||||
if (isSpectatorEnabled())
|
if (isSpectatorEnabled())
|
||||||
{
|
{
|
||||||
m_event_queue.Push("END_GAME");
|
m_event_queue.Push("END_GAME");
|
||||||
}
|
}
|
||||||
|
json end_game_message;
|
||||||
|
end_game_message["type"] = "end_game";
|
||||||
|
end_game_message["dolphin_closed"] = dolphin_closed;
|
||||||
|
m_event_queue.Push(end_game_message.dump());
|
||||||
}
|
}
|
||||||
|
|
||||||
// CALLED FROM SERVER THREAD
|
// CALLED FROM SERVER THREAD
|
||||||
|
@ -95,39 +102,36 @@ void SlippiSpectateServer::popEvents()
|
||||||
std::string event;
|
std::string event;
|
||||||
m_event_queue.Pop(event);
|
m_event_queue.Pop(event);
|
||||||
// These two are meta-events, used to signify the start/end of a game
|
// These two are meta-events, used to signify the start/end of a game
|
||||||
// They are not sent over the wire
|
json json_message = json::parse(event, nullptr, false);
|
||||||
if (event == "END_GAME")
|
if (!json_message.is_discarded() && (json_message.find("type") != json_message.end()))
|
||||||
{
|
{
|
||||||
m_menu_cursor = 0;
|
if (json_message["type"] == "end_game")
|
||||||
if (m_event_buffer.size() > 0)
|
|
||||||
{
|
{
|
||||||
|
u32 cursor = (u32)(m_event_buffer.size() + m_cursor_offset);
|
||||||
|
json_message["cursor"] = cursor;
|
||||||
|
json_message["next_cursor"] = cursor + 1;
|
||||||
|
m_menu_cursor = 0;
|
||||||
|
m_event_buffer.push_back(json_message.dump());
|
||||||
m_cursor_offset += m_event_buffer.size();
|
m_cursor_offset += m_event_buffer.size();
|
||||||
|
m_menu_event.clear();
|
||||||
|
m_in_game = false;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
else if (json_message["type"] == "start_game")
|
||||||
|
{
|
||||||
|
m_event_buffer.clear();
|
||||||
|
u32 cursor = (u32)(m_event_buffer.size() + m_cursor_offset);
|
||||||
|
m_in_game = true;
|
||||||
|
json_message["cursor"] = cursor;
|
||||||
|
json_message["next_cursor"] = cursor + 1;
|
||||||
|
m_event_buffer.push_back(json_message.dump());
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
m_menu_event.clear();
|
|
||||||
m_in_game = false;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (event == "START_GAME")
|
|
||||||
{
|
|
||||||
m_event_buffer.clear();
|
|
||||||
m_in_game = true;
|
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Make json wrapper for game event
|
// Make json wrapper for game event
|
||||||
json game_event;
|
json game_event;
|
||||||
|
|
||||||
// An SLP event with an empty payload is a quasi-event that signifies
|
|
||||||
// the unclean exit of a game. Send this out as its own event
|
|
||||||
// (Since you can't meaningfully concat it with other events)
|
|
||||||
if (event.empty())
|
|
||||||
{
|
|
||||||
game_event["payload"] = "";
|
|
||||||
game_event["type"] = "game_event";
|
|
||||||
m_event_buffer.push_back(game_event.dump());
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!m_in_game)
|
if (!m_in_game)
|
||||||
{
|
{
|
||||||
game_event["payload"] = base64::Base64::Encode(event);
|
game_event["payload"] = base64::Base64::Encode(event);
|
||||||
|
@ -168,6 +172,8 @@ SlippiSpectateServer::SlippiSpectateServer()
|
||||||
{
|
{
|
||||||
m_in_game = false;
|
m_in_game = false;
|
||||||
m_menu_cursor = 0;
|
m_menu_cursor = 0;
|
||||||
|
m_menu_event.clear();
|
||||||
|
m_cursor_offset = 0;
|
||||||
|
|
||||||
// Spawn thread for socket listener
|
// Spawn thread for socket listener
|
||||||
m_stop_socket_thread = false;
|
m_stop_socket_thread = false;
|
||||||
|
|
|
@ -56,7 +56,8 @@ public:
|
||||||
// when a new client connects to the server mid-match, it can recieve all
|
// when a new client connects to the server mid-match, it can recieve all
|
||||||
// the game events that have happened so far. This buffer needs to be
|
// the game events that have happened so far. This buffer needs to be
|
||||||
// cleared when a match ends.
|
// cleared when a match ends.
|
||||||
void endGame();
|
// If this is called due to dolphin closing then dolphin_closed will be true
|
||||||
|
void endGame(bool dolphin_closed = false);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// ACCESSED FROM BOTH DOLPHIN AND SERVER THREADS
|
// ACCESSED FROM BOTH DOLPHIN AND SERVER THREADS
|
||||||
|
|
|
@ -10,7 +10,6 @@
|
||||||
#include <cstdio>
|
#include <cstdio>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#include <OptionParser.h>
|
#include <OptionParser.h>
|
||||||
#include <QAbstractEventDispatcher>
|
#include <QAbstractEventDispatcher>
|
||||||
#include <QApplication>
|
#include <QApplication>
|
||||||
|
@ -197,10 +196,6 @@ int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR pCmdLine
|
||||||
save_state_path = static_cast<const char*>(options.get("save_state"));
|
save_state_path = static_cast<const char*>(options.get("save_state"));
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef IS_PLAYBACK
|
|
||||||
SlippiSpectateServer::getInstance().endGame();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
std::unique_ptr<BootParameters> boot;
|
std::unique_ptr<BootParameters> boot;
|
||||||
bool game_specified = false;
|
bool game_specified = false;
|
||||||
if (options.is_set("exec"))
|
if (options.is_set("exec"))
|
||||||
|
@ -258,7 +253,8 @@ int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR pCmdLine
|
||||||
#ifndef IS_PLAYBACK
|
#ifndef IS_PLAYBACK
|
||||||
if (Settings::Instance().IsBootDefaultISO() && !Settings::Instance().GetDefaultGame().isEmpty())
|
if (Settings::Instance().IsBootDefaultISO() && !Settings::Instance().GetDefaultGame().isEmpty())
|
||||||
{
|
{
|
||||||
boot = BootParameters::GenerateFromFile(Settings::Instance().GetDefaultGame().toStdString(), save_state_path);
|
boot = BootParameters::GenerateFromFile(Settings::Instance().GetDefaultGame().toStdString(),
|
||||||
|
save_state_path);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue