Commit dfce1705 authored by argon.sun's avatar argon.sun

fix

parent 2304847f
......@@ -143,7 +143,7 @@ void DuelClient::ClientEvent(bufferevent *bev, short events, void *ctx) {
mainGame->btnJoinHost->setEnabled(true);
mainGame->btnJoinCancel->setEnabled(true);
mainGame->gMutex.Lock();
mainGame->HideElement(mainGame->wHostSingle);
mainGame->HideElement(mainGame->wHostPrepare);
mainGame->ShowElement(mainGame->wLanWindow);
if(events & BEV_EVENT_EOF)
mainGame->env->addMessageBox(L"", dataManager.GetSysString(1401));
......@@ -324,6 +324,23 @@ void DuelClient::HandleSTOCPacketLan(char* data, unsigned int len) {
str.append(msgbuf);
}
mainGame->gMutex.Lock();
if(pkt->info.mode == 2) {
mainGame->dInfo.is_tag = true;
mainGame->chkHostPrepReady[2]->setVisible(true);
mainGame->chkHostPrepReady[3]->setVisible(true);
mainGame->stHostPrepDuelist[2]->setVisible(true);
mainGame->stHostPrepDuelist[3]->setVisible(true);
mainGame->btnHostPrepKick[2]->setVisible(true);
mainGame->btnHostPrepKick[3]->setVisible(true);
} else {
mainGame->dInfo.is_tag = false;
mainGame->chkHostPrepReady[2]->setVisible(false);
mainGame->chkHostPrepReady[3]->setVisible(false);
mainGame->stHostPrepDuelist[2]->setVisible(false);
mainGame->stHostPrepDuelist[3]->setVisible(false);
mainGame->btnHostPrepKick[2]->setVisible(false);
mainGame->btnHostPrepKick[3]->setVisible(false);
}
mainGame->dInfo.time_limit = pkt->info.time_limit;
mainGame->dInfo.time_left[0] = 0;
mainGame->dInfo.time_left[1] = 0;
......@@ -333,17 +350,19 @@ void DuelClient::HandleSTOCPacketLan(char* data, unsigned int len) {
mainGame->deckBuilder.filterList = lit->content;
if(mainGame->deckBuilder.filterList == 0)
mainGame->deckBuilder.filterList = deckManager._lfList[0].content;
mainGame->stHostSingleDuelist[0]->setText(L"");
mainGame->stHostSingleDuelist[1]->setText(L"");
mainGame->stHostSingleOB->setText(L"");
mainGame->SetStaticText(mainGame->stHostSingleRule, 180, mainGame->guiFont, (wchar_t*)str.c_str());
mainGame->stHostPrepDuelist[0]->setText(L"");
mainGame->stHostPrepDuelist[1]->setText(L"");
mainGame->stHostPrepDuelist[2]->setText(L"");
mainGame->stHostPrepDuelist[3]->setText(L"");
mainGame->stHostPrepOB->setText(L"");
mainGame->SetStaticText(mainGame->stHostPrepRule, 180, mainGame->guiFont, (wchar_t*)str.c_str());
mainGame->RefreshDeck(mainGame->cbDeckSelect);
mainGame->cbDeckSelect->setEnabled(true);
if(mainGame->wCreateHost->isVisible())
mainGame->HideElement(mainGame->wCreateHost);
else if (mainGame->wLanWindow->isVisible())
mainGame->HideElement(mainGame->wLanWindow);
mainGame->ShowElement(mainGame->wHostSingle);
mainGame->ShowElement(mainGame->wHostPrepare);
mainGame->gMutex.Unlock();
break;
}
......@@ -351,31 +370,54 @@ void DuelClient::HandleSTOCPacketLan(char* data, unsigned int len) {
STOC_TypeChange* pkt = (STOC_TypeChange*)pdata;
selftype = pkt->type & 0xf;
is_host = (pkt->type >> 4) & 0xf;
if(is_host) {
mainGame->btnHostSingleStart->setVisible(true);
mainGame->btnHostSingleKick[0]->setEnabled(true);
mainGame->btnHostSingleKick[1]->setEnabled(true);
} else {
mainGame->btnHostSingleStart->setVisible(false);
mainGame->btnHostSingleKick[0]->setEnabled(false);
mainGame->btnHostSingleKick[1]->setEnabled(false);
}
mainGame->chkHostSingleReady[0]->setEnabled(false);
mainGame->chkHostSingleReady[0]->setChecked(false);
mainGame->chkHostSingleReady[1]->setEnabled(false);
mainGame->chkHostSingleReady[1]->setChecked(false);
if(selftype < 2) {
mainGame->chkHostSingleReady[selftype]->setEnabled(true);
mainGame->btnHostSingleDuelist->setEnabled(false);
mainGame->btnHostSingleOB->setEnabled(true);
if(!mainGame->dInfo.is_tag) {
if(is_host) {
mainGame->btnHostPrepStart->setVisible(true);
mainGame->btnHostPrepKick[0]->setEnabled(true);
mainGame->btnHostPrepKick[1]->setEnabled(true);
} else {
mainGame->btnHostPrepStart->setVisible(false);
mainGame->btnHostPrepKick[0]->setEnabled(false);
mainGame->btnHostPrepKick[1]->setEnabled(false);
}
mainGame->chkHostPrepReady[0]->setEnabled(false);
mainGame->chkHostPrepReady[0]->setChecked(false);
mainGame->chkHostPrepReady[1]->setEnabled(false);
mainGame->chkHostPrepReady[1]->setChecked(false);
if(selftype < 2) {
mainGame->chkHostPrepReady[selftype]->setEnabled(true);
mainGame->btnHostPrepDuelist->setEnabled(false);
mainGame->btnHostPrepOB->setEnabled(true);
} else {
mainGame->btnHostPrepDuelist->setEnabled(true);
mainGame->btnHostPrepOB->setEnabled(false);
}
} else {
mainGame->btnHostSingleDuelist->setEnabled(true);
mainGame->btnHostSingleOB->setEnabled(false);
mainGame->btnHostPrepDuelist->setEnabled(true);
if(is_host) {
mainGame->btnHostPrepStart->setVisible(true);
for(int i = 0; i < 4; ++i)
mainGame->btnHostPrepKick[i]->setEnabled(true);
} else {
mainGame->btnHostPrepStart->setVisible(false);
for(int i = 0; i < 4; ++i)
mainGame->btnHostPrepKick[i]->setEnabled(false);
}
for(int i = 0; i < 4; ++i) {
mainGame->chkHostPrepReady[i]->setEnabled(false);
mainGame->chkHostPrepReady[i]->setChecked(false);
}
if(selftype < 4) {
mainGame->chkHostPrepReady[selftype]->setEnabled(true);
mainGame->btnHostPrepOB->setEnabled(true);
} else {
mainGame->btnHostPrepOB->setEnabled(false);
}
}
break;
}
case STOC_DUEL_START: {
mainGame->HideElement(mainGame->wHostSingle);
mainGame->HideElement(mainGame->wHostPrepare);
mainGame->WaitFrameSignal(11);
mainGame->gMutex.Lock();
mainGame->dField.Clear();
......@@ -402,17 +444,38 @@ void DuelClient::HandleSTOCPacketLan(char* data, unsigned int len) {
mainGame->wChat->setVisible(true);
mainGame->imgCard->setImage(imageManager.tCover);
mainGame->device->setEventReceiver(&mainGame->dField);
if(selftype > 1) {
mainGame->dInfo.isObserver = true;
mainGame->btnLeaveGame->setText(dataManager.GetSysString(1350));
mainGame->btnLeaveGame->setVisible(true);
}
if(selftype != 1) {
BufferIO::CopyWStr(mainGame->stHostSingleDuelist[0]->getText(), mainGame->dInfo.hostname, 20);
BufferIO::CopyWStr(mainGame->stHostSingleDuelist[1]->getText(), mainGame->dInfo.clientname, 20);
if(!mainGame->dInfo.is_tag) {
if(selftype > 1) {
mainGame->dInfo.isObserver = true;
mainGame->btnLeaveGame->setText(dataManager.GetSysString(1350));
mainGame->btnLeaveGame->setVisible(true);
}
if(selftype != 1) {
BufferIO::CopyWStr(mainGame->stHostPrepDuelist[0]->getText(), mainGame->dInfo.hostname, 20);
BufferIO::CopyWStr(mainGame->stHostPrepDuelist[1]->getText(), mainGame->dInfo.clientname, 20);
} else {
BufferIO::CopyWStr(mainGame->stHostPrepDuelist[1]->getText(), mainGame->dInfo.hostname, 20);
BufferIO::CopyWStr(mainGame->stHostPrepDuelist[0]->getText(), mainGame->dInfo.clientname, 20);
}
} else {
BufferIO::CopyWStr(mainGame->stHostSingleDuelist[1]->getText(), mainGame->dInfo.hostname, 20);
BufferIO::CopyWStr(mainGame->stHostSingleDuelist[0]->getText(), mainGame->dInfo.clientname, 20);
if(selftype > 3) {
mainGame->dInfo.isObserver = true;
mainGame->btnLeaveGame->setText(dataManager.GetSysString(1350));
mainGame->btnLeaveGame->setVisible(true);
}
if(selftype > 1 && selftype < 4) {
BufferIO::CopyWStr(mainGame->stHostPrepDuelist[2]->getText(), mainGame->dInfo.hostname, 20);
BufferIO::CopyWStr(mainGame->stHostPrepDuelist[3]->getText(), mainGame->dInfo.hostname_tag, 20);
BufferIO::CopyWStr(mainGame->stHostPrepDuelist[0]->getText(), mainGame->dInfo.clientname, 20);
BufferIO::CopyWStr(mainGame->stHostPrepDuelist[1]->getText(), mainGame->dInfo.clientname_tag, 20);
} else {
BufferIO::CopyWStr(mainGame->stHostPrepDuelist[0]->getText(), mainGame->dInfo.hostname, 20);
BufferIO::CopyWStr(mainGame->stHostPrepDuelist[1]->getText(), mainGame->dInfo.hostname_tag, 20);
BufferIO::CopyWStr(mainGame->stHostPrepDuelist[2]->getText(), mainGame->dInfo.clientname, 20);
BufferIO::CopyWStr(mainGame->stHostPrepDuelist[3]->getText(), mainGame->dInfo.clientname_tag, 20);
}
mainGame->dInfo.tag_player[0] = false;
mainGame->dInfo.tag_player[1] = false;
}
mainGame->gMutex.Unlock();
break;
......@@ -470,13 +533,35 @@ void DuelClient::HandleSTOCPacketLan(char* data, unsigned int len) {
case STOC_CHAT: {
STOC_Chat* pkt = (STOC_Chat*)pdata;
wchar_t msg[256];
if(pkt->player < 2) {
if(pkt->player < 4) {
if(mainGame->chkIgnore1->isChecked())
break;
BufferIO::CopyWStr(pkt->msg, msg, 256);
msg[(len - 3) / 2] = 0;
mainGame->gMutex.Lock();
mainGame->AddChatMsg(msg, mainGame->LocalPlayer(pkt->player));
if(!mainGame->dInfo.is_tag)
mainGame->AddChatMsg(msg, mainGame->LocalPlayer(pkt->player));
else {
if(mainGame->dInfo.isFirst) {
if(pkt->player == 0)
mainGame->AddChatMsg(msg, 0);
else if(pkt->player == 1)
mainGame->AddChatMsg(msg, 2);
else if(pkt->player == 2)
mainGame->AddChatMsg(msg, 1);
else
mainGame->AddChatMsg(msg, 3);
} else {
if(pkt->player == 0)
mainGame->AddChatMsg(msg, 1);
else if(pkt->player == 1)
mainGame->AddChatMsg(msg, 3);
else if(pkt->player == 2)
mainGame->AddChatMsg(msg, 0);
else
mainGame->AddChatMsg(msg, 2);
}
}
mainGame->gMutex.Unlock();
} else if(pkt->player == 8) { //system custom message.
if(mainGame->chkIgnore1->isChecked())
......@@ -492,19 +577,19 @@ void DuelClient::HandleSTOCPacketLan(char* data, unsigned int len) {
BufferIO::CopyWStr(pkt->msg, msg, 256);
msg[(len - 3) / 2] = 0;
mainGame->gMutex.Lock();
mainGame->AddChatMsg(msg, 2);
mainGame->AddChatMsg(msg, 10);
mainGame->gMutex.Unlock();
}
break;
}
case STOC_HS_PLAYER_ENTER: {
STOC_HS_PlayerEnter* pkt = (STOC_HS_PlayerEnter*)pdata;
if(pkt->pos > 1)
if(pkt->pos > 3)
break;
wchar_t name[20];
BufferIO::CopyWStr(pkt->name, name, 20);
mainGame->gMutex.Lock();
mainGame->stHostSingleDuelist[pkt->pos]->setText(name);
mainGame->stHostPrepDuelist[pkt->pos]->setText(name);
mainGame->gMutex.Unlock();
break;
}
......@@ -512,23 +597,23 @@ void DuelClient::HandleSTOCPacketLan(char* data, unsigned int len) {
STOC_HS_PlayerChange* pkt = (STOC_HS_PlayerChange*)pdata;
unsigned char pos = (pkt->status >> 4) & 0xf;
unsigned char state = pkt->status & 0xf;
if(pos > 1)
if(pos > 3)
break;
mainGame->gMutex.Lock();
if(state == PLAYERCHANGE_READY) {
mainGame->chkHostSingleReady[pos]->setChecked(true);
mainGame->chkHostPrepReady[pos]->setChecked(true);
} else if(state == PLAYERCHANGE_NOTREADY) {
mainGame->chkHostSingleReady[pos]->setChecked(false);
mainGame->chkHostPrepReady[pos]->setChecked(false);
} else if(state == PLAYERCHANGE_LEAVE) {
mainGame->stHostSingleDuelist[pos]->setText(L"");
mainGame->chkHostSingleReady[pos]->setChecked(false);
mainGame->stHostPrepDuelist[pos]->setText(L"");
mainGame->chkHostPrepReady[pos]->setChecked(false);
} else if(state == PLAYERCHANGE_OBSERVE) {
watching++;
wchar_t watchbuf[32];
myswprintf(watchbuf, L"%ls%d", dataManager.GetSysString(1253), watching);
mainGame->stHostSingleDuelist[pos]->setText(L"");
mainGame->chkHostSingleReady[pos]->setChecked(false);
mainGame->stHostSingleOB->setText(watchbuf);
mainGame->stHostPrepDuelist[pos]->setText(L"");
mainGame->chkHostPrepReady[pos]->setChecked(false);
mainGame->stHostPrepOB->setText(watchbuf);
}
mainGame->gMutex.Unlock();
break;
......@@ -539,7 +624,7 @@ void DuelClient::HandleSTOCPacketLan(char* data, unsigned int len) {
wchar_t watchbuf[32];
myswprintf(watchbuf, L"%ls%d", dataManager.GetSysString(1253), watching);
mainGame->gMutex.Lock();
mainGame->stHostSingleOB->setText(watchbuf);
mainGame->stHostPrepOB->setText(watchbuf);
mainGame->gMutex.Unlock();
break;
}
......@@ -1543,10 +1628,16 @@ int DuelClient::ClientAnalyze(char* msg, unsigned int len) {
case MSG_NEW_TURN: {
int player = mainGame->LocalPlayer(BufferIO::ReadInt8(pbuf));
mainGame->dInfo.turn++;
if(mainGame->dInfo.turn == 5 && !mainGame->dInfo.isReplay && !mainGame->dInfo.isObserver) {
if(!mainGame->dInfo.is_tag && mainGame->dInfo.turn == 5 && !mainGame->dInfo.isReplay && !mainGame->dInfo.isObserver) {
mainGame->btnLeaveGame->setText(dataManager.GetSysString(1351));
mainGame->btnLeaveGame->setVisible(true);
}
if(mainGame->dInfo.is_tag && mainGame->dInfo.turn != 1) {
if(player == 0)
mainGame->dInfo.tag_player[0] = !mainGame->dInfo.tag_player[0];
else
mainGame->dInfo.tag_player[1] = !mainGame->dInfo.tag_player[1];
}
myswprintf(mainGame->dInfo.strTurn, L"Turn:%d", mainGame->dInfo.turn);
mainGame->showcardcode = 10;
mainGame->showcarddif = 30;
......
......@@ -139,26 +139,24 @@ bool Game::Initialize() {
btnHostConfirm = env->addButton(rect<s32>(260, 355, 370, 380), wCreateHost, BUTTON_HOST_CONFIRM, dataManager.GetSysString(1211));
btnHostCancel = env->addButton(rect<s32>(260, 385, 370, 410), wCreateHost, BUTTON_HOST_CANCEL, dataManager.GetSysString(1212));
//host(single)
wHostSingle = env->addWindow(rect<s32>(270, 120, 750, 420), false, dataManager.GetSysString(1250));
wHostSingle->getCloseButton()->setVisible(false);
wHostSingle->setVisible(false);
btnHostSingleDuelist = env->addButton(rect<s32>(10, 30, 110, 55), wHostSingle, BUTTON_HS_DUELIST, dataManager.GetSysString(1251));
stHostSingleDuelist[0] = env->addStaticText(L"", rect<s32>(40, 65, 240, 85), true, false, wHostSingle);
btnHostSingleKick[0] = env->addButton(rect<s32>(10, 65, 30, 85), wHostSingle, BUTTON_HS_KICK, L"X");
chkHostSingleReady[0] = env->addCheckBox(false, rect<s32>(250, 65, 270, 85), wHostSingle, CHECKBOX_HS_READY, L"");
chkHostSingleReady[0]->setEnabled(false);
stHostSingleDuelist[1] = env->addStaticText(L"", rect<s32>(40, 90, 240, 110), true, false, wHostSingle);
btnHostSingleKick[1] = env->addButton(rect<s32>(10, 90, 30, 110), wHostSingle, BUTTON_HS_KICK, L"X");
chkHostSingleReady[1] = env->addCheckBox(false, rect<s32>(250, 90, 270, 110), wHostSingle, CHECKBOX_HS_READY, L"");
chkHostSingleReady[1]->setEnabled(false);
btnHostSingleOB = env->addButton(rect<s32>(10, 120, 110, 145), wHostSingle, BUTTON_HS_OBSERVER, dataManager.GetSysString(1252));
wHostPrepare = env->addWindow(rect<s32>(270, 120, 750, 440), false, dataManager.GetSysString(1250));
wHostPrepare->getCloseButton()->setVisible(false);
wHostPrepare->setVisible(false);
btnHostPrepDuelist = env->addButton(rect<s32>(10, 30, 110, 55), wHostPrepare, BUTTON_HP_DUELIST, dataManager.GetSysString(1251));
for(int i = 0; i < 4; ++i) {
stHostPrepDuelist[i] = env->addStaticText(L"", rect<s32>(40, 65 + i * 25, 240, 85 + i * 25), true, false, wHostPrepare);
btnHostPrepKick[i] = env->addButton(rect<s32>(10, 65 + i * 25, 30, 85 + i * 25), wHostPrepare, BUTTON_HP_KICK, L"X");
chkHostPrepReady[i] = env->addCheckBox(false, rect<s32>(250, 65 + i * 25, 270, 85 + i * 25), wHostPrepare, CHECKBOX_HP_READY, L"");
chkHostPrepReady[i]->setEnabled(false);
}
btnHostPrepOB = env->addButton(rect<s32>(10, 170, 110, 195), wHostPrepare, BUTTON_HP_OBSERVER, dataManager.GetSysString(1252));
myswprintf(dataManager.strBuffer, L"%ls%d", dataManager.GetSysString(1253), 0);
stHostSingleOB = env->addStaticText(dataManager.strBuffer, rect<s32>(10, 150, 270, 170), false, false, wHostSingle);
stHostSingleRule = env->addStaticText(L"", rect<s32>(280, 30, 460, 230), false, true, wHostSingle);
env->addStaticText(dataManager.GetSysString(1254), rect<s32>(10, 185, 110, 205), false, false, wHostSingle);
cbDeckSelect = env->addComboBox(rect<s32>(120, 180, 270, 205), wHostSingle);
btnHostSingleStart = env->addButton(rect<s32>(230, 260, 340, 285), wHostSingle, BUTTON_HS_START, dataManager.GetSysString(1215));
btnHostSingleCancel = env->addButton(rect<s32>(350, 260, 460, 285), wHostSingle, BUTTON_HS_CANCEL, dataManager.GetSysString(1212));
stHostPrepOB = env->addStaticText(dataManager.strBuffer, rect<s32>(10, 200, 270, 220), false, false, wHostPrepare);
stHostPrepRule = env->addStaticText(L"", rect<s32>(280, 30, 460, 230), false, true, wHostPrepare);
env->addStaticText(dataManager.GetSysString(1254), rect<s32>(10, 235, 110, 255), false, false, wHostPrepare);
cbDeckSelect = env->addComboBox(rect<s32>(120, 230, 270, 255), wHostPrepare);
btnHostPrepStart = env->addButton(rect<s32>(230, 280, 340, 305), wHostPrepare, BUTTON_HP_START, dataManager.GetSysString(1215));
btnHostPrepCancel = env->addButton(rect<s32>(350, 280, 460, 305), wHostPrepare, BUTTON_HP_CANCEL, dataManager.GetSysString(1212));
//img
wCardImg = env->addStaticText(L"", rect<s32>(1, 1, 199, 273), true, false, 0, -1, true);
wCardImg->setBackgroundColor(0xc0c0c0c0);
......@@ -782,6 +780,14 @@ void Game::AddChatMsg(wchar_t* msg, int player) {
chatMsg[0].append(dInfo.clientname);
chatMsg[0].append(L": ");
break;
case 2: //host tag
chatMsg[0].append(dInfo.hostname_tag);
chatMsg[0].append(L": ");
break;
case 3: //client tag
chatMsg[0].append(dInfo.clientname_tag);
chatMsg[0].append(L": ");
break;
case 8: //system custom message, no prefix.
chatMsg[0].append(L"[System]: ");
break;
......
......@@ -32,11 +32,15 @@ struct DuelInfo {
bool isObserver;
bool isFirst;
bool is_shuffling;
bool is_tag;
bool tag_player[2];
int lp[2];
int turn;
short curMsg;
wchar_t hostname[20];
wchar_t clientname[20];
wchar_t hostname_tag[20];
wchar_t clientname_tag[20];
wchar_t strLP[2][16];
wchar_t strTurn[8];
wchar_t* vic_string;
......@@ -195,18 +199,18 @@ public:
irr::gui::IGUICheckBox* chkNoShuffleDeck;
irr::gui::IGUIButton* btnHostConfirm;
irr::gui::IGUIButton* btnHostCancel;
//host(single)
irr::gui::IGUIWindow* wHostSingle;
irr::gui::IGUIButton* btnHostSingleDuelist;
irr::gui::IGUIButton* btnHostSingleOB;
irr::gui::IGUIStaticText* stHostSingleDuelist[2];
irr::gui::IGUICheckBox* chkHostSingleReady[2];
irr::gui::IGUIButton* btnHostSingleKick[2];
//host panel
irr::gui::IGUIWindow* wHostPrepare;
irr::gui::IGUIButton* btnHostPrepDuelist;
irr::gui::IGUIButton* btnHostPrepOB;
irr::gui::IGUIStaticText* stHostPrepDuelist[4];
irr::gui::IGUICheckBox* chkHostPrepReady[4];
irr::gui::IGUIButton* btnHostPrepKick[4];
irr::gui::IGUIComboBox* cbDeckSelect;
irr::gui::IGUIStaticText* stHostSingleRule;
irr::gui::IGUIStaticText* stHostSingleOB;
irr::gui::IGUIButton* btnHostSingleStart;
irr::gui::IGUIButton* btnHostSingleCancel;
irr::gui::IGUIStaticText* stHostPrepRule;
irr::gui::IGUIStaticText* stHostPrepOB;
irr::gui::IGUIButton* btnHostPrepStart;
irr::gui::IGUIButton* btnHostPrepCancel;
//replay
irr::gui::IGUIWindow* wReplay;
irr::gui::IGUIListBox* lstReplayList;
......@@ -365,12 +369,12 @@ extern Game* mainGame;
#define BUTTON_HOST_CONFIRM 114
#define BUTTON_HOST_CANCEL 115
#define BUTTON_LAN_REFRESH 116
#define BUTTON_HS_DUELIST 120
#define BUTTON_HS_OBSERVER 121
#define BUTTON_HS_START 122
#define BUTTON_HS_CANCEL 123
#define BUTTON_HS_KICK 124
#define CHECKBOX_HS_READY 125
#define BUTTON_HP_DUELIST 120
#define BUTTON_HP_OBSERVER 121
#define BUTTON_HP_START 122
#define BUTTON_HP_CANCEL 123
#define BUTTON_HP_KICK 124
#define CHECKBOX_HP_READY 125
#define LISTBOX_REPLAY_LIST 130
#define BUTTON_LOAD_REPLAY 131
#define BUTTON_CANCEL_REPLAY 132
......
......@@ -84,16 +84,16 @@ bool MenuHandler::OnEvent(const irr::SEvent& event) {
mainGame->ShowElement(mainGame->wLanWindow);
break;
}
case BUTTON_HS_DUELIST: {
case BUTTON_HP_DUELIST: {
DuelClient::SendPacketToServer(CTOS_HS_TODUELIST);
break;
}
case BUTTON_HS_OBSERVER: {
case BUTTON_HP_OBSERVER: {
DuelClient::SendPacketToServer(CTOS_HS_TOOBSERVER);
break;
}
case BUTTON_HS_KICK: {
int id = caller - static_cast<IGUIElement*>(mainGame->btnHostSingleKick[0]);
case BUTTON_HP_KICK: {
int id = caller - static_cast<IGUIElement*>(mainGame->btnHostPrepKick[0]);
CTOS_Kick csk;
if(id == 0)
csk.pos = 0;
......@@ -101,19 +101,19 @@ bool MenuHandler::OnEvent(const irr::SEvent& event) {
DuelClient::SendPacketToServer(CTOS_HS_KICK, csk);
break;
}
case BUTTON_HS_START: {
if(!mainGame->chkHostSingleReady[0]->isChecked()
|| !mainGame->chkHostSingleReady[0]->isChecked())
case BUTTON_HP_START: {
if(!mainGame->chkHostPrepReady[0]->isChecked()
|| !mainGame->chkHostPrepReady[1]->isChecked())
break;
DuelClient::SendPacketToServer(CTOS_HS_START);
break;
}
case BUTTON_HS_CANCEL: {
case BUTTON_HP_CANCEL: {
DuelClient::StopClient();
mainGame->btnCreateHost->setEnabled(true);
mainGame->btnJoinHost->setEnabled(true);
mainGame->btnJoinCancel->setEnabled(true);
mainGame->HideElement(mainGame->wHostSingle);
mainGame->HideElement(mainGame->wHostPrepare);
mainGame->ShowElement(mainGame->wLanWindow);
if(exit_on_return)
mainGame->device->closeDevice();
......@@ -234,10 +234,10 @@ bool MenuHandler::OnEvent(const irr::SEvent& event) {
}
case irr::gui::EGET_CHECKBOX_CHANGED: {
switch(id) {
case CHECKBOX_HS_READY: {
case CHECKBOX_HP_READY: {
if(!caller->isEnabled())
break;
mainGame->env->setFocus(mainGame->wHostSingle);
mainGame->env->setFocus(mainGame->wHostPrepare);
if(static_cast<irr::gui::IGUICheckBox*>(caller)->isChecked()) {
if(mainGame->cbDeckSelect->getSelected() == -1 ||
!deckManager.LoadDeck(mainGame->cbDeckSelect->getItem(mainGame->cbDeckSelect->getSelected()))) {
......
......@@ -95,17 +95,6 @@ struct STOC_HS_PlayerChange {
struct STOC_HS_WatchChange {
unsigned short watch_count;
};
struct STOC_HT_PlayerEnter {
unsigned short name[20];
unsigned char pos;
};
struct STOC_HT_PlayerChange {
//pos<<4 | state
unsigned char status;
};
struct STOC_HT_WatchChange {
unsigned short watch_count;
};
class DuelMode;
......@@ -186,12 +175,6 @@ public:
#define CTOS_HS_NOTREADY 0x23
#define CTOS_HS_KICK 0x24
#define CTOS_HS_START 0x25
#define CTOS_HT_TODUELIST 0x30
#define CTOS_HT_TOOBSERVER 0x31
#define CTOS_HT_READY 0x32
#define CTOS_HT_NOTREADY 0x33
#define CTOS_HT_KICK 0x34
#define CTOS_HT_START 0x35
#define STOC_GAME_MSG 0x1
#define STOC_ERROR_MSG 0x2
......@@ -213,9 +196,6 @@ public:
#define STOC_HS_PLAYER_ENTER 0x20
#define STOC_HS_PLAYER_CHANGE 0x21
#define STOC_HS_WATCH_CHANGE 0x22
#define STOC_HT_PLAYER_ENTER 0x30
#define STOC_HT_PLAYER_CHANGE 0x31
#define STOC_HT_WATCH_CHANGE 0x32
#define PLAYERCHANGE_READY 0x1
#define PLAYERCHANGE_NOTREADY 0x2
......
......@@ -63,7 +63,7 @@ void TagDuel::JoinGame(DuelPlayer* dp, void* pdata, bool is_creater) {
STOC_TypeChange sctc;
sctc.type = (host_player == dp) ? 0x10 : 0;
if(!players[0] || !players[1] || !players[2] || !players[3]) {
STOC_HT_PlayerEnter scpe;
STOC_HS_PlayerEnter scpe;
BufferIO::CopyWStr(dp->name, scpe.name, 20);
if(!players[0])
scpe.pos = 0;
......@@ -75,9 +75,9 @@ void TagDuel::JoinGame(DuelPlayer* dp, void* pdata, bool is_creater) {
scpe.pos = 3;
for(int i = 0; i < 4; ++i)
if(players[i])
NetServer::SendPacketToPlayer(players[i], STOC_HT_PLAYER_ENTER, scpe);
NetServer::SendPacketToPlayer(players[i], STOC_HS_PLAYER_ENTER, scpe);
for(auto pit = observers.begin(); pit != observers.end(); ++pit)
NetServer::SendPacketToPlayer(*pit, STOC_HT_PLAYER_ENTER, scpe);
NetServer::SendPacketToPlayer(*pit, STOC_HS_PLAYER_ENTER, scpe);
players[scpe.pos] = dp;
dp->type = scpe.pos;
sctc.type |= scpe.pos;
......@@ -85,13 +85,13 @@ void TagDuel::JoinGame(DuelPlayer* dp, void* pdata, bool is_creater) {
observers.insert(dp);
dp->type = NETPLAYER_TYPE_OBSERVER;
sctc.type |= NETPLAYER_TYPE_OBSERVER;
STOC_HT_WatchChange scwc;
STOC_HS_WatchChange scwc;
scwc.watch_count = observers.size();
for(int i = 0; i < 4; ++i)
if(players[i])
NetServer::SendPacketToPlayer(players[1], STOC_HT_WATCH_CHANGE, scwc);
NetServer::SendPacketToPlayer(players[1], STOC_HS_WATCH_CHANGE, scwc);
for(auto pit = observers.begin(); pit != observers.end(); ++pit)
NetServer::SendPacketToPlayer(*pit, STOC_HT_WATCH_CHANGE, scwc);
NetServer::SendPacketToPlayer(*pit, STOC_HS_WATCH_CHANGE, scwc);
}
NetServer::SendPacketToPlayer(dp, STOC_JOIN_GAME, scjg);
NetServer::SendPacketToPlayer(dp, STOC_TYPE_CHANGE, sctc);
......@@ -100,17 +100,17 @@ void TagDuel::JoinGame(DuelPlayer* dp, void* pdata, bool is_creater) {
STOC_HS_PlayerEnter scpe;
BufferIO::CopyWStr(players[i]->name, scpe.name, 20);
scpe.pos = 0;
NetServer::SendPacketToPlayer(dp, STOC_HT_PLAYER_ENTER, scpe);
NetServer::SendPacketToPlayer(dp, STOC_HS_PLAYER_ENTER, scpe);
if(ready[i]) {
STOC_HS_PlayerChange scpc;
scpc.status = PLAYERCHANGE_READY;
NetServer::SendPacketToPlayer(dp, STOC_HT_PLAYER_CHANGE, scpc);
NetServer::SendPacketToPlayer(dp, STOC_HS_PLAYER_CHANGE, scpc);
}
}
if(observers.size()) {
STOC_HT_WatchChange scwc;
STOC_HS_WatchChange scwc;
scwc.watch_count = observers.size();
NetServer::SendPacketToPlayer(dp, STOC_HT_WATCH_CHANGE, scwc);
NetServer::SendPacketToPlayer(dp, STOC_HS_WATCH_CHANGE, scwc);
}
}
void TagDuel::LeaveGame(DuelPlayer* dp) {
......@@ -120,21 +120,21 @@ void TagDuel::LeaveGame(DuelPlayer* dp) {
} else if(dp->type == NETPLAYER_TYPE_OBSERVER) {
observers.erase(dp);
if(!pduel) {
STOC_HT_WatchChange scwc;
STOC_HS_WatchChange scwc;
scwc.watch_count = observers.size();
}
NetServer::DisconnectPlayer(dp);
} else {
if(!pduel) {
STOC_HT_PlayerChange scpc;
STOC_HS_PlayerChange scpc;
players[dp->type] = 0;
ready[dp->type] = false;
scpc.status = (dp->type << 4) | PLAYERCHANGE_LEAVE;
for(int i = 0; i < 4; ++i)
if(players[i])
NetServer::SendPacketToPlayer(players[i], STOC_HT_PLAYER_CHANGE, scpc);
NetServer::SendPacketToPlayer(players[i], STOC_HS_PLAYER_CHANGE, scpc);
for(auto pit = observers.begin(); pit != observers.end(); ++pit)
NetServer::SendPacketToPlayer(*pit, STOC_HT_PLAYER_CHANGE, scpc);
NetServer::SendPacketToPlayer(*pit, STOC_HS_PLAYER_CHANGE, scpc);
NetServer::DisconnectPlayer(dp);
} else {
EndDuel();
......@@ -151,7 +151,7 @@ void TagDuel::ToDuelist(DuelPlayer* dp) {
return;
if(dp->type == NETPLAYER_TYPE_OBSERVER) {
observers.erase(dp);
STOC_HT_PlayerEnter scpe;
STOC_HS_PlayerEnter scpe;
BufferIO::CopyWStr(dp->name, scpe.name, 20);
if(!players[0])
dp->type = 0;
......@@ -163,31 +163,33 @@ void TagDuel::ToDuelist(DuelPlayer* dp) {
dp->type = 3;
players[dp->type] = dp;
scpe.pos = dp->type;
STOC_HT_WatchChange scwc;
STOC_HS_WatchChange scwc;
scwc.watch_count = observers.size();
for(int i = 0; i < 4; ++i)
if(players[i]) {
NetServer::SendPacketToPlayer(players[i], STOC_HT_PLAYER_ENTER, scpe);
NetServer::SendPacketToPlayer(players[i], STOC_HT_WATCH_CHANGE, scwc);
NetServer::SendPacketToPlayer(players[i], STOC_HS_PLAYER_ENTER, scpe);
NetServer::SendPacketToPlayer(players[i], STOC_HS_WATCH_CHANGE, scwc);
}
for(auto pit = observers.begin(); pit != observers.end(); ++pit) {
NetServer::SendPacketToPlayer(*pit, STOC_HT_PLAYER_ENTER, scpe);
NetServer::SendPacketToPlayer(*pit, STOC_HT_WATCH_CHANGE, scwc);
NetServer::SendPacketToPlayer(*pit, STOC_HS_PLAYER_ENTER, scpe);
NetServer::SendPacketToPlayer(*pit, STOC_HS_WATCH_CHANGE, scwc);
}
STOC_TypeChange sctc;
sctc.type = (dp == host_player ? 0x10 : 0) | dp->type;
NetServer::SendPacketToPlayer(dp, STOC_TYPE_CHANGE, sctc);
} else {
if(ready[dp->type])
return;
uint8 dptype = (dp->type + 1) % 4;
while(players[dptype])
dptype = (dp->type + 1) % 4;
STOC_HT_PlayerChange scpc;
STOC_HS_PlayerChange scpc;
scpc.status = (dp->type << 4) | dptype;
for(int i = 0; i < 4; ++i)
if(players[i])
NetServer::SendPacketToPlayer(players[i], STOC_HT_PLAYER_CHANGE, scpc);
NetServer::SendPacketToPlayer(players[i], STOC_HS_PLAYER_CHANGE, scpc);
for(auto pit = observers.begin(); pit != observers.end(); ++pit)
NetServer::SendPacketToPlayer(*pit, STOC_HT_PLAYER_CHANGE, scpc);
NetServer::SendPacketToPlayer(*pit, STOC_HS_PLAYER_CHANGE, scpc);
STOC_TypeChange sctc;
sctc.type = (dp == host_player ? 0x10 : 0) | dp->type;
NetServer::SendPacketToPlayer(dp, STOC_TYPE_CHANGE, sctc);
......@@ -200,13 +202,13 @@ void TagDuel::ToDuelist(DuelPlayer* dp) {
void TagDuel::ToObserver(DuelPlayer* dp) {
if(dp->type > 3)
return;
STOC_HT_PlayerChange scpc;
STOC_HS_PlayerChange scpc;
scpc.status = (dp->type << 4) | PLAYERCHANGE_OBSERVE;
for(int i = 0; i < 4; ++i)
if(players[i])
NetServer::SendPacketToPlayer(players[i], STOC_HT_PLAYER_CHANGE, scpc);
NetServer::SendPacketToPlayer(players[i], STOC_HS_PLAYER_CHANGE, scpc);
for(auto pit = observers.begin(); pit != observers.end(); ++pit)
NetServer::SendPacketToPlayer(*pit, STOC_HT_PLAYER_CHANGE, scpc);
NetServer::SendPacketToPlayer(*pit, STOC_HS_PLAYER_CHANGE, scpc);
players[dp->type] = 0;
dp->type = NETPLAYER_TYPE_OBSERVER;
observers.insert(dp);
......@@ -222,9 +224,9 @@ void TagDuel::PlayerReady(DuelPlayer* dp, bool is_ready) {
bool allow_tcg = host_info.rule == 1 || host_info.rule == 2;
int res = host_info.no_check_deck ? false : deckManager.CheckLFList(pdeck[dp->type], host_info.lflist, allow_ocg, allow_tcg);
if(res) {
STOC_HT_PlayerChange scpc;
STOC_HS_PlayerChange scpc;
scpc.status = (dp->type << 4) | PLAYERCHANGE_NOTREADY;
NetServer::SendPacketToPlayer(dp, STOC_HT_PLAYER_CHANGE, scpc);
NetServer::SendPacketToPlayer(dp, STOC_HS_PLAYER_CHANGE, scpc);
STOC_ErrorMsg scem;
scem.msg = ERRMSG_DECKERROR;
scem.code = res;
......@@ -233,13 +235,13 @@ void TagDuel::PlayerReady(DuelPlayer* dp, bool is_ready) {
}
}
ready[dp->type] = is_ready;
STOC_HT_PlayerChange scpc;
STOC_HS_PlayerChange scpc;
scpc.status = (dp->type << 4) | (is_ready ? PLAYERCHANGE_READY : PLAYERCHANGE_NOTREADY);
for(int i = 0; i < 4; ++i)
if(players[i] && players[i] != dp)
NetServer::SendPacketToPlayer(players[i], STOC_HT_PLAYER_CHANGE, scpc);
NetServer::SendPacketToPlayer(players[i], STOC_HS_PLAYER_CHANGE, scpc);
for(auto pit = observers.begin(); pit != observers.end(); ++pit)
NetServer::SendPacketToPlayer(*pit, STOC_HT_PLAYER_CHANGE, scpc);
NetServer::SendPacketToPlayer(*pit, STOC_HS_PLAYER_CHANGE, scpc);
}
void TagDuel::PlayerKick(DuelPlayer* dp, unsigned char pos) {
if(dp != host_player || dp == players[pos] || !players[pos])
......@@ -334,6 +336,9 @@ void TagDuel::TPResult(DuelPlayer* dp, unsigned char tp) {
std::swap(pdeck[1], pdeck[3]);
swapped = true;
}
tp_player = 0;
cur_player[0] = players[1];
cur_player[1] = players[3];
dp->state = CTOS_RESPONSE;
ReplayHeader rh;
rh.id = 0x31707279;
......@@ -778,14 +783,30 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
time_limit[1] = host_info.time_limit;
NetServer::SendBufferToPlayer(players[0], STOC_GAME_MSG, offset, pbuf - offset);
NetServer::ReSendToPlayer(players[1]);
NetServer::ReSendToPlayer(players[2]);
NetServer::ReSendToPlayer(players[3]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
if(tp_player == 0) {
if(cur_player[0] == players[0])
cur_player[0] = players[1];
else
cur_player[0] = players[0];
} else {
if(cur_player[1] == players[2])
cur_player[1] = players[3];
else
cur_player[1] = players[2];
}
tp_player = 1 - tp_player;
break;
}
case MSG_NEW_PHASE: {
pbuf++;
NetServer::SendBufferToPlayer(players[0], STOC_GAME_MSG, offset, pbuf - offset);
NetServer::ReSendToPlayer(players[1]);
NetServer::ReSendToPlayer(players[2]);
NetServer::ReSendToPlayer(players[3]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
RefreshMzone(0);
......@@ -809,15 +830,19 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
pbuf += 16;
if(cl == LOCATION_REMOVED && (cp & POS_FACEDOWN)) {
BufferIO::WriteInt32(pbufw, 0);
NetServer::SendBufferToPlayer(players[cc], STOC_GAME_MSG, offset, pbuf - offset);
NetServer::ReSendToPlayer(players[1 - cc]);
NetServer::SendBufferToPlayer(players[0], STOC_GAME_MSG, offset, pbuf - offset);
NetServer::ReSendToPlayer(players[1]);
NetServer::ReSendToPlayer(players[2]);
NetServer::ReSendToPlayer(players[3]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
} else {
NetServer::SendBufferToPlayer(players[cc], STOC_GAME_MSG, offset, pbuf - offset);
NetServer::SendBufferToPlayer(cur_player[cc], STOC_GAME_MSG, offset, pbuf - offset);
if (!(cl & 0xb0) && !((cl & 0xc) && (cp & POS_FACEUP)))
BufferIO::WriteInt32(pbufw, 0);
NetServer::SendBufferToPlayer(players[1 - cc], STOC_GAME_MSG, offset, pbuf - offset);
for(int i = 0; i < 4; ++i)
if(players[i] != cur_player[cc])
NetServer::SendBufferToPlayer(players[i], STOC_GAME_MSG, offset, pbuf - offset);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
}
......@@ -834,6 +859,8 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
pbuf += 9;
NetServer::SendBufferToPlayer(players[0], STOC_GAME_MSG, offset, pbuf - offset);
NetServer::ReSendToPlayer(players[1]);
NetServer::ReSendToPlayer(players[2]);
NetServer::ReSendToPlayer(players[3]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
if((pp & POS_FACEDOWN) && (cp & POS_FACEUP))
......@@ -845,6 +872,8 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
pbuf += 4;
NetServer::SendBufferToPlayer(players[0], STOC_GAME_MSG, offset, pbuf - offset);
NetServer::ReSendToPlayer(players[1]);
NetServer::ReSendToPlayer(players[2]);
NetServer::ReSendToPlayer(players[3]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
break;
......@@ -853,6 +882,8 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
pbuf += 16;
NetServer::SendBufferToPlayer(players[0], STOC_GAME_MSG, offset, pbuf - offset);
NetServer::ReSendToPlayer(players[1]);
NetServer::ReSendToPlayer(players[2]);
NetServer::ReSendToPlayer(players[3]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
break;
......@@ -861,6 +892,8 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
pbuf += 4;
NetServer::SendBufferToPlayer(players[0], STOC_GAME_MSG, offset, pbuf - offset);
NetServer::ReSendToPlayer(players[1]);
NetServer::ReSendToPlayer(players[2]);
NetServer::ReSendToPlayer(players[3]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
break;
......@@ -869,6 +902,8 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
pbuf += 8;
NetServer::SendBufferToPlayer(players[0], STOC_GAME_MSG, offset, pbuf - offset);
NetServer::ReSendToPlayer(players[1]);
NetServer::ReSendToPlayer(players[2]);
NetServer::ReSendToPlayer(players[3]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
break;
......@@ -876,6 +911,8 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
case MSG_SUMMONED: {
NetServer::SendBufferToPlayer(players[0], STOC_GAME_MSG, offset, pbuf - offset);
NetServer::ReSendToPlayer(players[1]);
NetServer::ReSendToPlayer(players[2]);
NetServer::ReSendToPlayer(players[3]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
RefreshMzone(0);
......@@ -888,6 +925,8 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
pbuf += 8;
NetServer::SendBufferToPlayer(players[0], STOC_GAME_MSG, offset, pbuf - offset);
NetServer::ReSendToPlayer(players[1]);
NetServer::ReSendToPlayer(players[2]);
NetServer::ReSendToPlayer(players[3]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
break;
......@@ -895,6 +934,8 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
case MSG_SPSUMMONED: {
NetServer::SendBufferToPlayer(players[0], STOC_GAME_MSG, offset, pbuf - offset);
NetServer::ReSendToPlayer(players[1]);
NetServer::ReSendToPlayer(players[2]);
NetServer::ReSendToPlayer(players[3]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
RefreshMzone(0);
......@@ -908,6 +949,8 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
pbuf += 8;
NetServer::SendBufferToPlayer(players[0], STOC_GAME_MSG, offset, pbuf - offset);
NetServer::ReSendToPlayer(players[1]);
NetServer::ReSendToPlayer(players[2]);
NetServer::ReSendToPlayer(players[3]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
break;
......@@ -915,6 +958,8 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
case MSG_FLIPSUMMONED: {
NetServer::SendBufferToPlayer(players[0], STOC_GAME_MSG, offset, pbuf - offset);
NetServer::ReSendToPlayer(players[1]);
NetServer::ReSendToPlayer(players[2]);
NetServer::ReSendToPlayer(players[3]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
RefreshMzone(0);
......@@ -927,6 +972,8 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
pbuf += 16;
NetServer::SendBufferToPlayer(players[0], STOC_GAME_MSG, offset, pbuf - offset);
NetServer::ReSendToPlayer(players[1]);
NetServer::ReSendToPlayer(players[2]);
NetServer::ReSendToPlayer(players[3]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
break;
......@@ -935,6 +982,8 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
pbuf++;
NetServer::SendBufferToPlayer(players[0], STOC_GAME_MSG, offset, pbuf - offset);
NetServer::ReSendToPlayer(players[1]);
NetServer::ReSendToPlayer(players[2]);
NetServer::ReSendToPlayer(players[3]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
RefreshMzone(0);
......@@ -949,6 +998,8 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
pbuf++;
NetServer::SendBufferToPlayer(players[0], STOC_GAME_MSG, offset, pbuf - offset);
NetServer::ReSendToPlayer(players[1]);
NetServer::ReSendToPlayer(players[2]);
NetServer::ReSendToPlayer(players[3]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
break;
......@@ -957,6 +1008,8 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
pbuf++;
NetServer::SendBufferToPlayer(players[0], STOC_GAME_MSG, offset, pbuf - offset);
NetServer::ReSendToPlayer(players[1]);
NetServer::ReSendToPlayer(players[2]);
NetServer::ReSendToPlayer(players[3]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
RefreshMzone(0);
......@@ -970,6 +1023,8 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
case MSG_CHAIN_END: {
NetServer::SendBufferToPlayer(players[0], STOC_GAME_MSG, offset, pbuf - offset);
NetServer::ReSendToPlayer(players[1]);
NetServer::ReSendToPlayer(players[2]);
NetServer::ReSendToPlayer(players[3]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
RefreshMzone(0);
......@@ -984,6 +1039,8 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
pbuf++;
NetServer::SendBufferToPlayer(players[0], STOC_GAME_MSG, offset, pbuf - offset);
NetServer::ReSendToPlayer(players[1]);
NetServer::ReSendToPlayer(players[2]);
NetServer::ReSendToPlayer(players[3]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
break;
......@@ -992,6 +1049,8 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
pbuf++;
NetServer::SendBufferToPlayer(players[0], STOC_GAME_MSG, offset, pbuf - offset);
NetServer::ReSendToPlayer(players[1]);
NetServer::ReSendToPlayer(players[2]);
NetServer::ReSendToPlayer(players[3]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
break;
......@@ -1008,6 +1067,8 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
pbuf += count * 4;
NetServer::SendBufferToPlayer(players[player], STOC_GAME_MSG, offset, pbuf - offset);
NetServer::ReSendToPlayer(players[1]);
NetServer::ReSendToPlayer(players[2]);
NetServer::ReSendToPlayer(players[3]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
break;
......@@ -1017,6 +1078,8 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
pbuf += count * 4;
NetServer::SendBufferToPlayer(players[0], STOC_GAME_MSG, offset, pbuf - offset);
NetServer::ReSendToPlayer(players[1]);
NetServer::ReSendToPlayer(players[2]);
NetServer::ReSendToPlayer(players[3]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
break;
......@@ -1026,10 +1089,12 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
count = BufferIO::ReadInt8(pbuf);
pbufw = pbuf;
pbuf += count * 4;
NetServer::SendBufferToPlayer(players[player], STOC_GAME_MSG, offset, pbuf - offset);
NetServer::SendBufferToPlayer(cur_player[player], STOC_GAME_MSG, offset, pbuf - offset);
for (int i = 0; i < count; ++i)
BufferIO::WriteInt32(pbufw, 0);
NetServer::SendBufferToPlayer(players[1 - player], STOC_GAME_MSG, offset, pbuf - offset);
for(int i = 0; i < 4; ++i)
if(players[i] != cur_player[player])
NetServer::SendBufferToPlayer(players[i], STOC_GAME_MSG, offset, pbuf - offset);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
break;
......@@ -1038,6 +1103,8 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
pbuf += 5;
NetServer::SendBufferToPlayer(players[0], STOC_GAME_MSG, offset, pbuf - offset);
NetServer::ReSendToPlayer(players[1]);
NetServer::ReSendToPlayer(players[2]);
NetServer::ReSendToPlayer(players[3]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
break;
......@@ -1046,6 +1113,8 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
pbuf += 5;
NetServer::SendBufferToPlayer(players[0], STOC_GAME_MSG, offset, pbuf - offset);
NetServer::ReSendToPlayer(players[1]);
NetServer::ReSendToPlayer(players[2]);
NetServer::ReSendToPlayer(players[3]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
break;
......@@ -1054,6 +1123,8 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
pbuf += 8;
NetServer::SendBufferToPlayer(players[0], STOC_GAME_MSG, offset, pbuf - offset);
NetServer::ReSendToPlayer(players[1]);
NetServer::ReSendToPlayer(players[2]);
NetServer::ReSendToPlayer(players[3]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
break;
......@@ -1062,6 +1133,8 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
pbuf += 5;
NetServer::SendBufferToPlayer(players[0], STOC_GAME_MSG, offset, pbuf - offset);
NetServer::ReSendToPlayer(players[1]);
NetServer::ReSendToPlayer(players[2]);
NetServer::ReSendToPlayer(players[3]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
break;
......@@ -1070,6 +1143,8 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
pbuf += 4;
NetServer::SendBufferToPlayer(players[0], STOC_GAME_MSG, offset, pbuf - offset);
NetServer::ReSendToPlayer(players[1]);
NetServer::ReSendToPlayer(players[2]);
NetServer::ReSendToPlayer(players[3]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
break;
......@@ -1078,6 +1153,8 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
pbuf += 8;
NetServer::SendBufferToPlayer(players[0], STOC_GAME_MSG, offset, pbuf - offset);
NetServer::ReSendToPlayer(players[1]);
NetServer::ReSendToPlayer(players[2]);
NetServer::ReSendToPlayer(players[3]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
break;
......@@ -1086,6 +1163,8 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
pbuf += 8;
NetServer::SendBufferToPlayer(players[0], STOC_GAME_MSG, offset, pbuf - offset);
NetServer::ReSendToPlayer(players[1]);
NetServer::ReSendToPlayer(players[2]);
NetServer::ReSendToPlayer(players[3]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
break;
......@@ -1094,6 +1173,8 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
pbuf += 5;
NetServer::SendBufferToPlayer(players[0], STOC_GAME_MSG, offset, pbuf - offset);
NetServer::ReSendToPlayer(players[1]);
NetServer::ReSendToPlayer(players[2]);
NetServer::ReSendToPlayer(players[3]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
break;
......@@ -1102,6 +1183,8 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
pbuf += 6;
NetServer::SendBufferToPlayer(players[0], STOC_GAME_MSG, offset, pbuf - offset);
NetServer::ReSendToPlayer(players[1]);
NetServer::ReSendToPlayer(players[2]);
NetServer::ReSendToPlayer(players[3]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
break;
......@@ -1110,6 +1193,8 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
pbuf += 6;
NetServer::SendBufferToPlayer(players[0], STOC_GAME_MSG, offset, pbuf - offset);
NetServer::ReSendToPlayer(players[1]);
NetServer::ReSendToPlayer(players[2]);
NetServer::ReSendToPlayer(players[3]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
break;
......@@ -1118,6 +1203,8 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
pbuf += 8;
NetServer::SendBufferToPlayer(players[0], STOC_GAME_MSG, offset, pbuf - offset);
NetServer::ReSendToPlayer(players[1]);
NetServer::ReSendToPlayer(players[2]);
NetServer::ReSendToPlayer(players[3]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
break;
......@@ -1126,6 +1213,8 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
pbuf += 18;
NetServer::SendBufferToPlayer(players[0], STOC_GAME_MSG, offset, pbuf - offset);
NetServer::ReSendToPlayer(players[1]);
NetServer::ReSendToPlayer(players[2]);
NetServer::ReSendToPlayer(players[3]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
break;
......@@ -1133,6 +1222,8 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
case MSG_ATTACK_DISABLED: {
NetServer::SendBufferToPlayer(players[0], STOC_GAME_MSG, offset, pbuf - offset);
NetServer::ReSendToPlayer(players[1]);
NetServer::ReSendToPlayer(players[2]);
NetServer::ReSendToPlayer(players[3]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
break;
......@@ -1140,6 +1231,8 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
case MSG_DAMAGE_STEP_START: {
NetServer::SendBufferToPlayer(players[0], STOC_GAME_MSG, offset, pbuf - offset);
NetServer::ReSendToPlayer(players[1]);
NetServer::ReSendToPlayer(players[2]);
NetServer::ReSendToPlayer(players[3]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
RefreshMzone(0);
......@@ -1149,6 +1242,8 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
case MSG_DAMAGE_STEP_END: {
NetServer::SendBufferToPlayer(players[0], STOC_GAME_MSG, offset, pbuf - offset);
NetServer::ReSendToPlayer(players[1]);
NetServer::ReSendToPlayer(players[2]);
NetServer::ReSendToPlayer(players[3]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
RefreshMzone(0);
......@@ -1158,7 +1253,7 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
case MSG_MISSED_EFFECT: {
player = pbuf[0];
pbuf += 8;
NetServer::SendBufferToPlayer(players[player], STOC_GAME_MSG, offset, pbuf - offset);
NetServer::SendBufferToPlayer(cur_player[player], STOC_GAME_MSG, offset, pbuf - offset);
break;
}
case MSG_TOSS_COIN: {
......@@ -1167,6 +1262,8 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
pbuf += count;
NetServer::SendBufferToPlayer(players[0], STOC_GAME_MSG, offset, pbuf - offset);
NetServer::ReSendToPlayer(players[1]);
NetServer::ReSendToPlayer(players[2]);
NetServer::ReSendToPlayer(players[3]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
break;
......@@ -1177,6 +1274,8 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
pbuf += count;
NetServer::SendBufferToPlayer(players[0], STOC_GAME_MSG, offset, pbuf - offset);
NetServer::ReSendToPlayer(players[1]);
NetServer::ReSendToPlayer(players[2]);
NetServer::ReSendToPlayer(players[3]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
break;
......@@ -1185,20 +1284,20 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
player = BufferIO::ReadInt8(pbuf);
pbuf += 5;
WaitforResponse(player);
NetServer::SendBufferToPlayer(players[player], STOC_GAME_MSG, offset, pbuf - offset);
NetServer::SendBufferToPlayer(cur_player[player], STOC_GAME_MSG, offset, pbuf - offset);
return 1;
}
case MSG_ANNOUNCE_ATTRIB: {
player = BufferIO::ReadInt8(pbuf);
pbuf += 5;
WaitforResponse(player);
NetServer::SendBufferToPlayer(players[player], STOC_GAME_MSG, offset, pbuf - offset);
NetServer::SendBufferToPlayer(cur_player[player], STOC_GAME_MSG, offset, pbuf - offset);
return 1;
}
case MSG_ANNOUNCE_CARD: {
player = BufferIO::ReadInt8(pbuf);
WaitforResponse(player);
NetServer::SendBufferToPlayer(players[player], STOC_GAME_MSG, offset, pbuf - offset);
NetServer::SendBufferToPlayer(cur_player[player], STOC_GAME_MSG, offset, pbuf - offset);
return 1;
}
case MSG_ANNOUNCE_NUMBER: {
......@@ -1206,13 +1305,15 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
count = BufferIO::ReadInt8(pbuf);
pbuf += 4 * count;
WaitforResponse(player);
NetServer::SendBufferToPlayer(players[player], STOC_GAME_MSG, offset, pbuf - offset);
NetServer::SendBufferToPlayer(cur_player[player], STOC_GAME_MSG, offset, pbuf - offset);
return 1;
}
case MSG_CARD_HINT: {
pbuf += 9;
NetServer::SendBufferToPlayer(players[0], STOC_GAME_MSG, offset, pbuf - offset);
NetServer::ReSendToPlayer(players[1]);
NetServer::ReSendToPlayer(players[2]);
NetServer::ReSendToPlayer(players[3]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
break;
......@@ -1229,9 +1330,10 @@ void TagDuel::GetResponse(DuelPlayer* dp, void* pdata, unsigned int len) {
set_responseb(pduel, resb);
players[dp->type]->state = 0xff;
if(host_info.time_limit) {
if(time_limit[dp->type] >= time_elapsed)
time_limit[dp->type] -= time_elapsed;
else time_limit[dp->type] = 0;
int resp_type = dp->type < 2 ? 0 : 1;
if(time_limit[resp_type] >= time_elapsed)
time_limit[resp_type] -= time_elapsed;
else time_limit[resp_type] = 0;
event_del(etimer);
}
Process();
......@@ -1246,6 +1348,8 @@ void TagDuel::EndDuel() {
memcpy(pbuf, last_replay.comp_data, last_replay.comp_size);
NetServer::SendBufferToPlayer(players[0], STOC_REPLAY, replaybuf, sizeof(ReplayHeader) + last_replay.comp_size);
NetServer::ReSendToPlayer(players[1]);
NetServer::ReSendToPlayer(players[2]);
NetServer::ReSendToPlayer(players[3]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
end_duel(pduel);
......@@ -1254,23 +1358,27 @@ void TagDuel::EndDuel() {
void TagDuel::WaitforResponse(int playerid) {
last_response = playerid;
unsigned char msg = MSG_WAITING;
NetServer::SendPacketToPlayer(players[1 - playerid], STOC_GAME_MSG, msg);
for(int i = 0; i < 4; ++i)
if(players[i] != cur_player[playerid])
NetServer::SendPacketToPlayer(players[i], STOC_GAME_MSG, msg);
if(host_info.time_limit) {
STOC_TimeLimit sctl;
sctl.player = playerid;
sctl.left_time = time_limit[playerid];
NetServer::SendPacketToPlayer(players[0], STOC_TIME_LIMIT, sctl);
NetServer::SendPacketToPlayer(players[1], STOC_TIME_LIMIT, sctl);
players[playerid]->state = CTOS_TIME_CONFIRM;
NetServer::ReSendToPlayer(players[1]);
NetServer::ReSendToPlayer(players[2]);
NetServer::ReSendToPlayer(players[3]);
cur_player[playerid]->state = CTOS_TIME_CONFIRM;
} else
players[playerid]->state = CTOS_RESPONSE;
cur_player[playerid]->state = CTOS_RESPONSE;
}
void TagDuel::TimeConfirm(DuelPlayer* dp) {
if(host_info.time_limit == 0)
return;
if(dp->type != last_response)
return;
players[last_response]->state = CTOS_RESPONSE;
cur_player[last_response]->state = CTOS_RESPONSE;
time_elapsed = 0;
timeval timeout = {1, 0};
event_add(etimer, &timeout);
......@@ -1282,7 +1390,7 @@ void TagDuel::RefreshMzone(int player, int flag, int use_cache) {
BufferIO::WriteInt8(qbuf, player);
BufferIO::WriteInt8(qbuf, LOCATION_MZONE);
int len = query_field_card(pduel, player, LOCATION_MZONE, flag, (unsigned char*)qbuf, use_cache);
NetServer::SendBufferToPlayer(players[player], STOC_GAME_MSG, query_buffer, len + 3);
NetServer::SendBufferToPlayer(cur_player[player], STOC_GAME_MSG, query_buffer, len + 3);
for (int i = 0; i < 5; ++i) {
int clen = BufferIO::ReadInt32(qbuf);
if (clen == 4)
......@@ -1291,7 +1399,9 @@ void TagDuel::RefreshMzone(int player, int flag, int use_cache) {
memset(qbuf, 0, clen - 4);
qbuf += clen - 4;
}
NetServer::SendBufferToPlayer(players[1 - player], STOC_GAME_MSG, query_buffer, len + 3);
for(int i = 0; i < 4; ++i)
if(players[i] != cur_player[player])
NetServer::SendBufferToPlayer(players[i], STOC_GAME_MSG, query_buffer, len + 3);
for(auto pit = observers.begin(); pit != observers.end(); ++pit)
NetServer::ReSendToPlayer(*pit);
}
......@@ -1302,7 +1412,7 @@ void TagDuel::RefreshSzone(int player, int flag, int use_cache) {
BufferIO::WriteInt8(qbuf, player);
BufferIO::WriteInt8(qbuf, LOCATION_SZONE);
int len = query_field_card(pduel, player, LOCATION_SZONE, flag, (unsigned char*)qbuf, use_cache);
NetServer::SendBufferToPlayer(players[player], STOC_GAME_MSG, query_buffer, len + 3);
NetServer::SendBufferToPlayer(cur_player[player], STOC_GAME_MSG, query_buffer, len + 3);
for (int i = 0; i < 6; ++i) {
int clen = BufferIO::ReadInt32(qbuf);
if (clen == 4)
......@@ -1311,7 +1421,9 @@ void TagDuel::RefreshSzone(int player, int flag, int use_cache) {
memset(qbuf, 0, clen - 4);
qbuf += clen - 4;
}
NetServer::SendBufferToPlayer(players[1 - player], STOC_GAME_MSG, query_buffer, len + 3);
for(int i = 0; i < 4; ++i)
if(players[i] != cur_player[player])
NetServer::SendBufferToPlayer(players[i], STOC_GAME_MSG, query_buffer, len + 3);
for(auto pit = observers.begin(); pit != observers.end(); ++pit)
NetServer::ReSendToPlayer(*pit);
}
......@@ -1322,7 +1434,7 @@ void TagDuel::RefreshHand(int player, int flag, int use_cache) {
BufferIO::WriteInt8(qbuf, player);
BufferIO::WriteInt8(qbuf, LOCATION_HAND);
int len = query_field_card(pduel, player, LOCATION_HAND, flag | QUERY_IS_PUBLIC, (unsigned char*)qbuf, use_cache);
NetServer::SendBufferToPlayer(players[player], STOC_GAME_MSG, query_buffer, len + 3);
NetServer::SendBufferToPlayer(cur_player[player], STOC_GAME_MSG, query_buffer, len + 3);
int qlen = 0, slen, qflag;
while(qlen < len) {
slen = BufferIO::ReadInt32(qbuf);
......@@ -1332,7 +1444,9 @@ void TagDuel::RefreshHand(int player, int flag, int use_cache) {
qbuf += slen - 4;
qlen += slen;
}
NetServer::SendBufferToPlayer(players[1 - player], STOC_GAME_MSG, query_buffer, len + 3);
for(int i = 0; i < 4; ++i)
if(players[i] != cur_player[player])
NetServer::SendBufferToPlayer(players[i], STOC_GAME_MSG, query_buffer, len + 3);
for(auto pit = observers.begin(); pit != observers.end(); ++pit)
NetServer::ReSendToPlayer(*pit);
}
......@@ -1345,6 +1459,8 @@ void TagDuel::RefreshGrave(int player, int flag, int use_cache) {
int len = query_field_card(pduel, player, LOCATION_GRAVE, flag, (unsigned char*)qbuf, use_cache);
NetServer::SendBufferToPlayer(players[0], STOC_GAME_MSG, query_buffer, len + 3);
NetServer::ReSendToPlayer(players[1]);
NetServer::ReSendToPlayer(players[2]);
NetServer::ReSendToPlayer(players[3]);
for(auto pit = observers.begin(); pit != observers.end(); ++pit)
NetServer::ReSendToPlayer(*pit);
}
......@@ -1355,7 +1471,7 @@ void TagDuel::RefreshExtra(int player, int flag, int use_cache) {
BufferIO::WriteInt8(qbuf, player);
BufferIO::WriteInt8(qbuf, LOCATION_EXTRA);
int len = query_field_card(pduel, player, LOCATION_EXTRA, flag, (unsigned char*)qbuf, use_cache);
NetServer::SendBufferToPlayer(players[player], STOC_GAME_MSG, query_buffer, len + 3);
NetServer::SendBufferToPlayer(cur_player[player], STOC_GAME_MSG, query_buffer, len + 3);
}
void TagDuel::RefreshSingle(int player, int location, int sequence, int flag) {
char query_buffer[0x1000];
......@@ -1367,9 +1483,11 @@ void TagDuel::RefreshSingle(int player, int location, int sequence, int flag) {
int len = query_card(pduel, player, location, sequence, flag, (unsigned char*)qbuf, 0);
if(location == LOCATION_REMOVED && (qbuf[15] & POS_FACEDOWN))
return;
NetServer::SendBufferToPlayer(players[player], STOC_GAME_MSG, query_buffer, len + 4);
NetServer::SendBufferToPlayer(cur_player[player], STOC_GAME_MSG, query_buffer, len + 4);
if ((location & 0x90) || ((location & 0x2c) && (qbuf[15] & POS_FACEUP))) {
NetServer::ReSendToPlayer(players[1 - player]);
for(int i = 0; i < 4; ++i)
if(players[i] != cur_player[player])
NetServer::ReSendToPlayer(players[i]);
for(auto pit = observers.begin(); pit != observers.end(); ++pit)
NetServer::ReSendToPlayer(*pit);
}
......@@ -1403,6 +1521,8 @@ void TagDuel::SingleTimer(evutil_socket_t fd, short events, void* arg) {
wbuf[2] = 0x3;
NetServer::SendBufferToPlayer(sd->players[0], STOC_GAME_MSG, wbuf, 3);
NetServer::ReSendToPlayer(sd->players[1]);
NetServer::ReSendToPlayer(sd->players[2]);
NetServer::ReSendToPlayer(sd->players[3]);
sd->EndDuel();
sd->DuelEndProc();
event_del(sd->etimer);
......
......@@ -3519,6 +3519,8 @@ int32 field::process_turn(uint16 step, uint8 turn_player) {
(*rit)->recharge();
infos.turn_id++;
infos.turn_player = turn_player;
if(core.duel_options & DUEL_TAG_MODE)
tag_swap(turn_player);
pduel->write_buffer8(MSG_NEW_TURN);
pduel->write_buffer8(turn_player);
if(is_player_affected_by_effect(infos.turn_player, EFFECT_SKIP_TURN)) {
......
......@@ -309,9 +309,9 @@
!system 1349 录像信息:
!system 1350 离开
!system 1351 投降
!system 1390 等待对方行动中...
!system 1391 等待对方行动中....
!system 1392 等待对方行动中.....
!system 1390 等待行动中...
!system 1391 等待行动中....
!system 1392 等待行动中.....
!system 1400 无法连接到主机。
!system 1401 连接已断开。
!system 1402 网络传输发生错误。
......
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