Commit 14ebfd50 authored by nanahira's avatar nanahira

Merge branch 'master' of github.com:Fluorohydride/ygopro-core

parents 8a44abb6 57557b86
......@@ -548,8 +548,8 @@ inline effect_flag operator|(effect_flag flag1, effect_flag flag2)
#define EVENT_REMOVE_COUNTER 0x20000
#define EVENT_CUSTOM 0x10000000
#define DOUBLE_DAMAGE 0x80000000
#define HALF_DAMAGE 0x80000001
constexpr int32 DOUBLE_DAMAGE = 0x80000000;
constexpr int32 HALF_DAMAGE = 0x80000001;
// flag effect
#define EFFECT_FLAG_EFFECT 0x20000000
......
......@@ -393,6 +393,10 @@ int32 scriptlib::group_is_exists(lua_State *L) {
uint32 extraargs = lua_gettop(L) - 4;
uint32 fcount = 0;
uint32 result = FALSE;
if (count > pgroup->container.size()) {
lua_pushboolean(L, 0);
return 1;
}
for (auto& pcard : cset) {
if(pduel->lua->check_matching(pcard, 2, extraargs)) {
++fcount;
......@@ -721,11 +725,12 @@ int32 scriptlib::group_search_card(lua_State *L) {
group* pgroup = *(group**) lua_touserdata(L, 1);
duel* pduel = pgroup->pduel;
uint32 extraargs = lua_gettop(L) - 2;
for(auto& pcard : pgroup->container)
if(pduel->lua->check_matching(pcard, 2, extraargs)) {
for (auto& pcard : pgroup->container) {
if (pduel->lua->check_matching(pcard, 2, extraargs)) {
interpreter::card2value(L, pcard);
return 1;
}
}
return 0;
}
int32 scriptlib::group_get_bin_class_count(lua_State *L) {
......
......@@ -589,7 +589,10 @@ int32 field::recover(uint16 step, effect* reason_effect, uint32 reason, uint8 re
if(reason & REASON_RDAMAGE)
core.units.begin()->step = 2;
core.hint_timing[playerid] |= TIMING_RECOVER;
int32 limit = INT32_MAX - player[playerid].lp;
int32 limit = 0;
if (player[playerid].lp > 0) {
limit = INT32_MAX - player[playerid].lp;
}
int32 val = amount;
if (val > limit) {
val = limit;
......
......@@ -3327,7 +3327,7 @@ void field::calculate_battle_damage(effect** pdamchange, card** preason_card, ui
int32 aa = core.attacker->get_battle_attack(), ad = core.attacker->get_battle_defense();
int32 da = 0, dd = 0, attacker_value = aa, defender_value = 0;
uint8 pa = core.attacker->current.controler, pd = PLAYER_NONE;
uint8 damp = 0;
uint8 damaged_player = 0;
effect* damchange = nullptr;
card* reason_card = nullptr;
uint8 bd[2] = {FALSE, FALSE};
......@@ -3345,13 +3345,13 @@ void field::calculate_battle_damage(effect** pdamchange, card** preason_card, ui
if(core.attack_target->is_position(POS_ATTACK)) {
defender_value = da;
if(attacker_value > defender_value) {
damp = pd;
core.battle_damage[damp] = attacker_value - defender_value;
damaged_player = pd;
core.battle_damage[damaged_player] = attacker_value - defender_value;
reason_card = core.attacker;
bd[1] = TRUE;
} else if(attacker_value < defender_value) {
damp = pa;
core.battle_damage[damp] = defender_value - attacker_value;
damaged_player = pa;
core.battle_damage[damaged_player] = defender_value - attacker_value;
reason_card = core.attack_target;
bd[0] = TRUE;
} else {
......@@ -3400,10 +3400,10 @@ void field::calculate_battle_damage(effect** pdamchange, card** preason_card, ui
//}
bool both = dp[0] && dp[1];
if(!both) {
damp = dp[0] ? 0 : 1;
damaged_player = 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];
core.battle_damage[1 - damaged_player] = core.battle_damage[damaged_player];
both = true;
}
}
......@@ -3437,21 +3437,21 @@ void field::calculate_battle_damage(effect** pdamchange, card** preason_card, ui
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;
if(reflect[damaged_player]) {
if(!also[1 - damaged_player]) {
core.battle_damage[1 - damaged_player] += core.battle_damage[damaged_player];
core.battle_damage[damaged_player] = 0;
} else {
core.battle_damage[1 - damp] += core.battle_damage[damp];
core.battle_damage[damp] = core.battle_damage[1 - damp];
core.battle_damage[1 - damaged_player] += core.battle_damage[damaged_player];
core.battle_damage[damaged_player] = core.battle_damage[1 - damaged_player];
}
} else if(also[damp]) {
if(!reflect[1 - damp]) {
core.battle_damage[1 - damp] += core.battle_damage[damp];
} else if(also[damaged_player]) {
if(!reflect[1 - damaged_player]) {
core.battle_damage[1 - damaged_player] += core.battle_damage[damaged_player];
} 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;
core.battle_damage[1 - damaged_player] += core.battle_damage[damaged_player];
core.battle_damage[damaged_player] += core.battle_damage[1 - damaged_player];
core.battle_damage[1 - damaged_player] = 0;
}
}
}
......@@ -3506,15 +3506,15 @@ void field::calculate_battle_damage(effect** pdamchange, card** preason_card, ui
}
bd[1] = TRUE;
} else if(attacker_value < defender_value) {
damp = pa;
core.battle_damage[damp] = defender_value - attacker_value;
damaged_player = pa;
core.battle_damage[damaged_player] = defender_value - attacker_value;
reason_card = core.attack_target;
}
}
} else {
if(attacker_value != 0) {
damp = 1 - pa;
core.battle_damage[damp] = attacker_value;
damaged_player = 1 - pa;
core.battle_damage[damaged_player] = attacker_value;
reason_card = core.attacker;
}
}
......@@ -3524,23 +3524,23 @@ void field::calculate_battle_damage(effect** pdamchange, card** preason_card, ui
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];
core.battle_damage[1 - damaged_player] = core.battle_damage[damaged_player];
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);
if(!dam_card || !(reflect[damaged_player] = dam_card->is_affected_by_effect(EFFECT_REFLECT_BATTLE_DAMAGE, reason_card)))
reflect[damaged_player] = is_player_affected_by_effect(damaged_player, EFFECT_REFLECT_BATTLE_DAMAGE);
if(!(reflect[1 - damaged_player] = reason_card->is_affected_by_effect(EFFECT_REFLECT_BATTLE_DAMAGE, dam_card)))
reflect[1 - damaged_player] = is_player_affected_by_effect(1 - damaged_player, 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;
|| is_player_affected_by_effect(damaged_player, EFFECT_ALSO_BATTLE_DAMAGE)))
also[damaged_player] = 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;
|| is_player_affected_by_effect(1 - damaged_player, EFFECT_ALSO_BATTLE_DAMAGE)))
also[1 - damaged_player] = true;
if(both) {
//turn player's effect applies first
if(reflect[pa] && reflect[pa]->get_handler_player() == pa) {
......@@ -3557,21 +3557,21 @@ void field::calculate_battle_damage(effect** pdamchange, card** preason_card, ui
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;
if(reflect[damaged_player]) {
if(!also[1 - damaged_player]) {
core.battle_damage[1 - damaged_player] += core.battle_damage[damaged_player];
core.battle_damage[damaged_player] = 0;
} else {
core.battle_damage[1 - damp] += core.battle_damage[damp];
core.battle_damage[damp] = core.battle_damage[1 - damp];
core.battle_damage[1 - damaged_player] += core.battle_damage[damaged_player];
core.battle_damage[damaged_player] = core.battle_damage[1 - damaged_player];
}
} else if(also[damp]) {
if(!reflect[1 - damp]) {
core.battle_damage[1 - damp] += core.battle_damage[damp];
} else if(also[damaged_player]) {
if(!reflect[1 - damaged_player]) {
core.battle_damage[1 - damaged_player] += core.battle_damage[damaged_player];
} 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;
core.battle_damage[1 - damaged_player] += core.battle_damage[damaged_player];
core.battle_damage[damaged_player] += core.battle_damage[1 - damaged_player];
core.battle_damage[1 - damaged_player] = 0;
}
}
}
......@@ -3580,28 +3580,33 @@ void field::calculate_battle_damage(effect** pdamchange, card** preason_card, ui
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);
filter_player_effect(1 - damp, EFFECT_CHANGE_BATTLE_DAMAGE, &eset, FALSE);
filter_player_effect(damaged_player, EFFECT_CHANGE_BATTLE_DAMAGE, &eset, FALSE);
filter_player_effect(1 - damaged_player, 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;
int32 current_min = INT32_MAX;
for(int32 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))
}
else if (eset[i]->is_target_player(p))
val = eset[i]->get_value();
if(val == 0) {
if (val == 0) {
dam_value = 0;
break;
} else if(val > 0)
}
else if (val > 0 && val < current_min) {
current_min = val;
dam_value = val;
else if(val == DOUBLE_DAMAGE)
}
else if (val == DOUBLE_DAMAGE)
double_dam = true;
else if(val == HALF_DAMAGE)
else if (val == HALF_DAMAGE)
half_dam = true;
}
if(double_dam && half_dam) {
......@@ -3617,14 +3622,14 @@ void field::calculate_battle_damage(effect** pdamchange, card** preason_card, ui
}
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;
|| is_player_affected_by_effect(damaged_player, EFFECT_AVOID_BATTLE_DAMAGE))
core.battle_damage[damaged_player] = 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;
|| is_player_affected_by_effect(1 - damaged_player, EFFECT_AVOID_BATTLE_DAMAGE))
core.battle_damage[1 - damaged_player] = 0;
}
if(!core.battle_damage[damp] && !core.battle_damage[1 - damp])
if(!core.battle_damage[damaged_player] && !core.battle_damage[1 - damaged_player])
reason_card = nullptr;
if(pdamchange)
*pdamchange = damchange;
......
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