Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
Y
ygopro-core
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
nanahira
ygopro-core
Commits
af4efd81
Commit
af4efd81
authored
Jan 09, 2024
by
salix5
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
card: update is_set_card()
parent
00ede3c8
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
54 additions
and
126 deletions
+54
-126
card.cpp
card.cpp
+48
-115
card.h
card.h
+1
-0
libduel.cpp
libduel.cpp
+4
-2
playerop.cpp
playerop.cpp
+1
-9
No files found.
card.cpp
View file @
af4efd81
...
...
@@ -476,95 +476,66 @@ uint32 card::get_another_code() {
return
otcode
;
return
0
;
}
inline
bool
check_setcode
(
uint16_t
setcode
,
uint32
value
)
{
uint16_t
settype
=
value
&
0x0fff
;
uint16_t
setsubtype
=
value
&
0xf000
;
return
(
setcode
&
0x0fff
)
==
settype
&&
(
setcode
&
0xf000
&
setsubtype
)
==
setsubtype
;
}
bool
card
::
check_card_setcode
(
uint32
code
,
uint32
value
)
{
card_data
dat
;
::
read_card
(
code
,
&
dat
);
return
dat
.
is_setcode
(
value
);
}
int32
card
::
is_set_card
(
uint32
set_code
)
{
uint32
code
=
get_code
();
uint64
setcode
;
if
(
code
==
data
.
code
)
{
setcode
=
data
.
setcode
;
}
else
{
card_data
dat
;
::
read_card
(
code
,
&
dat
);
setcode
=
dat
.
setcode
;
uint32
code1
=
get_code
();
card_data
dat1
;
if
(
code1
==
data
.
code
)
{
if
(
data
.
is_setcode
(
set_code
))
return
TRUE
;
}
uint32
settype
=
set_code
&
0xfff
;
uint32
setsubtype
=
set_code
&
0xf000
;
while
(
setcode
)
{
if
((
setcode
&
0xfff
)
==
settype
&&
(
setcode
&
0xf000
&
setsubtype
)
==
setsubtype
)
else
{
if
(
check_card_setcode
(
code1
,
set_code
))
return
TRUE
;
setcode
=
setcode
>>
16
;
}
uint32
code2
=
get_another_code
();
if
(
code2
&&
check_card_setcode
(
code2
,
set_code
))
return
TRUE
;
//add set code
effect_set
eset
;
filter_effect
(
EFFECT_ADD_SETCODE
,
&
eset
);
for
(
int32
i
=
0
;
i
<
eset
.
size
();
++
i
)
{
uint32
value
=
eset
[
i
]
->
get_value
(
this
);
if
((
value
&
0xfff
)
==
settype
&&
(
value
&
0xf000
&
setsubtype
)
==
setsubtype
)
uint16_t
new_setcode
=
value
&
0xffff
;
if
(
check_setcode
(
new_setcode
,
set_code
))
return
TRUE
;
}
//another code
uint32
code2
=
get_another_code
();
uint64
setcode2
;
if
(
code2
!=
0
)
{
card_data
dat
;
::
read_card
(
code2
,
&
dat
);
setcode2
=
dat
.
setcode
;
}
else
{
return
FALSE
;
}
while
(
setcode2
)
{
if
((
setcode2
&
0xfff
)
==
settype
&&
(
setcode2
&
0xf000
&
setsubtype
)
==
setsubtype
)
return
TRUE
;
setcode2
=
setcode2
>>
16
;
}
return
FALSE
;
}
int32
card
::
is_origin_set_card
(
uint32
set_code
)
{
uint64
setcode
=
data
.
setcode
;
uint32
settype
=
set_code
&
0xfff
;
uint32
setsubtype
=
set_code
&
0xf000
;
while
(
setcode
)
{
if
((
setcode
&
0xfff
)
==
settype
&&
(
setcode
&
0xf000
&
setsubtype
)
==
setsubtype
)
return
TRUE
;
setcode
=
setcode
>>
16
;
}
if
(
data
.
is_setcode
(
set_code
))
return
TRUE
;
uint32
code2
=
std
::
get
<
1
>
(
get_original_code_rule
());
if
(
code2
&&
check_card_setcode
(
code2
,
set_code
))
return
TRUE
;
return
FALSE
;
}
int32
card
::
is_pre_set_card
(
uint32
set_code
)
{
uint32
code
=
previous
.
code
;
uint64
setcode
;
if
(
code
==
data
.
code
)
{
setcode
=
data
.
setcode
;
}
else
{
card_data
dat
;
::
read_card
(
code
,
&
dat
);
setcode
=
dat
.
setcode
;
}
uint32
settype
=
set_code
&
0xfff
;
uint32
setsubtype
=
set_code
&
0xf000
;
while
(
setcode
)
{
if
((
setcode
&
0xfff
)
==
settype
&&
(
setcode
&
0xf000
&
setsubtype
)
==
setsubtype
)
if
(
data
.
is_setcode
(
set_code
))
return
TRUE
;
setcode
=
setcode
>>
16
;
}
//add set code
for
(
auto
&
presetcode
:
previous
.
setcode
)
{
if
(
presetcode
&&
(
presetcode
&
0xfff
)
==
settype
&&
(
presetcode
&
0xf000
&
setsubtype
)
==
setsubtype
)
else
{
if
(
check_card_setcode
(
code
,
set_code
))
return
TRUE
;
}
//another code
uint32
code2
=
previous
.
code2
;
uint64
setcode2
;
if
(
code2
!=
0
)
{
card_data
dat
;
::
read_card
(
code2
,
&
dat
);
setcode2
=
dat
.
setcode
;
}
else
{
return
FALSE
;
}
while
(
setcode2
)
{
if
((
setcode2
&
0xfff
)
==
settype
&&
(
setcode2
&
0xf000
&
setsubtype
)
==
setsubtype
)
if
(
code2
&&
check_card_setcode
(
code2
,
set_code
))
return
TRUE
;
//add set code
for
(
auto
&
presetcode
:
previous
.
setcode
)
{
if
(
check_setcode
(
presetcode
,
set_code
))
return
TRUE
;
setcode2
=
setcode2
>>
16
;
}
return
FALSE
;
}
...
...
@@ -573,26 +544,19 @@ int32 card::is_fusion_set_card(uint32 set_code) {
return
TRUE
;
if
(
pduel
->
game_field
->
core
.
not_material
)
return
FALSE
;
uint32
settype
=
set_code
&
0xfff
;
uint32
setsubtype
=
set_code
&
0xf000
;
effect_set
eset
;
filter_effect
(
EFFECT_ADD_FUSION_CODE
,
&
eset
);
for
(
int32
i
=
0
;
i
<
eset
.
size
();
++
i
)
{
uint32
code
=
eset
[
i
]
->
get_value
(
this
);
card_data
dat
;
::
read_card
(
code
,
&
dat
);
uint64
setcode
=
dat
.
setcode
;
while
(
setcode
)
{
if
((
setcode
&
0xfff
)
==
settype
&&
(
setcode
&
0xf000
&
setsubtype
)
==
setsubtype
)
return
TRUE
;
setcode
=
setcode
>>
16
;
}
if
(
check_card_setcode
(
code
,
set_code
))
return
TRUE
;
}
eset
.
clear
();
filter_effect
(
EFFECT_ADD_FUSION_SETCODE
,
&
eset
);
for
(
int32
i
=
0
;
i
<
eset
.
size
();
++
i
)
{
uint32
setcode
=
eset
[
i
]
->
get_value
(
this
);
if
((
setcode
&
0xfff
)
==
settype
&&
(
setcode
&
0xf000
&
setsubtype
)
==
setsubtype
)
uint32
value
=
eset
[
i
]
->
get_value
(
this
);
uint16_t
new_setcode
=
value
&
0xffff
;
if
(
check_setcode
(
new_setcode
,
set_code
))
return
TRUE
;
}
return
FALSE
;
...
...
@@ -606,53 +570,22 @@ int32 card::is_link_set_card(uint32 set_code) {
filter_effect
(
EFFECT_ADD_LINK_CODE
,
&
eset
);
for
(
int32
i
=
0
;
i
<
eset
.
size
();
++
i
)
{
uint32
code
=
eset
[
i
]
->
get_value
(
this
);
card_data
dat
;
::
read_card
(
code
,
&
dat
);
uint64
setcode
=
dat
.
setcode
;
while
(
setcode
)
{
if
((
setcode
&
0xfff
)
==
settype
&&
(
setcode
&
0xf000
&
setsubtype
)
==
setsubtype
)
return
TRUE
;
setcode
=
setcode
>>
16
;
}
if
(
check_card_setcode
(
code
,
set_code
))
return
TRUE
;
}
return
FALSE
;
}
int32
card
::
is_special_summon_set_card
(
uint32
set_code
)
{
uint32
code
=
spsummon
.
code
;
uint64
setcode
;
if
(
code
==
data
.
code
)
{
setcode
=
data
.
setcode
;
}
else
{
card_data
dat
;
::
read_card
(
code
,
&
dat
);
setcode
=
dat
.
setcode
;
}
uint32
settype
=
set_code
&
0xfff
;
uint32
setsubtype
=
set_code
&
0xf000
;
while
(
setcode
)
{
if
((
setcode
&
0xfff
)
==
settype
&&
(
setcode
&
0xf000
&
setsubtype
)
==
setsubtype
)
return
TRUE
;
setcode
=
setcode
>>
16
;
}
if
(
check_card_setcode
(
code
,
set_code
))
return
TRUE
;
uint32
code2
=
spsummon
.
code2
;
if
(
code2
&&
check_card_setcode
(
code2
,
set_code
))
return
TRUE
;
//add set code
for
(
auto
&
spsetcode
:
spsummon
.
setcode
)
{
if
(
spsetcode
&&
(
spsetcode
&
0xfff
)
==
settype
&&
(
spsetcode
&
0xf000
&
setsubtype
)
==
setsubtype
)
return
TRUE
;
}
//another code
uint32
code2
=
spsummon
.
code2
;
uint64
setcode2
;
if
(
code2
!=
0
)
{
card_data
dat
;
::
read_card
(
code2
,
&
dat
);
setcode2
=
dat
.
setcode
;
}
else
{
return
FALSE
;
}
while
(
setcode2
)
{
if
((
setcode2
&
0xfff
)
==
settype
&&
(
setcode2
&
0xf000
&
setsubtype
)
==
setsubtype
)
if
(
check_setcode
(
spsetcode
,
set_code
))
return
TRUE
;
setcode2
=
setcode2
>>
16
;
}
return
FALSE
;
}
...
...
card.h
View file @
af4efd81
...
...
@@ -218,6 +218,7 @@ public:
std
::
tuple
<
uint32
,
uint32
>
get_original_code_rule
()
const
;
uint32
get_code
();
uint32
get_another_code
();
static
bool
check_card_setcode
(
uint32
code
,
uint32
value
);
int32
is_set_card
(
uint32
set_code
);
int32
is_origin_set_card
(
uint32
set_code
);
int32
is_pre_set_card
(
uint32
set_code
);
...
...
libduel.cpp
View file @
af4efd81
...
...
@@ -4294,8 +4294,10 @@ int32 scriptlib::duel_is_player_can_spsummon_monster(lua_State * L) {
::
read_card
(
code
,
&
dat
);
dat
.
code
=
code
;
dat
.
alias
=
0
;
if
(
!
lua_isnil
(
L
,
3
))
dat
.
setcode
=
lua_tointeger
(
L
,
3
);
if
(
!
lua_isnil
(
L
,
3
))
{
uint64
setcode_list
=
lua_tointeger
(
L
,
3
);
dat
.
set_setcode
(
setcode_list
);
}
if
(
!
lua_isnil
(
L
,
4
))
dat
.
type
=
(
uint32
)
lua_tointeger
(
L
,
4
);
if
(
!
lua_isnil
(
L
,
5
))
...
...
playerop.cpp
View file @
af4efd81
...
...
@@ -920,15 +920,7 @@ static int32 is_declarable(card_data const& cd, const std::vector<uint32>& opcod
if
(
stack
.
size
()
>=
1
)
{
int32
set_code
=
stack
.
top
();
stack
.
pop
();
uint64
sc
=
cd
.
setcode
;
bool
res
=
false
;
uint32
settype
=
set_code
&
0xfff
;
uint32
setsubtype
=
set_code
&
0xf000
;
while
(
sc
)
{
if
((
sc
&
0xfff
)
==
settype
&&
(
sc
&
0xf000
&
setsubtype
)
==
setsubtype
)
res
=
true
;
sc
=
sc
>>
16
;
}
bool
res
=
cd
.
is_setcode
(
set_code
);
stack
.
push
(
res
);
}
break
;
...
...
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