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
0f8dedac
Commit
0f8dedac
authored
Feb 09, 2024
by
salix5
Browse files
Options
Browse Files
Download
Plain Diff
Merge remote-tracking branch 'origin/patch-card2' into next
parents
e06381f5
aa41c5cd
Changes
8
Hide whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
108 additions
and
148 deletions
+108
-148
card.cpp
card.cpp
+51
-118
card.h
card.h
+2
-3
card_data.h
card_data.h
+48
-13
interpreter.cpp
interpreter.cpp
+1
-1
libduel.cpp
libduel.cpp
+4
-2
ocgapi.h
ocgapi.h
+0
-1
operations.cpp
operations.cpp
+1
-1
playerop.cpp
playerop.cpp
+1
-9
No files found.
card.cpp
View file @
0f8dedac
...
...
@@ -421,7 +421,7 @@ uint32 card::get_info_location() {
}
// get the printed code on card
uint32
card
::
get_original_code
()
const
{
if
(
data
.
alias
&&
(
data
.
alias
<
data
.
code
+
CARD_ARTWORK_VERSIONS_OFFSET
)
&&
(
data
.
code
<
data
.
alias
+
CARD_ARTWORK_VERSIONS_OFFSET
))
if
(
data
.
is_alternative
(
))
return
data
.
alias
;
else
return
data
.
code
;
...
...
@@ -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
;
}
...
...
@@ -2611,7 +2544,7 @@ void card::set_special_summon_status(effect* peffect) {
effect_set
eset
;
pcard
->
filter_effect
(
EFFECT_ADD_SETCODE
,
&
eset
);
for
(
int32
i
=
0
;
i
<
eset
.
size
();
++
i
)
{
spsummon
.
setcode
.
push_back
((
uint32
)
eset
[
i
]
->
get_value
(
pcard
));
spsummon
.
setcode
.
push_back
((
uint32
)
eset
[
i
]
->
get_value
(
pcard
)
&
0xffff
);
}
spsummon
.
reason_effect
=
peffect
;
spsummon
.
reason_player
=
peffect
->
get_handler_player
();
...
...
@@ -2630,7 +2563,7 @@ void card::set_special_summon_status(effect* peffect) {
effect_set
eset
;
pcard
->
filter_effect
(
EFFECT_ADD_SETCODE
,
&
eset
);
for
(
int32
i
=
0
;
i
<
eset
.
size
();
++
i
)
{
spsummon
.
setcode
.
push_back
((
uint32
)
eset
[
i
]
->
get_value
(
pcard
));
spsummon
.
setcode
.
push_back
((
uint32
)
eset
[
i
]
->
get_value
(
pcard
)
&
0xffff
);
}
spsummon
.
reason_effect
=
cait
->
triggering_effect
;
spsummon
.
reason_player
=
cait
->
triggering_player
;
...
...
card.h
View file @
0f8dedac
...
...
@@ -26,7 +26,7 @@ struct chain;
struct
card_state
{
uint32
code
{
0
};
uint32
code2
{
0
};
std
::
vector
<
uint
32
>
setcode
;
std
::
vector
<
uint
16_t
>
setcode
;
uint32
type
{
0
};
uint32
level
{
0
};
uint32
rank
{
0
};
...
...
@@ -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
);
...
...
@@ -434,6 +435,4 @@ constexpr uint32 DEFAULT_SUMMON_TYPE = SUMMON_VALUE_MAIN_TYPE | SUMMON_VALUE_SUB
#define SUMMON_INFO_REASON_EFFECT 0x200
#define SUMMON_INFO_REASON_PLAYER 0x400
#define CARD_ARTWORK_VERSIONS_OFFSET 10
#endif
/* CARD_H_ */
card_data.h
View file @
0f8dedac
#ifndef CARD_DATA_H_
#define CARD_DATA_H_
#include "common.h"
constexpr
int
CARD_ARTWORK_VERSIONS_OFFSET
=
10
;
constexpr
int
SIZE_SETCODE
=
16
;
struct
card_data
{
uint32
code
{
0
};
uint32
alias
{
0
};
uint
64
setcode
{
0
};
uint32
type
{
0
};
uint32
level
{
0
};
uint32
attribute
{
0
};
uint32
race
{
0
};
int32
attack
{
0
};
int32
defense
{
0
};
uint32
lscale
{
0
};
uint32
rscale
{
0
};
uint32
link_marker
{
0
};
uint32
code
{};
uint32
alias
{};
uint
16_t
setcode
[
SIZE_SETCODE
]{
};
uint32
type
{};
uint32
level
{};
uint32
attribute
{};
uint32
race
{};
int32
attack
{};
int32
defense
{};
uint32
lscale
{};
uint32
rscale
{};
uint32
link_marker
{};
void
clear
()
{
code
=
0
;
alias
=
0
;
setcode
=
0
;
for
(
auto
&
x
:
setcode
)
x
=
0
;
type
=
0
;
level
=
0
;
attribute
=
0
;
...
...
@@ -29,6 +35,35 @@ struct card_data {
rscale
=
0
;
link_marker
=
0
;
}
bool
is_setcode
(
uint32
value
)
const
{
uint16_t
settype
=
value
&
0x0fff
;
uint16_t
setsubtype
=
value
&
0xf000
;
for
(
auto
&
x
:
setcode
)
{
if
((
x
&
0x0fff
)
==
settype
&&
(
x
&
0xf000
&
setsubtype
)
==
setsubtype
)
return
true
;
if
(
!
x
)
return
false
;
}
return
false
;
}
bool
is_alternative
()
const
{
return
alias
&&
(
alias
<
code
+
CARD_ARTWORK_VERSIONS_OFFSET
)
&&
(
code
<
alias
+
CARD_ARTWORK_VERSIONS_OFFSET
);
}
void
set_setcode
(
uint64
value
)
{
int
ctr
=
0
;
while
(
value
)
{
if
(
value
&
0xffff
)
{
setcode
[
ctr
]
=
value
&
0xffff
;
++
ctr
;
}
value
>>=
16
;
}
for
(
int
i
=
ctr
;
i
<
SIZE_SETCODE
;
++
i
)
setcode
[
i
]
=
0
;
}
};
#endif
/* CARD_DATA_H_ */
interpreter.cpp
View file @
0f8dedac
...
...
@@ -56,7 +56,7 @@ int32 interpreter::register_card(card *pcard) {
//some userdata may be created in script like token so use current_state
lua_rawgeti
(
current_state
,
LUA_REGISTRYINDEX
,
pcard
->
ref_handle
);
//load script
if
(
pcard
->
data
.
alias
&&
(
pcard
->
data
.
alias
<
pcard
->
data
.
code
+
CARD_ARTWORK_VERSIONS_OFFSET
)
&&
(
pcard
->
data
.
code
<
pcard
->
data
.
alias
+
CARD_ARTWORK_VERSIONS_OFFSET
))
if
(
pcard
->
data
.
is_alternative
(
))
load_card_script
(
pcard
->
data
.
alias
);
else
load_card_script
(
pcard
->
data
.
code
);
...
...
libduel.cpp
View file @
0f8dedac
...
...
@@ -4308,8 +4308,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
))
...
...
ocgapi.h
View file @
0f8dedac
...
...
@@ -22,7 +22,6 @@
class
card
;
struct
card_data
;
struct
card_info
;
class
group
;
class
effect
;
class
interpreter
;
...
...
operations.cpp
View file @
0f8dedac
...
...
@@ -3956,7 +3956,7 @@ int32 field::send_to(uint16 step, group * targets, effect * reason_effect, uint3
effect_set
eset
;
pcard
->
filter_effect
(
EFFECT_ADD_SETCODE
,
&
eset
);
for
(
int32
i
=
0
;
i
<
eset
.
size
();
++
i
)
{
pcard
->
previous
.
setcode
.
push_back
((
uint32
)
eset
[
i
]
->
get_value
(
pcard
));
pcard
->
previous
.
setcode
.
push_back
((
uint32
)
eset
[
i
]
->
get_value
(
pcard
)
&
0xffff
);
}
}
}
...
...
playerop.cpp
View file @
0f8dedac
...
...
@@ -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