S4-07 process 3
- 组件 Tag 数量预算不再写死在 ResolveTagBudget(...) 里,而是走 RarityTagBudget.txt -> DRRarityTagBudget -> RarityTagBudgetRuleRegistry -> InventoryTagRuleService 这条表驱动链。 - TagBudget.txt:1 新增了按品质的 MinCount/MaxCount,预算缓存和加载入口分别在 RarityTagBudgetRuleRegistry.cs:7 和 ProcedurePreload.cs:18。 - 生成逻辑已经接到新规则,InventoryTagRuleService.cs:10 现在会先按 Tag.txt 过滤/加权,再按 RarityTagBudget 决定抽几个 Tag。
This commit is contained in:
@@ -20,6 +20,16 @@ namespace GeometryTD.Tests.EditMode
|
||||
{ TagType.Execution, new TagGenerationRuleData { TagType = TagType.Execution, MinRarity = RarityType.Purple, Weight = 5 } },
|
||||
};
|
||||
|
||||
private static readonly IReadOnlyDictionary<RarityType, RarityTagBudgetRuleData> RarityTagBudgetRulesByRarity =
|
||||
new Dictionary<RarityType, RarityTagBudgetRuleData>
|
||||
{
|
||||
{ RarityType.White, new RarityTagBudgetRuleData { Rarity = RarityType.White, MinCount = 0, MaxCount = 1 } },
|
||||
{ RarityType.Green, new RarityTagBudgetRuleData { Rarity = RarityType.Green, MinCount = 1, MaxCount = 1 } },
|
||||
{ RarityType.Blue, new RarityTagBudgetRuleData { Rarity = RarityType.Blue, MinCount = 1, MaxCount = 2 } },
|
||||
{ RarityType.Purple, new RarityTagBudgetRuleData { Rarity = RarityType.Purple, MinCount = 2, MaxCount = 2 } },
|
||||
{ RarityType.Red, new RarityTagBudgetRuleData { Rarity = RarityType.Red, MinCount = 2, MaxCount = 3 } },
|
||||
};
|
||||
|
||||
[Test]
|
||||
public void GetEligibleTags_Filters_Invalid_Unsupported_And_HighRarity_Tags()
|
||||
{
|
||||
@@ -70,7 +80,8 @@ namespace GeometryTD.Tests.EditMode
|
||||
InventoryTagSourceType.Drop,
|
||||
9001,
|
||||
4,
|
||||
RulesByTag);
|
||||
RulesByTag,
|
||||
RarityTagBudgetRulesByRarity);
|
||||
|
||||
Assert.That(result.Length, Is.EqualTo(2));
|
||||
Assert.That(new HashSet<TagType>(result).Count, Is.EqualTo(result.Length));
|
||||
@@ -85,7 +96,8 @@ namespace GeometryTD.Tests.EditMode
|
||||
InventoryTagSourceType.Seed,
|
||||
42,
|
||||
1,
|
||||
RulesByTag);
|
||||
RulesByTag,
|
||||
RarityTagBudgetRulesByRarity);
|
||||
|
||||
Assert.That(result, Is.EqualTo(new[] { TagType.Fire }));
|
||||
}
|
||||
@@ -107,7 +119,8 @@ namespace GeometryTD.Tests.EditMode
|
||||
InventoryTagSourceType.Shop,
|
||||
1,
|
||||
1,
|
||||
weightedRules);
|
||||
weightedRules,
|
||||
RarityTagBudgetRulesByRarity);
|
||||
|
||||
Assert.That(result, Has.Length.EqualTo(1));
|
||||
Assert.That(result[0], Is.EqualTo(TagType.Fire));
|
||||
@@ -134,7 +147,8 @@ namespace GeometryTD.Tests.EditMode
|
||||
InventoryTagSourceType.Shop,
|
||||
1000 + i,
|
||||
1,
|
||||
weightedRules);
|
||||
weightedRules,
|
||||
RarityTagBudgetRulesByRarity);
|
||||
|
||||
Assert.That(result, Has.Length.EqualTo(1));
|
||||
if (result[0] == TagType.Fire)
|
||||
@@ -161,6 +175,69 @@ namespace GeometryTD.Tests.EditMode
|
||||
TagGenerationRuleRegistry.ResetToDefaults();
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void ResolveRarityTagBudget_Uses_TableDriven_Range_Rules()
|
||||
{
|
||||
int whiteBudget = InventoryTagRuleService.ResolveRarityTagBudget(
|
||||
RarityType.White,
|
||||
new System.Random(0),
|
||||
RarityTagBudgetRulesByRarity);
|
||||
int greenBudget = InventoryTagRuleService.ResolveRarityTagBudget(
|
||||
RarityType.Green,
|
||||
new System.Random(0),
|
||||
RarityTagBudgetRulesByRarity);
|
||||
int redBudget = InventoryTagRuleService.ResolveRarityTagBudget(
|
||||
RarityType.Red,
|
||||
new System.Random(0),
|
||||
RarityTagBudgetRulesByRarity);
|
||||
|
||||
Assert.That(whiteBudget, Is.InRange(0, 1));
|
||||
Assert.That(greenBudget, Is.EqualTo(1));
|
||||
Assert.That(redBudget, Is.InRange(2, 3));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void ResolveComponentTags_Uses_Custom_Purple_Budget_From_Rules()
|
||||
{
|
||||
IReadOnlyDictionary<RarityType, RarityTagBudgetRuleData> customBudgetRules =
|
||||
new Dictionary<RarityType, RarityTagBudgetRuleData>(RarityTagBudgetRulesByRarity)
|
||||
{
|
||||
[RarityType.Purple] = new RarityTagBudgetRuleData
|
||||
{
|
||||
Rarity = RarityType.Purple,
|
||||
MinCount = 3,
|
||||
MaxCount = 3
|
||||
}
|
||||
};
|
||||
|
||||
TagType[] result = InventoryTagRuleService.ResolveComponentTags(
|
||||
new[] { TagType.Fire, TagType.Ice, TagType.Crit, TagType.Shatter, TagType.Inferno, TagType.Execution },
|
||||
RarityType.Purple,
|
||||
InventoryTagSourceType.Drop,
|
||||
99,
|
||||
7,
|
||||
RulesByTag,
|
||||
customBudgetRules);
|
||||
|
||||
Assert.That(result, Has.Length.EqualTo(3));
|
||||
Assert.That(new HashSet<TagType>(result).Count, Is.EqualTo(3));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void RarityTagBudgetRuleRegistry_LoadFromRows_Overrides_Purple_Budget()
|
||||
{
|
||||
DRRarityTagBudget purpleRow = new DRRarityTagBudget();
|
||||
Assert.That(purpleRow.ParseDataRow("\t4\t\tPurple\t3\t3", null), Is.True);
|
||||
|
||||
RarityTagBudgetRuleRegistry.LoadFromRows(new[] { purpleRow });
|
||||
|
||||
Assert.That(RarityTagBudgetRuleRegistry.TryGetRule(RarityType.Purple, out RarityTagBudgetRuleData rule), Is.True);
|
||||
Assert.That(rule.MinCount, Is.EqualTo(3));
|
||||
Assert.That(rule.MaxCount, Is.EqualTo(3));
|
||||
|
||||
RarityTagBudgetRuleRegistry.ResetToDefaults();
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void CreateSampleInventory_Generates_SeedTags_Within_Launch_Set_And_Matches_Tower_Stats()
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user