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
f04cccc6
Commit
f04cccc6
authored
Mar 01, 2022
by
mercury233
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'master' of
https://github.com/Fluorohydride/ygopro-core
parents
82b74b7c
169d577b
Changes
3
Show whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
52 additions
and
38 deletions
+52
-38
field.cpp
field.cpp
+6
-4
operations.cpp
operations.cpp
+3
-2
processor.cpp
processor.cpp
+43
-32
No files found.
field.cpp
View file @
f04cccc6
...
...
@@ -3381,8 +3381,9 @@ int32 field::get_cteffect(effect* peffect, int32 playerid, int32 store) {
continue
;
uint32
code
=
efit
.
first
;
if
(
code
==
EVENT_FREE_CHAIN
||
code
==
EVENT_PHASE
+
infos
.
phase
)
{
nil_event
.
event_code
=
code
;
if
(
get_cteffect_evt
(
feffect
,
playerid
,
nil_event
,
store
)
&&
!
store
)
tevent
test_event
;
test_event
.
event_code
=
code
;
if
(
get_cteffect_evt
(
feffect
,
playerid
,
test_event
,
store
)
&&
!
store
)
return
TRUE
;
}
else
{
for
(
const
auto
&
ev
:
core
.
point_event
)
{
...
...
@@ -3431,8 +3432,9 @@ int32 field::check_cteffect_hint(effect* peffect, uint8 playerid) {
continue
;
uint32
code
=
efit
.
first
;
if
(
code
==
EVENT_FREE_CHAIN
||
code
==
EVENT_PHASE
+
infos
.
phase
)
{
nil_event
.
event_code
=
code
;
if
(
get_cteffect_evt
(
feffect
,
playerid
,
nil_event
,
FALSE
)
tevent
test_event
;
test_event
.
event_code
=
code
;
if
(
get_cteffect_evt
(
feffect
,
playerid
,
test_event
,
FALSE
)
&&
(
code
!=
EVENT_FREE_CHAIN
||
check_hint_timing
(
feffect
)))
return
TRUE
;
}
else
{
...
...
operations.cpp
View file @
f04cccc6
...
...
@@ -5092,8 +5092,9 @@ int32 field::activate_effect(uint16 step, effect* peffect) {
case
0
:
{
card
*
phandler
=
peffect
->
get_handler
();
int32
playerid
=
phandler
->
current
.
controler
;
nil_event
.
event_code
=
EVENT_FREE_CHAIN
;
if
(
!
peffect
->
is_activateable
(
playerid
,
nil_event
))
tevent
test_event
;
test_event
.
event_code
=
EVENT_FREE_CHAIN
;
if
(
!
peffect
->
is_activateable
(
playerid
,
test_event
))
return
TRUE
;
chain
newchain
;
newchain
.
flag
=
0
;
...
...
processor.cpp
View file @
f04cccc6
...
...
@@ -994,6 +994,9 @@ int32 field::check_hint_timing(effect* peffect) {
}
// core.spe_effect[p]: # of optional trigger effects, activate/quick effect with hints
int32
field
::
process_phase_event
(
int16
step
,
int32
phase
)
{
tevent
test_event
;
test_event
.
event_code
=
EVENT_PHASE
+
phase
;
test_event
.
event_player
=
infos
.
turn_player
;
switch
(
step
)
{
case
0
:
{
if
((
phase
==
PHASE_DRAW
&&
is_player_affected_by_effect
(
infos
.
turn_player
,
EFFECT_SKIP_DP
))
...
...
@@ -1005,8 +1008,6 @@ int32 field::process_phase_event(int16 step, int32 phase) {
return
FALSE
;
}
int32
phase_event
=
EVENT_PHASE
+
phase
;
nil_event
.
event_code
=
phase_event
;
nil_event
.
event_player
=
infos
.
turn_player
;
int32
check_player
=
infos
.
turn_player
;
if
(
core
.
units
.
begin
()
->
arg2
&
0x2
)
check_player
=
1
-
infos
.
turn_player
;
...
...
@@ -1018,7 +1019,7 @@ int32 field::process_phase_event(int16 step, int32 phase) {
effect
*
peffect
=
eit
->
second
;
++
eit
;
peffect
->
set_activate_location
();
if
(
!
peffect
->
is_activateable
(
check_player
,
nil
_event
))
if
(
!
peffect
->
is_activateable
(
check_player
,
test
_event
))
continue
;
peffect
->
id
=
infos
.
field_id
++
;
newchain
.
triggering_effect
=
peffect
;
...
...
@@ -1030,7 +1031,7 @@ int32 field::process_phase_event(int16 step, int32 phase) {
effect
*
peffect
=
eit
->
second
;
++
eit
;
//effects.continuous_effect may be changed in is_activateable (e.g. Rescue Cat)
if
(
peffect
->
get_handler_player
()
!=
check_player
||
!
peffect
->
is_activateable
(
check_player
,
nil
_event
))
if
(
peffect
->
get_handler_player
()
!=
check_player
||
!
peffect
->
is_activateable
(
check_player
,
test
_event
))
continue
;
peffect
->
id
=
infos
.
field_id
++
;
newchain
.
triggering_effect
=
peffect
;
...
...
@@ -1065,7 +1066,7 @@ int32 field::process_phase_event(int16 step, int32 phase) {
effect
*
peffect
=
eit
->
second
;
++
eit
;
peffect
->
set_activate_location
();
if
(
!
peffect
->
is_activateable
(
check_player
,
nil
_event
))
if
(
!
peffect
->
is_activateable
(
check_player
,
test
_event
))
continue
;
peffect
->
id
=
infos
.
field_id
++
;
newchain
.
triggering_effect
=
peffect
;
...
...
@@ -1088,7 +1089,7 @@ int32 field::process_phase_event(int16 step, int32 phase) {
effect
*
peffect
=
eit
->
second
;
++
eit
;
peffect
->
set_activate_location
();
if
(
!
peffect
->
is_chainable
(
check_player
)
||
!
peffect
->
is_activateable
(
check_player
,
nil
_event
))
if
(
!
peffect
->
is_chainable
(
check_player
)
||
!
peffect
->
is_activateable
(
check_player
,
test
_event
))
continue
;
peffect
->
id
=
infos
.
field_id
++
;
newchain
.
triggering_effect
=
peffect
;
...
...
@@ -1102,7 +1103,7 @@ int32 field::process_phase_event(int16 step, int32 phase) {
effect
*
peffect
=
eit
->
second
;
++
eit
;
peffect
->
set_activate_location
();
if
(
!
peffect
->
is_chainable
(
check_player
)
||
!
peffect
->
is_activateable
(
check_player
,
nil
_event
))
if
(
!
peffect
->
is_chainable
(
check_player
)
||
!
peffect
->
is_activateable
(
check_player
,
test
_event
))
continue
;
peffect
->
id
=
infos
.
field_id
++
;
newchain
.
triggering_effect
=
peffect
;
...
...
@@ -1115,7 +1116,7 @@ int32 field::process_phase_event(int16 step, int32 phase) {
for
(
auto
eit
=
pr
.
first
;
eit
!=
pr
.
second
;)
{
effect
*
peffect
=
eit
->
second
;
++
eit
;
if
(
peffect
->
get_handler_player
()
!=
check_player
||
!
peffect
->
is_activateable
(
check_player
,
nil
_event
))
if
(
peffect
->
get_handler_player
()
!=
check_player
||
!
peffect
->
is_activateable
(
check_player
,
test
_event
))
continue
;
peffect
->
id
=
infos
.
field_id
++
;
newchain
.
triggering_effect
=
peffect
;
...
...
@@ -1192,7 +1193,7 @@ int32 field::process_phase_event(int16 step, int32 phase) {
check_player
=
1
-
infos
.
turn_player
;
newchain
.
flag
=
0
;
newchain
.
chain_id
=
infos
.
field_id
++
;
newchain
.
evt
=
nil
_event
;
newchain
.
evt
=
test
_event
;
newchain
.
set_triggering_state
(
phandler
);
newchain
.
triggering_player
=
check_player
;
core
.
new_chains
.
push_back
(
newchain
);
...
...
@@ -1205,7 +1206,7 @@ int32 field::process_phase_event(int16 step, int32 phase) {
infos
.
priorities
[
1
]
=
0
;
}
else
{
core
.
select_chains
.
clear
();
solve_continuous
(
peffect
->
get_handler_player
(),
peffect
,
nil
_event
);
solve_continuous
(
peffect
->
get_handler_player
(),
peffect
,
test
_event
);
core
.
units
.
begin
()
->
step
=
3
;
}
return
FALSE
;
...
...
@@ -1497,8 +1498,10 @@ int32 field::process_point_event(int16 step, int32 skip_trigger, int32 skip_free
return
TRUE
;
}
case
30
:
{
// Battle Step, EFFECT_TYPE_CONTINUOUS with EVENT_FREE_CHAIN
int32
check_player
=
infos
.
turn_player
;
nil_event
.
event_code
=
EVENT_FREE_CHAIN
;
tevent
free_event
;
free_event
.
event_code
=
EVENT_FREE_CHAIN
;
chain
newchain
;
core
.
select_chains
.
clear
();
core
.
spe_effect
[
check_player
]
=
0
;
...
...
@@ -1507,7 +1510,7 @@ int32 field::process_point_event(int16 step, int32 skip_trigger, int32 skip_free
effect
*
peffect
=
eit
->
second
;
++
eit
;
newchain
.
triggering_effect
=
peffect
;
if
(
peffect
->
get_handler_player
()
==
check_player
&&
peffect
->
is_activateable
(
check_player
,
nil
_event
))
{
if
(
peffect
->
get_handler_player
()
==
check_player
&&
peffect
->
is_activateable
(
check_player
,
free
_event
))
{
core
.
select_chains
.
push_back
(
newchain
);
core
.
spe_effect
[
check_player
]
++
;
}
...
...
@@ -1521,16 +1524,19 @@ int32 field::process_point_event(int16 step, int32 skip_trigger, int32 skip_free
case
31
:
{
if
(
returns
.
ivalue
[
0
]
==
-
1
)
return
FALSE
;
tevent
free_event
;
free_event
.
event_code
=
EVENT_FREE_CHAIN
;
const
chain
&
newchain
=
core
.
select_chains
[
returns
.
ivalue
[
0
]];
effect
*
peffect
=
newchain
.
triggering_effect
;
core
.
select_chains
.
clear
();
solve_continuous
(
peffect
->
get_handler_player
(),
peffect
,
nil
_event
);
solve_continuous
(
peffect
->
get_handler_player
(),
peffect
,
free
_event
);
core
.
units
.
begin
()
->
step
=
29
;
return
FALSE
;
}
case
32
:
{
int32
check_player
=
1
-
infos
.
turn_player
;
nil_event
.
event_code
=
EVENT_FREE_CHAIN
;
tevent
free_event
;
free_event
.
event_code
=
EVENT_FREE_CHAIN
;
chain
newchain
;
core
.
select_chains
.
clear
();
core
.
spe_effect
[
check_player
]
=
0
;
...
...
@@ -1539,7 +1545,7 @@ int32 field::process_point_event(int16 step, int32 skip_trigger, int32 skip_free
effect
*
peffect
=
eit
->
second
;
++
eit
;
newchain
.
triggering_effect
=
peffect
;
if
(
peffect
->
get_handler_player
()
==
check_player
&&
peffect
->
is_activateable
(
check_player
,
nil
_event
))
{
if
(
peffect
->
get_handler_player
()
==
check_player
&&
peffect
->
is_activateable
(
check_player
,
free
_event
))
{
core
.
select_chains
.
push_back
(
newchain
);
core
.
spe_effect
[
check_player
]
++
;
}
...
...
@@ -1557,8 +1563,10 @@ int32 field::process_point_event(int16 step, int32 skip_trigger, int32 skip_free
}
const
chain
&
newchain
=
core
.
select_chains
[
returns
.
ivalue
[
0
]];
effect
*
peffect
=
newchain
.
triggering_effect
;
tevent
free_event
;
free_event
.
event_code
=
EVENT_FREE_CHAIN
;
core
.
select_chains
.
clear
();
solve_continuous
(
peffect
->
get_handler_player
(),
peffect
,
nil
_event
);
solve_continuous
(
peffect
->
get_handler_player
(),
peffect
,
free
_event
);
core
.
units
.
begin
()
->
step
=
31
;
return
FALSE
;
}
...
...
@@ -1719,17 +1727,18 @@ int32 field::process_quick_effect(int16 step, int32 skip_freechain, uint8 priori
}
core
.
spe_effect
[
priority
]
=
(
int32
)
core
.
select_chains
.
size
();
if
(
!
skip_freechain
)
{
nil_event
.
event_code
=
EVENT_FREE_CHAIN
;
tevent
free_event
;
free_event
.
event_code
=
EVENT_FREE_CHAIN
;
auto
pr
=
effects
.
activate_effect
.
equal_range
(
EVENT_FREE_CHAIN
);
for
(
auto
eit
=
pr
.
first
;
eit
!=
pr
.
second
;)
{
effect
*
peffect
=
eit
->
second
;
++
eit
;
peffect
->
set_activate_location
();
if
(
peffect
->
is_chainable
(
priority
)
&&
peffect
->
is_activateable
(
priority
,
nil
_event
))
{
if
(
peffect
->
is_chainable
(
priority
)
&&
peffect
->
is_activateable
(
priority
,
free
_event
))
{
card
*
phandler
=
peffect
->
get_handler
();
newchain
.
flag
=
0
;
newchain
.
chain_id
=
infos
.
field_id
++
;
newchain
.
evt
=
nil
_event
;
newchain
.
evt
=
free
_event
;
newchain
.
triggering_effect
=
peffect
;
newchain
.
set_triggering_state
(
phandler
);
newchain
.
triggering_player
=
priority
;
...
...
@@ -1743,11 +1752,11 @@ int32 field::process_quick_effect(int16 step, int32 skip_freechain, uint8 priori
effect
*
peffect
=
eit
->
second
;
++
eit
;
peffect
->
set_activate_location
();
if
(
peffect
->
is_chainable
(
priority
)
&&
peffect
->
is_activateable
(
priority
,
nil
_event
))
{
if
(
peffect
->
is_chainable
(
priority
)
&&
peffect
->
is_activateable
(
priority
,
free
_event
))
{
card
*
phandler
=
peffect
->
get_handler
();
newchain
.
flag
=
0
;
newchain
.
chain_id
=
infos
.
field_id
++
;
newchain
.
evt
=
nil
_event
;
newchain
.
evt
=
free
_event
;
newchain
.
triggering_effect
=
peffect
;
newchain
.
set_triggering_state
(
phandler
);
newchain
.
triggering_player
=
priority
;
...
...
@@ -2035,13 +2044,14 @@ int32 field::process_single_event(effect* peffect, const tevent& e, chain_list&
return
TRUE
;
}
int32
field
::
process_idle_command
(
uint16
step
)
{
tevent
free_event
;
free_event
.
event_code
=
EVENT_FREE_CHAIN
;
switch
(
step
)
{
case
0
:
{
effect
*
peffect
;
bool
must_attack
=
false
;
core
.
select_chains
.
clear
();
chain
newchain
;
nil_event
.
event_code
=
EVENT_FREE_CHAIN
;
core
.
to_bp
=
TRUE
;
core
.
to_ep
=
TRUE
;
if
((
!
(
core
.
duel_options
&
DUEL_ATTACK_FIRST_TURN
)
&&
infos
.
turn_id
==
1
)
||
infos
.
phase
==
PHASE_MAIN2
||
is_player_affected_by_effect
(
infos
.
turn_player
,
EFFECT_CANNOT_BP
))
...
...
@@ -2088,7 +2098,7 @@ int32 field::process_idle_command(uint16 step) {
++
eit
;
peffect
->
set_activate_location
();
newchain
.
triggering_effect
=
peffect
;
if
(
peffect
->
is_activateable
(
infos
.
turn_player
,
nil
_event
))
if
(
peffect
->
is_activateable
(
infos
.
turn_player
,
free
_event
))
core
.
select_chains
.
push_back
(
newchain
);
}
pr
=
effects
.
quick_o_effect
.
equal_range
(
EVENT_FREE_CHAIN
);
...
...
@@ -2097,7 +2107,7 @@ int32 field::process_idle_command(uint16 step) {
++
eit
;
peffect
->
set_activate_location
();
newchain
.
triggering_effect
=
peffect
;
if
(
peffect
->
is_activateable
(
infos
.
turn_player
,
nil
_event
))
if
(
peffect
->
is_activateable
(
infos
.
turn_player
,
free
_event
))
core
.
select_chains
.
push_back
(
newchain
);
}
pr
=
effects
.
continuous_effect
.
equal_range
(
EVENT_FREE_CHAIN
);
...
...
@@ -2105,7 +2115,7 @@ int32 field::process_idle_command(uint16 step) {
effect
*
peffect
=
eit
->
second
;
++
eit
;
newchain
.
triggering_effect
=
peffect
;
if
(
peffect
->
get_handler_player
()
==
infos
.
turn_player
&&
peffect
->
is_activateable
(
infos
.
turn_player
,
nil
_event
))
if
(
peffect
->
get_handler_player
()
==
infos
.
turn_player
&&
peffect
->
is_activateable
(
infos
.
turn_player
,
free
_event
))
core
.
select_chains
.
push_back
(
newchain
);
}
for
(
auto
eit
=
effects
.
ignition_effect
.
begin
();
eit
!=
effects
.
ignition_effect
.
end
();)
{
...
...
@@ -2113,7 +2123,7 @@ int32 field::process_idle_command(uint16 step) {
++
eit
;
peffect
->
set_activate_location
();
newchain
.
triggering_effect
=
peffect
;
if
(
peffect
->
is_activateable
(
infos
.
turn_player
,
nil
_event
))
if
(
peffect
->
is_activateable
(
infos
.
turn_player
,
free
_event
))
core
.
select_chains
.
push_back
(
newchain
);
}
core
.
summonable_cards
.
clear
();
...
...
@@ -2180,7 +2190,7 @@ int32 field::process_idle_command(uint16 step) {
effect
*
peffect
=
newchain
.
triggering_effect
;
if
(
peffect
->
type
&
EFFECT_TYPE_CONTINUOUS
)
{
core
.
select_chains
.
clear
();
solve_continuous
(
peffect
->
get_handler_player
(),
peffect
,
nil
_event
);
solve_continuous
(
peffect
->
get_handler_player
(),
peffect
,
free
_event
);
core
.
units
.
begin
()
->
step
=
2
;
return
FALSE
;
}
...
...
@@ -2362,12 +2372,13 @@ int32 field::process_idle_command(uint16 step) {
return
TRUE
;
}
int32
field
::
process_battle_command
(
uint16
step
)
{
tevent
free_event
;
free_event
.
event_code
=
EVENT_FREE_CHAIN
;
switch
(
step
)
{
case
0
:
{
effect
*
peffect
=
0
;
core
.
select_chains
.
clear
();
chain
newchain
;
nil_event
.
event_code
=
EVENT_FREE_CHAIN
;
if
(
!
core
.
chain_attack
)
{
core
.
chain_attacker_id
=
0
;
core
.
chain_attack_target
=
0
;
...
...
@@ -2399,7 +2410,7 @@ int32 field::process_battle_command(uint16 step) {
++
eit
;
peffect
->
set_activate_location
();
newchain
.
triggering_effect
=
peffect
;
if
(
peffect
->
is_activateable
(
infos
.
turn_player
,
nil
_event
)
&&
peffect
->
get_speed
()
>
1
)
if
(
peffect
->
is_activateable
(
infos
.
turn_player
,
free
_event
)
&&
peffect
->
get_speed
()
>
1
)
core
.
select_chains
.
push_back
(
newchain
);
}
pr
=
effects
.
quick_o_effect
.
equal_range
(
EVENT_FREE_CHAIN
);
...
...
@@ -2408,7 +2419,7 @@ int32 field::process_battle_command(uint16 step) {
++
eit
;
peffect
->
set_activate_location
();
newchain
.
triggering_effect
=
peffect
;
if
(
peffect
->
is_activateable
(
infos
.
turn_player
,
nil
_event
))
if
(
peffect
->
is_activateable
(
infos
.
turn_player
,
free
_event
))
core
.
select_chains
.
push_back
(
newchain
);
}
pr
=
effects
.
continuous_effect
.
equal_range
(
EVENT_FREE_CHAIN
);
...
...
@@ -2416,7 +2427,7 @@ int32 field::process_battle_command(uint16 step) {
effect
*
peffect
=
eit
->
second
;
++
eit
;
newchain
.
triggering_effect
=
peffect
;
if
(
peffect
->
get_handler_player
()
==
infos
.
turn_player
&&
peffect
->
is_activateable
(
infos
.
turn_player
,
nil
_event
))
if
(
peffect
->
get_handler_player
()
==
infos
.
turn_player
&&
peffect
->
is_activateable
(
infos
.
turn_player
,
free
_event
))
core
.
select_chains
.
push_back
(
newchain
);
}
core
.
attackable_cards
.
clear
();
...
...
@@ -2462,7 +2473,7 @@ int32 field::process_battle_command(uint16 step) {
effect
*
peffect
=
newchain
.
triggering_effect
;
if
(
peffect
->
type
&
EFFECT_TYPE_CONTINUOUS
)
{
core
.
select_chains
.
clear
();
solve_continuous
(
peffect
->
get_handler_player
(),
peffect
,
nil
_event
);
solve_continuous
(
peffect
->
get_handler_player
(),
peffect
,
free
_event
);
core
.
units
.
begin
()
->
step
=
13
;
return
FALSE
;
}
...
...
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