Commit e79ab329 authored by wind2009's avatar wind2009

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

parents c85207e4 377824c5
...@@ -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();
...@@ -220,27 +220,29 @@ bool ClientCard::client_card_sort(ClientCard* c1, ClientCard* c2) { ...@@ -220,27 +220,29 @@ bool ClientCard::client_card_sort(ClientCard* c1, ClientCard* c2) {
return cp1 < cp2; return cp1 < cp2;
if(c1->location != c2->location) if(c1->location != c2->location)
return c1->location < c2->location; return c1->location < c2->location;
if (c1->location & LOCATION_OVERLAY) { if (c1->location == LOCATION_OVERLAY) {
if (c1->overlayTarget != c2->overlayTarget) if (c1->overlayTarget != c2->overlayTarget)
return c1->overlayTarget->sequence < c2->overlayTarget->sequence; return c1->overlayTarget->sequence < c2->overlayTarget->sequence;
else else
return c1->sequence < c2->sequence; return c1->sequence < c2->sequence;
} }
else { else if (c1->location == LOCATION_DECK) {
if(c1->location & (LOCATION_DECK | LOCATION_GRAVE | LOCATION_REMOVED | LOCATION_EXTRA)) { return c1->sequence > c2->sequence;
auto it1 = std::find_if(mainGame->dField.chains.rbegin(), mainGame->dField.chains.rend(), [c1](const ChainInfo& ch) { }
return c1 == ch.chain_card || ch.target.find(c1) != ch.target.end(); else if (c1->location & (LOCATION_GRAVE | LOCATION_REMOVED | LOCATION_EXTRA)) {
}); auto it1 = std::find_if(mainGame->dField.chains.rbegin(), mainGame->dField.chains.rend(), [c1](const ChainInfo& ch) {
auto it2 = std::find_if(mainGame->dField.chains.rbegin(), mainGame->dField.chains.rend(), [c2](const ChainInfo& ch) { return c1 == ch.chain_card || ch.target.find(c1) != ch.target.end();
return c2 == ch.chain_card || ch.target.find(c2) != ch.target.end(); });
}); auto it2 = std::find_if(mainGame->dField.chains.rbegin(), mainGame->dField.chains.rend(), [c2](const ChainInfo& ch) {
if(it1 != mainGame->dField.chains.rend() || it2 != mainGame->dField.chains.rend()) { return c2 == ch.chain_card || ch.target.find(c2) != ch.target.end();
return it1 < it2; });
} if (it1 != mainGame->dField.chains.rend() || it2 != mainGame->dField.chains.rend()) {
return c1->sequence > c2->sequence; return it1 < it2;
} }
else return c1->sequence > c2->sequence;
return c1->sequence < c2->sequence; }
else {
return c1->sequence < c2->sequence;
} }
} }
} }
...@@ -76,7 +76,7 @@ public: ...@@ -76,7 +76,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();
......
...@@ -127,7 +127,7 @@ void ClientField::Initial(int player, int deckc, int extrac) { ...@@ -127,7 +127,7 @@ void ClientField::Initial(int player, int deckc, int extrac) {
deck[player].push_back(pcard); deck[player].push_back(pcard);
pcard->owner = player; pcard->owner = player;
pcard->controler = player; pcard->controler = player;
pcard->location = 0x1; pcard->location = LOCATION_DECK;
pcard->sequence = i; pcard->sequence = i;
pcard->position = POS_FACEDOWN_DEFENSE; pcard->position = POS_FACEDOWN_DEFENSE;
GetCardLocation(pcard, &pcard->curPos, &pcard->curRot, true); GetCardLocation(pcard, &pcard->curPos, &pcard->curRot, true);
...@@ -137,7 +137,7 @@ void ClientField::Initial(int player, int deckc, int extrac) { ...@@ -137,7 +137,7 @@ void ClientField::Initial(int player, int deckc, int extrac) {
extra[player].push_back(pcard); extra[player].push_back(pcard);
pcard->owner = player; pcard->owner = player;
pcard->controler = player; pcard->controler = player;
pcard->location = 0x40; pcard->location = LOCATION_EXTRA;
pcard->sequence = i; pcard->sequence = i;
pcard->position = POS_FACEDOWN_DEFENSE; pcard->position = POS_FACEDOWN_DEFENSE;
GetCardLocation(pcard, &pcard->curPos, &pcard->curRot, true); GetCardLocation(pcard, &pcard->curPos, &pcard->curRot, true);
...@@ -196,15 +196,15 @@ void ClientField::AddCard(ClientCard* pcard, int controler, int location, int se ...@@ -196,15 +196,15 @@ 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;
pcard->ClearData();
pcard->ClearTarget();
SetShowMark(pcard, false);
break; break;
} }
case LOCATION_HAND: { case LOCATION_HAND: {
...@@ -235,15 +235,13 @@ void ClientField::AddCard(ClientCard* pcard, int controler, int location, int se ...@@ -235,15 +235,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 +251,54 @@ void ClientField::AddCard(ClientCard* pcard, int controler, int location, int se ...@@ -253,69 +251,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 +408,8 @@ void ClientField::ClearChainSelect() { ...@@ -425,8 +408,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 +419,7 @@ void ClientField::ShowSelectCard(bool buttonok, bool chain) { ...@@ -436,7 +419,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 +427,7 @@ void ClientField::ShowSelectCard(bool buttonok, bool chain) { ...@@ -444,7 +427,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 +511,7 @@ void ClientField::ShowSelectCard(bool buttonok, bool chain) { ...@@ -528,7 +511,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 +519,7 @@ void ClientField::ShowChainCard() { ...@@ -536,7 +519,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 +565,7 @@ void ClientField::ShowChainCard() { ...@@ -582,7 +565,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 +573,7 @@ void ClientField::ShowLocationCard() { ...@@ -590,7 +573,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 +1165,8 @@ bool ClientField::CheckSelectSum() { ...@@ -1182,8 +1165,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 +1265,7 @@ bool ClientField::CheckSelectTribute() { ...@@ -1282,7 +1265,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]);
......
...@@ -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 {
......
...@@ -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;
......
...@@ -37,7 +37,7 @@ void DeckManager::LoadLFListSingle(const char* path) { ...@@ -37,7 +37,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;
...@@ -77,71 +77,75 @@ const std::unordered_map<int, int>* DeckManager::GetLFListContent(int lfhash) { ...@@ -77,71 +77,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;
} }
...@@ -165,11 +169,11 @@ int DeckManager::LoadDeck(Deck& deck, int* dbuf, int mainc, int sidec, bool is_p ...@@ -165,11 +169,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));
} }
} }
......
...@@ -65,7 +65,7 @@ public: ...@@ -65,7 +65,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)
{ {
......
...@@ -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);
......
...@@ -2419,19 +2419,19 @@ void ClientField::ShowCancelOrFinishButton(int buttonOp) { ...@@ -2419,19 +2419,19 @@ void ClientField::ShowCancelOrFinishButton(int buttonOp) {
void ClientField::SetShowMark(ClientCard* pcard, bool enable) { void ClientField::SetShowMark(ClientCard* pcard, bool enable) {
if(pcard->equipTarget) if(pcard->equipTarget)
pcard->equipTarget->is_showequip = enable; pcard->equipTarget->is_showequip = enable;
for(auto cit = pcard->equipped.begin(); cit != pcard->equipped.end(); ++cit) for (auto& card : pcard->equipped)
(*cit)->is_showequip = enable; card->is_showequip = enable;
for(auto cit = pcard->cardTarget.begin(); cit != pcard->cardTarget.end(); ++cit) for (auto& card : pcard->cardTarget)
(*cit)->is_showtarget = enable; card->is_showtarget = enable;
for(auto cit = pcard->ownerTarget.begin(); cit != pcard->ownerTarget.end(); ++cit) for (auto& card : pcard->ownerTarget)
(*cit)->is_showtarget = enable; card->is_showtarget = enable;
for(auto chit = chains.begin(); chit != chains.end(); ++chit) { for (auto& ch : chains) {
if(pcard == chit->chain_card) { if (pcard == ch.chain_card) {
for(auto tgit = chit->target.begin(); tgit != chit->target.end(); ++tgit) for (auto& tg : ch.target)
(*tgit)->is_showchaintarget = enable; tg->is_showchaintarget = enable;
} }
if(chit->target.find(pcard) != chit->target.end()) if (ch.target.find(pcard) != ch.target.end())
chit->chain_card->is_showchaintarget = enable; ch.chain_card->is_showchaintarget = enable;
} }
} }
void ClientField::ShowCardInfoInList(ClientCard* pcard, irr::gui::IGUIElement* element, irr::gui::IGUIElement* parent) { void ClientField::ShowCardInfoInList(ClientCard* pcard, irr::gui::IGUIElement* element, irr::gui::IGUIElement* parent) {
...@@ -2440,26 +2440,28 @@ void ClientField::ShowCardInfoInList(ClientCard* pcard, irr::gui::IGUIElement* e ...@@ -2440,26 +2440,28 @@ void ClientField::ShowCardInfoInList(ClientCard* pcard, irr::gui::IGUIElement* e
if(pcard->code) { if(pcard->code) {
str.append(dataManager.GetName(pcard->code)); str.append(dataManager.GetName(pcard->code));
} }
if(pcard->overlayTarget) { if (pcard->location != LOCATION_DECK) {
myswprintf(formatBuffer, dataManager.GetSysString(225), dataManager.GetName(pcard->overlayTarget->code), pcard->overlayTarget->sequence + 1); if (pcard->overlayTarget) {
str.append(L"\n").append(formatBuffer); myswprintf(formatBuffer, dataManager.GetSysString(225), dataManager.GetName(pcard->overlayTarget->code), pcard->overlayTarget->sequence + 1);
}
if((pcard->status & STATUS_PROC_COMPLETE)
&& (pcard->type & (TYPE_RITUAL | TYPE_FUSION | TYPE_SYNCHRO | TYPE_XYZ | TYPE_LINK | TYPE_SPSUMMON)))
str.append(L"\n").append(dataManager.GetSysString(224));
for(auto iter = pcard->desc_hints.begin(); iter != pcard->desc_hints.end(); ++iter) {
myswprintf(formatBuffer, L"\n*%ls", dataManager.GetDesc(iter->first));
str.append(formatBuffer);
}
for(size_t i = 0; i < chains.size(); ++i) {
auto chit = chains[i];
if(pcard == chit.chain_card) {
myswprintf(formatBuffer, dataManager.GetSysString(216), i + 1);
str.append(L"\n").append(formatBuffer); str.append(L"\n").append(formatBuffer);
} }
if(chit.target.find(pcard) != chit.target.end()) { if ((pcard->status & STATUS_PROC_COMPLETE)
myswprintf(formatBuffer, dataManager.GetSysString(217), i + 1, dataManager.GetName(chit.chain_card->code)); && (pcard->type & (TYPE_RITUAL | TYPE_FUSION | TYPE_SYNCHRO | TYPE_XYZ | TYPE_LINK | TYPE_SPSUMMON)))
str.append(L"\n").append(formatBuffer); str.append(L"\n").append(dataManager.GetSysString(224));
for (auto iter = pcard->desc_hints.begin(); iter != pcard->desc_hints.end(); ++iter) {
myswprintf(formatBuffer, L"\n*%ls", dataManager.GetDesc(iter->first));
str.append(formatBuffer);
}
for (size_t i = 0; i < chains.size(); ++i) {
const auto& chit = chains[i];
if (pcard == chit.chain_card) {
myswprintf(formatBuffer, dataManager.GetSysString(216), i + 1);
str.append(L"\n").append(formatBuffer);
}
if (chit.target.find(pcard) != chit.target.end()) {
myswprintf(formatBuffer, dataManager.GetSysString(217), i + 1, dataManager.GetName(chit.chain_card->code));
str.append(L"\n").append(formatBuffer);
}
} }
} }
if(str.length() > 0) { if(str.length() > 0) {
......
...@@ -327,15 +327,15 @@ public: ...@@ -327,15 +327,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
......
...@@ -353,7 +353,7 @@ void SingleDuel::PlayerReady(DuelPlayer* dp, bool is_ready) { ...@@ -353,7 +353,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);
} }
......
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