Commit ca104f15 authored by mercury233's avatar mercury233
parents 1c1992ba 7c07a346
...@@ -1108,7 +1108,10 @@ bool ClientField::CheckSelectSum() { ...@@ -1108,7 +1108,10 @@ bool ClientField::CheckSelectSum() {
selable.insert(selectsum_all[i]); selable.insert(selectsum_all[i]);
} }
for(size_t i = 0; i < selected_cards.size(); ++i) { for(size_t i = 0; i < selected_cards.size(); ++i) {
selected_cards[i]->is_selectable = true; if(i < must_select_count)
selected_cards[i]->is_selectable = false;
else
selected_cards[i]->is_selectable = true;
selected_cards[i]->is_selected = true; selected_cards[i]->is_selected = true;
selable.erase(selected_cards[i]); selable.erase(selected_cards[i]);
} }
...@@ -1194,7 +1197,7 @@ bool ClientField::check_min(std::set<ClientCard*>& left, std::set<ClientCard*>:: ...@@ -1194,7 +1197,7 @@ bool ClientField::check_min(std::set<ClientCard*>& left, std::set<ClientCard*>::
return (min > m && check_min(left, index, min - m, max - m)) return (min > m && check_min(left, index, min - m, max - m))
|| check_min(left, index, min, max); || check_min(left, index, min, max);
} }
bool ClientField::check_sel_sum_s(std::set<ClientCard*>& left, int index, int acc) { bool ClientField::check_sel_sum_s(const std::set<ClientCard*>& left, int index, int acc) {
if (index == (int)selected_cards.size()) { if (index == (int)selected_cards.size()) {
if (acc == 0) if (acc == 0)
return true; return true;
...@@ -1210,9 +1213,9 @@ bool ClientField::check_sel_sum_s(std::set<ClientCard*>& left, int index, int ac ...@@ -1210,9 +1213,9 @@ bool ClientField::check_sel_sum_s(std::set<ClientCard*>& left, int index, int ac
res2 = check_sel_sum_s(left, index + 1, acc - l2); res2 = check_sel_sum_s(left, index + 1, acc - l2);
return res1 || res2; return res1 || res2;
} }
void ClientField::check_sel_sum_t(std::set<ClientCard*>& left, int acc) { void ClientField::check_sel_sum_t(const std::set<ClientCard*>& left, int acc) {
std::set<ClientCard*>::iterator sit; int count = selected_cards.size() + 1 - must_select_count;
for (sit = left.begin(); sit != left.end(); ++sit) { for (auto sit = left.begin(); sit != left.end(); ++sit) {
if (selectsum_cards.find(*sit) != selectsum_cards.end()) if (selectsum_cards.find(*sit) != selectsum_cards.end())
continue; continue;
std::set<ClientCard*> testlist(left); std::set<ClientCard*> testlist(left);
...@@ -1220,16 +1223,16 @@ void ClientField::check_sel_sum_t(std::set<ClientCard*>& left, int acc) { ...@@ -1220,16 +1223,16 @@ void ClientField::check_sel_sum_t(std::set<ClientCard*>& left, int acc) {
int l = (*sit)->opParam; int l = (*sit)->opParam;
int l1 = l & 0xffff; int l1 = l & 0xffff;
int l2 = l >> 16; int l2 = l >> 16;
if (check_sum(testlist, testlist.begin(), acc - l1, selected_cards.size() + 1) if (check_sum(testlist.begin(), testlist.end(), acc - l1, count)
|| (l2 > 0 && check_sum(testlist, testlist.begin(), acc - l2, selected_cards.size() + 1))) { || (l2 > 0 && check_sum(testlist.begin(), testlist.end(), acc - l2, count))) {
selectsum_cards.insert(*sit); selectsum_cards.insert(*sit);
} }
} }
} }
bool ClientField::check_sum(std::set<ClientCard*>& testlist, std::set<ClientCard*>::iterator index, int acc, int count) { bool ClientField::check_sum(std::set<ClientCard*>::const_iterator index, std::set<ClientCard*>::const_iterator end, int acc, int count) {
if (acc == 0) if (acc == 0)
return count >= select_min && count <= select_max; return count >= select_min && count <= select_max;
if (acc < 0 || index == testlist.end()) if (acc < 0 || index == end)
return false; return false;
int l = (*index)->opParam; int l = (*index)->opParam;
int l1 = l & 0xffff; int l1 = l & 0xffff;
...@@ -1237,8 +1240,42 @@ bool ClientField::check_sum(std::set<ClientCard*>& testlist, std::set<ClientCard ...@@ -1237,8 +1240,42 @@ bool ClientField::check_sum(std::set<ClientCard*>& testlist, std::set<ClientCard
if ((l1 == acc || (l2 > 0 && l2 == acc)) && (count + 1 >= select_min) && (count + 1 <= select_max)) if ((l1 == acc || (l2 > 0 && l2 == acc)) && (count + 1 >= select_min) && (count + 1 <= select_max))
return true; return true;
++index; ++index;
return (acc > l1 && check_sum(testlist, index, acc - l1, count + 1)) return (acc > l1 && check_sum(index, end, acc - l1, count + 1))
|| (l2 > 0 && acc > l2 && check_sum(testlist, index, acc - l2, count + 1)) || (l2 > 0 && acc > l2 && check_sum(index, end, acc - l2, count + 1))
|| check_sum(testlist, index, acc, count); || check_sum(index, end, acc, count);
}
template <class T>
static bool is_declarable(T const& cd, int declarable_type) {
if(!(cd.type & declarable_type))
return false;
return cd.code == CARD_MARINE_DOLPHIN || cd.code == CARD_TWINKLE_MOSS
|| (!cd.alias && (cd.type & (TYPE_MONSTER + TYPE_TOKEN)) != (TYPE_MONSTER + TYPE_TOKEN));
}
void ClientField::UpdateDeclarableCode() {
const wchar_t* pname = mainGame->ebANCard->getText();
int trycode = BufferIO::GetVal(pname);
CardString cstr;
CardData cd;
if(dataManager.GetString(trycode, &cstr) && dataManager.GetData(trycode, &cd) && is_declarable(cd, declarable_type)) {
mainGame->lstANCard->clear();
ancard.clear();
mainGame->lstANCard->addItem(cstr.name);
ancard.push_back(trycode);
return;
}
if(pname[0] == 0 || pname[1] == 0)
return;
mainGame->lstANCard->clear();
ancard.clear();
for(auto cit = dataManager._strings.begin(); cit != dataManager._strings.end(); ++cit) {
if(wcsstr(cit->second.name, pname) != 0) {
auto cp = dataManager.GetCodePointer(cit->first); //verified by _strings
//datas.alias can be double card names or alias
if(is_declarable(cp->second, declarable_type)) {
mainGame->lstANCard->addItem(cit->second.name);
ancard.push_back(cit->first);
}
}
}
} }
} }
...@@ -50,11 +50,13 @@ public: ...@@ -50,11 +50,13 @@ public:
int selected_field; int selected_field;
int select_min; int select_min;
int select_max; int select_max;
int must_select_count;
int select_sumval; int select_sumval;
int select_cancelable; int select_cancelable;
int select_mode; int select_mode;
bool select_ready; bool select_ready;
int announce_count; int announce_count;
int declarable_type;
int select_counter_count; int select_counter_count;
int select_counter_type; int select_counter_type;
std::vector<ClientCard*> selectable_cards; std::vector<ClientCard*> selectable_cards;
...@@ -96,10 +98,12 @@ public: ...@@ -96,10 +98,12 @@ public:
void FadeCard(ClientCard* pcard, int alpha, int frame); void FadeCard(ClientCard* pcard, int alpha, int frame);
bool CheckSelectSum(); bool CheckSelectSum();
bool check_min(std::set<ClientCard*>& left, std::set<ClientCard*>::iterator index, int min, int max); bool check_min(std::set<ClientCard*>& left, std::set<ClientCard*>::iterator index, int min, int max);
bool check_sel_sum_s(std::set<ClientCard*>& left, int index, int acc); bool check_sel_sum_s(const std::set<ClientCard*>& left, int index, int acc);
void check_sel_sum_t(std::set<ClientCard*>& left, int acc); void check_sel_sum_t(const std::set<ClientCard*>& left, int acc);
bool check_sum(std::set<ClientCard*>& testlist, std::set<ClientCard*>::iterator index, int acc, int count); bool check_sum(std::set<ClientCard*>::const_iterator index, std::set<ClientCard*>::const_iterator end, int acc, int count);
void UpdateDeclarableCode();
irr::gui::IGUIElement* panel; irr::gui::IGUIElement* panel;
std::vector<int> ancard; std::vector<int> ancard;
int hovered_controler; int hovered_controler;
...@@ -123,4 +127,8 @@ public: ...@@ -123,4 +127,8 @@ public:
} }
//special cards
#define CARD_MARINE_DOLPHIN 78734254
#define CARD_TWINKLE_MOSS 13857930
#endif //CLIENT_FIELD_H #endif //CLIENT_FIELD_H
...@@ -1416,20 +1416,30 @@ int DuelClient::ClientAnalyze(char * msg, unsigned int len) { ...@@ -1416,20 +1416,30 @@ int DuelClient::ClientAnalyze(char * msg, unsigned int len) {
mainGame->dField.select_sumval = BufferIO::ReadInt32(pbuf); mainGame->dField.select_sumval = BufferIO::ReadInt32(pbuf);
mainGame->dField.select_min = BufferIO::ReadInt8(pbuf); mainGame->dField.select_min = BufferIO::ReadInt8(pbuf);
mainGame->dField.select_max = BufferIO::ReadInt8(pbuf); mainGame->dField.select_max = BufferIO::ReadInt8(pbuf);
int count = BufferIO::ReadInt8(pbuf); mainGame->dField.must_select_count = BufferIO::ReadInt8(pbuf);
mainGame->dField.selectsum_all.clear(); mainGame->dField.selectsum_all.clear();
mainGame->dField.selected_cards.clear(); mainGame->dField.selected_cards.clear();
mainGame->dField.selectsum_cards.clear(); mainGame->dField.selectsum_cards.clear();
int c, l, s;
unsigned int code;
bool panelmode = false; bool panelmode = false;
ClientCard* pcard; for (int i = 0; i < mainGame->dField.must_select_count; ++i) {
unsigned int code = (unsigned int)BufferIO::ReadInt32(pbuf);
int c = mainGame->LocalPlayer(BufferIO::ReadInt8(pbuf));
int l = BufferIO::ReadInt8(pbuf);
int s = BufferIO::ReadInt8(pbuf);
ClientCard* pcard = mainGame->dField.GetCard(c, l, s);
if (code != 0 && pcard->code != code)
pcard->SetCode(code);
pcard->opParam = BufferIO::ReadInt32(pbuf);
pcard->select_seq = 0;
mainGame->dField.selected_cards.push_back(pcard);
}
int count = BufferIO::ReadInt8(pbuf);
for (int i = 0; i < count; ++i) { for (int i = 0; i < count; ++i) {
code = (unsigned int)BufferIO::ReadInt32(pbuf); unsigned int code = (unsigned int)BufferIO::ReadInt32(pbuf);
c = mainGame->LocalPlayer(BufferIO::ReadInt8(pbuf)); int c = mainGame->LocalPlayer(BufferIO::ReadInt8(pbuf));
l = BufferIO::ReadInt8(pbuf); int l = BufferIO::ReadInt8(pbuf);
s = BufferIO::ReadInt8(pbuf); int s = BufferIO::ReadInt8(pbuf);
pcard = mainGame->dField.GetCard(c, l, s); ClientCard* pcard = mainGame->dField.GetCard(c, l, s);
if (code != 0 && pcard->code != code) if (code != 0 && pcard->code != code)
pcard->SetCode(code); pcard->SetCode(code);
pcard->opParam = BufferIO::ReadInt32(pbuf); pcard->opParam = BufferIO::ReadInt32(pbuf);
...@@ -1838,7 +1848,7 @@ int DuelClient::ClientAnalyze(char * msg, unsigned int len) { ...@@ -1838,7 +1848,7 @@ int DuelClient::ClientAnalyze(char * msg, unsigned int len) {
return true; return true;
} }
case MSG_NEW_PHASE: { case MSG_NEW_PHASE: {
int phase = (unsigned char)BufferIO::ReadInt8(pbuf); unsigned short phase = BufferIO::ReadInt16(pbuf);
mainGame->btnDP->setVisible(false); mainGame->btnDP->setVisible(false);
mainGame->btnSP->setVisible(false); mainGame->btnSP->setVisible(false);
mainGame->btnM1->setVisible(false); mainGame->btnM1->setVisible(false);
...@@ -2862,6 +2872,7 @@ int DuelClient::ClientAnalyze(char * msg, unsigned int len) { ...@@ -2862,6 +2872,7 @@ int DuelClient::ClientAnalyze(char * msg, unsigned int len) {
} }
case MSG_ANNOUNCE_CARD: { case MSG_ANNOUNCE_CARD: {
/*int player = */mainGame->LocalPlayer(BufferIO::ReadInt8(pbuf)); /*int player = */mainGame->LocalPlayer(BufferIO::ReadInt8(pbuf));
mainGame->dField.declarable_type = BufferIO::ReadInt32(pbuf);
if(select_hint) if(select_hint)
myswprintf(textBuffer, L"%ls", dataManager.GetDesc(select_hint)); myswprintf(textBuffer, L"%ls", dataManager.GetDesc(select_hint));
else myswprintf(textBuffer, dataManager.GetSysString(564)); else myswprintf(textBuffer, dataManager.GetSysString(564));
......
...@@ -799,34 +799,7 @@ bool ClientField::OnEvent(const irr::SEvent& event) { ...@@ -799,34 +799,7 @@ bool ClientField::OnEvent(const irr::SEvent& event) {
case irr::gui::EGET_EDITBOX_CHANGED: { case irr::gui::EGET_EDITBOX_CHANGED: {
switch(id) { switch(id) {
case EDITBOX_ANCARD: { case EDITBOX_ANCARD: {
const wchar_t* pname = mainGame->ebANCard->getText(); UpdateDeclarableCode();
int trycode = BufferIO::GetVal(pname);
CardString cstr;
CardData cd;
if(dataManager.GetString(trycode, &cstr) && dataManager.GetData(trycode, &cd)
&& (cd.code == CARD_MARINE_DOLPHIN || cd.code == CARD_TWINKLE_MOSS
|| !cd.alias && !((cd.type & (TYPE_MONSTER + TYPE_TOKEN)) == (TYPE_MONSTER + TYPE_TOKEN)))) {
mainGame->lstANCard->clear();
ancard.clear();
mainGame->lstANCard->addItem(cstr.name);
ancard.push_back(trycode);
break;
}
if(pname[0] == 0 || pname[1] == 0)
break;
mainGame->lstANCard->clear();
ancard.clear();
for(auto cit = dataManager._strings.begin(); cit != dataManager._strings.end(); ++cit) {
if(wcsstr(cit->second.name, pname) != 0) {
auto cp = dataManager.GetCodePointer(cit->first); //verified by _strings
//datas.alias can be double card names or alias
if(cp->second.code == CARD_MARINE_DOLPHIN || cp->second.code == CARD_TWINKLE_MOSS
|| !cp->second.alias && !((cp->second.type & (TYPE_MONSTER + TYPE_TOKEN)) == (TYPE_MONSTER + TYPE_TOKEN))) {
mainGame->lstANCard->addItem(cit->second.name);
ancard.push_back(cit->first);
}
}
}
break; break;
} }
} }
...@@ -835,34 +808,7 @@ bool ClientField::OnEvent(const irr::SEvent& event) { ...@@ -835,34 +808,7 @@ bool ClientField::OnEvent(const irr::SEvent& event) {
case irr::gui::EGET_EDITBOX_ENTER: { case irr::gui::EGET_EDITBOX_ENTER: {
switch(id) { switch(id) {
case EDITBOX_ANCARD: { case EDITBOX_ANCARD: {
const wchar_t* pname = mainGame->ebANCard->getText(); UpdateDeclarableCode();
int trycode = BufferIO::GetVal(pname);
CardString cstr;
CardData cd;
if(dataManager.GetString(trycode, &cstr) && dataManager.GetData(trycode, &cd)
&& (cd.code == CARD_MARINE_DOLPHIN || cd.code == CARD_TWINKLE_MOSS
|| !cd.alias && !((cd.type & (TYPE_MONSTER + TYPE_TOKEN)) == (TYPE_MONSTER + TYPE_TOKEN)))) {
mainGame->lstANCard->clear();
ancard.clear();
mainGame->lstANCard->addItem(cstr.name);
ancard.push_back(trycode);
break;
}
if(pname[0] == 0)
break;
mainGame->lstANCard->clear();
ancard.clear();
for(auto cit = dataManager._strings.begin(); cit != dataManager._strings.end(); ++cit) {
if(wcsstr(cit->second.name, pname) != 0) {
auto cp = dataManager.GetCodePointer(cit->first); //verified by _strings
//datas.alias can be double card names or alias
if(cp->second.code == CARD_MARINE_DOLPHIN || cp->second.code == CARD_TWINKLE_MOSS
|| !cp->second.alias && !((cp->second.type & (TYPE_MONSTER + TYPE_TOKEN)) == (TYPE_MONSTER + TYPE_TOKEN))) {
mainGame->lstANCard->addItem(cit->second.name);
ancard.push_back(cit->first);
}
}
}
break; break;
} }
case EDITBOX_CHAT: { case EDITBOX_CHAT: {
...@@ -1256,15 +1202,13 @@ bool ClientField::OnEvent(const irr::SEvent& event) { ...@@ -1256,15 +1202,13 @@ bool ClientField::OnEvent(const irr::SEvent& event) {
break; break;
} }
case MSG_SELECT_SUM: { case MSG_SELECT_SUM: {
if (!clicked_card) if (!clicked_card || !clicked_card->is_selectable)
break; break;
if (clicked_card->is_selected) { if (clicked_card->is_selected) {
int i = 0; auto it = std::find(selected_cards.begin(), selected_cards.end(), clicked_card);
while(selected_cards[i] != clicked_card) i++; selected_cards.erase(it);
selected_cards.erase(selected_cards.begin() + i); } else
} else if (clicked_card->is_selectable)
selected_cards.push_back(clicked_card); selected_cards.push_back(clicked_card);
else break;
if (CheckSelectSum()) { if (CheckSelectSum()) {
if(selectsum_cards.size() == 0 || selectable_cards.size() == 0) { if(selectsum_cards.size() == 0 || selectable_cards.size() == 0) {
SetResponseSelectedCards(); SetResponseSelectedCards();
......
#ifndef EVENT_HANDLER_H #ifndef EVENT_HANDLER_H
#define EVENT_HANDLER_H #define EVENT_HANDLER_H
//special cards
#define CARD_MARINE_DOLPHIN 78734254
#define CARD_TWINKLE_MOSS 13857930
#include "config.h" #include "config.h"
#include "game.h" #include "game.h"
#include "client_card.h" #include "client_card.h"
......
...@@ -17,7 +17,7 @@ ...@@ -17,7 +17,7 @@
#include <unistd.h> #include <unistd.h>
#endif #endif
const unsigned short PRO_VERSION = 0x1337; const unsigned short PRO_VERSION = 0x1338;
namespace ygo { namespace ygo {
......
...@@ -16,7 +16,6 @@ bool ReplayMode::is_paused = false; ...@@ -16,7 +16,6 @@ bool ReplayMode::is_paused = false;
bool ReplayMode::is_swaping = false; bool ReplayMode::is_swaping = false;
bool ReplayMode::exit_pending = false; bool ReplayMode::exit_pending = false;
int ReplayMode::skip_turn = 0; int ReplayMode::skip_turn = 0;
wchar_t ReplayMode::event_string[256];
bool ReplayMode::StartReplay(int skipturn) { bool ReplayMode::StartReplay(int skipturn) {
skip_turn = skipturn; skip_turn = skipturn;
...@@ -308,6 +307,8 @@ bool ReplayMode::ReplayAnalyze(char* msg, unsigned int len) { ...@@ -308,6 +307,8 @@ bool ReplayMode::ReplayAnalyze(char* msg, unsigned int len) {
pbuf += 6; pbuf += 6;
count = BufferIO::ReadInt8(pbuf); count = BufferIO::ReadInt8(pbuf);
pbuf += count * 11; pbuf += count * 11;
count = BufferIO::ReadInt8(pbuf);
pbuf += count * 11;
return ReadReplayResponse(); return ReadReplayResponse();
} }
case MSG_SORT_CARD: case MSG_SORT_CARD:
...@@ -384,7 +385,7 @@ bool ReplayMode::ReplayAnalyze(char* msg, unsigned int len) { ...@@ -384,7 +385,7 @@ bool ReplayMode::ReplayAnalyze(char* msg, unsigned int len) {
break; break;
} }
case MSG_NEW_PHASE: { case MSG_NEW_PHASE: {
pbuf++; pbuf += 2;
DuelClient::ClientAnalyze(offset, pbuf - offset); DuelClient::ClientAnalyze(offset, pbuf - offset);
ReplayRefresh(); ReplayRefresh();
break; break;
...@@ -634,6 +635,7 @@ bool ReplayMode::ReplayAnalyze(char* msg, unsigned int len) { ...@@ -634,6 +635,7 @@ bool ReplayMode::ReplayAnalyze(char* msg, unsigned int len) {
} }
case MSG_ANNOUNCE_CARD: { case MSG_ANNOUNCE_CARD: {
player = BufferIO::ReadInt8(pbuf); player = BufferIO::ReadInt8(pbuf);
pbuf += 4;
return ReadReplayResponse(); return ReadReplayResponse();
} }
case MSG_ANNOUNCE_NUMBER: { case MSG_ANNOUNCE_NUMBER: {
......
...@@ -19,7 +19,7 @@ private: ...@@ -19,7 +19,7 @@ private:
static bool is_swaping; static bool is_swaping;
static bool exit_pending; static bool exit_pending;
static int skip_turn; static int skip_turn;
static wchar_t event_string[256];
public: public:
static Replay cur_replay; static Replay cur_replay;
......
...@@ -778,6 +778,8 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) { ...@@ -778,6 +778,8 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) {
pbuf += 6; pbuf += 6;
count = BufferIO::ReadInt8(pbuf); count = BufferIO::ReadInt8(pbuf);
pbuf += count * 11; pbuf += count * 11;
count = BufferIO::ReadInt8(pbuf);
pbuf += count * 11;
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;
...@@ -896,7 +898,7 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) { ...@@ -896,7 +898,7 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) {
break; break;
} }
case MSG_NEW_PHASE: { case MSG_NEW_PHASE: {
pbuf++; pbuf += 2;
NetServer::SendBufferToPlayer(players[0], STOC_GAME_MSG, offset, pbuf - offset); NetServer::SendBufferToPlayer(players[0], STOC_GAME_MSG, offset, pbuf - offset);
NetServer::ReSendToPlayer(players[1]); NetServer::ReSendToPlayer(players[1]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit) for(auto oit = observers.begin(); oit != observers.end(); ++oit)
...@@ -1307,6 +1309,7 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) { ...@@ -1307,6 +1309,7 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) {
case MSG_ANNOUNCE_CARD: { case MSG_ANNOUNCE_CARD: {
player = BufferIO::ReadInt8(pbuf); player = BufferIO::ReadInt8(pbuf);
WaitforResponse(player); WaitforResponse(player);
pbuf += 4;
NetServer::SendBufferToPlayer(players[player], STOC_GAME_MSG, offset, pbuf - offset); NetServer::SendBufferToPlayer(players[player], STOC_GAME_MSG, offset, pbuf - offset);
return 1; return 1;
} }
......
...@@ -10,7 +10,6 @@ namespace ygo { ...@@ -10,7 +10,6 @@ namespace ygo {
long SingleMode::pduel = 0; long SingleMode::pduel = 0;
bool SingleMode::is_closing = false; bool SingleMode::is_closing = false;
bool SingleMode::is_continuing = false; bool SingleMode::is_continuing = false;
wchar_t SingleMode::event_string[256];
bool SingleMode::StartPlay() { bool SingleMode::StartPlay() {
Thread::NewThread(SinglePlayThread, 0); Thread::NewThread(SinglePlayThread, 0);
...@@ -257,6 +256,8 @@ bool SingleMode::SinglePlayAnalyze(char* msg, unsigned int len) { ...@@ -257,6 +256,8 @@ bool SingleMode::SinglePlayAnalyze(char* msg, unsigned int len) {
pbuf += 6; pbuf += 6;
count = BufferIO::ReadInt8(pbuf); count = BufferIO::ReadInt8(pbuf);
pbuf += count * 11; pbuf += count * 11;
count = BufferIO::ReadInt8(pbuf);
pbuf += count * 11;
if(!DuelClient::ClientAnalyze(offset, pbuf - offset)) { if(!DuelClient::ClientAnalyze(offset, pbuf - offset)) {
mainGame->singleSignal.Reset(); mainGame->singleSignal.Reset();
mainGame->singleSignal.Wait(); mainGame->singleSignal.Wait();
...@@ -333,7 +334,7 @@ bool SingleMode::SinglePlayAnalyze(char* msg, unsigned int len) { ...@@ -333,7 +334,7 @@ bool SingleMode::SinglePlayAnalyze(char* msg, unsigned int len) {
break; break;
} }
case MSG_NEW_PHASE: { case MSG_NEW_PHASE: {
pbuf++; pbuf += 2;
DuelClient::ClientAnalyze(offset, pbuf - offset); DuelClient::ClientAnalyze(offset, pbuf - offset);
SinglePlayRefresh(); SinglePlayRefresh();
break; break;
...@@ -576,6 +577,7 @@ bool SingleMode::SinglePlayAnalyze(char* msg, unsigned int len) { ...@@ -576,6 +577,7 @@ bool SingleMode::SinglePlayAnalyze(char* msg, unsigned int len) {
} }
case MSG_ANNOUNCE_CARD: { case MSG_ANNOUNCE_CARD: {
player = BufferIO::ReadInt8(pbuf); player = BufferIO::ReadInt8(pbuf);
pbuf += 4;
if(!DuelClient::ClientAnalyze(offset, pbuf - offset)) { if(!DuelClient::ClientAnalyze(offset, pbuf - offset)) {
mainGame->singleSignal.Reset(); mainGame->singleSignal.Reset();
mainGame->singleSignal.Wait(); mainGame->singleSignal.Wait();
......
...@@ -13,8 +13,7 @@ private: ...@@ -13,8 +13,7 @@ private:
static long pduel; static long pduel;
static bool is_closing; static bool is_closing;
static bool is_continuing; static bool is_continuing;
static wchar_t event_string[256];
public: public:
static bool StartPlay(); static bool StartPlay();
static void StopPlay(bool is_exiting = false); static void StopPlay(bool is_exiting = false);
......
...@@ -715,6 +715,8 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) { ...@@ -715,6 +715,8 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
pbuf += 6; pbuf += 6;
count = BufferIO::ReadInt8(pbuf); count = BufferIO::ReadInt8(pbuf);
pbuf += count * 11; pbuf += count * 11;
count = BufferIO::ReadInt8(pbuf);
pbuf += count * 11;
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;
...@@ -861,7 +863,7 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) { ...@@ -861,7 +863,7 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
break; break;
} }
case MSG_NEW_PHASE: { case MSG_NEW_PHASE: {
pbuf++; pbuf += 2;
NetServer::SendBufferToPlayer(players[0], STOC_GAME_MSG, offset, pbuf - offset); NetServer::SendBufferToPlayer(players[0], STOC_GAME_MSG, offset, pbuf - offset);
NetServer::ReSendToPlayer(players[1]); NetServer::ReSendToPlayer(players[1]);
NetServer::ReSendToPlayer(players[2]); NetServer::ReSendToPlayer(players[2]);
...@@ -1349,6 +1351,7 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) { ...@@ -1349,6 +1351,7 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
} }
case MSG_ANNOUNCE_CARD: { case MSG_ANNOUNCE_CARD: {
player = BufferIO::ReadInt8(pbuf); player = BufferIO::ReadInt8(pbuf);
pbuf += 4;
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;
......
#[2015.10][2016.1][2015.4][2015.1][2014.10][2014.7][2014.4][2014.2][2013.9][2015.11 TCG][2015.7 TCG][2015.4 TCG][2015.1 TCG][2014.10 TCG][2014.7 TCG][2014.4 TCG][2014.1.1 TCG][2013.10.11 TCG][2013.3.1][2012.9.1][2012.3.1][2011.9.1] #[2016.1][2015.10][2015.4][2015.1][2014.10][2014.7][2014.4][2014.2][2013.9][2015.11 TCG][2015.7 TCG][2015.4 TCG][2015.1 TCG][2014.10 TCG][2014.7 TCG][2014.4 TCG][2014.1.1 TCG][2013.10.11 TCG][2013.3.1][2012.9.1][2012.3.1][2011.9.1]
!2015.10 !2016.1
#forbidden #forbidden
20663556 0 --イレカエル 20663556 0 --イレカエル
44910027 0 --ヴィクトリー・ドラゴン 44910027 0 --ヴィクトリー・ドラゴン
20366274 0 --エルシャドール・ネフィリム 20366274 0 --エルシャドール・ネフィリム
53804307 0 --焔征竜-ブラスター 53804307 0 --焔征竜-ブラスター
68819554 0 --Emダメージ・ジャグラー
07563579 0 --Emヒグルミ
90411554 0 --巌征竜-レドックス 90411554 0 --巌征竜-レドックス
26202165 0 --クリッター 26202165 0 --クリッター
78010363 0 --黒き森のウィッチ 78010363 0 --黒き森のウィッチ
...@@ -16,6 +18,7 @@ ...@@ -16,6 +18,7 @@
16923472 0 --ゼンマイハンター 16923472 0 --ゼンマイハンター
56570271 0 --DHERO ディスクガイ 56570271 0 --DHERO ディスクガイ
33184167 0 --同族感染ウィルス 33184167 0 --同族感染ウィルス
54719828 0 --No.16 色の支配者ショック・ルーラー
26400609 0 --瀑征竜-タイダル 26400609 0 --瀑征竜-タイダル
50321796 0 --氷結界の龍 ブリューナク 50321796 0 --氷結界の龍 ブリューナク
78706415 0 --ファイバーポッド 78706415 0 --ファイバーポッド
...@@ -140,7 +143,7 @@ ...@@ -140,7 +143,7 @@
45222299 2 --イビリチュア·ガストクラーケ 45222299 2 --イビリチュア·ガストクラーケ
27970830 2 --六武の門 27970830 2 --六武の門
!2016.1 !2015.10
#forbidden #forbidden
20663556 0 --イレカエル 20663556 0 --イレカエル
44910027 0 --ヴィクトリー・ドラゴン 44910027 0 --ヴィクトリー・ドラゴン
...@@ -199,9 +202,6 @@ ...@@ -199,9 +202,6 @@
28566710 0 --ラストバトル! 28566710 0 --ラストバトル!
17412721 0 --旧神ノーデン 17412721 0 --旧神ノーデン
18326736 0 --星守の騎士 プトレマイオス 18326736 0 --星守の騎士 プトレマイオス
68819554 0 --Emダメージ・ジャグラー
07563579 0 --Emヒグルミ
54719828 0 --No.16 色の支配者ショック・ルーラー
#limit #limit
85103922 1 --アーティファクト-モラルタ 85103922 1 --アーティファクト-モラルタ
64034255 1 --A·ジェネクス·バードマン 64034255 1 --A·ジェネクス·バードマン
......
...@@ -455,7 +455,7 @@ ...@@ -455,7 +455,7 @@
!setname 0x3 N/A !setname 0x3 N/A
!setname 0x4 亚马逊 アマゾネス !setname 0x4 亚马逊 アマゾネス
!setname 0x5 秘仪之力 アルカナフォース !setname 0x5 秘仪之力 アルカナフォース
!setname 0x6 暗黑界 !setname 0x6 暗黑界 暗黒界
!setname 0x7 古代的机械 アンティーク・ギア !setname 0x7 古代的机械 アンティーク・ギア
!setname 0x8 英雄 HERO !setname 0x8 英雄 HERO
!setname 0x3008 元素英雄 EHERO !setname 0x3008 元素英雄 EHERO
...@@ -544,7 +544,7 @@ ...@@ -544,7 +544,7 @@
!setname 0x1047 宝石骑士 ジェムナイト !setname 0x1047 宝石骑士 ジェムナイト
!setname 0x48 No. No. !setname 0x48 No. No.
!setname 0x1048 混沌No. CNo. !setname 0x1048 混沌No. CNo.
!setname 0x49 铳士 !setname 0x49 铳士 銃士
#setname 0x4a 时械神 時械神 #setname 0x4a 时械神 時械神
!setname 0x4b 极神 極神 !setname 0x4b 极神 極神
!setname 0x4c 落穴 落とし穴 !setname 0x4c 落穴 落とし穴
...@@ -613,7 +613,8 @@ ...@@ -613,7 +613,8 @@
!setname 0x7d 阳炎 ヘイズ !setname 0x7d 阳炎 ヘイズ
!setname 0x107d 阳炎兽 陽炎獣 !setname 0x107d 阳炎兽 陽炎獣
!setname 0x7e 异热同心武器 ZW !setname 0x7e 异热同心武器 ZW
!setname 0x7f 希望皇 霍普 希望皇ホープ !setname 0x7f 霍普 ホープ
!setname 0x107f 希望皇 霍普 希望皇ホープ
!setname 0x80 尘妖 ダストン !setname 0x80 尘妖 ダストン
!setname 0x81 炎王 !setname 0x81 炎王
!setname 0x1081 炎王兽 炎王獣 !setname 0x1081 炎王兽 炎王獣
......
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