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
36b7354f
Commit
36b7354f
authored
Dec 28, 2016
by
salix5
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Duel.IsChainNegatable()
parent
a090e2aa
Changes
5
Show whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
57 additions
and
55 deletions
+57
-55
field.cpp
field.cpp
+21
-45
field.h
field.h
+2
-4
libduel.cpp
libduel.cpp
+30
-2
operations.cpp
operations.cpp
+2
-2
processor.cpp
processor.cpp
+2
-2
No files found.
field.cpp
View file @
36b7354f
...
...
@@ -2579,7 +2579,8 @@ int32 field::is_player_can_remove(uint8 playerid, card * pcard) {
}
return
TRUE
;
}
int32
field
::
is_chain_negatable
(
uint8
chaincount
,
uint8
naga_check
)
{
int32
field
::
is_chain_negatable
(
uint8
chaincount
)
{
effect_set
eset
;
if
(
chaincount
<
0
||
chaincount
>
core
.
current_chain
.
size
())
return
FALSE
;
effect
*
peffect
;
...
...
@@ -2587,11 +2588,18 @@ int32 field::is_chain_negatable(uint8 chaincount, uint8 naga_check) {
peffect
=
core
.
current_chain
.
back
().
triggering_effect
;
else
peffect
=
core
.
current_chain
[
chaincount
-
1
].
triggering_effect
;
if
(
naga_check
&&
peffect
->
is_flag
(
EFFECT_FLAG2_NAGA
))
if
(
peffect
->
is_flag
(
EFFECT_FLAG_CANNOT_DISABLE
))
return
FALSE
;
filter_field_effect
(
EFFECT_CANNOT_INACTIVATE
,
&
eset
);
for
(
int32
i
=
0
;
i
<
eset
.
size
();
++
i
)
{
pduel
->
lua
->
add_param
(
chaincount
,
PARAM_TYPE_INT
);
if
(
eset
[
i
]
->
check_value_condition
(
1
))
return
FALSE
;
}
return
TRUE
;
}
int32
field
::
is_chain_disablable
(
uint8
chaincount
,
uint8
naga_check
)
{
int32
field
::
is_chain_disablable
(
uint8
chaincount
)
{
effect_set
eset
;
if
(
chaincount
<
0
||
chaincount
>
core
.
current_chain
.
size
())
return
FALSE
;
effect
*
peffect
;
...
...
@@ -2599,8 +2607,16 @@ int32 field::is_chain_disablable(uint8 chaincount, uint8 naga_check) {
peffect
=
core
.
current_chain
.
back
().
triggering_effect
;
else
peffect
=
core
.
current_chain
[
chaincount
-
1
].
triggering_effect
;
if
(
naga_check
&&
peffect
->
is_flag
(
EFFECT_FLAG2_NAGA
))
if
(
!
peffect
->
get_handler
()
->
get_status
(
STATUS_FORBIDDEN
))
{
if
(
peffect
->
is_flag
(
EFFECT_FLAG_CANNOT_DISABLE
))
return
FALSE
;
filter_field_effect
(
EFFECT_CANNOT_DISEFFECT
,
&
eset
);
for
(
int32
i
=
0
;
i
<
eset
.
size
();
++
i
)
{
pduel
->
lua
->
add_param
(
chaincount
,
PARAM_TYPE_INT
);
if
(
eset
[
i
]
->
check_value_condition
(
1
))
return
FALSE
;
}
}
return
TRUE
;
}
int32
field
::
is_chain_disabled
(
uint8
chaincount
)
{
...
...
@@ -2624,46 +2640,6 @@ int32 field::is_chain_disabled(uint8 chaincount) {
}
return
FALSE
;
}
int32
field
::
check_chain_negate
(
uint8
chaincount
)
{
effect_set
eset
;
if
(
chaincount
<
0
||
chaincount
>
core
.
current_chain
.
size
())
return
FALSE
;
effect
*
peffect
;
if
(
chaincount
==
0
)
peffect
=
core
.
current_chain
.
back
().
triggering_effect
;
else
peffect
=
core
.
current_chain
[
chaincount
-
1
].
triggering_effect
;
if
(
peffect
->
is_flag
(
EFFECT_FLAG_CANNOT_DISABLE
))
return
FALSE
;
filter_field_effect
(
EFFECT_CANNOT_INACTIVATE
,
&
eset
);
for
(
int32
i
=
0
;
i
<
eset
.
size
();
++
i
)
{
pduel
->
lua
->
add_param
(
chaincount
,
PARAM_TYPE_INT
);
if
(
eset
[
i
]
->
check_value_condition
(
1
))
return
FALSE
;
}
return
TRUE
;
}
int32
field
::
check_chain_disable
(
uint8
chaincount
)
{
effect_set
eset
;
if
(
chaincount
<
0
||
chaincount
>
core
.
current_chain
.
size
())
return
FALSE
;
effect
*
peffect
;
if
(
chaincount
==
0
)
peffect
=
core
.
current_chain
.
back
().
triggering_effect
;
else
peffect
=
core
.
current_chain
[
chaincount
-
1
].
triggering_effect
;
if
(
!
peffect
->
get_handler
()
->
get_status
(
STATUS_FORBIDDEN
))
{
if
(
peffect
->
is_flag
(
EFFECT_FLAG_CANNOT_DISABLE
))
return
FALSE
;
filter_field_effect
(
EFFECT_CANNOT_DISEFFECT
,
&
eset
);
for
(
int32
i
=
0
;
i
<
eset
.
size
();
++
i
)
{
pduel
->
lua
->
add_param
(
chaincount
,
PARAM_TYPE_INT
);
if
(
eset
[
i
]
->
check_value_condition
(
1
))
return
FALSE
;
}
}
return
TRUE
;
}
int32
field
::
check_chain_target
(
uint8
chaincount
,
card
*
pcard
)
{
if
(
chaincount
<
0
||
chaincount
>
core
.
current_chain
.
size
())
return
FALSE
;
...
...
field.h
View file @
36b7354f
...
...
@@ -425,12 +425,10 @@ public:
int32
is_player_can_send_to_hand
(
uint8
playerid
,
card
*
pcard
);
int32
is_player_can_send_to_deck
(
uint8
playerid
,
card
*
pcard
);
int32
is_player_can_remove
(
uint8
playerid
,
card
*
pcard
);
int32
is_chain_negatable
(
uint8
chaincount
,
uint8
naga_check
);
int32
is_chain_disablable
(
uint8
chaincount
,
uint8
naga_check
);
int32
is_chain_negatable
(
uint8
chaincount
);
int32
is_chain_disablable
(
uint8
chaincount
);
int32
is_chain_disabled
(
uint8
chaincount
);
int32
check_chain_target
(
uint8
chaincount
,
card
*
pcard
);
int32
check_chain_negate
(
uint8
chaincount
);
int32
check_chain_disable
(
uint8
chaincount
);
int32
is_able_to_enter_bp
();
void
add_process
(
uint16
type
,
uint16
step
,
effect
*
peffect
,
group
*
target
,
ptr
arg1
,
ptr
arg2
,
ptr
arg3
=
0
,
ptr
arg4
=
0
,
void
*
ptr1
=
NULL
,
void
*
ptr2
=
NULL
);
...
...
libduel.cpp
View file @
36b7354f
...
...
@@ -3182,14 +3182,42 @@ int32 scriptlib::duel_is_chain_negatable(lua_State * L) {
check_param_count
(
L
,
1
);
int32
chaincount
=
lua_tointeger
(
L
,
1
);
duel
*
pduel
=
interpreter
::
get_duel_info
(
L
);
lua_pushboolean
(
L
,
pduel
->
game_field
->
is_chain_negatable
(
chaincount
,
TRUE
));
int32
ret
=
0
;
if
(
chaincount
<
0
||
chaincount
>
(
int32
)
pduel
->
game_field
->
core
.
current_chain
.
size
())
ret
=
FALSE
;
else
{
effect
*
peffect
;
if
(
chaincount
==
0
)
peffect
=
pduel
->
game_field
->
core
.
current_chain
.
back
().
triggering_effect
;
else
peffect
=
pduel
->
game_field
->
core
.
current_chain
[
chaincount
-
1
].
triggering_effect
;
if
(
peffect
->
is_flag
(
EFFECT_FLAG2_NAGA
))
ret
=
FALSE
;
else
ret
=
TRUE
;
}
lua_pushboolean
(
L
,
ret
);
return
1
;
}
int32
scriptlib
::
duel_is_chain_disablable
(
lua_State
*
L
)
{
check_param_count
(
L
,
1
);
int32
chaincount
=
lua_tointeger
(
L
,
1
);
duel
*
pduel
=
interpreter
::
get_duel_info
(
L
);
lua_pushboolean
(
L
,
pduel
->
game_field
->
is_chain_disablable
(
chaincount
,
TRUE
));
int32
ret
=
0
;
if
(
chaincount
<
0
||
chaincount
>
(
int32
)
pduel
->
game_field
->
core
.
current_chain
.
size
())
ret
=
FALSE
;
else
{
effect
*
peffect
;
if
(
chaincount
==
0
)
peffect
=
pduel
->
game_field
->
core
.
current_chain
.
back
().
triggering_effect
;
else
peffect
=
pduel
->
game_field
->
core
.
current_chain
[
chaincount
-
1
].
triggering_effect
;
if
(
peffect
->
is_flag
(
EFFECT_FLAG2_NAGA
))
ret
=
FALSE
;
else
ret
=
TRUE
;
}
lua_pushboolean
(
L
,
ret
);
return
1
;
}
int32
scriptlib
::
duel_check_chain_target
(
lua_State
*
L
)
{
...
...
operations.cpp
View file @
36b7354f
...
...
@@ -18,7 +18,7 @@ int32 field::negate_chain(uint8 chaincount) {
if
(
chaincount
>
core
.
current_chain
.
size
()
||
chaincount
<
1
)
chaincount
=
core
.
current_chain
.
size
();
chain
&
pchain
=
core
.
current_chain
[
chaincount
-
1
];
if
(
!
(
pchain
.
flag
&
CHAIN_DISABLE_ACTIVATE
)
&&
check_chain_negat
e
(
pchain
.
chain_count
)
if
(
!
(
pchain
.
flag
&
CHAIN_DISABLE_ACTIVATE
)
&&
is_chain_negatabl
e
(
pchain
.
chain_count
)
&&
pchain
.
triggering_effect
->
handler
->
is_affect_by_effect
(
core
.
reason_effect
)
)
{
pchain
.
flag
|=
CHAIN_DISABLE_ACTIVATE
;
pchain
.
disable_reason
=
core
.
reason_effect
;
...
...
@@ -41,7 +41,7 @@ int32 field::disable_chain(uint8 chaincount) {
if
(
chaincount
>
core
.
current_chain
.
size
()
||
chaincount
<
1
)
chaincount
=
core
.
current_chain
.
size
();
chain
&
pchain
=
core
.
current_chain
[
chaincount
-
1
];
if
(
!
(
pchain
.
flag
&
CHAIN_DISABLE_EFFECT
)
&&
check_chain_dis
able
(
pchain
.
chain_count
)
if
(
!
(
pchain
.
flag
&
CHAIN_DISABLE_EFFECT
)
&&
is_chain_disabl
able
(
pchain
.
chain_count
)
&&
pchain
.
triggering_effect
->
handler
->
is_affect_by_effect
(
core
.
reason_effect
))
{
core
.
current_chain
[
chaincount
-
1
].
flag
|=
CHAIN_DISABLE_EFFECT
;
core
.
current_chain
[
chaincount
-
1
].
disable_reason
=
core
.
reason_effect
;
...
...
processor.cpp
View file @
36b7354f
...
...
@@ -4564,7 +4564,7 @@ int32 field::solve_chain(uint16 step, uint32 chainend_arg1, uint32 chainend_arg2
}
case
1
:
{
effect
*
peffect
=
cait
->
triggering_effect
;
if
(
cait
->
flag
&
CHAIN_DISABLE_ACTIVATE
&&
check_chain_negat
e
(
cait
->
chain_count
))
{
if
(
cait
->
flag
&
CHAIN_DISABLE_ACTIVATE
&&
is_chain_negatabl
e
(
cait
->
chain_count
))
{
remove_oath_effect
(
peffect
);
if
(
peffect
->
is_flag
(
EFFECT_FLAG_COUNT_LIMIT
)
&&
(
peffect
->
count_code
&
EFFECT_COUNT_CODE_OATH
))
{
dec_effect_code
(
peffect
->
count_code
,
cait
->
triggering_player
);
...
...
@@ -4601,7 +4601,7 @@ int32 field::solve_chain(uint16 step, uint32 chainend_arg1, uint32 chainend_arg2
core
.
spsummon_state_count_tmp
[
0
]
=
core
.
spsummon_state_count
[
0
];
core
.
spsummon_state_count_tmp
[
1
]
=
core
.
spsummon_state_count
[
1
];
card
*
pcard
=
cait
->
triggering_effect
->
get_handler
();
if
(
check_chain_dis
able
(
cait
->
chain_count
))
{
if
(
is_chain_disabl
able
(
cait
->
chain_count
))
{
if
(
is_chain_disabled
(
cait
->
chain_count
)
||
(
pcard
->
get_status
(
STATUS_DISABLED
|
STATUS_FORBIDDEN
)
&&
pcard
->
is_has_relation
(
*
cait
)))
{
if
(
!
(
cait
->
flag
&
CHAIN_DISABLE_EFFECT
))
{
pduel
->
write_buffer8
(
MSG_CHAIN_DISABLED
);
...
...
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