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