Commit 488c081c authored by VanillaSalt's avatar VanillaSalt

update

parent db3e17aa
...@@ -2077,9 +2077,9 @@ int32 card::is_destructable_by_battle(card * pcard) { ...@@ -2077,9 +2077,9 @@ int32 card::is_destructable_by_battle(card * pcard) {
return FALSE; return FALSE;
return TRUE; return TRUE;
} }
int32 card::is_destructable_by_effect(effect* peffect, uint8 playerid) { effect* card::check_indestructable_by_effect(effect* peffect, uint8 playerid) {
if(!peffect) if(!peffect)
return TRUE; return 0;
effect_set eset; effect_set eset;
filter_effect(EFFECT_INDESTRUCTABLE_EFFECT, &eset); filter_effect(EFFECT_INDESTRUCTABLE_EFFECT, &eset);
for(int32 i = 0; i < eset.size(); ++i) { for(int32 i = 0; i < eset.size(); ++i) {
...@@ -2087,9 +2087,12 @@ int32 card::is_destructable_by_effect(effect* peffect, uint8 playerid) { ...@@ -2087,9 +2087,12 @@ int32 card::is_destructable_by_effect(effect* peffect, uint8 playerid) {
pduel->lua->add_param(playerid, PARAM_TYPE_INT); pduel->lua->add_param(playerid, PARAM_TYPE_INT);
pduel->lua->add_param(this, PARAM_TYPE_CARD); pduel->lua->add_param(this, PARAM_TYPE_CARD);
if(eset[i]->check_value_condition(3)) if(eset[i]->check_value_condition(3))
return FALSE; return eset[i];
} }
return TRUE; return 0;
}
int32 card::is_destructable_by_effect(effect* peffect, uint8 playerid) {
return !check_indestructable_by_effect(peffect, playerid);
} }
int32 card::is_removeable(uint8 playerid) { int32 card::is_removeable(uint8 playerid) {
if(!pduel->game_field->is_player_can_remove(playerid, this)) if(!pduel->game_field->is_player_can_remove(playerid, this))
......
...@@ -226,6 +226,7 @@ public: ...@@ -226,6 +226,7 @@ public:
int32 is_affect_by_effect(effect* peffect); int32 is_affect_by_effect(effect* peffect);
int32 is_destructable(); int32 is_destructable();
int32 is_destructable_by_battle(card* pcard); int32 is_destructable_by_battle(card* pcard);
effect* check_indestructable_by_effect(effect* peffect, uint8 playerid);
int32 is_destructable_by_effect(effect* peffect, uint8 playerid); int32 is_destructable_by_effect(effect* peffect, uint8 playerid);
int32 is_removeable(uint8 playerid); int32 is_removeable(uint8 playerid);
int32 is_removeable_as_cost(uint8 playerid); int32 is_removeable_as_cost(uint8 playerid);
......
...@@ -2488,23 +2488,30 @@ int32 field::destroy(uint16 step, group * targets, effect * reason_effect, uint3 ...@@ -2488,23 +2488,30 @@ int32 field::destroy(uint16 step, group * targets, effect * reason_effect, uint3
case 0: { case 0: {
card_set extra; card_set extra;
effect_set eset; effect_set eset;
card_set indestructable_set;
std::set<effect*> indestructable_effect_set;
for (auto cit = targets->container.begin(); cit != targets->container.end();) { for (auto cit = targets->container.begin(); cit != targets->container.end();) {
auto rm = cit++; auto rm = cit++;
card* pcard = *rm; card* pcard = *rm;
if (!(pcard->current.reason & REASON_RULE)) { if (!(pcard->current.reason & REASON_RULE)) {
if (!pcard->is_destructable() || !pcard->is_affect_by_effect(pcard->current.reason_effect) int32 is_destructable = true;
|| !pcard->is_destructable_by_effect(pcard->current.reason_effect, reason_player)) { if (pcard->is_destructable() && pcard->is_affect_by_effect(pcard->current.reason_effect)) {
pcard->current.reason = pcard->temp.reason; effect* indestructable_effect = pcard->check_indestructable_by_effect(pcard->current.reason_effect, reason_player);
pcard->current.reason_effect = pcard->temp.reason_effect; if (indestructable_effect) {
pcard->current.reason_player = pcard->temp.reason_player; indestructable_effect_set.insert(indestructable_effect);
pcard->set_status(STATUS_DESTROY_CONFIRMED, FALSE); is_destructable = false;
targets->container.erase(pcard); }
} else
is_destructable = false;
if (!is_destructable) {
indestructable_set.insert(pcard);
continue; continue;
} }
} }
eset.clear();
pcard->filter_effect(EFFECT_INDESTRUCTABLE_COUNT, &eset); pcard->filter_effect(EFFECT_INDESTRUCTABLE_COUNT, &eset);
if (eset.size()) { if (eset.size()) {
bool indes = false; bool is_destructable = true;
for (int32 i = 0; i < eset.size(); ++i) { for (int32 i = 0; i < eset.size(); ++i) {
if(!(eset[i]->flag & EFFECT_FLAG_COUNT_LIMIT) || (eset[i]->reset_count & 0xf00) == 0) if(!(eset[i]->flag & EFFECT_FLAG_COUNT_LIMIT) || (eset[i]->reset_count & 0xf00) == 0)
continue; continue;
...@@ -2513,19 +2520,17 @@ int32 field::destroy(uint16 step, group * targets, effect * reason_effect, uint3 ...@@ -2513,19 +2520,17 @@ int32 field::destroy(uint16 step, group * targets, effect * reason_effect, uint3
pduel->lua->add_param(pcard->current.reason_player, PARAM_TYPE_INT); pduel->lua->add_param(pcard->current.reason_player, PARAM_TYPE_INT);
if(eset[i]->check_value_condition(3)) { if(eset[i]->check_value_condition(3)) {
eset[i]->dec_count(); eset[i]->dec_count();
indes = true; indestructable_effect_set.insert(eset[i]);
is_destructable = false;
break;
} }
} }
eset.clear(); if(!is_destructable) {
if(indes) { indestructable_set.insert(pcard);
pcard->current.reason = pcard->temp.reason;
pcard->current.reason_effect = pcard->temp.reason_effect;
pcard->current.reason_player = pcard->temp.reason_player;
pcard->set_status(STATUS_DESTROY_CONFIRMED, FALSE);
targets->container.erase(pcard);
continue; continue;
} }
} }
eset.clear();
pcard->filter_effect(EFFECT_DESTROY_SUBSTITUTE, &eset); pcard->filter_effect(EFFECT_DESTROY_SUBSTITUTE, &eset);
if (eset.size()) { if (eset.size()) {
bool sub = false; bool sub = false;
...@@ -2536,6 +2541,7 @@ int32 field::destroy(uint16 step, group * targets, effect * reason_effect, uint3 ...@@ -2536,6 +2541,7 @@ int32 field::destroy(uint16 step, group * targets, effect * reason_effect, uint3
if(eset[i]->check_value_condition(3)) { if(eset[i]->check_value_condition(3)) {
extra.insert(eset[i]->handler); extra.insert(eset[i]->handler);
sub = true; sub = true;
break;
} }
} }
if(sub) { if(sub) {
...@@ -2546,7 +2552,6 @@ int32 field::destroy(uint16 step, group * targets, effect * reason_effect, uint3 ...@@ -2546,7 +2552,6 @@ int32 field::destroy(uint16 step, group * targets, effect * reason_effect, uint3
targets->container.erase(pcard); targets->container.erase(pcard);
} }
} }
eset.clear();
} }
for (auto cit = extra.begin(); cit != extra.end(); ++cit) { for (auto cit = extra.begin(); cit != extra.end(); ++cit) {
card* rep = *cit; card* rep = *cit;
...@@ -2561,6 +2566,19 @@ int32 field::destroy(uint16 step, group * targets, effect * reason_effect, uint3 ...@@ -2561,6 +2566,19 @@ int32 field::destroy(uint16 step, group * targets, effect * reason_effect, uint3
targets->container.insert(rep); targets->container.insert(rep);
} }
} }
for (auto cit = indestructable_set.begin(); cit != indestructable_set.end(); ++cit) {
(*cit)->current.reason = (*cit)->temp.reason;
(*cit)->current.reason_effect = (*cit)->temp.reason_effect;
(*cit)->current.reason_player = (*cit)->temp.reason_player;
(*cit)->set_status(STATUS_DESTROY_CONFIRMED, FALSE);
targets->container.erase(*cit);
}
for (auto eit = indestructable_effect_set.begin(); eit != indestructable_effect_set.end(); ++eit) {
pduel->write_buffer8(MSG_HINT);
pduel->write_buffer8(HINT_CARD);
pduel->write_buffer8(0);
pduel->write_buffer32((*eit)->owner->data.code);
}
auto pr = effects.continuous_effect.equal_range(EFFECT_DESTROY_REPLACE); auto pr = effects.continuous_effect.equal_range(EFFECT_DESTROY_REPLACE);
for (; pr.first != pr.second; ++pr.first) for (; pr.first != pr.second; ++pr.first)
add_process(PROCESSOR_OPERATION_REPLACE, 5, pr.first->second, targets, 0, 1); add_process(PROCESSOR_OPERATION_REPLACE, 5, pr.first->second, targets, 0, 1);
...@@ -2656,6 +2674,7 @@ int32 field::destroy(uint16 step, group * targets, effect * reason_effect, uint3 ...@@ -2656,6 +2674,7 @@ int32 field::destroy(uint16 step, group * targets, effect * reason_effect, uint3
continue; continue;
} }
} }
eset.clear();
pcard->filter_effect(EFFECT_INDESTRUCTABLE_COUNT, &eset); pcard->filter_effect(EFFECT_INDESTRUCTABLE_COUNT, &eset);
if (eset.size()) { if (eset.size()) {
bool indes = false; bool indes = false;
...@@ -2667,10 +2686,14 @@ int32 field::destroy(uint16 step, group * targets, effect * reason_effect, uint3 ...@@ -2667,10 +2686,14 @@ int32 field::destroy(uint16 step, group * targets, effect * reason_effect, uint3
pduel->lua->add_param(pcard->current.reason_player, PARAM_TYPE_INT); pduel->lua->add_param(pcard->current.reason_player, PARAM_TYPE_INT);
if(eset[i]->check_value_condition(3)) { if(eset[i]->check_value_condition(3)) {
eset[i]->dec_count(); eset[i]->dec_count();
pduel->write_buffer8(MSG_HINT);
pduel->write_buffer8(HINT_CARD);
pduel->write_buffer8(0);
pduel->write_buffer32(eset[i]->owner->data.code);
indes = true; indes = true;
break;
} }
} }
eset.clear();
if(indes) { if(indes) {
pcard->current.reason = pcard->temp.reason; pcard->current.reason = pcard->temp.reason;
pcard->current.reason_effect = pcard->temp.reason_effect; pcard->current.reason_effect = pcard->temp.reason_effect;
...@@ -2680,6 +2703,7 @@ int32 field::destroy(uint16 step, group * targets, effect * reason_effect, uint3 ...@@ -2680,6 +2703,7 @@ int32 field::destroy(uint16 step, group * targets, effect * reason_effect, uint3
continue; continue;
} }
} }
eset.clear();
pcard->filter_effect(EFFECT_DESTROY_SUBSTITUTE, &eset); pcard->filter_effect(EFFECT_DESTROY_SUBSTITUTE, &eset);
if (eset.size()) { if (eset.size()) {
bool sub = false; bool sub = false;
...@@ -2700,7 +2724,6 @@ int32 field::destroy(uint16 step, group * targets, effect * reason_effect, uint3 ...@@ -2700,7 +2724,6 @@ int32 field::destroy(uint16 step, group * targets, effect * reason_effect, uint3
targets->container.erase(pcard); targets->container.erase(pcard);
} }
} }
eset.clear();
} }
auto pr = effects.continuous_effect.equal_range(EFFECT_DESTROY_REPLACE); auto pr = effects.continuous_effect.equal_range(EFFECT_DESTROY_REPLACE);
for (; pr.first != pr.second; ++pr.first) for (; pr.first != pr.second; ++pr.first)
......
...@@ -3491,10 +3491,28 @@ int32 field::process_battle_command(uint16 step) { ...@@ -3491,10 +3491,28 @@ int32 field::process_battle_command(uint16 step) {
card* reason_card = 0; card* reason_card = 0;
uint8 bd[2]; uint8 bd[2];
calculate_battle_damage(&damchange, &reason_card, bd); calculate_battle_damage(&damchange, &reason_card, bd);
if(bd[0]) if(bd[0]) {
core.attacker->set_status(STATUS_BATTLE_DESTROYED, TRUE); effect* indestructable_effect = core.attacker->is_affected_by_effect(EFFECT_INDESTRUCTABLE_BATTLE, core.attack_target);
if(indestructable_effect) {
pduel->write_buffer8(MSG_HINT);
pduel->write_buffer8(HINT_CARD);
pduel->write_buffer8(0);
pduel->write_buffer32(indestructable_effect->owner->data.code);
bd[0] = FALSE;
} else
core.attacker->set_status(STATUS_BATTLE_DESTROYED, TRUE);
}
if(bd[1]) if(bd[1])
core.attack_target->set_status(STATUS_BATTLE_DESTROYED, TRUE); effect* indestructable_effect = core.attack_target->is_affected_by_effect(EFFECT_INDESTRUCTABLE_BATTLE, core.attacker);
if(indestructable_effect) {
pduel->write_buffer8(MSG_HINT);
pduel->write_buffer8(HINT_CARD);
pduel->write_buffer8(0);
pduel->write_buffer32(indestructable_effect->owner->data.code);
bd[1] = FALSE;
} else
core.attack_target->set_status(STATUS_BATTLE_DESTROYED, TRUE);
}
pduel->write_buffer8(MSG_BATTLE); pduel->write_buffer8(MSG_BATTLE);
pduel->write_buffer32(core.attacker->get_info_location()); pduel->write_buffer32(core.attacker->get_info_location());
pduel->write_buffer32(aa); pduel->write_buffer32(aa);
...@@ -3902,8 +3920,7 @@ void field::calculate_battle_damage(effect** pdamchange, card** preason_card, ui ...@@ -3902,8 +3920,7 @@ void field::calculate_battle_damage(effect** pdamchange, card** preason_card, ui
reason_card = core.attacker; reason_card = core.attacker;
} }
} }
if(core.attack_target->is_destructable_by_battle(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); damchange = core.attack_target->is_affected_by_effect(EFFECT_BATTLE_DAMAGE_TO_EFFECT);
if(damchange) { if(damchange) {
...@@ -3924,14 +3941,11 @@ void field::calculate_battle_damage(effect** pdamchange, card** preason_card, ui ...@@ -3924,14 +3941,11 @@ void field::calculate_battle_damage(effect** pdamchange, card** preason_card, ui
reason_card = core.attack_target; reason_card = core.attack_target;
} }
} }
if(core.attacker->is_destructable_by_battle(core.attack_target)) bd[0] = TRUE;
bd[0] = TRUE;
} else { } else {
if(a != 0) { if(a != 0) {
if(core.attack_target->is_destructable_by_battle(core.attacker)) bd[0] = TRUE;
bd[1] = TRUE; bd[1] = TRUE;
if(core.attacker->is_destructable_by_battle(core.attack_target))
bd[0] = TRUE;
} }
} }
} else { } else {
...@@ -3969,8 +3983,7 @@ void field::calculate_battle_damage(effect** pdamchange, card** preason_card, ui ...@@ -3969,8 +3983,7 @@ void field::calculate_battle_damage(effect** pdamchange, card** preason_card, ui
core.battle_damage[1 - pd] = a - d; core.battle_damage[1 - pd] = a - d;
reason_card = core.attacker; reason_card = core.attacker;
} }
if(core.attack_target->is_destructable_by_battle(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); damchange = core.attack_target->is_affected_by_effect(EFFECT_BATTLE_DAMAGE_TO_EFFECT);
if(damchange) { if(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