Skip to content

Commit 3e2be8d

Browse files
authored
Redefine CardDataC structure and remove inheritance from card_data (#2867)
1 parent 844a96d commit 3e2be8d

5 files changed

Lines changed: 69 additions & 48 deletions

File tree

gframe/client_field.cpp

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1402,7 +1402,8 @@ bool ClientField::check_sum_trib(std::set<ClientCard*>::const_iterator index, st
14021402
|| check_sum_trib(index, end, acc + l2)
14031403
|| check_sum_trib(index, end, acc);
14041404
}
1405-
static bool is_declarable(const CardData& cd, const std::vector<unsigned int>& opcode) {
1405+
template <class T>
1406+
static bool is_declarable(const T& cd, const std::vector<unsigned int>& opcode) {
14061407
std::stack<int> stack;
14071408
for(auto it = opcode.begin(); it != opcode.end(); ++it) {
14081409
switch(*it) {
@@ -1492,9 +1493,15 @@ static bool is_declarable(const CardData& cd, const std::vector<unsigned int>& o
14921493
}
14931494
case OPCODE_ISSETCARD: {
14941495
if (stack.size() >= 1) {
1495-
int set_code = stack.top();
1496+
uint32_t set_code = stack.top();
14961497
stack.pop();
1497-
bool res = cd.is_setcode(set_code);
1498+
bool res = false;
1499+
for (const auto& x : cd.setcode) {
1500+
if(check_setcode(x, set_code)) {
1501+
res = true;
1502+
break;
1503+
}
1504+
}
14981505
stack.push(res);
14991506
}
15001507
break;

gframe/data_manager.cpp

Lines changed: 24 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -15,31 +15,20 @@ DataManager::DataManager() : _datas(32768), _strings(32768) {
1515
bool DataManager::ReadDB(sqlite3* pDB) {
1616
sqlite3_stmt* pStmt = nullptr;
1717
const char* sql = "select * from datas,texts where datas.id=texts.id";
18-
if (sqlite3_prepare_v2(pDB, sql, -1, &pStmt, 0) != SQLITE_OK)
18+
if (sqlite3_prepare_v2(pDB, sql, -1, &pStmt, nullptr) != SQLITE_OK)
1919
return Error(pDB, pStmt);
2020
wchar_t strBuffer[4096];
2121
int step = 0;
2222
do {
23-
CardDataC cd;
24-
CardString cs;
2523
step = sqlite3_step(pStmt);
2624
if (step == SQLITE_ROW) {
27-
cd.code = sqlite3_column_int(pStmt, 0);
25+
uint32_t code = sqlite3_column_int(pStmt, 0);
26+
auto& cd = _datas[code];
27+
cd.code = code;
2828
cd.ot = sqlite3_column_int(pStmt, 1);
2929
cd.alias = sqlite3_column_int(pStmt, 2);
3030
uint64_t setcode = static_cast<uint64_t>(sqlite3_column_int64(pStmt, 3));
31-
if (setcode) {
32-
auto it = extra_setcode.find(cd.code);
33-
if (it != extra_setcode.end()) {
34-
int len = it->second.size();
35-
if (len > SIZE_SETCODE)
36-
len = SIZE_SETCODE;
37-
if (len)
38-
std::memcpy(cd.setcode, it->second.data(), len * sizeof(uint16_t));
39-
}
40-
else
41-
cd.set_setcode(setcode);
42-
}
31+
write_setcode(cd.setcode, setcode);
4332
cd.type = static_cast<decltype(cd.type)>(sqlite3_column_int64(pStmt, 4));
4433
cd.attack = sqlite3_column_int(pStmt, 5);
4534
cd.defense = sqlite3_column_int(pStmt, 6);
@@ -56,7 +45,7 @@ bool DataManager::ReadDB(sqlite3* pDB) {
5645
cd.race = static_cast<decltype(cd.race)>(sqlite3_column_int64(pStmt, 8));
5746
cd.attribute = static_cast<decltype(cd.attribute)>(sqlite3_column_int64(pStmt, 9));
5847
cd.category = static_cast<decltype(cd.category)>(sqlite3_column_int64(pStmt, 10));
59-
_datas[cd.code] = cd;
48+
auto& cs = _strings[code];
6049
if (const char* text = (const char*)sqlite3_column_text(pStmt, 12)) {
6150
BufferIO::DecodeUTF8(text, strBuffer);
6251
cs.name = strBuffer;
@@ -72,12 +61,21 @@ bool DataManager::ReadDB(sqlite3* pDB) {
7261
cs.desc[i] = strBuffer;
7362
}
7463
}
75-
_strings[cd.code] = cs;
7664
}
7765
else if (step != SQLITE_DONE)
7866
return Error(pDB, pStmt);
7967
} while (step == SQLITE_ROW);
8068
sqlite3_finalize(pStmt);
69+
for (const auto& entry : extra_setcode) {
70+
const auto& code = entry.first;
71+
const auto& list = entry.second;
72+
if (list.size() > SIZE_SETCODE || list.empty())
73+
continue;
74+
auto it = _datas.find(code);
75+
if (it == _datas.end())
76+
continue;
77+
std::memcpy(it->second.setcode, list.data(), list.size() * sizeof(uint16_t));
78+
}
8179
return true;
8280
}
8381
bool DataManager::LoadDB(const wchar_t* wfile) {
@@ -172,10 +170,10 @@ bool DataManager::Error(sqlite3* pDB, sqlite3_stmt* pStmt) {
172170
sqlite3_finalize(pStmt);
173171
return false;
174172
}
175-
code_pointer DataManager::GetCodePointer(unsigned int code) const {
173+
code_pointer DataManager::GetCodePointer(uint32_t code) const {
176174
return _datas.find(code);
177175
}
178-
string_pointer DataManager::GetStringPointer(unsigned int code) const {
176+
string_pointer DataManager::GetStringPointer(uint32_t code) const {
179177
return _strings.find(code);
180178
}
181179
code_pointer DataManager::datas_begin() const {
@@ -190,16 +188,16 @@ string_pointer DataManager::strings_begin() const {
190188
string_pointer DataManager::strings_end() const {
191189
return _strings.cend();
192190
}
193-
bool DataManager::GetData(unsigned int code, CardData* pData) const {
191+
bool DataManager::GetData(uint32_t code, CardData* pData) const {
194192
auto cdit = _datas.find(code);
195193
if(cdit == _datas.end())
196194
return false;
197195
if (pData) {
198-
*pData = cdit->second;
196+
std::memcpy(pData, &cdit->second, sizeof(CardData));
199197
}
200198
return true;
201199
}
202-
bool DataManager::GetString(unsigned int code, CardString* pStr) const {
200+
bool DataManager::GetString(uint32_t code, CardString* pStr) const {
203201
auto csit = _strings.find(code);
204202
if(csit == _strings.end()) {
205203
pStr->name = unknown_string;
@@ -209,23 +207,23 @@ bool DataManager::GetString(unsigned int code, CardString* pStr) const {
209207
*pStr = csit->second;
210208
return true;
211209
}
212-
const wchar_t* DataManager::GetName(unsigned int code) const {
210+
const wchar_t* DataManager::GetName(uint32_t code) const {
213211
auto csit = _strings.find(code);
214212
if(csit == _strings.end())
215213
return unknown_string;
216214
if(!csit->second.name.empty())
217215
return csit->second.name.c_str();
218216
return unknown_string;
219217
}
220-
const wchar_t* DataManager::GetText(unsigned int code) const {
218+
const wchar_t* DataManager::GetText(uint32_t code) const {
221219
auto csit = _strings.find(code);
222220
if(csit == _strings.end())
223221
return unknown_string;
224222
if(!csit->second.text.empty())
225223
return csit->second.text.c_str();
226224
return unknown_string;
227225
}
228-
const wchar_t* DataManager::GetDesc(unsigned int strCode) const {
226+
const wchar_t* DataManager::GetDesc(uint32_t strCode) const {
229227
if (strCode < (MIN_CARD_ID << 4))
230228
return GetSysString(strCode);
231229
unsigned int code = (strCode >> 4) & 0x0fffffff;

gframe/data_manager.h

Lines changed: 33 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -16,18 +16,34 @@ namespace irr {
1616

1717
namespace ygo {
1818
constexpr int MAX_STRING_ID = 0x7ff;
19-
constexpr unsigned int MIN_CARD_ID = (unsigned int)(MAX_STRING_ID + 1) >> 4;
20-
constexpr unsigned int MAX_CARD_ID = 0x0fffffffU;
19+
constexpr uint32_t MIN_CARD_ID = (uint32_t)(MAX_STRING_ID + 1) >> 4;
20+
constexpr uint32_t MAX_CARD_ID = 0x0fffffffU;
2121

2222
using CardData = card_data;
23-
struct CardDataC : card_data {
23+
struct CardDataC {
24+
uint32_t code{};
25+
uint32_t alias{};
26+
uint16_t setcode[SIZE_SETCODE]{};
27+
uint32_t type{};
28+
uint32_t level{};
29+
uint32_t attribute{};
30+
uint32_t race{};
31+
int32_t attack{};
32+
int32_t defense{};
33+
uint32_t lscale{};
34+
uint32_t rscale{};
35+
uint32_t link_marker{};
2436
uint32_t ot{};
2537
uint32_t category{};
2638

2739
bool is_setcodes(const std::vector<unsigned int>& values) const {
2840
for (auto& value : values) {
29-
if (is_setcode(value))
30-
return true;
41+
for (const auto& x : setcode) {
42+
if(!x)
43+
break;
44+
if(check_setcode(x, value))
45+
return true;
46+
}
3147
}
3248
return false;
3349
}
@@ -37,8 +53,8 @@ struct CardString {
3753
std::wstring text;
3854
std::wstring desc[16];
3955
};
40-
using code_pointer = std::unordered_map<unsigned int, CardDataC>::const_iterator;
41-
using string_pointer = std::unordered_map<unsigned int, CardString>::const_iterator;
56+
using code_pointer = std::unordered_map<uint32_t, CardDataC>::const_iterator;
57+
using string_pointer = std::unordered_map<uint32_t, CardString>::const_iterator;
4258

4359
class DataManager {
4460
public:
@@ -50,17 +66,17 @@ class DataManager {
5066
void ReadStringConfLine(const char* linebuf);
5167
bool Error(sqlite3* pDB, sqlite3_stmt* pStmt = nullptr);
5268

53-
code_pointer GetCodePointer(unsigned int code) const;
54-
string_pointer GetStringPointer(unsigned int code) const;
69+
code_pointer GetCodePointer(uint32_t code) const;
70+
string_pointer GetStringPointer(uint32_t code) const;
5571
code_pointer datas_begin() const;
5672
code_pointer datas_end() const;
5773
string_pointer strings_begin() const;
5874
string_pointer strings_end() const;
59-
bool GetData(unsigned int code, CardData* pData) const;
60-
bool GetString(unsigned int code, CardString* pStr) const;
61-
const wchar_t* GetName(unsigned int code) const;
62-
const wchar_t* GetText(unsigned int code) const;
63-
const wchar_t* GetDesc(unsigned int strCode) const;
75+
bool GetData(uint32_t code, CardData* pData) const;
76+
bool GetString(uint32_t code, CardString* pStr) const;
77+
const wchar_t* GetName(uint32_t code) const;
78+
const wchar_t* GetText(uint32_t code) const;
79+
const wchar_t* GetDesc(uint32_t strCode) const;
6480
const wchar_t* GetSysString(int code) const;
6581
const wchar_t* GetVictoryString(int code) const;
6682
const wchar_t* GetCounterName(int code) const;
@@ -98,9 +114,9 @@ class DataManager {
98114
static bool deck_sort_name(code_pointer l1, code_pointer l2);
99115

100116
private:
101-
std::unordered_map<unsigned int, CardDataC> _datas;
102-
std::unordered_map<unsigned int, CardString> _strings;
103-
std::unordered_map<unsigned int, std::vector<uint16_t>> extra_setcode;
117+
std::unordered_map<uint32_t, CardDataC> _datas;
118+
std::unordered_map<uint32_t, CardString> _strings;
119+
std::unordered_map<uint32_t, std::vector<uint16_t>> extra_setcode;
104120
};
105121

106122
extern DataManager dataManager;

gframe/deck_con.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1551,7 +1551,7 @@ void DeckBuilder::FilterCards() {
15511551
match = CardNameContains(strings.name.c_str(), elements_iterator->keyword.c_str());
15521552
} else if (elements_iterator->type == element_t::type_t::setcode) {
15531553
match = data.is_setcodes(elements_iterator->setcodes);
1554-
} else if (trycode && (data.code == trycode || data.alias == trycode && data.is_alternative())){
1554+
} else if (trycode && (data.code == trycode || data.alias == trycode && is_alternative(data.code, data.alias))){
15551555
match = true;
15561556
} else {
15571557
match = CardNameContains(strings.name.c_str(), elements_iterator->keyword.c_str())

gframe/game.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1544,7 +1544,7 @@ void Game::ShowCardInfo(int code, bool resize) {
15441544
imgCard->setImage(imageManager.GetTexture(code, true));
15451545
if (is_valid) {
15461546
auto& cd = cit->second;
1547-
if (cd.is_alternative())
1547+
if (is_alternative(cd.code,cd.alias))
15481548
myswprintf(formatBuffer, L"%ls[%08d]", dataManager.GetName(cd.alias), cd.alias);
15491549
else
15501550
myswprintf(formatBuffer, L"%ls[%08d]", dataManager.GetName(code), code);

0 commit comments

Comments
 (0)