Commit 6dcb7a3f authored by argon.sun's avatar argon.sun

fix

parent 1308d53b
...@@ -2,6 +2,7 @@ ...@@ -2,6 +2,7 @@
#include "materials.h" #include "materials.h"
#include "image_manager.h" #include "image_manager.h"
#include "deck_manager.h" #include "deck_manager.h"
#include "duelclient.h"
#include "../ocgcore/field.h" #include "../ocgcore/field.h"
namespace ygo { namespace ygo {
...@@ -442,7 +443,7 @@ void Game::DrawGUI() { ...@@ -442,7 +443,7 @@ void Game::DrawGUI() {
fu.guiFading->setRelativePosition(irr::core::recti(fu.fadingUL, fu.fadingLR)); fu.guiFading->setRelativePosition(irr::core::recti(fu.fadingUL, fu.fadingLR));
} }
if(fu.signalAction && !fu.fadingFrame) { if(fu.signalAction && !fu.fadingFrame) {
localAction.Set(); DuelClient::SendResponse();
fu.signalAction = false; fu.signalAction = false;
} }
} }
......
...@@ -401,8 +401,8 @@ void DuelClient::HandleSTOCPacketLan(char* data, unsigned int len) { ...@@ -401,8 +401,8 @@ void DuelClient::HandleSTOCPacketLan(char* data, unsigned int len) {
mainGame->stMessage->setText(dataManager.GetSysString(1500)); mainGame->stMessage->setText(dataManager.GetSysString(1500));
mainGame->PopupElement(mainGame->wMessage); mainGame->PopupElement(mainGame->wMessage);
mainGame->gMutex.Unlock(); mainGame->gMutex.Unlock();
mainGame->localAction.Reset(); mainGame->actionSignal.Reset();
mainGame->localAction.Wait(); mainGame->actionSignal.Wait();
mainGame->gMutex.Lock(); mainGame->gMutex.Lock();
mainGame->CloseDuelWindow(); mainGame->CloseDuelWindow();
mainGame->dInfo.isStarted = false; mainGame->dInfo.isStarted = false;
...@@ -521,8 +521,8 @@ int DuelClient::ClientAnalyze(char* msg, unsigned int len) { ...@@ -521,8 +521,8 @@ int DuelClient::ClientAnalyze(char* msg, unsigned int len) {
mainGame->stMessage->setText(dataManager.GetDesc(data)); mainGame->stMessage->setText(dataManager.GetDesc(data));
mainGame->PopupElement(mainGame->wMessage); mainGame->PopupElement(mainGame->wMessage);
mainGame->gMutex.Unlock(); mainGame->gMutex.Unlock();
mainGame->localAction.Reset(); mainGame->actionSignal.Reset();
mainGame->localAction.Wait(); mainGame->actionSignal.Wait();
break; break;
} }
case HINT_SELECTMSG: { case HINT_SELECTMSG: {
...@@ -715,12 +715,6 @@ int DuelClient::ClientAnalyze(char* msg, unsigned int len) { ...@@ -715,12 +715,6 @@ int DuelClient::ClientAnalyze(char* msg, unsigned int len) {
mainGame->btnEP->setPressed(false); mainGame->btnEP->setPressed(false);
} }
mainGame->gMutex.Unlock(); mainGame->gMutex.Unlock();
mainGame->localAction.Reset();
mainGame->localAction.Wait();
mainGame->dField.ClearCommandFlag();
mainGame->btnM2->setVisible(false);
mainGame->btnEP->setVisible(false);
DuelClient::SendResponse();
return true; return true;
} }
case MSG_SELECT_IDLECMD: { case MSG_SELECT_IDLECMD: {
...@@ -820,12 +814,6 @@ int DuelClient::ClientAnalyze(char* msg, unsigned int len) { ...@@ -820,12 +814,6 @@ int DuelClient::ClientAnalyze(char* msg, unsigned int len) {
mainGame->btnEP->setEnabled(true); mainGame->btnEP->setEnabled(true);
mainGame->btnEP->setPressed(false); mainGame->btnEP->setPressed(false);
} }
mainGame->localAction.Reset();
mainGame->localAction.Wait();
mainGame->dField.ClearCommandFlag();
mainGame->btnBP->setVisible(false);
mainGame->btnEP->setVisible(false);
DuelClient::SendResponse();
return true; return true;
} }
case MSG_SELECT_EFFECTYN: { case MSG_SELECT_EFFECTYN: {
...@@ -843,9 +831,6 @@ int DuelClient::ClientAnalyze(char* msg, unsigned int len) { ...@@ -843,9 +831,6 @@ int DuelClient::ClientAnalyze(char* msg, unsigned int len) {
mainGame->SetStaticText(mainGame->stQMessage, 310, mainGame->textFont, textBuffer); mainGame->SetStaticText(mainGame->stQMessage, 310, mainGame->textFont, textBuffer);
mainGame->PopupElement(mainGame->wQuery); mainGame->PopupElement(mainGame->wQuery);
mainGame->gMutex.Unlock(); mainGame->gMutex.Unlock();
mainGame->localAction.Reset();
mainGame->localAction.Wait();
DuelClient::SendResponse();
return true; return true;
} }
case MSG_SELECT_YESNO: { case MSG_SELECT_YESNO: {
...@@ -855,9 +840,6 @@ int DuelClient::ClientAnalyze(char* msg, unsigned int len) { ...@@ -855,9 +840,6 @@ int DuelClient::ClientAnalyze(char* msg, unsigned int len) {
mainGame->SetStaticText(mainGame->stQMessage, 310, mainGame->textFont, (wchar_t*)dataManager.GetDesc(desc)); mainGame->SetStaticText(mainGame->stQMessage, 310, mainGame->textFont, (wchar_t*)dataManager.GetDesc(desc));
mainGame->PopupElement(mainGame->wQuery); mainGame->PopupElement(mainGame->wQuery);
mainGame->gMutex.Unlock(); mainGame->gMutex.Unlock();
mainGame->localAction.Reset();
mainGame->localAction.Wait();
DuelClient::SendResponse();
return true; return true;
} }
case MSG_SELECT_OPTION: { case MSG_SELECT_OPTION: {
...@@ -881,9 +863,6 @@ int DuelClient::ClientAnalyze(char* msg, unsigned int len) { ...@@ -881,9 +863,6 @@ int DuelClient::ClientAnalyze(char* msg, unsigned int len) {
mainGame->wOptions->setText(textBuffer); mainGame->wOptions->setText(textBuffer);
mainGame->PopupElement(mainGame->wOptions); mainGame->PopupElement(mainGame->wOptions);
mainGame->gMutex.Unlock(); mainGame->gMutex.Unlock();
mainGame->localAction.Reset();
mainGame->localAction.Wait();
DuelClient::SendResponse();
return true; return true;
} }
case MSG_SELECT_CARD: { case MSG_SELECT_CARD: {
...@@ -932,10 +911,6 @@ int DuelClient::ClientAnalyze(char* msg, unsigned int len) { ...@@ -932,10 +911,6 @@ int DuelClient::ClientAnalyze(char* msg, unsigned int len) {
mainGame->stHintMsg->setText(textBuffer); mainGame->stHintMsg->setText(textBuffer);
mainGame->stHintMsg->setVisible(true); mainGame->stHintMsg->setVisible(true);
} }
mainGame->localAction.Reset();
mainGame->localAction.Wait();
mainGame->dField.ClearSelect();
DuelClient::SendResponse();
return true; return true;
} }
case MSG_SELECT_CHAIN: { case MSG_SELECT_CHAIN: {
...@@ -982,10 +957,6 @@ int DuelClient::ClientAnalyze(char* msg, unsigned int len) { ...@@ -982,10 +957,6 @@ int DuelClient::ClientAnalyze(char* msg, unsigned int len) {
mainGame->SetStaticText(mainGame->stQMessage, 310, mainGame->textFont, (wchar_t*)textBuffer); mainGame->SetStaticText(mainGame->stQMessage, 310, mainGame->textFont, (wchar_t*)textBuffer);
mainGame->PopupElement(mainGame->wQuery); mainGame->PopupElement(mainGame->wQuery);
mainGame->gMutex.Unlock(); mainGame->gMutex.Unlock();
mainGame->localAction.Reset();
mainGame->localAction.Wait();
mainGame->dField.ClearChainSelect();
DuelClient::SendResponse();
return true; return true;
} }
case MSG_SELECT_PLACE: case MSG_SELECT_PLACE:
...@@ -1030,9 +1001,6 @@ int DuelClient::ClientAnalyze(char* msg, unsigned int len) { ...@@ -1030,9 +1001,6 @@ int DuelClient::ClientAnalyze(char* msg, unsigned int len) {
DuelClient::SendResponse(); DuelClient::SendResponse();
return true; return true;
} }
mainGame->localAction.Reset();
mainGame->localAction.Wait();
DuelClient::SendResponse();
return true; return true;
} }
case MSG_SELECT_POSITION: { case MSG_SELECT_POSITION: {
...@@ -1076,9 +1044,6 @@ int DuelClient::ClientAnalyze(char* msg, unsigned int len) { ...@@ -1076,9 +1044,6 @@ int DuelClient::ClientAnalyze(char* msg, unsigned int len) {
mainGame->gMutex.Lock(); mainGame->gMutex.Lock();
mainGame->PopupElement(mainGame->wPosSelect); mainGame->PopupElement(mainGame->wPosSelect);
mainGame->gMutex.Unlock(); mainGame->gMutex.Unlock();
mainGame->localAction.Reset();
mainGame->localAction.Wait();
DuelClient::SendResponse();
return true; return true;
} }
case MSG_SELECT_TRIBUTE: { case MSG_SELECT_TRIBUTE: {
...@@ -1108,10 +1073,6 @@ int DuelClient::ClientAnalyze(char* msg, unsigned int len) { ...@@ -1108,10 +1073,6 @@ int DuelClient::ClientAnalyze(char* msg, unsigned int len) {
} }
mainGame->stHintMsg->setText(dataManager.GetSysString(531)); mainGame->stHintMsg->setText(dataManager.GetSysString(531));
mainGame->stHintMsg->setVisible(false); mainGame->stHintMsg->setVisible(false);
mainGame->localAction.Reset();
mainGame->localAction.Wait();
mainGame->dField.ClearSelect();
DuelClient::SendResponse();
return true; return true;
} }
case MSG_SELECT_COUNTER: { case MSG_SELECT_COUNTER: {
...@@ -1138,10 +1099,6 @@ int DuelClient::ClientAnalyze(char* msg, unsigned int len) { ...@@ -1138,10 +1099,6 @@ int DuelClient::ClientAnalyze(char* msg, unsigned int len) {
mainGame->stHintMsg->setText(textBuffer); mainGame->stHintMsg->setText(textBuffer);
mainGame->stHintMsg->setVisible(true); mainGame->stHintMsg->setVisible(true);
mainGame->gMutex.Unlock(); mainGame->gMutex.Unlock();
mainGame->localAction.Reset();
mainGame->localAction.Wait();
mainGame->dField.ClearSelect();
DuelClient::SendResponse();
return true; return true;
} }
case MSG_SELECT_SUM: { case MSG_SELECT_SUM: {
...@@ -1183,13 +1140,6 @@ int DuelClient::ClientAnalyze(char* msg, unsigned int len) { ...@@ -1183,13 +1140,6 @@ int DuelClient::ClientAnalyze(char* msg, unsigned int len) {
mainGame->stHintMsg->setText(textBuffer); mainGame->stHintMsg->setText(textBuffer);
mainGame->stHintMsg->setVisible(true); mainGame->stHintMsg->setVisible(true);
} }
mainGame->localAction.Reset();
mainGame->localAction.Wait();
for(int i = 0; i < mainGame->dField.selectsum_all.size(); ++i) {
mainGame->dField.selectsum_all[i]->is_selectable = false;
mainGame->dField.selectsum_all[i]->is_selected = false;
}
DuelClient::SendResponse();
return true; return true;
} }
case MSG_SORT_CARD: case MSG_SORT_CARD:
...@@ -1225,9 +1175,6 @@ int DuelClient::ClientAnalyze(char* msg, unsigned int len) { ...@@ -1225,9 +1175,6 @@ int DuelClient::ClientAnalyze(char* msg, unsigned int len) {
mainGame->dField.select_min = 0; mainGame->dField.select_min = 0;
mainGame->dField.select_max = count; mainGame->dField.select_max = count;
mainGame->dField.ShowSelectCard(); mainGame->dField.ShowSelectCard();
mainGame->localAction.Reset();
mainGame->localAction.Wait();
DuelClient::SendResponse();
return true; return true;
} }
case MSG_CONFIRM_DECKTOP: { case MSG_CONFIRM_DECKTOP: {
...@@ -1337,8 +1284,8 @@ int DuelClient::ClientAnalyze(char* msg, unsigned int len) { ...@@ -1337,8 +1284,8 @@ int DuelClient::ClientAnalyze(char* msg, unsigned int len) {
mainGame->dField.selectable_cards = panel_confirm; mainGame->dField.selectable_cards = panel_confirm;
mainGame->dField.ShowSelectCard(true); mainGame->dField.ShowSelectCard(true);
mainGame->gMutex.Unlock(); mainGame->gMutex.Unlock();
mainGame->localAction.Reset(); mainGame->actionSignal.Reset();
mainGame->localAction.Wait(); mainGame->actionSignal.Wait();
} }
return true; return true;
} }
...@@ -2301,9 +2248,6 @@ int DuelClient::ClientAnalyze(char* msg, unsigned int len) { ...@@ -2301,9 +2248,6 @@ int DuelClient::ClientAnalyze(char* msg, unsigned int len) {
mainGame->wANRace->setText(textBuffer); mainGame->wANRace->setText(textBuffer);
mainGame->PopupElement(mainGame->wANRace); mainGame->PopupElement(mainGame->wANRace);
mainGame->gMutex.Unlock(); mainGame->gMutex.Unlock();
mainGame->localAction.Reset();
mainGame->localAction.Wait();
DuelClient::SendResponse();
return true; return true;
} }
case MSG_ANNOUNCE_ATTRIB: { case MSG_ANNOUNCE_ATTRIB: {
...@@ -2324,9 +2268,6 @@ int DuelClient::ClientAnalyze(char* msg, unsigned int len) { ...@@ -2324,9 +2268,6 @@ int DuelClient::ClientAnalyze(char* msg, unsigned int len) {
mainGame->wANAttribute->setText(textBuffer); mainGame->wANAttribute->setText(textBuffer);
mainGame->PopupElement(mainGame->wANAttribute); mainGame->PopupElement(mainGame->wANAttribute);
mainGame->gMutex.Unlock(); mainGame->gMutex.Unlock();
mainGame->localAction.Reset();
mainGame->localAction.Wait();
DuelClient::SendResponse();
return true; return true;
} }
case MSG_ANNOUNCE_CARD: { case MSG_ANNOUNCE_CARD: {
...@@ -2340,9 +2281,6 @@ int DuelClient::ClientAnalyze(char* msg, unsigned int len) { ...@@ -2340,9 +2281,6 @@ int DuelClient::ClientAnalyze(char* msg, unsigned int len) {
mainGame->wANCard->setText(textBuffer); mainGame->wANCard->setText(textBuffer);
mainGame->PopupElement(mainGame->wANCard); mainGame->PopupElement(mainGame->wANCard);
mainGame->gMutex.Unlock(); mainGame->gMutex.Unlock();
mainGame->localAction.Reset();
mainGame->localAction.Wait();
DuelClient::SendResponse();
return true; return true;
} }
case MSG_ANNOUNCE_NUMBER: { case MSG_ANNOUNCE_NUMBER: {
...@@ -2363,9 +2301,6 @@ int DuelClient::ClientAnalyze(char* msg, unsigned int len) { ...@@ -2363,9 +2301,6 @@ int DuelClient::ClientAnalyze(char* msg, unsigned int len) {
mainGame->wANNumber->setText(textBuffer); mainGame->wANNumber->setText(textBuffer);
mainGame->PopupElement(mainGame->wANNumber); mainGame->PopupElement(mainGame->wANNumber);
mainGame->gMutex.Unlock(); mainGame->gMutex.Unlock();
mainGame->localAction.Reset();
mainGame->localAction.Wait();
DuelClient::SendResponse();
return true; return true;
} }
case MSG_CARD_HINT: { case MSG_CARD_HINT: {
...@@ -2405,6 +2340,43 @@ void DuelClient::SetResponseB(unsigned char* respB, unsigned char len) { ...@@ -2405,6 +2340,43 @@ void DuelClient::SetResponseB(unsigned char* respB, unsigned char len) {
response_len = len; response_len = len;
} }
void DuelClient::SendResponse() { void DuelClient::SendResponse() {
switch(mainGame->dInfo.curMsg) {
case MSG_SELECT_BATTLECMD: {
mainGame->dField.ClearCommandFlag();
mainGame->btnM2->setVisible(false);
mainGame->btnEP->setVisible(false);
break;
}
case MSG_SELECT_IDLECMD: {
mainGame->dField.ClearCommandFlag();
mainGame->btnBP->setVisible(false);
mainGame->btnEP->setVisible(false);
break;
}
case MSG_SELECT_CARD: {
mainGame->dField.ClearSelect();
break;
}
case MSG_SELECT_CHAIN: {
mainGame->dField.ClearChainSelect();
break;
}
case MSG_SELECT_TRIBUTE: {
mainGame->dField.ClearSelect();
break;
}
case MSG_SELECT_COUNTER: {
mainGame->dField.ClearSelect();
break;
}
case MSG_SELECT_SUM: {
for(int i = 0; i < mainGame->dField.selectsum_all.size(); ++i) {
mainGame->dField.selectsum_all[i]->is_selectable = false;
mainGame->dField.selectsum_all[i]->is_selected = false;
}
break;
}
}
SendBufferToServer(CTOS_RESPONSE, response_buf, response_len); SendBufferToServer(CTOS_RESPONSE, response_buf, response_len);
} }
void DuelClient::BeginRefreshHost() { void DuelClient::BeginRefreshHost() {
......
...@@ -106,12 +106,12 @@ bool ClientField::OnEvent(const irr::SEvent& event) { ...@@ -106,12 +106,12 @@ bool ClientField::OnEvent(const irr::SEvent& event) {
DuelClient::SendPacketToServer(CTOS_SURRENDER); DuelClient::SendPacketToServer(CTOS_SURRENDER);
if(panel) if(panel)
mainGame->HideElement(panel); mainGame->HideElement(panel);
mainGame->localAction.Set();
} }
break; break;
} }
case BUTTON_MSG_OK: { case BUTTON_MSG_OK: {
mainGame->HideElement(mainGame->wMessage, true); mainGame->HideElement(mainGame->wMessage);
mainGame->actionSignal.Set();
break; break;
} }
case BUTTON_YES: { case BUTTON_YES: {
...@@ -254,7 +254,7 @@ bool ClientField::OnEvent(const irr::SEvent& event) { ...@@ -254,7 +254,7 @@ bool ClientField::OnEvent(const irr::SEvent& event) {
} else { } else {
DuelClient::SetResponseI(index); DuelClient::SetResponseI(index);
} }
mainGame->localAction.Set(); DuelClient::SendResponse();
} else { } else {
mainGame->SetStaticText(mainGame->stOptions, 310, mainGame->textFont, (wchar_t*)dataManager.GetDesc(select_options[0])); mainGame->SetStaticText(mainGame->stOptions, 310, mainGame->textFont, (wchar_t*)dataManager.GetDesc(select_options[0]));
selected_option = 0; selected_option = 0;
...@@ -305,7 +305,7 @@ bool ClientField::OnEvent(const irr::SEvent& event) { ...@@ -305,7 +305,7 @@ bool ClientField::OnEvent(const irr::SEvent& event) {
if(summonable_cards[i] == clicked_card) { if(summonable_cards[i] == clicked_card) {
ClearCommandFlag(); ClearCommandFlag();
DuelClient::SetResponseI(i << 16); DuelClient::SetResponseI(i << 16);
mainGame->localAction.Set(); DuelClient::SendResponse();
break; break;
} }
} }
...@@ -320,7 +320,7 @@ bool ClientField::OnEvent(const irr::SEvent& event) { ...@@ -320,7 +320,7 @@ bool ClientField::OnEvent(const irr::SEvent& event) {
if(spsummonable_cards[i] == clicked_card) { if(spsummonable_cards[i] == clicked_card) {
ClearCommandFlag(); ClearCommandFlag();
DuelClient::SetResponseI((i << 16) + 1); DuelClient::SetResponseI((i << 16) + 1);
mainGame->localAction.Set(); DuelClient::SendResponse();
break; break;
} }
} }
...@@ -359,7 +359,7 @@ bool ClientField::OnEvent(const irr::SEvent& event) { ...@@ -359,7 +359,7 @@ bool ClientField::OnEvent(const irr::SEvent& event) {
for(int i = 0; i < msetable_cards.size(); ++i) { for(int i = 0; i < msetable_cards.size(); ++i) {
if(msetable_cards[i] == clicked_card) { if(msetable_cards[i] == clicked_card) {
DuelClient::SetResponseI((i << 16) + 3); DuelClient::SetResponseI((i << 16) + 3);
mainGame->localAction.Set(); DuelClient::SendResponse();
break; break;
} }
} }
...@@ -372,7 +372,7 @@ bool ClientField::OnEvent(const irr::SEvent& event) { ...@@ -372,7 +372,7 @@ bool ClientField::OnEvent(const irr::SEvent& event) {
for(int i = 0; i < ssetable_cards.size(); ++i) { for(int i = 0; i < ssetable_cards.size(); ++i) {
if(ssetable_cards[i] == clicked_card) { if(ssetable_cards[i] == clicked_card) {
DuelClient::SetResponseI((i << 16) + 4); DuelClient::SetResponseI((i << 16) + 4);
mainGame->localAction.Set(); DuelClient::SendResponse();
break; break;
} }
} }
...@@ -385,7 +385,7 @@ bool ClientField::OnEvent(const irr::SEvent& event) { ...@@ -385,7 +385,7 @@ bool ClientField::OnEvent(const irr::SEvent& event) {
for(int i = 0; i < reposable_cards.size(); ++i) { for(int i = 0; i < reposable_cards.size(); ++i) {
if(reposable_cards[i] == clicked_card) { if(reposable_cards[i] == clicked_card) {
DuelClient::SetResponseI((i << 16) + 2); DuelClient::SetResponseI((i << 16) + 2);
mainGame->localAction.Set(); DuelClient::SendResponse();
break; break;
} }
} }
...@@ -398,7 +398,7 @@ bool ClientField::OnEvent(const irr::SEvent& event) { ...@@ -398,7 +398,7 @@ bool ClientField::OnEvent(const irr::SEvent& event) {
for(int i = 0; i < attackable_cards.size(); ++i) { for(int i = 0; i < attackable_cards.size(); ++i) {
if(attackable_cards[i] == clicked_card) { if(attackable_cards[i] == clicked_card) {
DuelClient::SetResponseI((i << 16) + 1); DuelClient::SetResponseI((i << 16) + 1);
mainGame->localAction.Set(); DuelClient::SendResponse();
break; break;
} }
} }
...@@ -445,24 +445,24 @@ bool ClientField::OnEvent(const irr::SEvent& event) { ...@@ -445,24 +445,24 @@ bool ClientField::OnEvent(const irr::SEvent& event) {
case BUTTON_BP: { case BUTTON_BP: {
if(mainGame->dInfo.curMsg == MSG_SELECT_IDLECMD) { if(mainGame->dInfo.curMsg == MSG_SELECT_IDLECMD) {
DuelClient::SetResponseI(6); DuelClient::SetResponseI(6);
mainGame->localAction.Set(); DuelClient::SendResponse();
} }
break; break;
} }
case BUTTON_M2: { case BUTTON_M2: {
if(mainGame->dInfo.curMsg == MSG_SELECT_BATTLECMD) { if(mainGame->dInfo.curMsg == MSG_SELECT_BATTLECMD) {
DuelClient::SetResponseI(2); DuelClient::SetResponseI(2);
mainGame->localAction.Set(); DuelClient::SendResponse();
} }
break; break;
} }
case BUTTON_EP: { case BUTTON_EP: {
if(mainGame->dInfo.curMsg == MSG_SELECT_BATTLECMD) { if(mainGame->dInfo.curMsg == MSG_SELECT_BATTLECMD) {
DuelClient::SetResponseI(3); DuelClient::SetResponseI(3);
mainGame->localAction.Set(); DuelClient::SendResponse();
} else if(mainGame->dInfo.curMsg == MSG_SELECT_IDLECMD) { } else if(mainGame->dInfo.curMsg == MSG_SELECT_IDLECMD) {
DuelClient::SetResponseI(7); DuelClient::SetResponseI(7);
mainGame->localAction.Set(); DuelClient::SendResponse();
} }
break; break;
} }
...@@ -613,7 +613,8 @@ bool ClientField::OnEvent(const irr::SEvent& event) { ...@@ -613,7 +613,8 @@ bool ClientField::OnEvent(const irr::SEvent& event) {
} }
break; break;
} else if(mainGame->dInfo.curMsg == MSG_CONFIRM_CARDS) { } else if(mainGame->dInfo.curMsg == MSG_CONFIRM_CARDS) {
mainGame->HideElement(mainGame->wCardSelect, true); mainGame->HideElement(mainGame->wCardSelect);
mainGame->actionSignal.Set();
break; break;
} else { } else {
mainGame->HideElement(mainGame->wCardSelect); mainGame->HideElement(mainGame->wCardSelect);
...@@ -957,7 +958,7 @@ bool ClientField::OnEvent(const irr::SEvent& event) { ...@@ -957,7 +958,7 @@ bool ClientField::OnEvent(const irr::SEvent& event) {
selectable_field = 0; selectable_field = 0;
selected_field = 0; selected_field = 0;
DuelClient::SetResponseB(respbuf, p); DuelClient::SetResponseB(respbuf, p);
mainGame->localAction.Set(); DuelClient::SendResponse();
} }
} }
} }
...@@ -989,7 +990,7 @@ bool ClientField::OnEvent(const irr::SEvent& event) { ...@@ -989,7 +990,7 @@ bool ClientField::OnEvent(const irr::SEvent& event) {
for (int i = 0; i < selected_cards.size(); ++i) for (int i = 0; i < selected_cards.size(); ++i)
respbuf[i + 1] = selected_cards[i]->select_seq; respbuf[i + 1] = selected_cards[i]->select_seq;
DuelClient::SetResponseB(respbuf, selected_cards.size() + 1); DuelClient::SetResponseB(respbuf, selected_cards.size() + 1);
mainGame->localAction.Set(); DuelClient::SendResponse();
} else if (max >= select_min) { } else if (max >= select_min) {
if(selected_cards.size() == selectable_cards.size()) { if(selected_cards.size() == selectable_cards.size()) {
unsigned char respbuf[64]; unsigned char respbuf[64];
...@@ -997,7 +998,7 @@ bool ClientField::OnEvent(const irr::SEvent& event) { ...@@ -997,7 +998,7 @@ bool ClientField::OnEvent(const irr::SEvent& event) {
for (int i = 0; i < selected_cards.size(); ++i) for (int i = 0; i < selected_cards.size(); ++i)
respbuf[i + 1] = selected_cards[i]->select_seq; respbuf[i + 1] = selected_cards[i]->select_seq;
DuelClient::SetResponseB(respbuf, selected_cards.size() + 1); DuelClient::SetResponseB(respbuf, selected_cards.size() + 1);
mainGame->localAction.Set(); DuelClient::SendResponse();
} else { } else {
select_ready = true; select_ready = true;
if(mainGame->dInfo.curMsg == MSG_SELECT_TRIBUTE) { if(mainGame->dInfo.curMsg == MSG_SELECT_TRIBUTE) {
...@@ -1028,7 +1029,7 @@ bool ClientField::OnEvent(const irr::SEvent& event) { ...@@ -1028,7 +1029,7 @@ bool ClientField::OnEvent(const irr::SEvent& event) {
mainGame->stHintMsg->setVisible(false); mainGame->stHintMsg->setVisible(false);
ClearSelect(); ClearSelect();
DuelClient::SetResponseB(respbuf, selectable_cards.size()); DuelClient::SetResponseB(respbuf, selectable_cards.size());
mainGame->localAction.Set(); DuelClient::SendResponse();
} else { } else {
myswprintf(formatBuffer, dataManager.GetSysString(204), select_counter_count, dataManager.GetCounterName(select_counter_type)); myswprintf(formatBuffer, dataManager.GetSysString(204), select_counter_count, dataManager.GetCounterName(select_counter_type));
mainGame->stHintMsg->setText(formatBuffer); mainGame->stHintMsg->setText(formatBuffer);
...@@ -1052,7 +1053,7 @@ bool ClientField::OnEvent(const irr::SEvent& event) { ...@@ -1052,7 +1053,7 @@ bool ClientField::OnEvent(const irr::SEvent& event) {
for (int i = 0; i < selected_cards.size(); ++i) for (int i = 0; i < selected_cards.size(); ++i)
respbuf[i + 1] = selected_cards[i]->select_seq; respbuf[i + 1] = selected_cards[i]->select_seq;
DuelClient::SetResponseB(respbuf, selected_cards.size() + 1); DuelClient::SetResponseB(respbuf, selected_cards.size() + 1);
mainGame->localAction.Set(); DuelClient::SendResponse();
} else { } else {
select_ready = true; select_ready = true;
wchar_t wbuf[256], *pwbuf = wbuf; wchar_t wbuf[256], *pwbuf = wbuf;
...@@ -1113,7 +1114,7 @@ bool ClientField::OnEvent(const irr::SEvent& event) { ...@@ -1113,7 +1114,7 @@ bool ClientField::OnEvent(const irr::SEvent& event) {
if(mainGame->wCardSelect->isVisible()) if(mainGame->wCardSelect->isVisible())
mainGame->HideElement(mainGame->wCardSelect, true); mainGame->HideElement(mainGame->wCardSelect, true);
else else
mainGame->localAction.Set(); DuelClient::SendResponse();
} }
break; break;
} }
...@@ -1135,7 +1136,7 @@ bool ClientField::OnEvent(const irr::SEvent& event) { ...@@ -1135,7 +1136,7 @@ bool ClientField::OnEvent(const irr::SEvent& event) {
if(mainGame->wCardSelect->isVisible()) if(mainGame->wCardSelect->isVisible())
mainGame->HideElement(mainGame->wCardSelect, true); mainGame->HideElement(mainGame->wCardSelect, true);
else else
mainGame->localAction.Set(); DuelClient::SendResponse();
} }
break; break;
} }
......
...@@ -514,7 +514,6 @@ void Game::MainLoop() { ...@@ -514,7 +514,6 @@ void Game::MainLoop() {
} }
} }
DuelClient::StopClient(true); DuelClient::StopClient(true);
NetServer::StopServer();
SaveConfig(); SaveConfig();
device->drop(); device->drop();
} }
......
...@@ -84,7 +84,7 @@ public: ...@@ -84,7 +84,7 @@ public:
Mutex gMutex; Mutex gMutex;
Mutex gBuffer; Mutex gBuffer;
Signal frameSignal; Signal frameSignal;
Signal localAction; Signal actionSignal;
Signal replaySignal; Signal replaySignal;
Config gameConf; Config gameConf;
DuelInfo dInfo; DuelInfo dInfo;
......
...@@ -178,6 +178,12 @@ void NetServer::HandleCTOSPacket(DuelPlayer* dp, char* data, unsigned int len) { ...@@ -178,6 +178,12 @@ void NetServer::HandleCTOSPacket(DuelPlayer* dp, char* data, unsigned int len) {
duel_mode->GetResponse(dp, pdata, len > 64 ? 64 : len - 1); duel_mode->GetResponse(dp, pdata, len > 64 ? 64 : len - 1);
break; break;
} }
case CTOS_TIME_CONFIRM: {
if(!dp->game || !duel_mode->pduel)
return;
duel_mode->TimeConfirm(dp);
break;
}
case CTOS_UPDATE_DECK: { case CTOS_UPDATE_DECK: {
if(!dp->game) if(!dp->game)
return; return;
...@@ -212,6 +218,8 @@ void NetServer::HandleCTOSPacket(DuelPlayer* dp, char* data, unsigned int len) { ...@@ -212,6 +218,8 @@ void NetServer::HandleCTOSPacket(DuelPlayer* dp, char* data, unsigned int len) {
} else if(pkt->info.mode == MODE_MATCH) { } else if(pkt->info.mode == MODE_MATCH) {
duel_mode = new SingleDuel(true); duel_mode = new SingleDuel(true);
} }
timeval timeout = {1, 0};
duel_mode->etimer = event_new(net_evbase, 0, EV_PERSIST, SingleDuel::SingleTimer, duel_mode);
if(pkt->info.rule > 3) if(pkt->info.rule > 3)
pkt->info.rule = 0; pkt->info.rule = 0;
if(pkt->info.mode > 1) if(pkt->info.mode > 1)
......
...@@ -73,7 +73,11 @@ struct STOC_TypeChange { ...@@ -73,7 +73,11 @@ struct STOC_TypeChange {
unsigned char type; unsigned char type;
}; };
struct STOC_ExitGame { struct STOC_ExitGame {
unsigned pos; unsigned char pos;
};
struct STOC_TimeLimit {
unsigned char player;
unsigned short left_time;
}; };
struct STOC_HS_PlayerEnter { struct STOC_HS_PlayerEnter {
unsigned short name[20]; unsigned short name[20];
...@@ -123,9 +127,11 @@ public: ...@@ -123,9 +127,11 @@ public:
} }
virtual void Surrender(DuelPlayer* dp) {} virtual void Surrender(DuelPlayer* dp) {}
virtual void GetResponse(DuelPlayer* dp, void* pdata, unsigned int len) {} virtual void GetResponse(DuelPlayer* dp, void* pdata, unsigned int len) {}
virtual void TimeConfirm(DuelPlayer* dp) {}
virtual void EndDuel() {}; virtual void EndDuel() {};
public: public:
event* etimer;
DuelPlayer* host_player; DuelPlayer* host_player;
HostInfo host_info; HostInfo host_info;
unsigned long pduel; unsigned long pduel;
...@@ -155,6 +161,7 @@ public: ...@@ -155,6 +161,7 @@ public:
#define CTOS_JOIN_GAME 0x12 #define CTOS_JOIN_GAME 0x12
#define CTOS_LEAVE_GAME 0x13 #define CTOS_LEAVE_GAME 0x13
#define CTOS_SURRENDER 0x14 #define CTOS_SURRENDER 0x14
#define CTOS_TIME_CONFIRM 0x15
#define CTOS_HS_TODUELIST 0x20 #define CTOS_HS_TODUELIST 0x20
#define CTOS_HS_TOOBSERVER 0x21 #define CTOS_HS_TOOBSERVER 0x21
#define CTOS_HS_READY 0x22 #define CTOS_HS_READY 0x22
...@@ -177,6 +184,7 @@ public: ...@@ -177,6 +184,7 @@ public:
#define STOC_DUEL_START 0x15 #define STOC_DUEL_START 0x15
#define STOC_DUEL_END 0x16 #define STOC_DUEL_END 0x16
#define STOC_REPLAY 0x17 #define STOC_REPLAY 0x17
#define STOC_TIME_LIMIT 0x18
#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
......
...@@ -119,6 +119,7 @@ void Replay::EndRecord() { ...@@ -119,6 +119,7 @@ void Replay::EndRecord() {
pheader.flag |= REPLAY_COMPRESSED; pheader.flag |= REPLAY_COMPRESSED;
size_t propsize = 5; size_t propsize = 5;
comp_size = 0x1000; comp_size = 0x1000;
printf("%x\n",comp_data);
LzmaCompress(comp_data, &comp_size, replay_data, pdata - replay_data, pheader.props, &propsize, 5, 1 << 24, 3, 0, 2, 32, 1); LzmaCompress(comp_data, &comp_size, replay_data, pdata - replay_data, pheader.props, &propsize, 5, 1 << 24, 3, 0, 2, 32, 1);
is_recording = false; is_recording = false;
} }
......
...@@ -25,7 +25,7 @@ void ReplayMode::StopReplay(bool is_exiting) { ...@@ -25,7 +25,7 @@ void ReplayMode::StopReplay(bool is_exiting) {
is_continuing = false; is_continuing = false;
is_closing = is_exiting; is_closing = is_exiting;
exit_pending = true; exit_pending = true;
mainGame->localAction.Set(); mainGame->actionSignal.Set();
} }
void ReplayMode::SwapField() { void ReplayMode::SwapField() {
if(is_paused) if(is_paused)
...@@ -39,7 +39,7 @@ void ReplayMode::Pause(bool is_pause, bool is_step) { ...@@ -39,7 +39,7 @@ void ReplayMode::Pause(bool is_pause, bool is_step) {
else { else {
if(!is_step) if(!is_step)
is_pausing = false; is_pausing = false;
mainGame->localAction.Set(); mainGame->actionSignal.Set();
} }
} }
bool ReplayMode::ReadReplayResponse() { bool ReplayMode::ReadReplayResponse() {
...@@ -105,9 +105,9 @@ int ReplayMode::ReplayThread(void* param) { ...@@ -105,9 +105,9 @@ int ReplayMode::ReplayThread(void* param) {
end_duel(pduel); end_duel(pduel);
if(!is_closing) { if(!is_closing) {
mainGame->stMessage->setText(dataManager.GetSysString(1501)); mainGame->stMessage->setText(dataManager.GetSysString(1501));
mainGame->localAction.Reset(); mainGame->actionSignal.Reset();
mainGame->PopupElement(mainGame->wMessage); mainGame->PopupElement(mainGame->wMessage);
mainGame->localAction.Wait(); mainGame->actionSignal.Wait();
mainGame->dInfo.isStarted = false; mainGame->dInfo.isStarted = false;
mainGame->dInfo.isReplay = false; mainGame->dInfo.isReplay = false;
mainGame->CloseDuelWindow(); mainGame->CloseDuelWindow();
...@@ -554,8 +554,8 @@ bool ReplayMode::ReplayAnalyze(char* msg, unsigned int len) { ...@@ -554,8 +554,8 @@ bool ReplayMode::ReplayAnalyze(char* msg, unsigned int len) {
} }
if(pauseable && is_pausing) { if(pauseable && is_pausing) {
is_paused = true; is_paused = true;
mainGame->localAction.Reset(); mainGame->actionSignal.Reset();
mainGame->localAction.Wait(); mainGame->actionSignal.Wait();
is_paused = false; is_paused = false;
} }
} }
......
...@@ -1257,6 +1257,9 @@ void SingleDuel::WaitforResponse(int playerid) { ...@@ -1257,6 +1257,9 @@ void SingleDuel::WaitforResponse(int playerid) {
players[playerid]->state = CTOS_RESPONSE; players[playerid]->state = CTOS_RESPONSE;
unsigned char msg = MSG_WAITING; unsigned char msg = MSG_WAITING;
NetServer::SendPacketToPlayer(players[1 - playerid], STOC_GAME_MSG, msg); NetServer::SendPacketToPlayer(players[1 - playerid], STOC_GAME_MSG, msg);
}
void SingleDuel::TimeConfirm(DuelPlayer* dp) {
} }
void SingleDuel::RefreshMzone(int player, int flag, int use_cache) { void SingleDuel::RefreshMzone(int player, int flag, int use_cache) {
char query_buffer[0x1000]; char query_buffer[0x1000];
...@@ -1358,5 +1361,8 @@ int SingleDuel::MessageHandler(long fduel, int type) { ...@@ -1358,5 +1361,8 @@ int SingleDuel::MessageHandler(long fduel, int type) {
fclose(fp); fclose(fp);
return 0; return 0;
} }
void SingleDuel::SingleTimer(evutil_socket_t fd, short events, void* arg) {
SingleDuel* sd = static_cast<SingleDuel*>(arg);
}
} }
...@@ -25,6 +25,7 @@ public: ...@@ -25,6 +25,7 @@ public:
virtual void Surrender(DuelPlayer* dp); virtual void Surrender(DuelPlayer* dp);
virtual int Analyze(char* msgbuffer, unsigned int len); virtual int Analyze(char* msgbuffer, unsigned int len);
virtual void GetResponse(DuelPlayer* dp, void* pdata, unsigned int len); virtual void GetResponse(DuelPlayer* dp, void* pdata, unsigned int len);
virtual void TimeConfirm(DuelPlayer* dp);
virtual void EndDuel(); virtual void EndDuel();
void DuelEndProc(); void DuelEndProc();
...@@ -37,6 +38,7 @@ public: ...@@ -37,6 +38,7 @@ public:
void RefreshSingle(int player, int location, int sequence, int flag = 0x181fff); void RefreshSingle(int player, int location, int sequence, int flag = 0x181fff);
static int MessageHandler(long fduel, int type); static int MessageHandler(long fduel, int type);
static void SingleTimer(evutil_socket_t fd, short events, void* arg);
protected: protected:
DuelPlayer* players[2]; DuelPlayer* players[2];
......
...@@ -65,14 +65,13 @@ void field::change_target(uint8 chaincount, group* targets) { ...@@ -65,14 +65,13 @@ void field::change_target(uint8 chaincount, group* targets) {
group* ot = core.current_chain[chaincount - 1].target_cards; group* ot = core.current_chain[chaincount - 1].target_cards;
effect* te = core.current_chain[chaincount - 1].triggering_effect; effect* te = core.current_chain[chaincount - 1].triggering_effect;
if(ot) { if(ot) {
card_set::iterator cit; for(auto cit = ot->container.begin(); cit != ot->container.end(); ++cit)
for(cit = ot->container.begin(); cit != ot->container.end(); ++cit)
(*cit)->release_relation(te); (*cit)->release_relation(te);
ot->container = targets->container; ot->container = targets->container;
for(cit = ot->container.begin(); cit != ot->container.end(); ++cit) for(auto cit = ot->container.begin(); cit != ot->container.end(); ++cit)
(*cit)->create_relation(te); (*cit)->create_relation(te);
if(te->flag & EFFECT_FLAG_CARD_TARGET) { if(te->flag & EFFECT_FLAG_CARD_TARGET) {
for(cit = ot->container.begin(); cit != ot->container.end(); ++cit) { for(auto cit = ot->container.begin(); cit != ot->container.end(); ++cit) {
if((*cit)->current.location & 0x30) if((*cit)->current.location & 0x30)
move_card((*cit)->current.controler, (*cit), (*cit)->current.location, 0); move_card((*cit)->current.controler, (*cit), (*cit)->current.location, 0);
pduel->write_buffer8(MSG_BECOME_TARGET); pduel->write_buffer8(MSG_BECOME_TARGET);
...@@ -132,17 +131,17 @@ void field::special_summon_rule(uint32 sumplayer, card* target) { ...@@ -132,17 +131,17 @@ void field::special_summon_rule(uint32 sumplayer, card* target) {
void field::special_summon(card_set* target, uint32 sumtype, uint32 sumplayer, uint32 playerid, uint32 nocheck, uint32 nolimit, uint32 positions) { void field::special_summon(card_set* target, uint32 sumtype, uint32 sumplayer, uint32 playerid, uint32 nocheck, uint32 nolimit, uint32 positions) {
if((positions & POS_FACEDOWN) && is_player_affected_by_effect(sumplayer, EFFECT_DEVINE_LIGHT)) if((positions & POS_FACEDOWN) && is_player_affected_by_effect(sumplayer, EFFECT_DEVINE_LIGHT))
positions = (positions & POS_FACEUP) | (positions >> 1); positions = (positions & POS_FACEUP) | (positions >> 1);
card_set::iterator cit; for(auto cit = target->begin(); cit != target->end(); ++cit) {
for(cit = target->begin(); cit != target->end(); ++cit) { card* pcard = *cit;
(*cit)->temp.reason = (*cit)->current.reason; pcard->temp.reason = pcard->current.reason;
(*cit)->temp.reason_effect = (*cit)->current.reason_effect; pcard->temp.reason_effect = pcard->current.reason_effect;
(*cit)->temp.reason_player = (*cit)->current.reason_player; pcard->temp.reason_player = pcard->current.reason_player;
(*cit)->summon_type = (sumtype & 0xfffffff) | SUMMON_TYPE_SPECIAL; pcard->summon_type = (sumtype & 0xfffffff) | SUMMON_TYPE_SPECIAL;
(*cit)->summon_player = sumplayer; pcard->summon_player = sumplayer;
(*cit)->current.reason = REASON_SPSUMMON; pcard->current.reason = REASON_SPSUMMON;
(*cit)->current.reason_effect = core.reason_effect; pcard->current.reason_effect = core.reason_effect;
(*cit)->current.reason_player = core.reason_player; pcard->current.reason_player = core.reason_player;
(*cit)->operation_param = (playerid << 24) + (nocheck << 16) + (nolimit << 8) + positions; pcard->operation_param = (playerid << 24) + (nocheck << 16) + (nolimit << 8) + positions;
} }
group* pgroup = pduel->new_group(); group* pgroup = pduel->new_group();
pgroup->is_readonly = TRUE; pgroup->is_readonly = TRUE;
...@@ -173,29 +172,29 @@ void field::special_summon_complete(effect* reason_effect, uint8 reason_player) ...@@ -173,29 +172,29 @@ void field::special_summon_complete(effect* reason_effect, uint8 reason_player)
add_process(PROCESSOR_SPSUMMON_COMP_S, 0, reason_effect, ng, reason_player, 0); add_process(PROCESSOR_SPSUMMON_COMP_S, 0, reason_effect, ng, reason_player, 0);
} }
void field::destroy(card_set* targets, effect* reason_effect, uint32 reason, uint32 reason_player, uint32 playerid, uint32 destination, uint32 sequence) { void field::destroy(card_set* targets, effect* reason_effect, uint32 reason, uint32 reason_player, uint32 playerid, uint32 destination, uint32 sequence) {
card_set::iterator cit;
uint32 p; uint32 p;
for(cit = targets->begin(); cit != targets->end();) { for(auto cit = targets->begin(); cit != targets->end();) {
if((*cit)->is_status(STATUS_DESTROY_CONFIRMED)) { card* pcard = *cit;
if(pcard->is_status(STATUS_DESTROY_CONFIRMED)) {
targets->erase(cit++); targets->erase(cit++);
continue; continue;
} }
(*cit)->temp.reason = (*cit)->current.reason; pcard->temp.reason = pcard->current.reason;
(*cit)->temp.reason_effect = (*cit)->current.reason_effect; pcard->temp.reason_effect = pcard->current.reason_effect;
(*cit)->temp.reason_player = (*cit)->current.reason_player; pcard->temp.reason_player = pcard->current.reason_player;
(*cit)->current.reason = reason; pcard->current.reason = reason;
if(reason_effect) if(reason_effect)
(*cit)->current.reason_effect = reason_effect; pcard->current.reason_effect = reason_effect;
(*cit)->current.reason_player = reason_player; pcard->current.reason_player = reason_player;
p = playerid; p = playerid;
if(!(destination & (LOCATION_HAND + LOCATION_DECK + LOCATION_REMOVED))) if(!(destination & (LOCATION_HAND + LOCATION_DECK + LOCATION_REMOVED)))
destination = LOCATION_GRAVE; destination = LOCATION_GRAVE;
if(destination && p == PLAYER_NONE) if(destination && p == PLAYER_NONE)
p = (*cit)->owner; p = pcard->owner;
if(destination & (LOCATION_GRAVE + LOCATION_REMOVED)) if(destination & (LOCATION_GRAVE + LOCATION_REMOVED))
p = (*cit)->owner; p = pcard->owner;
(*cit)->set_status(STATUS_DESTROY_CONFIRMED, TRUE); pcard->set_status(STATUS_DESTROY_CONFIRMED, TRUE);
(*cit)->operation_param = (POS_FACEUP << 24) + (p << 16) + (destination << 8) + sequence; pcard->operation_param = (POS_FACEUP << 24) + (p << 16) + (destination << 8) + sequence;
++cit; ++cit;
} }
group* ng = pduel->new_group(); group* ng = pduel->new_group();
...@@ -211,13 +210,14 @@ void field::destroy(card* target, effect* reason_effect, uint32 reason, uint32 r ...@@ -211,13 +210,14 @@ void field::destroy(card* target, effect* reason_effect, uint32 reason, uint32 r
void field::release(card_set* targets, effect* reason_effect, uint32 reason, uint32 reason_player) { void field::release(card_set* targets, effect* reason_effect, uint32 reason, uint32 reason_player) {
card_set::iterator cit; card_set::iterator cit;
for(cit = targets->begin(); cit != targets->end(); ++cit) { for(cit = targets->begin(); cit != targets->end(); ++cit) {
(*cit)->temp.reason = (*cit)->current.reason; card* pcard = *cit;
(*cit)->temp.reason_effect = (*cit)->current.reason_effect; pcard->temp.reason = pcard->current.reason;
(*cit)->temp.reason_player = (*cit)->current.reason_player; pcard->temp.reason_effect = pcard->current.reason_effect;
(*cit)->current.reason = reason; pcard->temp.reason_player = pcard->current.reason_player;
(*cit)->current.reason_effect = reason_effect; pcard->current.reason = reason;
(*cit)->current.reason_player = reason_player; pcard->current.reason_effect = reason_effect;
(*cit)->operation_param = (POS_FACEUP << 24) + ((uint32)((*cit)->owner) << 16) + (LOCATION_GRAVE << 8); pcard->current.reason_player = reason_player;
pcard->operation_param = (POS_FACEUP << 24) + ((uint32)(pcard->owner) << 16) + (LOCATION_GRAVE << 8);
} }
group* ng = pduel->new_group(); group* ng = pduel->new_group();
ng->container = *targets; ng->container = *targets;
...@@ -235,21 +235,22 @@ void field::send_to(card_set* targets, effect* reason_effect, uint32 reason, uin ...@@ -235,21 +235,22 @@ void field::send_to(card_set* targets, effect* reason_effect, uint32 reason, uin
return; return;
uint32 p, pos; uint32 p, pos;
for(cit = targets->begin(); cit != targets->end(); ++cit) { for(cit = targets->begin(); cit != targets->end(); ++cit) {
(*cit)->temp.reason = (*cit)->current.reason; card* pcard = *cit;
(*cit)->temp.reason_effect = (*cit)->current.reason_effect; pcard->temp.reason = pcard->current.reason;
(*cit)->temp.reason_player = (*cit)->current.reason_player; pcard->temp.reason_effect = pcard->current.reason_effect;
(*cit)->current.reason = reason; pcard->temp.reason_player = pcard->current.reason_player;
(*cit)->current.reason_effect = reason_effect; pcard->current.reason = reason;
(*cit)->current.reason_player = reason_player; pcard->current.reason_effect = reason_effect;
pcard->current.reason_player = reason_player;
p = playerid; p = playerid;
if(destination & (LOCATION_GRAVE + LOCATION_REMOVED) || p == PLAYER_NONE) if(destination & (LOCATION_GRAVE + LOCATION_REMOVED) || p == PLAYER_NONE)
p = (*cit)->owner; p = pcard->owner;
if(destination != LOCATION_REMOVED) if(destination != LOCATION_REMOVED)
pos = POS_FACEUP; pos = POS_FACEUP;
else if(position == 0) else if(position == 0)
pos = (*cit)->current.position; pos = pcard->current.position;
else pos = position; else pos = position;
(*cit)->operation_param = (pos << 24) + (p << 16) + (destination << 8) + (sequence); pcard->operation_param = (pos << 24) + (p << 16) + (destination << 8) + (sequence);
} }
group* ng = pduel->new_group(); group* ng = pduel->new_group();
ng->container = *targets; ng->container = *targets;
...@@ -275,12 +276,13 @@ void field::change_position(card_set* targets, effect* reason_effect, uint32 rea ...@@ -275,12 +276,13 @@ void field::change_position(card_set* targets, effect* reason_effect, uint32 rea
ng->is_readonly = TRUE; ng->is_readonly = TRUE;
card_set::iterator cit; card_set::iterator cit;
for(cit = targets->begin(); cit != targets->end(); ++cit) { for(cit = targets->begin(); cit != targets->end(); ++cit) {
if((*cit)->current.position == POS_FACEUP_ATTACK) (*cit)->operation_param = au; card* pcard = *cit;
else if((*cit)->current.position == POS_FACEDOWN_DEFENCE) (*cit)->operation_param = dd; if(pcard->current.position == POS_FACEUP_ATTACK) pcard->operation_param = au;
else if((*cit)->current.position == POS_FACEUP_DEFENCE) (*cit)->operation_param = du; else if(pcard->current.position == POS_FACEDOWN_DEFENCE) pcard->operation_param = dd;
else (*cit)->operation_param = ad; else if(pcard->current.position == POS_FACEUP_DEFENCE) pcard->operation_param = du;
else pcard->operation_param = ad;
if(noflip) if(noflip)
(*cit)->operation_param |= NO_FLIP_EFFECT; pcard->operation_param |= NO_FLIP_EFFECT;
} }
add_process(PROCESSOR_CHANGEPOS, 0, reason_effect, ng, reason_player, enable); add_process(PROCESSOR_CHANGEPOS, 0, reason_effect, ng, reason_player, enable);
} }
...@@ -298,7 +300,6 @@ int32 field::draw(uint16 step, effect* reason_effect, uint32 reason, uint8 reaso ...@@ -298,7 +300,6 @@ int32 field::draw(uint16 step, effect* reason_effect, uint32 reason, uint8 reaso
case 0: { case 0: {
card* pcard; card* pcard;
card_set cset; card_set cset;
card_set::iterator cit;
card_vector cv; card_vector cv;
uint32 drawed = 0; uint32 drawed = 0;
if(!(reason & REASON_RULE) && !is_player_can_draw(playerid)) { if(!(reason & REASON_RULE) && !is_player_can_draw(playerid)) {
...@@ -341,7 +342,7 @@ int32 field::draw(uint16 step, effect* reason_effect, uint32 reason, uint8 reaso ...@@ -341,7 +342,7 @@ int32 field::draw(uint16 step, effect* reason_effect, uint32 reason, uint8 reaso
pduel->write_buffer32(cv[i]->data.code); pduel->write_buffer32(cv[i]->data.code);
} }
if(cset.size()) { if(cset.size()) {
for(cit = cset.begin(); cit != cset.end(); ++cit) for(auto cit = cset.begin(); cit != cset.end(); ++cit)
raise_single_event((*cit), 0, EVENT_TO_HAND, reason_effect, reason, reason_player, playerid, 0); raise_single_event((*cit), 0, EVENT_TO_HAND, reason_effect, reason, reason_player, playerid, 0);
process_single_event(); process_single_event();
raise_event(&cset, EVENT_DRAW, reason_effect, reason, reason_player, playerid, drawed); raise_event(&cset, EVENT_DRAW, reason_effect, reason, reason_player, playerid, drawed);
...@@ -653,8 +654,7 @@ int32 field::remove_overlay_card(uint16 step, uint32 reason, card* pcard, uint8 ...@@ -653,8 +654,7 @@ int32 field::remove_overlay_card(uint16 step, uint32 reason, card* pcard, uint8
core.select_options.push_back(12); core.select_options.push_back(12);
core.select_effects.push_back(0); core.select_effects.push_back(0);
} }
pair<effect_container::iterator, effect_container::iterator> pr; auto pr = effects.continuous_effect.equal_range(EFFECT_OVERLAY_REMOVE_REPLACE);
pr = effects.continuous_effect.equal_range(EFFECT_OVERLAY_REMOVE_REPLACE);
effect* peffect; effect* peffect;
tevent e; tevent e;
e.event_cards = 0; e.event_cards = 0;
...@@ -1596,7 +1596,6 @@ int32 field::special_summon_rule(uint16 step, uint8 sumplayer, card * target) { ...@@ -1596,7 +1596,6 @@ int32 field::special_summon_rule(uint16 step, uint8 sumplayer, card * target) {
set_control(target, targetplayer, 0, 0); set_control(target, targetplayer, 0, 0);
core.phase_action = TRUE; core.phase_action = TRUE;
target->current.reason_effect = core.units.begin()->peffect; target->current.reason_effect = core.units.begin()->peffect;
card_set::iterator cit;
target->set_status(STATUS_SUMMONING, TRUE); target->set_status(STATUS_SUMMONING, TRUE);
target->set_status(STATUS_SUMMON_DISABLED, FALSE); target->set_status(STATUS_SUMMON_DISABLED, FALSE);
core.spsummoning_card = target; core.spsummoning_card = target;
...@@ -1636,8 +1635,7 @@ int32 field::special_summon_rule(uint16 step, uint8 sumplayer, card * target) { ...@@ -1636,8 +1635,7 @@ int32 field::special_summon_rule(uint16 step, uint8 sumplayer, card * target) {
return TRUE; return TRUE;
} }
case 15: { case 15: {
oath_effects::iterator oeit; for(auto oeit = effects.oath.begin(); oeit != effects.oath.end(); ++oeit)
for(oeit = effects.oath.begin(); oeit != effects.oath.end(); ++oeit)
if(oeit->second == core.units.begin()->peffect) if(oeit->second == core.units.begin()->peffect)
oeit->second = 0; oeit->second = 0;
target->set_status(STATUS_SUMMONING, FALSE); target->set_status(STATUS_SUMMONING, FALSE);
...@@ -1762,16 +1760,14 @@ int32 field::special_summon_step(uint16 step, group * targets, card * target) { ...@@ -1762,16 +1760,14 @@ int32 field::special_summon_step(uint16 step, group * targets, card * target) {
return TRUE; return TRUE;
} }
int32 field::special_summon(uint16 step, effect * reason_effect, uint8 reason_player, group * targets) { int32 field::special_summon(uint16 step, effect * reason_effect, uint8 reason_player, group * targets) {
card_set::iterator cit;
switch(step) { switch(step) {
case 0: { case 0: {
card_vector cv; card_vector cv;
card_vector::iterator cvit; for(auto cit = targets->container.begin(); cit != targets->container.end(); ++cit)
for(cit = targets->container.begin(); cit != targets->container.end(); ++cit)
cv.push_back(*cit); cv.push_back(*cit);
if(cv.size() > 1) if(cv.size() > 1)
std::sort(cv.begin(), cv.end(), card::card_operation_sort); std::sort(cv.begin(), cv.end(), card::card_operation_sort);
for(cvit = cv.begin(); cvit != cv.end(); ++cvit) for(auto cvit = cv.begin(); cvit != cv.end(); ++cvit)
add_process(PROCESSOR_SPSUMMON_STEP, 0, 0, targets, 0, (ptr)(*cvit)); add_process(PROCESSOR_SPSUMMON_STEP, 0, 0, targets, 0, (ptr)(*cvit));
return FALSE; return FALSE;
} }
...@@ -1782,7 +1778,7 @@ int32 field::special_summon(uint16 step, effect * reason_effect, uint8 reason_pl ...@@ -1782,7 +1778,7 @@ int32 field::special_summon(uint16 step, effect * reason_effect, uint8 reason_pl
pduel->delete_group(targets); pduel->delete_group(targets);
return TRUE; return TRUE;
} }
for(cit = targets->container.begin(); cit != targets->container.end(); ++cit) { for(auto cit = targets->container.begin(); cit != targets->container.end(); ++cit) {
(*cit)->set_status(STATUS_SUMMON_TURN, TRUE); (*cit)->set_status(STATUS_SUMMON_TURN, TRUE);
if((*cit)->is_position(POS_FACEUP)) if((*cit)->is_position(POS_FACEUP))
(*cit)->enable_field_effect(TRUE); (*cit)->enable_field_effect(TRUE);
...@@ -1792,7 +1788,7 @@ int32 field::special_summon(uint16 step, effect * reason_effect, uint8 reason_pl ...@@ -1792,7 +1788,7 @@ int32 field::special_summon(uint16 step, effect * reason_effect, uint8 reason_pl
} }
case 2: { case 2: {
pduel->write_buffer8(MSG_SPSUMMONED); pduel->write_buffer8(MSG_SPSUMMONED);
for(cit = targets->container.begin(); cit != targets->container.end(); ++cit) { for(auto cit = targets->container.begin(); cit != targets->container.end(); ++cit) {
if(!((*cit)->current.position & POS_FACEDOWN)) if(!((*cit)->current.position & POS_FACEDOWN))
raise_single_event(*cit, 0, EVENT_SPSUMMON_SUCCESS, (*cit)->current.reason_effect, 0, (*cit)->current.reason_player, (*cit)->summon_player, 0); raise_single_event(*cit, 0, EVENT_SPSUMMON_SUCCESS, (*cit)->current.reason_effect, 0, (*cit)->current.reason_player, (*cit)->summon_player, 0);
int32 summontype = (*cit)->summon_type & 0x3000000; int32 summontype = (*cit)->summon_type & 0x3000000;
...@@ -1848,43 +1844,44 @@ int32 field::destroy(uint16 step, group * targets, effect * reason_effect, uint3 ...@@ -1848,43 +1844,44 @@ int32 field::destroy(uint16 step, group * targets, effect * reason_effect, uint3
switch (step) { switch (step) {
case 0: { case 0: {
card_set extra; card_set extra;
card_set::iterator cit, rm;
effect_set eset; effect_set eset;
for (cit = targets->container.begin(); cit != targets->container.end();) { for (auto cit = targets->container.begin(); cit != targets->container.end();) {
rm = cit++; auto rm = cit++;
if (!((*rm)->current.reason & REASON_RULE)) { card* pcard = *rm;
if (!(*rm)->is_destructable() || !(*rm)->is_affect_by_effect(reason_effect) if (!(pcard->current.reason & REASON_RULE)) {
|| !(*rm)->is_destructable_by_effect(reason_effect, reason_player)) { if (!pcard->is_destructable() || !pcard->is_affect_by_effect(pcard->current.reason_effect)
(*rm)->current.reason = (*rm)->temp.reason; || !pcard->is_destructable_by_effect(pcard->current.reason_effect, reason_player)) {
(*rm)->current.reason_effect = (*rm)->temp.reason_effect; pcard->current.reason = pcard->temp.reason;
(*rm)->current.reason_player = (*rm)->temp.reason_player; pcard->current.reason_effect = pcard->temp.reason_effect;
(*rm)->set_status(STATUS_DESTROY_CONFIRMED, FALSE); pcard->current.reason_player = pcard->temp.reason_player;
targets->container.erase(*rm); pcard->set_status(STATUS_DESTROY_CONFIRMED, FALSE);
targets->container.erase(pcard);
continue;
} }
} }
(*rm)->filter_effect(EFFECT_DESTROY_SUBSTITUTE, &eset); pcard->filter_effect(EFFECT_DESTROY_SUBSTITUTE, &eset);
if (eset.count) { if (eset.count) {
bool sub = false; bool sub = false;
for (int32 i = 0; i < eset.count; ++i) { for (int32 i = 0; i < eset.count; ++i) {
pduel->lua->add_param((*rm)->current.reason_effect, PARAM_TYPE_EFFECT); pduel->lua->add_param(pcard->current.reason_effect, PARAM_TYPE_EFFECT);
pduel->lua->add_param((*rm)->current.reason, PARAM_TYPE_INT); pduel->lua->add_param(pcard->current.reason, PARAM_TYPE_INT);
pduel->lua->add_param((*rm)->current.reason_player, PARAM_TYPE_INT); pduel->lua->add_param(pcard->current.reason_player, PARAM_TYPE_INT);
if(eset[i]->check_value_condition(3)) { if(eset[i]->check_value_condition(3)) {
extra.insert(eset[i]->handler); extra.insert(eset[i]->handler);
sub = true; sub = true;
} }
} }
if(sub) { if(sub) {
(*rm)->current.reason = (*rm)->temp.reason; pcard->current.reason = pcard->temp.reason;
(*rm)->current.reason_effect = (*rm)->temp.reason_effect; pcard->current.reason_effect = pcard->temp.reason_effect;
(*rm)->current.reason_player = (*rm)->temp.reason_player; pcard->current.reason_player = pcard->temp.reason_player;
core.destroy_canceled.insert(*rm); core.destroy_canceled.insert(pcard);
targets->container.erase(*rm); targets->container.erase(pcard);
} }
} }
eset.clear(); eset.clear();
} }
for (cit = extra.begin(); cit != extra.end(); ++cit) { for (auto cit = extra.begin(); cit != extra.end(); ++cit) {
card* rep = *cit; card* rep = *cit;
if(targets->container.count(rep) == 0) { if(targets->container.count(rep) == 0) {
rep->temp.reason = rep->current.reason; rep->temp.reason = rep->current.reason;
...@@ -1903,15 +1900,13 @@ int32 field::destroy(uint16 step, group * targets, effect * reason_effect, uint3 ...@@ -1903,15 +1900,13 @@ int32 field::destroy(uint16 step, group * targets, effect * reason_effect, uint3
return FALSE; return FALSE;
} }
case 1: { case 1: {
card_set::iterator cit; for (auto cit = targets->container.begin(); cit != targets->container.end(); ++cit) {
for (cit = targets->container.begin(); cit != targets->container.end(); ++cit) {
add_process(PROCESSOR_DESTROY_STEP, 0, 0, targets, (ptr) (*cit), 0); add_process(PROCESSOR_DESTROY_STEP, 0, 0, targets, (ptr) (*cit), 0);
} }
return FALSE; return FALSE;
} }
case 2: { case 2: {
card_set::iterator cit; for (auto cit = core.destroy_canceled.begin(); cit != core.destroy_canceled.end(); ++cit)
for (cit = core.destroy_canceled.begin(); cit != core.destroy_canceled.end(); ++cit)
(*cit)->set_status(STATUS_DESTROY_CONFIRMED, FALSE); (*cit)->set_status(STATUS_DESTROY_CONFIRMED, FALSE);
core.destroy_canceled.clear(); core.destroy_canceled.clear();
return FALSE; return FALSE;
...@@ -1924,23 +1919,22 @@ int32 field::destroy(uint16 step, group * targets, effect * reason_effect, uint3 ...@@ -1924,23 +1919,22 @@ int32 field::destroy(uint16 step, group * targets, effect * reason_effect, uint3
return TRUE; return TRUE;
} }
card_vector cv; card_vector cv;
card_vector::iterator cvit; for(auto cit = targets->container.begin(); cit != targets->container.end(); ++cit)
card_set::iterator cit;
for(cit = targets->container.begin(); cit != targets->container.end(); ++cit)
cv.push_back(*cit); cv.push_back(*cit);
if(cv.size() > 1) if(cv.size() > 1)
std::sort(cv.begin(), cv.end(), card::card_operation_sort); std::sort(cv.begin(), cv.end(), card::card_operation_sort);
for (cvit = cv.begin(); cvit != cv.end(); ++cvit) { for (auto cvit = cv.begin(); cvit != cv.end(); ++cvit) {
if((*cvit)->current.location & (LOCATION_GRAVE | LOCATION_REMOVED)) { card* pcard = *cvit;
(*cvit)->current.reason = (*cvit)->temp.reason; if(pcard->current.location & (LOCATION_GRAVE | LOCATION_REMOVED)) {
(*cvit)->current.reason_effect = (*cvit)->temp.reason_effect; pcard->current.reason = pcard->temp.reason;
(*cvit)->current.reason_player = (*cvit)->temp.reason_player; pcard->current.reason_effect = pcard->temp.reason_effect;
targets->container.erase((*cvit)); pcard->current.reason_player = pcard->temp.reason_player;
targets->container.erase(pcard);
continue; continue;
} }
(*cvit)->current.reason |= REASON_DESTROY; pcard->current.reason |= REASON_DESTROY;
core.hint_timing[(*cvit)->current.controler] |= TIMING_DESTROY; core.hint_timing[pcard->current.controler] |= TIMING_DESTROY;
raise_single_event(*cvit, 0, EVENT_DESTROY, (*cvit)->current.reason_effect, (*cvit)->current.reason, (*cvit)->current.reason_player, 0, 0); raise_single_event(pcard, 0, EVENT_DESTROY, pcard->current.reason_effect, pcard->current.reason, pcard->current.reason_player, 0, 0);
} }
adjust_instant(); adjust_instant();
process_single_event(); process_single_event();
...@@ -1949,12 +1943,11 @@ int32 field::destroy(uint16 step, group * targets, effect * reason_effect, uint3 ...@@ -1949,12 +1943,11 @@ int32 field::destroy(uint16 step, group * targets, effect * reason_effect, uint3
return FALSE; return FALSE;
} }
case 4: { case 4: {
card_set::iterator cit;
group* sendtargets = pduel->new_group(); group* sendtargets = pduel->new_group();
sendtargets->is_readonly = TRUE; sendtargets->is_readonly = TRUE;
sendtargets->container = targets->container; sendtargets->container = targets->container;
uint32 dest; uint32 dest;
for(cit = sendtargets->container.begin(); cit != sendtargets->container.end(); ++cit) { for(auto cit = sendtargets->container.begin(); cit != sendtargets->container.end(); ++cit) {
(*cit)->set_status(STATUS_DESTROY_CONFIRMED, FALSE); (*cit)->set_status(STATUS_DESTROY_CONFIRMED, FALSE);
dest = ((*cit)->operation_param >> 8) & 0xff; dest = ((*cit)->operation_param >> 8) & 0xff;
if(!dest) if(!dest)
...@@ -1965,8 +1958,7 @@ int32 field::destroy(uint16 step, group * targets, effect * reason_effect, uint3 ...@@ -1965,8 +1958,7 @@ int32 field::destroy(uint16 step, group * targets, effect * reason_effect, uint3
dest = LOCATION_GRAVE; dest = LOCATION_GRAVE;
(*cit)->operation_param = ((*cit)->operation_param & 0xffff00ff) + (dest << 8); (*cit)->operation_param = ((*cit)->operation_param & 0xffff00ff) + (dest << 8);
} }
pair<effect_container::iterator, effect_container::iterator> pr; auto pr = effects.continuous_effect.equal_range(EFFECT_SEND_REPLACE);
pr = effects.continuous_effect.equal_range(EFFECT_SEND_REPLACE);
for (; pr.first != pr.second; ++pr.first) for (; pr.first != pr.second; ++pr.first)
add_process(PROCESSOR_OPERATION_REPLACE, 5, pr.first->second, sendtargets, 0, 0); add_process(PROCESSOR_OPERATION_REPLACE, 5, pr.first->second, sendtargets, 0, 0);
add_process(PROCESSOR_SENDTO, 1, reason_effect, sendtargets, reason + REASON_DESTROY, reason_player); add_process(PROCESSOR_SENDTO, 1, reason_effect, sendtargets, reason + REASON_DESTROY, reason_player);
...@@ -1980,57 +1972,55 @@ int32 field::destroy(uint16 step, group * targets, effect * reason_effect, uint3 ...@@ -1980,57 +1972,55 @@ int32 field::destroy(uint16 step, group * targets, effect * reason_effect, uint3
return TRUE; return TRUE;
} }
case 10: { case 10: {
card_set::iterator cit, rm;
effect_set eset; effect_set eset;
for (cit = targets->container.begin(); cit != targets->container.end();) { for (auto cit = targets->container.begin(); cit != targets->container.end();) {
rm = cit++; auto rm = cit++;
if (!((*rm)->current.reason & REASON_RULE)) { card* pcard = *rm;
if (!(*rm)->is_destructable()) { if (!(pcard->current.reason & REASON_RULE)) {
(*rm)->current.reason = (*rm)->temp.reason; if (!pcard->is_destructable()) {
(*rm)->current.reason_effect = (*rm)->temp.reason_effect; pcard->current.reason = pcard->temp.reason;
(*rm)->current.reason_player = (*rm)->temp.reason_player; pcard->current.reason_effect = pcard->temp.reason_effect;
(*rm)->set_status(STATUS_DESTROY_CONFIRMED, FALSE); pcard->current.reason_player = pcard->temp.reason_player;
targets->container.erase(*rm); pcard->set_status(STATUS_DESTROY_CONFIRMED, FALSE);
targets->container.erase(pcard);
continue;
} }
} }
(*rm)->filter_effect(EFFECT_DESTROY_SUBSTITUTE, &eset); pcard->filter_effect(EFFECT_DESTROY_SUBSTITUTE, &eset);
if (eset.count) { if (eset.count) {
bool sub = false; bool sub = false;
for (int32 i = 0; i < eset.count; ++i) { for (int32 i = 0; i < eset.count; ++i) {
pduel->lua->add_param((*rm)->current.reason_effect, PARAM_TYPE_EFFECT); pduel->lua->add_param(pcard->current.reason_effect, PARAM_TYPE_EFFECT);
pduel->lua->add_param((*rm)->current.reason, PARAM_TYPE_INT); pduel->lua->add_param(pcard->current.reason, PARAM_TYPE_INT);
pduel->lua->add_param((*rm)->current.reason_player, PARAM_TYPE_INT); pduel->lua->add_param(pcard->current.reason_player, PARAM_TYPE_INT);
if(eset[i]->check_value_condition(3)) { if(eset[i]->check_value_condition(3)) {
core.battle_destroy_rep.insert(eset[i]->handler); core.battle_destroy_rep.insert(eset[i]->handler);
sub = true; sub = true;
} }
} }
if(sub) { if(sub) {
(*rm)->current.reason = (*rm)->temp.reason; pcard->current.reason = pcard->temp.reason;
(*rm)->current.reason_effect = (*rm)->temp.reason_effect; pcard->current.reason_effect = pcard->temp.reason_effect;
(*rm)->current.reason_player = (*rm)->temp.reason_player; pcard->current.reason_player = pcard->temp.reason_player;
core.destroy_canceled.insert(*rm); core.destroy_canceled.insert(pcard);
targets->container.erase(*rm); targets->container.erase(pcard);
} }
} }
eset.clear(); eset.clear();
} }
pair<effect_container::iterator, effect_container::iterator> pr; auto pr = effects.continuous_effect.equal_range(EFFECT_DESTROY_REPLACE);
pr = effects.continuous_effect.equal_range(EFFECT_DESTROY_REPLACE);
for (; pr.first != pr.second; ++pr.first) for (; pr.first != pr.second; ++pr.first)
add_process(PROCESSOR_OPERATION_REPLACE, 12, pr.first->second, targets, 0, 1); add_process(PROCESSOR_OPERATION_REPLACE, 12, pr.first->second, targets, 0, 1);
return FALSE; return FALSE;
} }
case 11: { case 11: {
card_set::iterator cit; for (auto cit = targets->container.begin(); cit != targets->container.end(); ++cit) {
for (cit = targets->container.begin(); cit != targets->container.end(); ++cit) {
add_process(PROCESSOR_DESTROY_STEP, 0, 0, targets, (ptr) (*cit), TRUE); add_process(PROCESSOR_DESTROY_STEP, 0, 0, targets, (ptr) (*cit), TRUE);
} }
return FALSE; return FALSE;
} }
case 12: { case 12: {
card_set::iterator cit; for (auto cit = core.destroy_canceled.begin(); cit != core.destroy_canceled.end(); ++cit)
for (cit = core.destroy_canceled.begin(); cit != core.destroy_canceled.end(); ++cit)
(*cit)->set_status(STATUS_DESTROY_CONFIRMED, FALSE); (*cit)->set_status(STATUS_DESTROY_CONFIRMED, FALSE);
core.destroy_canceled.clear(); core.destroy_canceled.clear();
return TRUE; return TRUE;
...@@ -2061,31 +2051,29 @@ int32 field::release(uint16 step, group * targets, effect * reason_effect, uint3 ...@@ -2061,31 +2051,29 @@ int32 field::release(uint16 step, group * targets, effect * reason_effect, uint3
switch (step) { switch (step) {
case 0: { case 0: {
card_set extra; card_set extra;
card_set::iterator cit, rm; for (auto cit = targets->container.begin(); cit != targets->container.end();) {
for (cit = targets->container.begin(); cit != targets->container.end();) { auto rm = cit++;
rm = cit++; card* pcard = *rm;
if ((*rm)->is_status(STATUS_SUMMONING) if (pcard->is_status(STATUS_SUMMONING)
|| ((reason & REASON_SUMMON) && !(*rm)->is_releaseable_by_summon(reason_player, (*rm)->current.reason_card)) || ((reason & REASON_SUMMON) && !pcard->is_releaseable_by_summon(reason_player, pcard->current.reason_card))
|| (!((*rm)->current.reason & (REASON_RULE | REASON_SUMMON | REASON_COST)) || (!(pcard->current.reason & (REASON_RULE | REASON_SUMMON | REASON_COST))
&& (!(*rm)->is_affect_by_effect((*rm)->current.reason_effect) || !(*rm)->is_releaseable_by_nonsummon(reason_player)))) { && (!pcard->is_affect_by_effect(pcard->current.reason_effect) || !pcard->is_releaseable_by_nonsummon(reason_player)))) {
(*rm)->current.reason = (*rm)->temp.reason; pcard->current.reason = pcard->temp.reason;
(*rm)->current.reason_effect = (*rm)->temp.reason_effect; pcard->current.reason_effect = pcard->temp.reason_effect;
(*rm)->current.reason_player = (*rm)->temp.reason_player; pcard->current.reason_player = pcard->temp.reason_player;
targets->container.erase(*rm); targets->container.erase(rm);
continue; continue;
} }
} }
if(reason & REASON_RULE) if(reason & REASON_RULE)
return FALSE; return FALSE;
pair<effect_container::iterator, effect_container::iterator> pr; auto pr = effects.continuous_effect.equal_range(EFFECT_RELEASE_REPLACE);
pr = effects.continuous_effect.equal_range(EFFECT_RELEASE_REPLACE);
for (; pr.first != pr.second; ++pr.first) for (; pr.first != pr.second; ++pr.first)
add_process(PROCESSOR_OPERATION_REPLACE, 5, pr.first->second, targets, 0, 0); add_process(PROCESSOR_OPERATION_REPLACE, 5, pr.first->second, targets, 0, 0);
return FALSE; return FALSE;
} }
case 1: { case 1: {
card_set::iterator cit; for (auto cit = targets->container.begin(); cit != targets->container.end(); ++cit) {
for (cit = targets->container.begin(); cit != targets->container.end(); ++cit) {
add_process(PROCESSOR_RELEASE_STEP, 0, 0, targets, (ptr) (*cit), 0); add_process(PROCESSOR_RELEASE_STEP, 0, 0, targets, (ptr) (*cit), 0);
} }
return FALSE; return FALSE;
...@@ -2098,32 +2086,29 @@ int32 field::release(uint16 step, group * targets, effect * reason_effect, uint3 ...@@ -2098,32 +2086,29 @@ int32 field::release(uint16 step, group * targets, effect * reason_effect, uint3
return TRUE; return TRUE;
} }
card_vector cv; card_vector cv;
card_vector::iterator cvit; for(auto cit = targets->container.begin(); cit != targets->container.end(); ++cit)
card_set::iterator cit;
for(cit = targets->container.begin(); cit != targets->container.end(); ++cit)
cv.push_back(*cit); cv.push_back(*cit);
if(cv.size() > 1) if(cv.size() > 1)
std::sort(cv.begin(), cv.end(), card::card_operation_sort); std::sort(cv.begin(), cv.end(), card::card_operation_sort);
for (cvit = cv.begin(); cvit != cv.end(); ++cvit) { for (auto cvit = cv.begin(); cvit != cv.end(); ++cvit) {
if(!((*cvit)->current.location & (LOCATION_ONFIELD | LOCATION_HAND))) { card* pcard = *cvit;
(*cvit)->current.reason = (*cvit)->temp.reason; if(!(pcard->current.location & (LOCATION_ONFIELD | LOCATION_HAND))) {
(*cvit)->current.reason_effect = (*cvit)->temp.reason_effect; pcard->current.reason = pcard->temp.reason;
(*cvit)->current.reason_player = (*cvit)->temp.reason_player; pcard->current.reason_effect = pcard->temp.reason_effect;
targets->container.erase((*cvit)); pcard->current.reason_player = pcard->temp.reason_player;
targets->container.erase(pcard);
continue; continue;
} }
(*cvit)->current.reason |= REASON_RELEASE; pcard->current.reason |= REASON_RELEASE;
} }
adjust_instant(); adjust_instant();
return FALSE; return FALSE;
} }
case 3: { case 3: {
card_set::iterator cit;
group* sendtargets = pduel->new_group(); group* sendtargets = pduel->new_group();
sendtargets->is_readonly = TRUE; sendtargets->is_readonly = TRUE;
sendtargets->container = targets->container; sendtargets->container = targets->container;
pair<effect_container::iterator, effect_container::iterator> pr; auto pr = effects.continuous_effect.equal_range(EFFECT_SEND_REPLACE);
pr = effects.continuous_effect.equal_range(EFFECT_SEND_REPLACE);
for (; pr.first != pr.second; ++pr.first) for (; pr.first != pr.second; ++pr.first)
add_process(PROCESSOR_OPERATION_REPLACE, 5, pr.first->second, sendtargets, 0, 0); add_process(PROCESSOR_OPERATION_REPLACE, 5, pr.first->second, sendtargets, 0, 0);
add_process(PROCESSOR_SENDTO, 1, reason_effect, sendtargets, reason + REASON_RELEASE, reason_player); add_process(PROCESSOR_SENDTO, 1, reason_effect, sendtargets, reason + REASON_RELEASE, reason_player);
...@@ -2162,24 +2147,24 @@ int32 field::send_to(uint16 step, group * targets, card * target) { ...@@ -2162,24 +2147,24 @@ int32 field::send_to(uint16 step, group * targets, card * target) {
return TRUE; return TRUE;
} }
int32 field::send_to(uint16 step, group * targets, effect * reason_effect, uint32 reason, uint8 reason_player) { int32 field::send_to(uint16 step, group * targets, effect * reason_effect, uint32 reason, uint8 reason_player) {
card_set::iterator cit, rm;
switch(step) { switch(step) {
case 0: { case 0: {
uint8 dest; uint8 dest;
for(cit = targets->container.begin(); cit != targets->container.end();) { for(auto cit = targets->container.begin(); cit != targets->container.end();) {
rm = cit++; auto rm = cit++;
dest = ((*rm)->operation_param >> 8) & 0xff; card* pcard = *rm;
dest = (pcard->operation_param >> 8) & 0xff;
if(!(reason & REASON_RULE) && if(!(reason & REASON_RULE) &&
((*rm)->is_status(STATUS_SUMMONING) (pcard->is_status(STATUS_SUMMONING)
|| (!((*rm)->current.reason & REASON_COST) && !(*rm)->is_affect_by_effect((*rm)->current.reason_effect)) || (!(pcard->current.reason & REASON_COST) && !pcard->is_affect_by_effect(pcard->current.reason_effect))
|| (dest == LOCATION_HAND && !(*rm)->is_capable_send_to_hand(core.reason_player)) || (dest == LOCATION_HAND && !pcard->is_capable_send_to_hand(core.reason_player))
|| (dest == LOCATION_DECK && !(*rm)->is_capable_send_to_deck(core.reason_player)) || (dest == LOCATION_DECK && !pcard->is_capable_send_to_deck(core.reason_player))
|| (dest == LOCATION_REMOVED && !(*rm)->is_removeable(core.reason_player)) || (dest == LOCATION_REMOVED && !pcard->is_removeable(core.reason_player))
|| (dest == LOCATION_GRAVE && !(*rm)->is_capable_send_to_grave(core.reason_player)))) { || (dest == LOCATION_GRAVE && !pcard->is_capable_send_to_grave(core.reason_player)))) {
(*rm)->current.reason = (*rm)->temp.reason; pcard->current.reason = pcard->temp.reason;
(*rm)->current.reason_player = (*rm)->temp.reason_player; pcard->current.reason_player = pcard->temp.reason_player;
(*rm)->current.reason_effect = (*rm)->temp.reason_effect; pcard->current.reason_effect = pcard->temp.reason_effect;
targets->container.erase(*rm); targets->container.erase(rm);
continue; continue;
} }
} }
...@@ -2191,7 +2176,7 @@ int32 field::send_to(uint16 step, group * targets, effect * reason_effect, uint3 ...@@ -2191,7 +2176,7 @@ int32 field::send_to(uint16 step, group * targets, effect * reason_effect, uint3
return FALSE; return FALSE;
} }
case 1: { case 1: {
for(cit = targets->container.begin(); cit != targets->container.end(); ++cit) { for(auto cit = targets->container.begin(); cit != targets->container.end(); ++cit) {
add_process(PROCESSOR_SENDTO_STEP, 0, 0, targets, (ptr)(*cit), 0); add_process(PROCESSOR_SENDTO_STEP, 0, 0, targets, (ptr)(*cit), 0);
} }
return FALSE; return FALSE;
...@@ -2203,7 +2188,7 @@ int32 field::send_to(uint16 step, group * targets, effect * reason_effect, uint3 ...@@ -2203,7 +2188,7 @@ int32 field::send_to(uint16 step, group * targets, effect * reason_effect, uint3
pduel->delete_group(targets); pduel->delete_group(targets);
return TRUE; return TRUE;
} }
for(cit = targets->container.begin(); cit != targets->container.end(); ++cit) { for(auto cit = targets->container.begin(); cit != targets->container.end(); ++cit) {
(*cit)->enable_field_effect(FALSE); (*cit)->enable_field_effect(FALSE);
} }
adjust_instant(); adjust_instant();
...@@ -2212,28 +2197,29 @@ int32 field::send_to(uint16 step, group * targets, effect * reason_effect, uint3 ...@@ -2212,28 +2197,29 @@ int32 field::send_to(uint16 step, group * targets, effect * reason_effect, uint3
case 3: { case 3: {
uint32 redirect, dest; uint32 redirect, dest;
card_set leave_p; card_set leave_p;
for(cit = targets->container.begin(); cit != targets->container.end(); ++cit) { for(auto cit = targets->container.begin(); cit != targets->container.end(); ++cit) {
dest = ((*cit)->operation_param >> 8) & 0xff; card* pcard = *cit;
dest = (pcard->operation_param >> 8) & 0xff;
redirect = 0; redirect = 0;
if(((*cit)->current.location & LOCATION_ONFIELD) && !(*cit)->is_status(STATUS_SUMMON_DISABLED)) if((pcard->current.location & LOCATION_ONFIELD) && !pcard->is_status(STATUS_SUMMON_DISABLED))
redirect = (*cit)->leave_field_redirect(); redirect = pcard->leave_field_redirect();
if(redirect) { if(redirect) {
(*cit)->current.reason &= ~REASON_TEMPORARY; pcard->current.reason &= ~REASON_TEMPORARY;
(*cit)->current.reason |= REASON_REDIRECT; pcard->current.reason |= REASON_REDIRECT;
(*cit)->operation_param = ((*cit)->operation_param & 0xffff0000) + (redirect << 8) + (redirect >> 16); pcard->operation_param = (pcard->operation_param & 0xffff0000) + (redirect << 8) + (redirect >> 16);
dest = redirect; dest = redirect;
} }
redirect = (*cit)->destination_redirect(dest); redirect = pcard->destination_redirect(dest);
if(redirect && (*cit)->current.location != redirect) { if(redirect && pcard->current.location != redirect) {
(*cit)->current.reason |= REASON_REDIRECT; pcard->current.reason |= REASON_REDIRECT;
(*cit)->operation_param = ((*cit)->operation_param & 0xffff0000) + (redirect << 8) + (redirect >> 16); pcard->operation_param = (pcard->operation_param & 0xffff0000) + (redirect << 8) + (redirect >> 16);
dest = redirect; dest = redirect;
} }
if(((*cit)->current.location == LOCATION_MZONE) && (*cit)->is_status(STATUS_BATTLE_DESTROYED) && !((*cit)->current.reason & REASON_DESTROY)) if((pcard->current.location == LOCATION_MZONE) && pcard->is_status(STATUS_BATTLE_DESTROYED) && !(pcard->current.reason & REASON_DESTROY))
(*cit)->current.reason |= REASON_DESTROY | REASON_BATTLE; pcard->current.reason |= REASON_DESTROY | REASON_BATTLE;
if(((*cit)->current.location & LOCATION_ONFIELD) && !(*cit)->is_status(STATUS_SUMMON_DISABLED)) { if((pcard->current.location & LOCATION_ONFIELD) && !pcard->is_status(STATUS_SUMMON_DISABLED)) {
raise_single_event(*cit, 0, EVENT_LEAVE_FIELD_P, (*cit)->current.reason_effect, (*cit)->current.reason, (*cit)->current.reason_player, 0, 0); raise_single_event(pcard, 0, EVENT_LEAVE_FIELD_P, pcard->current.reason_effect, pcard->current.reason, pcard->current.reason_player, 0, 0);
leave_p.insert(*cit); leave_p.insert(pcard);
} }
} }
if(leave_p.size()) if(leave_p.size())
...@@ -2246,85 +2232,85 @@ int32 field::send_to(uint16 step, group * targets, effect * reason_effect, uint3 ...@@ -2246,85 +2232,85 @@ int32 field::send_to(uint16 step, group * targets, effect * reason_effect, uint3
card_set leave, discard; card_set leave, discard;
uint8 oloc, playerid, dest, seq; uint8 oloc, playerid, dest, seq;
card_vector cv; card_vector cv;
card_vector::iterator cvit; for(auto cit = targets->container.begin(); cit != targets->container.end(); ++cit)
for(cit = targets->container.begin(); cit != targets->container.end(); ++cit)
cv.push_back(*cit); cv.push_back(*cit);
if(cv.size() > 1) if(cv.size() > 1)
std::sort(cv.begin(), cv.end(), card::card_operation_sort); std::sort(cv.begin(), cv.end(), card::card_operation_sort);
for (cvit = cv.begin(); cvit != cv.end(); ++cvit) { for (auto cvit = cv.begin(); cvit != cv.end(); ++cvit) {
oloc = (*cvit)->current.location; card* pcard = *cvit;
playerid = ((*cvit)->operation_param >> 16) & 0xff; oloc = pcard->current.location;
dest = ((*cvit)->operation_param >> 8) & 0xff; playerid = (pcard->operation_param >> 16) & 0xff;
seq = ((*cvit)->operation_param) & 0xff; dest = (pcard->operation_param >> 8) & 0xff;
(*cvit)->enable_field_effect(FALSE); seq = (pcard->operation_param) & 0xff;
if((*cvit)->equiping_target) pcard->enable_field_effect(FALSE);
(*cvit)->unequip(); if(pcard->equiping_target)
if((*cvit)->data.type & TYPE_TOKEN) { pcard->unequip();
if(pcard->data.type & TYPE_TOKEN) {
pduel->write_buffer8(MSG_MOVE); pduel->write_buffer8(MSG_MOVE);
pduel->write_buffer32((*cvit)->data.code); pduel->write_buffer32(pcard->data.code);
pduel->write_buffer8((*cvit)->current.controler); pduel->write_buffer8(pcard->current.controler);
pduel->write_buffer8((*cvit)->current.location); pduel->write_buffer8(pcard->current.location);
pduel->write_buffer8((*cvit)->current.sequence); pduel->write_buffer8(pcard->current.sequence);
pduel->write_buffer8((*cvit)->current.position); pduel->write_buffer8(pcard->current.position);
pduel->write_buffer8(0); pduel->write_buffer8(0);
pduel->write_buffer8(0); pduel->write_buffer8(0);
pduel->write_buffer8(0); pduel->write_buffer8(0);
pduel->write_buffer8(0); pduel->write_buffer8(0);
pduel->write_buffer32((*cvit)->current.reason); pduel->write_buffer32(pcard->current.reason);
(*cvit)->previous.controler = (*cvit)->current.controler; pcard->previous.controler = pcard->current.controler;
(*cvit)->previous.location = (*cvit)->current.location; pcard->previous.location = pcard->current.location;
(*cvit)->previous.sequence = (*cvit)->current.sequence; pcard->previous.sequence = pcard->current.sequence;
(*cvit)->previous.position = (*cvit)->current.position; pcard->previous.position = pcard->current.position;
(*cvit)->current.reason &= ~REASON_TEMPORARY; pcard->current.reason &= ~REASON_TEMPORARY;
(*cvit)->fieldid = infos.field_id++; pcard->fieldid = infos.field_id++;
(*cvit)->reset(RESET_LEAVE, RESET_EVENT); pcard->reset(RESET_LEAVE, RESET_EVENT);
remove_card(*cvit); remove_card(pcard);
continue; continue;
} }
if(dest == LOCATION_GRAVE) { if(dest == LOCATION_GRAVE) {
core.hint_timing[(*cvit)->current.controler] |= TIMING_TOGRAVE; core.hint_timing[pcard->current.controler] |= TIMING_TOGRAVE;
} else if(dest == LOCATION_HAND) { } else if(dest == LOCATION_HAND) {
(*cvit)->set_status(STATUS_PROC_COMPLETE, FALSE); pcard->set_status(STATUS_PROC_COMPLETE, FALSE);
core.hint_timing[(*cvit)->current.controler] |= TIMING_TOHAND; core.hint_timing[pcard->current.controler] |= TIMING_TOHAND;
} else if(dest == LOCATION_DECK) { } else if(dest == LOCATION_DECK) {
(*cvit)->set_status(STATUS_PROC_COMPLETE, FALSE); pcard->set_status(STATUS_PROC_COMPLETE, FALSE);
core.hint_timing[(*cvit)->current.controler] |= TIMING_TODECK; core.hint_timing[pcard->current.controler] |= TIMING_TODECK;
} else if(dest == LOCATION_REMOVED) { } else if(dest == LOCATION_REMOVED) {
core.hint_timing[(*cvit)->current.controler] |= TIMING_REMOVE; core.hint_timing[pcard->current.controler] |= TIMING_REMOVE;
} }
pduel->write_buffer8(MSG_MOVE); pduel->write_buffer8(MSG_MOVE);
pduel->write_buffer32((*cvit)->data.code); pduel->write_buffer32(pcard->data.code);
if((*cvit)->overlay_target) { if(pcard->overlay_target) {
pduel->write_buffer8((*cvit)->overlay_target->current.controler); pduel->write_buffer8(pcard->overlay_target->current.controler);
pduel->write_buffer8((*cvit)->overlay_target->current.location | LOCATION_OVERLAY); pduel->write_buffer8(pcard->overlay_target->current.location | LOCATION_OVERLAY);
pduel->write_buffer8((*cvit)->overlay_target->current.sequence); pduel->write_buffer8(pcard->overlay_target->current.sequence);
pduel->write_buffer8((*cvit)->current.sequence); pduel->write_buffer8(pcard->current.sequence);
(*cvit)->overlay_target->xyz_remove(*cvit); pcard->overlay_target->xyz_remove(pcard);
} else { } else {
pduel->write_buffer8((*cvit)->current.controler); pduel->write_buffer8(pcard->current.controler);
pduel->write_buffer8((*cvit)->current.location); pduel->write_buffer8(pcard->current.location);
pduel->write_buffer8((*cvit)->current.sequence); pduel->write_buffer8(pcard->current.sequence);
pduel->write_buffer8((*cvit)->current.position); pduel->write_buffer8(pcard->current.position);
} }
move_card(playerid, *cvit, dest, seq); move_card(playerid, pcard, dest, seq);
(*cvit)->current.position = ((*cvit)->operation_param >> 24); pcard->current.position = (pcard->operation_param >> 24);
pduel->write_buffer8((*cvit)->current.controler); pduel->write_buffer8(pcard->current.controler);
pduel->write_buffer8((*cvit)->current.location); pduel->write_buffer8(pcard->current.location);
pduel->write_buffer8((*cvit)->current.sequence); pduel->write_buffer8(pcard->current.sequence);
pduel->write_buffer8((*cvit)->current.position); pduel->write_buffer8(pcard->current.position);
pduel->write_buffer32((*cvit)->current.reason); pduel->write_buffer32(pcard->current.reason);
(*cvit)->set_status(STATUS_LEAVE_CONFIRMED, FALSE); pcard->set_status(STATUS_LEAVE_CONFIRMED, FALSE);
if((*cvit)->status & (STATUS_SUMMON_DISABLED | STATUS_ACTIVATE_DISABLED)) { if(pcard->status & (STATUS_SUMMON_DISABLED | STATUS_ACTIVATE_DISABLED)) {
(*cvit)->set_status(STATUS_SUMMON_DISABLED | STATUS_ACTIVATE_DISABLED, FALSE); pcard->set_status(STATUS_SUMMON_DISABLED | STATUS_ACTIVATE_DISABLED, FALSE);
(*cvit)->previous.location = 0; pcard->previous.location = 0;
} else if(oloc & LOCATION_ONFIELD) { } else if(oloc & LOCATION_ONFIELD) {
(*cvit)->reset(RESET_LEAVE, RESET_EVENT); pcard->reset(RESET_LEAVE, RESET_EVENT);
raise_single_event(*cvit, 0, EVENT_LEAVE_FIELD, (*cvit)->current.reason_effect, (*cvit)->current.reason, (*cvit)->current.reason_player, 0, 0); raise_single_event(pcard, 0, EVENT_LEAVE_FIELD, pcard->current.reason_effect, pcard->current.reason, pcard->current.reason_player, 0, 0);
leave.insert(*cvit); leave.insert(pcard);
} }
if((*cvit)->current.reason & REASON_DISCARD) { if(pcard->current.reason & REASON_DISCARD) {
raise_single_event(*cvit, 0, EVENT_DISCARD, (*cvit)->current.reason_effect, (*cvit)->current.reason, (*cvit)->current.reason_player, 0, 0); raise_single_event(pcard, 0, EVENT_DISCARD, pcard->current.reason_effect, pcard->current.reason, pcard->current.reason_player, 0, 0);
discard.insert(*cvit); discard.insert(pcard);
} }
} }
adjust_instant(); adjust_instant();
...@@ -2343,45 +2329,45 @@ int32 field::send_to(uint16 step, group * targets, effect * reason_effect, uint3 ...@@ -2343,45 +2329,45 @@ int32 field::send_to(uint16 step, group * targets, effect * reason_effect, uint3
uint8 nloc; uint8 nloc;
card_set tohand, todeck, tograve, remove, released; card_set tohand, todeck, tograve, remove, released;
card_set equipings, overlays; card_set equipings, overlays;
for(cit = targets->container.begin(); cit != targets->container.end(); ++cit) { for(auto cit = targets->container.begin(); cit != targets->container.end(); ++cit) {
nloc = (*cit)->current.location; card* pcard = *cit;
if((*cit)->equiping_cards.size()) { nloc = pcard->current.location;
card_set::iterator csit, rm; if(pcard->equiping_cards.size()) {
for(csit = (*cit)->equiping_cards.begin(); csit != (*cit)->equiping_cards.end();) { for(auto csit = pcard->equiping_cards.begin(); csit != pcard->equiping_cards.end();) {
rm = csit++; auto rm = csit++;
(*rm)->unequip(); (*rm)->unequip();
equipings.insert(*rm); equipings.insert(*rm);
} }
} }
if((*cit)->data.type & TYPE_TOKEN) if(pcard->data.type & TYPE_TOKEN)
continue; continue;
(*cit)->enable_field_effect(TRUE); pcard->enable_field_effect(TRUE);
if(nloc == LOCATION_HAND) { if(nloc == LOCATION_HAND) {
tohand.insert(*cit); tohand.insert(pcard);
(*cit)->reset(RESET_TOHAND, RESET_EVENT); pcard->reset(RESET_TOHAND, RESET_EVENT);
raise_single_event(*cit, 0, EVENT_TO_HAND, (*cit)->current.reason_effect, (*cit)->current.reason, (*cit)->current.reason_player, 0, 0); raise_single_event(*cit, 0, EVENT_TO_HAND, pcard->current.reason_effect, pcard->current.reason, pcard->current.reason_player, 0, 0);
} else if(nloc == LOCATION_DECK || nloc == LOCATION_EXTRA) { } else if(nloc == LOCATION_DECK || nloc == LOCATION_EXTRA) {
todeck.insert(*cit); todeck.insert(pcard);
(*cit)->reset(RESET_TODECK, RESET_EVENT); pcard->reset(RESET_TODECK, RESET_EVENT);
raise_single_event(*cit, 0, EVENT_TO_DECK, (*cit)->current.reason_effect, (*cit)->current.reason, (*cit)->current.reason_player, 0, 0); raise_single_event(*cit, 0, EVENT_TO_DECK, pcard->current.reason_effect, pcard->current.reason, pcard->current.reason_player, 0, 0);
} else if(nloc == LOCATION_GRAVE) { } else if(nloc == LOCATION_GRAVE) {
tograve.insert(*cit); tograve.insert(pcard);
(*cit)->reset(RESET_TOGRAVE, RESET_EVENT); pcard->reset(RESET_TOGRAVE, RESET_EVENT);
raise_single_event(*cit, 0, EVENT_TO_GRAVE, (*cit)->current.reason_effect, (*cit)->current.reason, (*cit)->current.reason_player, 0, 0); raise_single_event(*cit, 0, EVENT_TO_GRAVE, pcard->current.reason_effect, pcard->current.reason, pcard->current.reason_player, 0, 0);
} else if(nloc == LOCATION_REMOVED) { } else if(nloc == LOCATION_REMOVED) {
remove.insert(*cit); remove.insert(pcard);
if((*cit)->current.reason & REASON_TEMPORARY) if(pcard->current.reason & REASON_TEMPORARY)
(*cit)->reset(RESET_TEMP_REMOVE, RESET_EVENT); pcard->reset(RESET_TEMP_REMOVE, RESET_EVENT);
else else
(*cit)->reset(RESET_REMOVE, RESET_EVENT); pcard->reset(RESET_REMOVE, RESET_EVENT);
raise_single_event(*cit, 0, EVENT_REMOVE, (*cit)->current.reason_effect, (*cit)->current.reason, (*cit)->current.reason_player, 0, 0); raise_single_event(pcard, 0, EVENT_REMOVE, pcard->current.reason_effect, pcard->current.reason, pcard->current.reason_player, 0, 0);
} }
if((*cit)->current.reason & REASON_RELEASE) { if(pcard->current.reason & REASON_RELEASE) {
released.insert(*cit); released.insert(pcard);
raise_single_event(*cit, 0, EVENT_RELEASE, (*cit)->current.reason_effect, (*cit)->current.reason, (*cit)->current.reason_player, 0, 0); raise_single_event(pcard, 0, EVENT_RELEASE, pcard->current.reason_effect, pcard->current.reason, pcard->current.reason_player, 0, 0);
} }
if((*cit)->xyz_materials.size()) { if(pcard->xyz_materials.size()) {
for(auto clit = (*cit)->xyz_materials.begin(); clit != (*cit)->xyz_materials.end(); ++clit) for(auto clit = pcard->xyz_materials.begin(); clit != pcard->xyz_materials.end(); ++clit)
overlays.insert(*clit); overlays.insert(*clit);
} }
} }
...@@ -2614,10 +2600,9 @@ int32 field::move_to_field(uint16 step, card * target, uint32 enable, uint32 ret ...@@ -2614,10 +2600,9 @@ int32 field::move_to_field(uint16 step, card * target, uint32 enable, uint32 ret
pduel->write_buffer32(target->current.reason); pduel->write_buffer32(target->current.reason);
if((target->current.location != LOCATION_MZONE)) { if((target->current.location != LOCATION_MZONE)) {
if(target->equiping_cards.size()) { if(target->equiping_cards.size()) {
card_set::iterator csit, rm;
destroy(&target->equiping_cards, 0, REASON_LOST_TARGET, PLAYER_NONE); destroy(&target->equiping_cards, 0, REASON_LOST_TARGET, PLAYER_NONE);
for(csit = target->equiping_cards.begin(); csit != target->equiping_cards.end();) { for(auto csit = target->equiping_cards.begin(); csit != target->equiping_cards.end();) {
rm = csit++; auto rm = csit++;
(*rm)->unequip(); (*rm)->unequip();
} }
} }
...@@ -2652,67 +2637,67 @@ int32 field::change_position(uint16 step, group * targets, effect * reason_effec ...@@ -2652,67 +2637,67 @@ int32 field::change_position(uint16 step, group * targets, effect * reason_effec
if(cv.size() > 1) if(cv.size() > 1)
std::sort(cv.begin(), cv.end(), card::card_operation_sort); std::sort(cv.begin(), cv.end(), card::card_operation_sort);
for(cvit = cv.begin(); cvit != cv.end(); ++cvit) { for(cvit = cv.begin(); cvit != cv.end(); ++cvit) {
npos = (*cvit)->operation_param & 0xff; card* pcard = *cvit;
opos = (*cvit)->current.position; npos = pcard->operation_param & 0xff;
noflip = (*cvit)->operation_param >> 16; opos = pcard->current.position;
if((*cvit)->is_status(STATUS_SUMMONING) || (*cvit)->overlay_target || !((*cvit)->current.location & LOCATION_ONFIELD) noflip = pcard->operation_param >> 16;
|| !(*cvit)->is_affect_by_effect(reason_effect) || npos == opos if(pcard->is_status(STATUS_SUMMONING) || pcard->overlay_target || !(pcard->current.location & LOCATION_ONFIELD)
|| ((opos & POS_FACEUP) && (npos & POS_FACEDOWN) && !(*cvit)->is_capable_turn_set(reason_player)) || !pcard->is_affect_by_effect(reason_effect) || npos == opos
|| (reason_effect && (*cvit)->is_affected_by_effect(EFFECT_CANNOT_CHANGE_POS_E))) { || ((opos & POS_FACEUP) && (npos & POS_FACEDOWN) && !pcard->is_capable_turn_set(reason_player))
targets->container.erase((*cvit)); || (reason_effect && pcard->is_affected_by_effect(EFFECT_CANNOT_CHANGE_POS_E))) {
targets->container.erase(pcard);
} else { } else {
if(((*cvit)->data.type & TYPE_TOKEN) && (npos & POS_FACEDOWN)) if((pcard->data.type & TYPE_TOKEN) && (npos & POS_FACEDOWN))
npos = POS_FACEUP_DEFENCE; npos = POS_FACEUP_DEFENCE;
(*cvit)->previous.position = opos; pcard->previous.position = opos;
(*cvit)->current.position = npos; pcard->current.position = npos;
if(npos & POS_DEFENCE) if(npos & POS_DEFENCE)
(*cvit)->set_status(STATUS_ATTACK_CANCELED, TRUE); pcard->set_status(STATUS_ATTACK_CANCELED, TRUE);
(*cvit)->set_status(STATUS_JUST_POS, TRUE); pcard->set_status(STATUS_JUST_POS, TRUE);
pduel->write_buffer8(MSG_POS_CHANGE); pduel->write_buffer8(MSG_POS_CHANGE);
pduel->write_buffer32((*cvit)->data.code); pduel->write_buffer32(pcard->data.code);
pduel->write_buffer8((*cvit)->current.controler); pduel->write_buffer8(pcard->current.controler);
pduel->write_buffer8((*cvit)->current.location); pduel->write_buffer8(pcard->current.location);
pduel->write_buffer8((*cvit)->current.sequence); pduel->write_buffer8(pcard->current.sequence);
pduel->write_buffer8((*cvit)->previous.position); pduel->write_buffer8(pcard->previous.position);
pduel->write_buffer8((*cvit)->current.position); pduel->write_buffer8(pcard->current.position);
core.hint_timing[(*cvit)->current.controler] |= TIMING_POS_CHANGE; core.hint_timing[pcard->current.controler] |= TIMING_POS_CHANGE;
if((opos & POS_FACEDOWN) && (npos & POS_FACEUP)) { if((opos & POS_FACEDOWN) && (npos & POS_FACEUP)) {
(*cvit)->fieldid = infos.field_id++; pcard->fieldid = infos.field_id++;
if((*cvit)->current.location == LOCATION_MZONE) { if(pcard->current.location == LOCATION_MZONE) {
raise_single_event((*cvit), 0, EVENT_FLIP, reason_effect, 0, reason_player, 0, noflip); raise_single_event(pcard, 0, EVENT_FLIP, reason_effect, 0, reason_player, 0, noflip);
if(infos.phase == PHASE_BATTLE && (*cvit)->current.controler != infos.turn_player) if(infos.phase == PHASE_BATTLE && pcard->current.controler != infos.turn_player)
core.pre_field[(*cvit)->current.sequence] = (*cvit)->fieldid; core.pre_field[pcard->current.sequence] = pcard->fieldid;
} }
if(enable) if(enable)
(*cvit)->enable_field_effect(TRUE); pcard->enable_field_effect(TRUE);
else else
(*cvit)->refresh_disable_status(); pcard->refresh_disable_status();
} }
if((*cvit)->current.location == LOCATION_MZONE) { if(pcard->current.location == LOCATION_MZONE) {
raise_single_event(*cvit, 0, EVENT_CHANGE_POS, reason_effect, 0, reason_player, 0, 0); raise_single_event(*cvit, 0, EVENT_CHANGE_POS, reason_effect, 0, reason_player, 0, 0);
pos_changed.insert(*cvit); pos_changed.insert(pcard);
} }
bool trapmonster = false; bool trapmonster = false;
if((opos & POS_FACEUP) && (npos & POS_FACEDOWN)) { if((opos & POS_FACEUP) && (npos & POS_FACEDOWN)) {
if((*cvit)->get_type()&TYPE_TRAPMONSTER) if(pcard->get_type()&TYPE_TRAPMONSTER)
trapmonster = true; trapmonster = true;
(*cvit)->reset(RESET_TURN_SET, RESET_EVENT); pcard->reset(RESET_TURN_SET, RESET_EVENT);
(*cvit)->set_status(STATUS_SET_TURN, TRUE); pcard->set_status(STATUS_SET_TURN, TRUE);
(*cvit)->enable_field_effect(FALSE); pcard->enable_field_effect(FALSE);
} }
if((npos & POS_FACEDOWN) && (*cvit)->equiping_cards.size()) { if((npos & POS_FACEDOWN) && pcard->equiping_cards.size()) {
card_set::iterator csit, erm; for(auto csit = pcard->equiping_cards.begin(); csit != pcard->equiping_cards.end();) {
for(csit = (*cvit)->equiping_cards.begin(); csit != (*cvit)->equiping_cards.end();) { auto erm = csit++;
erm = csit++;
(*erm)->unequip(); (*erm)->unequip();
equipings.insert(*erm); equipings.insert(*erm);
} }
} }
if((npos & POS_FACEDOWN) && (*cvit)->equiping_target) if((npos & POS_FACEDOWN) && pcard->equiping_target)
(*cvit)->unequip(); pcard->unequip();
if(trapmonster) { if(trapmonster) {
refresh_location_info_instant(); refresh_location_info_instant();
move_to_field(*cvit, (*cvit)->current.controler, (*cvit)->current.controler, LOCATION_SZONE, POS_FACEDOWN); move_to_field(pcard, pcard->current.controler, pcard->current.controler, LOCATION_SZONE, POS_FACEDOWN);
} }
} }
} }
...@@ -2986,8 +2971,7 @@ int32 field::operation_replace(uint16 step, effect * replace_effect, group * tar ...@@ -2986,8 +2971,7 @@ int32 field::operation_replace(uint16 step, effect * replace_effect, group * tar
case 16: { case 16: {
if(core.continuous_chain.rbegin()->target_cards) if(core.continuous_chain.rbegin()->target_cards)
pduel->delete_group(core.continuous_chain.rbegin()->target_cards); pduel->delete_group(core.continuous_chain.rbegin()->target_cards);
chain::opmap::iterator oit; for(auto oit = core.continuous_chain.rbegin()->opinfos.begin(); oit != core.continuous_chain.rbegin()->opinfos.end(); ++oit) {
for(oit = core.continuous_chain.rbegin()->opinfos.begin(); oit != core.continuous_chain.rbegin()->opinfos.end(); ++oit) {
if(oit->second.op_cards) if(oit->second.op_cards)
pduel->delete_group(oit->second.op_cards); pduel->delete_group(oit->second.op_cards);
} }
......
...@@ -28,7 +28,7 @@ function c33396948.check(g) ...@@ -28,7 +28,7 @@ function c33396948.check(g)
return a1 and a2 and a3 and a4 and a5 return a1 and a2 and a3 and a4 and a5
end end
function c33396948.operation(e,tp,eg,ep,ev,re,r,rp) function c33396948.operation(e,tp,eg,ep,ev,re,r,rp)
local WIN_REASON_EXODIA = 0x3 local WIN_REASON_EXODIA = 0x10
local g1=Duel.GetFieldGroup(tp,LOCATION_HAND,0) local g1=Duel.GetFieldGroup(tp,LOCATION_HAND,0)
local g2=Duel.GetFieldGroup(tp,0,LOCATION_HAND) local g2=Duel.GetFieldGroup(tp,0,LOCATION_HAND)
local wtp=c33396948.check(g1) local wtp=c33396948.check(g1)
......
...@@ -75,6 +75,6 @@ function c8062132.ctop(e,tp,eg,ep,ev,re,r,rp) ...@@ -75,6 +75,6 @@ function c8062132.ctop(e,tp,eg,ep,ev,re,r,rp)
local c=e:GetHandler() local c=e:GetHandler()
c:AddCounter(0x11,1) c:AddCounter(0x11,1)
if c:GetCounter(0x11)>=3 then if c:GetCounter(0x11)>=3 then
Duel.Win(tp,0x5) Duel.Win(tp,0x12)
end end
end end
...@@ -32,6 +32,6 @@ function c95308449.checkop(e,tp,eg,ep,ev,re,r,rp) ...@@ -32,6 +32,6 @@ function c95308449.checkop(e,tp,eg,ep,ev,re,r,rp)
ct=ct+1 ct=ct+1
c:SetTurnCounter(ct) c:SetTurnCounter(ct)
if ct==20 then if ct==20 then
Duel.Win(tp,0x4) Duel.Win(tp,0x11)
end end
end end
...@@ -351,9 +351,11 @@ ...@@ -351,9 +351,11 @@
!victory 0x0 投降 !victory 0x0 投降
!victory 0x1 LP变成0 !victory 0x1 LP变成0
!victory 0x2 没有卡可抽 !victory 0x2 没有卡可抽
!victory 0x3 被封印的埃及使者 !victory 0x3 超时
!victory 0x4 終焉のカウントダウン !victory 0x4 失去连接
!victory 0x5 毒蛇神ヴェノミナーガ !victory 0x10 封印されしエクゾディア
!victory 0x11 終焉のカウントダウン
!victory 0x12 毒蛇神ヴェノミナーガ
#counters #counters
!counter 0x3001 魔力指示物 !counter 0x3001 魔力指示物
!counter 0x2 楔指示物 !counter 0x2 楔指示物
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
antialias = 2 antialias = 2
nickname = Player nickname = Player
gamename = Game gamename = Game
lastdeck = Burn1 lastdeck = test
textfont = c:/windows/fonts/simsun.ttc textfont = c:/windows/fonts/simsun.ttc
numfont = c:/windows/fonts/arialbd.ttf numfont = c:/windows/fonts/arialbd.ttf
serverport = 7911 serverport = 7911
......
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