Commit b1551036 authored by fallenstardust's avatar fallenstardust

YGOPro加载和保存卡组时,缓存一下##deckid与###userid,以免同步到卡组广场时被视为新卡组

parent cebfd9c4
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
namespace ygo { namespace ygo {
DeckManager deckManager; DeckManager deckManager;
std::vector<std::wstring> DeckManager::deckComments;
void DeckManager::LoadLFListSingle(const char* path) { void DeckManager::LoadLFListSingle(const char* path) {
auto cur = _lfList.rend(); auto cur = _lfList.rend();
FILE* fp = myfopen(path, "r"); FILE* fp = myfopen(path, "r");
...@@ -259,12 +259,24 @@ uint32_t DeckManager::LoadDeck(Deck& deck, uint32_t dbuf[], int mainc, int sidec ...@@ -259,12 +259,24 @@ uint32_t DeckManager::LoadDeck(Deck& deck, uint32_t dbuf[], int mainc, int sidec
return errorcode; return errorcode;
} }
uint32_t DeckManager::LoadDeckFromStream(Deck& deck, std::istringstream& deckStream, bool is_packlist) { uint32_t DeckManager::LoadDeckFromStream(Deck& deck, std::istringstream& deckStream, bool is_packlist) {
// 清空之前的注释
deckComments.clear();
int ct = 0; int ct = 0;
int mainc = 0, sidec = 0; int mainc = 0, sidec = 0;
uint32_t cardlist[PACK_MAX_SIZE]{}; uint32_t cardlist[PACK_MAX_SIZE]{};
bool is_side = false; bool is_side = false;
std::string linebuf; std::string linebuf;
while (std::getline(deckStream, linebuf, '\n') && ct < PACK_MAX_SIZE) { while (std::getline(deckStream, linebuf, '\n') && ct < PACK_MAX_SIZE) {
// 缓存以##或###开头的注释行
if (linebuf.length() >= 2 && linebuf[0] == '#' && linebuf[1] == '#') {
wchar_t wline[256];
BufferIO::DecodeUTF8(linebuf.c_str(), wline);
deckComments.push_back(wline);
continue;
}
if (linebuf[0] == '!') { if (linebuf[0] == '!') {
is_side = true; is_side = true;
continue; continue;
...@@ -404,26 +416,65 @@ bool DeckManager::LoadCurrentDeck(irr::gui::IGUIComboBox* cbCategory, irr::gui:: ...@@ -404,26 +416,65 @@ bool DeckManager::LoadCurrentDeck(irr::gui::IGUIComboBox* cbCategory, irr::gui::
mainGame->deckBuilder.RefreshPackListScroll(); mainGame->deckBuilder.RefreshPackListScroll();
return true; return true;
} }
/**
* @brief 将卡牌组保存到字符串流中
* @param deck 要保存的卡牌组对象
* @param deckStream 用于存储卡牌组数据的字符串流
*
* 该函数将卡牌组按照特定格式保存到字符串流中,
* 包括主卡组、额外卡组和副卡组的内容
*/
void DeckManager::SaveDeck(const Deck& deck, std::stringstream& deckStream) { void DeckManager::SaveDeck(const Deck& deck, std::stringstream& deckStream) {
// 写入文件头标识和创建者信息
deckStream << "#created by ..." << std::endl; deckStream << "#created by ..." << std::endl;
// 保存主卡组卡片
deckStream << "#main" << std::endl; deckStream << "#main" << std::endl;
for(size_t i = 0; i < deck.main.size(); ++i) for(size_t i = 0; i < deck.main.size(); ++i)
deckStream << deck.main[i]->first << std::endl; deckStream << deck.main[i]->first << std::endl;
// 保存额外卡组卡片
deckStream << "#extra" << std::endl; deckStream << "#extra" << std::endl;
for(size_t i = 0; i < deck.extra.size(); ++i) for(size_t i = 0; i < deck.extra.size(); ++i)
deckStream << deck.extra[i]->first << std::endl; deckStream << deck.extra[i]->first << std::endl;
// 保存副卡组卡片
deckStream << "!side" << std::endl; deckStream << "!side" << std::endl;
for(size_t i = 0; i < deck.side.size(); ++i) for(size_t i = 0; i < deck.side.size(); ++i)
deckStream << deck.side[i]->first << std::endl; deckStream << deck.side[i]->first << std::endl;
// 将缓存的注释写入文件末尾
if (!deckComments.empty()) {
deckStream << "\r\n"; // 添加换行符隔断
for (const auto& comment : deckComments) {
char utf8line[512];
BufferIO::EncodeUTF8(comment.c_str(), utf8line);
deckStream << utf8line << std::endl;
}
}
} }
/**
* @brief 保存卡组数据到指定文件
* @param deck 要保存的卡组对象
* @param file 保存的目标文件路径
* @return 保存成功返回true,失败返回false
*/
bool DeckManager::SaveDeck(const Deck& deck, const wchar_t* file) { bool DeckManager::SaveDeck(const Deck& deck, const wchar_t* file) {
// 检查并创建deck目录
if(!FileSystem::IsDirExists(L"./deck") && !FileSystem::MakeDir(L"./deck")) if(!FileSystem::IsDirExists(L"./deck") && !FileSystem::MakeDir(L"./deck"))
return false; return false;
// 打开卡组文件用于写入
FILE* fp = OpenDeckFile(file, "w"); FILE* fp = OpenDeckFile(file, "w");
if(!fp) if(!fp)
return false; return false;
// 将卡组数据序列化到字符串流中
std::stringstream deckStream; std::stringstream deckStream;
SaveDeck(deck, deckStream); SaveDeck(deck, deckStream);
// 将序列化的数据写入文件
std::fputs(deckStream.str().c_str(), fp); std::fputs(deckStream.str().c_str(), fp);
std::fclose(fp); std::fclose(fp);
return true; return true;
......
...@@ -85,6 +85,8 @@ public: ...@@ -85,6 +85,8 @@ public:
static bool SaveDeckArray(const DeckArray& deck, const wchar_t* name); static bool SaveDeckArray(const DeckArray& deck, const wchar_t* name);
int TypeCount(std::vector<code_pointer> list, unsigned int ctype); int TypeCount(std::vector<code_pointer> list, unsigned int ctype);
private:
static std::vector<std::wstring> deckComments; // 存储以##和###开头的注释行
}; };
extern DeckManager deckManager; extern DeckManager deckManager;
......
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