S7-01 + S7-02

This commit is contained in:
2026-03-12 10:46:11 +08:00
parent d34af661b9
commit 185ea43323
20 changed files with 468 additions and 112 deletions
@@ -178,6 +178,7 @@ namespace GeometryTD.CustomComponent
public void StartCombat(
int levelId = 0,
string runId = null,
int runSeed = 0,
int nodeId = 0,
RunNodeType nodeType = RunNodeType.None,
int sequenceIndex = -1)
@@ -232,6 +233,7 @@ namespace GeometryTD.CustomComponent
phaseList,
_selectedSpawnEntriesByPhaseId,
runId,
runSeed,
nodeId,
nodeType,
sequenceIndex))
@@ -70,6 +70,7 @@ namespace GeometryTD.CustomComponent
IReadOnlyList<DRLevelPhase> phases,
IReadOnlyDictionary<int, IReadOnlyList<DRLevelSpawnEntry>> spawnEntriesByPhaseId,
string runId = null,
int runSeed = 0,
int nodeId = 0,
RunNodeType nodeType = RunNodeType.None,
int sequenceIndex = -1)
@@ -95,9 +96,11 @@ namespace GeometryTD.CustomComponent
_runtime.CurrentLevel = level;
_runtime.RunId = runId;
_runtime.RunSeed = runSeed;
_runtime.NodeId = nodeId;
_runtime.NodeType = nodeType;
_runtime.SequenceIndex = sequenceIndex;
_runtime.EnemyDropResolver.ConfigureRunContext(runSeed, sequenceIndex);
_runtime.CombatRunResourceStore.InitializeForCombat(level);
for (int i = 0; i < phases.Count; i++)
{
@@ -57,6 +57,7 @@ namespace GeometryTD.CustomComponent
_runtime.IsCompleted = false;
_runtime.NodeEnterFired = false;
_runtime.RunId = null;
_runtime.RunSeed = 0;
_runtime.NodeId = 0;
_runtime.NodeType = RunNodeType.None;
_runtime.SequenceIndex = -1;
@@ -31,6 +31,7 @@ namespace GeometryTD.CustomComponent
public bool NodeEnterFired { get; set; }
public CombatSettlementContext SettlementContext { get; set; }
public string RunId { get; set; }
public int RunSeed { get; set; }
public int NodeId { get; set; }
public RunNodeType NodeType { get; set; }
public int SequenceIndex { get; set; }
@@ -22,12 +22,28 @@ namespace GeometryTD.CustomComponent
private IDataTable<DRBearingComp> _drBearingComp;
private IDataTable<DRBaseComp> _drBaseComp;
private long _nextDropItemInstanceId = 1;
private int _runSeed;
private int _nodeSequenceIndex = -1;
private int _nextDropTagOrdinal;
private int _nextRewardTagOrdinal;
public void Reset()
{
_eligibleDropPoolBuffer.Clear();
_rarityRollWeightBuffer.Clear();
_nextDropItemInstanceId = 1;
_runSeed = 0;
_nodeSequenceIndex = -1;
_nextDropTagOrdinal = 0;
_nextRewardTagOrdinal = 0;
}
public void ConfigureRunContext(int runSeed, int nodeSequenceIndex)
{
_runSeed = runSeed;
_nodeSequenceIndex = nodeSequenceIndex;
_nextDropTagOrdinal = 0;
_nextRewardTagOrdinal = 0;
}
public EnemyDropResult Resolve(in EnemyDropContext context)
@@ -90,7 +106,7 @@ namespace GeometryTD.CustomComponent
continue;
}
if (!TryBuildDropItem(selectedRow, out TowerCompItemData droppedItem) || droppedItem == null)
if (!TryBuildDropItem(selectedRow, InventoryTagSourceType.Reward, AllocateRewardTagOrdinal(), out TowerCompItemData droppedItem) || droppedItem == null)
{
continue;
}
@@ -129,7 +145,7 @@ namespace GeometryTD.CustomComponent
return false;
}
return TryBuildDropItem(selectedRow, out droppedItem);
return TryBuildDropItem(selectedRow, InventoryTagSourceType.Drop, AllocateDropTagOrdinal(), out droppedItem);
}
private bool TryPickDropPoolRow(int displayPhaseIndex, LevelThemeType themeType, out DROutGameDropPool selectedRow)
@@ -303,7 +319,11 @@ namespace GeometryTD.CustomComponent
return _drOutGameDropPool;
}
private bool TryBuildDropItem(DROutGameDropPool row, out TowerCompItemData droppedItem)
private bool TryBuildDropItem(
DROutGameDropPool row,
InventoryTagSourceType sourceType,
int localOrdinal,
out TowerCompItemData droppedItem)
{
droppedItem = null;
if (row == null || row.ItemId <= 0 || string.IsNullOrWhiteSpace(row.ItemType))
@@ -314,23 +334,27 @@ namespace GeometryTD.CustomComponent
string itemType = row.ItemType.Trim();
if (itemType.Equals("MuzzleComp", StringComparison.OrdinalIgnoreCase))
{
return TryBuildMuzzleCompItem(row, out droppedItem);
return TryBuildMuzzleCompItem(row, sourceType, localOrdinal, out droppedItem);
}
if (itemType.Equals("BearingComp", StringComparison.OrdinalIgnoreCase))
{
return TryBuildBearingCompItem(row, out droppedItem);
return TryBuildBearingCompItem(row, sourceType, localOrdinal, out droppedItem);
}
if (itemType.Equals("BaseComp", StringComparison.OrdinalIgnoreCase))
{
return TryBuildBaseCompItem(row, out droppedItem);
return TryBuildBaseCompItem(row, sourceType, localOrdinal, out droppedItem);
}
return false;
}
private bool TryBuildMuzzleCompItem(DROutGameDropPool row, out TowerCompItemData droppedItem)
private bool TryBuildMuzzleCompItem(
DROutGameDropPool row,
InventoryTagSourceType sourceType,
int localOrdinal,
out TowerCompItemData droppedItem)
{
droppedItem = null;
_drMuzzleComp ??= GameEntry.DataTable.GetDataTable<DRMuzzleComp>();
@@ -358,9 +382,7 @@ namespace GeometryTD.CustomComponent
Tags = ComponentTagGenerationService.ResolveComponentTags(
config.PossibleTag,
rarity,
InventoryTagSourceType.Drop,
instanceId,
config.Id),
CreateRandomContext(sourceType, localOrdinal, config.Id)),
AttackDamage = config.AttackDamage != null ? (int[])config.AttackDamage.Clone() : Array.Empty<int>(),
DamageRandomRate = config.DamageRandomRate,
AttackMethodType = config.AttackMethodType
@@ -368,7 +390,11 @@ namespace GeometryTD.CustomComponent
return true;
}
private bool TryBuildBearingCompItem(DROutGameDropPool row, out TowerCompItemData droppedItem)
private bool TryBuildBearingCompItem(
DROutGameDropPool row,
InventoryTagSourceType sourceType,
int localOrdinal,
out TowerCompItemData droppedItem)
{
droppedItem = null;
_drBearingComp ??= GameEntry.DataTable.GetDataTable<DRBearingComp>();
@@ -396,16 +422,18 @@ namespace GeometryTD.CustomComponent
Tags = ComponentTagGenerationService.ResolveComponentTags(
config.PossibleTag,
rarity,
InventoryTagSourceType.Drop,
instanceId,
config.Id),
CreateRandomContext(sourceType, localOrdinal, config.Id)),
RotateSpeed = config.RotateSpeed != null ? (float[])config.RotateSpeed.Clone() : Array.Empty<float>(),
AttackRange = config.AttackRange != null ? (float[])config.AttackRange.Clone() : Array.Empty<float>()
};
return true;
}
private bool TryBuildBaseCompItem(DROutGameDropPool row, out TowerCompItemData droppedItem)
private bool TryBuildBaseCompItem(
DROutGameDropPool row,
InventoryTagSourceType sourceType,
int localOrdinal,
out TowerCompItemData droppedItem)
{
droppedItem = null;
_drBaseComp ??= GameEntry.DataTable.GetDataTable<DRBaseComp>();
@@ -433,13 +461,33 @@ namespace GeometryTD.CustomComponent
Tags = ComponentTagGenerationService.ResolveComponentTags(
config.PossibleTag,
rarity,
InventoryTagSourceType.Drop,
instanceId,
config.Id),
CreateRandomContext(sourceType, localOrdinal, config.Id)),
AttackSpeed = config.AttackSpeed != null ? (float[])config.AttackSpeed.Clone() : Array.Empty<float>(),
AttackPropertyType = config.AttackPropertyType
};
return true;
}
private InventoryTagRandomContext CreateRandomContext(
InventoryTagSourceType sourceType,
int localOrdinal,
int configId)
{
return sourceType switch
{
InventoryTagSourceType.Reward => InventoryTagRandomContext.CreateReward(_runSeed, _nodeSequenceIndex, localOrdinal, configId),
_ => InventoryTagRandomContext.CreateDrop(_runSeed, _nodeSequenceIndex, localOrdinal, configId)
};
}
private int AllocateDropTagOrdinal()
{
return _nextDropTagOrdinal++;
}
private int AllocateRewardTagOrdinal()
{
return _nextRewardTagOrdinal++;
}
}
}