From c6fd2a2f36730ce975200a309fd86b50eadd5d02 Mon Sep 17 00:00:00 2001 From: APN-Pucky Date: Wed, 4 Apr 2018 09:28:19 +0200 Subject: [PATCH] Fix Allegiance Summmon Bug --- sim.cpp | 101 +++++++++++++++++++++++++++++--------------------------- 1 file changed, 53 insertions(+), 48 deletions(-) diff --git a/sim.cpp b/sim.cpp index 98b63c81..efa440b5 100644 --- a/sim.cpp +++ b/sim.cpp @@ -695,72 +695,79 @@ struct PlayCard template CardStatus* op() + { + return op(false); + } + + template + CardStatus* op(bool summoned) { setStorage(); placeCard(); - + status->m_summoned = summoned; + unsigned played_faction_mask(0); unsigned same_faction_cards_count(0); - bool bge_megamorphosis = fd->bg_effects[fd->tapi][PassiveBGE::megamorphosis]; - //played_status = status; - //played_card = card; + bool bge_megamorphosis = fd->bg_effects[fd->tapi][PassiveBGE::megamorphosis]; + //played_status = status; + //played_card = card; - check_and_perform_bravery(fd,status); + check_and_perform_bravery(fd,status); if (status->m_delay == 0) { check_and_perform_valor(fd, status); } - //refresh/init absorb - if(status->has_skill(Skill::absorb)) - { - status->m_absorption = status->skill_base_value(Skill::absorb); - } + //refresh/init absorb + if(status->has_skill(Skill::absorb)) + { + status->m_absorption = status->skill_base_value(Skill::absorb); + } - // 1. Evaluate skill Allegiance & count assaults with same faction (structures will be counted later) - // 2. Passive BGE Cold Sleep - for (CardStatus* status_i : fd->tap->assaults.m_indirect) + // 1. Evaluate skill Allegiance & count assaults with same faction (structures will be counted later) + // 2. Passive BGE Cold Sleep + for (CardStatus* status_i : fd->tap->assaults.m_indirect) + { + if (status_i == status || !is_alive(status_i)) { continue; } // except itself + //std::cout << status_description(status_i).c_str(); + _DEBUG_ASSERT(is_alive(status_i)); + if (bge_megamorphosis || (status_i->m_card->m_faction == card->m_faction)) { - if (status_i == status || !is_alive(status_i)) { continue; } // except itself - //std::cout << status_description(status_i).c_str(); - _DEBUG_ASSERT(is_alive(status_i)); - if (bge_megamorphosis || (status_i->m_card->m_faction == card->m_faction)) - { - ++ same_faction_cards_count; - unsigned allegiance_value = status_i->skill(Skill::allegiance); - if (__builtin_expect(allegiance_value, false) && !status->m_summoned) - { - _DEBUG_MSG(1, "%s activates Allegiance %u\n", status_description(status_i).c_str(), allegiance_value); - if (! status_i->m_sundered) - { status_i->m_perm_attack_buff += allegiance_value; } - status_i->ext_hp(allegiance_value); - } - } - if (__builtin_expect(fd->bg_effects[fd->tapi][PassiveBGE::coldsleep], false) - && status_i->m_protected_stasis && can_be_healed(status_i)) + ++ same_faction_cards_count; + unsigned allegiance_value = status_i->skill(Skill::allegiance); + if (__builtin_expect(allegiance_value, false) && !status->m_summoned) { - unsigned bge_value = (status_i->m_protected_stasis + 1) / 2; - _DEBUG_MSG(1, "Cold Sleep: %s heals itself for %u\n", status_description(status_i).c_str(), bge_value); - status_i->add_hp(bge_value); + _DEBUG_MSG(1, "%s activates Allegiance %u\n", status_description(status_i).c_str(), allegiance_value); + if (! status_i->m_sundered) + { status_i->m_perm_attack_buff += allegiance_value; } + status_i->ext_hp(allegiance_value); } } + if (__builtin_expect(fd->bg_effects[fd->tapi][PassiveBGE::coldsleep], false) + && status_i->m_protected_stasis && can_be_healed(status_i)) + { + unsigned bge_value = (status_i->m_protected_stasis + 1) / 2; + _DEBUG_MSG(1, "Cold Sleep: %s heals itself for %u\n", status_description(status_i).c_str(), bge_value); + status_i->add_hp(bge_value); + } + } - // Setup faction marks (bitmap) for stasis (skill Stasis / Passive BGE TemporalBacklash) - // unless Passive BGE Megamorphosis is enabled - if (__builtin_expect(!bge_megamorphosis, true)) + // Setup faction marks (bitmap) for stasis (skill Stasis / Passive BGE TemporalBacklash) + // unless Passive BGE Megamorphosis is enabled + if (__builtin_expect(!bge_megamorphosis, true)) + { + played_faction_mask = (1u << card->m_faction); + // do played card have stasis? mark this faction for stasis check + if (__builtin_expect(status->skill(Skill::stasis), false) + || __builtin_expect(fd->bg_effects[fd->tapi][PassiveBGE::temporalbacklash] && status->skill(Skill::counter), false)) { - played_faction_mask = (1u << card->m_faction); - // do played card have stasis? mark this faction for stasis check - if (__builtin_expect(status->skill(Skill::stasis), false) - || __builtin_expect(fd->bg_effects[fd->tapi][PassiveBGE::temporalbacklash] && status->skill(Skill::counter), false)) - { - fd->tap->stasis_faction_bitmap |= played_faction_mask; - } + fd->tap->stasis_faction_bitmap |= played_faction_mask; } + } // Evaluate Passive BGE Oath-of-Loyalty - unsigned allegiance_value; + unsigned allegiance_value; if (__builtin_expect(fd->bg_effects[fd->tapi][PassiveBGE::oath_of_loyalty], false) && ((allegiance_value = status->skill(Skill::allegiance)) > 0)) { @@ -2479,12 +2486,10 @@ CardStatus* check_and_perform_summon(Field* fd, CardStatus* src) switch (summoned_card->m_type) { case CardType::assault: - summoned_status = PlayCard(summoned_card, fd, src->m_player, src).op(); - summoned_status->m_summoned=true; + summoned_status = PlayCard(summoned_card, fd, src->m_player, src).op(true); return summoned_status; case CardType::structure: - summoned_status = PlayCard(summoned_card, fd, src->m_player, src).op(); - summoned_status->m_summoned=true; + summoned_status = PlayCard(summoned_card, fd, src->m_player, src).op(true); return summoned_status; default: _DEBUG_MSG(0, "Unknown card type: #%u %s: %u\n",