Commit 0a060025 authored by wind2009's avatar wind2009

Merge remote-tracking branch 'upstream/master' into server

parents 8bd12238 ad9a7069
...@@ -31,8 +31,8 @@ ClientCard::~ClientCard() { ...@@ -31,8 +31,8 @@ ClientCard::~ClientCard() {
} }
overlayed.clear(); overlayed.clear();
} }
void ClientCard::SetCode(int x) { void ClientCard::SetCode(unsigned int x) {
if((location == LOCATION_HAND) && (code != (unsigned int)x)) { if((location == LOCATION_HAND) && (code != x)) {
code = x; code = x;
mainGame->dField.MoveCard(this, 5); mainGame->dField.MoveCard(this, 5);
} else } else
...@@ -175,13 +175,13 @@ void ClientCard::UpdateInfo(unsigned char* buf) { ...@@ -175,13 +175,13 @@ void ClientCard::UpdateInfo(unsigned char* buf) {
} }
} }
void ClientCard::ClearTarget() { void ClientCard::ClearTarget() {
for(auto cit = cardTarget.begin(); cit != cardTarget.end(); ++cit) { for (auto& pcard : cardTarget) {
(*cit)->is_showtarget = false; pcard->is_showtarget = false;
(*cit)->ownerTarget.erase(this); pcard->ownerTarget.erase(this);
} }
for(auto cit = ownerTarget.begin(); cit != ownerTarget.end(); ++cit) { for (auto& pcard : ownerTarget) {
(*cit)->is_showtarget = false; pcard->is_showtarget = false;
(*cit)->cardTarget.erase(this); pcard->cardTarget.erase(this);
} }
cardTarget.clear(); cardTarget.clear();
ownerTarget.clear(); ownerTarget.clear();
......
...@@ -75,7 +75,7 @@ public: ...@@ -75,7 +75,7 @@ public:
ClientCard() = default; ClientCard() = default;
~ClientCard(); ~ClientCard();
void SetCode(int x); void SetCode(unsigned int x);
void UpdateInfo(unsigned char* buf); void UpdateInfo(unsigned char* buf);
void ClearTarget(); void ClearTarget();
void ClearData(); void ClearData();
......
...@@ -196,12 +196,9 @@ void ClientField::AddCard(ClientCard* pcard, int controler, int location, int se ...@@ -196,12 +196,9 @@ void ClientField::AddCard(ClientCard* pcard, int controler, int location, int se
deck[controler].push_back(pcard); deck[controler].push_back(pcard);
pcard->sequence = (unsigned char)(deck[controler].size() - 1); pcard->sequence = (unsigned char)(deck[controler].size() - 1);
} else { } else {
deck[controler].push_back(0); for (auto& pcard : deck[controler])
for(int i = deck[controler].size() - 1; i > 0; --i) { pcard->sequence++;
deck[controler][i] = deck[controler][i - 1]; deck[controler].insert(deck[controler].begin(), pcard);
deck[controler][i]->sequence++;
}
deck[controler][0] = pcard;
pcard->sequence = 0; pcard->sequence = 0;
} }
pcard->is_reversed = false; pcard->is_reversed = false;
...@@ -235,15 +232,13 @@ void ClientField::AddCard(ClientCard* pcard, int controler, int location, int se ...@@ -235,15 +232,13 @@ void ClientField::AddCard(ClientCard* pcard, int controler, int location, int se
extra[controler].push_back(pcard); extra[controler].push_back(pcard);
pcard->sequence = (unsigned char)(extra[controler].size() - 1); pcard->sequence = (unsigned char)(extra[controler].size() - 1);
} else { } else {
extra[controler].push_back(0);
int p = extra[controler].size() - extra_p_count[controler] - 1; int p = extra[controler].size() - extra_p_count[controler] - 1;
for(int i = extra[controler].size() - 1; i > p; --i) { for(int i = extra[controler].size() - 1; i > p; --i) {
extra[controler][i] = extra[controler][i - 1];
extra[controler][i]->sequence++; extra[controler][i]->sequence++;
extra[controler][i]->curPos += irr::core::vector3df(0, 0, 0.01f); extra[controler][i]->curPos += irr::core::vector3df(0, 0, 0.01f);
extra[controler][i]->mTransform.setTranslation(extra[controler][i]->curPos); extra[controler][i]->mTransform.setTranslation(extra[controler][i]->curPos);
} }
extra[controler][p] = pcard; extra[controler].insert(extra[controler].begin() + p, pcard);
pcard->sequence = p; pcard->sequence = p;
} }
if (pcard->position & POS_FACEUP) if (pcard->position & POS_FACEUP)
...@@ -253,69 +248,54 @@ void ClientField::AddCard(ClientCard* pcard, int controler, int location, int se ...@@ -253,69 +248,54 @@ void ClientField::AddCard(ClientCard* pcard, int controler, int location, int se
} }
} }
ClientCard* ClientField::RemoveCard(int controler, int location, int sequence) { ClientCard* ClientField::RemoveCard(int controler, int location, int sequence) {
ClientCard* pcard = 0; ClientCard* pcard = nullptr;
auto erase_card = [](std::vector<ClientCard*>& lst, int seq) {
for (int i = seq; i < (int)lst.size() - 1; ++i) {
lst[i] = lst[i + 1];
lst[i]->sequence--;
lst[i]->curPos -= irr::core::vector3df(0, 0, 0.01f);
lst[i]->mTransform.setTranslation(lst[i]->curPos);
}
lst.pop_back();
};
switch (location) { switch (location) {
case LOCATION_DECK: { case LOCATION_DECK: {
pcard = deck[controler][sequence]; pcard = deck[controler][sequence];
for (size_t i = sequence; i < deck[controler].size() - 1; ++i) { erase_card(deck[controler], sequence);
deck[controler][i] = deck[controler][i + 1];
deck[controler][i]->sequence--;
deck[controler][i]->curPos -= irr::core::vector3df(0, 0, 0.01f);
deck[controler][i]->mTransform.setTranslation(deck[controler][i]->curPos);
}
deck[controler].erase(deck[controler].end() - 1);
break; break;
} }
case LOCATION_HAND: { case LOCATION_HAND: {
pcard = hand[controler][sequence]; pcard = hand[controler][sequence];
for (size_t i = sequence; i < hand[controler].size() - 1; ++i) { for (int i = sequence; i < (int)hand[controler].size() - 1; ++i) {
hand[controler][i] = hand[controler][i + 1]; hand[controler][i] = hand[controler][i + 1];
hand[controler][i]->sequence--; hand[controler][i]->sequence--;
} }
hand[controler].erase(hand[controler].end() - 1); hand[controler].pop_back();
break; break;
} }
case LOCATION_MZONE: { case LOCATION_MZONE: {
pcard = mzone[controler][sequence]; pcard = mzone[controler][sequence];
mzone[controler][sequence] = 0; mzone[controler][sequence] = nullptr;
break; break;
} }
case LOCATION_SZONE: { case LOCATION_SZONE: {
pcard = szone[controler][sequence]; pcard = szone[controler][sequence];
szone[controler][sequence] = 0; szone[controler][sequence] = nullptr;
break; break;
} }
case LOCATION_GRAVE: { case LOCATION_GRAVE: {
pcard = grave[controler][sequence]; pcard = grave[controler][sequence];
for (size_t i = sequence; i < grave[controler].size() - 1; ++i) { erase_card(grave[controler], sequence);
grave[controler][i] = grave[controler][i + 1];
grave[controler][i]->sequence--;
grave[controler][i]->curPos -= irr::core::vector3df(0, 0, 0.01f);
grave[controler][i]->mTransform.setTranslation(grave[controler][i]->curPos);
}
grave[controler].erase(grave[controler].end() - 1);
break; break;
} }
case LOCATION_REMOVED: { case LOCATION_REMOVED: {
pcard = remove[controler][sequence]; pcard = remove[controler][sequence];
for (size_t i = sequence; i < remove[controler].size() - 1; ++i) { erase_card(remove[controler], sequence);
remove[controler][i] = remove[controler][i + 1];
remove[controler][i]->sequence--;
remove[controler][i]->curPos -= irr::core::vector3df(0, 0, 0.01f);
remove[controler][i]->mTransform.setTranslation(remove[controler][i]->curPos);
}
remove[controler].erase(remove[controler].end() - 1);
break; break;
} }
case LOCATION_EXTRA: { case LOCATION_EXTRA: {
pcard = extra[controler][sequence]; pcard = extra[controler][sequence];
for (size_t i = sequence; i < extra[controler].size() - 1; ++i) { erase_card(extra[controler], sequence);
extra[controler][i] = extra[controler][i + 1];
extra[controler][i]->sequence--;
extra[controler][i]->curPos -= irr::core::vector3df(0, 0, 0.01f);
extra[controler][i]->mTransform.setTranslation(extra[controler][i]->curPos);
}
extra[controler].erase(extra[controler].end() - 1);
if (pcard->position & POS_FACEUP) if (pcard->position & POS_FACEUP)
extra_p_count[controler]--; extra_p_count[controler]--;
break; break;
...@@ -425,8 +405,8 @@ void ClientField::ClearChainSelect() { ...@@ -425,8 +405,8 @@ void ClientField::ClearChainSelect() {
void ClientField::ShowSelectCard(bool buttonok, bool chain) { void ClientField::ShowSelectCard(bool buttonok, bool chain) {
if(cant_check_grave) { if(cant_check_grave) {
bool has_card_in_grave = false; bool has_card_in_grave = false;
for(size_t i = 0; i < selectable_cards.size(); ++i) { for (auto& pcard : selectable_cards) {
if(selectable_cards[i]->location == LOCATION_GRAVE) { if (pcard->location == LOCATION_GRAVE) {
has_card_in_grave = true; has_card_in_grave = true;
break; break;
} }
...@@ -436,7 +416,7 @@ void ClientField::ShowSelectCard(bool buttonok, bool chain) { ...@@ -436,7 +416,7 @@ void ClientField::ShowSelectCard(bool buttonok, bool chain) {
} }
} }
int startpos; int startpos;
size_t ct; int ct;
if(selectable_cards.size() <= 5) { if(selectable_cards.size() <= 5) {
startpos = 30 + 125 * (5 - selectable_cards.size()) / 2; startpos = 30 + 125 * (5 - selectable_cards.size()) / 2;
ct = selectable_cards.size(); ct = selectable_cards.size();
...@@ -444,7 +424,7 @@ void ClientField::ShowSelectCard(bool buttonok, bool chain) { ...@@ -444,7 +424,7 @@ void ClientField::ShowSelectCard(bool buttonok, bool chain) {
startpos = 30; startpos = 30;
ct = 5; ct = 5;
} }
for(size_t i = 0; i < ct; ++i) { for(int i = 0; i < ct; ++i) {
mainGame->stCardPos[i]->enableOverrideColor(false); mainGame->stCardPos[i]->enableOverrideColor(false);
// image // image
if(selectable_cards[i]->code) if(selectable_cards[i]->code)
...@@ -528,7 +508,7 @@ void ClientField::ShowSelectCard(bool buttonok, bool chain) { ...@@ -528,7 +508,7 @@ void ClientField::ShowSelectCard(bool buttonok, bool chain) {
} }
void ClientField::ShowChainCard() { void ClientField::ShowChainCard() {
int startpos; int startpos;
size_t ct; int ct;
if(selectable_cards.size() <= 5) { if(selectable_cards.size() <= 5) {
startpos = 30 + 125 * (5 - selectable_cards.size()) / 2; startpos = 30 + 125 * (5 - selectable_cards.size()) / 2;
ct = selectable_cards.size(); ct = selectable_cards.size();
...@@ -536,7 +516,7 @@ void ClientField::ShowChainCard() { ...@@ -536,7 +516,7 @@ void ClientField::ShowChainCard() {
startpos = 30; startpos = 30;
ct = 5; ct = 5;
} }
for(size_t i = 0; i < ct; ++i) { for(int i = 0; i < ct; ++i) {
if(selectable_cards[i]->code) if(selectable_cards[i]->code)
mainGame->imageLoading.insert(std::make_pair(mainGame->btnCardSelect[i], selectable_cards[i]->code)); mainGame->imageLoading.insert(std::make_pair(mainGame->btnCardSelect[i], selectable_cards[i]->code));
else else
...@@ -582,7 +562,7 @@ void ClientField::ShowChainCard() { ...@@ -582,7 +562,7 @@ void ClientField::ShowChainCard() {
} }
void ClientField::ShowLocationCard() { void ClientField::ShowLocationCard() {
int startpos; int startpos;
size_t ct; int ct;
if(display_cards.size() <= 5) { if(display_cards.size() <= 5) {
startpos = 30 + 125 * (5 - display_cards.size()) / 2; startpos = 30 + 125 * (5 - display_cards.size()) / 2;
ct = display_cards.size(); ct = display_cards.size();
...@@ -590,7 +570,7 @@ void ClientField::ShowLocationCard() { ...@@ -590,7 +570,7 @@ void ClientField::ShowLocationCard() {
startpos = 30; startpos = 30;
ct = 5; ct = 5;
} }
for(size_t i = 0; i < ct; ++i) { for(int i = 0; i < ct; ++i) {
mainGame->stDisplayPos[i]->enableOverrideColor(false); mainGame->stDisplayPos[i]->enableOverrideColor(false);
if(display_cards[i]->code) if(display_cards[i]->code)
mainGame->imageLoading.insert(std::make_pair(mainGame->btnCardDisplay[i], display_cards[i]->code)); mainGame->imageLoading.insert(std::make_pair(mainGame->btnCardDisplay[i], display_cards[i]->code));
...@@ -1182,8 +1162,8 @@ bool ClientField::CheckSelectSum() { ...@@ -1182,8 +1162,8 @@ bool ClientField::CheckSelectSum() {
} }
select_curval_l = 0; select_curval_l = 0;
select_curval_h = 0; select_curval_h = 0;
for(size_t i = 0; i < selected_cards.size(); ++i) { for(int i = 0; i < (int)selected_cards.size(); ++i) {
if((int)i < must_select_count) if(i < must_select_count)
selected_cards[i]->is_selectable = false; selected_cards[i]->is_selectable = false;
else else
selected_cards[i]->is_selectable = true; selected_cards[i]->is_selectable = true;
...@@ -1282,7 +1262,7 @@ bool ClientField::CheckSelectTribute() { ...@@ -1282,7 +1262,7 @@ bool ClientField::CheckSelectTribute() {
(*sit)->is_selected = false; (*sit)->is_selected = false;
selable.insert(*sit); selable.insert(*sit);
} }
for(size_t i = 0; i < selected_cards.size(); ++i) { for(int i = 0; i < (int)selected_cards.size(); ++i) {
selected_cards[i]->is_selectable = true; 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]);
......
...@@ -389,30 +389,32 @@ uint32_t DataManager::CardReader(uint32_t code, card_data* pData) { ...@@ -389,30 +389,32 @@ uint32_t DataManager::CardReader(uint32_t code, card_data* pData) {
pData->clear(); pData->clear();
return 0; return 0;
} }
unsigned char* DataManager::ScriptReaderEx(const char* script_name, int* slen) { unsigned char* DataManager::ScriptReaderEx(const char* script_path, int* slen) {
// default script name: ./script/c%d.lua // default script name: ./script/c%d.lua
if (std::strncmp(script_name, "./script", 8) != 0) if (std::strncmp(script_path, "./script", 8) != 0) // not a card script file
return DefaultScriptReader(script_name, slen); return ReadScriptFromFile(script_path, slen);
const char* script_name = script_path + 2;
char expansions_path[1024]{}; char expansions_path[1024]{};
std::snprintf(expansions_path, sizeof expansions_path, "./expansions/%s", script_name + 2); std::snprintf(expansions_path, sizeof expansions_path, "./expansions/%s", script_name);
if(mainGame->gameConf.prefer_expansion_script) { if (mainGame->gameConf.prefer_expansion_script) { // debug script with raw file in expansions
if (DefaultScriptReader(expansions_path, slen)) if (ReadScriptFromFile(expansions_path, slen))
return scriptBuffer; return scriptBuffer;
else if (ScriptReader(script_name + 2, slen)) if (ReadScriptFromIrrFS(script_name, slen))
return scriptBuffer; return scriptBuffer;
else if (DefaultScriptReader(script_name, slen)) if (ReadScriptFromFile(script_path, slen))
return scriptBuffer; return scriptBuffer;
} else { } else {
if (DefaultScriptReader(script_name, slen)) if (ReadScriptFromIrrFS(script_name, slen))
return scriptBuffer; return scriptBuffer;
else if (DefaultScriptReader(expansions_path, slen)) if (ReadScriptFromFile(script_path, slen))
return scriptBuffer; return scriptBuffer;
else if (ScriptReader(script_name + 2, slen)) if (ReadScriptFromFile(expansions_path, slen))
return scriptBuffer; return scriptBuffer;
} }
return nullptr; return nullptr;
} }
unsigned char* DataManager::ScriptReader(const char* script_name, int* slen) { unsigned char* DataManager::ReadScriptFromIrrFS(const char* script_name, int* slen) {
#ifdef _WIN32 #ifdef _WIN32
wchar_t fname[256]{}; wchar_t fname[256]{};
BufferIO::DecodeUTF8(script_name, fname); BufferIO::DecodeUTF8(script_name, fname);
...@@ -429,7 +431,7 @@ unsigned char* DataManager::ScriptReader(const char* script_name, int* slen) { ...@@ -429,7 +431,7 @@ unsigned char* DataManager::ScriptReader(const char* script_name, int* slen) {
*slen = size; *slen = size;
return scriptBuffer; return scriptBuffer;
} }
unsigned char* DataManager::DefaultScriptReader(const char* script_name, int* slen) { unsigned char* DataManager::ReadScriptFromFile(const char* script_name, int* slen) {
wchar_t fname[256]{}; wchar_t fname[256]{};
BufferIO::DecodeUTF8(script_name, fname); BufferIO::DecodeUTF8(script_name, fname);
FILE* fp = myfopen(fname, "rb"); FILE* fp = myfopen(fname, "rb");
......
...@@ -17,6 +17,7 @@ namespace irr { ...@@ -17,6 +17,7 @@ namespace irr {
namespace ygo { namespace ygo {
constexpr int MAX_STRING_ID = 0x7ff; constexpr int MAX_STRING_ID = 0x7ff;
constexpr unsigned int MIN_CARD_ID = (unsigned int)(MAX_STRING_ID + 1) >> 4; constexpr unsigned int MIN_CARD_ID = (unsigned int)(MAX_STRING_ID + 1) >> 4;
constexpr unsigned int MAX_CARD_ID = 0x0fffffffU;
using CardData = card_data; using CardData = card_data;
struct CardDataC : card_data { struct CardDataC : card_data {
...@@ -82,12 +83,12 @@ public: ...@@ -82,12 +83,12 @@ public:
static unsigned char scriptBuffer[0x100000]; static unsigned char scriptBuffer[0x100000];
static const wchar_t* unknown_string; static const wchar_t* unknown_string;
static uint32_t CardReader(uint32_t, card_data*); static uint32_t CardReader(uint32_t, card_data*);
static unsigned char* ScriptReaderEx(const char* script_name, int* slen); static unsigned char* ScriptReaderEx(const char* script_path, int* slen);
//read by IFileSystem //read by IFileSystem
static unsigned char* ScriptReader(const char* script_name, int* slen); static unsigned char* ReadScriptFromIrrFS(const char* script_name, int* slen);
//read by fread //read by fread
static unsigned char* DefaultScriptReader(const char* script_name, int* slen); static unsigned char* ReadScriptFromFile(const char* script_name, int* slen);
static irr::io::IFileSystem* FileSystem; static irr::io::IFileSystem* FileSystem;
......
...@@ -177,7 +177,7 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) { ...@@ -177,7 +177,7 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
if(*dname == 0) if(*dname == 0)
break; break;
int sel = -1; int sel = -1;
for(size_t i = 0; i < mainGame->cbDBDecks->getItemCount(); ++i) { for(int i = 0; i < (int)mainGame->cbDBDecks->getItemCount(); ++i) {
if(!std::wcscmp(dname, mainGame->cbDBDecks->getItem(i))) { if(!std::wcscmp(dname, mainGame->cbDBDecks->getItem(i))) {
sel = i; sel = i;
break; break;
......
...@@ -35,7 +35,7 @@ void DeckManager::LoadLFListSingle(const char* path) { ...@@ -35,7 +35,7 @@ void DeckManager::LoadLFListSingle(const char* path) {
int count = -1; int count = -1;
if (sscanf(linebuf, "%d %d", &code, &count) != 2) if (sscanf(linebuf, "%d %d", &code, &count) != 2)
continue; continue;
if (code <= 0 || code > 0xfffffff) if (code <= 0 || code > MAX_CARD_ID)
continue; continue;
if (count < 0 || count > 2) if (count < 0 || count > 2)
continue; continue;
...@@ -72,71 +72,75 @@ const std::unordered_map<int, int>* DeckManager::GetLFListContent(int lfhash) { ...@@ -72,71 +72,75 @@ const std::unordered_map<int, int>* DeckManager::GetLFListContent(int lfhash) {
return &lit->content; return &lit->content;
return nullptr; return nullptr;
} }
static int checkAvail(unsigned int ot, unsigned int avail) { static unsigned int checkAvail(unsigned int ot, unsigned int avail) {
if((ot & avail) == avail) if((ot & avail) == avail)
return 0; return 0;
if((ot & AVAIL_OCG) && !(avail == AVAIL_OCG)) if((ot & AVAIL_OCG) && (avail != AVAIL_OCG))
return DECKERROR_OCGONLY; return DECKERROR_OCGONLY;
if((ot & AVAIL_TCG) && !(avail == AVAIL_TCG)) if((ot & AVAIL_TCG) && (avail != AVAIL_TCG))
return DECKERROR_TCGONLY; return DECKERROR_TCGONLY;
return DECKERROR_NOTAVAIL; return DECKERROR_NOTAVAIL;
} }
int DeckManager::CheckDeck(Deck& deck, int lfhash, int rule) { unsigned int DeckManager::CheckDeck(Deck& deck, int lfhash, int rule) {
std::unordered_map<int, int> ccount; std::unordered_map<int, int> ccount;
auto list = GetLFListContent(lfhash); // rule
if(!list)
return 0;
int dc = 0;
if(deck.main.size() < DECK_MIN_SIZE || deck.main.size() > DECK_MAX_SIZE) if(deck.main.size() < DECK_MIN_SIZE || deck.main.size() > DECK_MAX_SIZE)
return ((unsigned)DECKERROR_MAINCOUNT << 28) + deck.main.size(); return (DECKERROR_MAINCOUNT << 28) | (unsigned)deck.main.size();
if(deck.extra.size() > EXTRA_MAX_SIZE) if(deck.extra.size() > EXTRA_MAX_SIZE)
return ((unsigned)DECKERROR_EXTRACOUNT << 28) + deck.extra.size(); return (DECKERROR_EXTRACOUNT << 28) | (unsigned)deck.extra.size();
if(deck.side.size() > SIDE_MAX_SIZE) if(deck.side.size() > SIDE_MAX_SIZE)
return ((unsigned)DECKERROR_SIDECOUNT << 28) + deck.side.size(); return (DECKERROR_SIDECOUNT << 28) | (unsigned)deck.side.size();
if (rule < 0 || rule >= 6) auto list = GetLFListContent(lfhash);
if (!list)
return 0; return 0;
const unsigned int rule_map[6] = { AVAIL_OCG, AVAIL_TCG, AVAIL_SC, AVAIL_CUSTOM, AVAIL_OCGTCG, 0 }; const unsigned int rule_map[6] = { AVAIL_OCG, AVAIL_TCG, AVAIL_SC, AVAIL_CUSTOM, AVAIL_OCGTCG, 0 };
auto avail = rule_map[rule]; unsigned int avail = 0;
if (rule >= 0 && rule < (int)(sizeof rule_map / sizeof rule_map[0]))
avail = rule_map[rule];
for (auto& cit : deck.main) { for (auto& cit : deck.main) {
int gameruleDeckError = checkAvail(cit->second.ot, avail); auto gameruleDeckError = checkAvail(cit->second.ot, avail);
if(gameruleDeckError) if(gameruleDeckError)
return (gameruleDeckError << 28) + cit->first; return (gameruleDeckError << 28) | cit->first;
if (cit->second.type & (TYPES_EXTRA_DECK | TYPE_TOKEN)) if (cit->second.type & (TYPES_EXTRA_DECK | TYPE_TOKEN))
return (DECKERROR_EXTRACOUNT << 28); return (DECKERROR_MAINCOUNT << 28);
int code = cit->second.alias ? cit->second.alias : cit->first; int code = cit->second.alias ? cit->second.alias : cit->first;
ccount[code]++; ccount[code]++;
dc = ccount[code]; int dc = ccount[code];
if(dc > 3) if(dc > 3)
return (DECKERROR_CARDCOUNT << 28) + cit->first; return (DECKERROR_CARDCOUNT << 28) | cit->first;
auto it = list->find(code); auto it = list->find(code);
if(it != list->end() && dc > it->second) if(it != list->end() && dc > it->second)
return (DECKERROR_LFLIST << 28) + cit->first; return (DECKERROR_LFLIST << 28) | cit->first;
} }
for (auto& cit : deck.extra) { for (auto& cit : deck.extra) {
int gameruleDeckError = checkAvail(cit->second.ot, avail); auto gameruleDeckError = checkAvail(cit->second.ot, avail);
if(gameruleDeckError) if(gameruleDeckError)
return (gameruleDeckError << 28) + cit->first; return (gameruleDeckError << 28) | cit->first;
if (!(cit->second.type & TYPES_EXTRA_DECK) || cit->second.type & TYPE_TOKEN)
return (DECKERROR_EXTRACOUNT << 28);
int code = cit->second.alias ? cit->second.alias : cit->first; int code = cit->second.alias ? cit->second.alias : cit->first;
ccount[code]++; ccount[code]++;
dc = ccount[code]; int dc = ccount[code];
if(dc > 3) if(dc > 3)
return (DECKERROR_CARDCOUNT << 28) + cit->first; return (DECKERROR_CARDCOUNT << 28) | cit->first;
auto it = list->find(code); auto it = list->find(code);
if(it != list->end() && dc > it->second) if(it != list->end() && dc > it->second)
return (DECKERROR_LFLIST << 28) + cit->first; return (DECKERROR_LFLIST << 28) | cit->first;
} }
for (auto& cit : deck.side) { for (auto& cit : deck.side) {
int gameruleDeckError = checkAvail(cit->second.ot, avail); auto gameruleDeckError = checkAvail(cit->second.ot, avail);
if(gameruleDeckError) if(gameruleDeckError)
return (gameruleDeckError << 28) + cit->first; return (gameruleDeckError << 28) | cit->first;
if (cit->second.type & TYPE_TOKEN)
return (DECKERROR_SIDECOUNT << 28);
int code = cit->second.alias ? cit->second.alias : cit->first; int code = cit->second.alias ? cit->second.alias : cit->first;
ccount[code]++; ccount[code]++;
dc = ccount[code]; int dc = ccount[code];
if(dc > 3) if(dc > 3)
return (DECKERROR_CARDCOUNT << 28) + cit->first; return (DECKERROR_CARDCOUNT << 28) | cit->first;
auto it = list->find(code); auto it = list->find(code);
if(it != list->end() && dc > it->second) if(it != list->end() && dc > it->second)
return (DECKERROR_LFLIST << 28) + cit->first; return (DECKERROR_LFLIST << 28) | cit->first;
} }
return 0; return 0;
} }
...@@ -160,11 +164,11 @@ int DeckManager::LoadDeck(Deck& deck, int* dbuf, int mainc, int sidec, bool is_p ...@@ -160,11 +164,11 @@ int DeckManager::LoadDeck(Deck& deck, int* dbuf, int mainc, int sidec, bool is_p
continue; continue;
} }
if (cd.type & TYPES_EXTRA_DECK) { if (cd.type & TYPES_EXTRA_DECK) {
if ((int)deck.extra.size() < EXTRA_MAX_SIZE) if (deck.extra.size() < EXTRA_MAX_SIZE)
deck.extra.push_back(dataManager.GetCodePointer(code)); deck.extra.push_back(dataManager.GetCodePointer(code));
} }
else { else {
if ((int)deck.main.size() < DECK_MAX_SIZE) if (deck.main.size() < DECK_MAX_SIZE)
deck.main.push_back(dataManager.GetCodePointer(code)); deck.main.push_back(dataManager.GetCodePointer(code));
} }
} }
......
...@@ -47,7 +47,7 @@ public: ...@@ -47,7 +47,7 @@ public:
void LoadLFList(); void LoadLFList();
const wchar_t* GetLFListName(int lfhash); const wchar_t* GetLFListName(int lfhash);
const std::unordered_map<int, int>* GetLFListContent(int lfhash); const std::unordered_map<int, int>* GetLFListContent(int lfhash);
int CheckDeck(Deck& deck, int lfhash, int rule); unsigned int CheckDeck(Deck& deck, int lfhash, int rule);
int LoadDeck(Deck& deck, int* dbuf, int mainc, int sidec, bool is_packlist = false); int LoadDeck(Deck& deck, int* dbuf, int mainc, int sidec, bool is_packlist = false);
int LoadDeck(Deck& deck, std::istringstream& deckStream, bool is_packlist = false); int LoadDeck(Deck& deck, std::istringstream& deckStream, bool is_packlist = false);
bool LoadSide(Deck& deck, int* dbuf, int mainc, int sidec); bool LoadSide(Deck& deck, int* dbuf, int mainc, int sidec);
......
...@@ -1266,7 +1266,7 @@ void Game::DrawDeckBd() { ...@@ -1266,7 +1266,7 @@ void Game::DrawDeckBd() {
driver->draw2DRectangle(Resize(805, 160, 1020, 630), 0x400000ff, 0x400000ff, 0x40000000, 0x40000000); driver->draw2DRectangle(Resize(805, 160, 1020, 630), 0x400000ff, 0x400000ff, 0x40000000, 0x40000000);
driver->draw2DRectangleOutline(Resize(804, 159, 1020, 630)); driver->draw2DRectangleOutline(Resize(804, 159, 1020, 630));
} }
for(size_t i = 0; i < 9 && i + scrFilter->getPos() < deckBuilder.results.size(); ++i) { for(int i = 0; i < 9 && i + scrFilter->getPos() < (int)deckBuilder.results.size(); ++i) {
code_pointer ptr = deckBuilder.results[i + scrFilter->getPos()]; code_pointer ptr = deckBuilder.results[i + scrFilter->getPos()];
if(i >= 7) if(i >= 7)
{ {
......
...@@ -9,7 +9,6 @@ ...@@ -9,7 +9,6 @@
#include "deck_manager.h" #include "deck_manager.h"
#include "replay.h" #include "replay.h"
#include <thread> #include <thread>
#include <array>
namespace ygo { namespace ygo {
...@@ -102,17 +101,18 @@ void DuelClient::ClientRead(bufferevent* bev, void* ctx) { ...@@ -102,17 +101,18 @@ void DuelClient::ClientRead(bufferevent* bev, void* ctx) {
int len = evbuffer_get_length(input); int len = evbuffer_get_length(input);
if (len < 2) if (len < 2)
return; return;
std::array<unsigned char, SIZE_NETWORK_BUFFER> duel_client_read; unsigned char* duel_client_read = new unsigned char[SIZE_NETWORK_BUFFER];
uint16_t packet_len = 0; uint16_t packet_len = 0;
while (len >= 2) { while (len >= 2) {
evbuffer_copyout(input, &packet_len, sizeof packet_len); evbuffer_copyout(input, &packet_len, sizeof packet_len);
if (len < packet_len + 2) if (len < packet_len + 2)
break; break;
int read_len = evbuffer_remove(input, duel_client_read.data(), packet_len + 2); int read_len = evbuffer_remove(input, duel_client_read, packet_len + 2);
if (read_len > 2) if (read_len > 2)
HandleSTOCPacketLan(&duel_client_read[2], read_len - 2); HandleSTOCPacketLan(&duel_client_read[2], read_len - 2);
len -= packet_len + 2; len -= packet_len + 2;
} }
delete[] duel_client_read;
} }
void DuelClient::ClientEvent(bufferevent* bev, short events, void* ctx) { void DuelClient::ClientEvent(bufferevent* bev, short events, void* ctx) {
if (events & BEV_EVENT_CONNECTED) { if (events & BEV_EVENT_CONNECTED) {
...@@ -274,8 +274,8 @@ void DuelClient::HandleSTOCPacketLan(unsigned char* data, int len) { ...@@ -274,8 +274,8 @@ void DuelClient::HandleSTOCPacketLan(unsigned char* data, int len) {
} }
case ERRMSG_DECKERROR: { case ERRMSG_DECKERROR: {
mainGame->gMutex.lock(); mainGame->gMutex.lock();
unsigned int code = pkt->code & 0xFFFFFFF; unsigned int code = pkt->code & MAX_CARD_ID;
int flag = pkt->code >> 28; unsigned int flag = pkt->code >> 28;
wchar_t msgbuf[256]; wchar_t msgbuf[256];
switch(flag) switch(flag)
{ {
...@@ -1565,7 +1565,7 @@ bool DuelClient::ClientAnalyze(unsigned char* msg, int len) { ...@@ -1565,7 +1565,7 @@ bool DuelClient::ClientAnalyze(unsigned char* msg, int len) {
l = BufferIO::ReadUInt8(pbuf); l = BufferIO::ReadUInt8(pbuf);
s = BufferIO::ReadUInt8(pbuf); s = BufferIO::ReadUInt8(pbuf);
ss = BufferIO::ReadUInt8(pbuf); ss = BufferIO::ReadUInt8(pbuf);
if ((l & LOCATION_OVERLAY) > 0) if (l & LOCATION_OVERLAY)
pcard = mainGame->dField.GetCard(c, l & 0x7f, s)->overlayed[ss]; pcard = mainGame->dField.GetCard(c, l & 0x7f, s)->overlayed[ss];
else else
pcard = mainGame->dField.GetCard(c, l, s); pcard = mainGame->dField.GetCard(c, l, s);
...@@ -1630,7 +1630,7 @@ bool DuelClient::ClientAnalyze(unsigned char* msg, int len) { ...@@ -1630,7 +1630,7 @@ bool DuelClient::ClientAnalyze(unsigned char* msg, int len) {
l = BufferIO::ReadUInt8(pbuf); l = BufferIO::ReadUInt8(pbuf);
s = BufferIO::ReadUInt8(pbuf); s = BufferIO::ReadUInt8(pbuf);
ss = BufferIO::ReadUInt8(pbuf); ss = BufferIO::ReadUInt8(pbuf);
if ((l & LOCATION_OVERLAY) > 0) if (l & LOCATION_OVERLAY)
pcard = mainGame->dField.GetCard(c, l & 0x7f, s)->overlayed[ss]; pcard = mainGame->dField.GetCard(c, l & 0x7f, s)->overlayed[ss];
else else
pcard = mainGame->dField.GetCard(c, l, s); pcard = mainGame->dField.GetCard(c, l, s);
...@@ -1654,7 +1654,7 @@ bool DuelClient::ClientAnalyze(unsigned char* msg, int len) { ...@@ -1654,7 +1654,7 @@ bool DuelClient::ClientAnalyze(unsigned char* msg, int len) {
l = BufferIO::ReadUInt8(pbuf); l = BufferIO::ReadUInt8(pbuf);
s = BufferIO::ReadUInt8(pbuf); s = BufferIO::ReadUInt8(pbuf);
ss = BufferIO::ReadUInt8(pbuf); ss = BufferIO::ReadUInt8(pbuf);
if ((l & LOCATION_OVERLAY) > 0) if (l & LOCATION_OVERLAY)
pcard = mainGame->dField.GetCard(c, l & 0x7f, s)->overlayed[ss]; pcard = mainGame->dField.GetCard(c, l & 0x7f, s)->overlayed[ss];
else else
pcard = mainGame->dField.GetCard(c, l, s); pcard = mainGame->dField.GetCard(c, l, s);
...@@ -2193,7 +2193,7 @@ bool DuelClient::ClientAnalyze(unsigned char* msg, int len) { ...@@ -2193,7 +2193,7 @@ bool DuelClient::ClientAnalyze(unsigned char* msg, int len) {
} }
if (field_confirm.size() > 0) { if (field_confirm.size() > 0) {
mainGame->WaitFrameSignal(5); mainGame->WaitFrameSignal(5);
for(size_t i = 0; i < field_confirm.size(); ++i) { for(int i = 0; i < (int)field_confirm.size(); ++i) {
pcard = field_confirm[i]; pcard = field_confirm[i];
c = pcard->controler; c = pcard->controler;
l = pcard->location; l = pcard->location;
...@@ -2223,7 +2223,7 @@ bool DuelClient::ClientAnalyze(unsigned char* msg, int len) { ...@@ -2223,7 +2223,7 @@ bool DuelClient::ClientAnalyze(unsigned char* msg, int len) {
mainGame->WaitFrameSignal(30); mainGame->WaitFrameSignal(30);
else else
mainGame->WaitFrameSignal(90); mainGame->WaitFrameSignal(90);
for(size_t i = 0; i < field_confirm.size(); ++i) { for(int i = 0; i < (int)field_confirm.size(); ++i) {
pcard = field_confirm[i]; pcard = field_confirm[i];
mainGame->dField.MoveCard(pcard, 5); mainGame->dField.MoveCard(pcard, 5);
pcard->is_highlighting = false; pcard->is_highlighting = false;
...@@ -3064,7 +3064,7 @@ bool DuelClient::ClientAnalyze(unsigned char* msg, int len) { ...@@ -3064,7 +3064,7 @@ bool DuelClient::ClientAnalyze(unsigned char* msg, int len) {
unsigned int l = BufferIO::ReadUInt8(pbuf); unsigned int l = BufferIO::ReadUInt8(pbuf);
int s = BufferIO::ReadUInt8(pbuf); int s = BufferIO::ReadUInt8(pbuf);
int ss = BufferIO::ReadUInt8(pbuf); int ss = BufferIO::ReadUInt8(pbuf);
if ((l & LOCATION_OVERLAY) > 0) if (l & LOCATION_OVERLAY)
pcards[i] = mainGame->dField.GetCard(c, l & 0x7f, s)->overlayed[ss]; pcards[i] = mainGame->dField.GetCard(c, l & 0x7f, s)->overlayed[ss];
else else
pcards[i] = mainGame->dField.GetCard(c, l, s); pcards[i] = mainGame->dField.GetCard(c, l, s);
......
...@@ -4,7 +4,6 @@ ...@@ -4,7 +4,6 @@
#include "tag_duel.h" #include "tag_duel.h"
#include "deck_manager.h" #include "deck_manager.h"
#include <thread> #include <thread>
#include <array>
namespace ygo { namespace ygo {
std::unordered_map<bufferevent*, DuelPlayer> NetServer::users; std::unordered_map<bufferevent*, DuelPlayer> NetServer::users;
...@@ -127,17 +126,18 @@ void NetServer::ServerEchoRead(bufferevent *bev, void *ctx) { ...@@ -127,17 +126,18 @@ void NetServer::ServerEchoRead(bufferevent *bev, void *ctx) {
int len = evbuffer_get_length(input); int len = evbuffer_get_length(input);
if (len < 2) if (len < 2)
return; return;
std::array<unsigned char, SIZE_NETWORK_BUFFER> net_server_read; unsigned char* net_server_read = new unsigned char[SIZE_NETWORK_BUFFER];
uint16_t packet_len = 0; uint16_t packet_len = 0;
while (len >= 2) { while (len >= 2) {
evbuffer_copyout(input, &packet_len, sizeof packet_len); evbuffer_copyout(input, &packet_len, sizeof packet_len);
if (len < packet_len + 2) if (len < packet_len + 2)
break; break;
int read_len = evbuffer_remove(input, net_server_read.data(), packet_len + 2); int read_len = evbuffer_remove(input, net_server_read, packet_len + 2);
if (read_len > 2) if (read_len > 2)
HandleCTOSPacket(&users[bev], &net_server_read[2], read_len - 2); HandleCTOSPacket(&users[bev], &net_server_read[2], read_len - 2);
len -= packet_len + 2; len -= packet_len + 2;
} }
delete[] net_server_read;
} }
void NetServer::ServerEchoEvent(bufferevent* bev, short events, void* ctx) { void NetServer::ServerEchoEvent(bufferevent* bev, short events, void* ctx) {
if (events & (BEV_EVENT_EOF | BEV_EVENT_ERROR)) { if (events & (BEV_EVENT_EOF | BEV_EVENT_ERROR)) {
......
...@@ -324,15 +324,15 @@ public: ...@@ -324,15 +324,15 @@ public:
#define ERRMSG_SIDEERROR 0x3 #define ERRMSG_SIDEERROR 0x3
#define ERRMSG_VERERROR 0x4 #define ERRMSG_VERERROR 0x4
#define DECKERROR_LFLIST 0x1 #define DECKERROR_LFLIST 0x1U
#define DECKERROR_OCGONLY 0x2 #define DECKERROR_OCGONLY 0x2U
#define DECKERROR_TCGONLY 0x3 #define DECKERROR_TCGONLY 0x3U
#define DECKERROR_UNKNOWNCARD 0x4 #define DECKERROR_UNKNOWNCARD 0x4U
#define DECKERROR_CARDCOUNT 0x5 #define DECKERROR_CARDCOUNT 0x5U
#define DECKERROR_MAINCOUNT 0x6 #define DECKERROR_MAINCOUNT 0x6U
#define DECKERROR_EXTRACOUNT 0x7 #define DECKERROR_EXTRACOUNT 0x7U
#define DECKERROR_SIDECOUNT 0x8 #define DECKERROR_SIDECOUNT 0x8U
#define DECKERROR_NOTAVAIL 0x9 #define DECKERROR_NOTAVAIL 0x9U
#define MODE_SINGLE 0x0 #define MODE_SINGLE 0x0
#define MODE_MATCH 0x1 #define MODE_MATCH 0x1
......
...@@ -245,7 +245,7 @@ void SingleDuel::PlayerReady(DuelPlayer* dp, bool is_ready) { ...@@ -245,7 +245,7 @@ void SingleDuel::PlayerReady(DuelPlayer* dp, bool is_ready) {
unsigned int deckerror = 0; unsigned int deckerror = 0;
if(!host_info.no_check_deck) { if(!host_info.no_check_deck) {
if(deck_error[dp->type]) { if(deck_error[dp->type]) {
deckerror = (DECKERROR_UNKNOWNCARD << 28) + deck_error[dp->type]; deckerror = (DECKERROR_UNKNOWNCARD << 28) | deck_error[dp->type];
} else { } else {
deckerror = deckManager.CheckDeck(pdeck[dp->type], host_info.lflist, host_info.rule); deckerror = deckManager.CheckDeck(pdeck[dp->type], host_info.lflist, host_info.rule);
} }
...@@ -278,6 +278,8 @@ void SingleDuel::PlayerKick(DuelPlayer* dp, unsigned char pos) { ...@@ -278,6 +278,8 @@ void SingleDuel::PlayerKick(DuelPlayer* dp, unsigned char pos) {
void SingleDuel::UpdateDeck(DuelPlayer* dp, unsigned char* pdata, int len) { void SingleDuel::UpdateDeck(DuelPlayer* dp, unsigned char* pdata, int len) {
if(dp->type > 1 || ready[dp->type]) if(dp->type > 1 || ready[dp->type])
return; return;
if (len < 8 || len > sizeof(CTOS_DeckData))
return;
bool valid = true; bool valid = true;
CTOS_DeckData deckbuf; CTOS_DeckData deckbuf;
std::memcpy(&deckbuf, pdata, len); std::memcpy(&deckbuf, pdata, len);
......
...@@ -261,6 +261,8 @@ void TagDuel::PlayerKick(DuelPlayer* dp, unsigned char pos) { ...@@ -261,6 +261,8 @@ void TagDuel::PlayerKick(DuelPlayer* dp, unsigned char pos) {
void TagDuel::UpdateDeck(DuelPlayer* dp, unsigned char* pdata, int len) { void TagDuel::UpdateDeck(DuelPlayer* dp, unsigned char* pdata, int len) {
if(dp->type > 3 || ready[dp->type]) if(dp->type > 3 || ready[dp->type])
return; return;
if (len < 8 || len > sizeof(CTOS_DeckData))
return;
bool valid = true; bool valid = true;
CTOS_DeckData deckbuf; CTOS_DeckData deckbuf;
std::memcpy(&deckbuf, pdata, len); std::memcpy(&deckbuf, pdata, len);
......
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