Commit 3a6724a5 authored by wind2009's avatar wind2009

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

parents fc09d5e9 1ff39351
...@@ -1572,10 +1572,10 @@ void ClientField::UpdateDeclarableList() { ...@@ -1572,10 +1572,10 @@ void ClientField::UpdateDeclarableList() {
if(ancard.size()) if(ancard.size())
return; return;
} }
for(auto cit = dataManager.strings_begin; cit != dataManager.strings_end; ++cit) { for(auto cit = dataManager.strings_begin(); cit != dataManager.strings_end(); ++cit) {
if(cit->second.name.find(pname) != std::wstring::npos) { if(cit->second.name.find(pname) != std::wstring::npos) {
auto cp = dataManager.GetCodePointer(cit->first); auto cp = dataManager.GetCodePointer(cit->first);
if (cp == dataManager.datas_end) if (cp == dataManager.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)) {
......
#include "data_manager.h" #include "data_manager.h"
#include "game.h" #include "game.h"
#include <stdio.h> #include <stdio.h>
#include "spmemvfs/spmemvfs.h"
namespace ygo { namespace ygo {
...@@ -9,47 +10,23 @@ byte DataManager::scriptBuffer[0x20000]; ...@@ -9,47 +10,23 @@ byte DataManager::scriptBuffer[0x20000];
IFileSystem* DataManager::FileSystem; IFileSystem* DataManager::FileSystem;
DataManager dataManager; DataManager dataManager;
DataManager::DataManager() : _datas(16384), _strings(16384) { DataManager::DataManager() : _datas(32768), _strings(32768) {
datas_begin = _datas.begin();
datas_end = _datas.end();
strings_begin = _strings.begin();
strings_end = _strings.end();
extra_setcode = { {8512558u, {0x8f, 0x54, 0x59, 0x82, 0x13a}}, }; extra_setcode = { {8512558u, {0x8f, 0x54, 0x59, 0x82, 0x13a}}, };
} }
bool DataManager::LoadDB(const wchar_t* wfile) { bool DataManager::ReadDB(sqlite3* pDB) {
char file[256]; sqlite3_stmt* pStmt{};
BufferIO::EncodeUTF8(wfile, file);
#ifdef _WIN32
IReadFile* reader = FileSystem->createAndOpenFile(wfile);
#else
IReadFile* reader = FileSystem->createAndOpenFile(file);
#endif
if(reader == NULL)
return false;
spmemvfs_db_t db;
spmembuffer_t* mem = (spmembuffer_t*)calloc(sizeof(spmembuffer_t), 1);
spmemvfs_env_init();
mem->total = mem->used = reader->getSize();
mem->data = (char*)malloc(mem->total + 1);
reader->read(mem->data, mem->total);
reader->drop();
(mem->data)[mem->total] = '\0';
if(spmemvfs_open_db(&db, file, mem) != SQLITE_OK)
return Error(&db);
sqlite3* pDB = db.handle;
sqlite3_stmt* pStmt;
const char* sql = "select * from datas,texts where datas.id=texts.id"; const char* sql = "select * from datas,texts where datas.id=texts.id";
if(sqlite3_prepare_v2(pDB, sql, -1, &pStmt, 0) != SQLITE_OK) if (sqlite3_prepare_v2(pDB, sql, -1, &pStmt, 0) != SQLITE_OK)
return Error(&db); return Error(pDB);
wchar_t strBuffer[4096]; wchar_t strBuffer[4096];
int step = 0; int step = 0;
do { do {
CardDataC cd; CardDataC cd;
CardString cs; CardString cs;
step = sqlite3_step(pStmt); step = sqlite3_step(pStmt);
if(step == SQLITE_BUSY || step == SQLITE_ERROR || step == SQLITE_MISUSE) if (step == SQLITE_BUSY || step == SQLITE_ERROR || step == SQLITE_MISUSE)
return Error(&db, pStmt); return Error(pDB, pStmt);
else if(step == SQLITE_ROW) { else if (step == SQLITE_ROW) {
cd.code = sqlite3_column_int(pStmt, 0); cd.code = sqlite3_column_int(pStmt, 0);
cd.ot = sqlite3_column_int(pStmt, 1); cd.ot = sqlite3_column_int(pStmt, 1);
cd.alias = sqlite3_column_int(pStmt, 2); cd.alias = sqlite3_column_int(pStmt, 2);
...@@ -69,10 +46,11 @@ bool DataManager::LoadDB(const wchar_t* wfile) { ...@@ -69,10 +46,11 @@ bool DataManager::LoadDB(const wchar_t* wfile) {
cd.type = sqlite3_column_int(pStmt, 4); cd.type = sqlite3_column_int(pStmt, 4);
cd.attack = sqlite3_column_int(pStmt, 5); cd.attack = sqlite3_column_int(pStmt, 5);
cd.defense = sqlite3_column_int(pStmt, 6); cd.defense = sqlite3_column_int(pStmt, 6);
if(cd.type & TYPE_LINK) { if (cd.type & TYPE_LINK) {
cd.link_marker = cd.defense; cd.link_marker = cd.defense;
cd.defense = 0; cd.defense = 0;
} else }
else
cd.link_marker = 0; cd.link_marker = 0;
unsigned int level = sqlite3_column_int(pStmt, 7); unsigned int level = sqlite3_column_int(pStmt, 7);
cd.level = level & 0xff; cd.level = level & 0xff;
...@@ -82,31 +60,52 @@ bool DataManager::LoadDB(const wchar_t* wfile) { ...@@ -82,31 +60,52 @@ bool DataManager::LoadDB(const wchar_t* wfile) {
cd.attribute = sqlite3_column_int(pStmt, 9); cd.attribute = sqlite3_column_int(pStmt, 9);
cd.category = sqlite3_column_int(pStmt, 10); cd.category = sqlite3_column_int(pStmt, 10);
_datas[cd.code] = cd; _datas[cd.code] = cd;
if(const char* text = (const char*)sqlite3_column_text(pStmt, 12)) { if (const char* text = (const char*)sqlite3_column_text(pStmt, 12)) {
BufferIO::DecodeUTF8(text, strBuffer); BufferIO::DecodeUTF8(text, strBuffer);
cs.name = strBuffer; cs.name = strBuffer;
} }
if(const char* text = (const char*)sqlite3_column_text(pStmt, 13)) { if (const char* text = (const char*)sqlite3_column_text(pStmt, 13)) {
BufferIO::DecodeUTF8(text, strBuffer); BufferIO::DecodeUTF8(text, strBuffer);
cs.text = strBuffer; cs.text = strBuffer;
} }
for(int i = 0; i < 16; ++i) { for (int i = 0; i < 16; ++i) {
if(const char* text = (const char*)sqlite3_column_text(pStmt, i + 14)) { if (const char* text = (const char*)sqlite3_column_text(pStmt, i + 14)) {
BufferIO::DecodeUTF8(text, strBuffer); BufferIO::DecodeUTF8(text, strBuffer);
cs.desc[i] = strBuffer; cs.desc[i] = strBuffer;
} }
} }
_strings[cd.code] = cs; _strings[cd.code] = cs;
} }
} while(step != SQLITE_DONE); } while (step != SQLITE_DONE);
sqlite3_finalize(pStmt); sqlite3_finalize(pStmt);
return true;
}
bool DataManager::LoadDB(const wchar_t* wfile) {
char file[256];
BufferIO::EncodeUTF8(wfile, file);
#ifdef _WIN32
IReadFile* reader = FileSystem->createAndOpenFile(wfile);
#else
IReadFile* reader = FileSystem->createAndOpenFile(file);
#endif
if(reader == NULL)
return false;
spmemvfs_db_t db;
spmembuffer_t* mem = (spmembuffer_t*)calloc(sizeof(spmembuffer_t), 1);
spmemvfs_env_init();
mem->total = mem->used = reader->getSize();
mem->data = (char*)malloc(mem->total + 1);
reader->read(mem->data, mem->total);
reader->drop();
(mem->data)[mem->total] = '\0';
bool ret{};
if (spmemvfs_open_db(&db, file, mem) != SQLITE_OK)
ret = Error(db.handle);
else
ret = ReadDB(db.handle);
spmemvfs_close_db(&db); spmemvfs_close_db(&db);
spmemvfs_env_fini(); spmemvfs_env_fini();
datas_begin = _datas.begin(); return ret;
datas_end = _datas.end();
strings_begin = _strings.begin();
strings_end = _strings.end();
return true;
} }
bool DataManager::LoadStrings(const char* file) { bool DataManager::LoadStrings(const char* file) {
FILE* fp = fopen(file, "r"); FILE* fp = fopen(file, "r");
...@@ -167,43 +166,41 @@ void DataManager::ReadStringConfLine(const char* linebuf) { ...@@ -167,43 +166,41 @@ void DataManager::ReadStringConfLine(const char* linebuf) {
_setnameStrings[value] = strBuffer; _setnameStrings[value] = strBuffer;
} }
} }
bool DataManager::Error(spmemvfs_db_t* pDB, sqlite3_stmt* pStmt) { bool DataManager::Error(sqlite3* pDB, sqlite3_stmt* pStmt) {
wchar_t strBuffer[4096]; errmsg[0] = '\0';
BufferIO::DecodeUTF8(sqlite3_errmsg(pDB->handle), strBuffer); std::strncat(errmsg, sqlite3_errmsg(pDB), sizeof errmsg - 1);
if(pStmt) if(pStmt)
sqlite3_finalize(pStmt); sqlite3_finalize(pStmt);
spmemvfs_close_db(pDB);
spmemvfs_env_fini();
return false; return false;
} }
bool DataManager::GetData(unsigned int code, CardData* pData) {
code_pointer cdit = _datas.find(code);
if(cdit == _datas.end())
return false;
auto& data = cdit->second;
if (pData) {
pData->code = data.code;
pData->alias = data.alias;
std::memcpy(pData->setcode, data.setcode, SIZE_SETCODE);
pData->type = data.type;
pData->level = data.level;
pData->attribute = data.attribute;
pData->race = data.race;
pData->attack = data.attack;
pData->defense = data.defense;
pData->lscale = data.lscale;
pData->rscale = data.rscale;
pData->link_marker = data.link_marker;
}
return true;
}
code_pointer DataManager::GetCodePointer(unsigned int code) const { code_pointer DataManager::GetCodePointer(unsigned int code) const {
return _datas.find(code); return _datas.find(code);
} }
string_pointer DataManager::GetStringPointer(unsigned int code) const { string_pointer DataManager::GetStringPointer(unsigned int code) const {
return _strings.find(code); return _strings.find(code);
} }
bool DataManager::GetString(unsigned int code, CardString* pStr) { code_pointer DataManager::datas_begin() {
return _datas.cbegin();
}
code_pointer DataManager::datas_end() {
return _datas.cend();
}
string_pointer DataManager::strings_begin() {
return _strings.cbegin();
}
string_pointer DataManager::strings_end() {
return _strings.cend();
}
bool DataManager::GetData(unsigned int code, CardData* pData) const {
auto cdit = _datas.find(code);
if(cdit == _datas.end())
return false;
if (pData) {
*pData = cdit->second;
}
return true;
}
bool DataManager::GetString(unsigned int code, CardString* pStr) const {
auto csit = _strings.find(code); auto csit = _strings.find(code);
if(csit == _strings.end()) { if(csit == _strings.end()) {
pStr->name = unknown_string; pStr->name = unknown_string;
...@@ -213,7 +210,7 @@ bool DataManager::GetString(unsigned int code, CardString* pStr) { ...@@ -213,7 +210,7 @@ bool DataManager::GetString(unsigned int code, CardString* pStr) {
*pStr = csit->second; *pStr = csit->second;
return true; return true;
} }
const wchar_t* DataManager::GetName(unsigned int code) { const wchar_t* DataManager::GetName(unsigned int code) const {
auto csit = _strings.find(code); auto csit = _strings.find(code);
if(csit == _strings.end()) if(csit == _strings.end())
return unknown_string; return unknown_string;
...@@ -221,7 +218,7 @@ const wchar_t* DataManager::GetName(unsigned int code) { ...@@ -221,7 +218,7 @@ const wchar_t* DataManager::GetName(unsigned int code) {
return csit->second.name.c_str(); return csit->second.name.c_str();
return unknown_string; return unknown_string;
} }
const wchar_t* DataManager::GetText(unsigned int code) { const wchar_t* DataManager::GetText(unsigned int code) const {
auto csit = _strings.find(code); auto csit = _strings.find(code);
if(csit == _strings.end()) if(csit == _strings.end())
return unknown_string; return unknown_string;
...@@ -229,7 +226,7 @@ const wchar_t* DataManager::GetText(unsigned int code) { ...@@ -229,7 +226,7 @@ const wchar_t* DataManager::GetText(unsigned int code) {
return csit->second.text.c_str(); return csit->second.text.c_str();
return unknown_string; return unknown_string;
} }
const wchar_t* DataManager::GetDesc(unsigned int strCode) { const wchar_t* DataManager::GetDesc(unsigned int strCode) const {
if (strCode < (MIN_CARD_ID << 4)) if (strCode < (MIN_CARD_ID << 4))
return GetSysString(strCode); return GetSysString(strCode);
unsigned int code = (strCode >> 4) & 0x0fffffff; unsigned int code = (strCode >> 4) & 0x0fffffff;
...@@ -241,7 +238,7 @@ const wchar_t* DataManager::GetDesc(unsigned int strCode) { ...@@ -241,7 +238,7 @@ const wchar_t* DataManager::GetDesc(unsigned int strCode) {
return csit->second.desc[offset].c_str(); return csit->second.desc[offset].c_str();
return unknown_string; return unknown_string;
} }
const wchar_t* DataManager::GetSysString(int code) { const wchar_t* DataManager::GetSysString(int code) const {
if (code < 0 || code > MAX_STRING_ID) if (code < 0 || code > MAX_STRING_ID)
return unknown_string; return unknown_string;
auto csit = _sysStrings.find(code); auto csit = _sysStrings.find(code);
...@@ -249,25 +246,25 @@ const wchar_t* DataManager::GetSysString(int code) { ...@@ -249,25 +246,25 @@ const wchar_t* DataManager::GetSysString(int code) {
return unknown_string; return unknown_string;
return csit->second.c_str(); return csit->second.c_str();
} }
const wchar_t* DataManager::GetVictoryString(int code) { const wchar_t* DataManager::GetVictoryString(int code) const {
auto csit = _victoryStrings.find(code); auto csit = _victoryStrings.find(code);
if(csit == _victoryStrings.end()) if(csit == _victoryStrings.end())
return unknown_string; return unknown_string;
return csit->second.c_str(); return csit->second.c_str();
} }
const wchar_t* DataManager::GetCounterName(int code) { const wchar_t* DataManager::GetCounterName(int code) const {
auto csit = _counterStrings.find(code); auto csit = _counterStrings.find(code);
if(csit == _counterStrings.end()) if(csit == _counterStrings.end())
return unknown_string; return unknown_string;
return csit->second.c_str(); return csit->second.c_str();
} }
const wchar_t* DataManager::GetSetName(int code) { const wchar_t* DataManager::GetSetName(int code) const {
auto csit = _setnameStrings.find(code); auto csit = _setnameStrings.find(code);
if(csit == _setnameStrings.end()) if(csit == _setnameStrings.end())
return NULL; return nullptr;
return csit->second.c_str(); return csit->second.c_str();
} }
std::vector<unsigned int> DataManager::GetSetCodes(std::wstring setname) { std::vector<unsigned int> DataManager::GetSetCodes(std::wstring setname) const {
std::vector<unsigned int> matchingCodes; std::vector<unsigned int> matchingCodes;
for(auto csit = _setnameStrings.begin(); csit != _setnameStrings.end(); ++csit) { for(auto csit = _setnameStrings.begin(); csit != _setnameStrings.end(); ++csit) {
auto xpos = csit->second.find_first_of(L'|');//setname|another setname or extra info auto xpos = csit->second.find_first_of(L'|');//setname|another setname or extra info
...@@ -297,8 +294,8 @@ const wchar_t* DataManager::GetNumString(int num, bool bracket) { ...@@ -297,8 +294,8 @@ const wchar_t* DataManager::GetNumString(int num, bool bracket) {
*++p = 0; *++p = 0;
return numBuffer; return numBuffer;
} }
const wchar_t* DataManager::FormatLocation(int location, int sequence) { const wchar_t* DataManager::FormatLocation(int location, int sequence) const {
if(location == 0x8) { if(location == LOCATION_SZONE) {
if(sequence < 5) if(sequence < 5)
return GetSysString(1003); return GetSysString(1003);
else if(sequence == 5) else if(sequence == 5)
...@@ -306,12 +303,16 @@ const wchar_t* DataManager::FormatLocation(int location, int sequence) { ...@@ -306,12 +303,16 @@ const wchar_t* DataManager::FormatLocation(int location, int sequence) {
else else
return GetSysString(1009); return GetSysString(1009);
} }
unsigned filter = 1;
int i = 1000; int i = 1000;
for(; filter != 0x100 && filter != location; filter <<= 1) int string_id = 0;
++i; for (unsigned filter = LOCATION_DECK; filter <= LOCATION_PZONE; filter <<= 1, ++i) {
if(filter == location) if (filter == location) {
return GetSysString(i); string_id = i;
break;
}
}
if (string_id)
return GetSysString(string_id);
else else
return unknown_string; return unknown_string;
} }
......
...@@ -2,10 +2,9 @@ ...@@ -2,10 +2,9 @@
#define DATAMANAGER_H #define DATAMANAGER_H
#include "config.h" #include "config.h"
#include "sqlite3.h"
#include "spmemvfs/spmemvfs.h"
#include "client_card.h"
#include <unordered_map> #include <unordered_map>
#include <sqlite3.h>
#include "client_card.h"
namespace ygo { namespace ygo {
constexpr int MAX_STRING_ID = 0x7ff; constexpr int MAX_STRING_ID = 0x7ff;
...@@ -14,25 +13,31 @@ namespace ygo { ...@@ -14,25 +13,31 @@ namespace ygo {
class DataManager { class DataManager {
public: public:
DataManager(); DataManager();
bool ReadDB(sqlite3* pDB);
bool LoadDB(const wchar_t* wfile); bool LoadDB(const wchar_t* wfile);
bool LoadStrings(const char* file); bool LoadStrings(const char* file);
bool LoadStrings(IReadFile* reader); bool LoadStrings(IReadFile* reader);
void ReadStringConfLine(const char* linebuf); void ReadStringConfLine(const char* linebuf);
bool Error(spmemvfs_db_t* pDB, sqlite3_stmt* pStmt = 0); bool Error(sqlite3* pDB, sqlite3_stmt* pStmt = nullptr);
bool GetData(unsigned int code, CardData* pData);
code_pointer GetCodePointer(unsigned int code) const; code_pointer GetCodePointer(unsigned int code) const;
string_pointer GetStringPointer(unsigned int code) const; string_pointer GetStringPointer(unsigned int code) const;
bool GetString(unsigned int code, CardString* pStr); code_pointer datas_begin();
const wchar_t* GetName(unsigned int code); code_pointer datas_end();
const wchar_t* GetText(unsigned int code); string_pointer strings_begin();
const wchar_t* GetDesc(unsigned int strCode); string_pointer strings_end();
const wchar_t* GetSysString(int code); bool GetData(unsigned int code, CardData* pData) const;
const wchar_t* GetVictoryString(int code); bool GetString(unsigned int code, CardString* pStr) const;
const wchar_t* GetCounterName(int code); const wchar_t* GetName(unsigned int code) const;
const wchar_t* GetSetName(int code); const wchar_t* GetText(unsigned int code) const;
std::vector<unsigned int> GetSetCodes(std::wstring setname); const wchar_t* GetDesc(unsigned int strCode) const;
const wchar_t* GetSysString(int code) const;
const wchar_t* GetVictoryString(int code) const;
const wchar_t* GetCounterName(int code) const;
const wchar_t* GetSetName(int code) const;
std::vector<unsigned int> GetSetCodes(std::wstring setname) const;
const wchar_t* GetNumString(int num, bool bracket = false); const wchar_t* GetNumString(int num, bool bracket = false);
const wchar_t* FormatLocation(int location, int sequence); const wchar_t* FormatLocation(int location, int sequence) const;
const wchar_t* FormatAttribute(int attribute); const wchar_t* FormatAttribute(int attribute);
const wchar_t* FormatRace(int race); const wchar_t* FormatRace(int race);
const wchar_t* FormatType(int type); const wchar_t* FormatType(int type);
...@@ -43,10 +48,7 @@ public: ...@@ -43,10 +48,7 @@ public:
std::unordered_map<unsigned int, std::wstring> _victoryStrings; std::unordered_map<unsigned int, std::wstring> _victoryStrings;
std::unordered_map<unsigned int, std::wstring> _setnameStrings; std::unordered_map<unsigned int, std::wstring> _setnameStrings;
std::unordered_map<unsigned int, std::wstring> _sysStrings; std::unordered_map<unsigned int, std::wstring> _sysStrings;
code_pointer datas_begin; char errmsg[512]{};
code_pointer datas_end;
string_pointer strings_begin;
string_pointer strings_end;
wchar_t numStrings[301][4]{}; wchar_t numStrings[301][4]{};
wchar_t numBuffer[6]{}; wchar_t numBuffer[6]{};
......
...@@ -1058,7 +1058,7 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) { ...@@ -1058,7 +1058,7 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
dragx = event.MouseInput.X; dragx = event.MouseInput.X;
dragy = event.MouseInput.Y; dragy = event.MouseInput.Y;
draging_pointer = dataManager.GetCodePointer(hovered_code); draging_pointer = dataManager.GetCodePointer(hovered_code);
if(draging_pointer == dataManager.datas_end) if(draging_pointer == dataManager.datas_end())
break; break;
if(hovered_pos == 4) { if(hovered_pos == 4) {
if(!check_limit(draging_pointer)) if(!check_limit(draging_pointer))
...@@ -1112,7 +1112,7 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) { ...@@ -1112,7 +1112,7 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
if(hovered_pos == 0 || hovered_seq == -1) if(hovered_pos == 0 || hovered_seq == -1)
break; break;
auto pointer = dataManager.GetCodePointer(hovered_code); auto pointer = dataManager.GetCodePointer(hovered_code);
if(pointer == dataManager.datas_end) if(pointer == dataManager.datas_end())
break; break;
soundManager.PlaySoundEffect(SOUND_CARD_DROP); soundManager.PlaySoundEffect(SOUND_CARD_DROP);
if(hovered_pos == 1) { if(hovered_pos == 1) {
...@@ -1147,7 +1147,7 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) { ...@@ -1147,7 +1147,7 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
pop_side(hovered_seq); pop_side(hovered_seq);
} else { } else {
auto pointer = dataManager.GetCodePointer(hovered_code); auto pointer = dataManager.GetCodePointer(hovered_code);
if(pointer == dataManager.datas_end) if(pointer == dataManager.datas_end())
break; break;
if(!check_limit(pointer)) if(!check_limit(pointer))
break; break;
...@@ -1182,7 +1182,7 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) { ...@@ -1182,7 +1182,7 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
if (is_draging) if (is_draging)
break; break;
auto pointer = dataManager.GetCodePointer(hovered_code); auto pointer = dataManager.GetCodePointer(hovered_code);
if (pointer == dataManager.datas_end) if (pointer == dataManager.datas_end())
break; break;
if(!check_limit(pointer)) if(!check_limit(pointer))
break; break;
...@@ -1452,10 +1452,10 @@ void DeckBuilder::FilterCards() { ...@@ -1452,10 +1452,10 @@ 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) { for(code_pointer ptr = dataManager.datas_begin(); ptr != dataManager.datas_end(); ++ptr) {
const CardDataC& data = ptr->second; const CardDataC& data = ptr->second;
auto strpointer = dataManager.GetStringPointer(ptr->first); auto strpointer = dataManager.GetStringPointer(ptr->first);
if (strpointer == dataManager.strings_end) if (strpointer == dataManager.strings_end())
continue; continue;
const CardString& text = strpointer->second; const CardString& text = strpointer->second;
if(data.type & TYPE_TOKEN) if(data.type & TYPE_TOKEN)
......
...@@ -2586,11 +2586,14 @@ void ClientField::ShowCardInfoInList(ClientCard* pcard, irr::gui::IGUIElement* e ...@@ -2586,11 +2586,14 @@ void ClientField::ShowCardInfoInList(ClientCard* pcard, irr::gui::IGUIElement* e
} }
} }
void ClientField::SetResponseSelectedCards() const { void ClientField::SetResponseSelectedCards() const {
unsigned char respbuf[SIZE_RETURN_VALUE]; unsigned char respbuf[SIZE_RETURN_VALUE]{};
respbuf[0] = selected_cards.size(); int len = (int)selected_cards.size();
for (size_t i = 0; i < selected_cards.size(); ++i) if (len > UINT8_MAX)
len = UINT8_MAX;
respbuf[0] = (unsigned char)len;
for (int i = 0; i < len; ++i)
respbuf[i + 1] = selected_cards[i]->select_seq; respbuf[i + 1] = selected_cards[i]->select_seq;
DuelClient::SetResponseB(respbuf, selected_cards.size() + 1); DuelClient::SetResponseB(respbuf, len + 1);
} }
void ClientField::SetResponseSelectedOption() const { void ClientField::SetResponseSelectedOption() const {
if(mainGame->dInfo.curMsg == MSG_SELECT_OPTION) { if(mainGame->dInfo.curMsg == MSG_SELECT_OPTION) {
......
...@@ -1823,7 +1823,7 @@ void Game::ShowCardInfo(int code, bool resize) { ...@@ -1823,7 +1823,7 @@ void Game::ShowCardInfo(int code, bool resize) {
return; return;
wchar_t formatBuffer[256]; wchar_t formatBuffer[256];
auto cit = dataManager.GetCodePointer(code); auto cit = dataManager.GetCodePointer(code);
bool is_valid = (cit != dataManager.datas_end); bool is_valid = (cit != dataManager.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;
...@@ -1840,7 +1840,7 @@ void Game::ShowCardInfo(int code, bool resize) { ...@@ -1840,7 +1840,7 @@ 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 && dataManager.GetCodePointer(cd.alias) != dataManager.datas_end()) {
target = dataManager.GetCodePointer(cd.alias); target = dataManager.GetCodePointer(cd.alias);
} }
if (target->second.setcode[0]) { if (target->second.setcode[0]) {
......
...@@ -208,26 +208,25 @@ inline unsigned int GetPosition(unsigned char* qbuf, int offset) { ...@@ -208,26 +208,25 @@ inline unsigned int GetPosition(unsigned char* qbuf, int offset) {
class DuelMode { class DuelMode {
public: public:
virtual ~DuelMode() {} DuelMode() = default;
virtual void Chat(DuelPlayer* dp, unsigned char* pdata, int len) {} virtual ~DuelMode() = default;
virtual void JoinGame(DuelPlayer* dp, unsigned char* pdata, bool is_creater) {} virtual void Chat(DuelPlayer* dp, unsigned char* pdata, int len) = 0;
virtual void LeaveGame(DuelPlayer* dp) {} virtual void JoinGame(DuelPlayer* dp, unsigned char* pdata, bool is_creater) = 0;
virtual void ToDuelist(DuelPlayer* dp) {} virtual void LeaveGame(DuelPlayer* dp) = 0;
virtual void ToObserver(DuelPlayer* dp) {} virtual void ToDuelist(DuelPlayer* dp) = 0;
virtual void PlayerReady(DuelPlayer* dp, bool is_ready) {} virtual void ToObserver(DuelPlayer* dp) = 0;
virtual void PlayerKick(DuelPlayer* dp, unsigned char pos) {} virtual void PlayerReady(DuelPlayer* dp, bool is_ready) = 0;
virtual void UpdateDeck(DuelPlayer* dp, unsigned char* pdata, int len) {} virtual void PlayerKick(DuelPlayer* dp, unsigned char pos) = 0;
virtual void StartDuel(DuelPlayer* dp) {} virtual void UpdateDeck(DuelPlayer* dp, unsigned char* pdata, int len) = 0;
virtual void HandResult(DuelPlayer* dp, unsigned char res) {} virtual void StartDuel(DuelPlayer* dp) = 0;
virtual void TPResult(DuelPlayer* dp, unsigned char tp) {} virtual void HandResult(DuelPlayer* dp, unsigned char res) = 0;
virtual void Process() {} virtual void TPResult(DuelPlayer* dp, unsigned char tp) = 0;
virtual int Analyze(char* msgbuffer, unsigned int len) { virtual void Process() = 0;
return 0; virtual int Analyze(unsigned char* msgbuffer, unsigned int len) = 0;
} virtual void Surrender(DuelPlayer* dp) = 0;
virtual void Surrender(DuelPlayer* dp) {} virtual void GetResponse(DuelPlayer* dp, unsigned char* pdata, unsigned int len) = 0;
virtual void GetResponse(DuelPlayer* dp, unsigned char* pdata, unsigned int len) {} virtual void TimeConfirm(DuelPlayer* dp) = 0;
virtual void TimeConfirm(DuelPlayer* dp) {} virtual void EndDuel() = 0;
virtual void EndDuel() {}
public: public:
event* etimer { nullptr }; event* etimer { nullptr };
......
...@@ -236,7 +236,7 @@ bool ReplayMode::StartDuel() { ...@@ -236,7 +236,7 @@ bool ReplayMode::StartDuel() {
} }
cur_replay.ReadData(filename, slen); cur_replay.ReadData(filename, slen);
filename[slen] = 0; filename[slen] = 0;
if(!preload_script(pduel, filename, 0)) { if(!preload_script(pduel, filename)) {
return false; return false;
} }
} }
......
...@@ -10,24 +10,24 @@ namespace ygo { ...@@ -10,24 +10,24 @@ namespace ygo {
class SingleDuel: public DuelMode { class SingleDuel: public DuelMode {
public: public:
SingleDuel(bool is_match); SingleDuel(bool is_match);
virtual ~SingleDuel(); ~SingleDuel() override;
virtual void Chat(DuelPlayer* dp, unsigned char* pdata, int len); void Chat(DuelPlayer* dp, unsigned char* pdata, int len) override;
virtual void JoinGame(DuelPlayer* dp, unsigned char* pdata, bool is_creater); void JoinGame(DuelPlayer* dp, unsigned char* pdata, bool is_creater) override;
virtual void LeaveGame(DuelPlayer* dp); void LeaveGame(DuelPlayer* dp) override;
virtual void ToDuelist(DuelPlayer* dp); void ToDuelist(DuelPlayer* dp) override;
virtual void ToObserver(DuelPlayer* dp); void ToObserver(DuelPlayer* dp) override;
virtual void PlayerReady(DuelPlayer* dp, bool ready); void PlayerReady(DuelPlayer* dp, bool ready) override;
virtual void PlayerKick(DuelPlayer* dp, unsigned char pos); void PlayerKick(DuelPlayer* dp, unsigned char pos) override;
virtual void UpdateDeck(DuelPlayer* dp, unsigned char* pdata, int len); void UpdateDeck(DuelPlayer* dp, unsigned char* pdata, int len) override;
virtual void StartDuel(DuelPlayer* dp); void StartDuel(DuelPlayer* dp) override;
virtual void HandResult(DuelPlayer* dp, unsigned char res); void HandResult(DuelPlayer* dp, unsigned char res) override;
virtual void TPResult(DuelPlayer* dp, unsigned char tp); void TPResult(DuelPlayer* dp, unsigned char tp) override;
virtual void Process(); void Process() override;
virtual void Surrender(DuelPlayer* dp); void Surrender(DuelPlayer* dp) override;
virtual int Analyze(unsigned char* msgbuffer, unsigned int len); int Analyze(unsigned char* msgbuffer, unsigned int len) override;
virtual void GetResponse(DuelPlayer* dp, unsigned char* pdata, unsigned int len); void GetResponse(DuelPlayer* dp, unsigned char* pdata, unsigned int len) override;
virtual void TimeConfirm(DuelPlayer* dp); void TimeConfirm(DuelPlayer* dp) override;
virtual void EndDuel(); void EndDuel() override;
void DuelEndProc(); void DuelEndProc();
void WaitforResponse(int playerid); void WaitforResponse(int playerid);
......
...@@ -63,11 +63,11 @@ int SingleMode::SinglePlayThread() { ...@@ -63,11 +63,11 @@ int SingleMode::SinglePlayThread() {
if(open_file) { if(open_file) {
open_file = false; open_file = false;
slen = BufferIO::EncodeUTF8(open_file_name, filename); slen = BufferIO::EncodeUTF8(open_file_name, filename);
if(!preload_script(pduel, filename, 0)) { if(!preload_script(pduel, filename)) {
wchar_t fname[256]; wchar_t fname[256];
myswprintf(fname, L"./single/%ls", open_file_name); myswprintf(fname, L"./single/%ls", open_file_name);
slen = BufferIO::EncodeUTF8(fname, filename); slen = BufferIO::EncodeUTF8(fname, filename);
if(!preload_script(pduel, filename, 0)) if(!preload_script(pduel, filename))
slen = 0; slen = 0;
} }
} else { } else {
...@@ -75,7 +75,7 @@ int SingleMode::SinglePlayThread() { ...@@ -75,7 +75,7 @@ int SingleMode::SinglePlayThread() {
wchar_t fname[256]; wchar_t fname[256];
myswprintf(fname, L"./single/%ls", name); myswprintf(fname, L"./single/%ls", name);
slen = BufferIO::EncodeUTF8(fname, filename); slen = BufferIO::EncodeUTF8(fname, filename);
if(!preload_script(pduel, filename, 0)) if(!preload_script(pduel, filename))
slen = 0; slen = 0;
} }
if(slen == 0) { if(slen == 0) {
......
...@@ -10,24 +10,24 @@ namespace ygo { ...@@ -10,24 +10,24 @@ namespace ygo {
class TagDuel: public DuelMode { class TagDuel: public DuelMode {
public: public:
TagDuel(); TagDuel();
virtual ~TagDuel(); ~TagDuel() override;
virtual void Chat(DuelPlayer* dp, unsigned char* pdata, int len); void Chat(DuelPlayer* dp, unsigned char* pdata, int len) override;
virtual void JoinGame(DuelPlayer* dp, unsigned char* pdata, bool is_creater); void JoinGame(DuelPlayer* dp, unsigned char* pdata, bool is_creater) override;
virtual void LeaveGame(DuelPlayer* dp); void LeaveGame(DuelPlayer* dp) override;
virtual void ToDuelist(DuelPlayer* dp); void ToDuelist(DuelPlayer* dp) override;
virtual void ToObserver(DuelPlayer* dp); void ToObserver(DuelPlayer* dp) override;
virtual void PlayerReady(DuelPlayer* dp, bool ready); void PlayerReady(DuelPlayer* dp, bool ready) override;
virtual void PlayerKick(DuelPlayer* dp, unsigned char pos); void PlayerKick(DuelPlayer* dp, unsigned char pos) override;
virtual void UpdateDeck(DuelPlayer* dp, unsigned char* pdata, int len); void UpdateDeck(DuelPlayer* dp, unsigned char* pdata, int len) override;
virtual void StartDuel(DuelPlayer* dp); void StartDuel(DuelPlayer* dp) override;
virtual void HandResult(DuelPlayer* dp, unsigned char res); void HandResult(DuelPlayer* dp, unsigned char res) override;
virtual void TPResult(DuelPlayer* dp, unsigned char tp); void TPResult(DuelPlayer* dp, unsigned char tp) override;
virtual void Process(); void Process() override;
virtual void Surrender(DuelPlayer* dp); void Surrender(DuelPlayer* dp) override;
virtual int Analyze(unsigned char* msgbuffer, unsigned int len); int Analyze(unsigned char* msgbuffer, unsigned int len) override;
virtual void GetResponse(DuelPlayer* dp, unsigned char* pdata, unsigned int len); void GetResponse(DuelPlayer* dp, unsigned char* pdata, unsigned int len) override;
virtual void TimeConfirm(DuelPlayer* dp); void TimeConfirm(DuelPlayer* dp) override;
virtual void EndDuel(); void EndDuel() override;
void DuelEndProc(); void DuelEndProc();
void WaitforResponse(int playerid); void WaitforResponse(int playerid);
......
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