Commit a1f55eec authored by DailyShana's avatar DailyShana Committed by GitHub

add EFFECT_CHANGE_BATTLE_DAMAGE (#268)

parent 5a16238f
...@@ -365,6 +365,7 @@ inline effect_flag operator|(effect_flag flag1, effect_flag flag2) ...@@ -365,6 +365,7 @@ inline effect_flag operator|(effect_flag flag1, effect_flag flag2)
#define EFFECT_BATTLE_DAMAGE_TO_EFFECT 205 #define EFFECT_BATTLE_DAMAGE_TO_EFFECT 205
#define EFFECT_BOTH_BATTLE_DAMAGE 206 #define EFFECT_BOTH_BATTLE_DAMAGE 206
#define EFFECT_ALSO_BATTLE_DAMAGE 207 #define EFFECT_ALSO_BATTLE_DAMAGE 207
#define EFFECT_CHANGE_BATTLE_DAMAGE 208
#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
......
...@@ -3394,6 +3394,44 @@ void field::calculate_battle_damage(effect** pdamchange, card** preason_card, ui ...@@ -3394,6 +3394,44 @@ 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.attack_target->filter_effect(EFFECT_CHANGE_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);
eset.sort();
for(uint8 p = 0; p < 2; ++p) {
bool double_dam = false;
bool half_dam = false;
int32 dam_value = -1;
for(uint32 i = 0; i < eset.size(); ++i) {
int32 val = -1;
if(!eset[i]->is_flag(EFFECT_FLAG_PLAYER_TARGET)) {
pduel->lua->add_param(p, PARAM_TYPE_INT);
val = eset[i]->get_value(1);
} else if(eset[i]->is_target_player(p))
val = eset[i]->get_value();
if(val == 0) {
dam_value = 0;
break;
} else if(val > 0)
dam_value = val;
else if(val == DOUBLE_DAMAGE)
double_dam = true;
else if(val == HALF_DAMAGE)
half_dam = true;
}
if(double_dam && half_dam) {
double_dam = false;
half_dam = false;
}
if(double_dam)
core.battle_damage[p] *= 2;
if(half_dam)
core.battle_damage[p] /= 2;
if(dam_value >= 0 && core.battle_damage[p] > 0)
core.battle_damage[p] = dam_value;
}
if(core.attacker->is_affected_by_effect(EFFECT_NO_BATTLE_DAMAGE) if(core.attacker->is_affected_by_effect(EFFECT_NO_BATTLE_DAMAGE)
|| core.attack_target->is_affected_by_effect(EFFECT_AVOID_BATTLE_DAMAGE, core.attacker) || core.attack_target->is_affected_by_effect(EFFECT_AVOID_BATTLE_DAMAGE, core.attacker)
|| is_player_affected_by_effect(pd, EFFECT_AVOID_BATTLE_DAMAGE)) || is_player_affected_by_effect(pd, EFFECT_AVOID_BATTLE_DAMAGE))
...@@ -3475,6 +3513,45 @@ void field::calculate_battle_damage(effect** pdamchange, card** preason_card, ui ...@@ -3475,6 +3513,45 @@ void field::calculate_battle_damage(effect** pdamchange, card** preason_card, ui
} }
} }
} }
effect_set eset;
reason_card->filter_effect(EFFECT_CHANGE_BATTLE_DAMAGE, &eset, FALSE);
if(dam_card)
dam_card->filter_effect(EFFECT_CHANGE_BATTLE_DAMAGE, &eset, FALSE);
filter_player_effect(damp, EFFECT_CHANGE_BATTLE_DAMAGE, &eset, FALSE);
filter_player_effect(1 - damp, EFFECT_CHANGE_BATTLE_DAMAGE, &eset, FALSE);
eset.sort();
for(uint8 p = 0; p < 2; ++p) {
bool double_dam = false;
bool half_dam = false;
int32 dam_value = -1;
for(uint32 i = 0; i < eset.size(); ++i) {
int32 val = -1;
if(!eset[i]->is_flag(EFFECT_FLAG_PLAYER_TARGET)) {
pduel->lua->add_param(p, PARAM_TYPE_INT);
val = eset[i]->get_value(1);
} else if(eset[i]->is_target_player(p))
val = eset[i]->get_value();
if(val == 0) {
dam_value = 0;
break;
} else if(val > 0)
dam_value = val;
else if(val == DOUBLE_DAMAGE)
double_dam = true;
else if(val == HALF_DAMAGE)
half_dam = true;
}
if(double_dam && half_dam) {
double_dam = false;
half_dam = false;
}
if(double_dam)
core.battle_damage[p] *= 2;
if(half_dam)
core.battle_damage[p] /= 2;
if(dam_value >= 0 && core.battle_damage[p] > 0)
core.battle_damage[p] = dam_value;
}
if(reason_card->is_affected_by_effect(EFFECT_NO_BATTLE_DAMAGE) 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) || dam_card && dam_card->is_affected_by_effect(EFFECT_AVOID_BATTLE_DAMAGE, reason_card)
|| is_player_affected_by_effect(damp, EFFECT_AVOID_BATTLE_DAMAGE)) || is_player_affected_by_effect(damp, EFFECT_AVOID_BATTLE_DAMAGE))
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment