- 统一 ItemDescForm/RewardItem/GoodsItem 的描述格式
- 减少组件属性的 Clone 数量,目前只在合并仓库、组装防御塔时才进行复制
- 删除先前留下的冗余 fallback 代码
This commit is contained in:
SepComet
2026-03-12 15:58:14 +08:00
parent 9e59865368
commit 4962b98714
20 changed files with 263 additions and 435 deletions
@@ -1,15 +1,12 @@
using System;
using GeometryTD.CustomEvent;
using GeometryTD.DataTable;
using GeometryTD.Definition;
using GameFramework.Event;
using GeometryTD.CustomUtility;
using UnityEngine;
using UnityGameFramework.Runtime;
namespace GeometryTD.UI
{
public class RewardSelectFormController : UIFormControllerCommonBase<RewardSelectFormContext, RewardSelectForm>
public partial class RewardSelectFormController : UIFormControllerCommonBase<RewardSelectFormContext, RewardSelectForm>
{
private RewardSelectFormUseCase _useCase;
@@ -79,124 +76,6 @@ namespace GeometryTD.UI
_useCase = rewardSelectUseCase;
}
private static RewardSelectFormContext BuildContext(RewardSelectFormRawData rawData)
{
if (rawData == null)
{
return null;
}
return new RewardSelectFormContext
{
TipText = string.IsNullOrWhiteSpace(rawData.TipText) ? "Select one reward" : rawData.TipText,
RefreshButtonText = BuildRefreshButtonText(rawData.RefreshCost, rawData.CanRefresh),
CanRefresh = rawData.CanRefresh,
CanGiveUp = rawData.CanGiveUp,
RewardItems = BuildRewardItemContexts(rawData.RewardItems)
};
}
private static string BuildRefreshButtonText(int refreshCost, bool canRefresh)
{
if (!canRefresh)
{
return "Refreshed";
}
if (refreshCost <= 0)
{
return "Refresh";
}
return $"Refresh -{refreshCost}";
}
private static RewardItemContext[] BuildRewardItemContexts(RewardSelectItemRawData[] rawItems)
{
if (rawItems == null || rawItems.Length <= 0)
{
return System.Array.Empty<RewardItemContext>();
}
RewardItemContext[] contexts = new RewardItemContext[rawItems.Length];
for (int i = 0; i < rawItems.Length; i++)
{
RewardSelectItemRawData rawItem = rawItems[i];
if (rawItem == null)
{
continue;
}
contexts[i] = new RewardItemContext
{
Index = i,
RewardId = rawItem.RewardId,
IconArea = new IconAreaContext
{
ComponentSlotType = rawItem.SlotType,
Icon = rawItem.Icon,
Rarity = rawItem.Rarity,
Color = ResolveIconColor(rawItem)
},
Title = rawItem.Title ?? string.Empty,
TypeText = ResolveTypeText(rawItem),
Description = rawItem.Description ?? string.Empty,
Tags = BuildTagContexts(rawItem.Tags),
IsSelectable = rawItem.IsSelectable,
UserData = rawItem.UserData
};
}
return contexts;
}
private static Color ResolveIconColor(RewardSelectItemRawData rawItem)
{
if (rawItem?.SourceItem == null)
{
return Color.white;
}
return IconColorGenerator.GenerateForComponent(rawItem.SourceItem);
}
private static string ResolveTypeText(RewardSelectItemRawData rawItem)
{
if (!string.IsNullOrWhiteSpace(rawItem.TypeText))
{
return rawItem.TypeText;
}
return rawItem.SlotType switch
{
TowerCompSlotType.Muzzle => "Muzzle Component",
TowerCompSlotType.Bearing => "Bearing Component",
TowerCompSlotType.Base => "Base Component",
TowerCompSlotType.Accessory => "Accessory",
_ => "Component"
};
}
private static TagItemContext[] BuildTagContexts(TagType[] tags)
{
string[] tagTexts = TagDisplayUtility.BuildTagTexts(tags);
if (tagTexts == null || tagTexts.Length <= 0)
{
return System.Array.Empty<TagItemContext>();
}
TagItemContext[] contexts = new TagItemContext[tagTexts.Length];
for (int i = 0; i < tagTexts.Length; i++)
{
contexts[i] = new TagItemContext
{
TagName = tagTexts[i]
};
}
return contexts;
}
private void OnRewardSelected(object sender, GameEventArgs e)
{
if (!IsEventFromCurrentForm(sender) || !(e is RewardSelectItemSelectedEventArgs args))
@@ -280,4 +159,4 @@ namespace GeometryTD.UI
return false;
}
}
}
}