Commit 0a7a4745 authored by mercury233's avatar mercury233 Committed by GitHub

add STOC_TEAMMATE_SURRENDER (#2548)

parent 2e0af898
......@@ -117,6 +117,8 @@ void ClientField::Clear() {
conti_act = false;
deck_reversed = false;
cant_check_grave = false;
tag_surrender = false;
tag_teammate_surrender = false;
}
void ClientField::Initial(int player, int deckc, int extrac) {
ClientCard* pcard;
......
......@@ -85,6 +85,8 @@ public:
bool deck_reversed{ false };
bool conti_selecting{ false };
bool cant_check_grave{ false };
bool tag_surrender{ false };
bool tag_teammate_surrender{ false };
mt19937 rnd;
ClientField();
......
......@@ -520,6 +520,8 @@ void Game::DrawMisc() {
//finish button
if(btnCancelOrFinish->isVisible() && dField.select_ready)
DrawSelectionLine(btnCancelOrFinish, 2, 0xffffff00);
if(btnLeaveGame->isVisible() && dField.tag_teammate_surrender)
DrawSelectionLine(btnLeaveGame, 2, 0xffffff00);
//lp bar
if((dInfo.turn % 2 && dInfo.isFirst) || (!(dInfo.turn % 2) && !dInfo.isFirst)) {
driver->draw2DRectangle(0xa0000000, Resize(327, 8, 630, 51));
......
......@@ -631,7 +631,7 @@ void DuelClient::HandleSTOCPacketLan(unsigned char* data, unsigned int len) {
}
} else {
if(selftype > 3) {
mainGame->dInfo.player_type = 7;
mainGame->dInfo.player_type = NETPLAYER_TYPE_OBSERVER;
mainGame->btnLeaveGame->setText(dataManager.GetSysString(1350));
mainGame->btnLeaveGame->setVisible(true);
mainGame->btnSpectatorSwap->setVisible(true);
......@@ -877,6 +877,11 @@ void DuelClient::HandleSTOCPacketLan(unsigned char* data, unsigned int len) {
mainGame->gMutex.unlock();
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
......@@ -2433,7 +2438,9 @@ int DuelClient::ClientAnalyze(unsigned char* msg, unsigned int len) {
case MSG_NEW_TURN: {
int player = mainGame->LocalPlayer(BufferIO::ReadUInt8(pbuf));
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->setVisible(true);
}
......
......@@ -143,7 +143,8 @@ bool ClientField::OnEvent(const irr::SEvent& event) {
if(exit_on_return)
mainGame->device->closeDevice();
} else {
mainGame->PopupElement(mainGame->wSurrender);
if(!(mainGame->dInfo.isTag && mainGame->dField.tag_surrender))
mainGame->PopupElement(mainGame->wSurrender);
}
break;
}
......@@ -151,10 +152,12 @@ bool ClientField::OnEvent(const irr::SEvent& event) {
soundManager.PlaySoundEffect(SOUND_BUTTON);
DuelClient::SendPacketToServer(CTOS_SURRENDER);
mainGame->HideElement(mainGame->wSurrender);
mainGame->dField.tag_surrender = true;
break;
}
case BUTTON_SURRENDER_NO: {
soundManager.PlaySoundEffect(SOUND_BUTTON);
mainGame->dField.tag_teammate_surrender = false;
mainGame->HideElement(mainGame->wSurrender);
break;
}
......
......@@ -194,6 +194,7 @@ public:
#define STOC_HS_PLAYER_ENTER 0x20
#define STOC_HS_PLAYER_CHANGE 0x21
#define STOC_HS_WATCH_CHANGE 0x22
#define STOC_TEAMMATE_SURRENDER 0x23
#define PLAYERCHANGE_OBSERVE 0x8
#define PLAYERCHANGE_READY 0x9
......
......@@ -11,6 +11,7 @@ TagDuel::TagDuel() {
for(int i = 0; i < 4; ++i) {
players[i] = 0;
ready[i] = false;
surrender[i] = false;
}
}
TagDuel::~TagDuel() {
......@@ -520,7 +521,33 @@ void TagDuel::DuelEndProc() {
duel_stage = DUEL_STAGE_END;
}
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) {
unsigned char* offset, *pbufw, *pbuf = msgbuffer;
......@@ -904,6 +931,9 @@ int TagDuel::Analyze(unsigned char* msgbuffer, unsigned int len) {
}
}
turn_count++;
for(int i = 0; i < 4; ++i) {
surrender[i] = false;
}
break;
}
case MSG_NEW_PHASE: {
......
......@@ -50,6 +50,7 @@ protected:
DuelPlayer* cur_player[2];
std::set<DuelPlayer*> observers;
bool ready[4];
bool surrender[4];
Deck pdeck[4];
int deck_error[4];
unsigned char hand_result[2];
......
......@@ -404,6 +404,7 @@
!system 1352 主要信息:
!system 1353 播放起始于回合:
!system 1354 开局默认显示所有时点
!system 1355 投降(1/2)
!system 1356 此操作将放弃对当前卡组的修改,是否继续?
!system 1357 不提示保留对卡组的修改
!system 1358 键入关键字后自动进行搜索
......
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