// Helper that applies normal damage and shield leech (affected by leechFactor). static public object Act_ShieldLeech_Helper(NetBattlefield bf, NetQueueItem q, FInt leechFactor) { NetSkill ns = q.GetNetSkill(bf); NetCard owner = bf.GetCardByID(ns.OwnerCardID); NetCard target = null; if (NetType.IsNullOrEmpty(q.Targets)) { return(null); } FInt damage = owner.GetSkillCastingStrength(ns); int shieldLeeched = 0; // Primary targets. foreach (var v in q.Targets.value) { target = bf.ConvertPositionIDToCard(v); if (target != null) { target.ReciveNormalDamage(damage, bf, q, v); shieldLeeched += (damage * leechFactor).ToInt(); } } // Secondary targets. if (!NetType.IsNullOrEmpty(q.SecondaryTargets)) { damage *= 0.5f; foreach (var v in q.SecondaryTargets.value) { target = bf.ConvertPositionIDToCard(v); if (target != null) { target.ReciveNormalDamage(damage, bf, q, v); shieldLeeched += (damage * leechFactor).ToInt(); } } } if (shieldLeeched > 0) { FInt currentShields = owner.GetCA_SHIELD(); owner.SetCA_SHIELD(currentShields + shieldLeeched); } return(null); }
static public object Act_AddShieldingImproved( NetBattlefield bf, NetQueueItem q, List <NetQueueItem> stack, List <NetQueueItem> previousItems, MHRandom random) { NetSkill ns = q.GetNetSkill(bf); NetCard owner = bf.GetCardByID(ns.OwnerCardID); //skill needs target(-s) if (!NetTypeAtomic.IsValid(q.Targets)) { return(null); } FInt extra = FInt.ZERO; if (ns.MainAtt != null) { extra = owner.GetSkillCastingStrength(ns); } FInt value = ns.GetFloatAttribute("TAG-CA_SHIELD"); string sign = ns.GetStringAttribute("TAG-CA_SHIELD"); if (value == FInt.ZERO) { if (bf.ChallengeType == EChallengeType.TypePhysical) { value = ns.GetFloatAttribute("TAG-SHIELDING_PHYSICAL"); } else if (bf.ChallengeType == EChallengeType.TypeMental) { value = ns.GetFloatAttribute("TAG-SHIELDING_MENTAL"); } else if (bf.ChallengeType == EChallengeType.TypeSpirit) { value = ns.GetFloatAttribute("TAG-SHIELDING_SPIRIT"); } } if (string.IsNullOrEmpty(sign)) { if (bf.ChallengeType == EChallengeType.TypePhysical) { sign = ns.GetStringAttribute("TAG-SHIELDING_PHYSICAL"); } else if (bf.ChallengeType == EChallengeType.TypeMental) { sign = ns.GetStringAttribute("TAG-SHIELDING_MENTAL"); } else if (bf.ChallengeType == EChallengeType.TypeSpirit) { sign = ns.GetStringAttribute("TAG-SHIELDING_SPIRIT"); } } value += extra; value.CutToInt(); if (sign == "*") { value = value * 0.01f; } foreach (var v in q.Targets.value) { NetCard target = bf.ConvertPositionIDToCard(v); if (target == null) { continue; } FInt prev = target.GetCA_SHIELD(); if (sign == "+") { target.SetCA_SHIELD(value + prev); } else if (sign == "*") { target.SetCA_SHIELD(value * prev); } } if (NetType.IsNullOrEmpty(q.SecondaryTargets)) { return(null); } foreach (var v in q.SecondaryTargets.value) { NetCard target = bf.ConvertPositionIDToCard(v); if (target == null) { continue; } FInt prev = target.GetCA_SHIELD(); if (sign == "+") { target.SetCA_SHIELD(value + prev); } else if (sign == "*") { target.SetCA_SHIELD(value * prev); } } return(null); }
/// <summary> /// /// </summary> /// <param name="bf">general battlefield information</param> /// <param name="q">queue element which is already executed which trigers this skill</param> /// <param name="stack">Items which are still in stack including "q", which most likely is first element</param> /// <param name="previousItems">Queue items which were already executed in order they were executed</param> /// <param name="random">random generator specific to this thread</param> /// <returns></returns> /// <summary> /// Basic damage /// </summary> static public object Act_Damage_Procedural( NetBattlefield bf, NetQueueItem q, List <NetQueueItem> stack, List <NetQueueItem> previousItems, MHRandom random) { NetSkill ns = q.GetNetSkill(bf); NetCard owner = bf.GetCardByID(ns.OwnerCardID); NetCard target = null; if (NetType.IsNullOrEmpty(q.Targets)) { return(null); } int flags = ns.Flags; bool essence = (flags & (int)EActivatorBlocks.Essence) > 0; bool ancient = (flags & (int)EActivatorBlocks.Ancient) > 0; bool gray = !ancient && !essence; FInt damage = GameplayUtils.GetDamageFor(ns, owner); // if ((flags & (int)SkillGenerator.EActivatorBlocks.Additive) > 0) // { // // if (essence) // { // //essence is estimated to be equal between additive and multiplicative at // // value of 10 (A x 0.2 + 8) ~ (A = 10) // damage = owner.GetSkillCastingAdditiveStrength(ns, SkillGenerator.ESSENCE_ADDITIVE_BASE); // } // else if(ancient) // { // //essence is estimated to be equal between additive and multiplicative at // // value of 15 (A x 0.2 + 12) ~ (A = 15) // damage = owner.GetSkillCastingAdditiveStrength(ns, SkillGenerator.ANCIENT_ADDITIVE_BASE); // } // else // { // //essence is estimated to be equal between additive and multiplicative at // // value of 6 (A x 0.2 + 5) ~ (A = 6) // damage = owner.GetSkillCastingAdditiveStrength(ns, SkillGenerator.GRAY_ADDITIVE_BASE); // } // } // else // { // damage = owner.GetSkillCastingStrength(ns); // } bool trueDamage = (flags & (int)EActivatorBlocks.TrueDamage) > 0; bool poisonDamage = (flags & (int)EActivatorBlocks.PoisonDamage) > 0; bool lifeLeech = (flags & (int)EActivatorBlocks.LifeLeech) > 0; bool shieldLeech = (flags & (int)EActivatorBlocks.ShieldLeech) > 0; bool additive = (flags & (int)EActivatorBlocks.Additive) > 0; int lifeLeeched = 0; int shieldLeeched = 0; #region Primary targets foreach (var v in q.Targets.value) { target = bf.ConvertPositionIDToCard(v); if (target != null) { FInt dmg = damage; if (poisonDamage && target.IsWounded()) { if (essence) { dmg *= 1.35f; } else { dmg *= 1.6f; } } if (trueDamage) { if (essence) { target.ReciveTrueDamageEssence(dmg, bf, q, v); } else //no test for ancient { target.ReciveTrueDamageAncient(dmg, bf, q, v); } } else { target.ReciveNormalDamage(dmg, bf, q, v); } if (lifeLeech) { if (essence) { lifeLeeched += (dmg * 0.4f).ToInt(); } else { lifeLeeched += (dmg * 0.8f).ToInt(); } } if (shieldLeech) { if (essence) { shieldLeeched += (dmg * 0.5f).ToInt(); } else { shieldLeeched += (dmg * 1.0f).ToInt(); } } } } #endregion #region Secondary targets ////do splash if needed if (!NetType.IsNullOrEmpty(q.SecondaryTargets)) { bool splashBonus = (flags & (int)EActivatorBlocks.AOE) > 0; if (gray || !splashBonus) { damage *= 0.5f; } else { //this is !gray && AOE if (essence) { damage *= 0.75f; } if (ancient) { damage *= 1f; } } //ancient damage is 100% splash foreach (var v in q.SecondaryTargets.value) { target = bf.ConvertPositionIDToCard(v); if (target != null) { FInt dmg = damage; if (poisonDamage && target.IsWounded()) { if (essence) { dmg *= 1.35f; } else { dmg *= 1.6f; } } if (trueDamage) { if (essence) { target.ReciveTrueDamageEssence(dmg, bf, q, v); } else //no test for ancient { target.ReciveTrueDamageAncient(dmg, bf, q, v); } } else { target.ReciveNormalDamage(dmg, bf, q, v); } if (lifeLeech) { if (essence) { lifeLeeched += (dmg * 0.4f).ToInt(); } else { lifeLeeched += (dmg * 0.8f).ToInt(); } } if (shieldLeech) { if (essence) { shieldLeeched += (dmg * 0.5f).ToInt(); } else { shieldLeeched += (dmg * 1.0f).ToInt(); } } } } } #endregion #region Leech if (lifeLeeched > 0) { FInt max = owner.GetCA_MAX_HEALTH(); FInt cur = owner.GetCA_HEALTH(); if (cur < max) { if (lifeLeeched > max - cur) { owner.SetCA_HEALTH(max); } else { owner.SetCA_HEALTH(cur + lifeLeeched); } } } if (shieldLeeched > 0) { FInt cur = owner.GetCA_SHIELD(); owner.SetCA_SHIELD(cur + shieldLeeched); } #endregion return(null); }