Commit 62846ed8 authored by fallenstardust's avatar fallenstardust

add select hint

预组更新
parent e4996ead
...@@ -27,6 +27,9 @@ char DuelClient::duel_client_write[0x2000]; ...@@ -27,6 +27,9 @@ char DuelClient::duel_client_write[0x2000];
bool DuelClient::is_closing = false; bool DuelClient::is_closing = false;
int DuelClient::select_hint = 0; int DuelClient::select_hint = 0;
int DuelClient::select_unselect_hint = 0; int DuelClient::select_unselect_hint = 0;
int DuelClient::last_select_hint = 0;
char DuelClient::last_successful_msg[2048];
unsigned int DuelClient::last_successful_msg_length = 0;
wchar_t DuelClient::event_string[256]; wchar_t DuelClient::event_string[256];
mtrandom DuelClient::rnd; mtrandom DuelClient::rnd;
...@@ -707,9 +710,6 @@ void DuelClient::HandleSTOCPacketLan(char* data, unsigned int len) { ...@@ -707,9 +710,6 @@ void DuelClient::HandleSTOCPacketLan(char* data, unsigned int len) {
mainGame->WaitFrameSignal(30); mainGame->WaitFrameSignal(30);
} }
if(mainGame->actionParam || !is_host) { if(mainGame->actionParam || !is_host) {
char* prep = pdata;
Replay new_replay;
memcpy(&new_replay.pheader, prep, sizeof(ReplayHeader));
prep += sizeof(ReplayHeader); prep += sizeof(ReplayHeader);
memcpy(new_replay.comp_data, prep, len - sizeof(ReplayHeader) - 1); memcpy(new_replay.comp_data, prep, len - sizeof(ReplayHeader) - 1);
new_replay.comp_size = len - sizeof(ReplayHeader) - 1; new_replay.comp_size = len - sizeof(ReplayHeader) - 1;
...@@ -866,6 +866,10 @@ int DuelClient::ClientAnalyze(char * msg, unsigned int len) { ...@@ -866,6 +866,10 @@ int DuelClient::ClientAnalyze(char * msg, unsigned int len) {
char* pbuf = msg; char* pbuf = msg;
wchar_t textBuffer[256]; wchar_t textBuffer[256];
mainGame->dInfo.curMsg = BufferIO::ReadUInt8(pbuf); mainGame->dInfo.curMsg = BufferIO::ReadUInt8(pbuf);
if(mainGame->dInfo.curMsg != MSG_RETRY) {
memcpy(last_successful_msg, msg, len);
last_successful_msg_length = len;
}
mainGame->wCmdMenu->setVisible(false); mainGame->wCmdMenu->setVisible(false);
if(!mainGame->dInfo.isReplay && mainGame->dInfo.curMsg != MSG_WAITING && mainGame->dInfo.curMsg != MSG_CARD_SELECTED) { if(!mainGame->dInfo.isReplay && mainGame->dInfo.curMsg != MSG_WAITING && mainGame->dInfo.curMsg != MSG_CARD_SELECTED) {
mainGame->waitFrame = -1; mainGame->waitFrame = -1;
...@@ -887,33 +891,90 @@ int DuelClient::ClientAnalyze(char * msg, unsigned int len) { ...@@ -887,33 +891,90 @@ int DuelClient::ClientAnalyze(char * msg, unsigned int len) {
mainGame->dInfo.time_player = 2; mainGame->dInfo.time_player = 2;
switch(mainGame->dInfo.curMsg) { switch(mainGame->dInfo.curMsg) {
case MSG_RETRY: { case MSG_RETRY: {
if(last_successful_msg_length) {
char* p = last_successful_msg;
auto last_msg = BufferIO::ReadUInt8(p);
int err_desc = 1421;
switch(last_msg) {
case MSG_ANNOUNCE_CARD:
case MSG_ANNOUNCE_CARD_FILTER:
err_desc = 1422;
break;
case MSG_ANNOUNCE_ATTRIB:
err_desc = 1423;
break;
case MSG_ANNOUNCE_RACE:
err_desc = 1424;
break;
case MSG_ANNOUNCE_NUMBER:
err_desc = 1425;
break;
case MSG_SELECT_EFFECTYN:
case MSG_SELECT_YESNO:
case MSG_SELECT_OPTION:
err_desc = 1426;
break;
case MSG_SELECT_CARD:
case MSG_SELECT_UNSELECT_CARD:
case MSG_SELECT_TRIBUTE:
case MSG_SELECT_SUM:
case MSG_SORT_CARD:
err_desc = 1427;
break;
case MSG_SELECT_CHAIN:
err_desc = 1428;
break;
case MSG_SELECT_PLACE:
case MSG_SELECT_DISFIELD:
err_desc = 1429;
break;
case MSG_SELECT_POSITION:
err_desc = 1430;
break;
case MSG_SELECT_COUNTER:
err_desc = 1431;
break;
default:
break;
}
mainGame->gMutex.Lock();
mainGame->stMessage->setText(dataManager.GetDesc(err_desc));
mainGame->PopupElement(mainGame->wMessage);
mainGame->gMutex.Unlock();
mainGame->actionSignal.Reset();
mainGame->actionSignal.Wait();
select_hint = last_select_hint;
return ClientAnalyze(last_successful_msg, last_successful_msg_length);
}
mainGame->gMutex.Lock(); mainGame->gMutex.Lock();
mainGame->stMessage->setText(L"Error occurs."); mainGame->stMessage->setText(L"Error occurs.");
mainGame->PopupElement(mainGame->wMessage); mainGame->PopupElement(mainGame->wMessage);
mainGame->gMutex.Unlock(); mainGame->gMutex.Unlock();
mainGame->actionSignal.Reset(); mainGame->actionSignal.Reset();
mainGame->actionSignal.Wait(); mainGame->actionSignal.Wait();
mainGame->closeDoneSignal.Reset(); if(!mainGame->dInfo.isSingleMode) {
mainGame->closeSignal.Set(); mainGame->closeDoneSignal.Reset();
mainGame->closeDoneSignal.Wait(); mainGame->closeSignal.Set();
mainGame->gMutex.Lock(); mainGame->closeDoneSignal.Wait();
mainGame->dInfo.isStarted = false; mainGame->gMutex.Lock();
mainGame->dInfo.isFinished = false; mainGame->dInfo.isStarted = false;
mainGame->btnCreateHost->setEnabled(true); mainGame->dInfo.isFinished = false;
mainGame->btnJoinHost->setEnabled(true); mainGame->btnCreateHost->setEnabled(true);
mainGame->btnJoinCancel->setEnabled(true); mainGame->btnJoinHost->setEnabled(true);
mainGame->btnStartBot->setEnabled(true); mainGame->btnJoinCancel->setEnabled(true);
mainGame->btnBotCancel->setEnabled(true); mainGame->btnStartBot->setEnabled(true);
mainGame->stTip->setVisible(false); mainGame->btnBotCancel->setEnabled(true);
mainGame->device->setEventReceiver(&mainGame->menuHandler); mainGame->stTip->setVisible(false);
if(bot_mode) mainGame->device->setEventReceiver(&mainGame->menuHandler);
mainGame->ShowElement(mainGame->wSinglePlay); if(bot_mode)
else mainGame->ShowElement(mainGame->wSinglePlay);
mainGame->ShowElement(mainGame->wLanWindow); else
mainGame->gMutex.Unlock(); mainGame->ShowElement(mainGame->wLanWindow);
event_base_loopbreak(client_base); mainGame->gMutex.Unlock();
if(exit_on_return) event_base_loopbreak(client_base);
mainGame->device->closeDevice(); if(exit_on_return)
mainGame->device->closeDevice();
}
return false; return false;
} }
case MSG_HINT: { case MSG_HINT: {
...@@ -938,6 +999,7 @@ int DuelClient::ClientAnalyze(char * msg, unsigned int len) { ...@@ -938,6 +999,7 @@ int DuelClient::ClientAnalyze(char * msg, unsigned int len) {
} }
case HINT_SELECTMSG: { case HINT_SELECTMSG: {
select_hint = data; select_hint = data;
last_select_hint = data;
break; break;
} }
case HINT_OPSELECTED: { case HINT_OPSELECTED: {
...@@ -1082,6 +1144,10 @@ int DuelClient::ClientAnalyze(char * msg, unsigned int len) { ...@@ -1082,6 +1144,10 @@ int DuelClient::ClientAnalyze(char * msg, unsigned int len) {
mainGame->dField.Initial(mainGame->LocalPlayer(1), deckc, extrac); mainGame->dField.Initial(mainGame->LocalPlayer(1), deckc, extrac);
mainGame->dInfo.turn = 0; mainGame->dInfo.turn = 0;
mainGame->dInfo.is_shuffling = false; mainGame->dInfo.is_shuffling = false;
select_hint = 0;
select_unselect_hint = 0;
last_select_hint = 0;
last_successful_msg_length = 0;
if(mainGame->dInfo.isReplaySwapped) { if(mainGame->dInfo.isReplaySwapped) {
std::swap(mainGame->dInfo.hostname, mainGame->dInfo.clientname); std::swap(mainGame->dInfo.hostname, mainGame->dInfo.clientname);
std::swap(mainGame->dInfo.hostname_tag, mainGame->dInfo.clientname_tag); std::swap(mainGame->dInfo.hostname_tag, mainGame->dInfo.clientname_tag);
......
...@@ -34,7 +34,7 @@ ...@@ -34,7 +34,7 @@
97077563 97077563
97077563 97077563
89208725 89208725
89208725 15800838
29649320 29649320
29649320 29649320
44095762 44095762
......
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