Commit e7ebb75f authored by mercury233's avatar mercury233 Committed by GitHub

update forced in MSG_SELECT_CHAIN (#2797)

parent f4db5750
...@@ -1325,7 +1325,7 @@ bool DuelClient::ClientAnalyze(unsigned char* msg, int len) { ...@@ -1325,7 +1325,7 @@ bool DuelClient::ClientAnalyze(unsigned char* msg, int len) {
} }
mainGame->dField.activatable_cards.push_back(pcard); mainGame->dField.activatable_cards.push_back(pcard);
mainGame->dField.activatable_descs.push_back(std::make_pair(desc, flag)); mainGame->dField.activatable_descs.push_back(std::make_pair(desc, flag));
if(flag == EDESC_OPERATION) { if(flag & EDESC_OPERATION) {
pcard->chain_code = code; pcard->chain_code = code;
mainGame->dField.conti_cards.push_back(pcard); mainGame->dField.conti_cards.push_back(pcard);
mainGame->dField.conti_act = true; mainGame->dField.conti_act = true;
...@@ -1457,7 +1457,7 @@ bool DuelClient::ClientAnalyze(unsigned char* msg, int len) { ...@@ -1457,7 +1457,7 @@ bool DuelClient::ClientAnalyze(unsigned char* msg, int len) {
} }
mainGame->dField.activatable_cards.push_back(pcard); mainGame->dField.activatable_cards.push_back(pcard);
mainGame->dField.activatable_descs.push_back(std::make_pair(desc, flag)); mainGame->dField.activatable_descs.push_back(std::make_pair(desc, flag));
if(flag == EDESC_OPERATION) { if(flag & EDESC_OPERATION) {
pcard->chain_code = code; pcard->chain_code = code;
mainGame->dField.conti_cards.push_back(pcard); mainGame->dField.conti_cards.push_back(pcard);
mainGame->dField.conti_act = true; mainGame->dField.conti_act = true;
...@@ -1705,7 +1705,6 @@ bool DuelClient::ClientAnalyze(unsigned char* msg, int len) { ...@@ -1705,7 +1705,6 @@ bool DuelClient::ClientAnalyze(unsigned char* msg, int len) {
/*int selecting_player = */BufferIO::ReadUInt8(pbuf); /*int selecting_player = */BufferIO::ReadUInt8(pbuf);
int count = BufferIO::ReadUInt8(pbuf); int count = BufferIO::ReadUInt8(pbuf);
int specount = BufferIO::ReadUInt8(pbuf); int specount = BufferIO::ReadUInt8(pbuf);
int forced = BufferIO::ReadUInt8(pbuf);
/*int hint0 = */BufferIO::ReadInt32(pbuf); /*int hint0 = */BufferIO::ReadInt32(pbuf);
/*int hint1 = */BufferIO::ReadInt32(pbuf); /*int hint1 = */BufferIO::ReadInt32(pbuf);
int c, s, ss, desc; int c, s, ss, desc;
...@@ -1714,12 +1713,14 @@ bool DuelClient::ClientAnalyze(unsigned char* msg, int len) { ...@@ -1714,12 +1713,14 @@ bool DuelClient::ClientAnalyze(unsigned char* msg, int len) {
bool panelmode = false; bool panelmode = false;
bool conti_exist = false; bool conti_exist = false;
bool select_trigger = (specount == 0x7f); bool select_trigger = (specount == 0x7f);
mainGame->dField.chain_forced = (forced != 0); mainGame->dField.chain_forced = false;
mainGame->dField.activatable_cards.clear(); mainGame->dField.activatable_cards.clear();
mainGame->dField.activatable_descs.clear(); mainGame->dField.activatable_descs.clear();
mainGame->dField.conti_cards.clear(); mainGame->dField.conti_cards.clear();
for (int i = 0; i < count; ++i) { for (int i = 0; i < count; ++i) {
int flag = BufferIO::ReadUInt8(pbuf); int flag = BufferIO::ReadUInt8(pbuf);
int forced = BufferIO::ReadUInt8(pbuf);
flag |= forced << 8;
code = BufferIO::ReadInt32(pbuf); code = BufferIO::ReadInt32(pbuf);
c = mainGame->LocalPlayer(BufferIO::ReadUInt8(pbuf)); c = mainGame->LocalPlayer(BufferIO::ReadUInt8(pbuf));
l = BufferIO::ReadUInt8(pbuf); l = BufferIO::ReadUInt8(pbuf);
...@@ -1730,14 +1731,17 @@ bool DuelClient::ClientAnalyze(unsigned char* msg, int len) { ...@@ -1730,14 +1731,17 @@ bool DuelClient::ClientAnalyze(unsigned char* msg, int len) {
mainGame->dField.activatable_cards.push_back(pcard); mainGame->dField.activatable_cards.push_back(pcard);
mainGame->dField.activatable_descs.push_back(std::make_pair(desc, flag)); mainGame->dField.activatable_descs.push_back(std::make_pair(desc, flag));
pcard->is_selected = false; pcard->is_selected = false;
if(flag == EDESC_OPERATION) { if(forced) {
mainGame->dField.chain_forced = true;
}
if(flag & EDESC_OPERATION) {
pcard->chain_code = code; pcard->chain_code = code;
mainGame->dField.conti_cards.push_back(pcard); mainGame->dField.conti_cards.push_back(pcard);
mainGame->dField.conti_act = true; mainGame->dField.conti_act = true;
conti_exist = true; conti_exist = true;
} else { } else {
pcard->is_selectable = true; pcard->is_selectable = true;
if(flag == EDESC_RESET) if(flag & EDESC_RESET)
pcard->cmdFlag |= COMMAND_RESET; pcard->cmdFlag |= COMMAND_RESET;
else else
pcard->cmdFlag |= COMMAND_ACTIVATE; pcard->cmdFlag |= COMMAND_ACTIVATE;
...@@ -1754,7 +1758,7 @@ bool DuelClient::ClientAnalyze(unsigned char* msg, int len) { ...@@ -1754,7 +1758,7 @@ bool DuelClient::ClientAnalyze(unsigned char* msg, int len) {
panelmode = true; panelmode = true;
} }
} }
if(!select_trigger && !forced && (mainGame->ignore_chain || ((count == 0 || specount == 0) && !mainGame->always_chain)) && (count == 0 || !mainGame->chain_when_avail)) { if(!select_trigger && !mainGame->dField.chain_forced && (mainGame->ignore_chain || ((count == 0 || specount == 0) && !mainGame->always_chain)) && (count == 0 || !mainGame->chain_when_avail)) {
SetResponseI(-1); SetResponseI(-1);
mainGame->dField.ClearChainSelect(); mainGame->dField.ClearChainSelect();
if(mainGame->chkWaitChain->isChecked() && !mainGame->ignore_chain) { if(mainGame->chkWaitChain->isChecked() && !mainGame->ignore_chain) {
...@@ -1763,8 +1767,14 @@ bool DuelClient::ClientAnalyze(unsigned char* msg, int len) { ...@@ -1763,8 +1767,14 @@ bool DuelClient::ClientAnalyze(unsigned char* msg, int len) {
DuelClient::SendResponse(); DuelClient::SendResponse();
return true; return true;
} }
if(mainGame->chkAutoChain->isChecked() && forced && !(mainGame->always_chain || mainGame->chain_when_avail)) { if(mainGame->chkAutoChain->isChecked() && mainGame->dField.chain_forced && !(mainGame->always_chain || mainGame->chain_when_avail)) {
SetResponseI(0); for(size_t i = 0; i < mainGame->dField.activatable_descs.size();++i) {
auto it = mainGame->dField.activatable_descs[i];
if(it.second >> 8) {
SetResponseI((int)i);
break;
}
}
mainGame->dField.ClearChainSelect(); mainGame->dField.ClearChainSelect();
DuelClient::SendResponse(); DuelClient::SendResponse();
return true; return true;
...@@ -1783,7 +1793,7 @@ bool DuelClient::ClientAnalyze(unsigned char* msg, int len) { ...@@ -1783,7 +1793,7 @@ bool DuelClient::ClientAnalyze(unsigned char* msg, int len) {
mainGame->dField.selectable_cards.erase(eit, mainGame->dField.selectable_cards.end()); mainGame->dField.selectable_cards.erase(eit, mainGame->dField.selectable_cards.end());
mainGame->dField.ShowChainCard(); mainGame->dField.ShowChainCard();
} else { } else {
if(!forced) { if(!mainGame->dField.chain_forced) {
if(count == 0) if(count == 0)
myswprintf(textBuffer, L"%ls\n%ls", dataManager.GetSysString(201), dataManager.GetSysString(202)); myswprintf(textBuffer, L"%ls\n%ls", dataManager.GetSysString(201), dataManager.GetSysString(202));
else if(select_trigger) else if(select_trigger)
......
...@@ -375,9 +375,9 @@ bool ClientField::OnEvent(const irr::SEvent& event) { ...@@ -375,9 +375,9 @@ bool ClientField::OnEvent(const irr::SEvent& event) {
select_options_index.clear(); select_options_index.clear();
for (size_t i = 0; i < activatable_cards.size(); ++i) { for (size_t i = 0; i < activatable_cards.size(); ++i) {
if (activatable_cards[i] == menu_card) { if (activatable_cards[i] == menu_card) {
if(activatable_descs[i].second == EDESC_OPERATION) if(activatable_descs[i].second & EDESC_OPERATION)
continue; continue;
else if(activatable_descs[i].second == EDESC_RESET) { else if(activatable_descs[i].second & EDESC_RESET) {
if(id == BUTTON_CMD_ACTIVATE) continue; if(id == BUTTON_CMD_ACTIVATE) continue;
} else { } else {
if(id == BUTTON_CMD_RESET) continue; if(id == BUTTON_CMD_RESET) continue;
...@@ -658,7 +658,7 @@ bool ClientField::OnEvent(const irr::SEvent& event) { ...@@ -658,7 +658,7 @@ bool ClientField::OnEvent(const irr::SEvent& event) {
select_options_index.clear(); select_options_index.clear();
for (size_t i = 0; i < activatable_cards.size(); ++i) { for (size_t i = 0; i < activatable_cards.size(); ++i) {
if (activatable_cards[i] == command_card) { if (activatable_cards[i] == command_card) {
if(activatable_descs[i].second == EDESC_OPERATION) { if(activatable_descs[i].second & EDESC_OPERATION) {
if(list_command == COMMAND_ACTIVATE) continue; if(list_command == COMMAND_ACTIVATE) continue;
} else { } else {
if(list_command == COMMAND_OPERATION) continue; if(list_command == COMMAND_OPERATION) continue;
......
...@@ -393,7 +393,7 @@ bool ReplayMode::ReplayAnalyze(unsigned char* msg, unsigned int len) { ...@@ -393,7 +393,7 @@ bool ReplayMode::ReplayAnalyze(unsigned char* msg, unsigned int len) {
case MSG_SELECT_CHAIN: { case MSG_SELECT_CHAIN: {
player = BufferIO::ReadUInt8(pbuf); player = BufferIO::ReadUInt8(pbuf);
count = BufferIO::ReadUInt8(pbuf); count = BufferIO::ReadUInt8(pbuf);
pbuf += 10 + count * 13; pbuf += 9 + count * 14;
return ReadReplayResponse(); return ReadReplayResponse();
} }
case MSG_SELECT_PLACE: case MSG_SELECT_PLACE:
......
...@@ -750,7 +750,7 @@ int SingleDuel::Analyze(unsigned char* msgbuffer, unsigned int len) { ...@@ -750,7 +750,7 @@ int SingleDuel::Analyze(unsigned char* msgbuffer, unsigned int len) {
case MSG_SELECT_CHAIN: { case MSG_SELECT_CHAIN: {
player = BufferIO::ReadUInt8(pbuf); player = BufferIO::ReadUInt8(pbuf);
count = BufferIO::ReadUInt8(pbuf); count = BufferIO::ReadUInt8(pbuf);
pbuf += 10 + count * 13; pbuf += 9 + count * 14;
WaitforResponse(player); WaitforResponse(player);
NetServer::SendBufferToPlayer(players[player], STOC_GAME_MSG, offset, pbuf - offset); NetServer::SendBufferToPlayer(players[player], STOC_GAME_MSG, offset, pbuf - offset);
return 1; return 1;
......
...@@ -301,7 +301,7 @@ bool SingleMode::SinglePlayAnalyze(unsigned char* msg, unsigned int len) { ...@@ -301,7 +301,7 @@ bool SingleMode::SinglePlayAnalyze(unsigned char* msg, unsigned int len) {
case MSG_SELECT_CHAIN: { case MSG_SELECT_CHAIN: {
player = BufferIO::ReadUInt8(pbuf); player = BufferIO::ReadUInt8(pbuf);
count = BufferIO::ReadUInt8(pbuf); count = BufferIO::ReadUInt8(pbuf);
pbuf += 10 + count * 13; pbuf += 9 + count * 14;
if(!DuelClient::ClientAnalyze(offset, pbuf - offset)) { if(!DuelClient::ClientAnalyze(offset, pbuf - offset)) {
mainGame->singleSignal.Reset(); mainGame->singleSignal.Reset();
mainGame->singleSignal.Wait(); mainGame->singleSignal.Wait();
......
...@@ -706,7 +706,7 @@ int TagDuel::Analyze(unsigned char* msgbuffer, unsigned int len) { ...@@ -706,7 +706,7 @@ int TagDuel::Analyze(unsigned char* msgbuffer, unsigned int len) {
case MSG_SELECT_CHAIN: { case MSG_SELECT_CHAIN: {
player = BufferIO::ReadUInt8(pbuf); player = BufferIO::ReadUInt8(pbuf);
count = BufferIO::ReadUInt8(pbuf); count = BufferIO::ReadUInt8(pbuf);
pbuf += 10 + count * 13; pbuf += 9 + count * 14;
WaitforResponse(player); WaitforResponse(player);
NetServer::SendBufferToPlayer(cur_player[player], STOC_GAME_MSG, offset, pbuf - offset); NetServer::SendBufferToPlayer(cur_player[player], STOC_GAME_MSG, offset, pbuf - offset);
return 1; return 1;
......
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