Commit 0409539c authored by fallenstardust's avatar fallenstardust

双打投降

parent 0bb17bb0
...@@ -129,6 +129,8 @@ void ClientField::Clear() { ...@@ -129,6 +129,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;
......
...@@ -89,6 +89,8 @@ public: ...@@ -89,6 +89,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();
......
...@@ -522,6 +522,8 @@ void Game::DrawMisc() { ...@@ -522,6 +522,8 @@ void Game::DrawMisc() {
//finish button //finish button
if(btnCancelOrFinish->isVisible() && dField.select_ready) if(btnCancelOrFinish->isVisible() && dField.select_ready)
DrawSelectionLine(btnCancelOrFinish, 4, 0xff00ff00); DrawSelectionLine(btnCancelOrFinish, 4, 0xff00ff00);
if(btnLeaveGame->isVisible() && dField.tag_teammate_surrender)
DrawSelectionLine(btnLeaveGame, 4, 0xff00ff00);
//lp bar //lp bar
//driver->draw2DImage(imageManager.tLPFrame, recti(400 * mainGame->xScale, 10 * mainGame->yScale, 629 * mainGame->xScale, 30 * mainGame->yScale), recti(0, 0, 200, 20), 0, 0, true); //driver->draw2DImage(imageManager.tLPFrame, recti(400 * mainGame->xScale, 10 * mainGame->yScale, 629 * mainGame->xScale, 30 * mainGame->yScale), recti(0, 0, 200, 20), 0, 0, true);
//driver->draw2DImage(imageManager.tLPFrame, recti(691 * mainGame->xScale, 10 * mainGame->yScale, 920 * mainGame->xScale, 30 * mainGame->yScale), recti(0, 0, 200, 20), 0, 0, true); //driver->draw2DImage(imageManager.tLPFrame, recti(691 * mainGame->xScale, 10 * mainGame->yScale, 920 * mainGame->xScale, 30 * mainGame->yScale), recti(0, 0, 200, 20), 0, 0, true);
......
...@@ -652,7 +652,7 @@ void DuelClient::HandleSTOCPacketLan(unsigned char* data, unsigned int len) { ...@@ -652,7 +652,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);
...@@ -904,6 +904,11 @@ void DuelClient::HandleSTOCPacketLan(unsigned char* data, unsigned int len) { ...@@ -904,6 +904,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
...@@ -2466,7 +2471,9 @@ int DuelClient::ClientAnalyze(unsigned char* msg, unsigned int len) { ...@@ -2466,7 +2471,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);
} }
......
...@@ -148,7 +148,8 @@ bool ClientField::OnEvent(const irr::SEvent& event) { ...@@ -148,7 +148,8 @@ bool ClientField::OnEvent(const irr::SEvent& event) {
if(exit_on_return) if(exit_on_return)
mainGame->OnGameClose(); mainGame->OnGameClose();
} else { } else {
mainGame->PopupElement(mainGame->wSurrender); if(!(mainGame->dInfo.isTag && mainGame->dField.tag_surrender))
mainGame->PopupElement(mainGame->wSurrender);
} }
break; break;
} }
...@@ -156,10 +157,12 @@ bool ClientField::OnEvent(const irr::SEvent& event) { ...@@ -156,10 +157,12 @@ bool ClientField::OnEvent(const irr::SEvent& event) {
mainGame->soundManager->PlaySoundEffect(SoundManager::SFX::BUTTON); mainGame->soundManager->PlaySoundEffect(SoundManager::SFX::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: {
mainGame->soundManager->PlaySoundEffect(SoundManager::SFX::BUTTON); mainGame->soundManager->PlaySoundEffect(SoundManager::SFX::BUTTON);
mainGame->dField.tag_teammate_surrender = false;
mainGame->HideElement(mainGame->wSurrender); mainGame->HideElement(mainGame->wSurrender);
break; break;
} }
......
...@@ -194,6 +194,7 @@ public: ...@@ -194,6 +194,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
#define PLAYERCHANGE_OBSERVE 0x8 #define PLAYERCHANGE_OBSERVE 0x8
#define PLAYERCHANGE_READY 0x9 #define PLAYERCHANGE_READY 0x9
......
...@@ -11,6 +11,7 @@ TagDuel::TagDuel() { ...@@ -11,6 +11,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;
} }
} }
TagDuel::~TagDuel() { TagDuel::~TagDuel() {
...@@ -520,7 +521,33 @@ void TagDuel::DuelEndProc() { ...@@ -520,7 +521,33 @@ void TagDuel::DuelEndProc() {
duel_stage = DUEL_STAGE_END; duel_stage = DUEL_STAGE_END;
} }
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;
...@@ -904,6 +931,9 @@ int TagDuel::Analyze(unsigned char* msgbuffer, unsigned int len) { ...@@ -904,6 +931,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: {
......
...@@ -50,6 +50,7 @@ protected: ...@@ -50,6 +50,7 @@ protected:
DuelPlayer* cur_player[2]; DuelPlayer* cur_player[2];
std::set<DuelPlayer*> observers; std::set<DuelPlayer*> observers;
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];
......
...@@ -401,6 +401,7 @@ ...@@ -401,6 +401,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 键入关键字后自动进行搜索
......
...@@ -401,6 +401,7 @@ ...@@ -401,6 +401,7 @@
!system 1352 Main message !system 1352 Main message
!system 1353 Start at turn !system 1353 Start at turn
!system 1354 Always chain when duel starts !system 1354 Always chain when duel starts
!system 1355 Surrender(1/2)
!system 1356 Do you want to quit without saving? !system 1356 Do you want to quit without saving?
!system 1357 Ignore deck changes while quiting !system 1357 Ignore deck changes while quiting
!system 1358 Search cards automatically !system 1358 Search cards automatically
......
...@@ -404,6 +404,7 @@ ...@@ -404,6 +404,7 @@
!system 1352 Mensaje Principal: !system 1352 Mensaje Principal:
!system 1353 Empezar en el Turno: !system 1353 Empezar en el Turno:
!system 1354 Encadenar al Inicio del Duelo !system 1354 Encadenar al Inicio del Duelo
!system 1355 Rendirse(1/2)
!system 1355 ¿Quieres Configurar [%ls]? !system 1355 ¿Quieres Configurar [%ls]?
!system 1356 ¿Quieres Salir sin Guardar? !system 1356 ¿Quieres Salir sin Guardar?
!system 1357 Ignorar Cambios del Deck !system 1357 Ignorar Cambios del Deck
......
...@@ -402,6 +402,7 @@ ...@@ -402,6 +402,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 入力されたテキストを自動検索
......
...@@ -401,7 +401,7 @@ ...@@ -401,7 +401,7 @@
!system 1352 정보: !system 1352 정보:
!system 1353 이 턴부터 시작: !system 1353 이 턴부터 시작:
!system 1354 듀얼 개시시 전부 체인 !system 1354 듀얼 개시시 전부 체인
!system 1355 [%ls]을(를) 세트하겠습니까? !system 1355 항복(1/2)
!system 1356 덱 변경 사항을 포기하겠습니까? !system 1356 덱 변경 사항을 포기하겠습니까?
!system 1357 덱 변경 사항 요구 무시 !system 1357 덱 변경 사항 요구 무시
!system 1358 자동 키워드로 카드 검색 !system 1358 자동 키워드로 카드 검색
......
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
<server> <server>
<player-name>Knight of Hanoi</player-name> <player-name>Knight of Hanoi</player-name>
<name>233正式服务器1区</name> <name>233怀旧1202服务器</name>
<ip>s1.ygo233.com</ip> <ip>s1.ygo233.com</ip>
<port>233</port> <port>233</port>
<keep>true</keep> <keep>true</keep>
......
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