Commit bafac0e1 authored by edo9300's avatar edo9300

Updated replay mode to support relay duel

parent 858ab88e
...@@ -416,6 +416,7 @@ void DuelClient::HandleSTOCPacketLan(char* data, unsigned int len) { ...@@ -416,6 +416,7 @@ void DuelClient::HandleSTOCPacketLan(char* data, unsigned int len) {
mainGame->deckBuilder.pre_extrac = deckManager.current_deck.extra.size(); mainGame->deckBuilder.pre_extrac = deckManager.current_deck.extra.size();
mainGame->deckBuilder.pre_sidec = deckManager.current_deck.side.size(); mainGame->deckBuilder.pre_sidec = deckManager.current_deck.side.size();
mainGame->device->setEventReceiver(&mainGame->deckBuilder); mainGame->device->setEventReceiver(&mainGame->deckBuilder);
mainGame->dInfo.isFirst = mainGame->dInfo.player_type == 0;
mainGame->gMutex.Unlock(); mainGame->gMutex.Unlock();
break; break;
} }
...@@ -3807,13 +3808,7 @@ int DuelClient::ClientAnalyze(char * msg, unsigned int len) { ...@@ -3807,13 +3808,7 @@ int DuelClient::ClientAnalyze(char * msg, unsigned int len) {
return true; return true;
} }
case MSG_TAG_SWAP: { case MSG_TAG_SWAP: {
int player = BufferIO::ReadInt8(pbuf); int player = mainGame->LocalPlayer(BufferIO::ReadInt8(pbuf));
int newp = 0;
if (mainGame->dInfo.isRelay) {
newp = player >> 4;
player = mainGame->LocalPlayer(player & 0xf);
} else
player = mainGame->LocalPlayer(player);
size_t mcount = (size_t)BufferIO::ReadInt8(pbuf); size_t mcount = (size_t)BufferIO::ReadInt8(pbuf);
size_t ecount = (size_t)BufferIO::ReadInt8(pbuf); size_t ecount = (size_t)BufferIO::ReadInt8(pbuf);
size_t pcount = (size_t)BufferIO::ReadInt8(pbuf); size_t pcount = (size_t)BufferIO::ReadInt8(pbuf);
...@@ -3924,7 +3919,7 @@ int DuelClient::ClientAnalyze(char * msg, unsigned int len) { ...@@ -3924,7 +3919,7 @@ int DuelClient::ClientAnalyze(char * msg, unsigned int len) {
mainGame->WaitFrameSignal(5); mainGame->WaitFrameSignal(5);
} }
if(mainGame->dInfo.isRelay) if(mainGame->dInfo.isRelay)
mainGame->dInfo.current_player[player] = newp; mainGame->dInfo.current_player[player]++;
break; break;
} }
case MSG_RELOAD_FIELD: { case MSG_RELOAD_FIELD: {
......
...@@ -387,15 +387,21 @@ bool MenuHandler::OnEvent(const irr::SEvent& event) { ...@@ -387,15 +387,21 @@ bool MenuHandler::OnEvent(const irr::SEvent& event) {
tm* st = localtime(&curtime); tm* st = localtime(&curtime);
myswprintf(infobuf, L"%d/%d/%d %02d:%02d:%02d\n", st->tm_year + 1900, st->tm_mon + 1, st->tm_mday, st->tm_hour, st->tm_min, st->tm_sec); myswprintf(infobuf, L"%d/%d/%d %02d:%02d:%02d\n", st->tm_year + 1900, st->tm_mon + 1, st->tm_mday, st->tm_hour, st->tm_min, st->tm_sec);
repinfo.append(infobuf); repinfo.append(infobuf);
wchar_t namebuf[4][20]; wchar_t namebuf[6][20];
ReplayMode::cur_replay.ReadName(namebuf[0]); ReplayMode::cur_replay.ReadName(namebuf[0]);
ReplayMode::cur_replay.ReadName(namebuf[1]); ReplayMode::cur_replay.ReadName(namebuf[1]);
if(ReplayMode::cur_replay.pheader.flag & REPLAY_TAG) { if(ReplayMode::cur_replay.pheader.flag & (REPLAY_TAG + REPLAY_RELAY)) {
ReplayMode::cur_replay.ReadName(namebuf[2]); ReplayMode::cur_replay.ReadName(namebuf[2]);
ReplayMode::cur_replay.ReadName(namebuf[3]); ReplayMode::cur_replay.ReadName(namebuf[3]);
} }
if(ReplayMode::cur_replay.pheader.flag & REPLAY_RELAY) {
ReplayMode::cur_replay.ReadName(namebuf[4]);
ReplayMode::cur_replay.ReadName(namebuf[5]);
}
if(ReplayMode::cur_replay.pheader.flag & REPLAY_TAG) if(ReplayMode::cur_replay.pheader.flag & REPLAY_TAG)
myswprintf(infobuf, L"%ls\n%ls\n===VS===\n%ls\n%ls\n", namebuf[0], namebuf[1], namebuf[2], namebuf[3]); myswprintf(infobuf, L"%ls\n%ls\n===VS===\n%ls\n%ls\n", namebuf[0], namebuf[1], namebuf[2], namebuf[3]);
else if (ReplayMode::cur_replay.pheader.flag & REPLAY_RELAY)
myswprintf(infobuf, L"%ls\n%ls\n%ls\n===VS===\n%ls\n%ls\n%ls\n", namebuf[0], namebuf[1], namebuf[2], namebuf[3], namebuf[4], namebuf[5]);
else else
myswprintf(infobuf, L"%ls\n===VS===\n%ls\n", namebuf[0], namebuf[1]); myswprintf(infobuf, L"%ls\n===VS===\n%ls\n", namebuf[0], namebuf[1]);
repinfo.append(infobuf); repinfo.append(infobuf);
......
...@@ -18,6 +18,7 @@ namespace ygo { ...@@ -18,6 +18,7 @@ namespace ygo {
const ReplayHeader& rh = cur_replay.pheader; const ReplayHeader& rh = cur_replay.pheader;
mainGame->dInfo.isFirst = true; mainGame->dInfo.isFirst = true;
mainGame->dInfo.isTag = !!(rh.flag & REPLAY_TAG); mainGame->dInfo.isTag = !!(rh.flag & REPLAY_TAG);
mainGame->dInfo.isRelay = !!(rh.flag & REPLAY_RELAY);
mainGame->dInfo.isSingleMode = !!(rh.flag & REPLAY_SINGLE_MODE); mainGame->dInfo.isSingleMode = !!(rh.flag & REPLAY_SINGLE_MODE);
mainGame->dInfo.lua64 = true; mainGame->dInfo.lua64 = true;
mainGame->dInfo.current_player[0] = 0; mainGame->dInfo.current_player[0] = 0;
...@@ -105,13 +106,19 @@ namespace ygo { ...@@ -105,13 +106,19 @@ namespace ygo {
mtrandom rnd; mtrandom rnd;
int seed = rh.seed; int seed = rh.seed;
rnd.reset(seed); rnd.reset(seed);
if (mainGame->dInfo.isTag) { if (mainGame->dInfo.isRelay) {
cur_replay.ReadName(mainGame->dInfo.hostname[0]);
cur_replay.ReadName(mainGame->dInfo.hostname[1]);
cur_replay.ReadName(mainGame->dInfo.hostname[2]);
cur_replay.ReadName(mainGame->dInfo.clientname[0]);
cur_replay.ReadName(mainGame->dInfo.clientname[1]);
cur_replay.ReadName(mainGame->dInfo.clientname[2]);
} else if (mainGame->dInfo.isTag) {
cur_replay.ReadName(mainGame->dInfo.hostname[0]); cur_replay.ReadName(mainGame->dInfo.hostname[0]);
cur_replay.ReadName(mainGame->dInfo.hostname[1]); cur_replay.ReadName(mainGame->dInfo.hostname[1]);
cur_replay.ReadName(mainGame->dInfo.clientname[1]); cur_replay.ReadName(mainGame->dInfo.clientname[1]);
cur_replay.ReadName(mainGame->dInfo.clientname[0]); cur_replay.ReadName(mainGame->dInfo.clientname[0]);
} } else {
else {
cur_replay.ReadName(mainGame->dInfo.hostname[0]); cur_replay.ReadName(mainGame->dInfo.hostname[0]);
cur_replay.ReadName(mainGame->dInfo.clientname[0]); cur_replay.ReadName(mainGame->dInfo.clientname[0]);
} }
......
...@@ -16,7 +16,9 @@ RelayDuel::RelayDuel() { ...@@ -16,7 +16,9 @@ RelayDuel::RelayDuel() {
for (int i = 0; i < 6; i++) for (int i = 0; i < 6; i++)
players[i] = duelist(); players[i] = duelist();
startp[0] = 0; startp[0] = 0;
endp[0] = 3;
startp[1] = 3; startp[1] = 3;
endp[1] = 6;
} }
RelayDuel::~RelayDuel() { RelayDuel::~RelayDuel() {
} }
...@@ -269,6 +271,46 @@ void RelayDuel::StartDuel(DuelPlayer* dp) { ...@@ -269,6 +271,46 @@ void RelayDuel::StartDuel(DuelPlayer* dp) {
if(!((players[0].ready || players[1].ready || players[2].ready) && if(!((players[0].ready || players[1].ready || players[2].ready) &&
(players[3].ready || players[4].ready || players[5].ready))) (players[3].ready || players[4].ready || players[5].ready)))
return; return;
for (int i = 0; i < 3; i++)
if (!players[i].player) {
endp[0]--;
for (int j = i + 1; j < 3; j++)
if (players[j].player) {
STOC_HS_PlayerChange scpc;
scpc.status = (j << 4) | i;
for (int k = 0; k < 6; k++)
if (players[k].player)
NetServer::SendPacketToPlayer(players[k].player, STOC_HS_PLAYER_CHANGE, scpc);
for (auto pit = observers.begin(); pit != observers.end(); ++pit)
NetServer::SendPacketToPlayer(*pit, STOC_HS_PLAYER_CHANGE, scpc);
STOC_TypeChange sctc;
sctc.type = (players[j].player == host_player ? 0x10 : 0) | i;
NetServer::SendPacketToPlayer(players[j].player, STOC_TYPE_CHANGE, sctc);
players[i] = players[j];
players[j] = duelist();
players[i].player->type = i;
}
}
for (int i = 3; i < 6; i++)
if (!players[i].player) {
endp[1]--;
for (int j = i + 1; j < 6; j++)
if (players[j].player) {
STOC_HS_PlayerChange scpc;
scpc.status = (j << 4) | i;
for (int k = 0; k < 6; k++)
if (players[k].player)
NetServer::SendPacketToPlayer(players[k].player, STOC_HS_PLAYER_CHANGE, scpc);
for (auto pit = observers.begin(); pit != observers.end(); ++pit)
NetServer::SendPacketToPlayer(*pit, STOC_HS_PLAYER_CHANGE, scpc);
STOC_TypeChange sctc;
sctc.type = (players[j].player == host_player ? 0x10 : 0) | i;
NetServer::SendPacketToPlayer(players[j].player, STOC_TYPE_CHANGE, sctc);
players[i] = players[j];
players[j] = duelist();
players[i].player->type = i;
}
}
NetServer::StopListen(); NetServer::StopListen();
game_started = true; game_started = true;
//NetServer::StopBroadcast(); //NetServer::StopBroadcast();
...@@ -279,12 +321,6 @@ void RelayDuel::StartDuel(DuelPlayer* dp) { ...@@ -279,12 +321,6 @@ void RelayDuel::StartDuel(DuelPlayer* dp) {
(*oit)->state = CTOS_LEAVE_GAME; (*oit)->state = CTOS_LEAVE_GAME;
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayer(*oit);
} }
for (startp[0] = 0; startp[0] < 3; startp[0]++)
if (players[startp[0]].player)
break;
for (startp[1] = 3; startp[1] < 5; startp[1]++)
if (players[startp[1]].player)
break;
NetServer::SendPacketToPlayer(players[startp[0]].player, STOC_SELECT_HAND); NetServer::SendPacketToPlayer(players[startp[0]].player, STOC_SELECT_HAND);
NetServer::ReSendToPlayer(players[startp[1]].player); NetServer::ReSendToPlayer(players[startp[1]].player);
hand_result[0] = 0; hand_result[0] = 0;
...@@ -346,10 +382,6 @@ void RelayDuel::TPResult(DuelPlayer* dp, unsigned char tp) { ...@@ -346,10 +382,6 @@ void RelayDuel::TPResult(DuelPlayer* dp, unsigned char tp) {
if(players[i].player) if(players[i].player)
players[i].player->type = i; players[i].player->type = i;
swapped = true; swapped = true;
int starttmp0 = startp[1] - 3;
int starttmp1 = startp[0] + 3;
startp[0] = starttmp0;
startp[1] = starttmp1;
} }
turn_count = 0; turn_count = 0;
cur_player[0] = players[startp[0]].player; cur_player[0] = players[startp[0]].player;
...@@ -358,7 +390,7 @@ void RelayDuel::TPResult(DuelPlayer* dp, unsigned char tp) { ...@@ -358,7 +390,7 @@ void RelayDuel::TPResult(DuelPlayer* dp, unsigned char tp) {
ReplayHeader rh; ReplayHeader rh;
rh.id = 0x31707279; rh.id = 0x31707279;
rh.version = PRO_VERSION; rh.version = PRO_VERSION;
rh.flag = REPLAY_TAG + REPLAY_LUA64; rh.flag = REPLAY_RELAY + REPLAY_LUA64;
time_t seed = time(0); time_t seed = time(0);
rh.seed = seed; rh.seed = seed;
last_replay.BeginRecord(false); last_replay.BeginRecord(false);
...@@ -369,10 +401,15 @@ void RelayDuel::TPResult(DuelPlayer* dp, unsigned char tp) { ...@@ -369,10 +401,15 @@ void RelayDuel::TPResult(DuelPlayer* dp, unsigned char tp) {
rh.id = 0x58707279; rh.id = 0x58707279;
rh.flag |= REPLAY_NEWREPLAY; rh.flag |= REPLAY_NEWREPLAY;
new_replay.WriteHeader(rh); new_replay.WriteHeader(rh);
unsigned short tmp[20];
BufferIO::CopyWStr(L"", tmp, 20);
for (int i = 0; i < 6; i++) for (int i = 0; i < 6; i++)
if (players[i].player->name) { if (players[i].player) {
last_replay.WriteData(players[i].player->name, 40, false); last_replay.WriteData(players[i].player->name, 40, false);
new_replay.WriteData(players[i].player->name, 40, false); new_replay.WriteData(players[i].player->name, 40, false);
} else {
last_replay.WriteData(tmp, 40, false);
new_replay.WriteData(tmp, 40, false);
} }
replay_stream.clear(); replay_stream.clear();
if(!host_info.no_shuffle_deck) { if(!host_info.no_shuffle_deck) {
...@@ -1494,22 +1531,12 @@ int RelayDuel::Analyze(char* msgbuffer, unsigned int len) { ...@@ -1494,22 +1531,12 @@ int RelayDuel::Analyze(char* msgbuffer, unsigned int len) {
break; break;
} }
case MSG_TAG_SWAP: { case MSG_TAG_SWAP: {
pbufw = pbuf;
player = BufferIO::ReadInt8(pbuf); player = BufferIO::ReadInt8(pbuf);
int newp = 0;
for (int i = startp[player]; i < (player == 0) ? 3 : 6; i++)
if (players[i].player == cur_player[player]) {
for (newp = i + 1; newp < (player == 0) ? 3 : 6; newp++)
if (players[newp].player)
break;
break;
}
BufferIO::WriteInt8(pbufw, player + (newp << 4));
/*int mcount = */BufferIO::ReadInt8(pbuf); /*int mcount = */BufferIO::ReadInt8(pbuf);
int ecount = BufferIO::ReadInt8(pbuf); int ecount = BufferIO::ReadInt8(pbuf);
/*int pcount = */BufferIO::ReadInt8(pbuf); /*int pcount = */BufferIO::ReadInt8(pbuf);
int hcount = BufferIO::ReadInt8(pbuf); int hcount = BufferIO::ReadInt8(pbuf);
pbufw += 4; pbufw = pbuf + 4;
pbuf += hcount * 4 + ecount * 4 + 4; pbuf += hcount * 4 + ecount * 4 + 4;
for (int p = player * 3, i = 0; i < 3; i++, p++) for (int p = player * 3, i = 0; i < 3; i++, p++)
if (players[p].player) if (players[p].player)
...@@ -1531,16 +1558,15 @@ int RelayDuel::Analyze(char* msgbuffer, unsigned int len) { ...@@ -1531,16 +1558,15 @@ int RelayDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::SendBufferToPlayer(players[p].player, STOC_GAME_MSG, offset, pbuf - offset); NetServer::SendBufferToPlayer(players[p].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 (int i = startp[player]; i < (player == 0) ? 3 : 6; i++) for (int i = startp[player]; i < endp[player]; i++)
if (players[i].player == cur_player[player]) { if (players[i].player == cur_player[player]) {
for (int j = i + 1; j < (player == 0) ? 3 : 6; j++) for (int j = i + 1; j < endp[player]; j++)
if (players[j].player) { if (players[j].player) {
cur_player[player] = players[j].player; cur_player[player] = players[j].player;
break; break;
} }
break; break;
} }
cur_player[player] = players[newp].player;
PseudoRefreshDeck(player); PseudoRefreshDeck(player);
RefreshExtra(player); RefreshExtra(player);
RefreshMzone(0, 0x81fff, 0); RefreshMzone(0, 0x81fff, 0);
...@@ -1655,7 +1681,7 @@ void RelayDuel::RefreshMzone(int player, int flag, int use_cache) { ...@@ -1655,7 +1681,7 @@ void RelayDuel::RefreshMzone(int player, int flag, int use_cache) {
NetServer::SendBufferToPlayer(players[pid].player, STOC_GAME_MSG, query_buffer, len + 3); NetServer::SendBufferToPlayer(players[pid].player, STOC_GAME_MSG, query_buffer, len + 3);
ReplayPacket p((char*)query_buffer, len + 2); ReplayPacket p((char*)query_buffer, len + 2);
replay_stream.push_back(p); replay_stream.push_back(p);
for (int i = pid + 1; i < player * 3 + 3; i++) for (int i = pid + 1; i < endp[player]; i++)
if(players[i].player) if(players[i].player)
NetServer::ReSendToPlayer(players[i].player); NetServer::ReSendToPlayer(players[i].player);
int qlen = 0; int qlen = 0;
...@@ -1670,7 +1696,7 @@ void RelayDuel::RefreshMzone(int player, int flag, int use_cache) { ...@@ -1670,7 +1696,7 @@ void RelayDuel::RefreshMzone(int player, int flag, int use_cache) {
} }
pid = startp[1 - player]; pid = startp[1 - player];
NetServer::SendBufferToPlayer(players[pid].player, STOC_GAME_MSG, query_buffer, len + 3); NetServer::SendBufferToPlayer(players[pid].player, STOC_GAME_MSG, query_buffer, len + 3);
for (int i = pid + 1; i < (1 - player) * 3 + 3; i++) for (int i = pid + 1; i < endp[1 - player]; i++)
if (players[i].player) if (players[i].player)
NetServer::ReSendToPlayer(players[i].player); NetServer::ReSendToPlayer(players[i].player);
for(auto pit = observers.begin(); pit != observers.end(); ++pit) for(auto pit = observers.begin(); pit != observers.end(); ++pit)
...@@ -1687,7 +1713,7 @@ void RelayDuel::RefreshSzone(int player, int flag, int use_cache) { ...@@ -1687,7 +1713,7 @@ void RelayDuel::RefreshSzone(int player, int flag, int use_cache) {
NetServer::SendBufferToPlayer(players[pid].player, STOC_GAME_MSG, query_buffer, len + 3); NetServer::SendBufferToPlayer(players[pid].player, STOC_GAME_MSG, query_buffer, len + 3);
ReplayPacket p((char*)query_buffer, len + 2); ReplayPacket p((char*)query_buffer, len + 2);
replay_stream.push_back(p); replay_stream.push_back(p);
for (int i = pid + 1; i < player * 3 + 3; i++) for (int i = pid + 1; i < endp[player]; i++)
if(players[i].player) if(players[i].player)
NetServer::ReSendToPlayer(players[i].player); NetServer::ReSendToPlayer(players[i].player);
int qlen = 0; int qlen = 0;
...@@ -1702,7 +1728,7 @@ void RelayDuel::RefreshSzone(int player, int flag, int use_cache) { ...@@ -1702,7 +1728,7 @@ void RelayDuel::RefreshSzone(int player, int flag, int use_cache) {
} }
pid = startp[1 - player]; pid = startp[1 - player];
NetServer::SendBufferToPlayer(players[pid].player, STOC_GAME_MSG, query_buffer, len + 3); NetServer::SendBufferToPlayer(players[pid].player, STOC_GAME_MSG, query_buffer, len + 3);
for (int i = pid + 1; i < (1 - player) * 3 + 3; i++) for (int i = pid + 1; i < endp[1 - player]; i++)
if (players[i].player) if (players[i].player)
NetServer::ReSendToPlayer(players[i].player); NetServer::ReSendToPlayer(players[i].player);
for(auto pit = observers.begin(); pit != observers.end(); ++pit) for(auto pit = observers.begin(); pit != observers.end(); ++pit)
...@@ -1778,12 +1804,11 @@ void RelayDuel::RefreshSingle(int player, int location, int sequence, int flag) ...@@ -1778,12 +1804,11 @@ void RelayDuel::RefreshSingle(int player, int location, int sequence, int flag)
if(location & LOCATION_ONFIELD) { if(location & LOCATION_ONFIELD) {
int pid = startp[player]; int pid = startp[player];
NetServer::SendBufferToPlayer(players[pid].player, STOC_GAME_MSG, query_buffer, len + 4); NetServer::SendBufferToPlayer(players[pid].player, STOC_GAME_MSG, query_buffer, len + 4);
for (int i = pid + 1; i < player * 3 + 3; i++) for (int i = pid + 1; i < endp[player]; i++)
if (players[i].player) if (players[i].player)
NetServer::ReSendToPlayer(players[i].player); NetServer::ReSendToPlayer(players[i].player);
if(qbuf[15] & POS_FACEUP) { if(qbuf[15] & POS_FACEUP) {
pid = startp[1 - player]; for (int i = startp[1 - player]; i < endp[1 - player]; i++)
for (int i = pid; i < (1 - player) * 3 + 3; i++)
if (players[i].player) if (players[i].player)
NetServer::ReSendToPlayer(players[i].player); NetServer::ReSendToPlayer(players[i].player);
for(auto pit = observers.begin(); pit != observers.end(); ++pit) for(auto pit = observers.begin(); pit != observers.end(); ++pit)
...@@ -1792,7 +1817,7 @@ void RelayDuel::RefreshSingle(int player, int location, int sequence, int flag) ...@@ -1792,7 +1817,7 @@ void RelayDuel::RefreshSingle(int player, int location, int sequence, int flag)
} else { } else {
int pid = startp[player]; int pid = startp[player];
NetServer::SendBufferToPlayer(players[pid].player, STOC_GAME_MSG, query_buffer, len + 4); NetServer::SendBufferToPlayer(players[pid].player, STOC_GAME_MSG, query_buffer, len + 4);
for (int i = pid + 1; i < player * 3 + 3; i++) for (int i = pid + 1; i < endp[player]; i++)
if (players[i].player) if (players[i].player)
NetServer::ReSendToPlayer(players[i].player); NetServer::ReSendToPlayer(players[i].player);
if(location == LOCATION_REMOVED && (qbuf[15] & POS_FACEDOWN)) if(location == LOCATION_REMOVED && (qbuf[15] & POS_FACEDOWN))
......
...@@ -56,6 +56,7 @@ protected: ...@@ -56,6 +56,7 @@ protected:
}; };
duelist players[6]; duelist players[6];
unsigned char startp[2]; unsigned char startp[2];
unsigned char endp[2];
DuelPlayer* cur_player[2]; DuelPlayer* cur_player[2];
std::set<DuelPlayer*> observers; std::set<DuelPlayer*> observers;
unsigned char hand_result[2]; unsigned char hand_result[2];
......
...@@ -296,7 +296,7 @@ void Replay::Rewind() { ...@@ -296,7 +296,7 @@ void Replay::Rewind() {
bool Replay::LoadYrp() { bool Replay::LoadYrp() {
if (pheader.flag & REPLAY_NEWREPLAY) { if (pheader.flag & REPLAY_NEWREPLAY) {
pdata += (4 + ((pheader.flag & REPLAY_TAG) ? 160 : 80)); pdata += (4 + ((pheader.flag & REPLAY_RELAY) ? 240 : (pheader.flag & REPLAY_TAG) ? 160 : 80));
ReplayPacket p; ReplayPacket p;
while (ReadNextPacket(&p)) while (ReadNextPacket(&p))
if (p.message == OLD_REPLAY_MODE) { if (p.message == OLD_REPLAY_MODE) {
......
...@@ -12,6 +12,7 @@ namespace ygo { ...@@ -12,6 +12,7 @@ namespace ygo {
#define REPLAY_SINGLE_MODE 0x8 #define REPLAY_SINGLE_MODE 0x8
#define REPLAY_LUA64 0x10 #define REPLAY_LUA64 0x10
#define REPLAY_NEWREPLAY 0x20 #define REPLAY_NEWREPLAY 0x20
#define REPLAY_RELAY 0x40
struct ReplayHeader { struct ReplayHeader {
unsigned int id; unsigned int id;
......
...@@ -60,17 +60,24 @@ int ReplayMode::ReplayThread(void* param) { ...@@ -60,17 +60,24 @@ int ReplayMode::ReplayThread(void* param) {
const ReplayHeader& rh = cur_replay.pheader; const ReplayHeader& rh = cur_replay.pheader;
mainGame->dInfo.isFirst = true; mainGame->dInfo.isFirst = true;
mainGame->dInfo.isTag = !!(rh.flag & REPLAY_TAG); mainGame->dInfo.isTag = !!(rh.flag & REPLAY_TAG);
mainGame->dInfo.isRelay = !!(rh.flag & REPLAY_RELAY);
mainGame->dInfo.isSingleMode = !!(rh.flag & REPLAY_SINGLE_MODE); mainGame->dInfo.isSingleMode = !!(rh.flag & REPLAY_SINGLE_MODE);
mainGame->dInfo.lua64 = !!(rh.flag & REPLAY_LUA64); mainGame->dInfo.lua64 = !!(rh.flag & REPLAY_LUA64);
mainGame->dInfo.current_player[0] = 0; mainGame->dInfo.current_player[0] = 0;
mainGame->dInfo.current_player[1] = 0; mainGame->dInfo.current_player[1] = 0;
if (mainGame->dInfo.isTag) { if (mainGame->dInfo.isRelay) {
cur_replay.ReadName(mainGame->dInfo.hostname[0]);
cur_replay.ReadName(mainGame->dInfo.hostname[1]);
cur_replay.ReadName(mainGame->dInfo.hostname[2]);
cur_replay.ReadName(mainGame->dInfo.clientname[0]);
cur_replay.ReadName(mainGame->dInfo.clientname[1]);
cur_replay.ReadName(mainGame->dInfo.clientname[2]);
} else if (mainGame->dInfo.isTag) {
cur_replay.ReadName(mainGame->dInfo.hostname[0]); cur_replay.ReadName(mainGame->dInfo.hostname[0]);
cur_replay.ReadName(mainGame->dInfo.hostname[1]); cur_replay.ReadName(mainGame->dInfo.hostname[1]);
cur_replay.ReadName(mainGame->dInfo.clientname[1]); cur_replay.ReadName(mainGame->dInfo.clientname[1]);
cur_replay.ReadName(mainGame->dInfo.clientname[0]); cur_replay.ReadName(mainGame->dInfo.clientname[0]);
} } else {
else {
cur_replay.ReadName(mainGame->dInfo.hostname[0]); cur_replay.ReadName(mainGame->dInfo.hostname[0]);
cur_replay.ReadName(mainGame->dInfo.clientname[0]); cur_replay.ReadName(mainGame->dInfo.clientname[0]);
} }
......
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