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
a982b748
Commit
a982b748
authored
Dec 02, 2021
by
nanahira
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'master' of github.com:Fluorohydride/ygopro-core
parents
9235e8e2
fa5440d1
Changes
7
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
58 additions
and
21 deletions
+58
-21
effect.cpp
effect.cpp
+14
-8
effect.h
effect.h
+3
-1
field.cpp
field.cpp
+5
-5
field.h
field.h
+2
-1
interpreter.cpp
interpreter.cpp
+18
-1
libeffect.cpp
libeffect.cpp
+1
-1
processor.cpp
processor.cpp
+15
-4
No files found.
effect.cpp
View file @
a982b748
...
...
@@ -84,7 +84,7 @@ int32 effect::is_can_be_forbidden() {
// check if a single/field/equip effect is available
// check properties: range, EFFECT_FLAG_OWNER_RELATE, STATUS_BATTLE_DESTROYED, STATUS_EFFECT_ENABLED, disabled/forbidden
// check fucntions: condition
int32
effect
::
is_available
()
{
int32
effect
::
is_available
(
int32
neglect_disabled
)
{
if
(
type
&
EFFECT_TYPE_ACTIONS
)
return
FALSE
;
if
((
type
&
(
EFFECT_TYPE_SINGLE
|
EFFECT_TYPE_XMATERIAL
))
&&
!
(
type
&
EFFECT_TYPE_FIELD
))
{
...
...
@@ -102,9 +102,9 @@ int32 effect::is_available() {
return
FALSE
;
if
(
powner
==
phandler
&&
is_can_be_forbidden
()
&&
phandler
->
get_status
(
STATUS_FORBIDDEN
))
return
FALSE
;
if
(
is_flag
(
EFFECT_FLAG_OWNER_RELATE
)
&&
!
is_flag
(
EFFECT_FLAG_CANNOT_DISABLE
)
&&
powner
->
is_status
(
STATUS_DISABLED
))
if
(
is_flag
(
EFFECT_FLAG_OWNER_RELATE
)
&&
!
(
is_flag
(
EFFECT_FLAG_CANNOT_DISABLE
)
||
neglect_disabled
)
&&
powner
->
is_status
(
STATUS_DISABLED
))
return
FALSE
;
if
(
powner
==
phandler
&&
!
is_flag
(
EFFECT_FLAG_CANNOT_DISABLE
)
&&
phandler
->
get_status
(
STATUS_DISABLED
))
if
(
powner
==
phandler
&&
!
(
is_flag
(
EFFECT_FLAG_CANNOT_DISABLE
)
||
neglect_disabled
)
&&
phandler
->
get_status
(
STATUS_DISABLED
))
return
FALSE
;
}
if
(
type
&
EFFECT_TYPE_EQUIP
)
{
...
...
@@ -114,9 +114,9 @@ int32 effect::is_available() {
return
FALSE
;
if
(
owner
==
handler
&&
is_can_be_forbidden
()
&&
handler
->
get_status
(
STATUS_FORBIDDEN
))
return
FALSE
;
if
(
is_flag
(
EFFECT_FLAG_OWNER_RELATE
)
&&
!
is_flag
(
EFFECT_FLAG_CANNOT_DISABLE
)
&&
owner
->
is_status
(
STATUS_DISABLED
))
if
(
is_flag
(
EFFECT_FLAG_OWNER_RELATE
)
&&
!
(
is_flag
(
EFFECT_FLAG_CANNOT_DISABLE
)
||
neglect_disabled
)
&&
owner
->
is_status
(
STATUS_DISABLED
))
return
FALSE
;
if
(
owner
==
handler
&&
!
is_flag
(
EFFECT_FLAG_CANNOT_DISABLE
)
&&
handler
->
get_status
(
STATUS_DISABLED
))
if
(
owner
==
handler
&&
!
(
is_flag
(
EFFECT_FLAG_CANNOT_DISABLE
)
||
neglect_disabled
)
&&
handler
->
get_status
(
STATUS_DISABLED
))
return
FALSE
;
if
(
!
is_flag
(
EFFECT_FLAG_SET_AVAILABLE
))
{
if
(
!
(
handler
->
get_status
(
STATUS_EFFECT_ENABLED
)))
...
...
@@ -141,9 +141,9 @@ int32 effect::is_available() {
return
FALSE
;
if
(
powner
==
phandler
&&
is_can_be_forbidden
()
&&
phandler
->
get_status
(
STATUS_FORBIDDEN
))
return
FALSE
;
if
(
is_flag
(
EFFECT_FLAG_OWNER_RELATE
)
&&
!
is_flag
(
EFFECT_FLAG_CANNOT_DISABLE
)
&&
powner
->
is_status
(
STATUS_DISABLED
))
if
(
is_flag
(
EFFECT_FLAG_OWNER_RELATE
)
&&
!
(
is_flag
(
EFFECT_FLAG_CANNOT_DISABLE
)
||
neglect_disabled
)
&&
powner
->
is_status
(
STATUS_DISABLED
))
return
FALSE
;
if
(
powner
==
phandler
&&
!
is_flag
(
EFFECT_FLAG_CANNOT_DISABLE
)
&&
phandler
->
get_status
(
STATUS_DISABLED
))
if
(
powner
==
phandler
&&
!
(
is_flag
(
EFFECT_FLAG_CANNOT_DISABLE
)
||
neglect_disabled
)
&&
phandler
->
get_status
(
STATUS_DISABLED
))
return
FALSE
;
if
(
phandler
->
is_status
(
STATUS_BATTLE_DESTROYED
)
&&
!
is_flag
(
EFFECT_FLAG2_AVAILABLE_BD
))
return
FALSE
;
...
...
@@ -161,6 +161,10 @@ int32 effect::is_available() {
status
&=
~
EFFECT_STATUS_AVAILABLE
;
return
res
;
}
// check if a count limit effect counter is available, which should be available even if the effect is disabled
int32
effect
::
limit_counter_is_available
()
{
return
is_available
(
TRUE
);
}
// check if a effect is EFFECT_TYPE_SINGLE and is ready
// check: range, enabled, condition
int32
effect
::
is_single_ready
()
{
...
...
@@ -302,6 +306,8 @@ int32 effect::is_activateable(uint8 playerid, const tevent& e, int32 neglect_con
return
FALSE
;
if
((
phandler
->
get_type
()
&
TYPE_CONTINUOUS
)
&&
(
phandler
->
get_type
()
&
TYPE_EQUIP
))
return
FALSE
;
if
((
type
&
EFFECT_TYPE_QUICK_O
)
&&
is_flag
(
EFFECT_FLAG_DELAY
)
&&
!
in_range
(
phandler
))
return
FALSE
;
if
(
!
neglect_faceup
&&
(
phandler
->
current
.
location
&
(
LOCATION_ONFIELD
|
LOCATION_REMOVED
)))
{
if
(
!
phandler
->
is_position
(
POS_FACEUP
)
&&
!
is_flag
(
EFFECT_FLAG_SET_AVAILABLE
))
return
FALSE
;
...
...
@@ -626,7 +632,7 @@ int32 effect::reset(uint32 reset_level, uint32 reset_type) {
return
FALSE
;
uint8
pid
=
get_owner_player
();
uint8
tp
=
handler
->
pduel
->
game_field
->
infos
.
turn_player
;
if
((((
reset_flag
&
RESET_SELF_TURN
)
&&
pid
==
tp
)
||
((
reset_flag
&
RESET_OPPO_TURN
)
&&
pid
!=
tp
))
if
((((
reset_flag
&
RESET_SELF_TURN
)
&&
pid
==
tp
)
||
((
reset_flag
&
RESET_OPPO_TURN
)
&&
pid
!=
tp
))
&&
(
reset_level
&
0x3ff
&
reset_flag
))
reset_count
--
;
if
(
reset_count
==
0
)
...
...
effect.h
View file @
a982b748
...
...
@@ -68,7 +68,8 @@ public:
int32
is_disable_related
();
int32
is_self_destroy_related
();
int32
is_can_be_forbidden
();
int32
is_available
();
int32
is_available
(
int32
neglect_disabled
=
FALSE
);
int32
limit_counter_is_available
();
int32
is_single_ready
();
int32
check_count_limit
(
uint8
playerid
);
int32
is_activateable
(
uint8
playerid
,
const
tevent
&
e
,
int32
neglect_cond
=
FALSE
,
int32
neglect_cost
=
FALSE
,
int32
neglect_target
=
FALSE
,
int32
neglect_loc
=
FALSE
,
int32
neglect_faceup
=
FALSE
);
...
...
@@ -478,6 +479,7 @@ inline effect_flag operator|(effect_flag flag1, effect_flag flag2)
#define EFFECT_OVERLAY_RITUAL_MATERIAL 364
#define EFFECT_CHANGE_GRAVE_ATTRIBUTE 365
#define EFFECT_CHANGE_GRAVE_RACE 366
#define EFFECT_ACTIVATION_COUNT_LIMIT 367
#define EVENT_STARTUP 1000
#define EVENT_FLIP 1001
...
...
field.cpp
View file @
a982b748
...
...
@@ -614,7 +614,7 @@ int32 field::is_location_useable(uint32 playerid, uint32 location, uint32 sequen
* Return usable count in zone of playerid's MZONE or SZONE(0~4) when uplayer moves pcard to playerid's field (can be negative).
* for LOCATION_MZONE, "usable" means not used, not disabled, satisfying EFFECT_MUST_USE_MZONE, satisfying EFFECT_MAX_MZONE
* for LOCATION_SZONE, "usable" means not used, not disabled, satisfying EFFECT_MAX_SZONE
*
*
* @param pcard the card about to move
* @param playerid the target player
* @param location LOCATION_MZONE or LOCATION_SZONE
...
...
@@ -622,8 +622,8 @@ int32 field::is_location_useable(uint32 playerid, uint32 location, uint32 sequen
* @param reason location reason
* @param zone specified zones, 0xff by default
* @param list storing unavailable or unspecified zones
*
* @return usable count in zone of playerid's MZONE or SZONE(0~4) (can be negative)
*
* @return usable count in zone of playerid's MZONE or SZONE(0~4) (can be negative)
*/
int32
field
::
get_useable_count
(
card
*
pcard
,
uint8
playerid
,
uint8
location
,
uint8
uplayer
,
uint32
reason
,
uint32
zone
,
uint32
*
list
)
{
if
(
location
==
LOCATION_MZONE
&&
pcard
&&
pcard
->
current
.
location
==
LOCATION_EXTRA
)
...
...
@@ -705,7 +705,7 @@ int32 field::get_useable_count_other(card* pcard, uint8 playerid, uint8 location
count
=
limit
;
return
count
;
}
/**
/**
* @return the number of available grids in zone of Main MZONE or SZONE(0~4)
* for LOCATION_MZONE, "available" means not used, not disabled, satisfying EFFECT_MUST_USE_MZONE
* for LOCATION_SZONE, "available" means not used, not disabled
...
...
@@ -2283,7 +2283,7 @@ void field::set_spsummon_counter(uint8 playerid) {
if
(
core
.
global_flag
&
GLOBALFLAG_SPSUMMON_COUNT
)
{
for
(
auto
&
peffect
:
effects
.
spsummon_count_eff
)
{
card
*
pcard
=
peffect
->
get_handler
();
if
(
peffect
->
is_available
())
{
if
(
peffect
->
limit_counter_
is_available
())
{
if
(((
playerid
==
pcard
->
current
.
controler
)
&&
peffect
->
s_range
)
||
((
playerid
!=
pcard
->
current
.
controler
)
&&
peffect
->
o_range
))
{
pcard
->
spsummon_counter
[
playerid
]
++
;
}
...
...
field.h
View file @
a982b748
...
...
@@ -71,7 +71,7 @@ struct chain {
uint32
flag
;
chain
()
:
chain_id
(
0
),
chain_count
(
0
),
triggering_player
(
PLAYER_NONE
),
triggering_controler
(
PLAYER_NONE
),
triggering_location
(
0
),
triggering_sequence
(
0
),
triggering_position
(
0
),
:
chain_id
(
0
),
chain_count
(
0
),
triggering_player
(
PLAYER_NONE
),
triggering_controler
(
PLAYER_NONE
),
triggering_location
(
0
),
triggering_sequence
(
0
),
triggering_position
(
0
),
triggering_state
(),
triggering_effect
(
nullptr
),
target_cards
(
nullptr
),
replace_op
(
0
),
target_player
(
PLAYER_NONE
),
target_param
(
0
),
disable_reason
(
nullptr
),
disable_player
(
PLAYER_NONE
),
evt
(),
flag
(
0
)
{}
static
bool
chain_operation_sort
(
const
chain
&
c1
,
const
chain
&
c2
);
...
...
@@ -726,6 +726,7 @@ public:
#define GLOBALFLAG_SELF_TOGRAVE 0x100
#define GLOBALFLAG_SPSUMMON_ONCE 0x200
#define GLOBALFLAG_TUNE_MAGICIAN 0x400
#define GLOBALFLAG_ACTIVATION_COUNT 0x800
//
#define PROCESSOR_NONE 0
#define PROCESSOR_WAITING 0x10000
...
...
interpreter.cpp
View file @
a982b748
...
...
@@ -29,11 +29,19 @@ interpreter::interpreter(duel* pd): coroutines(256) {
lua_setglobal
(
lua_state
,
"io"
);
lua_pushnil
(
lua_state
);
lua_setglobal
(
lua_state
,
"os"
);
lua_pushnil
(
lua_state
);
lua_setglobal
(
lua_state
,
"package"
);
lua_pushnil
(
lua_state
);
lua_setglobal
(
lua_state
,
"debug"
);
luaL_getsubtable
(
lua_state
,
LUA_REGISTRYINDEX
,
"_LOADED"
);
lua_pushnil
(
lua_state
);
lua_setfield
(
lua_state
,
-
2
,
"io"
);
lua_pushnil
(
lua_state
);
lua_setfield
(
lua_state
,
-
2
,
"os"
);
lua_pushnil
(
lua_state
);
lua_setfield
(
lua_state
,
-
2
,
"package"
);
lua_pushnil
(
lua_state
);
lua_setfield
(
lua_state
,
-
2
,
"debug"
);
lua_pop
(
lua_state
,
1
);
#endif
//add bit lib back
...
...
@@ -241,9 +249,18 @@ int32 interpreter::load_card_script(uint32 code) {
lua_pushstring
(
current_state
,
"__index"
);
lua_pushvalue
(
current_state
,
-
2
);
lua_rawset
(
current_state
,
-
3
);
lua_getglobal
(
current_state
,
class_name
);
lua_setglobal
(
current_state
,
"self_table"
);
lua_pushinteger
(
current_state
,
code
);
lua_setglobal
(
current_state
,
"self_code"
);
char
script_name
[
64
];
sprintf
(
script_name
,
"./script/c%d.lua"
,
code
);
if
(
!
load_script
(
script_name
))
{
int32
res
=
load_script
(
script_name
);
lua_pushnil
(
current_state
);
lua_setglobal
(
current_state
,
"self_table"
);
lua_pushnil
(
current_state
);
lua_setglobal
(
current_state
,
"self_code"
);
if
(
!
res
)
{
return
OPERATION_FAIL
;
}
}
...
...
libeffect.cpp
View file @
a982b748
...
...
@@ -417,7 +417,7 @@ int32 scriptlib::effect_get_owner(lua_State *L) {
check_param_count
(
L
,
1
);
check_param
(
L
,
PARAM_TYPE_EFFECT
,
1
);
effect
*
peffect
=
*
(
effect
**
)
lua_touserdata
(
L
,
1
);
interpreter
::
card2value
(
L
,
peffect
->
owner
);
interpreter
::
card2value
(
L
,
peffect
->
get_owner
()
);
return
1
;
}
int32
scriptlib
::
effect_get_handler
(
lua_State
*
L
)
{
...
...
processor.cpp
View file @
a982b748
...
...
@@ -1683,6 +1683,13 @@ int32 field::process_quick_effect(int16 step, int32 skip_freechain, uint8 priori
core
.
select_chains
.
push_back
(
newchain
);
}
}
pr
=
effects
.
quick_o_effect
.
equal_range
(
ev
.
event_code
);
for
(
auto
eit
=
pr
.
first
;
eit
!=
pr
.
second
;)
{
effect
*
peffect
=
eit
->
second
;
++
eit
;
if
(
peffect
->
is_flag
(
EFFECT_FLAG_DELAY
)
&&
peffect
->
is_condition_check
(
peffect
->
get_handler
()
->
current
.
controler
,
ev
))
core
.
delayed_quick
.
emplace
(
peffect
,
ev
);
}
}
// delayed quick
for
(
auto
eit
=
core
.
delayed_quick
.
begin
();
eit
!=
core
.
delayed_quick
.
end
();)
{
...
...
@@ -3158,11 +3165,11 @@ int32 field::process_battle_command(uint16 step) {
if
(
core
.
attack_target
)
raise_single_event
(
core
.
attack_target
,
0
,
EVENT_DAMAGE_STEP_END
,
0
,
0
,
0
,
0
,
1
);
raise_event
((
card
*
)
0
,
EVENT_DAMAGE_STEP_END
,
0
,
0
,
0
,
0
,
0
);
process_single_event
();
process_instant_event
();
core
.
attacker
->
set_status
(
STATUS_BATTLE_DESTROYED
,
FALSE
);
if
(
core
.
attack_target
)
core
.
attack_target
->
set_status
(
STATUS_BATTLE_DESTROYED
,
FALSE
);
process_single_event
();
process_instant_event
();
pduel
->
write_buffer8
(
MSG_HINT
);
pduel
->
write_buffer8
(
HINT_EVENT
);
pduel
->
write_buffer8
(
0
);
...
...
@@ -3432,6 +3439,7 @@ void field::calculate_battle_damage(effect** pdamchange, card** preason_card, ui
}
effect_set
eset
;
core
.
attacker
->
filter_effect
(
EFFECT_CHANGE_BATTLE_DAMAGE
,
&
eset
,
FALSE
);
core
.
attacker
->
filter_effect
(
EFFECT_CHANGE_INVOLVING_BATTLE_DAMAGE
,
&
eset
,
FALSE
);
core
.
attack_target
->
filter_effect
(
EFFECT_CHANGE_INVOLVING_BATTLE_DAMAGE
,
&
eset
,
FALSE
);
filter_player_effect
(
pa
,
EFFECT_CHANGE_BATTLE_DAMAGE
,
&
eset
,
FALSE
);
filter_player_effect
(
1
-
pa
,
EFFECT_CHANGE_BATTLE_DAMAGE
,
&
eset
,
FALSE
);
...
...
@@ -3551,6 +3559,7 @@ void field::calculate_battle_damage(effect** pdamchange, card** preason_card, ui
}
effect_set
eset
;
reason_card
->
filter_effect
(
EFFECT_CHANGE_BATTLE_DAMAGE
,
&
eset
,
FALSE
);
reason_card
->
filter_effect
(
EFFECT_CHANGE_INVOLVING_BATTLE_DAMAGE
,
&
eset
,
FALSE
);
if
(
dam_card
)
dam_card
->
filter_effect
(
EFFECT_CHANGE_INVOLVING_BATTLE_DAMAGE
,
&
eset
,
FALSE
);
filter_player_effect
(
damp
,
EFFECT_CHANGE_BATTLE_DAMAGE
,
&
eset
,
FALSE
);
...
...
@@ -5034,8 +5043,10 @@ int32 field::adjust_step(uint16 step) {
return
FALSE
;
}
case
15
:
{
raise_event
((
card
*
)
0
,
EVENT_ADJUST
,
0
,
0
,
PLAYER_NONE
,
PLAYER_NONE
,
0
);
process_instant_event
();
if
(
!
check_event
(
EVENT_ADJUST
))
{
raise_event
((
card
*
)
0
,
EVENT_ADJUST
,
0
,
0
,
PLAYER_NONE
,
PLAYER_NONE
,
0
);
process_instant_event
();
}
return
FALSE
;
}
case
16
:
{
...
...
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