public override IEnumerator ApplyEffect(CardEffectState cardEffectState, CardEffectParams cardEffectParams) { ProviderManager.TryGetProvider <RoomManager>(out RoomManager roomManager); CharacterState target = roomManager.GetPyreRoom().GetPyreHeart(); if (cardEffectParams.saveManager.PreviewMode) { yield break; } StatusEffectStackData statusEffectStack = GetStatusEffectStack(cardEffectState); if (statusEffectStack == null) { yield break; } int intInRange = cardEffectState.GetIntInRange(); CharacterState.AddStatusEffectParams addStatusEffectParams = default(CharacterState.AddStatusEffectParams); addStatusEffectParams.sourceRelicState = cardEffectParams.sourceRelic; addStatusEffectParams.sourceCardState = cardEffectParams.playedCard; addStatusEffectParams.cardManager = cardEffectParams.cardManager; addStatusEffectParams.sourceIsHero = (cardEffectState.GetSourceTeamType() == Team.Type.Heroes); CharacterState.AddStatusEffectParams addStatusEffectParams2 = addStatusEffectParams; RngId rngId = cardEffectParams.saveManager.PreviewMode ? RngId.BattleTest : RngId.Battle; PlayerManager playerManager; ProviderManager.TryGetProvider <PlayerManager>(out playerManager); target.AddStatusEffect(statusEffectStack.statusId, playerManager.GetEnergy(), addStatusEffectParams2); }
public override IEnumerator ApplyEffect(CardEffectState cardEffectState, CardEffectParams cardEffectParams) { StatusEffectStackData statusEffectStack = GetStatusEffectStack(cardEffectState); if (statusEffectStack == null) { yield break; } if (statusEffectStack.statusId == Burnout) { if (cardEffectParams.targets[0].IsMiniboss() || cardEffectParams.targets[0].IsOuterTrainBoss()) { yield break; } } CharacterState.AddStatusEffectParams addStatusEffectParams = default(CharacterState.AddStatusEffectParams); addStatusEffectParams.sourceRelicState = cardEffectParams.sourceRelic; addStatusEffectParams.sourceCardState = cardEffectParams.playedCard; addStatusEffectParams.cardManager = cardEffectParams.cardManager; addStatusEffectParams.sourceIsHero = (cardEffectState.GetSourceTeamType() == Team.Type.Heroes); CharacterState.AddStatusEffectParams addStatusEffectParams2 = addStatusEffectParams; for (int num = cardEffectParams.targets.Count - 1; num >= 0; num--) { CharacterState characterState = cardEffectParams.targets[num]; int count = statusEffectStack.count; characterState.AddStatusEffect(statusEffectStack.statusId, count, addStatusEffectParams2); } }
public int GetStatusEffectStacksToAdd(StatusEffectStackData statusEffectStackData, CharacterState onCharacter) { if (!canApply || (onCharacter == null) || statusEffectStackData == null || statusEffectStackData.statusId == null) { return(0); } ProviderManager.TryGetProvider <StatusEffectManager>(out StatusEffectManager statusManager); var status = statusManager.GetStatusEffectDataById(statusEffectStackData.statusId); if (status == null) { return(0); } bool validBuff = status.GetDisplayCategory() == StatusEffectData.DisplayCategory.Positive || statusEffectStackData.statusId == Armor || statusEffectStackData.statusId == Burnout; bool validDebuff = status.GetDisplayCategory() == StatusEffectData.DisplayCategory.Negative; if (validBuff && onCharacter.GetTeamType() != Team.Type.Monsters) { return(0); } if (validDebuff && onCharacter.GetTeamType() == Team.Type.Monsters) { return(0); } if (!validBuff && !validDebuff) { return(0); } lastStatus = statusEffectStackData.statusId; return(1); }
public override bool TestEffect(CardEffectState cardEffectState, CardEffectParams cardEffectParams) { StatusEffectStackData statusEffectStack = GetStatusEffectStack(cardEffectState); if (statusEffectStack == null) { return(false); } if (cardEffectState.GetTargetMode() != TargetMode.DropTargetCharacter) { return(true); } if (cardEffectParams.targets.Count <= 0) { return(false); } if (cardEffectParams.statusEffectManager.GetStatusEffectDataById(statusEffectStack.statusId).IsStackable()) { return(true); } ProviderManager.TryGetProvider <RoomManager>(out RoomManager roomManager); CharacterState target = roomManager.GetPyreRoom().GetPyreHeart(); if (!target.HasStatusEffect(statusEffectStack.statusId)) { return(true); } return(false); }
public void Setup() { _primaryEnchantedTargets = new Dictionary <CharacterState, EnchantedState>(); _previewEnchantedTargets = new Dictionary <CharacterState, EnchantedState>(); statusEffect = new StatusEffectStackData { count = 1, statusId = "pyreboost" }; }
public static void GetTooltipsStatusList(CardEffectData cardEffectData, ref List <string> outStatusIdList) { StatusEffectStackData statusEffectStack = GetStatusEffectStack(cardEffectData); if (statusEffectStack != null) { outStatusIdList.Add(statusEffectStack.statusId); } }
static void Prefix(ref CardData setCardData) { if (!triggered && setCardData.GetName() == "Frozen Lance") { triggered = true; // Add piercing to Frozen Lance's trait list var piercingTrait = new CardTraitData(); piercingTrait.Setup("CardTraitIgnoreArmor"); setCardData.GetTraits().Add(piercingTrait); // Instantiate a new card effect. We're going to use it to add 327 frostbite to Frozen Lance. var frostbiteEffect = new CardEffectData(); // Tell the game that this card effect should add a status effect to the target(s) var prop = typeof(CardEffectData).GetField("effectStateName", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); prop.SetValue(frostbiteEffect, "CardEffectAddStatusEffect"); // Set targeting mode to be the same one used by Flash Freeze: Last Targeted Characters prop = typeof(CardEffectData).GetField("targetMode", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); prop.SetValue(frostbiteEffect, TargetMode.LastTargetedCharacters); // This field can't be null, or the game crashes with a NullPointerException // Seems like all the other null fields are fine, though, at least at a glance prop = typeof(CardEffectData).GetField("targetModeStatusEffectsFilter", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); prop.SetValue(frostbiteEffect, new String[0]); // Create the Frostbite status and add it to the effect's status array StatusEffectStackData frostbiteStatus = new StatusEffectStackData(); frostbiteStatus.statusId = "poison"; frostbiteStatus.count = 327; prop = typeof(CardEffectData).GetField("paramStatusEffects", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); prop.SetValue(frostbiteEffect, new StatusEffectStackData[] { frostbiteStatus }); // Add the Frostbite effect to Frozen Lance's card effect list setCardData.GetEffects().Add(frostbiteEffect); // Remove the override description key, so we can replace the card's description with our own prop = typeof(CardData).GetField("overrideDescriptionKey", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); prop.SetValue(setCardData, ""); // Set a custom card description var customDescTrait = new CardTraitDataBuilder { TraitStateName = "CardTraitCustomDescription", ParamStr = "<size=50%><br><br></size>Deal [effect0.power] damage to the front enemy unit and apply [frostbite] [effect1.status0.power]" }.Build(); setCardData.GetTraits().Add(customDescTrait); // Set Frozen Lance's damage to 4967 prop = typeof(CardEffectData).GetField("paramInt", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); prop.SetValue(setCardData.GetEffects()[0], 4967); } }
public static StatusEffectStackData[] AddStatusEffect(string statusEffectID, int stackCount, StatusEffectStackData[] oldStatuses) { var statusEffectData = new StatusEffectStackData { statusId = statusEffectID, count = stackCount }; var newStatuses = new StatusEffectStackData[oldStatuses.Length + 1]; int i; for (i = 0; i < oldStatuses.Length; i++) { newStatuses[i] = oldStatuses[i]; } newStatuses[i] = statusEffectData; return(newStatuses); }
public static void Modify() { string frozenLanceID = VanillaCardIDs.FrozenLance; var frozenLanceData = CustomCardManager.GetCardDataByID(frozenLanceID); // Add piercing to Frozen Lance's trait list var piercingTrait = new CardTraitData(); string piercingTraitName = VanillaCardTraitTypes.CardTraitIgnoreArmor.AssemblyQualifiedName; piercingTrait.Setup(piercingTraitName); frozenLanceData.GetTraits().Add(piercingTrait); // Set Frozen Lance's damage to 12 var frozenLanceDamageEffect = frozenLanceData.GetEffects()[0]; Traverse.Create(frozenLanceDamageEffect).Field("paramInt").SetValue(12); // Instantiate the Frostbite CardEffect var frostbiteEffect = new CardEffectData(); // Set its effect type string addStatusEffectName = VanillaCardEffectTypes.CardEffectAddStatusEffect.AssemblyQualifiedName; Traverse.Create(frostbiteEffect).Field("effectStateName").SetValue(addStatusEffectName); // Set targeting mode to be the same one used by Flash Freeze: Last Targeted Characters Traverse.Create(frostbiteEffect).Field("targetMode").SetValue(TargetMode.LastTargetedCharacters); // This field can't be null, or the game crashes with a NullPointerException // All the other null fields are fine, though Traverse.Create(frostbiteEffect).Field("targetModeStatusEffectsFilter").SetValue(new string[0]); // Create the Frostbite status and add it to the effect's status array StatusEffectStackData frostbiteStatus = new StatusEffectStackData(); frostbiteStatus.statusId = VanillaStatusEffectIDs.Frostbite; frostbiteStatus.count = 327; var paramStatusEffects = new StatusEffectStackData[] { frostbiteStatus }; Traverse.Create(frostbiteEffect).Field("paramStatusEffects").SetValue(paramStatusEffects); // Add the Frostbite effect to Frozen Lance's card effect list frozenLanceData.GetEffects().Add(frostbiteEffect); }
public override bool TestEffect(CardEffectState cardEffectState, CardEffectParams cardEffectParams) { StatusEffectStackData statusEffectStack = GetStatusEffectStack(cardEffectState); if (cardEffectParams.targets.Count <= 0) { return(false); } if (statusEffectStack.statusId == Burnout) { if (cardEffectParams.targets[0].IsMiniboss() || cardEffectParams.targets[0].IsOuterTrainBoss()) { return(false); } } if (statusEffectStack == null) { return(false); } if (cardEffectState.GetTargetMode() != TargetMode.DropTargetCharacter) { return(true); } if (cardEffectParams.statusEffectManager.GetStatusEffectDataById(statusEffectStack.statusId).IsStackable()) { return(true); } foreach (CharacterState target in cardEffectParams.targets) { if (!target.HasStatusEffect(statusEffectStack.statusId)) { return(true); } } return(false); }
public static StatusEffectStackData GetStatusEffectStack(CardEffectState cardEffectState) { ClassData otherClass; bool exiled = false; StatusEffectStackData statusEffectStackData; var mainClass = ProviderManager.SaveManager.GetMainClass(); var subClass = ProviderManager.SaveManager.GetSubClass(); if (mainClass == DiscipleClan.clanRef) { otherClass = subClass; exiled = ProviderManager.SaveManager.GetSubChampionIndex() != 0; } else { otherClass = mainClass; exiled = ProviderManager.SaveManager.GetMainChampionIndex() != 0; } int Param = cardEffectState.GetParamInt(); if (otherClass == null) { return(null); } switch (otherClass.GetID()) { case Hellhorned: if (!exiled) { statusEffectStackData = new StatusEffectStackData { statusId = Rage, count = Param } } ; else { statusEffectStackData = new StatusEffectStackData { statusId = Armor, count = Param * 2 } }; break; case Awoken: if (!exiled) { statusEffectStackData = new StatusEffectStackData { statusId = Spikes, count = Param } } ; else { statusEffectStackData = new StatusEffectStackData { statusId = Regen, count = Param } }; break; case Stygian: if (!exiled) { statusEffectStackData = new StatusEffectStackData { statusId = SpellWeakness, count = Param / 2 } } ; else { statusEffectStackData = new StatusEffectStackData { statusId = Frostbite, count = Param } }; break; case Umbra: if (!exiled) { statusEffectStackData = new StatusEffectStackData { statusId = DamageShield, count = Param / 2 } } ; else { statusEffectStackData = new StatusEffectStackData { statusId = Lifesteal, count = Param / 2 } }; break; case MeltingRemnant: if (!exiled) { statusEffectStackData = new StatusEffectStackData { statusId = Burnout, count = Param + 1 } } ; else { statusEffectStackData = new StatusEffectStackData { statusId = Stealth, count = Param / 2 } }; break; default: statusEffectStackData = new StatusEffectStackData { statusId = "gravity", count = Param / 2 }; break; } return(statusEffectStackData); }
public int GetModifiedStatusEffectStacksFromMultiplier(StatusEffectStackData statusEffectStackData, CharacterState onCharacter) { return(statusEffectStackData.count); }