补全防御塔组装与介绍描述功能

- RepoForm.CombineArea:防御塔组装,直接继承所有组件的属性
- ItemDescUtility:根据属性构建不同的 ItemDescForm 的文本
This commit is contained in:
SepComet
2026-03-04 18:17:10 +08:00
parent e12d2e73b2
commit 1e5803f4c5
29 changed files with 832 additions and 168 deletions
@@ -19,6 +19,7 @@ namespace GeometryTD.UI
{
public string Title;
public string TypeText;
public string Description;
public TagType[] Tags;
}
@@ -34,6 +35,7 @@ namespace GeometryTD.UI
GameEntry.Event.Subscribe(RepoItemDetailRequestedEventArgs.EventId, OnRepoItemDetailRequested);
GameEntry.Event.Subscribe(RepoItemDragEndedEventArgs.EventId, OnRepoItemDragEnded);
GameEntry.Event.Subscribe(CombineSlotClickedEventArgs.EventId, OnCombineSlotClicked);
GameEntry.Event.Subscribe(RepoCombineRequestedEventArgs.EventId, OnRepoCombineRequested);
GameEntry.Event.Subscribe(RepoFormReturnEventArgs.EventId, OnRepoFormReturn);
}
@@ -42,6 +44,7 @@ namespace GeometryTD.UI
GameEntry.Event.Unsubscribe(RepoItemDetailRequestedEventArgs.EventId, OnRepoItemDetailRequested);
GameEntry.Event.Unsubscribe(RepoItemDragEndedEventArgs.EventId, OnRepoItemDragEnded);
GameEntry.Event.Unsubscribe(CombineSlotClickedEventArgs.EventId, OnCombineSlotClicked);
GameEntry.Event.Unsubscribe(RepoCombineRequestedEventArgs.EventId, OnRepoCombineRequested);
GameEntry.Event.Unsubscribe(RepoFormReturnEventArgs.EventId, OnRepoFormReturn);
}
@@ -103,7 +106,7 @@ namespace GeometryTD.UI
if (rawData.Inventory.Towers != null)
{
foreach (DefenseTowerItemData tower in rawData.Inventory.Towers)
foreach (TowerItemData tower in rawData.Inventory.Towers)
{
if (tower == null)
{
@@ -117,7 +120,11 @@ namespace GeometryTD.UI
ComponentSlotType = TowerCompSlotType.None,
IconAreaContext = BuildIconAreaContext(tower)
});
AddItemDescSeed(tower.InstanceId, tower.Name, "Tower",
AddItemDescSeed(
tower.InstanceId,
tower.Name,
"Tower",
ItemDescUtility.BuildTowerDesc(tower.Stats) ?? string.Empty,
tower.Stats != null ? tower.Stats.Tags : null);
}
}
@@ -126,7 +133,7 @@ namespace GeometryTD.UI
{
foreach (MuzzleCompItemData item in rawData.Inventory.MuzzleComponents)
{
if (item == null)
if (item == null || item.IsAssembledIntoTower)
{
continue;
}
@@ -138,7 +145,12 @@ namespace GeometryTD.UI
ComponentSlotType = TowerCompSlotType.Muzzle,
IconAreaContext = BuildIconAreaContext(item)
});
AddItemDescSeed(item.InstanceId, item.Name, BuildComponentTypeText(item.SlotType), item.Tags);
AddItemDescSeed(
item.InstanceId,
item.Name,
BuildComponentTypeText(item.SlotType),
ItemDescUtility.BuildMuzzleDesc(item) ?? string.Empty,
item.Tags);
}
}
@@ -146,7 +158,7 @@ namespace GeometryTD.UI
{
foreach (BearingCompItemData item in rawData.Inventory.BearingComponents)
{
if (item == null)
if (item == null || item.IsAssembledIntoTower)
{
continue;
}
@@ -158,7 +170,12 @@ namespace GeometryTD.UI
ComponentSlotType = TowerCompSlotType.Bearing,
IconAreaContext = BuildIconAreaContext(item)
});
AddItemDescSeed(item.InstanceId, item.Name, BuildComponentTypeText(item.SlotType), item.Tags);
AddItemDescSeed(
item.InstanceId,
item.Name,
BuildComponentTypeText(item.SlotType),
ItemDescUtility.BuildBearingDesc(item) ?? string.Empty,
item.Tags);
}
}
@@ -166,7 +183,7 @@ namespace GeometryTD.UI
{
foreach (BaseCompItemData item in rawData.Inventory.BaseComponents)
{
if (item == null)
if (item == null || item.IsAssembledIntoTower)
{
continue;
}
@@ -178,7 +195,12 @@ namespace GeometryTD.UI
ComponentSlotType = TowerCompSlotType.Base,
IconAreaContext = BuildIconAreaContext(item)
});
AddItemDescSeed(item.InstanceId, item.Name, BuildComponentTypeText(item.SlotType), item.Tags);
AddItemDescSeed(
item.InstanceId,
item.Name,
BuildComponentTypeText(item.SlotType),
ItemDescUtility.BuildBaseDesc(item) ?? string.Empty,
item.Tags);
}
}
@@ -203,7 +225,7 @@ namespace GeometryTD.UI
_itemContextMap[itemContext.InstanceId] = itemContext;
}
private void AddItemDescSeed(long itemId, string title, string typeText, TagType[] tags)
private void AddItemDescSeed(long itemId, string title, string typeText, string description, TagType[] tags)
{
if (itemId <= 0)
{
@@ -214,6 +236,7 @@ namespace GeometryTD.UI
{
Title = string.IsNullOrWhiteSpace(title) ? $"Item {itemId}" : title,
TypeText = typeText ?? string.Empty,
Description = description ?? string.Empty,
Tags = CloneTags(tags)
};
}
@@ -235,7 +258,7 @@ namespace GeometryTD.UI
};
}
private static IconAreaContext BuildIconAreaContext(DefenseTowerItemData tower)
private static IconAreaContext BuildIconAreaContext(TowerItemData tower)
{
if (tower == null)
{
@@ -302,7 +325,7 @@ namespace GeometryTD.UI
{
Title = seed.Title,
TypeText = seed.TypeText,
Description = string.Empty,
Description = seed.Description ?? string.Empty,
Price = 0,
TargetPos = args.TargetPos,
Tags = CloneTags(seed.Tags)
@@ -367,6 +390,36 @@ namespace GeometryTD.UI
this.CloseUI();
}
private void OnRepoCombineRequested(object sender, GameEventArgs e)
{
if (!IsEventFromCurrentForm(sender))
{
return;
}
if (!(e is RepoCombineRequestedEventArgs args))
{
return;
}
if (_useCase == null || Form == null)
{
return;
}
if (!_useCase.TryAssembleTower(args.MuzzleItemId, args.BearingItemId, args.BaseItemId))
{
return;
}
RepoFormRawData latestRawData = _useCase.CreateInitialModel();
RepoFormContext latestContext = BuildContext(latestRawData);
if (latestContext != null)
{
Form.RefreshUI(latestContext);
}
}
private bool IsEventFromCurrentForm(object sender)
{
if (Form == null)