Commit 19c16c27 authored by wind2009's avatar wind2009

Merge remote-tracking branch '233/patch-tag-surrender' into server-develop

parents 79f36bf4 df19eabe
...@@ -117,6 +117,8 @@ void ClientField::Clear() { ...@@ -117,6 +117,8 @@ void ClientField::Clear() {
conti_act = false; conti_act = false;
deck_reversed = false; deck_reversed = false;
cant_check_grave = false; cant_check_grave = false;
tag_surrender = false;
tag_teammate_surrender = false;
} }
void ClientField::Initial(int player, int deckc, int extrac) { void ClientField::Initial(int player, int deckc, int extrac) {
ClientCard* pcard; ClientCard* pcard;
......
...@@ -85,6 +85,8 @@ public: ...@@ -85,6 +85,8 @@ public:
bool deck_reversed{ false }; bool deck_reversed{ false };
bool conti_selecting{ false }; bool conti_selecting{ false };
bool cant_check_grave{ false }; bool cant_check_grave{ false };
bool tag_surrender{ false };
bool tag_teammate_surrender{ false };
mt19937 rnd; mt19937 rnd;
ClientField(); ClientField();
......
...@@ -520,6 +520,8 @@ void Game::DrawMisc() { ...@@ -520,6 +520,8 @@ void Game::DrawMisc() {
//finish button //finish button
if(btnCancelOrFinish->isVisible() && dField.select_ready) if(btnCancelOrFinish->isVisible() && dField.select_ready)
DrawSelectionLine(btnCancelOrFinish, 2, 0xffffff00); DrawSelectionLine(btnCancelOrFinish, 2, 0xffffff00);
if(btnLeaveGame->isVisible() && dField.tag_teammate_surrender)
DrawSelectionLine(btnLeaveGame, 2, 0xffffff00);
//lp bar //lp bar
if((dInfo.turn % 2 && dInfo.isFirst) || (!(dInfo.turn % 2) && !dInfo.isFirst)) { if((dInfo.turn % 2 && dInfo.isFirst) || (!(dInfo.turn % 2) && !dInfo.isFirst)) {
driver->draw2DRectangle(0xa0000000, Resize(327, 8, 630, 51)); driver->draw2DRectangle(0xa0000000, Resize(327, 8, 630, 51));
......
...@@ -631,7 +631,7 @@ void DuelClient::HandleSTOCPacketLan(unsigned char* data, unsigned int len) { ...@@ -631,7 +631,7 @@ void DuelClient::HandleSTOCPacketLan(unsigned char* data, unsigned int len) {
} }
} else { } else {
if(selftype > 3) { if(selftype > 3) {
mainGame->dInfo.player_type = 7; mainGame->dInfo.player_type = NETPLAYER_TYPE_OBSERVER;
mainGame->btnLeaveGame->setText(dataManager.GetSysString(1350)); mainGame->btnLeaveGame->setText(dataManager.GetSysString(1350));
mainGame->btnLeaveGame->setVisible(true); mainGame->btnLeaveGame->setVisible(true);
mainGame->btnSpectatorSwap->setVisible(true); mainGame->btnSpectatorSwap->setVisible(true);
...@@ -877,6 +877,11 @@ void DuelClient::HandleSTOCPacketLan(unsigned char* data, unsigned int len) { ...@@ -877,6 +877,11 @@ void DuelClient::HandleSTOCPacketLan(unsigned char* data, unsigned int len) {
mainGame->gMutex.unlock(); mainGame->gMutex.unlock();
break; break;
} }
case STOC_TEAMMATE_SURRENDER: {
if(!mainGame->dField.tag_surrender)
mainGame->dField.tag_teammate_surrender = true;
mainGame->btnLeaveGame->setText(dataManager.GetSysString(1355));
}
} }
} }
// Analyze STOC_GAME_MSG packet // Analyze STOC_GAME_MSG packet
...@@ -2433,7 +2438,9 @@ int DuelClient::ClientAnalyze(unsigned char* msg, unsigned int len) { ...@@ -2433,7 +2438,9 @@ int DuelClient::ClientAnalyze(unsigned char* msg, unsigned int len) {
case MSG_NEW_TURN: { case MSG_NEW_TURN: {
int player = mainGame->LocalPlayer(BufferIO::ReadUInt8(pbuf)); int player = mainGame->LocalPlayer(BufferIO::ReadUInt8(pbuf));
mainGame->dInfo.turn++; mainGame->dInfo.turn++;
if(!mainGame->dInfo.isTag && !mainGame->dInfo.isReplay && mainGame->dInfo.player_type < 7) { if(!mainGame->dInfo.isReplay && mainGame->dInfo.player_type < 7) {
mainGame->dField.tag_surrender = false;
mainGame->dField.tag_teammate_surrender = false;
mainGame->btnLeaveGame->setText(dataManager.GetSysString(1351)); mainGame->btnLeaveGame->setText(dataManager.GetSysString(1351));
mainGame->btnLeaveGame->setVisible(true); mainGame->btnLeaveGame->setVisible(true);
} }
......
...@@ -143,7 +143,8 @@ bool ClientField::OnEvent(const irr::SEvent& event) { ...@@ -143,7 +143,8 @@ bool ClientField::OnEvent(const irr::SEvent& event) {
if(exit_on_return) if(exit_on_return)
mainGame->device->closeDevice(); mainGame->device->closeDevice();
} else { } else {
mainGame->PopupElement(mainGame->wSurrender); if(!(mainGame->dInfo.isTag && mainGame->dField.tag_surrender))
mainGame->PopupElement(mainGame->wSurrender);
} }
break; break;
} }
...@@ -151,10 +152,12 @@ bool ClientField::OnEvent(const irr::SEvent& event) { ...@@ -151,10 +152,12 @@ bool ClientField::OnEvent(const irr::SEvent& event) {
soundManager.PlaySoundEffect(SOUND_BUTTON); soundManager.PlaySoundEffect(SOUND_BUTTON);
DuelClient::SendPacketToServer(CTOS_SURRENDER); DuelClient::SendPacketToServer(CTOS_SURRENDER);
mainGame->HideElement(mainGame->wSurrender); mainGame->HideElement(mainGame->wSurrender);
mainGame->dField.tag_surrender = true;
break; break;
} }
case BUTTON_SURRENDER_NO: { case BUTTON_SURRENDER_NO: {
soundManager.PlaySoundEffect(SOUND_BUTTON); soundManager.PlaySoundEffect(SOUND_BUTTON);
mainGame->dField.tag_teammate_surrender = false;
mainGame->HideElement(mainGame->wSurrender); mainGame->HideElement(mainGame->wSurrender);
break; break;
} }
......
...@@ -200,6 +200,7 @@ public: ...@@ -200,6 +200,7 @@ public:
#define STOC_HS_PLAYER_ENTER 0x20 #define STOC_HS_PLAYER_ENTER 0x20
#define STOC_HS_PLAYER_CHANGE 0x21 #define STOC_HS_PLAYER_CHANGE 0x21
#define STOC_HS_WATCH_CHANGE 0x22 #define STOC_HS_WATCH_CHANGE 0x22
#define STOC_TEAMMATE_SURRENDER 0x23
#ifdef YGOPRO_SERVER_MODE #ifdef YGOPRO_SERVER_MODE
#define STOC_FIELD_FINISH 0x30 #define STOC_FIELD_FINISH 0x30
#endif #endif
......
...@@ -14,6 +14,7 @@ TagDuel::TagDuel() { ...@@ -14,6 +14,7 @@ TagDuel::TagDuel() {
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;
surrender[i] = false;
} }
#ifdef YGOPRO_SERVER_MODE #ifdef YGOPRO_SERVER_MODE
cache_recorder = 0; cache_recorder = 0;
...@@ -675,7 +676,33 @@ void TagDuel::DuelEndProc() { ...@@ -675,7 +676,33 @@ void TagDuel::DuelEndProc() {
#endif #endif
} }
void TagDuel::Surrender(DuelPlayer* dp) { void TagDuel::Surrender(DuelPlayer* dp) {
return; if(dp->type > 3 || !pduel)
return;
uint32 player = dp->type;
if(surrender[player])
return;
static const uint32 teammatemap[] = { 1, 0, 3, 2 };
uint32 teammate = teammatemap[player];
if(!surrender[teammate]) {
surrender[player] = true;
NetServer::SendPacketToPlayer(players[player], STOC_TEAMMATE_SURRENDER);
NetServer::SendPacketToPlayer(players[teammate], STOC_TEAMMATE_SURRENDER);
return;
}
static const uint32 winplayermap[] = { 1, 1, 0, 0 };
unsigned char wbuf[3];
wbuf[0] = MSG_WIN;
wbuf[1] = winplayermap[player];
wbuf[2] = 0;
NetServer::SendBufferToPlayer(players[0], STOC_GAME_MSG, wbuf, 3);
NetServer::ReSendToPlayer(players[1]);
NetServer::ReSendToPlayer(players[2]);
NetServer::ReSendToPlayer(players[3]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
EndDuel();
DuelEndProc();
event_del(etimer);
} }
int TagDuel::Analyze(unsigned char* msgbuffer, unsigned int len) { int TagDuel::Analyze(unsigned char* msgbuffer, unsigned int len) {
unsigned char* offset, *pbufw, *pbuf = msgbuffer; unsigned char* offset, *pbufw, *pbuf = msgbuffer;
...@@ -1120,6 +1147,9 @@ int TagDuel::Analyze(unsigned char* msgbuffer, unsigned int len) { ...@@ -1120,6 +1147,9 @@ int TagDuel::Analyze(unsigned char* msgbuffer, unsigned int len) {
} }
} }
turn_count++; turn_count++;
for(int i = 0; i < 4; ++i) {
surrender[i] = false;
}
break; break;
} }
case MSG_NEW_PHASE: { case MSG_NEW_PHASE: {
......
...@@ -68,6 +68,7 @@ protected: ...@@ -68,6 +68,7 @@ protected:
int phase; int phase;
#endif #endif
bool ready[4]; bool ready[4];
bool surrender[4];
Deck pdeck[4]; Deck pdeck[4];
int deck_error[4]; int deck_error[4];
unsigned char hand_result[2]; unsigned char hand_result[2];
......
...@@ -404,6 +404,7 @@ ...@@ -404,6 +404,7 @@
!system 1352 主要信息: !system 1352 主要信息:
!system 1353 播放起始于回合: !system 1353 播放起始于回合:
!system 1354 开局默认显示所有时点 !system 1354 开局默认显示所有时点
!system 1355 投降(1/2)
!system 1356 此操作将放弃对当前卡组的修改,是否继续? !system 1356 此操作将放弃对当前卡组的修改,是否继续?
!system 1357 不提示保留对卡组的修改 !system 1357 不提示保留对卡组的修改
!system 1358 键入关键字后自动进行搜索 !system 1358 键入关键字后自动进行搜索
...@@ -664,7 +665,7 @@ ...@@ -664,7 +665,7 @@
!setname 0x2 次世代 ジェネクス !setname 0x2 次世代 ジェネクス
!setname 0x1002 真次世代 レアル·ジェネクス !setname 0x1002 真次世代 レアル·ジェネクス
#!setname 0x2002 盟军·次世代 A・ジェネクス #!setname 0x2002 盟军·次世代 A・ジェネクス
#setname 0x3 N/A !setname 0x3 魅惑的女王 魅惑の女王
!setname 0x4 亚马逊 アマゾネス !setname 0x4 亚马逊 アマゾネス
!setname 0x5 秘仪之力 アルカナフォース !setname 0x5 秘仪之力 アルカナフォース
!setname 0x6 暗黑界 暗黒界 !setname 0x6 暗黑界 暗黒界
......
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