Commit 8c308d90 authored by nanahira's avatar nanahira

Merge branch 'server-patch-reversedeck' of ../versions/ygopro-mc into server-develop

parents 64c28dce 681be1c4
...@@ -12,10 +12,6 @@ extern unsigned short replay_mode; ...@@ -12,10 +12,6 @@ extern unsigned short replay_mode;
#endif #endif
SingleDuel::SingleDuel(bool is_match) { SingleDuel::SingleDuel(bool is_match) {
match_mode = is_match; match_mode = is_match;
#ifdef YGOPRO_SERVER_MODE
cache_recorder = 0;
replay_recorder = 0;
#endif
} }
SingleDuel::~SingleDuel() { SingleDuel::~SingleDuel() {
} }
...@@ -657,6 +653,8 @@ void SingleDuel::TPResult(DuelPlayer* dp, unsigned char tp) { ...@@ -657,6 +653,8 @@ void SingleDuel::TPResult(DuelPlayer* dp, unsigned char tp) {
NetServer::SendBufferToPlayer(replay_recorder, STOC_GAME_MSG, startbuf, 19); NetServer::SendBufferToPlayer(replay_recorder, STOC_GAME_MSG, startbuf, 19);
turn_player = 0; turn_player = 0;
phase = 1; phase = 1;
deck_reversed = false;
std::memset(deck_top, 0, sizeof(deck_top));
#endif #endif
RefreshExtra(0); RefreshExtra(0);
RefreshExtra(1); RefreshExtra(1);
...@@ -1177,11 +1175,20 @@ int SingleDuel::Analyze(unsigned char* msgbuffer, unsigned int len) { ...@@ -1177,11 +1175,20 @@ int SingleDuel::Analyze(unsigned char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayer(*oit);
#ifdef YGOPRO_SERVER_MODE #ifdef YGOPRO_SERVER_MODE
NetServer::ReSendToPlayers(cache_recorder, replay_recorder); NetServer::ReSendToPlayers(cache_recorder, replay_recorder);
deck_reversed = !deck_reversed;
#endif #endif
break; break;
} }
case MSG_DECK_TOP: { case MSG_DECK_TOP: {
#ifdef YGOPRO_SERVER_MODE
auto player = BufferIO::ReadUInt8(pbuf);
auto seq = BufferIO::ReadUInt8(pbuf);
auto code = BufferIO::ReadInt32(pbuf);
if(seq == 0)
deck_top[player] = code;
#else
pbuf += 6; pbuf += 6;
#endif
NetServer::SendBufferToPlayer(players[0], STOC_GAME_MSG, offset, pbuf - offset); NetServer::SendBufferToPlayer(players[0], STOC_GAME_MSG, offset, pbuf - offset);
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)
...@@ -1911,39 +1918,47 @@ void SingleDuel::WaitforResponse(int playerid) { ...@@ -1911,39 +1918,47 @@ void SingleDuel::WaitforResponse(int playerid) {
void SingleDuel::RequestField(DuelPlayer* dp) { void SingleDuel::RequestField(DuelPlayer* dp) {
if(dp->type > 1) if(dp->type > 1)
return; return;
int player = dp->type; uint8_t player = dp->type;
NetServer::SendPacketToPlayer(dp, STOC_DUEL_START); NetServer::SendPacketToPlayer(dp, STOC_DUEL_START);
unsigned char startbuf[32], *pbuf = startbuf; uint8_t buf[1024];
BufferIO::WriteInt8(pbuf, MSG_START); uint8_t* temp_buf = buf;
BufferIO::WriteInt8(pbuf, player); auto WriteMsg = [&](const std::function<void(uint8_t*&)> &writer) {
BufferIO::WriteInt8(pbuf, host_info.duel_rule); temp_buf = buf;
BufferIO::WriteInt32(pbuf, host_info.start_lp); writer(temp_buf);
BufferIO::WriteInt32(pbuf, host_info.start_lp); NetServer::SendBufferToPlayer(dp, STOC_GAME_MSG, buf, temp_buf - buf);
BufferIO::WriteInt16(pbuf, 0); };
BufferIO::WriteInt16(pbuf, 0);
BufferIO::WriteInt16(pbuf, 0); WriteMsg([&](uint8_t*& pbuf) {
BufferIO::WriteInt16(pbuf, 0); BufferIO::WriteInt8(pbuf, MSG_START);
NetServer::SendBufferToPlayer(dp, STOC_GAME_MSG, startbuf, 19); BufferIO::WriteInt8(pbuf, player);
BufferIO::WriteInt8(pbuf, this->host_info.duel_rule);
BufferIO::WriteInt32(pbuf, this->host_info.start_lp);
BufferIO::WriteInt32(pbuf, this->host_info.start_lp);
BufferIO::WriteInt16(pbuf, 0);
BufferIO::WriteInt16(pbuf, 0);
BufferIO::WriteInt16(pbuf, 0);
BufferIO::WriteInt16(pbuf, 0);
});
int newturn_count = 1; uint8_t newturn_count = (turn_player == 1) ? 2 : 1;
if(turn_player == 1) for (uint8_t i = 0; i < newturn_count; ++i) {
newturn_count = 2; WriteMsg([&](uint8_t*& pbuf) {
for(int i = 0; i < newturn_count; i++) { BufferIO::WriteInt8(pbuf, MSG_NEW_TURN);
unsigned char turnbuf[2], *pbuf_t = turnbuf; BufferIO::WriteInt8(pbuf, i);
BufferIO::WriteInt8(pbuf_t, MSG_NEW_TURN); });
BufferIO::WriteInt8(pbuf_t, i);
NetServer::SendBufferToPlayer(dp, STOC_GAME_MSG, turnbuf, 2);
} }
unsigned char phasebuf[4], *pbuf_p = phasebuf; WriteMsg([&](uint8_t*& pbuf) {
BufferIO::WriteInt8(pbuf_p, MSG_NEW_PHASE); BufferIO::WriteInt8(pbuf, MSG_NEW_PHASE);
BufferIO::WriteInt16(pbuf_p, phase); BufferIO::WriteInt16(pbuf, this->phase);
NetServer::SendBufferToPlayer(dp, STOC_GAME_MSG, phasebuf, 3); });
WriteMsg([&](uint8_t*& pbuf) {
auto length = query_field_info(this->pduel, pbuf);
pbuf += length;
});
unsigned char query_buffer[1024];
int length = query_field_info(pduel, (unsigned char*)query_buffer);
NetServer::SendBufferToPlayer(dp, STOC_GAME_MSG, query_buffer, length);
RefreshMzone(1 - player, 0xefffff, 0, dp); RefreshMzone(1 - player, 0xefffff, 0, dp);
RefreshMzone(player, 0xefffff, 0, dp); RefreshMzone(player, 0xefffff, 0, dp);
RefreshSzone(1 - player, 0xefffff, 0, dp); RefreshSzone(1 - player, 0xefffff, 0, dp);
...@@ -1956,6 +1971,23 @@ void SingleDuel::RequestField(DuelPlayer* dp) { ...@@ -1956,6 +1971,23 @@ void SingleDuel::RequestField(DuelPlayer* dp) {
RefreshExtra(player, 0xefffff, 0, dp); RefreshExtra(player, 0xefffff, 0, dp);
RefreshRemoved(1 - player, 0xefffff, 0, dp); RefreshRemoved(1 - player, 0xefffff, 0, dp);
RefreshRemoved(player, 0xefffff, 0, dp); RefreshRemoved(player, 0xefffff, 0, dp);
// send MSG_REVERSE_DECK if deck is reversed
if(deck_reversed) {
WriteMsg([&](uint8_t*& pbuf) {
BufferIO::WriteInt8(pbuf, MSG_REVERSE_DECK);
});
for(uint8_t i = 0; i < 2; ++i) {
WriteMsg([&](uint8_t*& pbuf) {
BufferIO::WriteInt8(pbuf, MSG_DECK_TOP);
BufferIO::WriteInt8(pbuf, i);
BufferIO::WriteInt8(pbuf, 0);
BufferIO::WriteInt32(pbuf, this->deck_top[i]);
});
}
}
/* /*
if(dp == players[last_response]) if(dp == players[last_response])
WaitforResponse(last_response); WaitforResponse(last_response);
......
...@@ -70,10 +70,12 @@ protected: ...@@ -70,10 +70,12 @@ protected:
unsigned char last_response{ 0 }; unsigned char last_response{ 0 };
std::set<DuelPlayer*> observers; std::set<DuelPlayer*> observers;
#ifdef YGOPRO_SERVER_MODE #ifdef YGOPRO_SERVER_MODE
DuelPlayer* cache_recorder; DuelPlayer* cache_recorder{};
DuelPlayer* replay_recorder; DuelPlayer* replay_recorder{};
unsigned char turn_player; unsigned char turn_player{ 0 };
unsigned short phase; unsigned short phase{ 0 };
bool deck_reversed{ false };
uint32_t deck_top[2]{};
#endif #endif
Replay last_replay; Replay last_replay;
bool match_mode{ false }; bool match_mode{ false };
...@@ -88,9 +90,9 @@ protected: ...@@ -88,9 +90,9 @@ protected:
short time_limit[2]{}; short time_limit[2]{};
short time_elapsed{ 0 }; short time_elapsed{ 0 };
#ifdef YGOPRO_SERVER_MODE #ifdef YGOPRO_SERVER_MODE
short time_compensator[2]; short time_compensator[2]{};
short time_backed[2]; short time_backed[2]{};
unsigned char last_game_msg; unsigned char last_game_msg{ 0 };
#endif #endif
}; };
......
...@@ -16,10 +16,6 @@ TagDuel::TagDuel() { ...@@ -16,10 +16,6 @@ TagDuel::TagDuel() {
ready[i] = false; ready[i] = false;
surrender[i] = false; surrender[i] = false;
} }
#ifdef YGOPRO_SERVER_MODE
cache_recorder = 0;
replay_recorder = 0;
#endif
} }
TagDuel::~TagDuel() { TagDuel::~TagDuel() {
} }
...@@ -655,6 +651,8 @@ void TagDuel::TPResult(DuelPlayer* dp, unsigned char tp) { ...@@ -655,6 +651,8 @@ void TagDuel::TPResult(DuelPlayer* dp, unsigned char tp) {
NetServer::SendBufferToPlayer(replay_recorder, STOC_GAME_MSG, startbuf, 19); NetServer::SendBufferToPlayer(replay_recorder, STOC_GAME_MSG, startbuf, 19);
turn_player = 0; turn_player = 0;
phase = 1; phase = 1;
deck_reversed = false;
std::memset(deck_top, 0, sizeof(deck_top));
#endif #endif
RefreshExtra(0); RefreshExtra(0);
RefreshExtra(1); RefreshExtra(1);
...@@ -1139,11 +1137,20 @@ int TagDuel::Analyze(unsigned char* msgbuffer, unsigned int len) { ...@@ -1139,11 +1137,20 @@ int TagDuel::Analyze(unsigned char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayer(*oit);
#ifdef YGOPRO_SERVER_MODE #ifdef YGOPRO_SERVER_MODE
NetServer::ReSendToPlayers(cache_recorder, replay_recorder); NetServer::ReSendToPlayers(cache_recorder, replay_recorder);
deck_reversed = !deck_reversed;
#endif #endif
break; break;
} }
case MSG_DECK_TOP: { case MSG_DECK_TOP: {
#ifdef YGOPRO_SERVER_MODE
auto player = BufferIO::ReadUInt8(pbuf);
auto seq = BufferIO::ReadUInt8(pbuf);
auto code = BufferIO::ReadInt32(pbuf);
if(seq == 0)
deck_top[player] = code;
#else
pbuf += 6; pbuf += 6;
#endif
NetServer::SendBufferToPlayer(players[0], STOC_GAME_MSG, offset, pbuf - offset); NetServer::SendBufferToPlayer(players[0], STOC_GAME_MSG, offset, pbuf - offset);
NetServer::ReSendToPlayer(players[1]); NetServer::ReSendToPlayer(players[1]);
NetServer::ReSendToPlayer(players[2]); NetServer::ReSendToPlayer(players[2]);
...@@ -2009,39 +2016,49 @@ void TagDuel::WaitforResponse(int playerid) { ...@@ -2009,39 +2016,49 @@ void TagDuel::WaitforResponse(int playerid) {
void TagDuel::RequestField(DuelPlayer* dp) { void TagDuel::RequestField(DuelPlayer* dp) {
if(dp->type > 3) if(dp->type > 3)
return; return;
int player = (dp->type > 1) ? 1 : 0; uint8_t player = (dp->type > 1) ? 1 : 0;
NetServer::SendPacketToPlayer(dp, STOC_DUEL_START); NetServer::SendPacketToPlayer(dp, STOC_DUEL_START);
unsigned char startbuf[32], *pbuf = startbuf; uint8_t buf[1024];
BufferIO::WriteInt8(pbuf, MSG_START); uint8_t* temp_buf = buf;
BufferIO::WriteInt8(pbuf, player); auto WriteMsg = [&](const std::function<void(uint8_t*&)> &writer) {
BufferIO::WriteInt8(pbuf, host_info.duel_rule); temp_buf = buf;
BufferIO::WriteInt32(pbuf, host_info.start_lp); writer(temp_buf);
BufferIO::WriteInt32(pbuf, host_info.start_lp); NetServer::SendBufferToPlayer(dp, STOC_GAME_MSG, buf, temp_buf - buf);
BufferIO::WriteInt16(pbuf, 0); };
BufferIO::WriteInt16(pbuf, 0);
BufferIO::WriteInt16(pbuf, 0); WriteMsg([&](uint8_t*& pbuf) {
BufferIO::WriteInt16(pbuf, 0); BufferIO::WriteInt8(pbuf, MSG_START);
NetServer::SendBufferToPlayer(dp, STOC_GAME_MSG, startbuf, 19); BufferIO::WriteInt8(pbuf, player);
BufferIO::WriteInt8(pbuf, this->host_info.duel_rule);
BufferIO::WriteInt32(pbuf, this->host_info.start_lp);
BufferIO::WriteInt32(pbuf, this->host_info.start_lp);
BufferIO::WriteInt16(pbuf, 0);
BufferIO::WriteInt16(pbuf, 0);
BufferIO::WriteInt16(pbuf, 0);
BufferIO::WriteInt16(pbuf, 0);
});
int newturn_count = turn_count % 4; uint8_t newturn_count = turn_count % 4;
if(newturn_count == 0) if(newturn_count == 0)
newturn_count = 4; newturn_count = 4;
for(int i = 0; i < newturn_count; i++) { for (uint8_t i = 0; i < newturn_count; ++i) {
unsigned char turnbuf[2], *pbuf_t = turnbuf; WriteMsg([&](uint8_t*& pbuf) {
BufferIO::WriteInt8(pbuf_t, MSG_NEW_TURN); BufferIO::WriteInt8(pbuf, MSG_NEW_TURN);
BufferIO::WriteInt8(pbuf_t, i % 2); BufferIO::WriteInt8(pbuf, i % 2);
NetServer::SendBufferToPlayer(dp, STOC_GAME_MSG, turnbuf, 2); });
} }
unsigned char phasebuf[4], *pbuf_p = phasebuf; WriteMsg([&](uint8_t*& pbuf) {
BufferIO::WriteInt8(pbuf_p, MSG_NEW_PHASE); BufferIO::WriteInt8(pbuf, MSG_NEW_PHASE);
BufferIO::WriteInt16(pbuf_p, phase); BufferIO::WriteInt16(pbuf, this->phase);
NetServer::SendBufferToPlayer(dp, STOC_GAME_MSG, phasebuf, 3); });
WriteMsg([&](uint8_t*& pbuf) {
auto length = query_field_info(this->pduel, pbuf);
pbuf += length;
});
unsigned char query_buffer[1024];
int length = query_field_info(pduel, (unsigned char*)query_buffer);
NetServer::SendBufferToPlayer(dp, STOC_GAME_MSG, query_buffer, length);
RefreshMzone(1 - player, 0xefffff, 0, dp); RefreshMzone(1 - player, 0xefffff, 0, dp);
RefreshMzone(player, 0xefffff, 0, dp); RefreshMzone(player, 0xefffff, 0, dp);
RefreshSzone(1 - player, 0xefffff, 0, dp); RefreshSzone(1 - player, 0xefffff, 0, dp);
...@@ -2054,6 +2071,23 @@ void TagDuel::RequestField(DuelPlayer* dp) { ...@@ -2054,6 +2071,23 @@ void TagDuel::RequestField(DuelPlayer* dp) {
RefreshExtra(player, 0xefffff, 0, dp); RefreshExtra(player, 0xefffff, 0, dp);
RefreshRemoved(1 - player, 0xefffff, 0, dp); RefreshRemoved(1 - player, 0xefffff, 0, dp);
RefreshRemoved(player, 0xefffff, 0, dp); RefreshRemoved(player, 0xefffff, 0, dp);
// send MSG_REVERSE_DECK if deck is reversed
if(deck_reversed) {
WriteMsg([&](uint8_t*& pbuf) {
BufferIO::WriteInt8(pbuf, MSG_REVERSE_DECK);
});
for(uint8_t i = 0; i < 2; ++i) {
WriteMsg([&](uint8_t*& pbuf) {
BufferIO::WriteInt8(pbuf, MSG_DECK_TOP);
BufferIO::WriteInt8(pbuf, i);
BufferIO::WriteInt8(pbuf, 0);
BufferIO::WriteInt32(pbuf, this->deck_top[i]);
});
}
}
/* /*
if(dp == cur_player[last_response]) if(dp == cur_player[last_response])
WaitforResponse(last_response); WaitforResponse(last_response);
......
...@@ -66,10 +66,12 @@ protected: ...@@ -66,10 +66,12 @@ 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
DuelPlayer* cache_recorder; DuelPlayer* cache_recorder{};
DuelPlayer* replay_recorder; DuelPlayer* replay_recorder{};
int turn_player; unsigned char turn_player{ 0 };
int phase; unsigned short phase{ 0 };
bool deck_reversed{ false };
uint32_t deck_top[2]{};
#endif #endif
bool ready[4]; bool ready[4];
bool surrender[4]; bool surrender[4];
...@@ -82,13 +84,12 @@ protected: ...@@ -82,13 +84,12 @@ protected:
short time_limit[2]; short time_limit[2];
short time_elapsed; short time_elapsed;
#ifdef YGOPRO_SERVER_MODE #ifdef YGOPRO_SERVER_MODE
short time_compensator[2]; short time_compensator[2]{};
short time_backed[2]; short time_backed[2]{};
unsigned char last_game_msg; unsigned char last_game_msg{ 0 };
#endif #endif
}; };
} }
#endif //TAG_DUEL_H #endif //TAG_DUEL_H
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