Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
Y
YGOMobile
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Locked Files
Issues
0
Issues
0
List
Boards
Labels
Service Desk
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Security & Compliance
Security & Compliance
Dependency List
License Compliance
Packages
Packages
List
Container Registry
Analytics
Analytics
CI / CD
Code Review
Insights
Issues
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
fallenstardust
YGOMobile
Commits
b1551036
Commit
b1551036
authored
Nov 19, 2025
by
fallenstardust
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
YGOPro加载和保存卡组时,缓存一下##deckid与###userid,以免同步到卡组广场时被视为新卡组
parent
cebfd9c4
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
77 additions
and
24 deletions
+77
-24
Classes/gframe/deck_manager.cpp
Classes/gframe/deck_manager.cpp
+75
-24
Classes/gframe/deck_manager.h
Classes/gframe/deck_manager.h
+2
-0
No files found.
Classes/gframe/deck_manager.cpp
View file @
b1551036
...
@@ -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,29 +259,41 @@ uint32_t DeckManager::LoadDeck(Deck& deck, uint32_t dbuf[], int mainc, int sidec
...
@@ -259,29 +259,41 @@ 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
)
{
int
ct
=
0
;
// 清空之前的注释
int
mainc
=
0
,
sidec
=
0
;
deckComments
.
clear
();
uint32_t
cardlist
[
PACK_MAX_SIZE
]{};
bool
is_side
=
false
;
int
ct
=
0
;
std
::
string
linebuf
;
int
mainc
=
0
,
sidec
=
0
;
while
(
std
::
getline
(
deckStream
,
linebuf
,
'\n'
)
&&
ct
<
PACK_MAX_SIZE
)
{
uint32_t
cardlist
[
PACK_MAX_SIZE
]{};
if
(
linebuf
[
0
]
==
'!'
)
{
bool
is_side
=
false
;
is_side
=
true
;
std
::
string
linebuf
;
continue
;
}
while
(
std
::
getline
(
deckStream
,
linebuf
,
'\n'
)
&&
ct
<
PACK_MAX_SIZE
)
{
if
(
linebuf
[
0
]
<
'0'
||
linebuf
[
0
]
>
'9'
)
// 缓存以##或###开头的注释行
continue
;
if
(
linebuf
.
length
()
>=
2
&&
linebuf
[
0
]
==
'#'
&&
linebuf
[
1
]
==
'#'
)
{
errno
=
0
;
wchar_t
wline
[
256
];
auto
code
=
std
::
strtoul
(
linebuf
.
c_str
(),
nullptr
,
10
);
BufferIO
::
DecodeUTF8
(
linebuf
.
c_str
(),
wline
);
if
(
errno
||
code
>
UINT32_MAX
)
deckComments
.
push_back
(
wline
);
continue
;
continue
;
cardlist
[
ct
++
]
=
code
;
}
if
(
is_side
)
++
sidec
;
if
(
linebuf
[
0
]
==
'!'
)
{
else
is_side
=
true
;
++
mainc
;
continue
;
}
}
return
LoadDeck
(
deck
,
cardlist
,
mainc
,
sidec
,
is_packlist
);
if
(
linebuf
[
0
]
<
'0'
||
linebuf
[
0
]
>
'9'
)
continue
;
errno
=
0
;
auto
code
=
std
::
strtoul
(
linebuf
.
c_str
(),
nullptr
,
10
);
if
(
errno
||
code
>
UINT32_MAX
)
continue
;
cardlist
[
ct
++
]
=
code
;
if
(
is_side
)
++
sidec
;
else
++
mainc
;
}
return
LoadDeck
(
deck
,
cardlist
,
mainc
,
sidec
,
is_packlist
);
}
}
bool
DeckManager
::
LoadSide
(
Deck
&
deck
,
uint32_t
dbuf
[],
int
mainc
,
int
sidec
)
{
bool
DeckManager
::
LoadSide
(
Deck
&
deck
,
uint32_t
dbuf
[],
int
mainc
,
int
sidec
)
{
std
::
unordered_map
<
uint32_t
,
int
>
pcount
;
std
::
unordered_map
<
uint32_t
,
int
>
pcount
;
...
@@ -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
;
...
...
Classes/gframe/deck_manager.h
View file @
b1551036
...
@@ -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
;
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment