Commit 17715fe4 authored by Chen Bill's avatar Chen Bill Committed by GitHub

add GetDataTable, GetStringTable (#2905)

* add GetDataTable, GetStringTable

* Refactor table access in ClientField and DeckBuilder

* Refactor LoadDeck to use table lookup

* Refactor loops in DeckBuilder::check_limit
parent 1b1b8edd
...@@ -1547,7 +1547,8 @@ void ClientField::UpdateDeclarableList() { ...@@ -1547,7 +1547,8 @@ void ClientField::UpdateDeclarableList() {
int trycode = BufferIO::GetVal(pname); int trycode = BufferIO::GetVal(pname);
CardData cd; CardData cd;
if (dataManager.GetData(trycode, &cd) && is_declarable(cd, declare_opcodes)) { if (dataManager.GetData(trycode, &cd) && is_declarable(cd, declare_opcodes)) {
auto it = dataManager.GetStringPointer(trycode); auto& _strings = dataManager.GetStringTable();
auto it = _strings.find(trycode);
mainGame->lstANCard->clear(); mainGame->lstANCard->clear();
ancard.clear(); ancard.clear();
mainGame->lstANCard->addItem(it->second.name.c_str()); mainGame->lstANCard->addItem(it->second.name.c_str());
...@@ -1560,19 +1561,23 @@ void ClientField::UpdateDeclarableList() { ...@@ -1560,19 +1561,23 @@ void ClientField::UpdateDeclarableList() {
} }
mainGame->lstANCard->clear(); mainGame->lstANCard->clear();
ancard.clear(); ancard.clear();
for(auto cit = dataManager.strings_begin(); cit != dataManager.strings_end(); ++cit) { auto& _datas = dataManager.GetDataTable();
if(cit->second.name.find(pname) != std::wstring::npos) { auto& _strings = dataManager.GetStringTable();
auto cp = dataManager.GetCodePointer(cit->first); for(auto& entry : _strings) {
if (cp == dataManager.datas_end()) auto& code = entry.first;
auto& str = entry.second;
if(str.name.find(pname) != std::wstring::npos) {
auto cp = _datas.find(code);
if (cp == _datas.end())
continue; continue;
//datas.alias can be double card names or alias //datas.alias can be double card names or alias
if(is_declarable(cp->second, declare_opcodes)) { if(is_declarable(cp->second, declare_opcodes)) {
if(pname == cit->second.name || trycode == cit->first) { //exact match or last used if(pname == str.name || trycode == code) { //exact match or last used
mainGame->lstANCard->insertItem(0, cit->second.name.c_str(), -1); mainGame->lstANCard->insertItem(0, str.name.c_str(), -1);
ancard.insert(ancard.begin(), cit->first); ancard.insert(ancard.begin(), code);
} else { } else {
mainGame->lstANCard->addItem(cit->second.name.c_str()); mainGame->lstANCard->addItem(str.name.c_str());
ancard.push_back(cit->first); ancard.push_back(code);
} }
} }
} }
......
...@@ -68,17 +68,11 @@ public: ...@@ -68,17 +68,11 @@ public:
code_pointer GetCodePointer(uint32_t code) const; code_pointer GetCodePointer(uint32_t code) const;
string_pointer GetStringPointer(uint32_t code) const; string_pointer GetStringPointer(uint32_t code) const;
code_pointer datas_begin() const noexcept { const std::unordered_map<uint32_t, CardDataC>& GetDataTable() const {
return _datas.cbegin(); return _datas;
} }
code_pointer datas_end() const noexcept { const std::unordered_map<uint32_t, CardString>& GetStringTable() const {
return _datas.cend(); return _strings;
}
string_pointer strings_begin() const noexcept {
return _strings.cbegin();
}
string_pointer strings_end() const noexcept {
return _strings.cend();
} }
bool GetData(uint32_t code, CardData* pData) const; bool GetData(uint32_t code, CardData* pData) const;
bool GetString(uint32_t code, CardString* pStr) const; bool GetString(uint32_t code, CardString* pStr) const;
......
...@@ -141,6 +141,7 @@ void DeckBuilder::Terminate() { ...@@ -141,6 +141,7 @@ void DeckBuilder::Terminate() {
bool DeckBuilder::OnEvent(const irr::SEvent& event) { bool DeckBuilder::OnEvent(const irr::SEvent& event) {
if(mainGame->dField.OnCommonEvent(event)) if(mainGame->dField.OnCommonEvent(event))
return false; return false;
auto& _datas = dataManager.GetDataTable();
switch(event.EventType) { switch(event.EventType) {
case irr::EET_GUI_EVENT: { case irr::EET_GUI_EVENT: {
irr::s32 id = event.GUIEvent.Caller->getID(); irr::s32 id = event.GUIEvent.Caller->getID();
...@@ -1074,8 +1075,8 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) { ...@@ -1074,8 +1075,8 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
break; break;
dragx = event.MouseInput.X; dragx = event.MouseInput.X;
dragy = event.MouseInput.Y; dragy = event.MouseInput.Y;
draging_pointer = dataManager.GetCodePointer(hovered_code); draging_pointer = _datas.find(hovered_code);
if(draging_pointer == dataManager.datas_end()) if (draging_pointer == _datas.end())
break; break;
if(hovered_pos == 4) { if(hovered_pos == 4) {
if(!check_limit(draging_pointer)) if(!check_limit(draging_pointer))
...@@ -1128,8 +1129,8 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) { ...@@ -1128,8 +1129,8 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
break; break;
if(hovered_pos == 0 || hovered_seq == -1) if(hovered_pos == 0 || hovered_seq == -1)
break; break;
auto pointer = dataManager.GetCodePointer(hovered_code); auto pointer = _datas.find(hovered_code);
if(pointer == dataManager.datas_end()) if (pointer == _datas.end())
break; break;
soundManager.PlaySoundEffect(SOUND_CARD_DROP); soundManager.PlaySoundEffect(SOUND_CARD_DROP);
if(hovered_pos == 1) { if(hovered_pos == 1) {
...@@ -1163,8 +1164,8 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) { ...@@ -1163,8 +1164,8 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
} else if(hovered_pos == 3) { } else if(hovered_pos == 3) {
pop_side(hovered_seq); pop_side(hovered_seq);
} else { } else {
auto pointer = dataManager.GetCodePointer(hovered_code); auto pointer = _datas.find(hovered_code);
if(pointer == dataManager.datas_end()) if (pointer == _datas.end())
break; break;
if(!check_limit(pointer)) if(!check_limit(pointer))
break; break;
...@@ -1198,8 +1199,8 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) { ...@@ -1198,8 +1199,8 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
break; break;
if (is_draging) if (is_draging)
break; break;
auto pointer = dataManager.GetCodePointer(hovered_code); auto pointer = _datas.find(hovered_code);
if (pointer == dataManager.datas_end()) if (pointer == _datas.end())
break; break;
if(!check_limit(pointer)) if(!check_limit(pointer))
break; break;
...@@ -1468,10 +1469,13 @@ void DeckBuilder::FilterCards() { ...@@ -1468,10 +1469,13 @@ void DeckBuilder::FilterCards() {
query_elements.push_back(element); query_elements.push_back(element);
} }
} }
for(code_pointer ptr = dataManager.datas_begin(); ptr != dataManager.datas_end(); ++ptr) { auto& _datas = dataManager.GetDataTable();
const CardDataC& data = ptr->second; auto& _strings = dataManager.GetStringTable();
auto strpointer = dataManager.GetStringPointer(ptr->first); for (code_pointer ptr = _datas.begin(); ptr != _datas.end(); ++ptr) {
if (strpointer == dataManager.strings_end()) auto& code = ptr->first;
auto& data = ptr->second;
auto strpointer = _strings.find(code);
if (strpointer == _strings.end())
continue; continue;
const CardString& strings = strpointer->second; const CardString& strings = strpointer->second;
if(data.type & TYPE_TOKEN) if(data.type & TYPE_TOKEN)
...@@ -1877,16 +1881,16 @@ bool DeckBuilder::check_limit(code_pointer pointer) { ...@@ -1877,16 +1881,16 @@ bool DeckBuilder::check_limit(code_pointer pointer) {
auto flit = filterList->content.find(limitcode); auto flit = filterList->content.find(limitcode);
if(flit != filterList->content.end()) if(flit != filterList->content.end())
limit = flit->second; limit = flit->second;
for(auto it = deckManager.current_deck.main.begin(); it != deckManager.current_deck.main.end(); ++it) { for (auto& card : deckManager.current_deck.main) {
if((*it)->first == limitcode || (*it)->second.alias == limitcode) if (card->first == limitcode || card->second.alias == limitcode)
limit--; limit--;
} }
for(auto it = deckManager.current_deck.extra.begin(); it != deckManager.current_deck.extra.end(); ++it) { for (auto& card : deckManager.current_deck.extra) {
if((*it)->first == limitcode || (*it)->second.alias == limitcode) if (card->first == limitcode || card->second.alias == limitcode)
limit--; limit--;
} }
for(auto it = deckManager.current_deck.side.begin(); it != deckManager.current_deck.side.end(); ++it) { for (auto& card : deckManager.current_deck.side) {
if((*it)->first == limitcode || (*it)->second.alias == limitcode) if (card->first == limitcode || card->second.alias == limitcode)
limit--; limit--;
} }
return limit > 0; return limit > 0;
......
...@@ -150,42 +150,46 @@ unsigned int DeckManager::CheckDeck(const Deck& deck, unsigned int lfhash, int r ...@@ -150,42 +150,46 @@ unsigned int DeckManager::CheckDeck(const Deck& deck, unsigned int lfhash, int r
uint32_t DeckManager::LoadDeck(Deck& deck, uint32_t dbuf[], int mainc, int sidec, bool is_packlist) { uint32_t DeckManager::LoadDeck(Deck& deck, uint32_t dbuf[], int mainc, int sidec, bool is_packlist) {
deck.clear(); deck.clear();
uint32_t errorcode = 0; uint32_t errorcode = 0;
CardData cd; auto& _datas = dataManager.GetDataTable();
for(int i = 0; i < mainc; ++i) { for(int i = 0; i < mainc; ++i) {
auto code = dbuf[i]; auto code = dbuf[i];
if(!dataManager.GetData(code, &cd)) { auto it = _datas.find(code);
if(it == _datas.end()) {
errorcode = code; errorcode = code;
continue; continue;
} }
auto& cd = it->second;
if (cd.type & TYPE_TOKEN) { if (cd.type & TYPE_TOKEN) {
errorcode = code; errorcode = code;
continue; continue;
} }
if(is_packlist) { if(is_packlist) {
deck.main.push_back(dataManager.GetCodePointer(code)); deck.main.push_back(it);
continue; continue;
} }
if (cd.type & TYPES_EXTRA_DECK) { if (cd.type & TYPES_EXTRA_DECK) {
if (deck.extra.size() < EXTRA_MAX_SIZE) if (deck.extra.size() < EXTRA_MAX_SIZE)
deck.extra.push_back(dataManager.GetCodePointer(code)); deck.extra.push_back(it);
} }
else { else {
if (deck.main.size() < DECK_MAX_SIZE) if (deck.main.size() < DECK_MAX_SIZE)
deck.main.push_back(dataManager.GetCodePointer(code)); deck.main.push_back(it);
} }
} }
for(int i = 0; i < sidec; ++i) { for(int i = 0; i < sidec; ++i) {
auto code = dbuf[mainc + i]; auto code = dbuf[mainc + i];
if(!dataManager.GetData(code, &cd)) { auto it = _datas.find(code);
if(it == _datas.end()) {
errorcode = code; errorcode = code;
continue; continue;
} }
auto& cd = it->second;
if (cd.type & TYPE_TOKEN) { if (cd.type & TYPE_TOKEN) {
errorcode = code; errorcode = code;
continue; continue;
} }
if(deck.side.size() < SIDE_MAX_SIZE) if(deck.side.size() < SIDE_MAX_SIZE)
deck.side.push_back(dataManager.GetCodePointer(code)); deck.side.push_back(it);
} }
return errorcode; return errorcode;
} }
......
...@@ -1536,8 +1536,9 @@ void Game::ShowCardInfo(int code, bool resize) { ...@@ -1536,8 +1536,9 @@ void Game::ShowCardInfo(int code, bool resize) {
if(showingcode == code && !resize) if(showingcode == code && !resize)
return; return;
wchar_t formatBuffer[256]; wchar_t formatBuffer[256];
auto cit = dataManager.GetCodePointer(code); auto& _datas = dataManager.GetDataTable();
bool is_valid = (cit != dataManager.datas_end()); auto cit = _datas.find(code);
bool is_valid = (cit != _datas.end());
imgCard->setImage(imageManager.GetTexture(code, true)); imgCard->setImage(imageManager.GetTexture(code, true));
if (is_valid) { if (is_valid) {
auto& cd = cit->second; auto& cd = cit->second;
...@@ -1558,8 +1559,8 @@ void Game::ShowCardInfo(int code, bool resize) { ...@@ -1558,8 +1559,8 @@ void Game::ShowCardInfo(int code, bool resize) {
if (is_valid && !gameConf.hide_setname) { if (is_valid && !gameConf.hide_setname) {
auto& cd = cit->second; auto& cd = cit->second;
auto target = cit; auto target = cit;
if (cd.alias && dataManager.GetCodePointer(cd.alias) != dataManager.datas_end()) { if (cd.alias && _datas.find(cd.alias) != _datas.end()) {
target = dataManager.GetCodePointer(cd.alias); target = _datas.find(cd.alias);
} }
if (target->second.setcode[0]) { if (target->second.setcode[0]) {
offset = 23;// *yScale; offset = 23;// *yScale;
......
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