Files
SVSimServer/SVSim.BattleEngine/Engine/BuffDetailInfoUI.cs
gamer147 0d9d8acae0 feat(battle-engine): M1 auto-copy closure (782 battle-logic files)
Compile-driven bulk-copy loop (tools/engine-port/m1_copy_loop.py) pulled the precise reference closure of the battle-core roots, stopping at the classify god-object/View-VFX-UI boundary. 782 files; no re-explosion (M0 had estimated ~order 1000). Residual frontier = 52 shim-classified + 80 external (Unity/BCL) types to author next.
2026-06-05 16:57:20 -04:00

396 lines
16 KiB
C#

using System.Collections.Generic;
using System.Linq;
using System.Text;
using UnityEngine;
using Wizard;
using Wizard.Battle.UI;
public class BuffDetailInfoUI : MonoBehaviour
{
[SerializeField]
private UILabel _titleLabel;
[SerializeField]
private UILabel _buffLabel;
private const float TITLE_HEIGHT = 50f;
public const string NOT_SHOW_BUFF_DETAIL_STORY_SPECIAL_BATTLE_ID = "42";
public float Height => 50f + (float)_buffLabel.height;
public void Initialize()
{
_titleLabel.text = Data.SystemText.Get("BattleLog_0268");
}
public void SetBuffDetailLabel(BattleCardBase cardBase)
{
StringBuilder stringBuilder = new StringBuilder();
List<SkillBase> allBuffSkills = GetAllBuffSkills(cardBase, cardBase.BuffInfoList.Select((BuffInfo b) => b.SkillFrom).ToList());
if (!cardBase.IsClass)
{
if (cardBase.Cost != cardBase.BaseCost)
{
int num = cardBase.Cost - cardBase.BaseCost;
string text = ((num > 0) ? ("+" + num) : num.ToString());
AppendBuffText(stringBuilder, Data.SystemText.Get("BattleLog_0273", text));
}
if (allBuffSkills.Any((SkillBase s) => s is Skill_powerup || s is Skill_power_down))
{
int currentAtkBuff = cardBase.GetCurrentAtkBuff();
int currentLifeBuff = cardBase.GetCurrentLifeBuff();
if (currentAtkBuff != 0 || currentLifeBuff != 0)
{
string retAttack = string.Empty;
string retLife = string.Empty;
BattleLogUtility.GetBuffValueStringFormatted(currentAtkBuff, currentLifeBuff, ref retAttack, ref retLife);
AppendBuffText(stringBuilder, Data.SystemText.Get("BattleLog_0040", retAttack, retLife));
}
}
bool flag = allBuffSkills.Any((SkillBase s) => s is Skill_quick && (!cardBase.IsInHand || s.OnWhenPlayStart == 0));
bool flag2 = allBuffSkills.Any((SkillBase s) => s is Skill_rush && (!cardBase.IsInHand || s.OnWhenPlayStart == 0));
bool flag3 = allBuffSkills.Any((SkillBase s) => s is Skill_killer && (!cardBase.IsInHand || s.OnWhenPlayStart == 0));
bool flag4 = allBuffSkills.Any((SkillBase s) => s is Skill_drain && (!cardBase.IsInHand || s.OnWhenPlayStart == 0));
if (ExistCopiedSkillNeedDetailText(cardBase))
{
IEnumerable<BuffInfo> source = cardBase.BuffInfoList.Where((BuffInfo b) => b.IsCopied);
for (int num2 = 0; num2 < source.Count(); num2++)
{
if (source.ElementAt(num2).SkillFrom is SkillBaseCopy skillBaseCopy)
{
switch (skillBaseCopy.SkillType)
{
case "quick":
flag = true;
break;
case "rush":
flag2 = true;
break;
case "killer":
flag3 = true;
break;
case "drain":
flag4 = true;
break;
}
}
}
}
if (flag)
{
AppendBuffText(stringBuilder, Data.SystemText.Get("BattleLog_0011"));
}
if (flag2)
{
AppendBuffText(stringBuilder, Data.SystemText.Get("BattleLog_0012"));
}
if (flag3)
{
AppendBuffText(stringBuilder, Data.SystemText.Get("BattleLog_0009"));
}
if (flag4)
{
AppendBuffText(stringBuilder, Data.SystemText.Get("BattleLog_0006"));
}
if (allBuffSkills.Any((SkillBase s) => s is Skill_attack_count && (!cardBase.IsInHand || s.OnWhenPlayStart == 0)))
{
AppendBuffText(stringBuilder, Data.SystemText.Get("BattleLog_0018", cardBase.MaxAttackableCount.ToString()));
}
if (allBuffSkills.Any((SkillBase s) => s is Skill_ignore_guard && (!cardBase.IsInHand || s.OnWhenPlayStart == 0)))
{
AppendBuffText(stringBuilder, Data.SystemText.Get("BattleLog_0008"));
}
if (allBuffSkills.Any((SkillBase s) => s is Skill_consume_ep_modifier && (!cardBase.IsInHand || s.OnWhenPlayStart == 0)) || NeedNoConsumeEpText(cardBase))
{
AppendBuffText(stringBuilder, Data.SystemText.Get("BattleLog_0201"));
}
}
IEnumerable<Skill_shield> source2 = from s in allBuffSkills
where s is Skill_shield && (!cardBase.IsInHand || s.OnWhenPlayStart == 0)
select (Skill_shield)s;
if (source2.Any())
{
if (source2.Any((Skill_shield s) => s.IsAllDamageShield))
{
AppendBuffText(stringBuilder, Data.SystemText.Get("BattleLog_0274"));
}
if (source2.Any((Skill_shield s) => s.IsNextDamageShield))
{
AppendBuffText(stringBuilder, Data.SystemText.Get("BattleLog_0275"));
}
if (source2.Any((Skill_shield s) => s.IsSkillDamageShield))
{
AppendBuffText(stringBuilder, Data.SystemText.Get("BattleLog_0276"));
}
if (source2.Any((Skill_shield s) => s.IsSpellDamageShield))
{
AppendBuffText(stringBuilder, Data.SystemText.Get("BattleLog_0277"));
}
}
List<Skill_damage_cut> source3 = (from s in allBuffSkills
where s is Skill_damage_cut && (!cardBase.IsInHand || s.OnWhenPlayStart == 0)
select (Skill_damage_cut)s).ToList();
if (source3.Any())
{
if (source3.Any((Skill_damage_cut s) => s.IsAllDamageCut))
{
int num3 = -source3.Where((Skill_damage_cut s) => s.IsAllDamageCut).Sum((Skill_damage_cut s) => s.CutAmount);
AppendBuffText(stringBuilder, Data.SystemText.Get("BattleLog_0278", num3.ToString()));
}
if (source3.Any((Skill_damage_cut s) => s.IsNextDamageCut))
{
int num4 = -source3.Where((Skill_damage_cut s) => s.IsNextDamageCut).Sum((Skill_damage_cut s) => s.CutAmount);
AppendBuffText(stringBuilder, Data.SystemText.Get("BattleLog_0279", num4.ToString()));
}
if (source3.Any((Skill_damage_cut s) => s.IsSkillDamageCut))
{
int num5 = -source3.Where((Skill_damage_cut s) => s.IsSkillDamageCut).Sum((Skill_damage_cut s) => s.CutAmount);
AppendBuffText(stringBuilder, Data.SystemText.Get("BattleLog_0280", num5.ToString()));
}
if (source3.Any((Skill_damage_cut s) => s.IsDamageClipping))
{
List<int> list = (from s in source3
where s.ClippingMax != int.MaxValue
select s.ClippingMax).ToList();
if (source3.Any((Skill_damage_cut s) => !IsNotShowDamageCutLifeLowerLimitBuffDetail(s)))
{
list.AddRange(from s in source3
where s.LifeLowerLimit != -1
select (!(s.SkillPrm.ownerCard is UnitBattleCard)) ? (s.SkillPrm.ownerCard.SelfBattlePlayer.Class.Life - 1) : (s.SkillPrm.ownerCard.Life - 1));
}
if (list.Any())
{
int num6 = list.Min();
AppendBuffText(stringBuilder, Data.SystemText.Get("BattleLog_0281", (num6 + 1).ToString(), num6.ToString()));
}
}
}
_buffLabel.text = stringBuilder.ToString();
}
public void SetBuffDetailLabelInReplay(List<NetworkBattleReceiver.ReplayBuffInfoLabel> buffInfoTextTypeList, BattleCardBase card)
{
StringBuilder stringBuilder = new StringBuilder();
if (!card.IsClass)
{
if (buffInfoTextTypeList.Any((NetworkBattleReceiver.ReplayBuffInfoLabel b) => b.Type == NetworkBattleReceiver.ReplayBuffInfoTextType.Cost))
{
int num = card.Cost - card.BaseCost;
string text = ((num > 0) ? ("+" + num) : num.ToString());
AppendBuffText(stringBuilder, Data.SystemText.Get("BattleLog_0273", text));
}
if (buffInfoTextTypeList.Any((NetworkBattleReceiver.ReplayBuffInfoLabel b) => b.Type == NetworkBattleReceiver.ReplayBuffInfoTextType.StatusBuff))
{
string retAttack = string.Empty;
string retLife = string.Empty;
BattleLogUtility.GetBuffValueStringFormatted(card.GetCurrentAtkBuff(), card.GetCurrentLifeBuff(), ref retAttack, ref retLife);
AppendBuffText(stringBuilder, Data.SystemText.Get("BattleLog_0040", retAttack, retLife));
}
if (buffInfoTextTypeList.Any((NetworkBattleReceiver.ReplayBuffInfoLabel b) => b.Type == NetworkBattleReceiver.ReplayBuffInfoTextType.Quick))
{
AppendBuffText(stringBuilder, Data.SystemText.Get("BattleLog_0011"));
}
if (buffInfoTextTypeList.Any((NetworkBattleReceiver.ReplayBuffInfoLabel b) => b.Type == NetworkBattleReceiver.ReplayBuffInfoTextType.Rush))
{
AppendBuffText(stringBuilder, Data.SystemText.Get("BattleLog_0012"));
}
if (buffInfoTextTypeList.Any((NetworkBattleReceiver.ReplayBuffInfoLabel b) => b.Type == NetworkBattleReceiver.ReplayBuffInfoTextType.Killer))
{
AppendBuffText(stringBuilder, Data.SystemText.Get("BattleLog_0009"));
}
if (buffInfoTextTypeList.Any((NetworkBattleReceiver.ReplayBuffInfoLabel b) => b.Type == NetworkBattleReceiver.ReplayBuffInfoTextType.Drain))
{
AppendBuffText(stringBuilder, Data.SystemText.Get("BattleLog_0006"));
}
if (buffInfoTextTypeList.Any((NetworkBattleReceiver.ReplayBuffInfoLabel b) => b.Type == NetworkBattleReceiver.ReplayBuffInfoTextType.AttackCount))
{
int value = buffInfoTextTypeList.FirstOrDefault((NetworkBattleReceiver.ReplayBuffInfoLabel b) => b.Type == NetworkBattleReceiver.ReplayBuffInfoTextType.AttackCount).Value;
AppendBuffText(stringBuilder, Data.SystemText.Get("BattleLog_0018", value.ToString()));
}
if (buffInfoTextTypeList.Any((NetworkBattleReceiver.ReplayBuffInfoLabel b) => b.Type == NetworkBattleReceiver.ReplayBuffInfoTextType.IgnoreGuard))
{
AppendBuffText(stringBuilder, Data.SystemText.Get("BattleLog_0008"));
}
if (buffInfoTextTypeList.Any((NetworkBattleReceiver.ReplayBuffInfoLabel b) => b.Type == NetworkBattleReceiver.ReplayBuffInfoTextType.ConsumeEpModifier))
{
AppendBuffText(stringBuilder, Data.SystemText.Get("BattleLog_0201"));
}
}
if (buffInfoTextTypeList.Any((NetworkBattleReceiver.ReplayBuffInfoLabel b) => b.Type == NetworkBattleReceiver.ReplayBuffInfoTextType.AllDamageShield))
{
AppendBuffText(stringBuilder, Data.SystemText.Get("BattleLog_0274"));
}
if (buffInfoTextTypeList.Any((NetworkBattleReceiver.ReplayBuffInfoLabel b) => b.Type == NetworkBattleReceiver.ReplayBuffInfoTextType.NextDamageShield))
{
AppendBuffText(stringBuilder, Data.SystemText.Get("BattleLog_0275"));
}
if (buffInfoTextTypeList.Any((NetworkBattleReceiver.ReplayBuffInfoLabel b) => b.Type == NetworkBattleReceiver.ReplayBuffInfoTextType.SkillDamageShield))
{
AppendBuffText(stringBuilder, Data.SystemText.Get("BattleLog_0276"));
}
if (buffInfoTextTypeList.Any((NetworkBattleReceiver.ReplayBuffInfoLabel b) => b.Type == NetworkBattleReceiver.ReplayBuffInfoTextType.SpellDamageShield))
{
AppendBuffText(stringBuilder, Data.SystemText.Get("BattleLog_0277"));
}
if (buffInfoTextTypeList.Any((NetworkBattleReceiver.ReplayBuffInfoLabel b) => b.Type == NetworkBattleReceiver.ReplayBuffInfoTextType.AllDamageCut))
{
int num2 = -buffInfoTextTypeList.FirstOrDefault((NetworkBattleReceiver.ReplayBuffInfoLabel b) => b.Type == NetworkBattleReceiver.ReplayBuffInfoTextType.AllDamageCut).Value;
AppendBuffText(stringBuilder, Data.SystemText.Get("BattleLog_0278", num2.ToString()));
}
if (buffInfoTextTypeList.Any((NetworkBattleReceiver.ReplayBuffInfoLabel b) => b.Type == NetworkBattleReceiver.ReplayBuffInfoTextType.NextDamageCut))
{
int num3 = -buffInfoTextTypeList.FirstOrDefault((NetworkBattleReceiver.ReplayBuffInfoLabel b) => b.Type == NetworkBattleReceiver.ReplayBuffInfoTextType.NextDamageCut).Value;
AppendBuffText(stringBuilder, Data.SystemText.Get("BattleLog_0279", num3.ToString()));
}
if (buffInfoTextTypeList.Any((NetworkBattleReceiver.ReplayBuffInfoLabel b) => b.Type == NetworkBattleReceiver.ReplayBuffInfoTextType.SkillDamageCut))
{
int num4 = -buffInfoTextTypeList.FirstOrDefault((NetworkBattleReceiver.ReplayBuffInfoLabel b) => b.Type == NetworkBattleReceiver.ReplayBuffInfoTextType.SkillDamageCut).Value;
AppendBuffText(stringBuilder, Data.SystemText.Get("BattleLog_0280", num4.ToString()));
}
if (buffInfoTextTypeList.Any((NetworkBattleReceiver.ReplayBuffInfoLabel b) => b.Type == NetworkBattleReceiver.ReplayBuffInfoTextType.DamageClipping))
{
int value2 = buffInfoTextTypeList.FirstOrDefault((NetworkBattleReceiver.ReplayBuffInfoLabel b) => b.Type == NetworkBattleReceiver.ReplayBuffInfoTextType.DamageClipping).Value;
AppendBuffText(stringBuilder, Data.SystemText.Get("BattleLog_0281", (value2 + 1).ToString(), value2.ToString()));
}
_buffLabel.text = stringBuilder.ToString();
}
public static List<SkillBase> GetAllBuffSkills(BattleCardBase cardBase, List<SkillBase> buffSkills)
{
List<SkillBase> list = new List<SkillBase>();
foreach (SkillBase buffSkill in buffSkills)
{
if (buffSkill is Skill_attach_skill)
{
IEnumerable<SkillBase> source = from b in buffSkill.GetBuffInfoContainer()
where cardBase == b._targetCard
select b._attachSkill;
list.AddRange(GetAllBuffSkills(cardBase, source.Where((SkillBase s) => !cardBase.IsClass || !ExistClassSkillNeedBuffDetailText(s)).ToList()));
}
else
{
list.Add(buffSkill);
}
}
return list;
}
public void AppendBuffText(StringBuilder buffTextsStringBuilder, string buffText)
{
if (buffTextsStringBuilder.Length > 0)
{
buffTextsStringBuilder.Append("\r\n");
}
buffTextsStringBuilder.Append(buffText);
}
public static bool NeedBuffDetailText(BattleCardBase cardBase)
{
if (cardBase is ClassBattleCardBase)
{
return cardBase.BuffInfoList.Any((BuffInfo s) => ExistClassSkillNeedBuffDetailText(s.SkillFrom));
}
if (!cardBase.BuffInfoList.Exists((BuffInfo b) => ExistSkillNeedBuffDetailText(cardBase, b.SkillFrom)))
{
return NeedNoConsumeEpText(cardBase);
}
return true;
}
public static bool IsNotShowDamageCutLifeLowerLimitBuffDetail(SkillBase skill)
{
bool num = skill is Skill_damage_cut { IsDamageClipping: not false } skill_damage_cut && skill_damage_cut.LifeLowerLimit != -1;
DataMgr.SpecialBattleSetting specialBattleSettingInfo = GameMgr.GetIns().GetDataMgr().SpecialBattleSettingInfo;
if (num && specialBattleSettingInfo != null && specialBattleSettingInfo.Id == "42")
{
return skill.SkillPrm.ownerCard is EnemyClassBattleCard;
}
return false;
}
private static bool ExistSkillNeedBuffDetailText(BattleCardBase cardBase, SkillBase skill)
{
if (cardBase.IsInHand && skill.Option.Contains("(timing:when_play)"))
{
return false;
}
if (!(skill is Skill_quick) && !(skill is Skill_ignore_guard) && !(skill is Skill_attack_count) && !(skill is Skill_shield) && !(skill is Skill_damage_cut) && !(skill is Skill_rush) && !ExistSkillCostChangeNeedDetailText(cardBase, skill) && !(skill is Skill_consume_ep_modifier) && !(skill is Skill_killer) && !(skill is Skill_drain) && !ExistSKillPowerChangeNeedDetailText(cardBase, skill) && !ExistAttachSkillNeedDetailText(cardBase, skill))
{
return ExistCopiedSkillNeedDetailText(cardBase);
}
return true;
}
private static bool ExistClassSkillNeedBuffDetailText(SkillBase skill)
{
if (!(skill is Skill_shield))
{
if (skill is Skill_damage_cut)
{
return !IsNotShowDamageCutLifeLowerLimitBuffDetail(skill);
}
return false;
}
return true;
}
public static bool NeedNoConsumeEpText(BattleCardBase cardBase)
{
if (cardBase.BuffInfoList.Any((BuffInfo b) => b.SkillFrom is Skill_consume_ep_modifier))
{
return true;
}
if (DetailPanelControl.IsNeedNoConsumeEp(cardBase))
{
return true;
}
return false;
}
private static bool ExistSKillPowerChangeNeedDetailText(BattleCardBase cardBase, SkillBase skill)
{
if (skill is Skill_powerup || skill is Skill_power_down)
{
int currentAtkBuff = cardBase.GetCurrentAtkBuff();
int currentLifeBuff = cardBase.GetCurrentLifeBuff();
if (currentAtkBuff == 0)
{
return currentLifeBuff != 0;
}
return true;
}
return false;
}
private static bool ExistAttachSkillNeedDetailText(BattleCardBase cardBase, SkillBase skill)
{
if (skill is Skill_attach_skill)
{
return skill.GetBuffInfoContainer().Any((SkillBase.BuffInfoContainer b) => cardBase == b._targetCard && ExistSkillNeedBuffDetailText(cardBase, b._attachSkill));
}
return false;
}
public static bool ExistCopiedSkillNeedDetailText(BattleCardBase cardBase)
{
return cardBase.BuffInfoList.Any(delegate(BuffInfo b)
{
if (!b.IsCopied)
{
return false;
}
return b.SkillFrom is SkillBaseCopy skillBaseCopy && skillBaseCopy.IsNeedDetail;
});
}
private static bool ExistSkillCostChangeNeedDetailText(BattleCardBase cardBase, SkillBase skill)
{
if (skill is Skill_cost_change)
{
return cardBase.Cost != cardBase.BaseCost;
}
return false;
}
}