From 8b72c7512829a2410d9d4537d853837194303cc6 Mon Sep 17 00:00:00 2001 From: SoulliesOfficial Date: Thu, 30 Oct 2025 12:07:59 -0400 Subject: [PATCH] =?UTF-8?q?=E5=A4=8D=E5=88=B6=E7=89=8C=EF=BC=8C=E4=BF=9D?= =?UTF-8?q?=E6=8A=A4buff=E6=98=BE=E7=A4=BA=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Assets/ExportedMods/Basic.umod | 4 +- Assets/Mods/Basic/Basic_Manifest.asset | 3 + ...CardData_Basic_BattlefieldExperience.asset | 58 +++++++++ ...ata_Basic_BattlefieldExperience.asset.meta | 8 ++ .../Knight/CardData_Basic_BodyAsShield.asset | 62 +++++++++ .../CardData_Basic_BodyAsShield.asset.meta | 8 ++ .../Knight/CardData_Basic_EchoOfHonor.asset | 58 +++++++++ .../CardData_Basic_EchoOfHonor.asset.meta | 8 ++ .../CardLogicComponent_Protect.cs | 2 +- .../Scripts/Knight/BattlefieldExperience.cs | 30 +++++ .../Knight/BattlefieldExperience.cs.meta | 2 + .../Cards/Scripts/Knight/BodyAsShield.cs | 28 ++++ .../Cards/Scripts/Knight/BodyAsShield.cs.meta | 2 + .../Basic/Cards/Scripts/Knight/EchoOfHonor.cs | 37 ++++++ .../Cards/Scripts/Knight/EchoOfHonor.cs.meta | 2 + .../Basic/Cards/Scripts/Knight/IronWall.cs | 16 +++ .../Cards/Scripts/Knight/IronWall.cs.meta | 2 + .../Cards/Scripts/ObsoleteGeneral/Guard.cs | 2 +- .../CombatBuffs/General/Protected.cs | 19 ++- .../CombatBuffs/General/Protecting.cs | 21 ++- .../Data/CharacterData_Basic_Knight.asset | 3 + .../Localization_Basic_GeneralBuffs.csv | 2 +- .../Basic_EditKeywordsReference.asset | 4 + ...ardSprite_Basic_BattlefieldExperience.png} | Bin ...rite_Basic_BattlefieldExperience.png.meta} | 0 ....png => CardSprite_Basic_BodyAsShield.png} | Bin ...=> CardSprite_Basic_BodyAsShield.png.meta} | 0 ...9.png => CardSprite_Basic_EchoOfHonor.png} | Bin ... => CardSprite_Basic_EchoOfHonor.png.meta} | 0 Assets/Scripts/MainGame/Card/CardLogicBase.cs | 14 ++ .../MainGame/Card/CardMainFunctions.cs | 123 ++++++------------ .../MainGame/Combat/CombatMainManager.cs | 11 ++ .../ScriptExtensions/General/ListExtension.cs | 8 ++ 33 files changed, 433 insertions(+), 104 deletions(-) create mode 100644 Assets/Mods/Basic/Cards/Data/PlayerHeros/Knight/CardData_Basic_BattlefieldExperience.asset create mode 100644 Assets/Mods/Basic/Cards/Data/PlayerHeros/Knight/CardData_Basic_BattlefieldExperience.asset.meta create mode 100644 Assets/Mods/Basic/Cards/Data/PlayerHeros/Knight/CardData_Basic_BodyAsShield.asset create mode 100644 Assets/Mods/Basic/Cards/Data/PlayerHeros/Knight/CardData_Basic_BodyAsShield.asset.meta create mode 100644 Assets/Mods/Basic/Cards/Data/PlayerHeros/Knight/CardData_Basic_EchoOfHonor.asset create mode 100644 Assets/Mods/Basic/Cards/Data/PlayerHeros/Knight/CardData_Basic_EchoOfHonor.asset.meta create mode 100644 Assets/Mods/Basic/Cards/Scripts/Knight/BattlefieldExperience.cs create mode 100644 Assets/Mods/Basic/Cards/Scripts/Knight/BattlefieldExperience.cs.meta create mode 100644 Assets/Mods/Basic/Cards/Scripts/Knight/BodyAsShield.cs create mode 100644 Assets/Mods/Basic/Cards/Scripts/Knight/BodyAsShield.cs.meta create mode 100644 Assets/Mods/Basic/Cards/Scripts/Knight/EchoOfHonor.cs create mode 100644 Assets/Mods/Basic/Cards/Scripts/Knight/EchoOfHonor.cs.meta create mode 100644 Assets/Mods/Basic/Cards/Scripts/Knight/IronWall.cs create mode 100644 Assets/Mods/Basic/Cards/Scripts/Knight/IronWall.cs.meta rename Assets/Mods/Basic/Sprites/Cards/AI/{4a144ebb050df10ff6befd4f8cf2ad04.png => CardSprite_Basic_BattlefieldExperience.png} (100%) rename Assets/Mods/Basic/Sprites/Cards/AI/{4a144ebb050df10ff6befd4f8cf2ad04.png.meta => CardSprite_Basic_BattlefieldExperience.png.meta} (100%) rename Assets/Mods/Basic/Sprites/Cards/AI/{00043-1066028138.png => CardSprite_Basic_BodyAsShield.png} (100%) rename Assets/Mods/Basic/Sprites/Cards/AI/{00043-1066028138.png.meta => CardSprite_Basic_BodyAsShield.png.meta} (100%) rename Assets/Mods/Basic/Sprites/Cards/AI/{00085-20230611234129.png => CardSprite_Basic_EchoOfHonor.png} (100%) rename Assets/Mods/Basic/Sprites/Cards/AI/{00085-20230611234129.png.meta => CardSprite_Basic_EchoOfHonor.png.meta} (100%) diff --git a/Assets/ExportedMods/Basic.umod b/Assets/ExportedMods/Basic.umod index 2e689adb..67f2697f 100644 --- a/Assets/ExportedMods/Basic.umod +++ b/Assets/ExportedMods/Basic.umod @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:5a5cc9edc8b2abd41fea0816ce2d2280c094ab23b1719550ce0f15ac9af48e9e -size 483178938 +oid sha256:139564ff86e1db541019256f8e294a1b3de8b04fb00bd15892a947c167fcf262 +size 483213816 diff --git a/Assets/Mods/Basic/Basic_Manifest.asset b/Assets/Mods/Basic/Basic_Manifest.asset index d01c50e0..5dde15b9 100644 --- a/Assets/Mods/Basic/Basic_Manifest.asset +++ b/Assets/Mods/Basic/Basic_Manifest.asset @@ -50,7 +50,10 @@ MonoBehaviour: - CardData_Basic_Dazed - CardData_Basic_Faint - CardData_Basic_Oblivion + - CardData_Basic_BattlefieldExperience + - CardData_Basic_BodyAsShield - CardData_Basic_Cover + - CardData_Basic_EchoOfHonor - CardData_Basic_GuardianAura - CardData_Basic_KightDefense - CardData_Basic_KnightStrike diff --git a/Assets/Mods/Basic/Cards/Data/PlayerHeros/Knight/CardData_Basic_BattlefieldExperience.asset b/Assets/Mods/Basic/Cards/Data/PlayerHeros/Knight/CardData_Basic_BattlefieldExperience.asset new file mode 100644 index 00000000..457b1a58 --- /dev/null +++ b/Assets/Mods/Basic/Cards/Data/PlayerHeros/Knight/CardData_Basic_BattlefieldExperience.asset @@ -0,0 +1,58 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 9a4129cdd7011ca46b83d8c17d9f3623, type: 3} + m_Name: CardData_Basic_BattlefieldExperience + m_EditorClassIdentifier: Assembly-CSharp::Continentis.MainGame.Card.CardData + modName: Basic + className: BattlefieldExperience + displayName: Card_Basic_BattlefieldExperience_DisplayName + cardRarity: 20 + cardType: 10 + keywords: + - TargetSelf + cardSprite: {fileID: 21300000, guid: f7aa890753b65ec48a3195d42c6a1f97, type: 3} + cardLayoutTags: [] + functionText: Card_Basic_BattlefieldExperience_FunctionText + cardDescription: + baseWeight: 1 + variableAttributes: + dictionaryList: + - Key: TargetCount + Value: 0 + index: 0 + isKeyDuplicated: 0 + - Key: StaminaCost + Value: 1 + index: 1 + isKeyDuplicated: 0 + - Key: ManaCost + Value: 0 + index: 2 + isKeyDuplicated: 0 + dividerPosProp: 0.5 + originalAttributes: + dictionaryList: [] + dividerPosProp: 0.5 + runtimeCurrentAttributes: + dictionaryList: [] + dividerPosProp: 0.5 + upgradeNode: + sourceCard: {fileID: 0} + isTerminalNode: 0 + isInfiniteUpgrade: 0 + maxUpgradeLevel: 0 + upgradeCards: [] + customDescriptions: [] + prefabRefs: [] + derivativeCardDataRefs: + - CardData_Basic_Strike + derivativeCharacterDataRefs: [] diff --git a/Assets/Mods/Basic/Cards/Data/PlayerHeros/Knight/CardData_Basic_BattlefieldExperience.asset.meta b/Assets/Mods/Basic/Cards/Data/PlayerHeros/Knight/CardData_Basic_BattlefieldExperience.asset.meta new file mode 100644 index 00000000..1cb9b696 --- /dev/null +++ b/Assets/Mods/Basic/Cards/Data/PlayerHeros/Knight/CardData_Basic_BattlefieldExperience.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: f9d9239ddc8a8ca439bd10ba30e2c0ab +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Mods/Basic/Cards/Data/PlayerHeros/Knight/CardData_Basic_BodyAsShield.asset b/Assets/Mods/Basic/Cards/Data/PlayerHeros/Knight/CardData_Basic_BodyAsShield.asset new file mode 100644 index 00000000..7a66ce56 --- /dev/null +++ b/Assets/Mods/Basic/Cards/Data/PlayerHeros/Knight/CardData_Basic_BodyAsShield.asset @@ -0,0 +1,62 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 9a4129cdd7011ca46b83d8c17d9f3623, type: 3} + m_Name: CardData_Basic_BodyAsShield + m_EditorClassIdentifier: + modName: Basic + className: BodyAsShield + displayName: Card_Basic_BodyAsShield_DisplayName + cardRarity: 10 + cardType: 10 + keywords: + - Reuse + - TargetAllies + cardSprite: {fileID: 21300000, guid: 08151241767bc164da8ba328a76a9ced, type: 3} + cardLayoutTags: [] + functionText: Card_Basic_BodyAsShield_FunctionText + cardDescription: + baseWeight: 1 + variableAttributes: + dictionaryList: + - Key: StaminaCost + Value: 1 + index: 0 + isKeyDuplicated: 0 + - Key: ManaCost + Value: 0 + index: 1 + isKeyDuplicated: 0 + - Key: TargetCount + Value: 1 + index: 2 + isKeyDuplicated: 0 + - Key: BuffCount_Protecting + Value: 1 + index: 3 + isKeyDuplicated: 0 + dividerPosProp: 0.5 + originalAttributes: + dictionaryList: [] + dividerPosProp: 0.5 + runtimeCurrentAttributes: + dictionaryList: [] + dividerPosProp: 0.5 + upgradeNode: + sourceCard: {fileID: 0} + isTerminalNode: 0 + isInfiniteUpgrade: 0 + maxUpgradeLevel: 0 + upgradeCards: [] + customDescriptions: [] + prefabRefs: [] + derivativeCardDataRefs: [] + derivativeCharacterDataRefs: [] diff --git a/Assets/Mods/Basic/Cards/Data/PlayerHeros/Knight/CardData_Basic_BodyAsShield.asset.meta b/Assets/Mods/Basic/Cards/Data/PlayerHeros/Knight/CardData_Basic_BodyAsShield.asset.meta new file mode 100644 index 00000000..da879873 --- /dev/null +++ b/Assets/Mods/Basic/Cards/Data/PlayerHeros/Knight/CardData_Basic_BodyAsShield.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 16ef46bc1b3e48b44a8415a273e3e4b1 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Mods/Basic/Cards/Data/PlayerHeros/Knight/CardData_Basic_EchoOfHonor.asset b/Assets/Mods/Basic/Cards/Data/PlayerHeros/Knight/CardData_Basic_EchoOfHonor.asset new file mode 100644 index 00000000..247f2b79 --- /dev/null +++ b/Assets/Mods/Basic/Cards/Data/PlayerHeros/Knight/CardData_Basic_EchoOfHonor.asset @@ -0,0 +1,58 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 9a4129cdd7011ca46b83d8c17d9f3623, type: 3} + m_Name: CardData_Basic_EchoOfHonor + m_EditorClassIdentifier: Assembly-CSharp::Continentis.MainGame.Card.CardData + modName: Basic + className: EchoOfHonor + displayName: Card_Basic_EchoOfHonor_DisplayName + cardRarity: 40 + cardType: 10 + keywords: + - TargetSelf + cardSprite: {fileID: 21300000, guid: 714816a67caa6d94e90b6f20b334a474, type: 3} + cardLayoutTags: [] + functionText: Card_Basic_EchoOfHonor_FunctionText + cardDescription: + baseWeight: 1 + variableAttributes: + dictionaryList: + - Key: TargetCount + Value: 0 + index: 0 + isKeyDuplicated: 0 + - Key: StaminaCost + Value: 2 + index: 1 + isKeyDuplicated: 0 + - Key: ManaCost + Value: 2 + index: 2 + isKeyDuplicated: 0 + dividerPosProp: 0.5 + originalAttributes: + dictionaryList: [] + dividerPosProp: 0.5 + runtimeCurrentAttributes: + dictionaryList: [] + dividerPosProp: 0.5 + upgradeNode: + sourceCard: {fileID: 0} + isTerminalNode: 0 + isInfiniteUpgrade: 0 + maxUpgradeLevel: 0 + upgradeCards: [] + customDescriptions: [] + prefabRefs: [] + derivativeCardDataRefs: + - CardData_Basic_Strike + derivativeCharacterDataRefs: [] diff --git a/Assets/Mods/Basic/Cards/Data/PlayerHeros/Knight/CardData_Basic_EchoOfHonor.asset.meta b/Assets/Mods/Basic/Cards/Data/PlayerHeros/Knight/CardData_Basic_EchoOfHonor.asset.meta new file mode 100644 index 00000000..853c23ff --- /dev/null +++ b/Assets/Mods/Basic/Cards/Data/PlayerHeros/Knight/CardData_Basic_EchoOfHonor.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 11ed4b7bf1ead254abe97724fb3688fc +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Mods/Basic/Cards/LogicComponents/CardLogicComponent_Protect.cs b/Assets/Mods/Basic/Cards/LogicComponents/CardLogicComponent_Protect.cs index 0c776984..091a2ab8 100644 --- a/Assets/Mods/Basic/Cards/LogicComponents/CardLogicComponent_Protect.cs +++ b/Assets/Mods/Basic/Cards/LogicComponents/CardLogicComponent_Protect.cs @@ -9,7 +9,7 @@ namespace Continentis.Mods.Basic.Cards { public void GenerateProtection(CharacterBase protector, CharacterBase target, int roundCount) { - Protected protectedBuff = card.CreateCharacterBuff(protector); + Protected protectedBuff = card.CreateCharacterBuff(); protectedBuff.Apply(target, user, card); Protecting protectingBuff = card.CreateCharacterBuff(target, roundCount, protectedBuff); protectingBuff.Apply(protector, user, card); diff --git a/Assets/Mods/Basic/Cards/Scripts/Knight/BattlefieldExperience.cs b/Assets/Mods/Basic/Cards/Scripts/Knight/BattlefieldExperience.cs new file mode 100644 index 00000000..dd4f2cf4 --- /dev/null +++ b/Assets/Mods/Basic/Cards/Scripts/Knight/BattlefieldExperience.cs @@ -0,0 +1,30 @@ +using System.Collections.Generic; +using Continentis.MainGame.Card; +using Continentis.MainGame.Character; +using Continentis.MainGame.Commands; +using SLSFramework.General; +using UnityEngine; + +namespace Continentis.Mods.Basic.Cards +{ + public class BattlefieldExperience : CardLogicBase + { + protected override void SetUpLogicComponents() + { + AddLogicComponent(); + } + + protected override CommandBase PlayEffect(List targetList) + { + CommandGroup mainGroup = new CommandGroup(ExecutionMode.Sequential); + mainGroup.AddCommand(new Cmd_PlayAnimation(user.characterView, "Skill")); + mainGroup.AddCommand(new Cmd_Function(() => + { + CardData holyWaterCardData = GetDerivativeCardData(0); + CardInstance.GenerateCardInstance(holyWaterCardData, user.team, "Hand"); + })); + + return mainGroup; + } + } +} \ No newline at end of file diff --git a/Assets/Mods/Basic/Cards/Scripts/Knight/BattlefieldExperience.cs.meta b/Assets/Mods/Basic/Cards/Scripts/Knight/BattlefieldExperience.cs.meta new file mode 100644 index 00000000..bb39fecb --- /dev/null +++ b/Assets/Mods/Basic/Cards/Scripts/Knight/BattlefieldExperience.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 2d882784f82e4404991185dbd3ea2ca0 \ No newline at end of file diff --git a/Assets/Mods/Basic/Cards/Scripts/Knight/BodyAsShield.cs b/Assets/Mods/Basic/Cards/Scripts/Knight/BodyAsShield.cs new file mode 100644 index 00000000..fb6845e6 --- /dev/null +++ b/Assets/Mods/Basic/Cards/Scripts/Knight/BodyAsShield.cs @@ -0,0 +1,28 @@ +using System.Collections.Generic; +using Continentis.MainGame.Card; +using Continentis.MainGame.Character; +using Continentis.MainGame.Commands; +using Continentis.Mods.Basic.Buffs; +using SLSFramework.General; +using UnityEngine; + +namespace Continentis.Mods.Basic.Cards +{ + public class BodyAsShield : CardLogicBase + { + protected override void SetUpLogicComponents() + { + AddLogicComponent(); + } + + protected override CommandBase PlayEffect(List targetList) + { + CommandGroup mainGroup = TargetListCommandGroup(targetList, + new Cmd_PlayAnimation(user.characterView, "Skill"), + new Cmd_ParamFunction((target) => + LogicComponent().GenerateProtection(user, target, GetAttribute("BuffCount_Protecting")))); + + return mainGroup; + } + } +} \ No newline at end of file diff --git a/Assets/Mods/Basic/Cards/Scripts/Knight/BodyAsShield.cs.meta b/Assets/Mods/Basic/Cards/Scripts/Knight/BodyAsShield.cs.meta new file mode 100644 index 00000000..a4b5e796 --- /dev/null +++ b/Assets/Mods/Basic/Cards/Scripts/Knight/BodyAsShield.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: a591880f990d0a945a6b76cce22e2234 \ No newline at end of file diff --git a/Assets/Mods/Basic/Cards/Scripts/Knight/EchoOfHonor.cs b/Assets/Mods/Basic/Cards/Scripts/Knight/EchoOfHonor.cs new file mode 100644 index 00000000..e122a780 --- /dev/null +++ b/Assets/Mods/Basic/Cards/Scripts/Knight/EchoOfHonor.cs @@ -0,0 +1,37 @@ +using System.Collections.Generic; +using Continentis.MainGame.Card; +using Continentis.MainGame.Character; +using Continentis.MainGame.Commands; +using SLSFramework.General; +using UnityEngine; + +namespace Continentis.Mods.Basic.Cards +{ + public class EchoOfHonor : CardLogicBase + { + protected override void SetUpLogicComponents() + { + AddLogicComponent(); + } + + protected override CommandBase PlayEffect(List targetList) + { + CommandGroup mainGroup = new CommandGroup(ExecutionMode.Sequential); + mainGroup.AddCommand(new Cmd_PlayAnimation(user.characterView, "Skill")); + mainGroup.AddCommand(new Cmd_Function(() => + { + if (user.deckSubmodule.HandPile.Exclude(this.cardInstance).TryGetRandom(out CardInstance randomHandCard)) + { + CardInstance newCard = CardInstance.GenerateCardInstance(randomHandCard.cardLogic, user, "Hand"); + newCard.cardLogic.SetAttribute("StaminaCost", 0); + newCard.GenerateHandCardView("Hand"); + } + else + { + Debug.LogWarning("EchoOfHonor: No other cards in hand to copy."); + } + })); + return mainGroup; + } + } +} \ No newline at end of file diff --git a/Assets/Mods/Basic/Cards/Scripts/Knight/EchoOfHonor.cs.meta b/Assets/Mods/Basic/Cards/Scripts/Knight/EchoOfHonor.cs.meta new file mode 100644 index 00000000..ad10c729 --- /dev/null +++ b/Assets/Mods/Basic/Cards/Scripts/Knight/EchoOfHonor.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 282b6253d383eac43817c8c9bd79aafe \ No newline at end of file diff --git a/Assets/Mods/Basic/Cards/Scripts/Knight/IronWall.cs b/Assets/Mods/Basic/Cards/Scripts/Knight/IronWall.cs new file mode 100644 index 00000000..e8f7bbf8 --- /dev/null +++ b/Assets/Mods/Basic/Cards/Scripts/Knight/IronWall.cs @@ -0,0 +1,16 @@ +using UnityEngine; + +public class IronWall : MonoBehaviour +{ + // Start is called once before the first execution of Update after the MonoBehaviour is created + void Start() + { + + } + + // Update is called once per frame + void Update() + { + + } +} diff --git a/Assets/Mods/Basic/Cards/Scripts/Knight/IronWall.cs.meta b/Assets/Mods/Basic/Cards/Scripts/Knight/IronWall.cs.meta new file mode 100644 index 00000000..c3931d8d --- /dev/null +++ b/Assets/Mods/Basic/Cards/Scripts/Knight/IronWall.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 62b78a6b24f5eac43a9ec432f9ad7f3e \ No newline at end of file diff --git a/Assets/Mods/Basic/Cards/Scripts/ObsoleteGeneral/Guard.cs b/Assets/Mods/Basic/Cards/Scripts/ObsoleteGeneral/Guard.cs index 4894a284..839add30 100644 --- a/Assets/Mods/Basic/Cards/Scripts/ObsoleteGeneral/Guard.cs +++ b/Assets/Mods/Basic/Cards/Scripts/ObsoleteGeneral/Guard.cs @@ -16,7 +16,7 @@ namespace Continentis.Mods.Basic.Cards new Cmd_PlayAnimation(user.characterView, "Skill"), new Cmd_ParamFunction((target) => { - Protected protectedBuff = CreateCharacterBuff(user); + Protected protectedBuff = CreateCharacterBuff(); protectedBuff.Apply(target, user, this); Protecting protectingBuff = CreateCharacterBuff(target, GetAttribute("BuffCount_Protecting"), protectedBuff); protectingBuff.Apply(user, user, this); diff --git a/Assets/Mods/Basic/Characters/CombatBuffs/General/Protected.cs b/Assets/Mods/Basic/Characters/CombatBuffs/General/Protected.cs index 179bef48..f85faa1a 100644 --- a/Assets/Mods/Basic/Characters/CombatBuffs/General/Protected.cs +++ b/Assets/Mods/Basic/Characters/CombatBuffs/General/Protected.cs @@ -1,3 +1,4 @@ +using System.Collections.Generic; using Continentis.MainGame; using Continentis.MainGame.Character; using Continentis.MainGame.Combat; @@ -8,30 +9,28 @@ namespace Continentis.Mods.Basic.Buffs { public class Protected : CharacterCombatBuffBase { - public CharacterBase protector; - public Protecting protectingBuff; + public List protectingSources; - public Protected(CharacterBase protector) + public Protected() { Initialize(BuffType.Neutral, BuffDispelLevel.DeathOnly, 100); - SetIdentification(protector.elementID.ToString()); - this.protector = protector; - this.contentSubmodule = new ContentSubmodule(this) - .AddParameterGetter("Protector", () => protector.data.displayName);//TODO: 以后增加角色的ContentSubmodule + this.contentSubmodule = new ContentSubmodule(this);//TODO: 以后增加角色的ContentSubmodule this.iconSubmodule = new IconSubmodule(this).SetTextFunctions(); this.eventSubmodule = new EventSubmodule(this); - this.eventSubmodule.onOpponentDecideAction.Add("Protected", + /* + this.eventSubmodule.onOpponentDecideAction.Add("Protected", new EventUnit((opponent, intendedCard, originalTarget) => { if (opponent is CombatNPC npc) { intendedCard.targets.Remove(originalTarget); - intendedCard.targets.Add(protector); //TODO: 后续用设计专门的函数决定目标改变 + //intendedCard.targets.Add(protector); //TODO: 后续用设计专门的函数决定目标改变 } })); + */ } public override bool OnBuffApply(out CharacterCombatBuffBase existingBuff) @@ -40,7 +39,7 @@ namespace Continentis.Mods.Basic.Buffs if (FindExistingSameBuff(out existingBuff)) { - return true; //独立处理,直接返回true + return false; } return true; diff --git a/Assets/Mods/Basic/Characters/CombatBuffs/General/Protecting.cs b/Assets/Mods/Basic/Characters/CombatBuffs/General/Protecting.cs index 90450c20..d62c2528 100644 --- a/Assets/Mods/Basic/Characters/CombatBuffs/General/Protecting.cs +++ b/Assets/Mods/Basic/Characters/CombatBuffs/General/Protecting.cs @@ -33,22 +33,37 @@ namespace Continentis.Mods.Basic.Buffs public override bool OnBuffApply(out CharacterCombatBuffBase existingBuff) { - this.protectedBuff ??= target.combatBuffSubmodule.GetBuff(attachedCharacter.elementID.ToString()); - this.protectedBuff.protectingBuff = this; MainGameManager.Instance.basePrefabs.GenerateInfoText(contentSubmodule.displayName, attachedCharacter.characterView); if (FindExistingSameBuff(out existingBuff)) { + Debug.Log("Existing same buff found."); + + Protecting existProtecting = existingBuff as Protecting; + Debug.Log(existProtecting == null ? "Existing buff is not of type Protecting!" : "Existing Protecting buff found."); + if (existProtecting.target == this.target) + { + existProtecting.roundCountSubmodule.AddCount(this.roundCountSubmodule.remainingCount); + return false; + } + + this.protectedBuff ??= target.combatBuffSubmodule.GetBuff(); + this.protectedBuff.protectingSources.Add(this); return true; //独立处理,直接返回true } + Debug.Log("No existing same buff found."); return true; } public override void OnBuffRemove() { base.OnBuffRemove(); - protectedBuff?.OnBuffRemove(); + protectedBuff.protectingSources.Remove(this); + if (protectedBuff.protectingSources.Count == 0) + { + protectedBuff.Remove(); + } } } } \ No newline at end of file diff --git a/Assets/Mods/Basic/Characters/Data/CharacterData_Basic_Knight.asset b/Assets/Mods/Basic/Characters/Data/CharacterData_Basic_Knight.asset index 7cd89eca..844c6c16 100644 --- a/Assets/Mods/Basic/Characters/Data/CharacterData_Basic_Knight.asset +++ b/Assets/Mods/Basic/Characters/Data/CharacterData_Basic_Knight.asset @@ -206,5 +206,8 @@ MonoBehaviour: - CardData_Basic_Tactic - CardData_Basic_Cover - CardData_Basic_OathOfCourage + - CardData_Basic_BattlefieldExperience + - CardData_Basic_BodyAsShield + - CardData_Basic_EchoOfHonor hudDataRefs: - HUDData_Basic_Default diff --git a/Assets/Mods/Basic/Localization/Localization_Basic_GeneralBuffs.csv b/Assets/Mods/Basic/Localization/Localization_Basic_GeneralBuffs.csv index deb62454..2981f1a1 100644 --- a/Assets/Mods/Basic/Localization/Localization_Basic_GeneralBuffs.csv +++ b/Assets/Mods/Basic/Localization/Localization_Basic_GeneralBuffs.csv @@ -40,6 +40,6 @@ Buff_Basic_SoulAbsorption_FunctionText,"Amplify the lifesteal effect by $Paramet Buff_Basic_Heavy_DisplayName,Heavy,沉重,,,,, Buff_Basic_Heavy_FunctionText,You can not draw cards.,你不能抽牌。,,,,, Buff_Basic_Protected_DisplayName,Protected,被保护,,,,, -Buff_Basic_Protected_FunctionText,"You are protected by $ParameterString(""Protector"").","你正在被$ParameterString(""Protector"")保护。",,,,, +Buff_Basic_Protected_FunctionText,"You are protected by $ParameterString(""Protector"").",你正在被其他人保护。,,,,, Buff_Basic_Protecting_DisplayName,Protecting,保护,,,,, Buff_Basic_Protecting_FunctionText,"You are protecting $ParameterString(""Target""), for $ParameterInt(""Count"") rounds.","你正在$ParameterInt(""Count"")回合内保护$ParameterString(""Target"")。",,,,, diff --git a/Assets/Mods/Basic/References/Basic_EditKeywordsReference.asset b/Assets/Mods/Basic/References/Basic_EditKeywordsReference.asset index 8d3449ea..9c4b55ce 100644 --- a/Assets/Mods/Basic/References/Basic_EditKeywordsReference.asset +++ b/Assets/Mods/Basic/References/Basic_EditKeywordsReference.asset @@ -90,4 +90,8 @@ MonoBehaviour: Value: index: 18 isKeyDuplicated: 0 + - Key: Reuse + Value: + index: 19 + isKeyDuplicated: 0 dividerPosProp: 0.3 diff --git a/Assets/Mods/Basic/Sprites/Cards/AI/4a144ebb050df10ff6befd4f8cf2ad04.png b/Assets/Mods/Basic/Sprites/Cards/AI/CardSprite_Basic_BattlefieldExperience.png similarity index 100% rename from Assets/Mods/Basic/Sprites/Cards/AI/4a144ebb050df10ff6befd4f8cf2ad04.png rename to Assets/Mods/Basic/Sprites/Cards/AI/CardSprite_Basic_BattlefieldExperience.png diff --git a/Assets/Mods/Basic/Sprites/Cards/AI/4a144ebb050df10ff6befd4f8cf2ad04.png.meta b/Assets/Mods/Basic/Sprites/Cards/AI/CardSprite_Basic_BattlefieldExperience.png.meta similarity index 100% rename from Assets/Mods/Basic/Sprites/Cards/AI/4a144ebb050df10ff6befd4f8cf2ad04.png.meta rename to Assets/Mods/Basic/Sprites/Cards/AI/CardSprite_Basic_BattlefieldExperience.png.meta diff --git a/Assets/Mods/Basic/Sprites/Cards/AI/00043-1066028138.png b/Assets/Mods/Basic/Sprites/Cards/AI/CardSprite_Basic_BodyAsShield.png similarity index 100% rename from Assets/Mods/Basic/Sprites/Cards/AI/00043-1066028138.png rename to Assets/Mods/Basic/Sprites/Cards/AI/CardSprite_Basic_BodyAsShield.png diff --git a/Assets/Mods/Basic/Sprites/Cards/AI/00043-1066028138.png.meta b/Assets/Mods/Basic/Sprites/Cards/AI/CardSprite_Basic_BodyAsShield.png.meta similarity index 100% rename from Assets/Mods/Basic/Sprites/Cards/AI/00043-1066028138.png.meta rename to Assets/Mods/Basic/Sprites/Cards/AI/CardSprite_Basic_BodyAsShield.png.meta diff --git a/Assets/Mods/Basic/Sprites/Cards/AI/00085-20230611234129.png b/Assets/Mods/Basic/Sprites/Cards/AI/CardSprite_Basic_EchoOfHonor.png similarity index 100% rename from Assets/Mods/Basic/Sprites/Cards/AI/00085-20230611234129.png rename to Assets/Mods/Basic/Sprites/Cards/AI/CardSprite_Basic_EchoOfHonor.png diff --git a/Assets/Mods/Basic/Sprites/Cards/AI/00085-20230611234129.png.meta b/Assets/Mods/Basic/Sprites/Cards/AI/CardSprite_Basic_EchoOfHonor.png.meta similarity index 100% rename from Assets/Mods/Basic/Sprites/Cards/AI/00085-20230611234129.png.meta rename to Assets/Mods/Basic/Sprites/Cards/AI/CardSprite_Basic_EchoOfHonor.png.meta diff --git a/Assets/Scripts/MainGame/Card/CardLogicBase.cs b/Assets/Scripts/MainGame/Card/CardLogicBase.cs index 129b2c4c..40d5f020 100644 --- a/Assets/Scripts/MainGame/Card/CardLogicBase.cs +++ b/Assets/Scripts/MainGame/Card/CardLogicBase.cs @@ -146,6 +146,20 @@ namespace Continentis.MainGame.Card { return ModManager.GetData(cardData.derivativeCardDataRefs[index]); } + + /// + /// 获取衍生卡牌数据 + /// + public CardData GetDerivativeCardData(string dataName) + { + if (cardData.derivativeCardDataRefs.Contains(dataName)) + { + return ModManager.GetData(dataName); + } + + Debug.LogError($"Card {cardData.className} does not contain derivative card data '{dataName}'."); + return null; + } } /// diff --git a/Assets/Scripts/MainGame/Card/CardMainFunctions.cs b/Assets/Scripts/MainGame/Card/CardMainFunctions.cs index 5d12688b..dc3a95a8 100644 --- a/Assets/Scripts/MainGame/Card/CardMainFunctions.cs +++ b/Assets/Scripts/MainGame/Card/CardMainFunctions.cs @@ -63,7 +63,7 @@ namespace Continentis.MainGame.Card public virtual void DetectTargetsValidity(out List valid, out List notMet, out List invalid) { List characters = CombatMainManager.Instance.characterController.characters; - invalid = new List(); + invalid = new List(characters); notMet = new List(); valid = new List(); @@ -71,98 +71,48 @@ namespace Continentis.MainGame.Card if (targetCount <= -2) { + Debug.LogError("Invalid target count setting on card: " + contentSubmodule.cardName); return; } - - if (targetCount == 0 || HasKeyword("TargetSelf")) // 卡牌目标为自身 - { - valid.Add(user); - invalid.AddRange(characters); - invalid.Remove(user); - } - else if (HasKeyword("TargetAllies")) // 卡牌目标为友方单位 - { - if(user.fraction is Fraction.Ally or Fraction.Player) - { - foreach (CharacterBase character in characters) - { - if (character.fraction is Fraction.Ally or Fraction.Player) - { - valid.Add(character); - } - else - { - invalid.Add(character); - } - } - } - else - { - foreach (CharacterBase character in characters) - { - if (character.fraction == user.fraction) - { - valid.Add(character); - } - else - { - invalid.Add(character); - } - } - } - } - else if (HasKeyword("TargetEnemies")) // 卡牌目标为敌人 - { - if (user.fraction is Fraction.Ally or Fraction.Player) - { - foreach (CharacterBase character in characters) - { - if (character.fraction is Fraction.Enemy or Fraction.Neutral) - { - valid.Add(character); - } - else - { - invalid.Add(character); - } - } - } - else - { - foreach (CharacterBase character in characters) - { - if (character.fraction != user.fraction) - { - valid.Add(character); - } - else - { - invalid.Add(character); - } - } - } - if (targetCount != -1) - { - if (valid.Any(target => target.statusSubmodule.HasStatus(StatusType.Taunt))) - { - List protectedTargets = valid - .Where(target => !target.statusSubmodule.HasStatus(StatusType.Taunt)) - .ToList(); - - notMet.AddRange(protectedTargets); - valid.RemoveAll(target => !target.statusSubmodule.HasStatus(StatusType.Taunt)); - } - } - } - else if(HasKeyword("TargetAll")) // 卡牌目标为全体 + if (HasKeyword("TargetAll")) { valid.AddRange(characters); } else { - valid.AddRange(characters);// 默认卡牌目标为所有单位 - Debug.Log("No valid target found"); + if (HasKeyword("TargetAllies")) + { + valid.AddRange(user.fraction is Fraction.Ally or Fraction.Player + ? characters.Where(character => character.fraction is Fraction.Ally or Fraction.Player) + : characters.Where(character => character.fraction == user.fraction)); + valid.Remove(user); + } + + if (HasKeyword("TargetSelf")) + { + valid.Add(user); + } + + if (HasKeyword("TargetEnemies")) + { + valid.AddRange(user.fraction is Fraction.Ally or Fraction.Player + ? characters.Where(character => character.fraction is Fraction.Enemy or Fraction.Neutral) + : characters.Where(character => character.fraction != user.fraction)); + + //处理保护,嘲讽等 + if (targetCount != -1) + { + List protectedTargets = valid.Where(target => target.statusSubmodule.HasStatus(StatusType.Protected)).ToList(); + notMet.AddRange(protectedTargets); + valid.RemoveRange(protectedTargets); + } + } + } + + foreach (CharacterBase validTarget in valid) + { + invalid.Remove(validTarget); } } @@ -260,6 +210,7 @@ namespace Continentis.MainGame.Card }); AfterPlayEffect(targetList); playSubmodule.isDuringPlayEffect = false; + handCardView.isDuringPlaying = false; })); return true; } @@ -287,7 +238,7 @@ namespace Continentis.MainGame.Card { playerHero.deckSubmodule.ExhaustCard(cardInstance); } - else + else if(!HasKeyword("Reuse")) { playerHero.deckSubmodule.DiscardCard(cardInstance); CommandQueueManager.Instance.AddCommand(new Cmd_Function(() => diff --git a/Assets/Scripts/MainGame/Combat/CombatMainManager.cs b/Assets/Scripts/MainGame/Combat/CombatMainManager.cs index 281ac675..9d5545da 100644 --- a/Assets/Scripts/MainGame/Combat/CombatMainManager.cs +++ b/Assets/Scripts/MainGame/Combat/CombatMainManager.cs @@ -116,6 +116,10 @@ namespace Continentis.MainGame.Combat } } } + + character.eventSubmodule.onRoundStart.Invoke(); + character.equipmentSubmodule.currentEquipments.ForEach(equipment => equipment.eventSubmodule.onRoundStart.Invoke()); + character.combatBuffSubmodule.RoundStart(); } NextAction(); @@ -126,6 +130,13 @@ namespace Continentis.MainGame.Combat { if (characterController.actionOrderList.Count == 0) { + foreach (CharacterBase character in characterController.characters) + { + character.eventSubmodule.onRoundEnd.Invoke(); + character.equipmentSubmodule.currentEquipments.ForEach(equipment => equipment.eventSubmodule.onRoundEnd.Invoke()); + character.combatBuffSubmodule.RoundEnd(); + } + NextRound(); return; } diff --git a/Assets/Scripts/ScriptExtensions/General/ListExtension.cs b/Assets/Scripts/ScriptExtensions/General/ListExtension.cs index 41c49119..72b9c54b 100644 --- a/Assets/Scripts/ScriptExtensions/General/ListExtension.cs +++ b/Assets/Scripts/ScriptExtensions/General/ListExtension.cs @@ -103,6 +103,14 @@ namespace SLSFramework.General return newList; } + public static void RemoveRange(this IList list, IEnumerable elements) + { + foreach (T element in elements) + { + list.Remove(element); + } + } + /// /// 根据指定的过滤器函数,返回一个新的列表,包含符合条件的元素 ///