Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
Y
YGOMobile-Cn-Ko-En
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-Cn-Ko-En
Commits
a6a2506e
Commit
a6a2506e
authored
Aug 29, 2025
by
fallenstardust
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
sync ocgcore
update gframe
parent
17fc7188
Changes
9
Show whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
70 additions
and
61 deletions
+70
-61
Classes/gframe/client_field.cpp
Classes/gframe/client_field.cpp
+16
-11
Classes/gframe/data_manager.cpp
Classes/gframe/data_manager.cpp
+1
-3
Classes/gframe/data_manager.h
Classes/gframe/data_manager.h
+6
-13
Classes/gframe/deck_con.cpp
Classes/gframe/deck_con.cpp
+22
-18
Classes/gframe/deck_manager.cpp
Classes/gframe/deck_manager.cpp
+12
-8
Classes/gframe/event_handler.cpp
Classes/gframe/event_handler.cpp
+1
-1
Classes/gframe/game.cpp
Classes/gframe/game.cpp
+8
-7
Classes/ocgcore/card.cpp
Classes/ocgcore/card.cpp
+2
-0
Classes/ocgcore/field.cpp
Classes/ocgcore/field.cpp
+2
-0
No files found.
Classes/gframe/client_field.cpp
View file @
a6a2506e
...
...
@@ -472,7 +472,7 @@ void ClientField::ShowSelectCard(bool buttonok, bool chain) {
// text
wchar_t
formatBuffer
[
2048
];
if
(
conti_selecting
)
myswprintf
(
formatBuffer
,
L"%ls"
,
DataManager
::
unknown_string
);
myswprintf
(
formatBuffer
,
L"%ls"
,
dataManager
.
unknown_string
);
else
if
(
cant_check_grave
&&
selectable_cards
[
i
]
->
location
==
LOCATION_GRAVE
)
myswprintf
(
formatBuffer
,
L"%ls"
,
dataManager
.
FormatLocation
(
selectable_cards
[
i
]
->
location
,
0
));
else
if
(
selectable_cards
[
i
]
->
location
==
LOCATION_OVERLAY
)
...
...
@@ -1567,7 +1567,8 @@ void ClientField::UpdateDeclarableList() {
int
trycode
=
BufferIO
::
GetVal
(
pname
);
CardData
cd
;
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
();
ancard
.
clear
();
mainGame
->
lstANCard
->
addItem
(
it
->
second
.
name
.
c_str
());
...
...
@@ -1580,19 +1581,23 @@ void ClientField::UpdateDeclarableList() {
}
mainGame
->
lstANCard
->
clear
();
ancard
.
clear
();
for
(
auto
cit
=
dataManager
.
strings_begin
();
cit
!=
dataManager
.
strings_end
();
++
cit
)
{
if
(
cit
->
second
.
name
.
find
(
pname
)
!=
std
::
wstring
::
npos
)
{
auto
cp
=
dataManager
.
GetCodePointer
(
cit
->
first
);
if
(
cp
==
dataManager
.
datas_end
())
auto
&
_datas
=
dataManager
.
GetDataTable
();
auto
&
_strings
=
dataManager
.
GetStringTable
();
for
(
auto
&
entry
:
_strings
)
{
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
;
//datas.alias can be double card names or alias
if
(
is_declarable
(
cp
->
second
,
declare_opcodes
))
{
if
(
pname
==
cit
->
second
.
name
||
trycode
==
cit
->
first
)
{
//exact match or last used
mainGame
->
lstANCard
->
insertItem
(
0
,
cit
->
second
.
name
.
c_str
(),
-
1
);
ancard
.
insert
(
ancard
.
begin
(),
c
it
->
first
);
if
(
pname
==
str
.
name
||
trycode
==
code
)
{
//exact match or last used
mainGame
->
lstANCard
->
insertItem
(
0
,
str
.
name
.
c_str
(),
-
1
);
ancard
.
insert
(
ancard
.
begin
(),
c
ode
);
}
else
{
mainGame
->
lstANCard
->
addItem
(
cit
->
second
.
name
.
c_str
());
ancard
.
push_back
(
c
it
->
first
);
mainGame
->
lstANCard
->
addItem
(
str
.
name
.
c_str
());
ancard
.
push_back
(
c
ode
);
}
}
}
...
...
Classes/gframe/data_manager.cpp
View file @
a6a2506e
...
...
@@ -4,9 +4,7 @@
namespace
ygo
{
const
wchar_t
*
DataManager
::
unknown_string
=
L"???"
;
unsigned
char
DataManager
::
scriptBuffer
[
0x100000
]
=
{};
irr
::
io
::
IFileSystem
*
DataManager
::
FileSystem
=
nullptr
;
DataManager
dataManager
;
DataManager
::
DataManager
()
:
_datas
(
32768
),
_strings
(
32768
)
{
...
...
@@ -397,7 +395,7 @@ unsigned char* DataManager::ScriptReaderEx(const char* script_path, int* slen) {
return
nullptr
;
}
unsigned
char
*
DataManager
::
ReadScriptFromIrrFS
(
const
char
*
script_name
,
int
*
slen
)
{
auto
reader
=
FileSystem
->
createAndOpenFile
(
script_name
);
auto
reader
=
dataManager
.
FileSystem
->
createAndOpenFile
(
script_name
);
if
(
!
reader
)
return
nullptr
;
int
size
=
reader
->
read
(
scriptBuffer
,
sizeof
scriptBuffer
);
...
...
Classes/gframe/data_manager.h
View file @
a6a2506e
...
...
@@ -68,17 +68,11 @@ public:
code_pointer
GetCodePointer
(
uint32_t
code
)
const
;
string_pointer
GetStringPointer
(
uint32_t
code
)
const
;
co
de_pointer
datas_begin
()
const
noexcep
t
{
return
_datas
.
cbegin
()
;
co
nst
std
::
unordered_map
<
uint32_t
,
CardDataC
>&
GetDataTable
()
cons
t
{
return
_datas
;
}
code_pointer
datas_end
()
const
noexcept
{
return
_datas
.
cend
();
}
string_pointer
strings_begin
()
const
noexcept
{
return
_strings
.
cbegin
();
}
string_pointer
strings_end
()
const
noexcept
{
return
_strings
.
cend
();
const
std
::
unordered_map
<
uint32_t
,
CardString
>&
GetStringTable
()
const
{
return
_strings
;
}
bool
GetData
(
uint32_t
code
,
CardData
*
pData
)
const
;
bool
GetString
(
uint32_t
code
,
CardString
*
pStr
)
const
;
...
...
@@ -103,9 +97,10 @@ public:
std
::
unordered_map
<
unsigned
int
,
std
::
wstring
>
_setnameStrings
;
std
::
unordered_map
<
unsigned
int
,
std
::
wstring
>
_sysStrings
;
char
errmsg
[
512
]{};
const
wchar_t
*
unknown_string
{
L"???"
};
irr
::
io
::
IFileSystem
*
FileSystem
{};
static
unsigned
char
scriptBuffer
[
0x100000
];
static
const
wchar_t
*
unknown_string
;
static
uint32_t
CardReader
(
uint32_t
,
card_data
*
);
static
unsigned
char
*
ScriptReaderEx
(
const
char
*
script_path
,
int
*
slen
);
...
...
@@ -114,8 +109,6 @@ public:
//read by fread
static
unsigned
char
*
ReadScriptFromFile
(
const
char
*
script_name
,
int
*
slen
);
static
irr
::
io
::
IFileSystem
*
FileSystem
;
static
bool
deck_sort_lv
(
code_pointer
l1
,
code_pointer
l2
);
static
bool
deck_sort_atk
(
code_pointer
l1
,
code_pointer
l2
);
static
bool
deck_sort_def
(
code_pointer
l1
,
code_pointer
l2
);
...
...
Classes/gframe/deck_con.cpp
View file @
a6a2506e
...
...
@@ -177,6 +177,7 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
#endif
if
(
mainGame
->
dField
.
OnCommonEvent
(
event
))
return
false
;
auto
&
_datas
=
dataManager
.
GetDataTable
();
switch
(
event
.
EventType
)
{
case
irr
:
:
EET_GUI_EVENT
:
{
irr
::
s32
id
=
event
.
GUIEvent
.
Caller
->
getID
();
...
...
@@ -1115,8 +1116,8 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
break
;
dragx
=
event
.
MouseInput
.
X
;
dragy
=
event
.
MouseInput
.
Y
;
draging_pointer
=
dataManager
.
GetCodePointer
(
hovered_code
);
if
(
draging_pointer
==
dataManager
.
datas_
end
())
draging_pointer
=
_datas
.
find
(
hovered_code
);
if
(
draging_pointer
==
_datas
.
end
())
break
;
if
(
hovered_pos
==
4
)
{
if
(
!
check_limit
(
draging_pointer
))
...
...
@@ -1164,8 +1165,8 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
break
;
if
(
hovered_pos
==
0
||
hovered_seq
==
-
1
)
break
;
auto
pointer
=
dataManager
.
GetCodePointer
(
hovered_code
);
if
(
pointer
==
dataManager
.
datas_
end
())
auto
pointer
=
_datas
.
find
(
hovered_code
);
if
(
pointer
==
_datas
.
end
())
break
;
mainGame
->
soundManager
->
PlaySoundEffect
(
SoundManager
::
SFX
::
CARD_DROP
);
if
(
hovered_pos
==
1
)
{
...
...
@@ -1195,8 +1196,8 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
}
else
if
(
hovered_pos
==
3
)
{
pop_side
(
hovered_seq
);
}
else
{
auto
pointer
=
dataManager
.
GetCodePointer
(
hovered_code
);
if
(
pointer
==
dataManager
.
datas_
end
())
auto
pointer
=
_datas
.
find
(
hovered_code
);
if
(
pointer
==
_datas
.
end
())
break
;
if
(
!
check_limit
(
pointer
))
break
;
...
...
@@ -1230,8 +1231,8 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
break
;
if
(
is_draging
)
break
;
auto
pointer
=
dataManager
.
GetCodePointer
(
hovered_code
);
if
(
pointer
==
dataManager
.
datas_
end
())
auto
pointer
=
_datas
.
find
(
hovered_code
);
if
(
pointer
==
_datas
.
end
())
break
;
if
(
!
check_limit
(
pointer
))
break
;
...
...
@@ -1494,10 +1495,13 @@ void DeckBuilder::FilterCards() {
query_elements
.
push_back
(
element
);
}
}
for
(
code_pointer
ptr
=
dataManager
.
datas_begin
();
ptr
!=
dataManager
.
datas_end
();
++
ptr
)
{
const
CardDataC
&
data
=
ptr
->
second
;
auto
strpointer
=
dataManager
.
GetStringPointer
(
ptr
->
first
);
if
(
strpointer
==
dataManager
.
strings_end
())
auto
&
_datas
=
dataManager
.
GetDataTable
();
auto
&
_strings
=
dataManager
.
GetStringTable
();
for
(
code_pointer
ptr
=
_datas
.
begin
();
ptr
!=
_datas
.
end
();
++
ptr
)
{
auto
&
code
=
ptr
->
first
;
auto
&
data
=
ptr
->
second
;
auto
strpointer
=
_strings
.
find
(
code
);
if
(
strpointer
==
_strings
.
end
())
continue
;
const
CardString
&
strings
=
strpointer
->
second
;
if
(
data
.
type
&
TYPE_TOKEN
)
...
...
@@ -1855,16 +1859,16 @@ bool DeckBuilder::check_limit(code_pointer pointer) {
auto
flit
=
filterList
->
content
.
find
(
limitcode
);
if
(
flit
!=
filterList
->
content
.
end
())
limit
=
flit
->
second
;
for
(
auto
it
=
deckManager
.
current_deck
.
main
.
begin
();
it
!=
deckManager
.
current_deck
.
main
.
end
();
++
it
)
{
if
((
*
it
)
->
first
==
limitcode
||
(
*
it
)
->
second
.
alias
==
limitcode
)
for
(
auto
&
card
:
deckManager
.
current_deck
.
main
)
{
if
(
card
->
first
==
limitcode
||
card
->
second
.
alias
==
limitcode
)
limit
--
;
}
for
(
auto
it
=
deckManager
.
current_deck
.
extra
.
begin
();
it
!=
deckManager
.
current_deck
.
extra
.
end
();
++
it
)
{
if
((
*
it
)
->
first
==
limitcode
||
(
*
it
)
->
second
.
alias
==
limitcode
)
for
(
auto
&
card
:
deckManager
.
current_deck
.
extra
)
{
if
(
card
->
first
==
limitcode
||
card
->
second
.
alias
==
limitcode
)
limit
--
;
}
for
(
auto
it
=
deckManager
.
current_deck
.
side
.
begin
();
it
!=
deckManager
.
current_deck
.
side
.
end
();
++
it
)
{
if
((
*
it
)
->
first
==
limitcode
||
(
*
it
)
->
second
.
alias
==
limitcode
)
for
(
auto
&
card
:
deckManager
.
current_deck
.
side
)
{
if
(
card
->
first
==
limitcode
||
card
->
second
.
alias
==
limitcode
)
limit
--
;
}
return
limit
>
0
;
...
...
Classes/gframe/deck_manager.cpp
View file @
a6a2506e
...
...
@@ -151,42 +151,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
)
{
deck
.
clear
();
uint32_t
errorcode
=
0
;
CardData
cd
;
auto
&
_datas
=
dataManager
.
GetDataTable
()
;
for
(
int
i
=
0
;
i
<
mainc
;
++
i
)
{
auto
code
=
dbuf
[
i
];
if
(
!
dataManager
.
GetData
(
code
,
&
cd
))
{
auto
it
=
_datas
.
find
(
code
);
if
(
it
==
_datas
.
end
())
{
errorcode
=
code
;
continue
;
}
auto
&
cd
=
it
->
second
;
if
(
cd
.
type
&
TYPE_TOKEN
)
{
errorcode
=
code
;
continue
;
}
if
(
is_packlist
)
{
deck
.
main
.
push_back
(
dataManager
.
GetCodePointer
(
code
)
);
deck
.
main
.
push_back
(
it
);
continue
;
}
if
(
cd
.
type
&
TYPES_EXTRA_DECK
)
{
if
(
deck
.
extra
.
size
()
<
EXTRA_MAX_SIZE
)
deck
.
extra
.
push_back
(
dataManager
.
GetCodePointer
(
code
)
);
deck
.
extra
.
push_back
(
it
);
}
else
{
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
)
{
auto
code
=
dbuf
[
mainc
+
i
];
if
(
!
dataManager
.
GetData
(
code
,
&
cd
))
{
auto
it
=
_datas
.
find
(
code
);
if
(
it
==
_datas
.
end
())
{
errorcode
=
code
;
continue
;
}
auto
&
cd
=
it
->
second
;
if
(
cd
.
type
&
TYPE_TOKEN
)
{
errorcode
=
code
;
continue
;
}
if
(
deck
.
side
.
size
()
<
SIDE_MAX_SIZE
)
deck
.
side
.
push_back
(
dataManager
.
GetCodePointer
(
code
)
);
deck
.
side
.
push_back
(
it
);
}
return
errorcode
;
}
...
...
@@ -291,7 +295,7 @@ FILE* DeckManager::OpenDeckFile(const wchar_t* file, const char* mode) {
irr
::
io
::
IReadFile
*
DeckManager
::
OpenDeckReader
(
const
wchar_t
*
file
)
{
char
file2
[
256
];
BufferIO
::
EncodeUTF8
(
file
,
file2
);
auto
reader
=
DataManager
::
FileSystem
->
createAndOpenFile
(
file2
);
auto
reader
=
dataManager
.
FileSystem
->
createAndOpenFile
(
file2
);
return
reader
;
}
bool
DeckManager
::
LoadCurrentDeck
(
std
::
istringstream
&
deckStream
,
bool
is_packlist
)
{
...
...
Classes/gframe/event_handler.cpp
View file @
a6a2506e
...
...
@@ -989,7 +989,7 @@ bool ClientField::OnEvent(const irr::SEvent& event) {
myswprintf
(
formatBuffer
,
L""
);
}
else
{
if
(
conti_selecting
)
myswprintf
(
formatBuffer
,
L"%ls"
,
DataManager
::
unknown_string
);
myswprintf
(
formatBuffer
,
L"%ls"
,
dataManager
.
unknown_string
);
else
if
(
cant_check_grave
&&
selectable_cards
[
i
]
->
location
==
LOCATION_GRAVE
)
myswprintf
(
formatBuffer
,
L"%ls"
,
dataManager
.
FormatLocation
(
selectable_cards
[
i
]
->
location
,
0
));
else
if
(
selectable_cards
[
i
+
pos
]
->
location
==
LOCATION_OVERLAY
)
...
...
Classes/gframe/game.cpp
View file @
a6a2506e
...
...
@@ -1620,8 +1620,8 @@ void Game::LoadExpansions() {
}
closedir
(
dir
);
#endif
for
(
irr
::
u32
i
=
0
;
i
<
DataManager
::
FileSystem
->
getFileArchiveCount
();
++
i
)
{
auto
archive
=
DataManager
::
FileSystem
->
getFileArchive
(
i
)
->
getFileList
();
for
(
irr
::
u32
i
=
0
;
i
<
dataManager
.
FileSystem
->
getFileArchiveCount
();
++
i
)
{
auto
archive
=
dataManager
.
FileSystem
->
getFileArchive
(
i
)
->
getFileList
();
for
(
irr
::
u32
j
=
0
;
j
<
archive
->
getFileCount
();
++
j
)
{
wchar_t
fname
[
1024
];
const
char
*
uname
=
archive
->
getFullFileName
(
j
).
c_str
();
...
...
@@ -1631,7 +1631,7 @@ void Game::LoadExpansions() {
continue
;
}
if
(
IsExtension
(
fname
,
L".conf"
))
{
auto
reader
=
DataManager
::
FileSystem
->
createAndOpenFile
(
uname
);
auto
reader
=
dataManager
.
FileSystem
->
createAndOpenFile
(
uname
);
dataManager
.
LoadStrings
(
reader
);
continue
;
}
...
...
@@ -1894,8 +1894,9 @@ void Game::SaveConfig() {
void
Game
::
ShowCardInfo
(
int
code
)
{
wchar_t
formatBuffer
[
256
];
auto
cit
=
dataManager
.
GetCodePointer
(
code
);
bool
is_valid
=
(
cit
!=
dataManager
.
datas_end
());
auto
&
_datas
=
dataManager
.
GetDataTable
();
auto
cit
=
_datas
.
find
(
code
);
bool
is_valid
=
(
cit
!=
_datas
.
end
());
imgCard
->
setImage
(
imageManager
.
GetTexture
(
code
));
imgCard
->
setScaleImage
(
true
);
if
(
is_valid
)
{
...
...
@@ -1917,8 +1918,8 @@ void Game::ShowCardInfo(int code) {
if
(
is_valid
&&
!
gameConf
.
hide_setname
)
{
auto
&
cd
=
cit
->
second
;
auto
target
=
cit
;
if
(
cd
.
alias
&&
dataManager
.
GetCodePointer
(
cd
.
alias
)
!=
dataManager
.
datas_
end
())
{
target
=
dataManager
.
GetCodePointer
(
cd
.
alias
);
if
(
cd
.
alias
&&
_datas
.
find
(
cd
.
alias
)
!=
_datas
.
end
())
{
target
=
_datas
.
find
(
cd
.
alias
);
}
if
(
target
->
second
.
setcode
[
0
])
{
offset
=
23
;
// *yScale;
...
...
Classes/ocgcore/card.cpp
View file @
a6a2506e
...
...
@@ -1754,6 +1754,8 @@ int32_t card::add_effect(effect* peffect) {
return
0
;
if
(
peffect
->
type
&
EFFECT_TYPES_TRIGGER_LIKE
&&
is_continuous_event
(
peffect
->
code
))
return
0
;
if
(
peffect
->
type
&
EFFECT_TYPES_CHAIN_LINK
&&
peffect
->
owner
==
pduel
->
game_field
->
temp_card
)
return
0
;
// the trigger effect in phase is "once per turn" by default
if
(
peffect
->
get_code_type
()
==
CODE_PHASE
&&
peffect
->
code
&
(
PHASE_DRAW
|
PHASE_STANDBY
|
PHASE_END
)
&&
peffect
->
type
&
(
EFFECT_TYPE_TRIGGER_O
|
EFFECT_TYPE_TRIGGER_F
)
&&
!
peffect
->
is_flag
(
EFFECT_FLAG_COUNT_LIMIT
))
{
...
...
Classes/ocgcore/field.cpp
View file @
a6a2506e
...
...
@@ -1164,6 +1164,8 @@ void field::add_effect(effect* peffect, uint8_t owner_player) {
return
;
if
(
effects
.
indexer
.
find
(
peffect
)
!=
effects
.
indexer
.
end
())
return
;
if
(
peffect
->
type
&
EFFECT_TYPES_CHAIN_LINK
&&
peffect
->
owner
==
temp_card
)
return
;
effect_container
::
iterator
it
;
if
(
!
(
peffect
->
type
&
EFFECT_TYPE_ACTIONS
))
{
it
=
effects
.
aura_effect
.
emplace
(
peffect
->
code
,
peffect
);
...
...
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