// 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); }
// Ancient version of the built-in script Act_DrainHealthEssence, which leeches 80% instead. // Note: Built-in script Act_DrainHealthAncient does not appear to do this. static public object Act_LifeLeech_Ancient(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); } FInt damage = owner.GetSkillCastingStrength(ns); int lifeLeeched = 0; // Primary targets. foreach (var v in q.Targets.value) { target = bf.ConvertPositionIDToCard(v); if (target != null) { target.ReciveNormalDamage(damage, bf, q, v); lifeLeeched += (damage * 0.8f).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); lifeLeeched += (damage * 0.8f).ToInt(); } } } if (lifeLeeched > 0) { owner.ReciveHealthNormal(lifeLeeched, bf, q, t); } 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); }