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
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
MyCard
ygopro-core
Commits
256d78bf
Commit
256d78bf
authored
Dec 26, 2019
by
DailyShana
Committed by
GitHub
Dec 26, 2019
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
both/also battle damage (#263)
add EFFECT_BOTH_BATTLE_DAMAGE and EFFECT_ALSO_BATTLE_DAMAGE
parent
bf74fbb6
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
156 additions
and
97 deletions
+156
-97
effect.h
effect.h
+2
-0
processor.cpp
processor.cpp
+154
-97
No files found.
effect.h
View file @
256d78bf
...
@@ -363,6 +363,8 @@ inline effect_flag operator|(effect_flag flag1, effect_flag flag2)
...
@@ -363,6 +363,8 @@ inline effect_flag operator|(effect_flag flag1, effect_flag flag2)
#define EFFECT_PIERCE 203
#define EFFECT_PIERCE 203
#define EFFECT_BATTLE_DESTROY_REDIRECT 204
#define EFFECT_BATTLE_DESTROY_REDIRECT 204
#define EFFECT_BATTLE_DAMAGE_TO_EFFECT 205
#define EFFECT_BATTLE_DAMAGE_TO_EFFECT 205
#define EFFECT_BOTH_BATTLE_DAMAGE 206
#define EFFECT_ALSO_BATTLE_DAMAGE 207
#define EFFECT_TOSS_COIN_REPLACE 220
#define EFFECT_TOSS_COIN_REPLACE 220
#define EFFECT_TOSS_DICE_REPLACE 221
#define EFFECT_TOSS_DICE_REPLACE 221
#define EFFECT_FUSION_MATERIAL 230
#define EFFECT_FUSION_MATERIAL 230
...
...
processor.cpp
View file @
256d78bf
...
@@ -3264,6 +3264,7 @@ void field::calculate_battle_damage(effect** pdamchange, card** preason_card, ui
...
@@ -3264,6 +3264,7 @@ void field::calculate_battle_damage(effect** pdamchange, card** preason_card, ui
effect* damchange = 0;
effect* damchange = 0;
card* reason_card = 0;
card* reason_card = 0;
uint8 bd[2] = {FALSE, FALSE};
uint8 bd[2] = {FALSE, FALSE};
bool pierce = false;
core.battle_damage[0] = core.battle_damage[1] = 0;
core.battle_damage[0] = core.battle_damage[1] = 0;
if(core.attacker->is_position(POS_FACEUP_DEFENSE)) {
if(core.attacker->is_position(POS_FACEUP_DEFENSE)) {
effect* defattack = core.attacker->is_affected_by_effect(EFFECT_DEFENSE_ATTACK);
effect* defattack = core.attacker->is_affected_by_effect(EFFECT_DEFENSE_ATTACK);
...
@@ -3277,46 +3278,14 @@ void field::calculate_battle_damage(effect** pdamchange, card** preason_card, ui
...
@@ -3277,46 +3278,14 @@ void field::calculate_battle_damage(effect** pdamchange, card** preason_card, ui
if(core.attack_target->is_position(POS_ATTACK)) {
if(core.attack_target->is_position(POS_ATTACK)) {
d = da;
d = da;
if(a > d) {
if(a > d) {
damchange = core.attacker->is_affected_by_effect(EFFECT_BATTLE_DAMAGE_TO_EFFECT);
damp = pd;
if(damchange) {
core.battle_damage[damp] = a - d;
damp = pd;
reason_card = core.attacker;
core.battle_damage[damp] = a - d;
reason_card = core.attacker;
} else if(!core.attacker->is_affected_by_effect(EFFECT_NO_BATTLE_DAMAGE)
&& !core.attack_target->is_affected_by_effect(EFFECT_AVOID_BATTLE_DAMAGE, core.attacker)
&& !is_player_affected_by_effect(pd, EFFECT_AVOID_BATTLE_DAMAGE)) {
if(core.attack_target->is_affected_by_effect(EFFECT_REFLECT_BATTLE_DAMAGE, core.attacker))
damp = 1 - pd;
else damp = pd;
if(is_player_affected_by_effect(damp, EFFECT_REFLECT_BATTLE_DAMAGE))
damp = 1 - damp;
if(damp == pd || (!core.attacker->is_affected_by_effect(EFFECT_AVOID_BATTLE_DAMAGE, core.attack_target)
&& !is_player_affected_by_effect(damp, EFFECT_AVOID_BATTLE_DAMAGE))) {
core.battle_damage[damp] = a - d;
reason_card = core.attacker;
}
}
bd[1] = TRUE;
bd[1] = TRUE;
} else if (a < d) {
} else if(a < d) {
damchange = core.attack_target->is_affected_by_effect(EFFECT_BATTLE_DAMAGE_TO_EFFECT);
damp = pa;
if(damchange) {
core.battle_damage[damp] = d - a;
damp = pa;
reason_card = core.attack_target;
core.battle_damage[damp] = d - a;
reason_card = core.attack_target;
} else if(!core.attack_target->is_affected_by_effect(EFFECT_NO_BATTLE_DAMAGE)
&& !core.attacker->is_affected_by_effect(EFFECT_AVOID_BATTLE_DAMAGE, core.attack_target)
&& !is_player_affected_by_effect(pa, EFFECT_AVOID_BATTLE_DAMAGE)) {
if(core.attacker->is_affected_by_effect(EFFECT_REFLECT_BATTLE_DAMAGE, core.attack_target))
damp = 1 - pa;
else damp = pa;
if(is_player_affected_by_effect(damp, EFFECT_REFLECT_BATTLE_DAMAGE))
damp = 1 - damp;
if(damp == pa || (!core.attack_target->is_affected_by_effect(EFFECT_AVOID_BATTLE_DAMAGE, core.attacker)
&& !is_player_affected_by_effect(damp, EFFECT_AVOID_BATTLE_DAMAGE))) {
core.battle_damage[damp] = d - a;
reason_card = core.attack_target;
}
}
bd[0] = TRUE;
bd[0] = TRUE;
} else {
} else {
if(a != 0) {
if(a != 0) {
...
@@ -3328,35 +3297,16 @@ void field::calculate_battle_damage(effect** pdamchange, card** preason_card, ui
...
@@ -3328,35 +3297,16 @@ void field::calculate_battle_damage(effect** pdamchange, card** preason_card, ui
d = dd;
d = dd;
if(a > d) {
if(a > d) {
effect_set eset;
effect_set eset;
uint8 dp[2];
dp[0] = dp[1] = 0;
core.attacker->filter_effect(EFFECT_PIERCE, &eset);
core.attacker->filter_effect(EFFECT_PIERCE, &eset);
if(eset.size() && !core.attacker->is_affected_by_effect(EFFECT_NO_BATTLE_DAMAGE)
if(eset.size()) {
&& !core.attack_target->is_affected_by_effect(EFFECT_AVOID_BATTLE_DAMAGE, core.attacker)) {
pierce = true;
for(int32 i = 0; i < eset.size(); ++i)
uint8 dp[2] = {};
for(uint32 i = 0; i < eset.size(); ++i)
dp[1 - eset[i]->get_handler_player()] = 1;
dp[1 - eset[i]->get_handler_player()] = 1;
if(dp[0] && is_player_affected_by_effect(0, EFFECT_AVOID_BATTLE_DAMAGE))
if(dp[0])
dp[0] = 0;
core.battle_damage[0] = a - d;
if(dp[1] && is_player_affected_by_effect(1, EFFECT_AVOID_BATTLE_DAMAGE))
if(dp[1])
dp[1] = 0;
core.battle_damage[1] = a - d;
if(dp[pd] && core.attack_target->is_affected_by_effect(EFFECT_REFLECT_BATTLE_DAMAGE, core.attacker)) {
dp[pd] = 0;
dp[1 - pd] = 1;
}
if(dp[pd] && is_player_affected_by_effect(pd, EFFECT_REFLECT_BATTLE_DAMAGE)) {
dp[pd] = 0;
dp[1 - pd] = 1;
}
if(dp[1 - pd] && is_player_affected_by_effect(1 - pd, EFFECT_REFLECT_BATTLE_DAMAGE)) {
dp[pd] = 1;
dp[1 - pd] = 0;
}
if(dp[pd] && !core.attack_target->is_affected_by_effect(EFFECT_AVOID_BATTLE_DAMAGE, core.attacker)
&& !is_player_affected_by_effect(pd, EFFECT_AVOID_BATTLE_DAMAGE))
core.battle_damage[pd] = a - d;
if(dp[1 - pd] && !core.attacker->is_affected_by_effect(EFFECT_AVOID_BATTLE_DAMAGE, core.attack_target)
&& !is_player_affected_by_effect(1 - pd, EFFECT_AVOID_BATTLE_DAMAGE))
core.battle_damage[1 - pd] = a - d;
bool double_damage = false;
bool double_damage = false;
//bool half_damage = false;
//bool half_damage = false;
for(int32 i = 0; i < eset.size(); ++i) {
for(int32 i = 0; i < eset.size(); ++i) {
...
@@ -3381,48 +3331,155 @@ void field::calculate_battle_damage(effect** pdamchange, card** preason_card, ui
...
@@ -3381,48 +3331,155 @@ void field::calculate_battle_damage(effect** pdamchange, card** preason_card, ui
// if(dp[1])
// if(dp[1])
// core.battle_damage[1] /= 2;
// core.battle_damage[1] /= 2;
//}
//}
bool both = dp[0] && dp[1];
if(!both) {
damp = dp[0] ? 0 : 1;
if(core.attacker->is_affected_by_effect(EFFECT_BOTH_BATTLE_DAMAGE)
|| core.attack_target->is_affected_by_effect(EFFECT_BOTH_BATTLE_DAMAGE)) {
core.battle_damage[1 - damp] = core.battle_damage[damp];
both = true;
}
}
effect* reflect[2] = {};
if(!(reflect[pd] = core.attack_target->is_affected_by_effect(EFFECT_REFLECT_BATTLE_DAMAGE, core.attacker)))
reflect[pd] = is_player_affected_by_effect(pd, EFFECT_REFLECT_BATTLE_DAMAGE);
if(!(reflect[1 - pd] = core.attacker->is_affected_by_effect(EFFECT_REFLECT_BATTLE_DAMAGE, core.attack_target)))
reflect[1 - pd] = is_player_affected_by_effect(1 - pd, EFFECT_REFLECT_BATTLE_DAMAGE);
bool also[2] = { false, false };
if(!both
&& (core.attack_target->is_affected_by_effect(EFFECT_ALSO_BATTLE_DAMAGE)
|| is_player_affected_by_effect(pd, EFFECT_ALSO_BATTLE_DAMAGE)))
also[pd] = true;
if(!both
&& (core.attacker->is_affected_by_effect(EFFECT_ALSO_BATTLE_DAMAGE)
|| is_player_affected_by_effect(1 - pd, EFFECT_ALSO_BATTLE_DAMAGE)))
also[1 - pd] = true;
if(both) {
//turn player's effect applies first
if(reflect[pa] && reflect[pa]->get_handler_player() == pa) {
core.battle_damage[1 - pa] += core.battle_damage[pa];
core.battle_damage[pa] = 0;
} else if(reflect[1 - pa] && reflect[1 - pa]->get_handler_player() == pa) {
core.battle_damage[pa] += core.battle_damage[1 - pa];
core.battle_damage[1 - pa] = 0;
} else if(reflect[pa] && reflect[pa]->get_handler_player() == 1 - pa) {
core.battle_damage[1 - pa] += core.battle_damage[pa];
core.battle_damage[pa] = 0;
} else if(reflect[1 - pa] && reflect[1 - pa]->get_handler_player() == 1 - pa) {
core.battle_damage[pa] += core.battle_damage[1 - pa];
core.battle_damage[1 - pa] = 0;
}
} else {
if(reflect[damp]) {
if(!also[1 - damp]) {
core.battle_damage[1 - damp] += core.battle_damage[damp];
core.battle_damage[damp] = 0;
} else {
core.battle_damage[1 - damp] += core.battle_damage[damp];
core.battle_damage[damp] = core.battle_damage[1 - damp];
}
} else if(also[damp]) {
if(!reflect[1 - damp]) {
core.battle_damage[1 - damp] += core.battle_damage[damp];
} else {
core.battle_damage[1 - damp] += core.battle_damage[damp];
core.battle_damage[damp] += core.battle_damage[1 - damp];
core.battle_damage[1 - damp] = 0;
}
}
}
if(core.attacker->is_affected_by_effect(EFFECT_NO_BATTLE_DAMAGE)
|| core.attack_target->is_affected_by_effect(EFFECT_AVOID_BATTLE_DAMAGE, core.attacker)
|| is_player_affected_by_effect(pd, EFFECT_AVOID_BATTLE_DAMAGE))
core.battle_damage[pd] = 0;
if(core.attack_target->is_affected_by_effect(EFFECT_NO_BATTLE_DAMAGE)
|| core.attacker->is_affected_by_effect(EFFECT_AVOID_BATTLE_DAMAGE, core.attack_target)
|| is_player_affected_by_effect(1 - pd, EFFECT_AVOID_BATTLE_DAMAGE))
core.battle_damage[1 - pd] = 0;
reason_card = core.attacker;
reason_card = core.attacker;
}
}
bd[1] = TRUE;
bd[1] = TRUE;
} else if (a < d) {
} else if(a < d) {
damchange = core.attack_target->is_affected_by_effect(EFFECT_BATTLE_DAMAGE_TO_EFFECT);
damp = pa;
if(damchange) {
core.battle_damage[damp] = d - a;
damp = pa;
reason_card = core.attack_target;
core.battle_damage[damp] = d - a;
reason_card = core.attack_target;
} else if(!core.attack_target->is_affected_by_effect(EFFECT_NO_BATTLE_DAMAGE)
&& !core.attacker->is_affected_by_effect(EFFECT_AVOID_BATTLE_DAMAGE, core.attack_target)
&& !is_player_affected_by_effect(pa, EFFECT_AVOID_BATTLE_DAMAGE)) {
if(core.attacker->is_affected_by_effect(EFFECT_REFLECT_BATTLE_DAMAGE, core.attack_target))
damp = 1 - pa;
else damp = pa;
if(is_player_affected_by_effect(damp, EFFECT_REFLECT_BATTLE_DAMAGE))
damp = 1 - damp;
if(damp == pa || (!core.attack_target->is_affected_by_effect(EFFECT_AVOID_BATTLE_DAMAGE, core.attacker)
&& !is_player_affected_by_effect(damp, EFFECT_AVOID_BATTLE_DAMAGE))) {
core.battle_damage[damp] = d - a;
reason_card = core.attack_target;
}
}
}
}
}
}
} else {
} else {
damchange = core.attacker->is_affected_by_effect(EFFECT_BATTLE_DAMAGE_TO_EFFECT);
if(a != 0) {
if(damchange) {
damp = 1 - pa;
damp = 1 - pa;
core.battle_damage[damp] = a;
core.battle_damage[damp] = a;
reason_card = core.attacker;
reason_card = core.attacker;
} else if(!core.attacker->is_affected_by_effect(EFFECT_NO_BATTLE_DAMAGE)
&& !is_player_affected_by_effect(1 - pa, EFFECT_AVOID_BATTLE_DAMAGE)) {
damp = 1 - pa;
if(is_player_affected_by_effect(damp, EFFECT_REFLECT_BATTLE_DAMAGE))
damp = 1 - damp;
if(!is_player_affected_by_effect(damp, EFFECT_AVOID_BATTLE_DAMAGE)) {
core.battle_damage[damp] = a;
reason_card = core.attacker;
}
}
}
}
}
if(reason_card && !pierce
&& !(damchange = reason_card->is_affected_by_effect(EFFECT_BATTLE_DAMAGE_TO_EFFECT))) {
card* dam_card = (reason_card == core.attacker) ? core.attack_target : core.attacker;
bool both = false;
if(reason_card->is_affected_by_effect(EFFECT_BOTH_BATTLE_DAMAGE)
|| dam_card && dam_card->is_affected_by_effect(EFFECT_BOTH_BATTLE_DAMAGE)) {
core.battle_damage[1 - damp] = core.battle_damage[damp];
both = true;
}
effect* reflect[2] = {};
if(!dam_card || !(reflect[damp] = dam_card->is_affected_by_effect(EFFECT_REFLECT_BATTLE_DAMAGE, reason_card)))
reflect[damp] = is_player_affected_by_effect(damp, EFFECT_REFLECT_BATTLE_DAMAGE);
if(!(reflect[1 - damp] = reason_card->is_affected_by_effect(EFFECT_REFLECT_BATTLE_DAMAGE, dam_card)))
reflect[1 - damp] = is_player_affected_by_effect(1 - damp, EFFECT_REFLECT_BATTLE_DAMAGE);
bool also[2] = { false, false };
if(!both
&& (dam_card && dam_card->is_affected_by_effect(EFFECT_ALSO_BATTLE_DAMAGE)
|| is_player_affected_by_effect(damp, EFFECT_ALSO_BATTLE_DAMAGE)))
also[damp] = true;
if(!both
&& (reason_card->is_affected_by_effect(EFFECT_ALSO_BATTLE_DAMAGE)
|| is_player_affected_by_effect(1 - damp, EFFECT_ALSO_BATTLE_DAMAGE)))
also[1 - damp] = true;
if(both) {
//turn player's effect applies first
if(reflect[pa] && reflect[pa]->get_handler_player() == pa) {
core.battle_damage[1 - pa] += core.battle_damage[pa];
core.battle_damage[pa] = 0;
} else if(reflect[1 - pa] && reflect[1 - pa]->get_handler_player() == pa) {
core.battle_damage[pa] += core.battle_damage[1 - pa];
core.battle_damage[1 - pa] = 0;
} else if(reflect[pa] && reflect[pa]->get_handler_player() == 1 - pa) {
core.battle_damage[1 - pa] += core.battle_damage[pa];
core.battle_damage[pa] = 0;
} else if(reflect[1 - pa] && reflect[1 - pa]->get_handler_player() == 1 - pa) {
core.battle_damage[pa] += core.battle_damage[1 - pa];
core.battle_damage[1 - pa] = 0;
}
} else {
if(reflect[damp]) {
if(!also[1 - damp]) {
core.battle_damage[1 - damp] += core.battle_damage[damp];
core.battle_damage[damp] = 0;
} else {
core.battle_damage[1 - damp] += core.battle_damage[damp];
core.battle_damage[damp] = core.battle_damage[1 - damp];
}
} else if(also[damp]) {
if(!reflect[1 - damp]) {
core.battle_damage[1 - damp] += core.battle_damage[damp];
} else {
core.battle_damage[1 - damp] += core.battle_damage[damp];
core.battle_damage[damp] += core.battle_damage[1 - damp];
core.battle_damage[1 - damp] = 0;
}
}
}
if(reason_card->is_affected_by_effect(EFFECT_NO_BATTLE_DAMAGE)
|| dam_card && dam_card->is_affected_by_effect(EFFECT_AVOID_BATTLE_DAMAGE, reason_card)
|| is_player_affected_by_effect(damp, EFFECT_AVOID_BATTLE_DAMAGE))
core.battle_damage[damp] = 0;
if(dam_card && dam_card->is_affected_by_effect(EFFECT_NO_BATTLE_DAMAGE)
|| reason_card->is_affected_by_effect(EFFECT_AVOID_BATTLE_DAMAGE, dam_card)
|| is_player_affected_by_effect(1 - damp, EFFECT_AVOID_BATTLE_DAMAGE))
core.battle_damage[1 - damp] = 0;
}
if(!core.battle_damage[damp] && !core.battle_damage[1 - damp])
reason_card = 0;
if(pdamchange)
if(pdamchange)
*pdamchange = damchange;
*pdamchange = damchange;
if(preason_card)
if(preason_card)
...
...
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