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
xiaoye
ygopro-core
Commits
b4c7ab0d
Commit
b4c7ab0d
authored
Mar 12, 2021
by
Chrono-Genex
Committed by
GitHub
Mar 12, 2021
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
fix EFFECT_DECREASE_TRIBUTE (#363)
parent
f81bce23
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
160 additions
and
44 deletions
+160
-44
card.cpp
card.cpp
+32
-16
operations.cpp
operations.cpp
+128
-28
No files found.
card.cpp
View file @
b4c7ab0d
...
...
@@ -3047,7 +3047,6 @@ int32 card::is_can_be_summoned(uint8 playerid, uint8 ignore_count, effect* peffe
}
int32
card
::
get_summon_tribute_count
()
{
int32
min
=
0
,
max
=
0
;
int32
minul
=
0
,
maxul
=
0
;
int32
level
=
get_level
();
if
(
level
<
5
)
return
0
;
...
...
@@ -3055,22 +3054,26 @@ int32 card::get_summon_tribute_count() {
min
=
max
=
1
;
else
min
=
max
=
2
;
std
::
vector
<
int32
>
duplicate
;
effect_set
eset
;
filter_effect
(
EFFECT_DECREASE_TRIBUTE
,
&
eset
);
for
(
int32
i
=
0
;
i
<
eset
.
size
();
++
i
)
{
int32
dec
=
eset
[
i
]
->
get_value
(
this
);
if
(
!
eset
[
i
]
->
is_flag
(
EFFECT_FLAG_COUNT_LIMIT
))
{
if
(
minul
<
(
dec
&
0xffff
))
minul
=
dec
&
0xffff
;
if
(
maxul
<
(
dec
>>
16
))
maxul
=
dec
>>
16
;
}
else
if
(
eset
[
i
]
->
count_limit
>
0
)
{
min
-=
dec
&
0xffff
;
max
-=
dec
>>
16
;
}
}
min
-=
minul
;
max
-=
maxul
;
if
(
eset
[
i
]
->
is_flag
(
EFFECT_FLAG_COUNT_LIMIT
)
&&
eset
[
i
]
->
count_limit
==
0
)
continue
;
std
::
vector
<
int32
>
retval
;
eset
[
i
]
->
get_value
(
this
,
0
,
&
retval
);
int32
dec
=
retval
.
size
()
>
0
?
retval
[
0
]
:
0
;
int32
effect_code
=
retval
.
size
()
>
1
?
retval
[
1
]
:
0
;
if
(
effect_code
>
0
)
{
auto
it
=
std
::
find
(
duplicate
.
begin
(),
duplicate
.
end
(),
effect_code
);
if
(
it
==
duplicate
.
end
())
duplicate
.
push_back
(
effect_code
);
else
continue
;
}
min
-=
dec
&
0xffff
;
max
-=
dec
>>
16
;
}
if
(
min
<
0
)
min
=
0
;
if
(
max
<
min
)
max
=
min
;
return
min
+
(
max
<<
16
);
...
...
@@ -3084,10 +3087,23 @@ int32 card::get_set_tribute_count() {
min
=
max
=
1
;
else
min
=
max
=
2
;
std
::
vector
<
int32
>
duplicate
;
effect_set
eset
;
filter_effect
(
EFFECT_DECREASE_TRIBUTE_SET
,
&
eset
);
if
(
eset
.
size
())
{
int32
dec
=
eset
.
get_last
()
->
get_value
(
this
);
for
(
int32
i
=
0
;
i
<
eset
.
size
();
++
i
)
{
if
(
eset
[
i
]
->
is_flag
(
EFFECT_FLAG_COUNT_LIMIT
)
&&
eset
[
i
]
->
count_limit
==
0
)
continue
;
std
::
vector
<
int32
>
retval
;
eset
[
i
]
->
get_value
(
this
,
0
,
&
retval
);
int32
dec
=
retval
.
size
()
>
0
?
retval
[
0
]
:
0
;
int32
effect_code
=
retval
.
size
()
>
1
?
retval
[
1
]
:
0
;
if
(
effect_code
>
0
)
{
auto
it
=
std
::
find
(
duplicate
.
begin
(),
duplicate
.
end
(),
effect_code
);
if
(
it
==
duplicate
.
end
())
duplicate
.
push_back
(
effect_code
);
else
continue
;
}
min
-=
dec
&
0xffff
;
max
-=
dec
>>
16
;
}
...
...
operations.cpp
View file @
b4c7ab0d
...
...
@@ -1766,47 +1766,70 @@ int32 field::summon(uint16 step, uint8 sumplayer, card* target, effect* proc, ui
if
(
tributes
)
min
-=
(
int32
)
tributes
->
size
();
if
(
min
>
0
)
{
std
::
vector
<
int32
>
duplicate
;
effect_set
eset
;
target
->
filter_effect
(
EFFECT_DECREASE_TRIBUTE
,
&
eset
);
int32
minul
=
0
;
effect
*
pdec
=
0
;
for
(
int32
i
=
0
;
i
<
eset
.
size
();
++
i
)
{
if
(
!
eset
[
i
]
->
is_flag
(
EFFECT_FLAG_COUNT_LIMIT
))
{
int32
dec
=
eset
[
i
]
->
get_value
(
target
);
if
(
minul
<
(
dec
&
0xffff
))
{
minul
=
dec
&
0xffff
;
pdec
=
eset
[
i
];
}
if
(
eset
[
i
]
->
is_flag
(
EFFECT_FLAG_COUNT_LIMIT
))
continue
;
std
::
vector
<
int32
>
retval
;
eset
[
i
]
->
get_value
(
target
,
0
,
&
retval
);
int32
dec
=
retval
.
size
()
>
0
?
retval
[
0
]
:
0
;
int32
effect_code
=
retval
.
size
()
>
1
?
retval
[
1
]
:
0
;
if
(
effect_code
>
0
)
{
auto
it
=
std
::
find
(
duplicate
.
begin
(),
duplicate
.
end
(),
effect_code
);
if
(
it
==
duplicate
.
end
())
duplicate
.
push_back
(
effect_code
);
else
continue
;
}
}
if
(
pdec
)
{
min
-=
minul
;
min
-=
dec
&
0xffff
;
pduel
->
write_buffer8
(
MSG_HINT
);
pduel
->
write_buffer8
(
HINT_CARD
);
pduel
->
write_buffer8
(
0
);
pduel
->
write_buffer32
(
pdec
->
handler
->
data
.
code
);
pduel
->
write_buffer32
(
eset
[
i
]
->
handler
->
data
.
code
);
}
for
(
int32
i
=
0
;
i
<
eset
.
size
()
&&
min
>
0
;
++
i
)
{
if
(
eset
[
i
]
->
is_flag
(
EFFECT_FLAG_COUNT_LIMIT
)
&&
eset
[
i
]
->
count_limit
>
0
&&
eset
[
i
]
->
target
)
{
int32
dec
=
eset
[
i
]
->
get_value
(
target
);
min
-=
dec
&
0xffff
;
eset
[
i
]
->
dec_count
();
pduel
->
write_buffer8
(
MSG_HINT
);
pduel
->
write_buffer8
(
HINT_CARD
);
pduel
->
write_buffer8
(
0
);
pduel
->
write_buffer32
(
eset
[
i
]
->
handler
->
data
.
code
);
if
(
!
eset
[
i
]
->
is_flag
(
EFFECT_FLAG_COUNT_LIMIT
)
||
eset
[
i
]
->
count_limit
==
0
||
!
eset
[
i
]
->
target
)
continue
;
std
::
vector
<
int32
>
retval
;
eset
[
i
]
->
get_value
(
target
,
0
,
&
retval
);
int32
dec
=
retval
.
size
()
>
0
?
retval
[
0
]
:
0
;
int32
effect_code
=
retval
.
size
()
>
1
?
retval
[
1
]
:
0
;
if
(
effect_code
>
0
)
{
auto
it
=
std
::
find
(
duplicate
.
begin
(),
duplicate
.
end
(),
effect_code
);
if
(
it
==
duplicate
.
end
())
duplicate
.
push_back
(
effect_code
);
else
continue
;
}
min
-=
dec
&
0xffff
;
eset
[
i
]
->
dec_count
();
pduel
->
write_buffer8
(
MSG_HINT
);
pduel
->
write_buffer8
(
HINT_CARD
);
pduel
->
write_buffer8
(
0
);
pduel
->
write_buffer32
(
eset
[
i
]
->
handler
->
data
.
code
);
}
for
(
int32
i
=
0
;
i
<
eset
.
size
()
&&
min
>
0
;
++
i
)
{
if
(
eset
[
i
]
->
is_flag
(
EFFECT_FLAG_COUNT_LIMIT
)
&&
eset
[
i
]
->
count_limit
>
0
&&
!
eset
[
i
]
->
target
)
{
int32
dec
=
eset
[
i
]
->
get_value
(
target
);
min
-=
dec
&
0xffff
;
eset
[
i
]
->
dec_count
();
pduel
->
write_buffer8
(
MSG_HINT
);
pduel
->
write_buffer8
(
HINT_CARD
);
pduel
->
write_buffer8
(
0
);
pduel
->
write_buffer32
(
eset
[
i
]
->
handler
->
data
.
code
);
if
(
!
eset
[
i
]
->
is_flag
(
EFFECT_FLAG_COUNT_LIMIT
)
||
eset
[
i
]
->
count_limit
==
0
||
eset
[
i
]
->
target
)
continue
;
std
::
vector
<
int32
>
retval
;
eset
[
i
]
->
get_value
(
target
,
0
,
&
retval
);
int32
dec
=
retval
.
size
()
>
0
?
retval
[
0
]
:
0
;
int32
effect_code
=
retval
.
size
()
>
1
?
retval
[
1
]
:
0
;
if
(
effect_code
>
0
)
{
auto
it
=
std
::
find
(
duplicate
.
begin
(),
duplicate
.
end
(),
effect_code
);
if
(
it
==
duplicate
.
end
())
duplicate
.
push_back
(
effect_code
);
else
continue
;
}
min
-=
dec
&
0xffff
;
eset
[
i
]
->
dec_count
();
pduel
->
write_buffer8
(
MSG_HINT
);
pduel
->
write_buffer8
(
HINT_CARD
);
pduel
->
write_buffer8
(
0
);
pduel
->
write_buffer32
(
eset
[
i
]
->
handler
->
data
.
code
);
}
}
if
(
tributes
)
{
...
...
@@ -2302,6 +2325,83 @@ int32 field::mset(uint16 step, uint8 setplayer, card* target, effect* proc, uint
}
case
5
:
{
card_set
*
tributes
=
(
card_set
*
)
proc
;
int32
min
=
0
;
int32
level
=
target
->
get_level
();
if
(
level
<
5
)
min
=
0
;
else
if
(
level
<
7
)
min
=
1
;
else
min
=
2
;
if
(
tributes
)
min
-=
(
int32
)
tributes
->
size
();
if
(
min
>
0
)
{
std
::
vector
<
int32
>
duplicate
;
effect_set
eset
;
target
->
filter_effect
(
EFFECT_DECREASE_TRIBUTE_SET
,
&
eset
);
for
(
int32
i
=
0
;
i
<
eset
.
size
();
++
i
)
{
if
(
eset
[
i
]
->
is_flag
(
EFFECT_FLAG_COUNT_LIMIT
))
continue
;
std
::
vector
<
int32
>
retval
;
eset
[
i
]
->
get_value
(
target
,
0
,
&
retval
);
int32
dec
=
retval
.
size
()
>
0
?
retval
[
0
]
:
0
;
int32
effect_code
=
retval
.
size
()
>
1
?
retval
[
1
]
:
0
;
if
(
effect_code
>
0
)
{
auto
it
=
std
::
find
(
duplicate
.
begin
(),
duplicate
.
end
(),
effect_code
);
if
(
it
==
duplicate
.
end
())
duplicate
.
push_back
(
effect_code
);
else
continue
;
}
min
-=
dec
&
0xffff
;
pduel
->
write_buffer8
(
MSG_HINT
);
pduel
->
write_buffer8
(
HINT_CARD
);
pduel
->
write_buffer8
(
0
);
pduel
->
write_buffer32
(
eset
[
i
]
->
handler
->
data
.
code
);
}
for
(
int32
i
=
0
;
i
<
eset
.
size
()
&&
min
>
0
;
++
i
)
{
if
(
!
eset
[
i
]
->
is_flag
(
EFFECT_FLAG_COUNT_LIMIT
)
||
eset
[
i
]
->
count_limit
==
0
||
!
eset
[
i
]
->
target
)
continue
;
std
::
vector
<
int32
>
retval
;
eset
[
i
]
->
get_value
(
target
,
0
,
&
retval
);
int32
dec
=
retval
.
size
()
>
0
?
retval
[
0
]
:
0
;
int32
effect_code
=
retval
.
size
()
>
1
?
retval
[
1
]
:
0
;
if
(
effect_code
>
0
)
{
auto
it
=
std
::
find
(
duplicate
.
begin
(),
duplicate
.
end
(),
effect_code
);
if
(
it
==
duplicate
.
end
())
duplicate
.
push_back
(
effect_code
);
else
continue
;
}
min
-=
dec
&
0xffff
;
eset
[
i
]
->
dec_count
();
pduel
->
write_buffer8
(
MSG_HINT
);
pduel
->
write_buffer8
(
HINT_CARD
);
pduel
->
write_buffer8
(
0
);
pduel
->
write_buffer32
(
eset
[
i
]
->
handler
->
data
.
code
);
}
for
(
int32
i
=
0
;
i
<
eset
.
size
()
&&
min
>
0
;
++
i
)
{
if
(
!
eset
[
i
]
->
is_flag
(
EFFECT_FLAG_COUNT_LIMIT
)
||
eset
[
i
]
->
count_limit
==
0
||
eset
[
i
]
->
target
)
continue
;
std
::
vector
<
int32
>
retval
;
eset
[
i
]
->
get_value
(
target
,
0
,
&
retval
);
int32
dec
=
retval
.
size
()
>
0
?
retval
[
0
]
:
0
;
int32
effect_code
=
retval
.
size
()
>
1
?
retval
[
1
]
:
0
;
if
(
effect_code
>
0
)
{
auto
it
=
std
::
find
(
duplicate
.
begin
(),
duplicate
.
end
(),
effect_code
);
if
(
it
==
duplicate
.
end
())
duplicate
.
push_back
(
effect_code
);
else
continue
;
}
min
-=
dec
&
0xffff
;
eset
[
i
]
->
dec_count
();
pduel
->
write_buffer8
(
MSG_HINT
);
pduel
->
write_buffer8
(
HINT_CARD
);
pduel
->
write_buffer8
(
0
);
pduel
->
write_buffer32
(
eset
[
i
]
->
handler
->
data
.
code
);
}
}
if
(
tributes
)
{
for
(
auto
&
pcard
:
*
tributes
)
pcard
->
current
.
reason_card
=
target
;
...
...
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