From 808e37a7bd793842e820e66b83b0ad82847e8f9f Mon Sep 17 00:00:00 2001 From: rayinls <132439181+rayinls@users.noreply.github.com> Date: Sat, 14 Mar 2026 08:33:38 +0800 Subject: [PATCH] Clean decompilation artifacts in generated custom card/power files --- Localization/zhs/cards_green_custom.json | 4 ++ Localization/zhs/cards_red_custom.json | 24 +++++++ Localization/zhs/powers_green_custom.json | 5 ++ Localization/zhs/powers_red_custom.json | 11 +++ Models/Cards/GreenCorpseExplosion.cs | 55 +++++++++++++++ Models/Cards/RedBattleTrance.cs | 41 +++++++++++ Models/Cards/RedBloodForBlood.cs | 79 ++++++++++++++++++++++ Models/Cards/RedCleave.cs | 42 ++++++++++++ Models/Cards/RedClothesline.cs | 59 ++++++++++++++++ Models/Cards/RedCombust.cs | 49 ++++++++++++++ Models/Cards/RedFireBreathing.cs | 49 ++++++++++++++ Models/Cards/RedHeavyBlade.cs | 60 ++++++++++++++++ Models/Cards/RedMetallicize.cs | 49 ++++++++++++++ Models/Cards/RedPummel.cs | 67 ++++++++++++++++++ Models/Cards/RedSearingBlow.cs | 51 ++++++++++++++ Models/Cards/RedShockwave.cs | 69 +++++++++++++++++++ Models/Powers/GreenCorpseExplosionPower.cs | 53 +++++++++++++++ Models/Powers/RedCombustPower.cs | 51 ++++++++++++++ Models/Powers/RedFireBreathingPower.cs | 41 +++++++++++ Models/Powers/RedMetallicizePower.cs | 59 ++++++++++++++++ 20 files changed, 918 insertions(+) create mode 100644 Localization/zhs/cards_green_custom.json create mode 100644 Localization/zhs/cards_red_custom.json create mode 100644 Localization/zhs/powers_green_custom.json create mode 100644 Localization/zhs/powers_red_custom.json create mode 100644 Models/Cards/GreenCorpseExplosion.cs create mode 100644 Models/Cards/RedBattleTrance.cs create mode 100644 Models/Cards/RedBloodForBlood.cs create mode 100644 Models/Cards/RedCleave.cs create mode 100644 Models/Cards/RedClothesline.cs create mode 100644 Models/Cards/RedCombust.cs create mode 100644 Models/Cards/RedFireBreathing.cs create mode 100644 Models/Cards/RedHeavyBlade.cs create mode 100644 Models/Cards/RedMetallicize.cs create mode 100644 Models/Cards/RedPummel.cs create mode 100644 Models/Cards/RedSearingBlow.cs create mode 100644 Models/Cards/RedShockwave.cs create mode 100644 Models/Powers/GreenCorpseExplosionPower.cs create mode 100644 Models/Powers/RedCombustPower.cs create mode 100644 Models/Powers/RedFireBreathingPower.cs create mode 100644 Models/Powers/RedMetallicizePower.cs diff --git a/Localization/zhs/cards_green_custom.json b/Localization/zhs/cards_green_custom.json new file mode 100644 index 0000000..248b58e --- /dev/null +++ b/Localization/zhs/cards_green_custom.json @@ -0,0 +1,4 @@ +{ + "GREEN_CORPSE_EXPLOSION.title": "尸爆术", + "GREEN_CORPSE_EXPLOSION.description": "给予{PoisonPower:diff()}层[gold]中毒[/gold]。\n若该敌人在本场战斗中死亡,则对所有敌人造成等同于其最大生命值的伤害。" +} diff --git a/Localization/zhs/cards_red_custom.json b/Localization/zhs/cards_red_custom.json new file mode 100644 index 0000000..fc85c7d --- /dev/null +++ b/Localization/zhs/cards_red_custom.json @@ -0,0 +1,24 @@ +{ + "RED_BATTLE_TRANCE.description": "抽{Cards:diff()}张牌。\n你在本回合内不能再抽任何牌。", + "RED_BATTLE_TRANCE.title": "战吼", + "RED_BLOOD_FOR_BLOOD.description": "造成{Damage:diff()}点伤害。\n在本场战斗中,每当你失去生命值时,这张牌的耗能减少{energyIcons(1)}。", + "RED_BLOOD_FOR_BLOOD.title": "以血还血", + "RED_CLEAVE.description": "对所有敌人造成{Damage:diff()}点伤害。", + "RED_CLEAVE.title": "顺劈斩", + "RED_CLOTHESLINE.description": "造成{Damage:diff()}点伤害。\n给予{WeakPower:diff()}层[gold]虚弱[/gold]。", + "RED_CLOTHESLINE.title": "金刚臂", + "RED_HEAVY_BLADE.description": "造成{Damage:diff()}点伤害。\n[gold]力量[/gold]对这张牌的影响变为[blue]{StrengthMultiplier:diff()}[/blue]倍。", + "RED_HEAVY_BLADE.title": "重刃", + "RED_METALLICIZE.description": "获得[blue]{RedMetallicizePower:diff()}[/blue]层[gold]金属化[/gold]。", + "RED_METALLICIZE.title": "金属化", + "RED_PUMMEL.description": "造成{Damage:diff()}点伤害{Hits:diff()}次。\n[gold]消耗[/gold]。", + "RED_PUMMEL.title": "连续拳", + "RED_SEARING_BLOW.description": "造成{Damage:diff()}点伤害。", + "RED_SEARING_BLOW.title": "灼热打击", + "RED_SHOCKWAVE.description": "给予所有敌人{Power:diff()}层[gold]虚弱[/gold]和[gold]易伤[/gold]。", + "RED_SHOCKWAVE.title": "震荡波", + "RED_FIRE_BREATHING.title": "火焰呼吸", + "RED_FIRE_BREATHING.description": "每当你抽到一张[gold]状态[/gold]或[gold]诅咒[/gold]牌时,对所有敌人造成{RedFireBreathingPower:diff()}点伤害。", + "RED_COMBUST.title": "自燃", + "RED_COMBUST.description": "在你的回合结束时,失去1点生命并对所有敌人造成{RedCombustPower:diff()}点伤害。" +} diff --git a/Localization/zhs/powers_green_custom.json b/Localization/zhs/powers_green_custom.json new file mode 100644 index 0000000..8ef4900 --- /dev/null +++ b/Localization/zhs/powers_green_custom.json @@ -0,0 +1,5 @@ +{ + "GREEN_CORPSE_EXPLOSION_POWER.title": "尸爆", + "GREEN_CORPSE_EXPLOSION_POWER.description": "若该生物在本场战斗中死亡,则对所有敌人造成等同于其最大生命值的伤害。", + "GREEN_CORPSE_EXPLOSION_POWER.smartDescription": "若[gold]{OwnerName}[/gold]在本场战斗中死亡,则对所有敌人造成等同于其最大生命值的伤害。" +} diff --git a/Localization/zhs/powers_red_custom.json b/Localization/zhs/powers_red_custom.json new file mode 100644 index 0000000..66c2f46 --- /dev/null +++ b/Localization/zhs/powers_red_custom.json @@ -0,0 +1,11 @@ +{ + "RED_METALLICIZE_POWER.title": "金属化", + "RED_METALLICIZE_POWER.description": "在你的回合结束时获得[gold]格挡[/gold]。", + "RED_METALLICIZE_POWER.smartDescription": "在你的回合结束时获得[blue]{Amount}[/blue]点[gold]格挡[/gold]。", + "RED_FIRE_BREATHING_POWER.title": "火焰呼吸", + "RED_FIRE_BREATHING_POWER.description": "每当你抽到一张状态牌或诅咒牌时,对所有敌人造成伤害。", + "RED_FIRE_BREATHING_POWER.smartDescription": "每当你抽到一张状态牌或诅咒牌时,对所有敌人造成[blue]{Amount}[/blue]点伤害。", + "RED_COMBUST_POWER.title": "自燃", + "RED_COMBUST_POWER.description": "在你的回合结束时,失去生命并对所有敌人造成伤害。", + "RED_COMBUST_POWER.smartDescription": "在你的回合结束时,失去1点生命并对所有敌人造成[blue]{Amount}[/blue]点伤害。" +} diff --git a/Models/Cards/GreenCorpseExplosion.cs b/Models/Cards/GreenCorpseExplosion.cs new file mode 100644 index 0000000..9527b5e --- /dev/null +++ b/Models/Cards/GreenCorpseExplosion.cs @@ -0,0 +1,55 @@ +using System; +using System.Collections.Generic; +using System.Runtime.CompilerServices; +using System.Threading.Tasks; +using MegaCrit.Sts2.Core.Commands; +using MegaCrit.Sts2.Core.Entities.Cards; +using MegaCrit.Sts2.Core.GameActions.Multiplayer; +using MegaCrit.Sts2.Core.HoverTips; +using MegaCrit.Sts2.Core.Localization.DynamicVars; +using MegaCrit.Sts2.Core.Models.Powers; + +namespace MegaCrit.Sts2.Core.Models.Cards +{ + [NullableContext(1)] + [Nullable(0)] + public sealed class GreenCorpseExplosion : CardModel + { + public GreenCorpseExplosion() + : base(2, CardType.Skill, CardRarity.Uncommon, TargetType.AnyEnemy, true) + { + } + + protected override IEnumerable CanonicalVars + { + get + { + return new DynamicVar[] { new PowerVar(6m) }; + } + } + + protected override IEnumerable ExtraHoverTips + { + get + { + return new IHoverTip[] + { + HoverTipFactory.FromPower(), + HoverTipFactory.FromPower() + }; + } + } + + protected override async Task OnPlay(PlayerChoiceContext choiceContext, CardPlay cardPlay) + { + ArgumentNullException.ThrowIfNull(cardPlay.Target, "cardPlay.Target"); + await PowerCmd.Apply(cardPlay.Target, base.DynamicVars.Poison.BaseValue, base.Owner.Creature, this, false); + await PowerCmd.Apply(cardPlay.Target, 1m, base.Owner.Creature, this, false); + } + + protected override void OnUpgrade() + { + base.DynamicVars.Poison.UpgradeValueBy(3m); + } + } +} diff --git a/Models/Cards/RedBattleTrance.cs b/Models/Cards/RedBattleTrance.cs new file mode 100644 index 0000000..efab2cb --- /dev/null +++ b/Models/Cards/RedBattleTrance.cs @@ -0,0 +1,41 @@ +using System; +using System.Collections.Generic; +using System.Runtime.CompilerServices; +using System.Threading.Tasks; +using MegaCrit.Sts2.Core.Commands; +using MegaCrit.Sts2.Core.Entities.Cards; +using MegaCrit.Sts2.Core.GameActions.Multiplayer; +using MegaCrit.Sts2.Core.Localization.DynamicVars; +using MegaCrit.Sts2.Core.Models.Powers; + +namespace MegaCrit.Sts2.Core.Models.Cards +{ + [NullableContext(1)] + [Nullable(0)] + public sealed class RedBattleTrance : CardModel + { + public RedBattleTrance() + : base(0, CardType.Skill, CardRarity.Uncommon, TargetType.Self, true) + { + } + + protected override IEnumerable CanonicalVars + { + get + { + return new DynamicVar[] { new CardsVar(3) }; + } + } + + protected override async Task OnPlay(PlayerChoiceContext choiceContext, CardPlay cardPlay) + { + await CardPileCmd.Draw(choiceContext, base.DynamicVars.Cards.BaseValue, base.Owner, false); + await PowerCmd.Apply(base.Owner.Creature, 1m, base.Owner.Creature, this, false); + } + + protected override void OnUpgrade() + { + base.DynamicVars.Cards.UpgradeValueBy(1m); + } + } +} diff --git a/Models/Cards/RedBloodForBlood.cs b/Models/Cards/RedBloodForBlood.cs new file mode 100644 index 0000000..3679270 --- /dev/null +++ b/Models/Cards/RedBloodForBlood.cs @@ -0,0 +1,79 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.CompilerServices; +using System.Threading.Tasks; +using MegaCrit.Sts2.Core.Combat; +using MegaCrit.Sts2.Core.Combat.History.Entries; +using MegaCrit.Sts2.Core.Commands; +using MegaCrit.Sts2.Core.Entities.Cards; +using MegaCrit.Sts2.Core.Entities.Creatures; +using MegaCrit.Sts2.Core.GameActions.Multiplayer; +using MegaCrit.Sts2.Core.Localization.DynamicVars; +using MegaCrit.Sts2.Core.ValueProps; + +namespace MegaCrit.Sts2.Core.Models.Cards +{ + [NullableContext(1)] + [Nullable(0)] + public sealed class RedBloodForBlood : CardModel + { + public RedBloodForBlood() + : base(4, CardType.Attack, CardRarity.Uncommon, TargetType.AnyEnemy, true) + { + } + + protected override IEnumerable CanonicalVars + { + get + { + return new DynamicVar[] { new DamageVar(18m, ValueProp.Move) }; + } + } + + protected override async Task OnPlay(PlayerChoiceContext choiceContext, CardPlay cardPlay) + { + ArgumentNullException.ThrowIfNull(cardPlay.Target, "cardPlay.Target"); + await DamageCmd.Attack(base.DynamicVars.Damage.BaseValue).FromCard(this).Targeting(cardPlay.Target) + .WithHitFx("vfx/vfx_attack_slash", null, null) + .Execute(choiceContext); + } + + protected override void OnUpgrade() + { + base.DynamicVars.Damage.UpgradeValueBy(4m); + } + + public override Task AfterCardEnteredCombat(CardModel card) + { + if (card != this) + { + return Task.CompletedTask; + } + if (base.IsClone) + { + return Task.CompletedTask; + } + int num = CombatManager.Instance.History.Entries.OfType().Count((DamageReceivedEntry e) => e.Receiver == base.Owner.Creature && e.Result.UnblockedDamage > 0); + if (num > 0) + { + base.EnergyCost.AddThisCombat(-num, false); + } + return Task.CompletedTask; + } + + public override Task AfterDamageReceived(PlayerChoiceContext choiceContext, Creature target, DamageResult result, ValueProp props, [Nullable(2)] Creature dealer, [Nullable(2)] CardModel cardSource) + { + if (target != base.Owner.Creature) + { + return Task.CompletedTask; + } + if (result.UnblockedDamage <= 0m) + { + return Task.CompletedTask; + } + base.EnergyCost.AddThisCombat(-1, false); + return Task.CompletedTask; + } + } +} diff --git a/Models/Cards/RedCleave.cs b/Models/Cards/RedCleave.cs new file mode 100644 index 0000000..b2afb88 --- /dev/null +++ b/Models/Cards/RedCleave.cs @@ -0,0 +1,42 @@ +using System; +using System.Collections.Generic; +using System.Runtime.CompilerServices; +using System.Threading.Tasks; +using MegaCrit.Sts2.Core.Commands; +using MegaCrit.Sts2.Core.Entities.Cards; +using MegaCrit.Sts2.Core.GameActions.Multiplayer; +using MegaCrit.Sts2.Core.Localization.DynamicVars; +using MegaCrit.Sts2.Core.ValueProps; + +namespace MegaCrit.Sts2.Core.Models.Cards +{ + [NullableContext(1)] + [Nullable(0)] + public sealed class RedCleave : CardModel + { + public RedCleave() + : base(1, CardType.Attack, CardRarity.Common, TargetType.AllEnemies, true) + { + } + + protected override IEnumerable CanonicalVars + { + get + { + return new DynamicVar[] { new DamageVar(8m, ValueProp.Move) }; + } + } + + protected override async Task OnPlay(PlayerChoiceContext choiceContext, CardPlay cardPlay) + { + await DamageCmd.Attack(base.DynamicVars.Damage.BaseValue).FromCard(this).TargetingAllOpponents(base.CombatState) + .WithHitFx("vfx/vfx_attack_slash", null, null) + .Execute(choiceContext); + } + + protected override void OnUpgrade() + { + base.DynamicVars.Damage.UpgradeValueBy(3m); + } + } +} diff --git a/Models/Cards/RedClothesline.cs b/Models/Cards/RedClothesline.cs new file mode 100644 index 0000000..2b5becc --- /dev/null +++ b/Models/Cards/RedClothesline.cs @@ -0,0 +1,59 @@ +using System; +using System.Collections.Generic; +using System.Runtime.CompilerServices; +using System.Threading.Tasks; +using MegaCrit.Sts2.Core.Commands; +using MegaCrit.Sts2.Core.Entities.Cards; +using MegaCrit.Sts2.Core.GameActions.Multiplayer; +using MegaCrit.Sts2.Core.HoverTips; +using MegaCrit.Sts2.Core.Localization.DynamicVars; +using MegaCrit.Sts2.Core.Models.Powers; +using MegaCrit.Sts2.Core.ValueProps; + +namespace MegaCrit.Sts2.Core.Models.Cards +{ + [NullableContext(1)] + [Nullable(0)] + public sealed class RedClothesline : CardModel + { + public RedClothesline() + : base(2, CardType.Attack, CardRarity.Uncommon, TargetType.AnyEnemy, true) + { + } + + protected override IEnumerable CanonicalVars + { + get + { + return new DynamicVar[] + { + new DamageVar(12m, ValueProp.Move), + new PowerVar(2m) + }; + } + } + + protected override IEnumerable ExtraHoverTips + { + get + { + return new IHoverTip[] { HoverTipFactory.FromPower() }; + } + } + + protected override async Task OnPlay(PlayerChoiceContext choiceContext, CardPlay cardPlay) + { + ArgumentNullException.ThrowIfNull(cardPlay.Target, "cardPlay.Target"); + await DamageCmd.Attack(base.DynamicVars.Damage.BaseValue).FromCard(this).Targeting(cardPlay.Target) + .WithHitFx("vfx/vfx_attack_slash", null, null) + .Execute(choiceContext); + await PowerCmd.Apply(cardPlay.Target, base.DynamicVars.Weak.BaseValue, base.Owner.Creature, this, false); + } + + protected override void OnUpgrade() + { + base.DynamicVars.Damage.UpgradeValueBy(4m); + base.DynamicVars.Weak.UpgradeValueBy(1m); + } + } +} diff --git a/Models/Cards/RedCombust.cs b/Models/Cards/RedCombust.cs new file mode 100644 index 0000000..2ad48b7 --- /dev/null +++ b/Models/Cards/RedCombust.cs @@ -0,0 +1,49 @@ +using System; +using System.Collections.Generic; +using System.Runtime.CompilerServices; +using System.Threading.Tasks; +using MegaCrit.Sts2.Core.Commands; +using MegaCrit.Sts2.Core.Entities.Cards; +using MegaCrit.Sts2.Core.GameActions.Multiplayer; +using MegaCrit.Sts2.Core.HoverTips; +using MegaCrit.Sts2.Core.Localization.DynamicVars; +using MegaCrit.Sts2.Core.Models.Powers; + +namespace MegaCrit.Sts2.Core.Models.Cards +{ + [NullableContext(1)] + [Nullable(0)] + public sealed class RedCombust : CardModel + { + public RedCombust() + : base(1, CardType.Power, CardRarity.Uncommon, TargetType.Self, true) + { + } + + protected override IEnumerable ExtraHoverTips + { + get + { + return new IHoverTip[] { HoverTipFactory.FromPower() }; + } + } + + protected override IEnumerable CanonicalVars + { + get + { + return new DynamicVar[] { new PowerVar(5m) }; + } + } + + protected override async Task OnPlay(PlayerChoiceContext choiceContext, CardPlay cardPlay) + { + await PowerCmd.Apply(base.Owner.Creature, base.DynamicVars["RedCombustPower"].BaseValue, base.Owner.Creature, this, false); + } + + protected override void OnUpgrade() + { + base.DynamicVars["RedCombustPower"].UpgradeValueBy(2m); + } + } +} diff --git a/Models/Cards/RedFireBreathing.cs b/Models/Cards/RedFireBreathing.cs new file mode 100644 index 0000000..50b6542 --- /dev/null +++ b/Models/Cards/RedFireBreathing.cs @@ -0,0 +1,49 @@ +using System; +using System.Collections.Generic; +using System.Runtime.CompilerServices; +using System.Threading.Tasks; +using MegaCrit.Sts2.Core.Commands; +using MegaCrit.Sts2.Core.Entities.Cards; +using MegaCrit.Sts2.Core.GameActions.Multiplayer; +using MegaCrit.Sts2.Core.HoverTips; +using MegaCrit.Sts2.Core.Localization.DynamicVars; +using MegaCrit.Sts2.Core.Models.Powers; + +namespace MegaCrit.Sts2.Core.Models.Cards +{ + [NullableContext(1)] + [Nullable(0)] + public sealed class RedFireBreathing : CardModel + { + public RedFireBreathing() + : base(1, CardType.Power, CardRarity.Uncommon, TargetType.Self, true) + { + } + + protected override IEnumerable ExtraHoverTips + { + get + { + return new IHoverTip[] { HoverTipFactory.FromPower() }; + } + } + + protected override IEnumerable CanonicalVars + { + get + { + return new DynamicVar[] { new PowerVar(6m) }; + } + } + + protected override async Task OnPlay(PlayerChoiceContext choiceContext, CardPlay cardPlay) + { + await PowerCmd.Apply(base.Owner.Creature, base.DynamicVars["RedFireBreathingPower"].BaseValue, base.Owner.Creature, this, false); + } + + protected override void OnUpgrade() + { + base.DynamicVars["RedFireBreathingPower"].UpgradeValueBy(2m); + } + } +} diff --git a/Models/Cards/RedHeavyBlade.cs b/Models/Cards/RedHeavyBlade.cs new file mode 100644 index 0000000..f49cced --- /dev/null +++ b/Models/Cards/RedHeavyBlade.cs @@ -0,0 +1,60 @@ +using System; +using System.Collections.Generic; +using System.Runtime.CompilerServices; +using System.Threading.Tasks; +using MegaCrit.Sts2.Core.Commands; +using MegaCrit.Sts2.Core.Entities.Cards; +using MegaCrit.Sts2.Core.GameActions.Multiplayer; +using MegaCrit.Sts2.Core.HoverTips; +using MegaCrit.Sts2.Core.Localization.DynamicVars; +using MegaCrit.Sts2.Core.Models.Powers; +using MegaCrit.Sts2.Core.ValueProps; + +namespace MegaCrit.Sts2.Core.Models.Cards +{ + [NullableContext(1)] + [Nullable(0)] + public sealed class RedHeavyBlade : CardModel + { + public RedHeavyBlade() + : base(2, CardType.Attack, CardRarity.Common, TargetType.AnyEnemy, true) + { + } + + protected override IEnumerable CanonicalVars + { + get + { + return new DynamicVar[] + { + new DamageVar(14m, ValueProp.Move), + new DynamicVar("StrengthMultiplier", 3m) + }; + } + } + + protected override IEnumerable ExtraHoverTips + { + get + { + return new IHoverTip[] { HoverTipFactory.FromPower() }; + } + } + + protected override async Task OnPlay(PlayerChoiceContext choiceContext, CardPlay cardPlay) + { + ArgumentNullException.ThrowIfNull(cardPlay.Target, "cardPlay.Target"); + decimal strength = base.Owner.Creature.GetPowerAmount(); + decimal extraStrengthScaling = strength * (base.DynamicVars["StrengthMultiplier"].BaseValue - 1m); + await DamageCmd.Attack(base.DynamicVars.Damage.BaseValue + extraStrengthScaling).FromCard(this).Targeting(cardPlay.Target) + .WithHitFx("vfx/vfx_attack_slash", null, null) + .Execute(choiceContext); + } + + protected override void OnUpgrade() + { + base.DynamicVars.Damage.UpgradeValueBy(3m); + base.DynamicVars["StrengthMultiplier"].SetBaseValue(5m, false); + } + } +} diff --git a/Models/Cards/RedMetallicize.cs b/Models/Cards/RedMetallicize.cs new file mode 100644 index 0000000..409581c --- /dev/null +++ b/Models/Cards/RedMetallicize.cs @@ -0,0 +1,49 @@ +using System; +using System.Collections.Generic; +using System.Runtime.CompilerServices; +using System.Threading.Tasks; +using MegaCrit.Sts2.Core.Commands; +using MegaCrit.Sts2.Core.Entities.Cards; +using MegaCrit.Sts2.Core.GameActions.Multiplayer; +using MegaCrit.Sts2.Core.HoverTips; +using MegaCrit.Sts2.Core.Localization.DynamicVars; +using MegaCrit.Sts2.Core.Models.Powers; + +namespace MegaCrit.Sts2.Core.Models.Cards +{ + [NullableContext(1)] + [Nullable(0)] + public sealed class RedMetallicize : CardModel + { + public RedMetallicize() + : base(1, CardType.Power, CardRarity.Uncommon, TargetType.Self, true) + { + } + + protected override IEnumerable ExtraHoverTips + { + get + { + return new IHoverTip[] { HoverTipFactory.FromPower() }; + } + } + + protected override IEnumerable CanonicalVars + { + get + { + return new DynamicVar[] { new PowerVar(3m) }; + } + } + + protected override async Task OnPlay(PlayerChoiceContext choiceContext, CardPlay cardPlay) + { + await PowerCmd.Apply(base.Owner.Creature, base.DynamicVars["RedMetallicizePower"].BaseValue, base.Owner.Creature, this, false); + } + + protected override void OnUpgrade() + { + base.DynamicVars["RedMetallicizePower"].UpgradeValueBy(1m); + } + } +} diff --git a/Models/Cards/RedPummel.cs b/Models/Cards/RedPummel.cs new file mode 100644 index 0000000..8122851 --- /dev/null +++ b/Models/Cards/RedPummel.cs @@ -0,0 +1,67 @@ +using System; +using System.Collections.Generic; +using System.Runtime.CompilerServices; +using System.Threading.Tasks; +using MegaCrit.Sts2.Core.Commands; +using MegaCrit.Sts2.Core.Entities.Cards; +using MegaCrit.Sts2.Core.GameActions.Multiplayer; +using MegaCrit.Sts2.Core.HoverTips; +using MegaCrit.Sts2.Core.Localization.DynamicVars; +using MegaCrit.Sts2.Core.ValueProps; + +namespace MegaCrit.Sts2.Core.Models.Cards +{ + [NullableContext(1)] + [Nullable(0)] + public sealed class RedPummel : CardModel + { + public RedPummel() + : base(1, CardType.Attack, CardRarity.Uncommon, TargetType.AnyEnemy, true) + { + } + + protected override IEnumerable ExtraHoverTips + { + get + { + return new IHoverTip[] { HoverTipFactory.FromKeyword(CardKeyword.Exhaust) }; + } + } + + public override IEnumerable CanonicalKeywords + { + get + { + return new CardKeyword[] { CardKeyword.Exhaust }; + } + } + + protected override IEnumerable CanonicalVars + { + get + { + return new DynamicVar[] + { + new DamageVar(2m, ValueProp.Move), + new DynamicVar("Hits", 4m) + }; + } + } + + protected override async Task OnPlay(PlayerChoiceContext choiceContext, CardPlay cardPlay) + { + ArgumentNullException.ThrowIfNull(cardPlay.Target, "cardPlay.Target"); + await DamageCmd.Attack(base.DynamicVars.Damage.BaseValue) + .WithHitCount(base.DynamicVars["Hits"].IntValue) + .FromCard(this) + .Targeting(cardPlay.Target) + .WithHitFx("vfx/vfx_attack_slash", null, null) + .Execute(choiceContext); + } + + protected override void OnUpgrade() + { + base.DynamicVars["Hits"].UpgradeValueBy(1m); + } + } +} diff --git a/Models/Cards/RedSearingBlow.cs b/Models/Cards/RedSearingBlow.cs new file mode 100644 index 0000000..a16d192 --- /dev/null +++ b/Models/Cards/RedSearingBlow.cs @@ -0,0 +1,51 @@ +using System; +using System.Collections.Generic; +using System.Runtime.CompilerServices; +using System.Threading.Tasks; +using MegaCrit.Sts2.Core.Commands; +using MegaCrit.Sts2.Core.Entities.Cards; +using MegaCrit.Sts2.Core.GameActions.Multiplayer; +using MegaCrit.Sts2.Core.Localization.DynamicVars; +using MegaCrit.Sts2.Core.ValueProps; + +namespace MegaCrit.Sts2.Core.Models.Cards +{ + [NullableContext(1)] + [Nullable(0)] + public sealed class RedSearingBlow : CardModel + { + public RedSearingBlow() + : base(2, CardType.Attack, CardRarity.Uncommon, TargetType.AnyEnemy, true) + { + } + + public override int MaxUpgradeLevel + { + get + { + return 99; + } + } + + protected override IEnumerable CanonicalVars + { + get + { + return new DynamicVar[] { new DamageVar(12m, ValueProp.Move) }; + } + } + + protected override async Task OnPlay(PlayerChoiceContext choiceContext, CardPlay cardPlay) + { + ArgumentNullException.ThrowIfNull(cardPlay.Target, "cardPlay.Target"); + await DamageCmd.Attack(base.DynamicVars.Damage.BaseValue).FromCard(this).Targeting(cardPlay.Target) + .WithHitFx("vfx/vfx_attack_blunt", null, "blunt_attack.mp3") + .Execute(choiceContext); + } + + protected override void OnUpgrade() + { + base.DynamicVars.Damage.UpgradeValueBy(3m + (decimal)base.CurrentUpgradeLevel); + } + } +} diff --git a/Models/Cards/RedShockwave.cs b/Models/Cards/RedShockwave.cs new file mode 100644 index 0000000..66b63f1 --- /dev/null +++ b/Models/Cards/RedShockwave.cs @@ -0,0 +1,69 @@ +using System; +using System.Collections.Generic; +using System.Runtime.CompilerServices; +using System.Threading.Tasks; +using MegaCrit.Sts2.Core.Commands; +using MegaCrit.Sts2.Core.Entities.Cards; +using MegaCrit.Sts2.Core.Entities.Creatures; +using MegaCrit.Sts2.Core.GameActions.Multiplayer; +using MegaCrit.Sts2.Core.HoverTips; +using MegaCrit.Sts2.Core.Localization.DynamicVars; +using MegaCrit.Sts2.Core.Models.Powers; + +namespace MegaCrit.Sts2.Core.Models.Cards +{ + [NullableContext(1)] + [Nullable(0)] + public sealed class RedShockwave : CardModel + { + public RedShockwave() + : base(2, CardType.Skill, CardRarity.Uncommon, TargetType.AllEnemies, true) + { + } + + protected override IEnumerable CanonicalVars + { + get + { + return new DynamicVar[] { new DynamicVar("Power", 3m) }; + } + } + + public override IEnumerable CanonicalKeywords + { + get + { + return new CardKeyword[] { CardKeyword.Exhaust }; + } + } + + protected override IEnumerable ExtraHoverTips + { + get + { + return new IHoverTip[] + { + HoverTipFactory.FromPower(), + HoverTipFactory.FromPower() + }; + } + } + + protected override async Task OnPlay(PlayerChoiceContext choiceContext, CardPlay cardPlay) + { + await CreatureCmd.TriggerAnim(base.Owner.Creature, "Cast", base.Owner.Character.CastAnimDelay); + VfxCmd.PlayOnCreatureCenter(base.Owner.Creature, "vfx/vfx_flying_slash"); + int amount = base.DynamicVars["Power"].IntValue; + foreach (Creature enemy in base.CombatState.HittableEnemies) + { + await PowerCmd.Apply(enemy, amount, base.Owner.Creature, this, false); + await PowerCmd.Apply(enemy, amount, base.Owner.Creature, this, false); + } + } + + protected override void OnUpgrade() + { + base.DynamicVars["Power"].UpgradeValueBy(2m); + } + } +} diff --git a/Models/Powers/GreenCorpseExplosionPower.cs b/Models/Powers/GreenCorpseExplosionPower.cs new file mode 100644 index 0000000..bb04faf --- /dev/null +++ b/Models/Powers/GreenCorpseExplosionPower.cs @@ -0,0 +1,53 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.CompilerServices; +using System.Threading.Tasks; +using MegaCrit.Sts2.Core.Commands; +using MegaCrit.Sts2.Core.Entities.Creatures; +using MegaCrit.Sts2.Core.Entities.Powers; +using MegaCrit.Sts2.Core.GameActions.Multiplayer; +using MegaCrit.Sts2.Core.ValueProps; + +namespace MegaCrit.Sts2.Core.Models.Powers +{ + [NullableContext(1)] + [Nullable(0)] + public sealed class GreenCorpseExplosionPower : PowerModel + { + public override PowerType Type + { + get + { + return PowerType.Debuff; + } + } + + public override PowerStackType StackType + { + get + { + return PowerStackType.Single; + } + } + + public override async Task AfterDeath(PlayerChoiceContext choiceContext, Creature creature, bool wasRemovalPrevented, float deathAnimLength) + { + if (wasRemovalPrevented) + { + return; + } + if (creature != base.Owner) + { + return; + } + decimal damage = base.Owner.MaxHp; + List list = base.CombatState.GetCreaturesOnSide(base.Owner.Side).Where((Creature c) => c != base.Owner && c.IsAlive).ToList(); + if (list.Count == 0) + { + return; + } + await CreatureCmd.Damage(choiceContext, list, damage, ValueProp.Unpowered, base.Applier ?? base.Owner, null); + } + } +} diff --git a/Models/Powers/RedCombustPower.cs b/Models/Powers/RedCombustPower.cs new file mode 100644 index 0000000..9712302 --- /dev/null +++ b/Models/Powers/RedCombustPower.cs @@ -0,0 +1,51 @@ +using System; +using System.Collections.Generic; +using System.Runtime.CompilerServices; +using System.Threading.Tasks; +using MegaCrit.Sts2.Core.Commands; +using MegaCrit.Sts2.Core.Entities.Powers; +using MegaCrit.Sts2.Core.GameActions.Multiplayer; +using MegaCrit.Sts2.Core.Localization.DynamicVars; +using MegaCrit.Sts2.Core.ValueProps; + +namespace MegaCrit.Sts2.Core.Models.Powers +{ + [NullableContext(1)] + [Nullable(0)] + public sealed class RedCombustPower : PowerModel + { + public override PowerType Type + { + get + { + return PowerType.Buff; + } + } + + public override PowerStackType StackType + { + get + { + return PowerStackType.Counter; + } + } + + protected override IEnumerable CanonicalVars + { + get + { + return new DynamicVar[] { new DamageVar("SelfDamage", 1m, ValueProp.Unblockable | ValueProp.Unpowered) }; + } + } + + public override async Task BeforeTurnEndEarly(PlayerChoiceContext choiceContext, CombatSide side) + { + if (side == base.Owner.Side) + { + base.Flash(); + await CreatureCmd.Damage(choiceContext, base.Owner, ((DamageVar)base.DynamicVars["SelfDamage"]).BaseValue, ValueProp.Unblockable | ValueProp.Unpowered, null, null); + await CreatureCmd.Damage(choiceContext, base.CombatState.HittableEnemies, base.Amount, ValueProp.Unpowered, base.Owner, null); + } + } + } +} diff --git a/Models/Powers/RedFireBreathingPower.cs b/Models/Powers/RedFireBreathingPower.cs new file mode 100644 index 0000000..c6d4a53 --- /dev/null +++ b/Models/Powers/RedFireBreathingPower.cs @@ -0,0 +1,41 @@ +using System; +using System.Runtime.CompilerServices; +using System.Threading.Tasks; +using MegaCrit.Sts2.Core.Commands; +using MegaCrit.Sts2.Core.Entities.Cards; +using MegaCrit.Sts2.Core.Entities.Powers; +using MegaCrit.Sts2.Core.GameActions.Multiplayer; +using MegaCrit.Sts2.Core.ValueProps; + +namespace MegaCrit.Sts2.Core.Models.Powers +{ + [NullableContext(1)] + [Nullable(0)] + public sealed class RedFireBreathingPower : PowerModel + { + public override PowerType Type + { + get + { + return PowerType.Buff; + } + } + + public override PowerStackType StackType + { + get + { + return PowerStackType.Counter; + } + } + + public override async Task AfterCardDrawn(PlayerChoiceContext choiceContext, CardModel card, bool fromHandDraw) + { + if (card.Owner.Creature == base.Owner && (card.Type == CardType.Status || card.Type == CardType.Curse)) + { + base.Flash(); + await CreatureCmd.Damage(choiceContext, base.CombatState.HittableEnemies, base.Amount, ValueProp.Unpowered, base.Owner, null); + } + } + } +} diff --git a/Models/Powers/RedMetallicizePower.cs b/Models/Powers/RedMetallicizePower.cs new file mode 100644 index 0000000..c4abef5 --- /dev/null +++ b/Models/Powers/RedMetallicizePower.cs @@ -0,0 +1,59 @@ +using System; +using System.Collections.Generic; +using System.Runtime.CompilerServices; +using System.Threading.Tasks; +using MegaCrit.Sts2.Core.Commands; +using MegaCrit.Sts2.Core.Entities.Powers; +using MegaCrit.Sts2.Core.GameActions.Multiplayer; +using MegaCrit.Sts2.Core.HoverTips; +using MegaCrit.Sts2.Core.Localization.DynamicVars; +using MegaCrit.Sts2.Core.ValueProps; + +namespace MegaCrit.Sts2.Core.Models.Powers +{ + [NullableContext(1)] + [Nullable(0)] + public sealed class RedMetallicizePower : PowerModel + { + public override PowerType Type + { + get + { + return PowerType.Buff; + } + } + + public override PowerStackType StackType + { + get + { + return PowerStackType.Counter; + } + } + + public override bool ShouldScaleInMultiplayer + { + get + { + return true; + } + } + + protected override IEnumerable ExtraHoverTips + { + get + { + return new IHoverTip[] { HoverTipFactory.Static(StaticHoverTip.Block, Array.Empty()) }; + } + } + + public override async Task BeforeTurnEndEarly(PlayerChoiceContext choiceContext, CombatSide side) + { + if (side == base.Owner.Side) + { + base.Flash(); + await CreatureCmd.GainBlock(base.Owner, base.Amount, ValueProp.Unpowered, null, false); + } + } + } +}