Commit 77cea9dd authored by mercury233's avatar mercury233

test

parent fe0246a7
...@@ -76,6 +76,14 @@ public: ...@@ -76,6 +76,14 @@ public:
if(dp) if(dp)
bufferevent_write(dp->bev, net_server_write, last_sent); bufferevent_write(dp->bev, net_server_write, last_sent);
} }
#ifdef YGOPRO_SERVER_MODE
static void ReSendToPlayers(DuelPlayer* dp1, DuelPlayer* dp2) {
if(dp1)
bufferevent_write(dp1->bev, net_server_write, last_sent);
if(dp2)
bufferevent_write(dp2->bev, net_server_write, last_sent);
}
#endif //YGOPRO_SERVER_MODE
}; };
} }
......
...@@ -9,8 +9,9 @@ ...@@ -9,8 +9,9 @@
namespace ygo { namespace ygo {
#ifdef YGOPRO_SERVER_MODE
extern unsigned short replay_mode; extern unsigned short replay_mode;
#endif
SingleDuel::SingleDuel(bool is_match) { SingleDuel::SingleDuel(bool is_match) {
game_started = false; game_started = false;
match_mode = is_match; match_mode = is_match;
...@@ -21,6 +22,10 @@ SingleDuel::SingleDuel(bool is_match) { ...@@ -21,6 +22,10 @@ SingleDuel::SingleDuel(bool is_match) {
} }
duel_count = 0; duel_count = 0;
memset(match_result, 0, 3); memset(match_result, 0, 3);
#ifdef YGOPRO_SERVER_MODE
cache_recorder = 0;
replay_recorder = 0;
#endif
} }
SingleDuel::~SingleDuel() { SingleDuel::~SingleDuel() {
} }
...@@ -36,21 +41,23 @@ void SingleDuel::Chat(DuelPlayer* dp, void* pdata, int len) { ...@@ -36,21 +41,23 @@ void SingleDuel::Chat(DuelPlayer* dp, void* pdata, int len) {
if((*pit) != dp) if((*pit) != dp)
NetServer::ReSendToPlayer(*pit); NetServer::ReSendToPlayer(*pit);
#ifdef YGOPRO_SERVER_MODE #ifdef YGOPRO_SERVER_MODE
/*for(auto pit = recorders.begin(); pit != recorders.end(); ++pit) if(cache_recorder)
if((*pit) != dp) NetServer::ReSendToPlayer(cache_recorder);
NetServer::ReSendToPlayer(*pit);*/ #endif
#endif //YGOPRO_SERVER_MODE
} else { } else {
NetServer::SendBufferToPlayer(players[1 - dp->type], STOC_CHAT, &scc, 4 + msglen * 2); NetServer::SendBufferToPlayer(players[1 - dp->type], STOC_CHAT, &scc, 4 + msglen * 2);
for(auto pit = observers.begin(); pit != observers.end(); ++pit) for(auto pit = observers.begin(); pit != observers.end(); ++pit)
NetServer::ReSendToPlayer(*pit); NetServer::ReSendToPlayer(*pit);
#ifdef YGOPRO_SERVER_MODE #ifdef YGOPRO_SERVER_MODE
/*for(auto pit = recorders.begin(); pit != recorders.end(); ++pit) if(cache_recorder)
NetServer::ReSendToPlayer(*pit);*/ NetServer::ReSendToPlayer(cache_recorder);
#endif //YGOPRO_SERVER_MODE #endif
} }
} }
void SingleDuel::JoinGame(DuelPlayer* dp, void* pdata, bool is_creater) { void SingleDuel::JoinGame(DuelPlayer* dp, void* pdata, bool is_creater) {
#ifdef YGOPRO_SERVER_MODE
bool is_recorder = false;
#endif
if(!is_creater) { if(!is_creater) {
if(dp->game && dp->type != 0xff) { if(dp->game && dp->type != 0xff) {
STOC_ErrorMsg scem; STOC_ErrorMsg scem;
...@@ -69,11 +76,18 @@ void SingleDuel::JoinGame(DuelPlayer* dp, void* pdata, bool is_creater) { ...@@ -69,11 +76,18 @@ void SingleDuel::JoinGame(DuelPlayer* dp, void* pdata, bool is_creater) {
NetServer::DisconnectPlayer(dp); NetServer::DisconnectPlayer(dp);
return; return;
} }
#ifdef YGOPRO_SERVER_MODE
#else
wchar_t jpass[20]; wchar_t jpass[20];
BufferIO::CopyWStr(pkt->pass, jpass, 20); BufferIO::CopyWStr(pkt->pass, jpass, 20);
#ifdef YGOPRO_SERVER_MODE
if(!wcscmp(jpass, L"the Big Brother") && !cache_recorder) {
is_recorder = true;
cache_recorder = dp;
}
if(!wcscmp(jpass, L"Marshtomp") && !replay_recorder) {
is_recorder = true;
replay_recorder = dp;
}
#else
if(wcscmp(jpass, pass)) { if(wcscmp(jpass, pass)) {
STOC_ErrorMsg scem; STOC_ErrorMsg scem;
scem.msg = ERRMSG_JOINERROR; scem.msg = ERRMSG_JOINERROR;
...@@ -90,6 +104,13 @@ void SingleDuel::JoinGame(DuelPlayer* dp, void* pdata, bool is_creater) { ...@@ -90,6 +104,13 @@ void SingleDuel::JoinGame(DuelPlayer* dp, void* pdata, bool is_creater) {
scjg.info = host_info; scjg.info = host_info;
STOC_TypeChange sctc; STOC_TypeChange sctc;
sctc.type = (host_player == dp) ? 0x10 : 0; sctc.type = (host_player == dp) ? 0x10 : 0;
#ifdef YGOPRO_SERVER_MODE
if(is_recorder) {
dp->type = 9;
sctc.type = NETPLAYER_TYPE_OBSERVER;
}
else
#endif //YGOPRO_SERVER_MODE
if(!players[0] || !players[1]) { if(!players[0] || !players[1]) {
STOC_HS_PlayerEnter scpe; STOC_HS_PlayerEnter scpe;
BufferIO::CopyWStr(dp->name, scpe.name, 20); BufferIO::CopyWStr(dp->name, scpe.name, 20);
...@@ -103,8 +124,12 @@ void SingleDuel::JoinGame(DuelPlayer* dp, void* pdata, bool is_creater) { ...@@ -103,8 +124,12 @@ void SingleDuel::JoinGame(DuelPlayer* dp, void* pdata, bool is_creater) {
} }
for(auto pit = observers.begin(); pit != observers.end(); ++pit) for(auto pit = observers.begin(); pit != observers.end(); ++pit)
NetServer::SendPacketToPlayer(*pit, STOC_HS_PLAYER_ENTER, scpe); NetServer::SendPacketToPlayer(*pit, STOC_HS_PLAYER_ENTER, scpe);
for(auto pit = recorders.begin(); pit != recorders.end(); ++pit) #ifdef YGOPRO_SERVER_MODE
NetServer::SendPacketToPlayer(*pit, STOC_HS_PLAYER_ENTER, scpe); if(cache_recorder)
NetServer::SendPacketToPlayer(cache_recorder, STOC_HS_PLAYER_ENTER, scpe);
if(replay_recorder)
NetServer::SendPacketToPlayer(replay_recorder, STOC_HS_PLAYER_ENTER, scpe);
#endif
if(!players[0]) { if(!players[0]) {
players[0] = dp; players[0] = dp;
dp->type = NETPLAYER_TYPE_PLAYER1; dp->type = NETPLAYER_TYPE_PLAYER1;
...@@ -126,8 +151,12 @@ void SingleDuel::JoinGame(DuelPlayer* dp, void* pdata, bool is_creater) { ...@@ -126,8 +151,12 @@ void SingleDuel::JoinGame(DuelPlayer* dp, void* pdata, bool is_creater) {
NetServer::SendPacketToPlayer(players[1], STOC_HS_WATCH_CHANGE, scwc); NetServer::SendPacketToPlayer(players[1], STOC_HS_WATCH_CHANGE, scwc);
for(auto pit = observers.begin(); pit != observers.end(); ++pit) for(auto pit = observers.begin(); pit != observers.end(); ++pit)
NetServer::SendPacketToPlayer(*pit, STOC_HS_WATCH_CHANGE, scwc); NetServer::SendPacketToPlayer(*pit, STOC_HS_WATCH_CHANGE, scwc);
for(auto pit = recorders.begin(); pit != recorders.end(); ++pit) #ifdef YGOPRO_SERVER_MODE
NetServer::SendPacketToPlayer(*pit, STOC_HS_WATCH_CHANGE, scwc); if(cache_recorder)
NetServer::SendPacketToPlayer(cache_recorder, STOC_HS_WATCH_CHANGE, scwc);
if(replay_recorder)
NetServer::SendPacketToPlayer(replay_recorder, STOC_HS_WATCH_CHANGE, scwc);
#endif
} }
NetServer::SendPacketToPlayer(dp, STOC_JOIN_GAME, scjg); NetServer::SendPacketToPlayer(dp, STOC_JOIN_GAME, scjg);
NetServer::SendPacketToPlayer(dp, STOC_TYPE_CHANGE, sctc); NetServer::SendPacketToPlayer(dp, STOC_TYPE_CHANGE, sctc);
...@@ -161,6 +190,7 @@ void SingleDuel::JoinGame(DuelPlayer* dp, void* pdata, bool is_creater) { ...@@ -161,6 +190,7 @@ void SingleDuel::JoinGame(DuelPlayer* dp, void* pdata, bool is_creater) {
} }
void SingleDuel::LeaveGame(DuelPlayer* dp) { void SingleDuel::LeaveGame(DuelPlayer* dp) {
if(dp == host_player) { if(dp == host_player) {
#ifdef YGOPRO_SERVER_MODE
int host_pos; int host_pos;
if(players[0] && dp->type != 0) { if(players[0] && dp->type != 0) {
host_pos = 0; host_pos = 0;
...@@ -179,6 +209,11 @@ void SingleDuel::LeaveGame(DuelPlayer* dp) { ...@@ -179,6 +209,11 @@ void SingleDuel::LeaveGame(DuelPlayer* dp) {
NetServer::SendPacketToPlayer(players[host_pos], STOC_TYPE_CHANGE, sctc); NetServer::SendPacketToPlayer(players[host_pos], STOC_TYPE_CHANGE, sctc);
} }
if(dp->type == NETPLAYER_TYPE_OBSERVER) { if(dp->type == NETPLAYER_TYPE_OBSERVER) {
#else
EndDuel();
NetServer::StopServer();
} else if(dp->type == NETPLAYER_TYPE_OBSERVER) {
#endif //YGOPRO_SERVER_MODE
observers.erase(dp); observers.erase(dp);
if(!game_started) { if(!game_started) {
STOC_HS_WatchChange scwc; STOC_HS_WatchChange scwc;
...@@ -189,8 +224,12 @@ void SingleDuel::LeaveGame(DuelPlayer* dp) { ...@@ -189,8 +224,12 @@ void SingleDuel::LeaveGame(DuelPlayer* dp) {
NetServer::SendPacketToPlayer(players[1], STOC_HS_WATCH_CHANGE, scwc); NetServer::SendPacketToPlayer(players[1], STOC_HS_WATCH_CHANGE, scwc);
for(auto pit = observers.begin(); pit != observers.end(); ++pit) for(auto pit = observers.begin(); pit != observers.end(); ++pit)
NetServer::SendPacketToPlayer(*pit, STOC_HS_WATCH_CHANGE, scwc); NetServer::SendPacketToPlayer(*pit, STOC_HS_WATCH_CHANGE, scwc);
for(auto pit = recorders.begin(); pit != recorders.end(); ++pit) #ifdef YGOPRO_SERVER_MODE
NetServer::SendPacketToPlayer(*pit, STOC_HS_WATCH_CHANGE, scwc); if(cache_recorder)
NetServer::SendPacketToPlayer(cache_recorder, STOC_HS_WATCH_CHANGE, scwc);
if(replay_recorder)
NetServer::SendPacketToPlayer(replay_recorder, STOC_HS_WATCH_CHANGE, scwc);
#endif
} }
NetServer::DisconnectPlayer(dp); NetServer::DisconnectPlayer(dp);
} else { } else {
...@@ -205,8 +244,12 @@ void SingleDuel::LeaveGame(DuelPlayer* dp) { ...@@ -205,8 +244,12 @@ void SingleDuel::LeaveGame(DuelPlayer* dp) {
NetServer::SendPacketToPlayer(players[1], STOC_HS_PLAYER_CHANGE, scpc); NetServer::SendPacketToPlayer(players[1], STOC_HS_PLAYER_CHANGE, scpc);
for(auto pit = observers.begin(); pit != observers.end(); ++pit) for(auto pit = observers.begin(); pit != observers.end(); ++pit)
NetServer::SendPacketToPlayer(*pit, STOC_HS_PLAYER_CHANGE, scpc); NetServer::SendPacketToPlayer(*pit, STOC_HS_PLAYER_CHANGE, scpc);
for(auto pit = recorders.begin(); pit != recorders.end(); ++pit) #ifdef YGOPRO_SERVER_MODE
NetServer::SendPacketToPlayer(*pit, STOC_HS_PLAYER_CHANGE, scpc); if(cache_recorder)
NetServer::SendPacketToPlayer(cache_recorder, STOC_HS_PLAYER_CHANGE, scpc);
if(replay_recorder)
NetServer::SendPacketToPlayer(replay_recorder, STOC_HS_PLAYER_CHANGE, scpc);
#endif
NetServer::DisconnectPlayer(dp); NetServer::DisconnectPlayer(dp);
} else { } else {
if(!game_started) { if(!game_started) {
...@@ -218,20 +261,26 @@ void SingleDuel::LeaveGame(DuelPlayer* dp) { ...@@ -218,20 +261,26 @@ void SingleDuel::LeaveGame(DuelPlayer* dp) {
unsigned char wbuf[3]; unsigned char wbuf[3];
wbuf[0] = MSG_WIN; wbuf[0] = MSG_WIN;
wbuf[1] = 1 - dp->type; wbuf[1] = 1 - dp->type;
#ifdef YGOPRO_SERVER_MODE
wbuf[2] = 4; wbuf[2] = 4;
#else
wbuf[2] = 0;
#endif
NetServer::SendBufferToPlayer(players[0], STOC_GAME_MSG, wbuf, 3); NetServer::SendBufferToPlayer(players[0], STOC_GAME_MSG, wbuf, 3);
NetServer::ReSendToPlayer(players[1]); NetServer::ReSendToPlayer(players[1]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit) for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit) #ifdef YGOPRO_SERVER_MODE
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayers(cache_recorder, replay_recorder);
#endif
EndDuel(); EndDuel();
NetServer::SendPacketToPlayer(players[0], STOC_DUEL_END); NetServer::SendPacketToPlayer(players[0], STOC_DUEL_END);
NetServer::ReSendToPlayer(players[1]); NetServer::ReSendToPlayer(players[1]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit) for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit) #ifdef YGOPRO_SERVER_MODE
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayers(cache_recorder, replay_recorder);
#endif
NetServer::StopServer(); NetServer::StopServer();
} }
} }
...@@ -265,10 +314,16 @@ void SingleDuel::ToDuelist(DuelPlayer* dp) { ...@@ -265,10 +314,16 @@ void SingleDuel::ToDuelist(DuelPlayer* dp) {
NetServer::SendPacketToPlayer(*pit, STOC_HS_PLAYER_ENTER, scpe); NetServer::SendPacketToPlayer(*pit, STOC_HS_PLAYER_ENTER, scpe);
NetServer::SendPacketToPlayer(*pit, STOC_HS_WATCH_CHANGE, scwc); NetServer::SendPacketToPlayer(*pit, STOC_HS_WATCH_CHANGE, scwc);
} }
for(auto pit = recorders.begin(); pit != recorders.end(); ++pit) { #ifdef YGOPRO_SERVER_MODE
NetServer::SendPacketToPlayer(*pit, STOC_HS_PLAYER_ENTER, scpe); if(cache_recorder) {
NetServer::SendPacketToPlayer(*pit, STOC_HS_WATCH_CHANGE, scwc); NetServer::SendPacketToPlayer(cache_recorder, STOC_HS_PLAYER_ENTER, scpe);
NetServer::SendPacketToPlayer(cache_recorder, STOC_HS_WATCH_CHANGE, scwc);
}
if(replay_recorder) {
NetServer::SendPacketToPlayer(replay_recorder, STOC_HS_PLAYER_ENTER, scpe);
NetServer::SendPacketToPlayer(replay_recorder, STOC_HS_WATCH_CHANGE, scwc);
} }
#endif
STOC_TypeChange sctc; STOC_TypeChange sctc;
sctc.type = (dp == host_player ? 0x10 : 0) | dp->type; sctc.type = (dp == host_player ? 0x10 : 0) | dp->type;
NetServer::SendPacketToPlayer(dp, STOC_TYPE_CHANGE, sctc); NetServer::SendPacketToPlayer(dp, STOC_TYPE_CHANGE, sctc);
...@@ -284,14 +339,15 @@ void SingleDuel::ToObserver(DuelPlayer* dp) { ...@@ -284,14 +339,15 @@ void SingleDuel::ToObserver(DuelPlayer* dp) {
NetServer::SendPacketToPlayer(players[1], STOC_HS_PLAYER_CHANGE, scpc); NetServer::SendPacketToPlayer(players[1], STOC_HS_PLAYER_CHANGE, scpc);
for(auto pit = observers.begin(); pit != observers.end(); ++pit) for(auto pit = observers.begin(); pit != observers.end(); ++pit)
NetServer::SendPacketToPlayer(*pit, STOC_HS_PLAYER_CHANGE, scpc); NetServer::SendPacketToPlayer(*pit, STOC_HS_PLAYER_CHANGE, scpc);
for(auto pit = recorders.begin(); pit != recorders.end(); ++pit) #ifdef YGOPRO_SERVER_MODE
NetServer::SendPacketToPlayer(*pit, STOC_HS_PLAYER_CHANGE, scpc); if(cache_recorder)
NetServer::SendPacketToPlayer(cache_recorder, STOC_HS_PLAYER_CHANGE, scpc);
if(replay_recorder)
NetServer::SendPacketToPlayer(replay_recorder, STOC_HS_PLAYER_CHANGE, scpc);
#endif
players[dp->type] = 0; players[dp->type] = 0;
ready[dp->type] = false; ready[dp->type] = false;
dp->type = NETPLAYER_TYPE_OBSERVER; dp->type = NETPLAYER_TYPE_OBSERVER;
if (recorders.size()==0 && dp->name[0] == 77)
recorders.insert(dp);
else
observers.insert(dp); observers.insert(dp);
STOC_TypeChange sctc; STOC_TypeChange sctc;
sctc.type = (dp == host_player ? 0x10 : 0) | dp->type; sctc.type = (dp == host_player ? 0x10 : 0) | dp->type;
...@@ -325,8 +381,12 @@ void SingleDuel::PlayerReady(DuelPlayer* dp, bool is_ready) { ...@@ -325,8 +381,12 @@ void SingleDuel::PlayerReady(DuelPlayer* dp, bool is_ready) {
NetServer::SendPacketToPlayer(players[1 - dp->type], STOC_HS_PLAYER_CHANGE, scpc); NetServer::SendPacketToPlayer(players[1 - dp->type], STOC_HS_PLAYER_CHANGE, scpc);
for(auto pit = observers.begin(); pit != observers.end(); ++pit) for(auto pit = observers.begin(); pit != observers.end(); ++pit)
NetServer::SendPacketToPlayer(*pit, STOC_HS_PLAYER_CHANGE, scpc); NetServer::SendPacketToPlayer(*pit, STOC_HS_PLAYER_CHANGE, scpc);
for(auto pit = recorders.begin(); pit != recorders.end(); ++pit) #ifdef YGOPRO_SERVER_MODE
NetServer::SendPacketToPlayer(*pit, STOC_HS_PLAYER_CHANGE, scpc); if(cache_recorder)
NetServer::SendPacketToPlayer(cache_recorder, STOC_HS_PLAYER_CHANGE, scpc);
if(replay_recorder)
NetServer::SendPacketToPlayer(replay_recorder, STOC_HS_PLAYER_CHANGE, scpc);
#endif
} }
void SingleDuel::PlayerKick(DuelPlayer* dp, unsigned char pos) { void SingleDuel::PlayerKick(DuelPlayer* dp, unsigned char pos) {
if(pos > 1 || dp != host_player || dp == players[pos] || !players[pos]) if(pos > 1 || dp != host_player || dp == players[pos] || !players[pos])
...@@ -372,10 +432,13 @@ void SingleDuel::StartDuel(DuelPlayer* dp) { ...@@ -372,10 +432,13 @@ void SingleDuel::StartDuel(DuelPlayer* dp) {
(*oit)->state = CTOS_LEAVE_GAME; (*oit)->state = CTOS_LEAVE_GAME;
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayer(*oit);
} }
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit) { #ifdef YGOPRO_SERVER_MODE
(*oit)->state = CTOS_LEAVE_GAME; if(cache_recorder)
NetServer::ReSendToPlayer(*oit); cache_recorder->state = CTOS_LEAVE_GAME;
} if(replay_recorder)
replay_recorder->state = CTOS_LEAVE_GAME;
NetServer::ReSendToPlayers(cache_recorder, replay_recorder);
#endif
NetServer::SendPacketToPlayer(players[0], STOC_SELECT_HAND); NetServer::SendPacketToPlayer(players[0], STOC_SELECT_HAND);
NetServer::ReSendToPlayer(players[1]); NetServer::ReSendToPlayer(players[1]);
hand_result[0] = 0; hand_result[0] = 0;
...@@ -396,8 +459,9 @@ void SingleDuel::HandResult(DuelPlayer* dp, unsigned char res) { ...@@ -396,8 +459,9 @@ void SingleDuel::HandResult(DuelPlayer* dp, unsigned char res) {
NetServer::SendPacketToPlayer(players[0], STOC_HAND_RESULT, schr); NetServer::SendPacketToPlayer(players[0], STOC_HAND_RESULT, schr);
for(auto oit = observers.begin(); oit != observers.end(); ++oit) for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit) #ifdef YGOPRO_SERVER_MODE
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayers(cache_recorder, replay_recorder);
#endif
schr.res1 = hand_result[1]; schr.res1 = hand_result[1];
schr.res2 = hand_result[0]; schr.res2 = hand_result[0];
NetServer::SendPacketToPlayer(players[1], STOC_HAND_RESULT, schr); NetServer::SendPacketToPlayer(players[1], STOC_HAND_RESULT, schr);
...@@ -518,8 +582,12 @@ void SingleDuel::TPResult(DuelPlayer* dp, unsigned char tp) { ...@@ -518,8 +582,12 @@ void SingleDuel::TPResult(DuelPlayer* dp, unsigned char tp) {
else startbuf[1] = 0x11; else startbuf[1] = 0x11;
for(auto oit = observers.begin(); oit != observers.end(); ++oit) for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::SendBufferToPlayer(*oit, STOC_GAME_MSG, startbuf, 18); NetServer::SendBufferToPlayer(*oit, STOC_GAME_MSG, startbuf, 18);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit) #ifdef YGOPRO_SERVER_MODE
NetServer::SendBufferToPlayer(*oit, STOC_GAME_MSG, startbuf, 18); if(cache_recorder)
NetServer::SendBufferToPlayer(cache_recorder, STOC_GAME_MSG, startbuf, 18);
if(replay_recorder)
NetServer::SendBufferToPlayer(replay_recorder, STOC_GAME_MSG, startbuf, 18);
#endif
RefreshExtra(0); RefreshExtra(0);
RefreshExtra(1); RefreshExtra(1);
start_duel(pduel, opt); start_duel(pduel, opt);
...@@ -549,8 +617,9 @@ void SingleDuel::DuelEndProc() { ...@@ -549,8 +617,9 @@ void SingleDuel::DuelEndProc() {
NetServer::ReSendToPlayer(players[1]); NetServer::ReSendToPlayer(players[1]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit) for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit) #ifdef YGOPRO_SERVER_MODE
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayers(cache_recorder, replay_recorder);
#endif
NetServer::StopServer(); NetServer::StopServer();
} else { } else {
int winc[3] = {0, 0, 0}; int winc[3] = {0, 0, 0};
...@@ -564,8 +633,9 @@ void SingleDuel::DuelEndProc() { ...@@ -564,8 +633,9 @@ void SingleDuel::DuelEndProc() {
NetServer::ReSendToPlayer(players[1]); NetServer::ReSendToPlayer(players[1]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit) for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit) #ifdef YGOPRO_SERVER_MODE
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayers(cache_recorder, replay_recorder);
#endif
NetServer::StopServer(); NetServer::StopServer();
} else { } else {
if(players[0] != pplayer[0]) { if(players[0] != pplayer[0]) {
...@@ -585,8 +655,12 @@ void SingleDuel::DuelEndProc() { ...@@ -585,8 +655,12 @@ void SingleDuel::DuelEndProc() {
NetServer::SendPacketToPlayer(players[1], STOC_CHANGE_SIDE); NetServer::SendPacketToPlayer(players[1], STOC_CHANGE_SIDE);
for(auto oit = observers.begin(); oit != observers.end(); ++oit) for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::SendPacketToPlayer(*oit, STOC_WAITING_SIDE); NetServer::SendPacketToPlayer(*oit, STOC_WAITING_SIDE);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit) #ifdef YGOPRO_SERVER_MODE
NetServer::SendPacketToPlayer(*oit, STOC_WAITING_SIDE); if(cache_recorder)
NetServer::SendPacketToPlayer(cache_recorder, STOC_WAITING_SIDE);
if(replay_recorder)
NetServer::SendPacketToPlayer(replay_recorder, STOC_WAITING_SIDE);
#endif
} }
} }
} }
...@@ -602,8 +676,9 @@ void SingleDuel::Surrender(DuelPlayer* dp) { ...@@ -602,8 +676,9 @@ void SingleDuel::Surrender(DuelPlayer* dp) {
NetServer::ReSendToPlayer(players[1]); NetServer::ReSendToPlayer(players[1]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit) for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit) #ifdef YGOPRO_SERVER_MODE
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayers(cache_recorder, replay_recorder);
#endif
if(players[player] == pplayer[player]) { if(players[player] == pplayer[player]) {
match_result[duel_count++] = 1 - player; match_result[duel_count++] = 1 - player;
tp_player = player; tp_player = player;
...@@ -647,8 +722,9 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) { ...@@ -647,8 +722,9 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::SendBufferToPlayer(players[1 - player], STOC_GAME_MSG, offset, pbuf - offset); NetServer::SendBufferToPlayer(players[1 - player], STOC_GAME_MSG, offset, pbuf - offset);
for(auto oit = observers.begin(); oit != observers.end(); ++oit) for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit) #ifdef YGOPRO_SERVER_MODE
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayers(cache_recorder, replay_recorder);
#endif
break; break;
} }
case 10: { case 10: {
...@@ -656,8 +732,9 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) { ...@@ -656,8 +732,9 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::SendBufferToPlayer(players[1], STOC_GAME_MSG, offset, pbuf - offset); NetServer::SendBufferToPlayer(players[1], STOC_GAME_MSG, offset, pbuf - offset);
for(auto oit = observers.begin(); oit != observers.end(); ++oit) for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit) #ifdef YGOPRO_SERVER_MODE
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayers(cache_recorder, replay_recorder);
#endif
break; break;
} }
} }
...@@ -670,8 +747,9 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) { ...@@ -670,8 +747,9 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[1]); NetServer::ReSendToPlayer(players[1]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit) for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit) #ifdef YGOPRO_SERVER_MODE
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayers(cache_recorder, replay_recorder);
#endif
if(player > 1) { if(player > 1) {
match_result[duel_count++] = 2; match_result[duel_count++] = 2;
tp_player = 1 - tp_player; tp_player = 1 - tp_player;
...@@ -827,8 +905,9 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) { ...@@ -827,8 +905,9 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[1]); NetServer::ReSendToPlayer(players[1]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit) for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit) #ifdef YGOPRO_SERVER_MODE
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayers(cache_recorder, replay_recorder);
#endif
break; break;
} }
case MSG_CONFIRM_CARDS: { case MSG_CONFIRM_CARDS: {
...@@ -840,8 +919,9 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) { ...@@ -840,8 +919,9 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[1 - player]); NetServer::ReSendToPlayer(players[1 - player]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit) for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit) #ifdef YGOPRO_SERVER_MODE
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayers(cache_recorder, replay_recorder);
#endif
} else { } else {
pbuf += count * 7; pbuf += count * 7;
NetServer::SendBufferToPlayer(players[player], STOC_GAME_MSG, offset, pbuf - offset); NetServer::SendBufferToPlayer(players[player], STOC_GAME_MSG, offset, pbuf - offset);
...@@ -854,21 +934,26 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) { ...@@ -854,21 +934,26 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[1]); NetServer::ReSendToPlayer(players[1]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit) for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit) #ifdef YGOPRO_SERVER_MODE
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayers(cache_recorder, replay_recorder);
#endif
break; break;
} }
case MSG_SHUFFLE_HAND: { case MSG_SHUFFLE_HAND: {
player = BufferIO::ReadInt8(pbuf); player = BufferIO::ReadInt8(pbuf);
count = BufferIO::ReadInt8(pbuf); count = BufferIO::ReadInt8(pbuf);
NetServer::SendBufferToPlayer(players[player], STOC_GAME_MSG, offset, (pbuf - offset) + count * 4); NetServer::SendBufferToPlayer(players[player], STOC_GAME_MSG, offset, (pbuf - offset) + count * 4);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit) #ifdef YGOPRO_SERVER_MODE
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayer(replay_recorder);
#endif
for(int i = 0; i < count; ++i) for(int i = 0; i < count; ++i)
BufferIO::WriteInt32(pbuf, 0); BufferIO::WriteInt32(pbuf, 0);
NetServer::SendBufferToPlayer(players[1 - player], STOC_GAME_MSG, offset, pbuf - offset); NetServer::SendBufferToPlayer(players[1 - player], STOC_GAME_MSG, offset, pbuf - offset);
for(auto oit = observers.begin(); oit != observers.end(); ++oit) for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayer(*oit);
#ifdef YGOPRO_SERVER_MODE
NetServer::ReSendToPlayer(cache_recorder);
#endif
RefreshHand(player, 0x781fff, 0); RefreshHand(player, 0x781fff, 0);
break; break;
} }
...@@ -878,8 +963,9 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) { ...@@ -878,8 +963,9 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[1]); NetServer::ReSendToPlayer(players[1]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit) for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit) #ifdef YGOPRO_SERVER_MODE
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayers(cache_recorder, replay_recorder);
#endif
break; break;
} }
case MSG_SWAP_GRAVE_DECK: { case MSG_SWAP_GRAVE_DECK: {
...@@ -888,8 +974,9 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) { ...@@ -888,8 +974,9 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[1]); NetServer::ReSendToPlayer(players[1]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit) for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit) #ifdef YGOPRO_SERVER_MODE
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayers(cache_recorder, replay_recorder);
#endif
RefreshGrave(player); RefreshGrave(player);
break; break;
} }
...@@ -898,8 +985,9 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) { ...@@ -898,8 +985,9 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[1]); NetServer::ReSendToPlayer(players[1]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit) for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit) #ifdef YGOPRO_SERVER_MODE
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayers(cache_recorder, replay_recorder);
#endif
break; break;
} }
case MSG_DECK_TOP: { case MSG_DECK_TOP: {
...@@ -908,8 +996,9 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) { ...@@ -908,8 +996,9 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[1]); NetServer::ReSendToPlayer(players[1]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit) for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit) #ifdef YGOPRO_SERVER_MODE
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayers(cache_recorder, replay_recorder);
#endif
break; break;
} }
case MSG_SHUFFLE_SET_CARD: { case MSG_SHUFFLE_SET_CARD: {
...@@ -919,8 +1008,9 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) { ...@@ -919,8 +1008,9 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[1]); NetServer::ReSendToPlayer(players[1]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit) for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit) #ifdef YGOPRO_SERVER_MODE
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayers(cache_recorder, replay_recorder);
#endif
RefreshMzone(0, 0x181fff, 0); RefreshMzone(0, 0x181fff, 0);
RefreshMzone(1, 0x181fff, 0); RefreshMzone(1, 0x181fff, 0);
break; break;
...@@ -939,8 +1029,9 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) { ...@@ -939,8 +1029,9 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[1]); NetServer::ReSendToPlayer(players[1]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit) for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit) #ifdef YGOPRO_SERVER_MODE
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayers(cache_recorder, replay_recorder);
#endif
break; break;
} }
case MSG_NEW_PHASE: { case MSG_NEW_PHASE: {
...@@ -949,8 +1040,9 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) { ...@@ -949,8 +1040,9 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[1]); NetServer::ReSendToPlayer(players[1]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit) for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit) #ifdef YGOPRO_SERVER_MODE
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayers(cache_recorder, replay_recorder);
#endif
RefreshMzone(0); RefreshMzone(0);
RefreshMzone(1); RefreshMzone(1);
RefreshSzone(0); RefreshSzone(0);
...@@ -976,8 +1068,9 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) { ...@@ -976,8 +1068,9 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::SendBufferToPlayer(players[1 - cc], STOC_GAME_MSG, offset, pbuf - offset); NetServer::SendBufferToPlayer(players[1 - cc], STOC_GAME_MSG, offset, pbuf - offset);
for(auto oit = observers.begin(); oit != observers.end(); ++oit) for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit) #ifdef YGOPRO_SERVER_MODE
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayers(cache_recorder, replay_recorder);
#endif
if (cl != 0 && (cl & 0x80) == 0 && (cl != pl || pc != cc)) if (cl != 0 && (cl & 0x80) == 0 && (cl != pl || pc != cc))
RefreshSingle(cc, cl, cs); RefreshSingle(cc, cl, cs);
break; break;
...@@ -993,8 +1086,9 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) { ...@@ -993,8 +1086,9 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[1]); NetServer::ReSendToPlayer(players[1]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit) for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit) #ifdef YGOPRO_SERVER_MODE
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayers(cache_recorder, replay_recorder);
#endif
if((pp & POS_FACEDOWN) && (cp & POS_FACEUP)) if((pp & POS_FACEDOWN) && (cp & POS_FACEUP))
RefreshSingle(cc, cl, cs); RefreshSingle(cc, cl, cs);
break; break;
...@@ -1006,8 +1100,9 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) { ...@@ -1006,8 +1100,9 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[1]); NetServer::ReSendToPlayer(players[1]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit) for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit) #ifdef YGOPRO_SERVER_MODE
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayers(cache_recorder, replay_recorder);
#endif
break; break;
} }
case MSG_SWAP: { case MSG_SWAP: {
...@@ -1022,8 +1117,9 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) { ...@@ -1022,8 +1117,9 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[1]); NetServer::ReSendToPlayer(players[1]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit) for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit) #ifdef YGOPRO_SERVER_MODE
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayers(cache_recorder, replay_recorder);
#endif
RefreshSingle(c1, l1, s1); RefreshSingle(c1, l1, s1);
RefreshSingle(c2, l2, s2); RefreshSingle(c2, l2, s2);
break; break;
...@@ -1034,8 +1130,9 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) { ...@@ -1034,8 +1130,9 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[1]); NetServer::ReSendToPlayer(players[1]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit) for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit) #ifdef YGOPRO_SERVER_MODE
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayers(cache_recorder, replay_recorder);
#endif
break; break;
} }
case MSG_SUMMONING: { case MSG_SUMMONING: {
...@@ -1044,8 +1141,9 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) { ...@@ -1044,8 +1141,9 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[1]); NetServer::ReSendToPlayer(players[1]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit) for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit) #ifdef YGOPRO_SERVER_MODE
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayers(cache_recorder, replay_recorder);
#endif
break; break;
} }
case MSG_SUMMONED: { case MSG_SUMMONED: {
...@@ -1053,8 +1151,9 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) { ...@@ -1053,8 +1151,9 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[1]); NetServer::ReSendToPlayer(players[1]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit) for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit) #ifdef YGOPRO_SERVER_MODE
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayers(cache_recorder, replay_recorder);
#endif
RefreshMzone(0); RefreshMzone(0);
RefreshMzone(1); RefreshMzone(1);
RefreshSzone(0); RefreshSzone(0);
...@@ -1067,8 +1166,9 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) { ...@@ -1067,8 +1166,9 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[1]); NetServer::ReSendToPlayer(players[1]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit) for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit) #ifdef YGOPRO_SERVER_MODE
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayers(cache_recorder, replay_recorder);
#endif
break; break;
} }
case MSG_SPSUMMONED: { case MSG_SPSUMMONED: {
...@@ -1076,8 +1176,9 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) { ...@@ -1076,8 +1176,9 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[1]); NetServer::ReSendToPlayer(players[1]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit) for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit) #ifdef YGOPRO_SERVER_MODE
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayers(cache_recorder, replay_recorder);
#endif
RefreshMzone(0); RefreshMzone(0);
RefreshMzone(1); RefreshMzone(1);
RefreshSzone(0); RefreshSzone(0);
...@@ -1091,8 +1192,9 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) { ...@@ -1091,8 +1192,9 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[1]); NetServer::ReSendToPlayer(players[1]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit) for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit) #ifdef YGOPRO_SERVER_MODE
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayers(cache_recorder, replay_recorder);
#endif
break; break;
} }
case MSG_FLIPSUMMONED: { case MSG_FLIPSUMMONED: {
...@@ -1100,8 +1202,9 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) { ...@@ -1100,8 +1202,9 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[1]); NetServer::ReSendToPlayer(players[1]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit) for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit) #ifdef YGOPRO_SERVER_MODE
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayers(cache_recorder, replay_recorder);
#endif
RefreshMzone(0); RefreshMzone(0);
RefreshMzone(1); RefreshMzone(1);
RefreshSzone(0); RefreshSzone(0);
...@@ -1114,8 +1217,9 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) { ...@@ -1114,8 +1217,9 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[1]); NetServer::ReSendToPlayer(players[1]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit) for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit) #ifdef YGOPRO_SERVER_MODE
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayers(cache_recorder, replay_recorder);
#endif
break; break;
} }
case MSG_CHAINED: { case MSG_CHAINED: {
...@@ -1124,8 +1228,9 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) { ...@@ -1124,8 +1228,9 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[1]); NetServer::ReSendToPlayer(players[1]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit) for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit) #ifdef YGOPRO_SERVER_MODE
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayers(cache_recorder, replay_recorder);
#endif
RefreshMzone(0); RefreshMzone(0);
RefreshMzone(1); RefreshMzone(1);
RefreshSzone(0); RefreshSzone(0);
...@@ -1140,8 +1245,9 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) { ...@@ -1140,8 +1245,9 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[1]); NetServer::ReSendToPlayer(players[1]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit) for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit) #ifdef YGOPRO_SERVER_MODE
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayers(cache_recorder, replay_recorder);
#endif
break; break;
} }
case MSG_CHAIN_SOLVED: { case MSG_CHAIN_SOLVED: {
...@@ -1150,8 +1256,9 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) { ...@@ -1150,8 +1256,9 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[1]); NetServer::ReSendToPlayer(players[1]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit) for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit) #ifdef YGOPRO_SERVER_MODE
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayers(cache_recorder, replay_recorder);
#endif
RefreshMzone(0); RefreshMzone(0);
RefreshMzone(1); RefreshMzone(1);
RefreshSzone(0); RefreshSzone(0);
...@@ -1165,8 +1272,9 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) { ...@@ -1165,8 +1272,9 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[1]); NetServer::ReSendToPlayer(players[1]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit) for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit) #ifdef YGOPRO_SERVER_MODE
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayers(cache_recorder, replay_recorder);
#endif
RefreshMzone(0); RefreshMzone(0);
RefreshMzone(1); RefreshMzone(1);
RefreshSzone(0); RefreshSzone(0);
...@@ -1181,8 +1289,9 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) { ...@@ -1181,8 +1289,9 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[1]); NetServer::ReSendToPlayer(players[1]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit) for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit) #ifdef YGOPRO_SERVER_MODE
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayers(cache_recorder, replay_recorder);
#endif
break; break;
} }
case MSG_CHAIN_DISABLED: { case MSG_CHAIN_DISABLED: {
...@@ -1191,8 +1300,9 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) { ...@@ -1191,8 +1300,9 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[1]); NetServer::ReSendToPlayer(players[1]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit) for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit) #ifdef YGOPRO_SERVER_MODE
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayers(cache_recorder, replay_recorder);
#endif
break; break;
} }
case MSG_CARD_SELECTED: { case MSG_CARD_SELECTED: {
...@@ -1209,8 +1319,9 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) { ...@@ -1209,8 +1319,9 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[1]); NetServer::ReSendToPlayer(players[1]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit) for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit) #ifdef YGOPRO_SERVER_MODE
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayers(cache_recorder, replay_recorder);
#endif
break; break;
} }
case MSG_BECOME_TARGET: { case MSG_BECOME_TARGET: {
...@@ -1220,8 +1331,9 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) { ...@@ -1220,8 +1331,9 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[1]); NetServer::ReSendToPlayer(players[1]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit) for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit) #ifdef YGOPRO_SERVER_MODE
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayers(cache_recorder, replay_recorder);
#endif
break; break;
} }
case MSG_DRAW: { case MSG_DRAW: {
...@@ -1230,8 +1342,9 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) { ...@@ -1230,8 +1342,9 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) {
pbufw = pbuf; pbufw = pbuf;
pbuf += count * 4; pbuf += count * 4;
NetServer::SendBufferToPlayer(players[player], STOC_GAME_MSG, offset, pbuf - offset); NetServer::SendBufferToPlayer(players[player], STOC_GAME_MSG, offset, pbuf - offset);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit) #ifdef YGOPRO_SERVER_MODE
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayer(replay_recorder);
#endif
for (int i = 0; i < count; ++i) { for (int i = 0; i < count; ++i) {
if(!(pbufw[3] & 0x80)) if(!(pbufw[3] & 0x80))
BufferIO::WriteInt32(pbufw, 0); BufferIO::WriteInt32(pbufw, 0);
...@@ -1241,6 +1354,9 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) { ...@@ -1241,6 +1354,9 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::SendBufferToPlayer(players[1 - player], STOC_GAME_MSG, offset, pbuf - offset); NetServer::SendBufferToPlayer(players[1 - player], STOC_GAME_MSG, offset, pbuf - offset);
for(auto oit = observers.begin(); oit != observers.end(); ++oit) for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayer(*oit);
#ifdef YGOPRO_SERVER_MODE
NetServer::ReSendToPlayer(cache_recorder);
#endif
break; break;
} }
case MSG_DAMAGE: { case MSG_DAMAGE: {
...@@ -1249,8 +1365,9 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) { ...@@ -1249,8 +1365,9 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[1]); NetServer::ReSendToPlayer(players[1]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit) for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit) #ifdef YGOPRO_SERVER_MODE
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayers(cache_recorder, replay_recorder);
#endif
break; break;
} }
case MSG_RECOVER: { case MSG_RECOVER: {
...@@ -1259,8 +1376,9 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) { ...@@ -1259,8 +1376,9 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[1]); NetServer::ReSendToPlayer(players[1]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit) for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit) #ifdef YGOPRO_SERVER_MODE
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayers(cache_recorder, replay_recorder);
#endif
break; break;
} }
case MSG_EQUIP: { case MSG_EQUIP: {
...@@ -1269,8 +1387,9 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) { ...@@ -1269,8 +1387,9 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[1]); NetServer::ReSendToPlayer(players[1]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit) for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit) #ifdef YGOPRO_SERVER_MODE
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayers(cache_recorder, replay_recorder);
#endif
break; break;
} }
case MSG_LPUPDATE: { case MSG_LPUPDATE: {
...@@ -1279,8 +1398,9 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) { ...@@ -1279,8 +1398,9 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[1]); NetServer::ReSendToPlayer(players[1]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit) for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit) #ifdef YGOPRO_SERVER_MODE
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayers(cache_recorder, replay_recorder);
#endif
break; break;
} }
case MSG_UNEQUIP: { case MSG_UNEQUIP: {
...@@ -1289,8 +1409,9 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) { ...@@ -1289,8 +1409,9 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[1]); NetServer::ReSendToPlayer(players[1]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit) for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit) #ifdef YGOPRO_SERVER_MODE
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayers(cache_recorder, replay_recorder);
#endif
break; break;
} }
case MSG_CARD_TARGET: { case MSG_CARD_TARGET: {
...@@ -1299,8 +1420,9 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) { ...@@ -1299,8 +1420,9 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[1]); NetServer::ReSendToPlayer(players[1]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit) for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit) #ifdef YGOPRO_SERVER_MODE
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayers(cache_recorder, replay_recorder);
#endif
break; break;
} }
case MSG_CANCEL_TARGET: { case MSG_CANCEL_TARGET: {
...@@ -1309,8 +1431,9 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) { ...@@ -1309,8 +1431,9 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[1]); NetServer::ReSendToPlayer(players[1]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit) for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit) #ifdef YGOPRO_SERVER_MODE
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayers(cache_recorder, replay_recorder);
#endif
break; break;
} }
case MSG_PAY_LPCOST: { case MSG_PAY_LPCOST: {
...@@ -1319,8 +1442,9 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) { ...@@ -1319,8 +1442,9 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[1]); NetServer::ReSendToPlayer(players[1]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit) for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit) #ifdef YGOPRO_SERVER_MODE
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayers(cache_recorder, replay_recorder);
#endif
break; break;
} }
case MSG_ADD_COUNTER: { case MSG_ADD_COUNTER: {
...@@ -1329,8 +1453,9 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) { ...@@ -1329,8 +1453,9 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[1]); NetServer::ReSendToPlayer(players[1]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit) for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit) #ifdef YGOPRO_SERVER_MODE
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayers(cache_recorder, replay_recorder);
#endif
break; break;
} }
case MSG_REMOVE_COUNTER: { case MSG_REMOVE_COUNTER: {
...@@ -1339,8 +1464,9 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) { ...@@ -1339,8 +1464,9 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[1]); NetServer::ReSendToPlayer(players[1]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit) for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit) #ifdef YGOPRO_SERVER_MODE
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayers(cache_recorder, replay_recorder);
#endif
break; break;
} }
case MSG_ATTACK: { case MSG_ATTACK: {
...@@ -1349,8 +1475,9 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) { ...@@ -1349,8 +1475,9 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[1]); NetServer::ReSendToPlayer(players[1]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit) for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit) #ifdef YGOPRO_SERVER_MODE
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayers(cache_recorder, replay_recorder);
#endif
break; break;
} }
case MSG_BATTLE: { case MSG_BATTLE: {
...@@ -1359,8 +1486,9 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) { ...@@ -1359,8 +1486,9 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[1]); NetServer::ReSendToPlayer(players[1]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit) for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit) #ifdef YGOPRO_SERVER_MODE
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayers(cache_recorder, replay_recorder);
#endif
break; break;
} }
case MSG_ATTACK_DISABLED: { case MSG_ATTACK_DISABLED: {
...@@ -1368,8 +1496,9 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) { ...@@ -1368,8 +1496,9 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[1]); NetServer::ReSendToPlayer(players[1]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit) for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit) #ifdef YGOPRO_SERVER_MODE
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayers(cache_recorder, replay_recorder);
#endif
break; break;
} }
case MSG_DAMAGE_STEP_START: { case MSG_DAMAGE_STEP_START: {
...@@ -1377,8 +1506,9 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) { ...@@ -1377,8 +1506,9 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[1]); NetServer::ReSendToPlayer(players[1]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit) for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit) #ifdef YGOPRO_SERVER_MODE
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayers(cache_recorder, replay_recorder);
#endif
RefreshMzone(0); RefreshMzone(0);
RefreshMzone(1); RefreshMzone(1);
break; break;
...@@ -1388,8 +1518,9 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) { ...@@ -1388,8 +1518,9 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[1]); NetServer::ReSendToPlayer(players[1]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit) for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit) #ifdef YGOPRO_SERVER_MODE
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayers(cache_recorder, replay_recorder);
#endif
RefreshMzone(0); RefreshMzone(0);
RefreshMzone(1); RefreshMzone(1);
break; break;
...@@ -1408,8 +1539,9 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) { ...@@ -1408,8 +1539,9 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[1]); NetServer::ReSendToPlayer(players[1]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit) for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit) #ifdef YGOPRO_SERVER_MODE
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayers(cache_recorder, replay_recorder);
#endif
break; break;
} }
case MSG_TOSS_DICE: { case MSG_TOSS_DICE: {
...@@ -1420,8 +1552,9 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) { ...@@ -1420,8 +1552,9 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[1]); NetServer::ReSendToPlayer(players[1]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit) for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit) #ifdef YGOPRO_SERVER_MODE
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayers(cache_recorder, replay_recorder);
#endif
break; break;
} }
case MSG_ROCK_PAPER_SCISSORS: { case MSG_ROCK_PAPER_SCISSORS: {
...@@ -1474,8 +1607,9 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) { ...@@ -1474,8 +1607,9 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[1]); NetServer::ReSendToPlayer(players[1]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit) for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit) #ifdef YGOPRO_SERVER_MODE
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayers(cache_recorder, replay_recorder);
#endif
break; break;
} }
case MSG_PLAYER_HINT: { case MSG_PLAYER_HINT: {
...@@ -1494,8 +1628,9 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) { ...@@ -1494,8 +1628,9 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[1]); NetServer::ReSendToPlayer(players[1]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit) for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit) #ifdef YGOPRO_SERVER_MODE
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayers(cache_recorder, replay_recorder);
#endif
} }
break; break;
} }
...@@ -1528,12 +1663,16 @@ void SingleDuel::EndDuel() { ...@@ -1528,12 +1663,16 @@ void SingleDuel::EndDuel() {
memcpy(pbuf, last_replay.comp_data, last_replay.comp_size); memcpy(pbuf, last_replay.comp_data, last_replay.comp_size);
NetServer::SendBufferToPlayer(players[0], STOC_REPLAY, replaybuf, sizeof(ReplayHeader) + last_replay.comp_size); NetServer::SendBufferToPlayer(players[0], STOC_REPLAY, replaybuf, sizeof(ReplayHeader) + last_replay.comp_size);
NetServer::ReSendToPlayer(players[1]); NetServer::ReSendToPlayer(players[1]);
if (ygo::replay_mode == 0) { #ifdef YGOPRO_SERVER_MODE
if(ygo::replay_mode == 0) {
for(auto oit = observers.begin(); oit != observers.end(); ++oit) for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit) NetServer::ReSendToPlayers(cache_recorder, replay_recorder);
NetServer::ReSendToPlayer(*oit);
} }
#else
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
#endif //YGOPRO_SERVER_MODE
end_duel(pduel); end_duel(pduel);
pduel = 0; pduel = 0;
} }
...@@ -1569,8 +1708,9 @@ void SingleDuel::RefreshMzone(int player, int flag, int use_cache) { ...@@ -1569,8 +1708,9 @@ void SingleDuel::RefreshMzone(int player, int flag, int use_cache) {
BufferIO::WriteInt8(qbuf, LOCATION_MZONE); BufferIO::WriteInt8(qbuf, LOCATION_MZONE);
int len = query_field_card(pduel, player, LOCATION_MZONE, flag, (unsigned char*)qbuf, use_cache); int len = query_field_card(pduel, player, LOCATION_MZONE, flag, (unsigned char*)qbuf, use_cache);
NetServer::SendBufferToPlayer(players[player], STOC_GAME_MSG, query_buffer, len + 3); NetServer::SendBufferToPlayer(players[player], STOC_GAME_MSG, query_buffer, len + 3);
for(auto pit = recorders.begin(); pit != recorders.end(); ++pit) #ifdef YGOPRO_SERVER_MODE
NetServer::ReSendToPlayer(*pit); NetServer::ReSendToPlayer(replay_recorder);
#endif
for (int i = 0; i < 5; ++i) { for (int i = 0; i < 5; ++i) {
int clen = BufferIO::ReadInt32(qbuf); int clen = BufferIO::ReadInt32(qbuf);
if (clen == 4) if (clen == 4)
...@@ -1582,6 +1722,9 @@ void SingleDuel::RefreshMzone(int player, int flag, int use_cache) { ...@@ -1582,6 +1722,9 @@ void SingleDuel::RefreshMzone(int player, int flag, int use_cache) {
NetServer::SendBufferToPlayer(players[1 - player], STOC_GAME_MSG, query_buffer, len + 3); NetServer::SendBufferToPlayer(players[1 - player], STOC_GAME_MSG, query_buffer, len + 3);
for(auto pit = observers.begin(); pit != observers.end(); ++pit) for(auto pit = observers.begin(); pit != observers.end(); ++pit)
NetServer::ReSendToPlayer(*pit); NetServer::ReSendToPlayer(*pit);
#ifdef YGOPRO_SERVER_MODE
NetServer::ReSendToPlayer(cache_recorder);
#endif
} }
void SingleDuel::RefreshSzone(int player, int flag, int use_cache) { void SingleDuel::RefreshSzone(int player, int flag, int use_cache) {
char query_buffer[0x2000]; char query_buffer[0x2000];
...@@ -1591,8 +1734,9 @@ void SingleDuel::RefreshSzone(int player, int flag, int use_cache) { ...@@ -1591,8 +1734,9 @@ void SingleDuel::RefreshSzone(int player, int flag, int use_cache) {
BufferIO::WriteInt8(qbuf, LOCATION_SZONE); BufferIO::WriteInt8(qbuf, LOCATION_SZONE);
int len = query_field_card(pduel, player, LOCATION_SZONE, flag, (unsigned char*)qbuf, use_cache); int len = query_field_card(pduel, player, LOCATION_SZONE, flag, (unsigned char*)qbuf, use_cache);
NetServer::SendBufferToPlayer(players[player], STOC_GAME_MSG, query_buffer, len + 3); NetServer::SendBufferToPlayer(players[player], STOC_GAME_MSG, query_buffer, len + 3);
for(auto pit = recorders.begin(); pit != recorders.end(); ++pit) #ifdef YGOPRO_SERVER_MODE
NetServer::ReSendToPlayer(*pit); NetServer::ReSendToPlayer(replay_recorder);
#endif
for (int i = 0; i < 8; ++i) { for (int i = 0; i < 8; ++i) {
int clen = BufferIO::ReadInt32(qbuf); int clen = BufferIO::ReadInt32(qbuf);
if (clen == 4) if (clen == 4)
...@@ -1604,6 +1748,9 @@ void SingleDuel::RefreshSzone(int player, int flag, int use_cache) { ...@@ -1604,6 +1748,9 @@ void SingleDuel::RefreshSzone(int player, int flag, int use_cache) {
NetServer::SendBufferToPlayer(players[1 - player], STOC_GAME_MSG, query_buffer, len + 3); NetServer::SendBufferToPlayer(players[1 - player], STOC_GAME_MSG, query_buffer, len + 3);
for(auto pit = observers.begin(); pit != observers.end(); ++pit) for(auto pit = observers.begin(); pit != observers.end(); ++pit)
NetServer::ReSendToPlayer(*pit); NetServer::ReSendToPlayer(*pit);
#ifdef YGOPRO_SERVER_MODE
NetServer::ReSendToPlayer(cache_recorder);
#endif
} }
void SingleDuel::RefreshHand(int player, int flag, int use_cache) { void SingleDuel::RefreshHand(int player, int flag, int use_cache) {
char query_buffer[0x2000]; char query_buffer[0x2000];
...@@ -1613,8 +1760,9 @@ void SingleDuel::RefreshHand(int player, int flag, int use_cache) { ...@@ -1613,8 +1760,9 @@ void SingleDuel::RefreshHand(int player, int flag, int use_cache) {
BufferIO::WriteInt8(qbuf, LOCATION_HAND); BufferIO::WriteInt8(qbuf, LOCATION_HAND);
int len = query_field_card(pduel, player, LOCATION_HAND, flag | QUERY_IS_PUBLIC, (unsigned char*)qbuf, use_cache); int len = query_field_card(pduel, player, LOCATION_HAND, flag | QUERY_IS_PUBLIC, (unsigned char*)qbuf, use_cache);
NetServer::SendBufferToPlayer(players[player], STOC_GAME_MSG, query_buffer, len + 3); NetServer::SendBufferToPlayer(players[player], STOC_GAME_MSG, query_buffer, len + 3);
for(auto pit = recorders.begin(); pit != recorders.end(); ++pit) #ifdef YGOPRO_SERVER_MODE
NetServer::ReSendToPlayer(*pit); NetServer::ReSendToPlayer(replay_recorder);
#endif
int qlen = 0, slen; int qlen = 0, slen;
while(qlen < len) { while(qlen < len) {
slen = BufferIO::ReadInt32(qbuf); slen = BufferIO::ReadInt32(qbuf);
...@@ -1632,6 +1780,9 @@ void SingleDuel::RefreshHand(int player, int flag, int use_cache) { ...@@ -1632,6 +1780,9 @@ void SingleDuel::RefreshHand(int player, int flag, int use_cache) {
NetServer::SendBufferToPlayer(players[1 - player], STOC_GAME_MSG, query_buffer, len + 3); NetServer::SendBufferToPlayer(players[1 - player], STOC_GAME_MSG, query_buffer, len + 3);
for(auto pit = observers.begin(); pit != observers.end(); ++pit) for(auto pit = observers.begin(); pit != observers.end(); ++pit)
NetServer::ReSendToPlayer(*pit); NetServer::ReSendToPlayer(*pit);
#ifdef YGOPRO_SERVER_MODE
NetServer::ReSendToPlayer(cache_recorder);
#endif
} }
void SingleDuel::RefreshGrave(int player, int flag, int use_cache) { void SingleDuel::RefreshGrave(int player, int flag, int use_cache) {
char query_buffer[0x2000]; char query_buffer[0x2000];
...@@ -1644,6 +1795,9 @@ void SingleDuel::RefreshGrave(int player, int flag, int use_cache) { ...@@ -1644,6 +1795,9 @@ void SingleDuel::RefreshGrave(int player, int flag, int use_cache) {
NetServer::ReSendToPlayer(players[1]); NetServer::ReSendToPlayer(players[1]);
for(auto pit = observers.begin(); pit != observers.end(); ++pit) for(auto pit = observers.begin(); pit != observers.end(); ++pit)
NetServer::ReSendToPlayer(*pit); NetServer::ReSendToPlayer(*pit);
#ifdef YGOPRO_SERVER_MODE
NetServer::ReSendToPlayers(cache_recorder, replay_recorder);
#endif
} }
void SingleDuel::RefreshExtra(int player, int flag, int use_cache) { void SingleDuel::RefreshExtra(int player, int flag, int use_cache) {
char query_buffer[0x2000]; char query_buffer[0x2000];
...@@ -1669,8 +1823,9 @@ void SingleDuel::RefreshSingle(int player, int location, int sequence, int flag) ...@@ -1669,8 +1823,9 @@ void SingleDuel::RefreshSingle(int player, int location, int sequence, int flag)
NetServer::ReSendToPlayer(players[1 - player]); NetServer::ReSendToPlayer(players[1 - player]);
for(auto pit = observers.begin(); pit != observers.end(); ++pit) for(auto pit = observers.begin(); pit != observers.end(); ++pit)
NetServer::ReSendToPlayer(*pit); NetServer::ReSendToPlayer(*pit);
for(auto pit = recorders.begin(); pit != recorders.end(); ++pit) #ifdef YGOPRO_SERVER_MODE
NetServer::ReSendToPlayer(*pit); NetServer::ReSendToPlayers(cache_recorder, replay_recorder);
#endif
} }
} }
int SingleDuel::MessageHandler(long fduel, int type) { int SingleDuel::MessageHandler(long fduel, int type) {
...@@ -1694,8 +1849,9 @@ void SingleDuel::SingleTimer(evutil_socket_t fd, short events, void* arg) { ...@@ -1694,8 +1849,9 @@ void SingleDuel::SingleTimer(evutil_socket_t fd, short events, void* arg) {
NetServer::ReSendToPlayer(sd->players[1]); NetServer::ReSendToPlayer(sd->players[1]);
for(auto oit = sd->observers.begin(); oit != sd->observers.end(); ++oit) for(auto oit = sd->observers.begin(); oit != sd->observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayer(*oit);
for(auto oit = sd->recorders.begin(); oit != sd->recorders.end(); ++oit) #ifdef YGOPRO_SERVER_MODE
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayers(sd->cache_recorder, sd->replay_recorder);
#endif
if(sd->players[player] == sd->pplayer[player]) { if(sd->players[player] == sd->pplayer[player]) {
sd->match_result[sd->duel_count++] = 1 - player; sd->match_result[sd->duel_count++] = 1 - player;
sd->tp_player = player; sd->tp_player = player;
......
...@@ -50,8 +50,9 @@ protected: ...@@ -50,8 +50,9 @@ protected:
unsigned char last_response; unsigned char last_response;
std::set<DuelPlayer*> observers; std::set<DuelPlayer*> observers;
#ifdef YGOPRO_SERVER_MODE #ifdef YGOPRO_SERVER_MODE
std::set<DuelPlayer*> recorders; DuelPlayer* cache_recorder;
#endif //YGOPRO_SERVER_MODE DuelPlayer* replay_recorder;
#endif
Replay last_replay; Replay last_replay;
bool match_mode; bool match_mode;
int match_kill; int match_kill;
......
...@@ -9,14 +9,19 @@ ...@@ -9,14 +9,19 @@
namespace ygo { namespace ygo {
#ifdef YGOPRO_SERVER_MODE
extern unsigned short replay_mode; extern unsigned short replay_mode;
#endif
TagDuel::TagDuel() { TagDuel::TagDuel() {
game_started = false; game_started = false;
for(int i = 0; i < 4; ++i) { for(int i = 0; i < 4; ++i) {
players[i] = 0; players[i] = 0;
ready[i] = false; ready[i] = false;
} }
#ifdef YGOPRO_SERVER_MODE
cache_recorder = 0;
replay_recorder = 0;
#endif
} }
TagDuel::~TagDuel() { TagDuel::~TagDuel() {
} }
...@@ -30,6 +35,9 @@ void TagDuel::Chat(DuelPlayer* dp, void* pdata, int len) { ...@@ -30,6 +35,9 @@ void TagDuel::Chat(DuelPlayer* dp, void* pdata, int len) {
NetServer::SendBufferToPlayer(players[i], STOC_CHAT, &scc, 4 + msglen * 2); NetServer::SendBufferToPlayer(players[i], STOC_CHAT, &scc, 4 + msglen * 2);
} }
void TagDuel::JoinGame(DuelPlayer* dp, void* pdata, bool is_creater) { void TagDuel::JoinGame(DuelPlayer* dp, void* pdata, bool is_creater) {
#ifdef YGOPRO_SERVER_MODE
bool is_recorder = false;
#endif
if(!is_creater) { if(!is_creater) {
if(dp->game && dp->type != 0xff) { if(dp->game && dp->type != 0xff) {
STOC_ErrorMsg scem; STOC_ErrorMsg scem;
...@@ -48,11 +56,18 @@ void TagDuel::JoinGame(DuelPlayer* dp, void* pdata, bool is_creater) { ...@@ -48,11 +56,18 @@ void TagDuel::JoinGame(DuelPlayer* dp, void* pdata, bool is_creater) {
NetServer::DisconnectPlayer(dp); NetServer::DisconnectPlayer(dp);
return; return;
} }
#ifdef YGOPRO_SERVER_MODE
#else
wchar_t jpass[20]; wchar_t jpass[20];
BufferIO::CopyWStr(pkt->pass, jpass, 20); BufferIO::CopyWStr(pkt->pass, jpass, 20);
#ifdef YGOPRO_SERVER_MODE
if(!wcscmp(jpass, L"the Big Brother") && !cache_recorder) {
is_recorder = true;
cache_recorder = dp;
}
if(!wcscmp(jpass, L"Marshtomp") && !replay_recorder) {
is_recorder = true;
replay_recorder = dp;
}
#else
if(wcscmp(jpass, pass)) { if(wcscmp(jpass, pass)) {
STOC_ErrorMsg scem; STOC_ErrorMsg scem;
scem.msg = ERRMSG_JOINERROR; scem.msg = ERRMSG_JOINERROR;
...@@ -69,6 +84,13 @@ void TagDuel::JoinGame(DuelPlayer* dp, void* pdata, bool is_creater) { ...@@ -69,6 +84,13 @@ void TagDuel::JoinGame(DuelPlayer* dp, void* pdata, bool is_creater) {
scjg.info = host_info; scjg.info = host_info;
STOC_TypeChange sctc; STOC_TypeChange sctc;
sctc.type = (host_player == dp) ? 0x10 : 0; sctc.type = (host_player == dp) ? 0x10 : 0;
#ifdef YGOPRO_SERVER_MODE
if(is_recorder) {
dp->type = 9;
sctc.type = NETPLAYER_TYPE_OBSERVER;
}
else
#endif //YGOPRO_SERVER_MODE
if(!players[0] || !players[1] || !players[2] || !players[3]) { if(!players[0] || !players[1] || !players[2] || !players[3]) {
STOC_HS_PlayerEnter scpe; STOC_HS_PlayerEnter scpe;
BufferIO::CopyWStr(dp->name, scpe.name, 20); BufferIO::CopyWStr(dp->name, scpe.name, 20);
...@@ -85,8 +107,12 @@ void TagDuel::JoinGame(DuelPlayer* dp, void* pdata, bool is_creater) { ...@@ -85,8 +107,12 @@ void TagDuel::JoinGame(DuelPlayer* dp, void* pdata, bool is_creater) {
NetServer::SendPacketToPlayer(players[i], STOC_HS_PLAYER_ENTER, scpe); NetServer::SendPacketToPlayer(players[i], STOC_HS_PLAYER_ENTER, scpe);
for(auto pit = observers.begin(); pit != observers.end(); ++pit) for(auto pit = observers.begin(); pit != observers.end(); ++pit)
NetServer::SendPacketToPlayer(*pit, STOC_HS_PLAYER_ENTER, scpe); NetServer::SendPacketToPlayer(*pit, STOC_HS_PLAYER_ENTER, scpe);
for(auto pit = recorders.begin(); pit != recorders.end(); ++pit) #ifdef YGOPRO_SERVER_MODE
NetServer::SendPacketToPlayer(*pit, STOC_HS_PLAYER_ENTER, scpe); if(cache_recorder)
NetServer::SendPacketToPlayer(cache_recorder, STOC_HS_PLAYER_ENTER, scpe);
if(replay_recorder)
NetServer::SendPacketToPlayer(replay_recorder, STOC_HS_PLAYER_ENTER, scpe);
#endif
players[scpe.pos] = dp; players[scpe.pos] = dp;
dp->type = scpe.pos; dp->type = scpe.pos;
sctc.type |= scpe.pos; sctc.type |= scpe.pos;
...@@ -101,8 +127,12 @@ void TagDuel::JoinGame(DuelPlayer* dp, void* pdata, bool is_creater) { ...@@ -101,8 +127,12 @@ void TagDuel::JoinGame(DuelPlayer* dp, void* pdata, bool is_creater) {
NetServer::SendPacketToPlayer(players[i], STOC_HS_WATCH_CHANGE, scwc); NetServer::SendPacketToPlayer(players[i], STOC_HS_WATCH_CHANGE, scwc);
for(auto pit = observers.begin(); pit != observers.end(); ++pit) for(auto pit = observers.begin(); pit != observers.end(); ++pit)
NetServer::SendPacketToPlayer(*pit, STOC_HS_WATCH_CHANGE, scwc); NetServer::SendPacketToPlayer(*pit, STOC_HS_WATCH_CHANGE, scwc);
for(auto pit = recorders.begin(); pit != recorders.end(); ++pit) #ifdef YGOPRO_SERVER_MODE
NetServer::SendPacketToPlayer(*pit, STOC_HS_WATCH_CHANGE, scwc); if(cache_recorder)
NetServer::SendPacketToPlayer(cache_recorder, STOC_HS_WATCH_CHANGE, scwc);
if(replay_recorder)
NetServer::SendPacketToPlayer(replay_recorder, STOC_HS_WATCH_CHANGE, scwc);
#endif
} }
NetServer::SendPacketToPlayer(dp, STOC_JOIN_GAME, scjg); NetServer::SendPacketToPlayer(dp, STOC_JOIN_GAME, scjg);
NetServer::SendPacketToPlayer(dp, STOC_TYPE_CHANGE, sctc); NetServer::SendPacketToPlayer(dp, STOC_TYPE_CHANGE, sctc);
...@@ -126,6 +156,7 @@ void TagDuel::JoinGame(DuelPlayer* dp, void* pdata, bool is_creater) { ...@@ -126,6 +156,7 @@ void TagDuel::JoinGame(DuelPlayer* dp, void* pdata, bool is_creater) {
} }
void TagDuel::LeaveGame(DuelPlayer* dp) { void TagDuel::LeaveGame(DuelPlayer* dp) {
if(dp == host_player) { if(dp == host_player) {
#ifdef YGOPRO_SERVER_MODE
int host_pos; int host_pos;
if(players[0] && dp->type != 0) { if(players[0] && dp->type != 0) {
host_pos = 0; host_pos = 0;
...@@ -150,6 +181,11 @@ void TagDuel::LeaveGame(DuelPlayer* dp) { ...@@ -150,6 +181,11 @@ void TagDuel::LeaveGame(DuelPlayer* dp) {
NetServer::SendPacketToPlayer(players[host_pos], STOC_TYPE_CHANGE, sctc); NetServer::SendPacketToPlayer(players[host_pos], STOC_TYPE_CHANGE, sctc);
} }
if(dp->type == NETPLAYER_TYPE_OBSERVER) { if(dp->type == NETPLAYER_TYPE_OBSERVER) {
#else
EndDuel();
NetServer::StopServer();
} else if(dp->type == NETPLAYER_TYPE_OBSERVER) {
#endif //YGOPRO_SERVER_MODE
observers.erase(dp); observers.erase(dp);
if(!game_started) { if(!game_started) {
STOC_HS_WatchChange scwc; STOC_HS_WatchChange scwc;
...@@ -159,8 +195,12 @@ void TagDuel::LeaveGame(DuelPlayer* dp) { ...@@ -159,8 +195,12 @@ void TagDuel::LeaveGame(DuelPlayer* dp) {
NetServer::SendPacketToPlayer(players[i], STOC_HS_WATCH_CHANGE, scwc); NetServer::SendPacketToPlayer(players[i], STOC_HS_WATCH_CHANGE, scwc);
for(auto pit = observers.begin(); pit != observers.end(); ++pit) for(auto pit = observers.begin(); pit != observers.end(); ++pit)
NetServer::SendPacketToPlayer(*pit, STOC_HS_WATCH_CHANGE, scwc); NetServer::SendPacketToPlayer(*pit, STOC_HS_WATCH_CHANGE, scwc);
for(auto pit = recorders.begin(); pit != recorders.end(); ++pit) #ifdef YGOPRO_SERVER_MODE
NetServer::SendPacketToPlayer(*pit, STOC_HS_WATCH_CHANGE, scwc); if(cache_recorder)
NetServer::SendPacketToPlayer(cache_recorder, STOC_HS_WATCH_CHANGE, scwc);
if(replay_recorder)
NetServer::SendPacketToPlayer(replay_recorder, STOC_HS_WATCH_CHANGE, scwc);
#endif
} }
NetServer::DisconnectPlayer(dp); NetServer::DisconnectPlayer(dp);
} else { } else {
...@@ -174,8 +214,12 @@ void TagDuel::LeaveGame(DuelPlayer* dp) { ...@@ -174,8 +214,12 @@ void TagDuel::LeaveGame(DuelPlayer* dp) {
NetServer::SendPacketToPlayer(players[i], STOC_HS_PLAYER_CHANGE, scpc); NetServer::SendPacketToPlayer(players[i], STOC_HS_PLAYER_CHANGE, scpc);
for(auto pit = observers.begin(); pit != observers.end(); ++pit) for(auto pit = observers.begin(); pit != observers.end(); ++pit)
NetServer::SendPacketToPlayer(*pit, STOC_HS_PLAYER_CHANGE, scpc); NetServer::SendPacketToPlayer(*pit, STOC_HS_PLAYER_CHANGE, scpc);
for(auto pit = recorders.begin(); pit != recorders.end(); ++pit) #ifdef YGOPRO_SERVER_MODE
NetServer::SendPacketToPlayer(*pit, STOC_HS_PLAYER_CHANGE, scpc); if(cache_recorder)
NetServer::SendPacketToPlayer(cache_recorder, STOC_HS_PLAYER_CHANGE, scpc);
if(replay_recorder)
NetServer::SendPacketToPlayer(replay_recorder, STOC_HS_PLAYER_CHANGE, scpc);
#endif
NetServer::DisconnectPlayer(dp); NetServer::DisconnectPlayer(dp);
} else { } else {
EndDuel(); EndDuel();
...@@ -211,10 +255,16 @@ void TagDuel::ToDuelist(DuelPlayer* dp) { ...@@ -211,10 +255,16 @@ void TagDuel::ToDuelist(DuelPlayer* dp) {
NetServer::SendPacketToPlayer(*pit, STOC_HS_PLAYER_ENTER, scpe); NetServer::SendPacketToPlayer(*pit, STOC_HS_PLAYER_ENTER, scpe);
NetServer::SendPacketToPlayer(*pit, STOC_HS_WATCH_CHANGE, scwc); NetServer::SendPacketToPlayer(*pit, STOC_HS_WATCH_CHANGE, scwc);
} }
for(auto pit = recorders.begin(); pit != recorders.end(); ++pit) { #ifdef YGOPRO_SERVER_MODE
NetServer::SendPacketToPlayer(*pit, STOC_HS_PLAYER_ENTER, scpe); if(cache_recorder) {
NetServer::SendPacketToPlayer(*pit, STOC_HS_WATCH_CHANGE, scwc); NetServer::SendPacketToPlayer(cache_recorder, STOC_HS_PLAYER_ENTER, scpe);
NetServer::SendPacketToPlayer(cache_recorder, STOC_HS_WATCH_CHANGE, scwc);
}
if(replay_recorder) {
NetServer::SendPacketToPlayer(replay_recorder, STOC_HS_PLAYER_ENTER, scpe);
NetServer::SendPacketToPlayer(replay_recorder, STOC_HS_WATCH_CHANGE, scwc);
} }
#endif
STOC_TypeChange sctc; STOC_TypeChange sctc;
sctc.type = (dp == host_player ? 0x10 : 0) | dp->type; sctc.type = (dp == host_player ? 0x10 : 0) | dp->type;
NetServer::SendPacketToPlayer(dp, STOC_TYPE_CHANGE, sctc); NetServer::SendPacketToPlayer(dp, STOC_TYPE_CHANGE, sctc);
...@@ -231,8 +281,12 @@ void TagDuel::ToDuelist(DuelPlayer* dp) { ...@@ -231,8 +281,12 @@ void TagDuel::ToDuelist(DuelPlayer* dp) {
NetServer::SendPacketToPlayer(players[i], STOC_HS_PLAYER_CHANGE, scpc); NetServer::SendPacketToPlayer(players[i], STOC_HS_PLAYER_CHANGE, scpc);
for(auto pit = observers.begin(); pit != observers.end(); ++pit) for(auto pit = observers.begin(); pit != observers.end(); ++pit)
NetServer::SendPacketToPlayer(*pit, STOC_HS_PLAYER_CHANGE, scpc); NetServer::SendPacketToPlayer(*pit, STOC_HS_PLAYER_CHANGE, scpc);
for(auto pit = recorders.begin(); pit != recorders.end(); ++pit) #ifdef YGOPRO_SERVER_MODE
NetServer::SendPacketToPlayer(*pit, STOC_HS_PLAYER_CHANGE, scpc); if(cache_recorder)
NetServer::SendPacketToPlayer(cache_recorder, STOC_HS_PLAYER_CHANGE, scpc);
if(replay_recorder)
NetServer::SendPacketToPlayer(replay_recorder, STOC_HS_PLAYER_CHANGE, scpc);
#endif
STOC_TypeChange sctc; STOC_TypeChange sctc;
sctc.type = (dp == host_player ? 0x10 : 0) | dptype; sctc.type = (dp == host_player ? 0x10 : 0) | dptype;
NetServer::SendPacketToPlayer(dp, STOC_TYPE_CHANGE, sctc); NetServer::SendPacketToPlayer(dp, STOC_TYPE_CHANGE, sctc);
...@@ -251,14 +305,15 @@ void TagDuel::ToObserver(DuelPlayer* dp) { ...@@ -251,14 +305,15 @@ void TagDuel::ToObserver(DuelPlayer* dp) {
NetServer::SendPacketToPlayer(players[i], STOC_HS_PLAYER_CHANGE, scpc); NetServer::SendPacketToPlayer(players[i], STOC_HS_PLAYER_CHANGE, scpc);
for(auto pit = observers.begin(); pit != observers.end(); ++pit) for(auto pit = observers.begin(); pit != observers.end(); ++pit)
NetServer::SendPacketToPlayer(*pit, STOC_HS_PLAYER_CHANGE, scpc); NetServer::SendPacketToPlayer(*pit, STOC_HS_PLAYER_CHANGE, scpc);
for(auto pit = recorders.begin(); pit != recorders.end(); ++pit) #ifdef YGOPRO_SERVER_MODE
NetServer::SendPacketToPlayer(*pit, STOC_HS_PLAYER_CHANGE, scpc); if(cache_recorder)
NetServer::SendPacketToPlayer(cache_recorder, STOC_HS_PLAYER_CHANGE, scpc);
if(replay_recorder)
NetServer::SendPacketToPlayer(replay_recorder, STOC_HS_PLAYER_CHANGE, scpc);
#endif
players[dp->type] = 0; players[dp->type] = 0;
ready[dp->type] = false; ready[dp->type] = false;
dp->type = NETPLAYER_TYPE_OBSERVER; dp->type = NETPLAYER_TYPE_OBSERVER;
if (recorders.size()==0 && dp->name[0] == 77)
recorders.insert(dp);
else
observers.insert(dp); observers.insert(dp);
STOC_TypeChange sctc; STOC_TypeChange sctc;
sctc.type = (dp == host_player ? 0x10 : 0) | dp->type; sctc.type = (dp == host_player ? 0x10 : 0) | dp->type;
...@@ -290,8 +345,12 @@ void TagDuel::PlayerReady(DuelPlayer* dp, bool is_ready) { ...@@ -290,8 +345,12 @@ void TagDuel::PlayerReady(DuelPlayer* dp, bool is_ready) {
NetServer::SendPacketToPlayer(players[i], STOC_HS_PLAYER_CHANGE, scpc); NetServer::SendPacketToPlayer(players[i], STOC_HS_PLAYER_CHANGE, scpc);
for(auto pit = observers.begin(); pit != observers.end(); ++pit) for(auto pit = observers.begin(); pit != observers.end(); ++pit)
NetServer::SendPacketToPlayer(*pit, STOC_HS_PLAYER_CHANGE, scpc); NetServer::SendPacketToPlayer(*pit, STOC_HS_PLAYER_CHANGE, scpc);
for(auto pit = recorders.begin(); pit != recorders.end(); ++pit) #ifdef YGOPRO_SERVER_MODE
NetServer::SendPacketToPlayer(*pit, STOC_HS_PLAYER_CHANGE, scpc); if(cache_recorder)
NetServer::SendPacketToPlayer(cache_recorder, STOC_HS_PLAYER_CHANGE, scpc);
if(replay_recorder)
NetServer::SendPacketToPlayer(replay_recorder, STOC_HS_PLAYER_CHANGE, scpc);
#endif
} }
void TagDuel::PlayerKick(DuelPlayer* dp, unsigned char pos) { void TagDuel::PlayerKick(DuelPlayer* dp, unsigned char pos) {
if(pos > 3 || dp != host_player || dp == players[pos] || !players[pos]) if(pos > 3 || dp != host_player || dp == players[pos] || !players[pos])
...@@ -320,10 +379,13 @@ void TagDuel::StartDuel(DuelPlayer* dp) { ...@@ -320,10 +379,13 @@ void TagDuel::StartDuel(DuelPlayer* dp) {
(*oit)->state = CTOS_LEAVE_GAME; (*oit)->state = CTOS_LEAVE_GAME;
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayer(*oit);
} }
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit) { #ifdef YGOPRO_SERVER_MODE
(*oit)->state = CTOS_LEAVE_GAME; if(cache_recorder)
NetServer::ReSendToPlayer(*oit); cache_recorder->state = CTOS_LEAVE_GAME;
} if(replay_recorder)
replay_recorder->state = CTOS_LEAVE_GAME;
NetServer::ReSendToPlayers(cache_recorder, replay_recorder);
#endif
NetServer::SendPacketToPlayer(players[0], STOC_SELECT_HAND); NetServer::SendPacketToPlayer(players[0], STOC_SELECT_HAND);
NetServer::ReSendToPlayer(players[2]); NetServer::ReSendToPlayer(players[2]);
hand_result[0] = 0; hand_result[0] = 0;
...@@ -346,8 +408,9 @@ void TagDuel::HandResult(DuelPlayer* dp, unsigned char res) { ...@@ -346,8 +408,9 @@ void TagDuel::HandResult(DuelPlayer* dp, unsigned char res) {
NetServer::ReSendToPlayer(players[1]); NetServer::ReSendToPlayer(players[1]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit) for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit) #ifdef YGOPRO_SERVER_MODE
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayers(cache_recorder, replay_recorder);
#endif
schr.res1 = hand_result[1]; schr.res1 = hand_result[1];
schr.res2 = hand_result[0]; schr.res2 = hand_result[0];
NetServer::SendPacketToPlayer(players[2], STOC_HAND_RESULT, schr); NetServer::SendPacketToPlayer(players[2], STOC_HAND_RESULT, schr);
...@@ -509,8 +572,12 @@ void TagDuel::TPResult(DuelPlayer* dp, unsigned char tp) { ...@@ -509,8 +572,12 @@ void TagDuel::TPResult(DuelPlayer* dp, unsigned char tp) {
else startbuf[1] = 0x11; else startbuf[1] = 0x11;
for(auto oit = observers.begin(); oit != observers.end(); ++oit) for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::SendBufferToPlayer(*oit, STOC_GAME_MSG, startbuf, 18); NetServer::SendBufferToPlayer(*oit, STOC_GAME_MSG, startbuf, 18);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit) #ifdef YGOPRO_SERVER_MODE
NetServer::SendBufferToPlayer(*oit, STOC_GAME_MSG, startbuf, 18); if(cache_recorder)
NetServer::SendBufferToPlayer(cache_recorder, STOC_GAME_MSG, startbuf, 18);
if(replay_recorder)
NetServer::SendBufferToPlayer(replay_recorder, STOC_GAME_MSG, startbuf, 18);
#endif
RefreshExtra(0); RefreshExtra(0);
RefreshExtra(1); RefreshExtra(1);
start_duel(pduel, opt); start_duel(pduel, opt);
...@@ -541,8 +608,9 @@ void TagDuel::DuelEndProc() { ...@@ -541,8 +608,9 @@ void TagDuel::DuelEndProc() {
NetServer::ReSendToPlayer(players[3]); NetServer::ReSendToPlayer(players[3]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit) for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit) #ifdef YGOPRO_SERVER_MODE
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayers(cache_recorder, replay_recorder);
#endif
NetServer::StopServer(); NetServer::StopServer();
} }
void TagDuel::Surrender(DuelPlayer* dp) { void TagDuel::Surrender(DuelPlayer* dp) {
...@@ -583,8 +651,9 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) { ...@@ -583,8 +651,9 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::SendBufferToPlayer(players[i], STOC_GAME_MSG, offset, pbuf - offset); NetServer::SendBufferToPlayer(players[i], STOC_GAME_MSG, offset, pbuf - offset);
for(auto oit = observers.begin(); oit != observers.end(); ++oit) for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit) #ifdef YGOPRO_SERVER_MODE
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayers(cache_recorder, replay_recorder);
#endif
break; break;
} }
} }
...@@ -599,8 +668,9 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) { ...@@ -599,8 +668,9 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[3]); NetServer::ReSendToPlayer(players[3]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit) for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit) #ifdef YGOPRO_SERVER_MODE
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayers(cache_recorder, replay_recorder);
#endif
EndDuel(); EndDuel();
return 2; return 2;
} }
...@@ -748,8 +818,9 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) { ...@@ -748,8 +818,9 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[3]); NetServer::ReSendToPlayer(players[3]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit) for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit) #ifdef YGOPRO_SERVER_MODE
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayers(cache_recorder, replay_recorder);
#endif
break; break;
} }
case MSG_CONFIRM_CARDS: { case MSG_CONFIRM_CARDS: {
...@@ -763,8 +834,9 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) { ...@@ -763,8 +834,9 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[3]); NetServer::ReSendToPlayer(players[3]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit) for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit) #ifdef YGOPRO_SERVER_MODE
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayers(cache_recorder, replay_recorder);
#endif
} else { } else {
pbuf += count * 7; pbuf += count * 7;
NetServer::SendBufferToPlayer(cur_player[player], STOC_GAME_MSG, offset, pbuf - offset); NetServer::SendBufferToPlayer(cur_player[player], STOC_GAME_MSG, offset, pbuf - offset);
...@@ -779,16 +851,18 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) { ...@@ -779,16 +851,18 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[3]); NetServer::ReSendToPlayer(players[3]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit) for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit) #ifdef YGOPRO_SERVER_MODE
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayers(cache_recorder, replay_recorder);
#endif
break; break;
} }
case MSG_SHUFFLE_HAND: { case MSG_SHUFFLE_HAND: {
player = BufferIO::ReadInt8(pbuf); player = BufferIO::ReadInt8(pbuf);
count = BufferIO::ReadInt8(pbuf); count = BufferIO::ReadInt8(pbuf);
NetServer::SendBufferToPlayer(cur_player[player], STOC_GAME_MSG, offset, (pbuf - offset) + count * 4); NetServer::SendBufferToPlayer(cur_player[player], STOC_GAME_MSG, offset, (pbuf - offset) + count * 4);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit) #ifdef YGOPRO_SERVER_MODE
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayers(cache_recorder, replay_recorder);
#endif
for(int i = 0; i < count; ++i) for(int i = 0; i < count; ++i)
BufferIO::WriteInt32(pbuf, 0); BufferIO::WriteInt32(pbuf, 0);
for(int i = 0; i < 4; ++i) for(int i = 0; i < 4; ++i)
...@@ -807,8 +881,9 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) { ...@@ -807,8 +881,9 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[3]); NetServer::ReSendToPlayer(players[3]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit) for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit) #ifdef YGOPRO_SERVER_MODE
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayers(cache_recorder, replay_recorder);
#endif
break; break;
} }
case MSG_SWAP_GRAVE_DECK: { case MSG_SWAP_GRAVE_DECK: {
...@@ -819,8 +894,9 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) { ...@@ -819,8 +894,9 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[3]); NetServer::ReSendToPlayer(players[3]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit) for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit) #ifdef YGOPRO_SERVER_MODE
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayers(cache_recorder, replay_recorder);
#endif
RefreshGrave(player); RefreshGrave(player);
break; break;
} }
...@@ -831,8 +907,9 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) { ...@@ -831,8 +907,9 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[3]); NetServer::ReSendToPlayer(players[3]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit) for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit) #ifdef YGOPRO_SERVER_MODE
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayers(cache_recorder, replay_recorder);
#endif
break; break;
} }
case MSG_DECK_TOP: { case MSG_DECK_TOP: {
...@@ -843,8 +920,9 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) { ...@@ -843,8 +920,9 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[3]); NetServer::ReSendToPlayer(players[3]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit) for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit) #ifdef YGOPRO_SERVER_MODE
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayers(cache_recorder, replay_recorder);
#endif
break; break;
} }
case MSG_SHUFFLE_SET_CARD: { case MSG_SHUFFLE_SET_CARD: {
...@@ -856,8 +934,9 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) { ...@@ -856,8 +934,9 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[3]); NetServer::ReSendToPlayer(players[3]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit) for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit) #ifdef YGOPRO_SERVER_MODE
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayers(cache_recorder, replay_recorder);
#endif
RefreshMzone(0, 0x181fff, 0); RefreshMzone(0, 0x181fff, 0);
RefreshMzone(1, 0x181fff, 0); RefreshMzone(1, 0x181fff, 0);
break; break;
...@@ -872,8 +951,9 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) { ...@@ -872,8 +951,9 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[3]); NetServer::ReSendToPlayer(players[3]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit) for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit) #ifdef YGOPRO_SERVER_MODE
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayers(cache_recorder, replay_recorder);
#endif
if(turn_count > 0) { if(turn_count > 0) {
if(turn_count % 2 == 0) { if(turn_count % 2 == 0) {
if(cur_player[0] == players[0]) if(cur_player[0] == players[0])
...@@ -898,8 +978,9 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) { ...@@ -898,8 +978,9 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[3]); NetServer::ReSendToPlayer(players[3]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit) for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit) #ifdef YGOPRO_SERVER_MODE
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayers(cache_recorder, replay_recorder);
#endif
RefreshMzone(0); RefreshMzone(0);
RefreshMzone(1); RefreshMzone(1);
RefreshSzone(0); RefreshSzone(0);
...@@ -927,8 +1008,9 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) { ...@@ -927,8 +1008,9 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::SendBufferToPlayer(players[i], STOC_GAME_MSG, offset, pbuf - offset); NetServer::SendBufferToPlayer(players[i], STOC_GAME_MSG, offset, pbuf - offset);
for(auto oit = observers.begin(); oit != observers.end(); ++oit) for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit) #ifdef YGOPRO_SERVER_MODE
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayers(cache_recorder, replay_recorder);
#endif
if (cl != 0 && (cl & 0x80) == 0 && (cl != pl || pc != cc)) if (cl != 0 && (cl & 0x80) == 0 && (cl != pl || pc != cc))
RefreshSingle(cc, cl, cs); RefreshSingle(cc, cl, cs);
break; break;
...@@ -946,8 +1028,9 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) { ...@@ -946,8 +1028,9 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[3]); NetServer::ReSendToPlayer(players[3]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit) for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit) #ifdef YGOPRO_SERVER_MODE
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayers(cache_recorder, replay_recorder);
#endif
if((pp & POS_FACEDOWN) && (cp & POS_FACEUP)) if((pp & POS_FACEDOWN) && (cp & POS_FACEUP))
RefreshSingle(cc, cl, cs); RefreshSingle(cc, cl, cs);
break; break;
...@@ -961,8 +1044,9 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) { ...@@ -961,8 +1044,9 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[3]); NetServer::ReSendToPlayer(players[3]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit) for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit) #ifdef YGOPRO_SERVER_MODE
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayers(cache_recorder, replay_recorder);
#endif
break; break;
} }
case MSG_SWAP: { case MSG_SWAP: {
...@@ -979,8 +1063,9 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) { ...@@ -979,8 +1063,9 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[3]); NetServer::ReSendToPlayer(players[3]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit) for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit) #ifdef YGOPRO_SERVER_MODE
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayers(cache_recorder, replay_recorder);
#endif
RefreshSingle(c1, l1, s1); RefreshSingle(c1, l1, s1);
RefreshSingle(c2, l2, s2); RefreshSingle(c2, l2, s2);
break; break;
...@@ -993,8 +1078,9 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) { ...@@ -993,8 +1078,9 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[3]); NetServer::ReSendToPlayer(players[3]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit) for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit) #ifdef YGOPRO_SERVER_MODE
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayers(cache_recorder, replay_recorder);
#endif
break; break;
} }
case MSG_SUMMONING: { case MSG_SUMMONING: {
...@@ -1005,8 +1091,9 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) { ...@@ -1005,8 +1091,9 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[3]); NetServer::ReSendToPlayer(players[3]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit) for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit) #ifdef YGOPRO_SERVER_MODE
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayers(cache_recorder, replay_recorder);
#endif
break; break;
} }
case MSG_SUMMONED: { case MSG_SUMMONED: {
...@@ -1016,8 +1103,9 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) { ...@@ -1016,8 +1103,9 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[3]); NetServer::ReSendToPlayer(players[3]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit) for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit) #ifdef YGOPRO_SERVER_MODE
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayers(cache_recorder, replay_recorder);
#endif
RefreshMzone(0); RefreshMzone(0);
RefreshMzone(1); RefreshMzone(1);
RefreshSzone(0); RefreshSzone(0);
...@@ -1032,8 +1120,9 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) { ...@@ -1032,8 +1120,9 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[3]); NetServer::ReSendToPlayer(players[3]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit) for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit) #ifdef YGOPRO_SERVER_MODE
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayers(cache_recorder, replay_recorder);
#endif
break; break;
} }
case MSG_SPSUMMONED: { case MSG_SPSUMMONED: {
...@@ -1043,8 +1132,9 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) { ...@@ -1043,8 +1132,9 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[3]); NetServer::ReSendToPlayer(players[3]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit) for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit) #ifdef YGOPRO_SERVER_MODE
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayers(cache_recorder, replay_recorder);
#endif
RefreshMzone(0); RefreshMzone(0);
RefreshMzone(1); RefreshMzone(1);
RefreshSzone(0); RefreshSzone(0);
...@@ -1060,8 +1150,9 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) { ...@@ -1060,8 +1150,9 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[3]); NetServer::ReSendToPlayer(players[3]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit) for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit) #ifdef YGOPRO_SERVER_MODE
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayers(cache_recorder, replay_recorder);
#endif
break; break;
} }
case MSG_FLIPSUMMONED: { case MSG_FLIPSUMMONED: {
...@@ -1071,8 +1162,9 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) { ...@@ -1071,8 +1162,9 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[3]); NetServer::ReSendToPlayer(players[3]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit) for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit) #ifdef YGOPRO_SERVER_MODE
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayers(cache_recorder, replay_recorder);
#endif
RefreshMzone(0); RefreshMzone(0);
RefreshMzone(1); RefreshMzone(1);
RefreshSzone(0); RefreshSzone(0);
...@@ -1087,8 +1179,9 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) { ...@@ -1087,8 +1179,9 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[3]); NetServer::ReSendToPlayer(players[3]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit) for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit) #ifdef YGOPRO_SERVER_MODE
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayers(cache_recorder, replay_recorder);
#endif
break; break;
} }
case MSG_CHAINED: { case MSG_CHAINED: {
...@@ -1099,8 +1192,9 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) { ...@@ -1099,8 +1192,9 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[3]); NetServer::ReSendToPlayer(players[3]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit) for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit) #ifdef YGOPRO_SERVER_MODE
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayers(cache_recorder, replay_recorder);
#endif
RefreshMzone(0); RefreshMzone(0);
RefreshMzone(1); RefreshMzone(1);
RefreshSzone(0); RefreshSzone(0);
...@@ -1117,8 +1211,9 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) { ...@@ -1117,8 +1211,9 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[3]); NetServer::ReSendToPlayer(players[3]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit) for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit) #ifdef YGOPRO_SERVER_MODE
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayers(cache_recorder, replay_recorder);
#endif
break; break;
} }
case MSG_CHAIN_SOLVED: { case MSG_CHAIN_SOLVED: {
...@@ -1129,8 +1224,9 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) { ...@@ -1129,8 +1224,9 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[3]); NetServer::ReSendToPlayer(players[3]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit) for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit) #ifdef YGOPRO_SERVER_MODE
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayers(cache_recorder, replay_recorder);
#endif
RefreshMzone(0); RefreshMzone(0);
RefreshMzone(1); RefreshMzone(1);
RefreshSzone(0); RefreshSzone(0);
...@@ -1146,8 +1242,9 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) { ...@@ -1146,8 +1242,9 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[3]); NetServer::ReSendToPlayer(players[3]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit) for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit) #ifdef YGOPRO_SERVER_MODE
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayers(cache_recorder, replay_recorder);
#endif
RefreshMzone(0); RefreshMzone(0);
RefreshMzone(1); RefreshMzone(1);
RefreshSzone(0); RefreshSzone(0);
...@@ -1164,8 +1261,9 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) { ...@@ -1164,8 +1261,9 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[3]); NetServer::ReSendToPlayer(players[3]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit) for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit) #ifdef YGOPRO_SERVER_MODE
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayers(cache_recorder, replay_recorder);
#endif
break; break;
} }
case MSG_CHAIN_DISABLED: { case MSG_CHAIN_DISABLED: {
...@@ -1176,8 +1274,9 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) { ...@@ -1176,8 +1274,9 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[3]); NetServer::ReSendToPlayer(players[3]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit) for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit) #ifdef YGOPRO_SERVER_MODE
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayers(cache_recorder, replay_recorder);
#endif
break; break;
} }
case MSG_CARD_SELECTED: { case MSG_CARD_SELECTED: {
...@@ -1196,8 +1295,9 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) { ...@@ -1196,8 +1295,9 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[3]); NetServer::ReSendToPlayer(players[3]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit) for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit) #ifdef YGOPRO_SERVER_MODE
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayers(cache_recorder, replay_recorder);
#endif
break; break;
} }
case MSG_BECOME_TARGET: { case MSG_BECOME_TARGET: {
...@@ -1209,8 +1309,9 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) { ...@@ -1209,8 +1309,9 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[3]); NetServer::ReSendToPlayer(players[3]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit) for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit) #ifdef YGOPRO_SERVER_MODE
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayers(cache_recorder, replay_recorder);
#endif
break; break;
} }
case MSG_DRAW: { case MSG_DRAW: {
...@@ -1219,8 +1320,9 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) { ...@@ -1219,8 +1320,9 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
pbufw = pbuf; pbufw = pbuf;
pbuf += count * 4; pbuf += count * 4;
NetServer::SendBufferToPlayer(cur_player[player], STOC_GAME_MSG, offset, pbuf - offset); NetServer::SendBufferToPlayer(cur_player[player], STOC_GAME_MSG, offset, pbuf - offset);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit) #ifdef YGOPRO_SERVER_MODE
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayer(replay_recorder);
#endif
for (int i = 0; i < count; ++i) { for (int i = 0; i < count; ++i) {
if(!(pbufw[3] & 0x80)) if(!(pbufw[3] & 0x80))
BufferIO::WriteInt32(pbufw, 0); BufferIO::WriteInt32(pbufw, 0);
...@@ -1232,6 +1334,9 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) { ...@@ -1232,6 +1334,9 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::SendBufferToPlayer(players[i], STOC_GAME_MSG, offset, pbuf - offset); NetServer::SendBufferToPlayer(players[i], STOC_GAME_MSG, offset, pbuf - offset);
for(auto oit = observers.begin(); oit != observers.end(); ++oit) for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayer(*oit);
#ifdef YGOPRO_SERVER_MODE
NetServer::ReSendToPlayer(cache_recorder);
#endif
break; break;
} }
case MSG_DAMAGE: { case MSG_DAMAGE: {
...@@ -1242,8 +1347,9 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) { ...@@ -1242,8 +1347,9 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[3]); NetServer::ReSendToPlayer(players[3]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit) for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit) #ifdef YGOPRO_SERVER_MODE
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayers(cache_recorder, replay_recorder);
#endif
break; break;
} }
case MSG_RECOVER: { case MSG_RECOVER: {
...@@ -1254,8 +1360,9 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) { ...@@ -1254,8 +1360,9 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[3]); NetServer::ReSendToPlayer(players[3]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit) for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit) #ifdef YGOPRO_SERVER_MODE
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayers(cache_recorder, replay_recorder);
#endif
break; break;
} }
case MSG_EQUIP: { case MSG_EQUIP: {
...@@ -1266,8 +1373,9 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) { ...@@ -1266,8 +1373,9 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[3]); NetServer::ReSendToPlayer(players[3]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit) for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit) #ifdef YGOPRO_SERVER_MODE
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayers(cache_recorder, replay_recorder);
#endif
break; break;
} }
case MSG_LPUPDATE: { case MSG_LPUPDATE: {
...@@ -1278,8 +1386,9 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) { ...@@ -1278,8 +1386,9 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[3]); NetServer::ReSendToPlayer(players[3]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit) for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit) #ifdef YGOPRO_SERVER_MODE
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayers(cache_recorder, replay_recorder);
#endif
break; break;
} }
case MSG_UNEQUIP: { case MSG_UNEQUIP: {
...@@ -1290,8 +1399,9 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) { ...@@ -1290,8 +1399,9 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[3]); NetServer::ReSendToPlayer(players[3]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit) for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit) #ifdef YGOPRO_SERVER_MODE
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayers(cache_recorder, replay_recorder);
#endif
break; break;
} }
case MSG_CARD_TARGET: { case MSG_CARD_TARGET: {
...@@ -1302,8 +1412,9 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) { ...@@ -1302,8 +1412,9 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[3]); NetServer::ReSendToPlayer(players[3]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit) for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit) #ifdef YGOPRO_SERVER_MODE
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayers(cache_recorder, replay_recorder);
#endif
break; break;
} }
case MSG_CANCEL_TARGET: { case MSG_CANCEL_TARGET: {
...@@ -1314,8 +1425,9 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) { ...@@ -1314,8 +1425,9 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[3]); NetServer::ReSendToPlayer(players[3]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit) for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit) #ifdef YGOPRO_SERVER_MODE
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayers(cache_recorder, replay_recorder);
#endif
break; break;
} }
case MSG_PAY_LPCOST: { case MSG_PAY_LPCOST: {
...@@ -1326,8 +1438,9 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) { ...@@ -1326,8 +1438,9 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[3]); NetServer::ReSendToPlayer(players[3]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit) for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit) #ifdef YGOPRO_SERVER_MODE
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayers(cache_recorder, replay_recorder);
#endif
break; break;
} }
case MSG_ADD_COUNTER: { case MSG_ADD_COUNTER: {
...@@ -1338,8 +1451,9 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) { ...@@ -1338,8 +1451,9 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[3]); NetServer::ReSendToPlayer(players[3]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit) for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit) #ifdef YGOPRO_SERVER_MODE
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayers(cache_recorder, replay_recorder);
#endif
break; break;
} }
case MSG_REMOVE_COUNTER: { case MSG_REMOVE_COUNTER: {
...@@ -1350,8 +1464,9 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) { ...@@ -1350,8 +1464,9 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[3]); NetServer::ReSendToPlayer(players[3]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit) for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit) #ifdef YGOPRO_SERVER_MODE
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayers(cache_recorder, replay_recorder);
#endif
break; break;
} }
case MSG_ATTACK: { case MSG_ATTACK: {
...@@ -1362,8 +1477,9 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) { ...@@ -1362,8 +1477,9 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[3]); NetServer::ReSendToPlayer(players[3]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit) for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit) #ifdef YGOPRO_SERVER_MODE
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayers(cache_recorder, replay_recorder);
#endif
break; break;
} }
case MSG_BATTLE: { case MSG_BATTLE: {
...@@ -1374,8 +1490,9 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) { ...@@ -1374,8 +1490,9 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[3]); NetServer::ReSendToPlayer(players[3]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit) for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit) #ifdef YGOPRO_SERVER_MODE
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayers(cache_recorder, replay_recorder);
#endif
break; break;
} }
case MSG_ATTACK_DISABLED: { case MSG_ATTACK_DISABLED: {
...@@ -1385,8 +1502,9 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) { ...@@ -1385,8 +1502,9 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[3]); NetServer::ReSendToPlayer(players[3]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit) for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit) #ifdef YGOPRO_SERVER_MODE
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayers(cache_recorder, replay_recorder);
#endif
break; break;
} }
case MSG_DAMAGE_STEP_START: { case MSG_DAMAGE_STEP_START: {
...@@ -1396,8 +1514,9 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) { ...@@ -1396,8 +1514,9 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[3]); NetServer::ReSendToPlayer(players[3]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit) for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit) #ifdef YGOPRO_SERVER_MODE
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayers(cache_recorder, replay_recorder);
#endif
RefreshMzone(0); RefreshMzone(0);
RefreshMzone(1); RefreshMzone(1);
break; break;
...@@ -1409,8 +1528,9 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) { ...@@ -1409,8 +1528,9 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[3]); NetServer::ReSendToPlayer(players[3]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit) for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit) #ifdef YGOPRO_SERVER_MODE
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayers(cache_recorder, replay_recorder);
#endif
RefreshMzone(0); RefreshMzone(0);
RefreshMzone(1); RefreshMzone(1);
break; break;
...@@ -1431,8 +1551,9 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) { ...@@ -1431,8 +1551,9 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[3]); NetServer::ReSendToPlayer(players[3]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit) for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit) #ifdef YGOPRO_SERVER_MODE
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayers(cache_recorder, replay_recorder);
#endif
break; break;
} }
case MSG_TOSS_DICE: { case MSG_TOSS_DICE: {
...@@ -1445,8 +1566,9 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) { ...@@ -1445,8 +1566,9 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[3]); NetServer::ReSendToPlayer(players[3]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit) for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit) #ifdef YGOPRO_SERVER_MODE
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayers(cache_recorder, replay_recorder);
#endif
break; break;
} }
case MSG_ROCK_PAPER_SCISSORS: { case MSG_ROCK_PAPER_SCISSORS: {
...@@ -1503,8 +1625,9 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) { ...@@ -1503,8 +1625,9 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[3]); NetServer::ReSendToPlayer(players[3]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit) for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit) #ifdef YGOPRO_SERVER_MODE
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayers(cache_recorder, replay_recorder);
#endif
break; break;
} }
case MSG_PLAYER_HINT: { case MSG_PLAYER_HINT: {
...@@ -1543,8 +1666,9 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) { ...@@ -1543,8 +1666,9 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::SendBufferToPlayer(players[i], STOC_GAME_MSG, offset, pbuf - offset); NetServer::SendBufferToPlayer(players[i], STOC_GAME_MSG, offset, pbuf - offset);
for(auto oit = observers.begin(); oit != observers.end(); ++oit) for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit) #ifdef YGOPRO_SERVER_MODE
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayers(cache_recorder, replay_recorder);
#endif
RefreshExtra(player); RefreshExtra(player);
RefreshMzone(0, 0x81fff, 0); RefreshMzone(0, 0x81fff, 0);
RefreshMzone(1, 0x81fff, 0); RefreshMzone(1, 0x81fff, 0);
...@@ -1590,12 +1714,16 @@ void TagDuel::EndDuel() { ...@@ -1590,12 +1714,16 @@ void TagDuel::EndDuel() {
NetServer::ReSendToPlayer(players[1]); NetServer::ReSendToPlayer(players[1]);
NetServer::ReSendToPlayer(players[2]); NetServer::ReSendToPlayer(players[2]);
NetServer::ReSendToPlayer(players[3]); NetServer::ReSendToPlayer(players[3]);
#ifdef YGOPRO_SERVER_MODE
if (ygo::replay_mode == 0) { if (ygo::replay_mode == 0) {
for(auto oit = observers.begin(); oit != observers.end(); ++oit) for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit) NetServer::ReSendToPlayers(cache_recorder, replay_recorder);
NetServer::ReSendToPlayer(*oit);
} }
#else
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
#endif
end_duel(pduel); end_duel(pduel);
pduel = 0; pduel = 0;
} }
...@@ -1637,8 +1765,9 @@ void TagDuel::RefreshMzone(int player, int flag, int use_cache) { ...@@ -1637,8 +1765,9 @@ void TagDuel::RefreshMzone(int player, int flag, int use_cache) {
int pid = (player == 0) ? 0 : 2; int pid = (player == 0) ? 0 : 2;
NetServer::SendBufferToPlayer(players[pid], STOC_GAME_MSG, query_buffer, len + 3); NetServer::SendBufferToPlayer(players[pid], STOC_GAME_MSG, query_buffer, len + 3);
NetServer::ReSendToPlayer(players[pid + 1]); NetServer::ReSendToPlayer(players[pid + 1]);
for(auto pit = recorders.begin(); pit != recorders.end(); ++pit) #ifdef YGOPRO_SERVER_MODE
NetServer::ReSendToPlayer(*pit); NetServer::ReSendToPlayer(replay_recorder);
#endif
for (int i = 0; i < 5; ++i) { for (int i = 0; i < 5; ++i) {
int clen = BufferIO::ReadInt32(qbuf); int clen = BufferIO::ReadInt32(qbuf);
if (clen == 4) if (clen == 4)
...@@ -1652,6 +1781,9 @@ void TagDuel::RefreshMzone(int player, int flag, int use_cache) { ...@@ -1652,6 +1781,9 @@ void TagDuel::RefreshMzone(int player, int flag, int use_cache) {
NetServer::ReSendToPlayer(players[pid + 1]); NetServer::ReSendToPlayer(players[pid + 1]);
for(auto pit = observers.begin(); pit != observers.end(); ++pit) for(auto pit = observers.begin(); pit != observers.end(); ++pit)
NetServer::ReSendToPlayer(*pit); NetServer::ReSendToPlayer(*pit);
#ifdef YGOPRO_SERVER_MODE
NetServer::ReSendToPlayer(cache_recorder);
#endif
} }
void TagDuel::RefreshSzone(int player, int flag, int use_cache) { void TagDuel::RefreshSzone(int player, int flag, int use_cache) {
char query_buffer[0x2000]; char query_buffer[0x2000];
...@@ -1663,8 +1795,9 @@ void TagDuel::RefreshSzone(int player, int flag, int use_cache) { ...@@ -1663,8 +1795,9 @@ void TagDuel::RefreshSzone(int player, int flag, int use_cache) {
int pid = (player == 0) ? 0 : 2; int pid = (player == 0) ? 0 : 2;
NetServer::SendBufferToPlayer(players[pid], STOC_GAME_MSG, query_buffer, len + 3); NetServer::SendBufferToPlayer(players[pid], STOC_GAME_MSG, query_buffer, len + 3);
NetServer::ReSendToPlayer(players[pid + 1]); NetServer::ReSendToPlayer(players[pid + 1]);
for(auto pit = recorders.begin(); pit != recorders.end(); ++pit) #ifdef YGOPRO_SERVER_MODE
NetServer::ReSendToPlayer(*pit); NetServer::ReSendToPlayer(replay_recorder);
#endif
for (int i = 0; i < 8; ++i) { for (int i = 0; i < 8; ++i) {
int clen = BufferIO::ReadInt32(qbuf); int clen = BufferIO::ReadInt32(qbuf);
if (clen == 4) if (clen == 4)
...@@ -1678,6 +1811,9 @@ void TagDuel::RefreshSzone(int player, int flag, int use_cache) { ...@@ -1678,6 +1811,9 @@ void TagDuel::RefreshSzone(int player, int flag, int use_cache) {
NetServer::ReSendToPlayer(players[pid + 1]); NetServer::ReSendToPlayer(players[pid + 1]);
for(auto pit = observers.begin(); pit != observers.end(); ++pit) for(auto pit = observers.begin(); pit != observers.end(); ++pit)
NetServer::ReSendToPlayer(*pit); NetServer::ReSendToPlayer(*pit);
#ifdef YGOPRO_SERVER_MODE
NetServer::ReSendToPlayer(cache_recorder);
#endif
} }
void TagDuel::RefreshHand(int player, int flag, int use_cache) { void TagDuel::RefreshHand(int player, int flag, int use_cache) {
char query_buffer[0x2000]; char query_buffer[0x2000];
...@@ -1687,8 +1823,9 @@ void TagDuel::RefreshHand(int player, int flag, int use_cache) { ...@@ -1687,8 +1823,9 @@ void TagDuel::RefreshHand(int player, int flag, int use_cache) {
BufferIO::WriteInt8(qbuf, LOCATION_HAND); BufferIO::WriteInt8(qbuf, LOCATION_HAND);
int len = query_field_card(pduel, player, LOCATION_HAND, flag | QUERY_IS_PUBLIC, (unsigned char*)qbuf, use_cache); int len = query_field_card(pduel, player, LOCATION_HAND, flag | QUERY_IS_PUBLIC, (unsigned char*)qbuf, use_cache);
NetServer::SendBufferToPlayer(cur_player[player], STOC_GAME_MSG, query_buffer, len + 3); NetServer::SendBufferToPlayer(cur_player[player], STOC_GAME_MSG, query_buffer, len + 3);
for(auto pit = recorders.begin(); pit != recorders.end(); ++pit) #ifdef YGOPRO_SERVER_MODE
NetServer::ReSendToPlayer(*pit); NetServer::ReSendToPlayer(replay_recorder);
#endif
int qlen = 0, slen; int qlen = 0, slen;
while(qlen < len) { while(qlen < len) {
slen = BufferIO::ReadInt32(qbuf); slen = BufferIO::ReadInt32(qbuf);
...@@ -1708,6 +1845,9 @@ void TagDuel::RefreshHand(int player, int flag, int use_cache) { ...@@ -1708,6 +1845,9 @@ void TagDuel::RefreshHand(int player, int flag, int use_cache) {
NetServer::SendBufferToPlayer(players[i], STOC_GAME_MSG, query_buffer, len + 3); NetServer::SendBufferToPlayer(players[i], STOC_GAME_MSG, query_buffer, len + 3);
for(auto pit = observers.begin(); pit != observers.end(); ++pit) for(auto pit = observers.begin(); pit != observers.end(); ++pit)
NetServer::ReSendToPlayer(*pit); NetServer::ReSendToPlayer(*pit);
#ifdef YGOPRO_SERVER_MODE
NetServer::ReSendToPlayer(cache_recorder);
#endif
} }
void TagDuel::RefreshGrave(int player, int flag, int use_cache) { void TagDuel::RefreshGrave(int player, int flag, int use_cache) {
char query_buffer[0x2000]; char query_buffer[0x2000];
...@@ -1722,8 +1862,9 @@ void TagDuel::RefreshGrave(int player, int flag, int use_cache) { ...@@ -1722,8 +1862,9 @@ void TagDuel::RefreshGrave(int player, int flag, int use_cache) {
NetServer::ReSendToPlayer(players[3]); NetServer::ReSendToPlayer(players[3]);
for(auto pit = observers.begin(); pit != observers.end(); ++pit) for(auto pit = observers.begin(); pit != observers.end(); ++pit)
NetServer::ReSendToPlayer(*pit); NetServer::ReSendToPlayer(*pit);
for(auto pit = recorders.begin(); pit != recorders.end(); ++pit) #ifdef YGOPRO_SERVER_MODE
NetServer::ReSendToPlayer(*pit); NetServer::ReSendToPlayers(cache_recorder, replay_recorder);
#endif
} }
void TagDuel::RefreshExtra(int player, int flag, int use_cache) { void TagDuel::RefreshExtra(int player, int flag, int use_cache) {
char query_buffer[0x2000]; char query_buffer[0x2000];
...@@ -1746,21 +1887,26 @@ void TagDuel::RefreshSingle(int player, int location, int sequence, int flag) { ...@@ -1746,21 +1887,26 @@ void TagDuel::RefreshSingle(int player, int location, int sequence, int flag) {
int pid = (player == 0) ? 0 : 2; int pid = (player == 0) ? 0 : 2;
NetServer::SendBufferToPlayer(players[pid], STOC_GAME_MSG, query_buffer, len + 4); NetServer::SendBufferToPlayer(players[pid], STOC_GAME_MSG, query_buffer, len + 4);
NetServer::ReSendToPlayer(players[pid + 1]); NetServer::ReSendToPlayer(players[pid + 1]);
for(auto pit = recorders.begin(); pit != recorders.end(); ++pit) #ifdef YGOPRO_SERVER_MODE
NetServer::ReSendToPlayer(*pit); NetServer::ReSendToPlayer(replay_recorder);
#endif
if(qbuf[15] & POS_FACEUP) { if(qbuf[15] & POS_FACEUP) {
pid = 2 - pid; pid = 2 - pid;
NetServer::SendBufferToPlayer(players[pid], STOC_GAME_MSG, query_buffer, len + 4); NetServer::SendBufferToPlayer(players[pid], STOC_GAME_MSG, query_buffer, len + 4);
NetServer::ReSendToPlayer(players[pid + 1]); NetServer::ReSendToPlayer(players[pid + 1]);
for(auto pit = observers.begin(); pit != observers.end(); ++pit) for(auto pit = observers.begin(); pit != observers.end(); ++pit)
NetServer::ReSendToPlayer(*pit); NetServer::ReSendToPlayer(*pit);
#ifdef YGOPRO_SERVER_MODE
NetServer::ReSendToPlayer(cache_recorder);
#endif
} }
} else { } else {
int pid = (player == 0) ? 0 : 2; int pid = (player == 0) ? 0 : 2;
NetServer::SendBufferToPlayer(players[pid], STOC_GAME_MSG, query_buffer, len + 4); NetServer::SendBufferToPlayer(players[pid], STOC_GAME_MSG, query_buffer, len + 4);
NetServer::ReSendToPlayer(players[pid + 1]); NetServer::ReSendToPlayer(players[pid + 1]);
for(auto pit = recorders.begin(); pit != recorders.end(); ++pit) #ifdef YGOPRO_SERVER_MODE
NetServer::ReSendToPlayer(*pit); NetServer::ReSendToPlayer(replay_recorder);
#endif
if(location == LOCATION_REMOVED && (qbuf[15] & POS_FACEDOWN)) if(location == LOCATION_REMOVED && (qbuf[15] & POS_FACEDOWN))
return; return;
if (location & 0x90) { if (location & 0x90) {
...@@ -1769,6 +1915,9 @@ void TagDuel::RefreshSingle(int player, int location, int sequence, int flag) { ...@@ -1769,6 +1915,9 @@ void TagDuel::RefreshSingle(int player, int location, int sequence, int flag) {
NetServer::ReSendToPlayer(players[i]); NetServer::ReSendToPlayer(players[i]);
for(auto pit = observers.begin(); pit != observers.end(); ++pit) for(auto pit = observers.begin(); pit != observers.end(); ++pit)
NetServer::ReSendToPlayer(*pit); NetServer::ReSendToPlayer(*pit);
#ifdef YGOPRO_SERVER_MODE
NetServer::ReSendToPlayer(cache_recorder);
#endif
} }
} }
} }
......
...@@ -47,8 +47,9 @@ protected: ...@@ -47,8 +47,9 @@ protected:
DuelPlayer* cur_player[2]; DuelPlayer* cur_player[2];
std::set<DuelPlayer*> observers; std::set<DuelPlayer*> observers;
#ifdef YGOPRO_SERVER_MODE #ifdef YGOPRO_SERVER_MODE
std::set<DuelPlayer*> recorders; DuelPlayer* cache_recorder;
#endif //YGOPRO_SERVER_MODE DuelPlayer* replay_recorder;
#endif
bool ready[4]; bool ready[4];
Deck pdeck[4]; Deck pdeck[4];
unsigned char hand_result[2]; unsigned char hand_result[2];
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment