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