Commit 7c9d72a7 authored by mercury233's avatar mercury233

Merge branch 'master' into patch-rule

parents 3b4239fc b6819fe0
......@@ -363,6 +363,8 @@ inline effect_flag operator|(effect_flag flag1, effect_flag flag2)
#define EFFECT_PIERCE 203
#define EFFECT_BATTLE_DESTROY_REDIRECT 204
#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_DICE_REPLACE 221
#define EFFECT_FUSION_MATERIAL 230
......
......@@ -1031,7 +1031,7 @@ int32 interpreter::get_operation_value(card* pcard, int32 findex, int32 extraarg
}
return OPERATION_FAIL;
}
int32 result = std::round(lua_tonumber(current_state, -1));
int32 result = lua_isinteger(current_state, -1) ? lua_tointeger(current_state, -1) : std::round(lua_tonumber(current_state, -1));
lua_pop(current_state, 1);
no_action--;
call_depth--;
......@@ -1050,8 +1050,10 @@ int32 interpreter::get_function_value(int32 f, uint32 param_count) {
call_depth++;
if (call_function(f, param_count, 1)) {
int32 result = 0;
if (lua_isboolean(current_state, -1))
if(lua_isboolean(current_state, -1))
result = lua_toboolean(current_state, -1);
else if(lua_isinteger(current_state, -1))
result = lua_tointeger(current_state, -1);
else
result = std::round(lua_tonumber(current_state, -1));
lua_pop(current_state, 1);
......@@ -1084,8 +1086,10 @@ int32 interpreter::get_function_value(int32 f, uint32 param_count, std::vector<i
int32 stack_newtop = lua_gettop(current_state);
for (int32 index = stack_top + 1; index <= stack_newtop; ++index) {
int32 return_value = 0;
if (lua_isboolean(current_state, index))
if(lua_isboolean(current_state, index))
return_value = lua_toboolean(current_state, index);
else if(lua_isinteger(current_state, index))
return_value = lua_tointeger(current_state, index);
else
return_value = std::round(lua_tonumber(current_state, index));
result->push_back(return_value);
......
......@@ -266,6 +266,8 @@ int32 scriptlib::effect_set_value(lua_State *L) {
peffect->flag[0] &= ~EFFECT_FLAG_FUNC_VALUE;
if(lua_isboolean(L, 2))
peffect->value = lua_toboolean(L, 2);
else if(lua_isinteger(L, 2))
peffect->value = lua_tointeger(L, 2);
else
peffect->value = std::round(lua_tonumber(L, 2));
}
......
......@@ -1400,8 +1400,22 @@ int32 field::equip(uint16 step, uint8 equip_player, card * equip_card, card * ta
returns.ivalue[0] = FALSE;
if(!equip_card->is_affect_by_effect(core.reason_effect))
return TRUE;
if(equip_card == target || target->current.location != LOCATION_MZONE)
if(equip_card == target)
return TRUE;
bool to_grave = false;
if(target->current.location != LOCATION_MZONE || (target->current.position & POS_FACEDOWN))
to_grave = true;
if(equip_card->current.location != LOCATION_SZONE) {
refresh_location_info_instant();
if(get_useable_count(equip_card, equip_player, LOCATION_SZONE, equip_player, LOCATION_REASON_TOFIELD) <= 0)
to_grave = true;
}
if(to_grave) {
if(equip_card->current.location != LOCATION_GRAVE)
send_to(equip_card, 0, REASON_RULE, PLAYER_NONE, PLAYER_NONE, LOCATION_GRAVE, 0, POS_FACEUP);
core.units.begin()->step = 2;
return FALSE;
}
if(equip_card->equiping_target) {
equip_card->cancel_card_target(equip_card->equiping_target);
equip_card->unequip();
......@@ -1413,9 +1427,6 @@ int32 field::equip(uint16 step, uint8 equip_player, card * equip_card, card * ta
change_position(equip_card, 0, equip_player, POS_FACEUP, 0);
return FALSE;
}
refresh_location_info_instant();
if(get_useable_count(equip_card, equip_player, LOCATION_SZONE, equip_player, LOCATION_REASON_TOFIELD) <= 0)
return TRUE;
equip_card->enable_field_effect(false);
move_to_field(equip_card, equip_player, equip_player, LOCATION_SZONE, (up || equip_card->is_position(POS_FACEUP)) ? POS_FACEUP : POS_FACEDOWN, FALSE, 0, TRUE);
return FALSE;
......@@ -1465,6 +1476,10 @@ int32 field::equip(uint16 step, uint8 equip_player, card * equip_card, card * ta
returns.ivalue[0] = TRUE;
return TRUE;
}
case 3: {
returns.ivalue[0] = FALSE;
return TRUE;
}
}
return TRUE;
}
......
......@@ -3264,6 +3264,7 @@ void field::calculate_battle_damage(effect** pdamchange, card** preason_card, ui
effect* damchange = 0;
card* reason_card = 0;
uint8 bd[2] = {FALSE, FALSE};
bool pierce = false;
core.battle_damage[0] = core.battle_damage[1] = 0;
if(core.attacker->is_position(POS_FACEUP_DEFENSE)) {
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
if(core.attack_target->is_position(POS_ATTACK)) {
d = da;
if(a > d) {
damchange = core.attacker->is_affected_by_effect(EFFECT_BATTLE_DAMAGE_TO_EFFECT);
if(damchange) {
damp = pd;
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;
} else if (a < d) {
damchange = core.attack_target->is_affected_by_effect(EFFECT_BATTLE_DAMAGE_TO_EFFECT);
if(damchange) {
} else if(a < d) {
damp = pa;
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;
} else {
if(a != 0) {
......@@ -3328,35 +3297,16 @@ void field::calculate_battle_damage(effect** pdamchange, card** preason_card, ui
d = dd;
if(a > d) {
effect_set eset;
uint8 dp[2];
dp[0] = dp[1] = 0;
core.attacker->filter_effect(EFFECT_PIERCE, &eset);
if(eset.size() && !core.attacker->is_affected_by_effect(EFFECT_NO_BATTLE_DAMAGE)
&& !core.attack_target->is_affected_by_effect(EFFECT_AVOID_BATTLE_DAMAGE, core.attacker)) {
for(int32 i = 0; i < eset.size(); ++i)
if(eset.size()) {
pierce = true;
uint8 dp[2] = {};
for(uint32 i = 0; i < eset.size(); ++i)
dp[1 - eset[i]->get_handler_player()] = 1;
if(dp[0] && is_player_affected_by_effect(0, EFFECT_AVOID_BATTLE_DAMAGE))
dp[0] = 0;
if(dp[1] && is_player_affected_by_effect(1, EFFECT_AVOID_BATTLE_DAMAGE))
dp[1] = 0;
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;
if(dp[0])
core.battle_damage[0] = a - d;
if(dp[1])
core.battle_damage[1] = a - d;
bool double_damage = false;
//bool half_damage = false;
for(int32 i = 0; i < eset.size(); ++i) {
......@@ -3381,48 +3331,155 @@ void field::calculate_battle_damage(effect** pdamchange, card** preason_card, ui
// if(dp[1])
// 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;
}
bd[1] = TRUE;
} else if (a < d) {
damchange = core.attack_target->is_affected_by_effect(EFFECT_BATTLE_DAMAGE_TO_EFFECT);
if(damchange) {
} else if(a < d) {
damp = pa;
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 {
damchange = core.attacker->is_affected_by_effect(EFFECT_BATTLE_DAMAGE_TO_EFFECT);
if(damchange) {
damp = 1 - pa;
core.battle_damage[damp] = a;
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)) {
if(a != 0) {
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)
*pdamchange = damchange;
if(preason_card)
......@@ -4311,7 +4368,7 @@ int32 field::solve_chain(uint16 step, uint32 chainend_arg1, uint32 chainend_arg2
}
if((pcard->data.type & TYPE_EQUIP) && (peffect->type & EFFECT_TYPE_ACTIVATE)
&& !pcard->equiping_target && pcard->is_has_relation(*cait))
destroy(pcard, 0, REASON_RULE, PLAYER_NONE);
pcard->set_status(STATUS_LEAVE_CONFIRMED, TRUE);
if(core.duel_rule <= 2) {
if((pcard->data.type & TYPE_FIELD) && (peffect->type & EFFECT_TYPE_ACTIVATE)
&& !pcard->is_status(STATUS_LEAVE_CONFIRMED) && pcard->is_has_relation(*cait)) {
......
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