Commit db332d1b authored by nanahira's avatar nanahira

add CCG support

parent d35f098d
...@@ -1448,14 +1448,16 @@ void DeckBuilder::FilterCards() { ...@@ -1448,14 +1448,16 @@ void DeckBuilder::FilterCards() {
if(filter_lm) { if(filter_lm) {
if(filter_lm <= 3 && (!filterList->count(ptr->first) || (*filterList).at(ptr->first) != filter_lm - 1)) if(filter_lm <= 3 && (!filterList->count(ptr->first) || (*filterList).at(ptr->first) != filter_lm - 1))
continue; continue;
if(filter_lm == 4 && data.ot != 1) if(filter_lm == 4 && (data.ot & 0x3) != 1)
continue; continue;
if(filter_lm == 5 && data.ot != 2) if(filter_lm == 5 && (data.ot & 0x3) != 2)
continue; continue;
if(filter_lm == 6 && data.ot != 3) if(filter_lm == 6 && (data.ot & 0x3) != 3)
continue; continue;
if(filter_lm == 7 && data.ot != 4) if(filter_lm == 7 && data.ot != 4)
continue; continue;
if(filter_lm == 8 && !(data.ot & 0x8))
continue;
} }
bool is_target = true; bool is_target = true;
for (auto elements_iterator = query_elements.begin(); elements_iterator != query_elements.end(); ++elements_iterator) { for (auto elements_iterator = query_elements.begin(); elements_iterator != query_elements.end(); ++elements_iterator) {
......
...@@ -71,7 +71,24 @@ const std::unordered_map<int, int>* DeckManager::GetLFListContent(int lfhash) { ...@@ -71,7 +71,24 @@ const std::unordered_map<int, int>* DeckManager::GetLFListContent(int lfhash) {
return &lit->content; return &lit->content;
return nullptr; return nullptr;
} }
int DeckManager::CheckDeck(Deck& deck, int lfhash, bool allow_ocg, bool allow_tcg) { int DeckManager::IsGameRuleDisallowed(unsigned char hostInfoRule, unsigned int cardOt) {
bool allow_ocg = hostInfoRule == 0 || hostInfoRule == 2; // OCG can be used in OCG and OT duels
bool allow_tcg = hostInfoRule == 1 || hostInfoRule == 2; // TCG can be used in TCG and OT duels
bool allow_ccg = hostInfoRule == 0 || hostInfoRule == 4 || hostInfoRule == 2; // CCG can be used in OCG, CCG and OT duels
if(!allow_ocg && (cardOt & 0x3 == 0x1))
return DECKERROR_OCGONLY;
if(!allow_tcg && (cardOt & 0x3 == 0x2))
return DECKERROR_TCGONLY;
if(hostInfoRule == 4 && !(cardOt & 0x8) && (cardOt & 0x3)) { // in CCG duels, cards labeled with ither OCG or TCG, but not CCG, would not be allowed.
if(cardOt & 0x3 == 0x2) {
return DECKERROR_TCGONLY;
} else {
return DECKERROR_OCGONLY;
}
}
return 0;
}
int DeckManager::CheckDeck(Deck& deck, int lfhash, unsigned char hostInfoRule) {
std::unordered_map<int, int> ccount; std::unordered_map<int, int> ccount;
auto list = GetLFListContent(lfhash); auto list = GetLFListContent(lfhash);
if(!list) if(!list)
...@@ -86,10 +103,9 @@ int DeckManager::CheckDeck(Deck& deck, int lfhash, bool allow_ocg, bool allow_tc ...@@ -86,10 +103,9 @@ int DeckManager::CheckDeck(Deck& deck, int lfhash, bool allow_ocg, bool allow_tc
for(size_t i = 0; i < deck.main.size(); ++i) { for(size_t i = 0; i < deck.main.size(); ++i) {
code_pointer cit = deck.main[i]; code_pointer cit = deck.main[i];
if(!allow_ocg && (cit->second.ot == 0x1)) const int gameruleDeckError = IsGameRuleDisallowed(hostInfoRule, cit->second.ot);
return (DECKERROR_OCGONLY << 28) + cit->first; if(gameruleDeckError)
if(!allow_tcg && (cit->second.ot == 0x2)) return (gameruleDeckError << 28) + cit->first;
return (DECKERROR_TCGONLY << 28) + cit->first;
if(cit->second.type & (TYPE_FUSION | TYPE_SYNCHRO | TYPE_XYZ | TYPE_TOKEN | TYPE_LINK)) if(cit->second.type & (TYPE_FUSION | TYPE_SYNCHRO | TYPE_XYZ | TYPE_TOKEN | TYPE_LINK))
return (DECKERROR_EXTRACOUNT << 28); return (DECKERROR_EXTRACOUNT << 28);
int code = cit->second.alias ? cit->second.alias : cit->first; int code = cit->second.alias ? cit->second.alias : cit->first;
...@@ -103,10 +119,9 @@ int DeckManager::CheckDeck(Deck& deck, int lfhash, bool allow_ocg, bool allow_tc ...@@ -103,10 +119,9 @@ int DeckManager::CheckDeck(Deck& deck, int lfhash, bool allow_ocg, bool allow_tc
} }
for(size_t i = 0; i < deck.extra.size(); ++i) { for(size_t i = 0; i < deck.extra.size(); ++i) {
code_pointer cit = deck.extra[i]; code_pointer cit = deck.extra[i];
if(!allow_ocg && (cit->second.ot == 0x1)) const int gameruleDeckError = IsGameRuleDisallowed(hostInfoRule, cit->second.ot);
return (DECKERROR_OCGONLY << 28) + cit->first; if(gameruleDeckError)
if(!allow_tcg && (cit->second.ot == 0x2)) return (gameruleDeckError << 28) + cit->first;
return (DECKERROR_TCGONLY << 28) + cit->first;
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]; dc = ccount[code];
...@@ -118,10 +133,9 @@ int DeckManager::CheckDeck(Deck& deck, int lfhash, bool allow_ocg, bool allow_tc ...@@ -118,10 +133,9 @@ int DeckManager::CheckDeck(Deck& deck, int lfhash, bool allow_ocg, bool allow_tc
} }
for(size_t i = 0; i < deck.side.size(); ++i) { for(size_t i = 0; i < deck.side.size(); ++i) {
code_pointer cit = deck.side[i]; code_pointer cit = deck.side[i];
if(!allow_ocg && (cit->second.ot == 0x1)) const int gameruleDeckError = IsGameRuleDisallowed(hostInfoRule, cit->second.ot);
return (DECKERROR_OCGONLY << 28) + cit->first; if(gameruleDeckError)
if(!allow_tcg && (cit->second.ot == 0x2)) return (gameruleDeckError << 28) + cit->first;
return (DECKERROR_TCGONLY << 28) + cit->first;
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]; dc = ccount[code];
......
...@@ -39,7 +39,8 @@ public: ...@@ -39,7 +39,8 @@ 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, bool allow_ocg, bool allow_tcg); int IsGameRuleDisallowed(unsigned char hostInfoRule, unsigned int cardOt);
int CheckDeck(Deck &deck, int lfhash, unsigned char hostInfoRule);
int LoadDeck(Deck& deck, int* dbuf, int mainc, int sidec); int LoadDeck(Deck& deck, int* dbuf, int mainc, int sidec);
bool LoadSide(Deck& deck, int* dbuf, int mainc, int sidec); bool LoadSide(Deck& deck, int* dbuf, int mainc, int sidec);
void GetCategoryPath(wchar_t* ret, int index, const wchar_t* text); void GetCategoryPath(wchar_t* ret, int index, const wchar_t* text);
......
...@@ -1105,24 +1105,17 @@ void Game::DrawThumb(code_pointer cp, position2di pos, const std::unordered_map< ...@@ -1105,24 +1105,17 @@ void Game::DrawThumb(code_pointer cp, position2di pos, const std::unordered_map<
break; break;
} }
} }
if(cbLimit->getSelected() >= 4 && (cp->second.ot & gameConf.defaultOT)) { if(cbLimit->getSelected() >= 4 && ((cp->second.ot & 0x8) || cp->second.ot & 0x3 && (cp->second.ot & 0x3) != 0x3)) {
switch(cp->second.ot) { int xOffset = 0, yOffset = 0;
case 1: if(cp->second.ot & 0x8)
driver->draw2DImage(imageManager.tOT, otloc, recti(0, 128, 128, 192), 0, 0, true); xOffset += 128;
break; else if((cp->second.ot & 0x3)== 0x2) {
case 2: yOffset += 64;
driver->draw2DImage(imageManager.tOT, otloc, recti(0, 192, 128, 256), 0, 0, true);
break;
} }
} else if(cbLimit->getSelected() >= 4 || !(cp->second.ot & gameConf.defaultOT)) { if(!deckManager.IsGameRuleDisallowed(gameConf.defaultOT, cp->second.ot)) {
switch(cp->second.ot) { yOffset += 128;
case 1:
driver->draw2DImage(imageManager.tOT, otloc, recti(0, 0, 128, 64), 0, 0, true);
break;
case 2:
driver->draw2DImage(imageManager.tOT, otloc, recti(0, 64, 128, 128), 0, 0, true);
break;
} }
driver->draw2DImage(imageManager.tOT, otloc, recti(xOffset, yOffset, 128 + xOffset, 64 + yOffset), 0, 0, true);
} }
} }
void Game::DrawDeckBd() { void Game::DrawDeckBd() {
......
...@@ -421,7 +421,7 @@ void DuelClient::HandleSTOCPacketLan(char* data, unsigned int len) { ...@@ -421,7 +421,7 @@ void DuelClient::HandleSTOCPacketLan(char* data, unsigned int len) {
wchar_t msgbuf[256]; wchar_t msgbuf[256];
myswprintf(msgbuf, L"%ls%ls\n", dataManager.GetSysString(1226), deckManager.GetLFListName(pkt->info.lflist)); myswprintf(msgbuf, L"%ls%ls\n", dataManager.GetSysString(1226), deckManager.GetLFListName(pkt->info.lflist));
str.append(msgbuf); str.append(msgbuf);
myswprintf(msgbuf, L"%ls%ls\n", dataManager.GetSysString(1225), dataManager.GetSysString(1240 + pkt->info.rule)); myswprintf(msgbuf, L"%ls%ls\n", dataManager.GetSysString(1225), dataManager.GetSysString(pkt->info.rule == 4 ? 1249 : 1240 + pkt->info.rule));
str.append(msgbuf); str.append(msgbuf);
myswprintf(msgbuf, L"%ls%ls\n", dataManager.GetSysString(1227), dataManager.GetSysString(1244 + pkt->info.mode)); myswprintf(msgbuf, L"%ls%ls\n", dataManager.GetSysString(1227), dataManager.GetSysString(1244 + pkt->info.mode));
str.append(msgbuf); str.append(msgbuf);
......
...@@ -197,6 +197,7 @@ bool Game::Initialize() { ...@@ -197,6 +197,7 @@ bool Game::Initialize() {
cbRule->addItem(dataManager.GetSysString(1241)); cbRule->addItem(dataManager.GetSysString(1241));
cbRule->addItem(dataManager.GetSysString(1242)); cbRule->addItem(dataManager.GetSysString(1242));
cbRule->addItem(dataManager.GetSysString(1243)); cbRule->addItem(dataManager.GetSysString(1243));
cbRule->addItem(dataManager.GetSysString(1249));
cbRule->setSelected(gameConf.defaultOT - 1); cbRule->setSelected(gameConf.defaultOT - 1);
env->addStaticText(dataManager.GetSysString(1227), rect<s32>(20, 90, 220, 110), false, false, wCreateHost); env->addStaticText(dataManager.GetSysString(1227), rect<s32>(20, 90, 220, 110), false, false, wCreateHost);
cbMatchMode = env->addComboBox(rect<s32>(140, 85, 300, 110), wCreateHost); cbMatchMode = env->addComboBox(rect<s32>(140, 85, 300, 110), wCreateHost);
...@@ -678,6 +679,7 @@ bool Game::Initialize() { ...@@ -678,6 +679,7 @@ bool Game::Initialize() {
cbLimit->addItem(dataManager.GetSysString(1241)); cbLimit->addItem(dataManager.GetSysString(1241));
cbLimit->addItem(dataManager.GetSysString(1242)); cbLimit->addItem(dataManager.GetSysString(1242));
cbLimit->addItem(dataManager.GetSysString(1243)); cbLimit->addItem(dataManager.GetSysString(1243));
cbLimit->addItem(dataManager.GetSysString(1249));
stAttribute = env->addStaticText(dataManager.GetSysString(1319), rect<s32>(10, 22 + 50 / 6, 70, 42 + 50 / 6), false, false, wFilter); stAttribute = env->addStaticText(dataManager.GetSysString(1319), rect<s32>(10, 22 + 50 / 6, 70, 42 + 50 / 6), false, false, wFilter);
cbAttribute = env->addComboBox(rect<s32>(60, 20 + 50 / 6, 190, 40 + 50 / 6), wFilter, COMBOBOX_ATTRIBUTE); cbAttribute = env->addComboBox(rect<s32>(60, 20 + 50 / 6, 190, 40 + 50 / 6), wFilter, COMBOBOX_ATTRIBUTE);
cbAttribute->setMaxSelectionRows(10); cbAttribute->setMaxSelectionRows(10);
......
...@@ -233,7 +233,7 @@ void NetServer::HandleCTOSPacket(DuelPlayer* dp, char* data, unsigned int len) { ...@@ -233,7 +233,7 @@ void NetServer::HandleCTOSPacket(DuelPlayer* dp, char* data, unsigned int len) {
duel_mode = new TagDuel(); duel_mode = new TagDuel();
duel_mode->etimer = event_new(net_evbase, 0, EV_TIMEOUT | EV_PERSIST, TagDuel::TagTimer, duel_mode); duel_mode->etimer = event_new(net_evbase, 0, EV_TIMEOUT | EV_PERSIST, TagDuel::TagTimer, duel_mode);
} }
if(pkt->info.rule > 3) if(pkt->info.rule > 4)
pkt->info.rule = 0; pkt->info.rule = 0;
if(pkt->info.mode > 2) if(pkt->info.mode > 2)
pkt->info.mode = 0; pkt->info.mode = 0;
......
...@@ -251,9 +251,7 @@ void SingleDuel::PlayerReady(DuelPlayer* dp, bool is_ready) { ...@@ -251,9 +251,7 @@ void SingleDuel::PlayerReady(DuelPlayer* dp, bool is_ready) {
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 {
bool allow_ocg = host_info.rule == 0 || host_info.rule == 2; deckerror = deckManager.CheckDeck(pdeck[dp->type], host_info.lflist, host_info.rule);
bool allow_tcg = host_info.rule == 1 || host_info.rule == 2;
deckerror = deckManager.CheckDeck(pdeck[dp->type], host_info.lflist, allow_ocg, allow_tcg);
} }
} }
if(deckerror) { if(deckerror) {
......
...@@ -226,9 +226,7 @@ void TagDuel::PlayerReady(DuelPlayer* dp, bool is_ready) { ...@@ -226,9 +226,7 @@ void TagDuel::PlayerReady(DuelPlayer* dp, bool is_ready) {
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 {
bool allow_ocg = host_info.rule == 0 || host_info.rule == 2; deckerror = deckManager.CheckDeck(pdeck[dp->type], host_info.lflist, host_info.rule);
bool allow_tcg = host_info.rule == 1 || host_info.rule == 2;
deckerror = deckManager.CheckDeck(pdeck[dp->type], host_info.lflist, allow_ocg, allow_tcg);
} }
} }
if(deckerror) { if(deckerror) {
......
...@@ -307,6 +307,7 @@ ...@@ -307,6 +307,7 @@
!system 1246 TAG !system 1246 TAG
!system 1247 标准对战 !system 1247 标准对战
!system 1248 自定义 !system 1248 自定义
!system 1249 简体中文
!system 1250 决斗准备 !system 1250 决斗准备
!system 1251 →决斗者 !system 1251 →决斗者
!system 1252 →观战 !system 1252 →观战
......
textures/ot.png

8.26 KB | W: | H:

textures/ot.png

9.92 KB | W: | H:

textures/ot.png
textures/ot.png
textures/ot.png
textures/ot.png
  • 2-up
  • Swipe
  • Onion skin
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