复制牌,保护buff显示调整

This commit is contained in:
SoulliesOfficial
2025-10-30 12:07:59 -04:00
parent b68eeda9af
commit 8b72c75128
33 changed files with 433 additions and 104 deletions

View File

@@ -146,6 +146,20 @@ namespace Continentis.MainGame.Card
{
return ModManager.GetData<CardData>(cardData.derivativeCardDataRefs[index]);
}
/// <summary>
/// 获取衍生卡牌数据
/// </summary>
public CardData GetDerivativeCardData(string dataName)
{
if (cardData.derivativeCardDataRefs.Contains(dataName))
{
return ModManager.GetData<CardData>(dataName);
}
Debug.LogError($"Card {cardData.className} does not contain derivative card data '{dataName}'.");
return null;
}
}
/// <summary>

View File

@@ -63,7 +63,7 @@ namespace Continentis.MainGame.Card
public virtual void DetectTargetsValidity(out List<CharacterBase> valid, out List<CharacterBase> notMet, out List<CharacterBase> invalid)
{
List<CharacterBase> characters = CombatMainManager.Instance.characterController.characters;
invalid = new List<CharacterBase>();
invalid = new List<CharacterBase>(characters);
notMet = new List<CharacterBase>();
valid = new List<CharacterBase>();
@@ -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<CharacterBase> 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<CharacterBase> 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(() =>

View File

@@ -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;
}

View File

@@ -103,6 +103,14 @@ namespace SLSFramework.General
return newList;
}
public static void RemoveRange<T>(this IList<T> list, IEnumerable<T> elements)
{
foreach (T element in elements)
{
list.Remove(element);
}
}
/// <summary>
/// 根据指定的过滤器函数,返回一个新的列表,包含符合条件的元素
/// </summary>