From 0c92fd9886f86a1f2b3edfed022e057e8eb10599 Mon Sep 17 00:00:00 2001 From: SepComet <202308010230@stu.csust.edu.cn> Date: Fri, 13 Mar 2026 10:08:12 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B0=83=E6=95=B4=20OutGameDropPool=20?= =?UTF-8?q?=E8=A1=A8=E5=AE=9A=E4=B9=89=20+=20=E6=B7=BB=E5=8A=A0=E9=83=A8?= =?UTF-8?q?=E5=88=86=E7=BB=84=E4=BB=B6=E5=AE=9A=E4=B9=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Assets/GameMain/DataTables/BaseComp.txt | 4 + Assets/GameMain/DataTables/BearingComp.txt | 4 + Assets/GameMain/DataTables/Entity.txt | 3 - Assets/GameMain/DataTables/MuzzleComp.txt | 4 + .../GameMain/DataTables/OutGameDropPool.txt | 72 ++++------ .../InventoryGeneration/DropPoolRoller.cs | 102 +++++++++++--- .../InventoryGenerationComponent.cs | 29 +++- .../RewardCandidateBuilder.cs | 27 +++- .../Scripts/DataTable/DROutGameDropPool.cs | 128 ++++++++++++++---- .../Scripts/Utility/ItemDescUtility.cs | 2 +- 数据表/Entity.xlsx | Bin 11040 -> 11125 bytes 数据表/OutGameDropPool.xlsx | Bin 13635 -> 12946 bytes 数据表/TowerComp.xlsx | Bin 15733 -> 16536 bytes 13 files changed, 265 insertions(+), 110 deletions(-) diff --git a/Assets/GameMain/DataTables/BaseComp.txt b/Assets/GameMain/DataTables/BaseComp.txt index b2d8a39..3410112 100644 --- a/Assets/GameMain/DataTables/BaseComp.txt +++ b/Assets/GameMain/DataTables/BaseComp.txt @@ -4,3 +4,7 @@ 1 元素底座 [2,2.1,2.2,2.3,2.5] 0.2 Fire [Fire,BurnSpread,IgniteBurst,Inferno] 2 控制底座 [4,4.2,4.4,4.6,4.8] 0.1 Ice [Ice,FreezeMask,Shatter,AbsoluteZero] 3 穿透底座 [1,1,1,1,1] 0 Physics [Pierce,Crit,Overpenetrate,Execution] + 4 12底座 [1,1,1,1,1] 0.1 Poison [Fire,BurnSpread,IgniteBurst,Inferno,Ice,FreezeMask,Shatter,AbsoluteZero] + 5 23底座 [1,1,1,1,1] 0.1 Water [Ice,FreezeMask,Shatter,AbsoluteZero,Pierce,Crit,Overpenetrate,Execution] + 6 13底座 [1,1,1,1,1] 0.1 Earth [Fire,BurnSpread,IgniteBurst,Inferno,Pierce,Crit,Overpenetrate,Execution] + 7 123底座 [1,1,1,1,1] 0.1 Fire [Fire,BurnSpread,IgniteBurst,Inferno,Ice,FreezeMask,Shatter,AbsoluteZero,Pierce,Crit,Overpenetrate,Execution] diff --git a/Assets/GameMain/DataTables/BearingComp.txt b/Assets/GameMain/DataTables/BearingComp.txt index f7ae8ec..4b19402 100644 --- a/Assets/GameMain/DataTables/BearingComp.txt +++ b/Assets/GameMain/DataTables/BearingComp.txt @@ -4,3 +4,7 @@ 1 元素轴承 [10,12,13,14,15] 15 [2,2,2,2,2] 0.3 [Fire,BurnSpread,IgniteBurst,Inferno] 2 控制轴承 [20,25,30,32,35] 0 [6,6.5,7,8,8] 0.2 [Ice,FreezeMask,Shatter,AbsoluteZero] 3 穿透轴承 [60,70,80,90,100] 20 [4,4.5,5,5.5,6] 0 [Pierce,Crit,Overpenetrate,Execution] + 4 12轴承 [60,70,80,90,100] 20 [4,4.5,5,5.5,6] 0 [Fire,BurnSpread,IgniteBurst,Inferno,Ice,FreezeMask,Shatter,AbsoluteZero] + 5 23轴承 [60,70,80,90,100] 20 [4,4.5,5,5.5,6] 0 [Ice,FreezeMask,Shatter,AbsoluteZero,Pierce,Crit,Overpenetrate,Execution] + 6 13轴承 [60,70,80,90,100] 20 [4,4.5,5,5.5,6] 0 [Fire,BurnSpread,IgniteBurst,Inferno,Pierce,Crit,Overpenetrate,Execution] + 7 123轴承 [60,70,80,90,100] 20 [4,4.5,5,5.5,6] 0 [Fire,BurnSpread,IgniteBurst,Inferno,Ice,FreezeMask,Shatter,AbsoluteZero,Pierce,Crit,Overpenetrate,Execution] diff --git a/Assets/GameMain/DataTables/Entity.txt b/Assets/GameMain/DataTables/Entity.txt index 9a6631a..fe1a33e 100644 --- a/Assets/GameMain/DataTables/Entity.txt +++ b/Assets/GameMain/DataTables/Entity.txt @@ -1,9 +1,6 @@ # Id 策划备注 AssetName # int string # 实体编号 资源名称 - 101 测试枪口 TestMuzzle - 201 测试轴承 TestBearing - 301 测试底座 TestBase 401 防御塔实体 TowerEntity 501 普通子弹 NormalBullet 1001 测试普通敌人 TestEnemy diff --git a/Assets/GameMain/DataTables/MuzzleComp.txt b/Assets/GameMain/DataTables/MuzzleComp.txt index 8085750..a223e11 100644 --- a/Assets/GameMain/DataTables/MuzzleComp.txt +++ b/Assets/GameMain/DataTables/MuzzleComp.txt @@ -4,3 +4,7 @@ 1 元素枪口 [20,30,40,50,80] 10 0.05 NormalBullet [Fire,BurnSpread,IgniteBurst,Inferno] 2 控制枪口 [30,50,70,90,100] 20 0.01 NormalBullet [Ice,FreezeMask,Shatter,AbsoluteZero] 3 穿透枪口 [50,55,60,80,90] 30 0.02 NormalBullet [Pierce,Crit,Overpenetrate,Execution] + 4 12枪口 [50,55,60,80,90] 30 0.02 NormalBullet [Fire,BurnSpread,IgniteBurst,Inferno,Ice,FreezeMask,Shatter,AbsoluteZero] + 5 23枪口 [50,55,60,80,90] 30 0.02 NormalBullet [Ice,FreezeMask,Shatter,AbsoluteZero,Pierce,Crit,Overpenetrate,Execution] + 6 13枪口 [50,55,60,80,90] 30 0.02 NormalBullet [Fire,BurnSpread,IgniteBurst,Inferno,Pierce,Crit,Overpenetrate,Execution] + 7 123枪口 [50,55,60,80,90] 30 0.02 NormalBullet [Fire,BurnSpread,IgniteBurst,Inferno,Ice,FreezeMask,Shatter,AbsoluteZero,Pierce,Crit,Overpenetrate,Execution] diff --git a/Assets/GameMain/DataTables/OutGameDropPool.txt b/Assets/GameMain/DataTables/OutGameDropPool.txt index 1d962e7..1c2d34b 100644 --- a/Assets/GameMain/DataTables/OutGameDropPool.txt +++ b/Assets/GameMain/DataTables/OutGameDropPool.txt @@ -1,48 +1,24 @@ -# Id 列1 LevelThemeType Rarity ItemType ItemId Weight MinPhase MaxPhase -# int LevelThemeType RarityType ItemType int int int int -# 道具池号 策划备注 关卡所属主题类型 道具稀有度 道具类型 道具Id 权重 出现的最低波次 出现的最高波次 - 1 平原战斗池 Plain White MuzzleComp 1 10 1 10 - 2 Plain White MuzzleComp 2 10 1 10 - 3 Plain White MuzzleComp 3 10 1 10 - 4 Plain White BearingComp 1 10 1 10 - 5 Plain White BearingComp 2 10 1 10 - 6 Plain White BearingComp 3 10 1 10 - 7 Plain White BaseComp 1 10 1 10 - 8 Plain White BaseComp 2 10 1 10 - 9 Plain White BaseComp 3 10 1 10 - 10 Plain Green MuzzleComp 1 5 2 10 - 11 Plain Green MuzzleComp 2 5 2 10 - 12 Plain Green MuzzleComp 3 5 2 10 - 13 Plain Green BearingComp 1 5 2 10 - 14 Plain Green BearingComp 2 5 2 10 - 15 Plain Green BearingComp 3 5 2 10 - 16 Plain Green BaseComp 1 5 2 10 - 17 Plain Green BaseComp 2 5 2 10 - 18 Plain Green BaseComp 3 5 2 10 - 19 Plain Blue MuzzleComp 1 3 3 15 - 20 Plain Blue MuzzleComp 2 3 3 15 - 21 Plain Blue MuzzleComp 3 3 3 15 - 22 Plain Blue BearingComp 1 3 3 15 - 23 Plain Blue BearingComp 2 3 3 15 - 24 Plain Blue BearingComp 3 3 3 15 - 25 Plain Blue BaseComp 1 3 3 15 - 26 Plain Blue BaseComp 2 3 3 15 - 27 Plain Blue BaseComp 3 3 3 15 - 28 Plain Purple MuzzleComp 1 2 4 20 - 29 Plain Purple MuzzleComp 2 2 4 20 - 30 Plain Purple MuzzleComp 3 2 4 20 - 31 Plain Purple BearingComp 1 2 4 20 - 32 Plain Purple BearingComp 2 2 4 20 - 33 Plain Purple BearingComp 3 2 4 20 - 34 Plain Purple BaseComp 1 2 4 20 - 35 Plain Purple BaseComp 2 2 4 20 - 36 Plain Purple BaseComp 3 2 4 20 - 37 Plain Red MuzzleComp 1 1 5 50 - 38 Plain Red MuzzleComp 2 1 5 50 - 39 Plain Red MuzzleComp 3 1 5 50 - 40 Plain Red BearingComp 1 1 5 50 - 41 Plain Red BearingComp 2 1 5 50 - 42 Plain Red BearingComp 3 1 5 50 - 43 Plain Red BaseComp 1 1 5 50 - 44 Plain Red BaseComp 2 1 5 50 - 45 Plain Red BaseComp 3 1 5 50 +# Id 列1 LevelThemeType ItemType ItemId Weights MinPhase MaxPhase +# int LevelThemeType ItemType int int[] int[] int[] +# 道具池号 策划备注 关卡所属主题类型 道具类型 道具Id 权重 出现的最低波次 出现的最高波次 + 1 平原战斗池 Plain MuzzleComp 1 [20,10,6,4,2] [1,2,3,4,5] [10,10,15,20,50] + 2 Plain MuzzleComp 2 [20,10,6,4,2] [1,2,3,4,5] [10,10,15,20,50] + 3 Plain MuzzleComp 3 [20,10,6,4,2] [1,2,3,4,5] [10,10,15,20,50] + 4 Plain MuzzleComp 4 [15,8,5,3,1] [1,2,3,4,5] [10,10,15,20,50] + 5 Plain MuzzleComp 5 [15,8,5,3,1] [1,2,3,4,5] [10,10,15,20,50] + 6 Plain MuzzleComp 6 [15,8,5,3,1] [1,2,3,4,5] [10,10,15,20,50] + 7 Plain MuzzleComp 7 [15,8,5,3,1] [1,2,3,4,5] [10,10,15,20,50] + 8 Plain BearingComp 1 [20,10,6,4,2] [1,2,3,4,5] [10,10,15,20,50] + 9 Plain BearingComp 2 [20,10,6,4,2] [1,2,3,4,5] [10,10,15,20,50] + 10 Plain BearingComp 3 [20,10,6,4,2] [1,2,3,4,5] [10,10,15,20,50] + 11 Plain BearingComp 4 [15,8,5,3,1] [1,2,3,4,5] [10,10,15,20,50] + 12 Plain BearingComp 5 [15,8,5,3,1] [1,2,3,4,5] [10,10,15,20,50] + 13 Plain BearingComp 6 [15,8,5,3,1] [1,2,3,4,5] [10,10,15,20,50] + 14 Plain BearingComp 7 [15,8,5,3,1] [1,2,3,4,5] [10,10,15,20,50] + 15 Plain BaseComp 1 [20,10,6,4,2] [1,2,3,4,5] [10,10,15,20,50] + 16 Plain BaseComp 2 [20,10,6,4,2] [1,2,3,4,5] [10,10,15,20,50] + 17 Plain BaseComp 3 [20,10,6,4,2] [1,2,3,4,5] [10,10,15,20,50] + 18 Plain BaseComp 4 [15,8,5,3,1] [1,2,3,4,5] [10,10,15,20,50] + 19 Plain BaseComp 5 [15,8,5,3,1] [1,2,3,4,5] [10,10,15,20,50] + 20 Plain BaseComp 6 [15,8,5,3,1] [1,2,3,4,5] [10,10,15,20,50] + 21 Plain BaseComp 7 [15,8,5,3,1] [1,2,3,4,5] [10,10,15,20,50] diff --git a/Assets/GameMain/Scripts/CustomComponent/InventoryGeneration/DropPoolRoller.cs b/Assets/GameMain/Scripts/CustomComponent/InventoryGeneration/DropPoolRoller.cs index 9964a04..203424c 100644 --- a/Assets/GameMain/Scripts/CustomComponent/InventoryGeneration/DropPoolRoller.cs +++ b/Assets/GameMain/Scripts/CustomComponent/InventoryGeneration/DropPoolRoller.cs @@ -19,9 +19,14 @@ namespace GeometryTD.CustomComponent _dropPoolTable = dropPoolTable; } - public bool TryRollRow(int displayPhaseIndex, LevelThemeType themeType, out DROutGameDropPool selectedRow) + public bool TryRollRow( + int displayPhaseIndex, + LevelThemeType themeType, + out DROutGameDropPool selectedRow, + out RarityType selectedRarity) { selectedRow = null; + selectedRarity = RarityType.None; DROutGameDropPool[] allRows = _dropPoolTable.GetAllDataRows(); if (allRows == null || allRows.Length <= 0) @@ -35,22 +40,30 @@ namespace GeometryTD.CustomComponent return false; } - RarityType selectedRarity = RollRarity(displayPhaseIndex); + selectedRarity = RollRarity(displayPhaseIndex); if (selectedRarity == RarityType.None) { return false; } int totalWeight = 0; + DROutGameDropPool fallbackRow = null; for (int i = 0; i < _eligibleRowBuffer.Count; i++) { DROutGameDropPool row = _eligibleRowBuffer[i]; - if (row.Rarity != selectedRarity) + if (!IsEligibleAtPhase(row, selectedRarity, displayPhaseIndex)) { continue; } - totalWeight += Mathf.Max(1, row.Weight); + int rowWeight = row.GetWeight(selectedRarity); + if (rowWeight <= 0) + { + continue; + } + + fallbackRow = row; + totalWeight += rowWeight; } if (totalWeight <= 0) @@ -62,12 +75,18 @@ namespace GeometryTD.CustomComponent int cumulativeWeight = 0; foreach (var row in _eligibleRowBuffer) { - if (row.Rarity != selectedRarity) + if (!IsEligibleAtPhase(row, selectedRarity, displayPhaseIndex)) { continue; } - cumulativeWeight += Mathf.Max(1, row.Weight); + int rowWeight = row.GetWeight(selectedRarity); + if (rowWeight <= 0) + { + continue; + } + + cumulativeWeight += rowWeight; if (randomWeight <= cumulativeWeight) { selectedRow = row; @@ -75,7 +94,7 @@ namespace GeometryTD.CustomComponent } } - selectedRow = _eligibleRowBuffer[_eligibleRowBuffer.Count - 1]; + selectedRow = fallbackRow; return selectedRow != null; } @@ -99,7 +118,7 @@ namespace GeometryTD.CustomComponent continue; } - if (displayPhaseIndex < row.MinPhase || displayPhaseIndex > row.MaxPhase) + if (!IsEligibleAtPhase(row, displayPhaseIndex)) { continue; } @@ -116,20 +135,35 @@ namespace GeometryTD.CustomComponent for (int i = 0; i < _eligibleRowBuffer.Count; i++) { DROutGameDropPool row = _eligibleRowBuffer[i]; - float curveWeight = GetRarityCurveWeight(row.Rarity, phaseT); - if (curveWeight <= 0f) + for (int rarityIndex = (int)RarityType.White; rarityIndex <= (int)RarityType.Red; rarityIndex++) { - continue; - } + RarityType rarity = (RarityType)rarityIndex; + if (!IsEligibleAtPhase(row, rarity, displayPhaseIndex)) + { + continue; + } - float rowWeight = Mathf.Max(1, row.Weight) * curveWeight; - if (_rarityWeightBuffer.TryGetValue(row.Rarity, out float existingWeight)) - { - _rarityWeightBuffer[row.Rarity] = existingWeight + rowWeight; - } - else - { - _rarityWeightBuffer[row.Rarity] = rowWeight; + int rowWeight = row.GetWeight(rarity); + if (rowWeight <= 0) + { + continue; + } + + float curveWeight = GetRarityCurveWeight(rarity, phaseT); + if (curveWeight <= 0f) + { + continue; + } + + float rarityWeight = rowWeight * curveWeight; + if (_rarityWeightBuffer.TryGetValue(rarity, out float existingWeight)) + { + _rarityWeightBuffer[rarity] = existingWeight + rarityWeight; + } + else + { + _rarityWeightBuffer[rarity] = rarityWeight; + } } } @@ -163,6 +197,32 @@ namespace GeometryTD.CustomComponent return RarityType.None; } + private static bool IsEligibleAtPhase(DROutGameDropPool row, int displayPhaseIndex) + { + for (int rarityIndex = (int)RarityType.White; rarityIndex <= (int)RarityType.Red; rarityIndex++) + { + RarityType rarity = (RarityType)rarityIndex; + if (IsEligibleAtPhase(row, rarity, displayPhaseIndex)) + { + return true; + } + } + + return false; + } + + private static bool IsEligibleAtPhase(DROutGameDropPool row, RarityType rarity, int displayPhaseIndex) + { + if (row.GetWeight(rarity) <= 0) + { + return false; + } + + int minPhase = row.GetMinPhase(rarity); + int maxPhase = row.GetMaxPhase(rarity); + return displayPhaseIndex >= minPhase && displayPhaseIndex <= maxPhase; + } + private static float GetRarityCurveWeight(RarityType rarityType, float phaseT) { float hump = Mathf.Exp(-Mathf.Pow((phaseT - 0.35f) / 0.28f, 2f)); @@ -183,4 +243,4 @@ namespace GeometryTD.CustomComponent } } } -} \ No newline at end of file +} diff --git a/Assets/GameMain/Scripts/CustomComponent/InventoryGeneration/InventoryGenerationComponent.cs b/Assets/GameMain/Scripts/CustomComponent/InventoryGeneration/InventoryGenerationComponent.cs index 6799808..c26f97c 100644 --- a/Assets/GameMain/Scripts/CustomComponent/InventoryGeneration/InventoryGenerationComponent.cs +++ b/Assets/GameMain/Scripts/CustomComponent/InventoryGeneration/InventoryGenerationComponent.cs @@ -183,16 +183,26 @@ namespace GeometryTD.CustomComponent droppedItem = null; DropPoolRoller dropPoolRoller = EnsureDropPoolRoller(); int phaseIndex = Mathf.Max(1, displayPhaseIndex); - if (!dropPoolRoller.TryRollRow(phaseIndex, themeType, out DROutGameDropPool selectedRow) || selectedRow == null) + if (!dropPoolRoller.TryRollRow( + phaseIndex, + themeType, + out DROutGameDropPool selectedRow, + out RarityType selectedRarity) || selectedRow == null) { return false; } - return TryBuildDropItem(selectedRow, InventoryTagSourceType.Drop, AllocateDropTagOrdinal(), out droppedItem); + return TryBuildDropItem( + selectedRow, + selectedRarity, + InventoryTagSourceType.Drop, + AllocateDropTagOrdinal(), + out droppedItem); } private bool TryBuildDropItem( DROutGameDropPool row, + RarityType rarity, InventoryTagSourceType sourceType, int localOrdinal, out TowerCompItemData droppedItem) @@ -215,7 +225,7 @@ namespace GeometryTD.CustomComponent droppedItem = ComponentItemFactory.CreateMuzzle( config, AllocateTempInstanceId(), - row.Rarity, + rarity, CreateRandomContext(sourceType, localOrdinal, config.Id)); return true; } @@ -231,7 +241,7 @@ namespace GeometryTD.CustomComponent droppedItem = ComponentItemFactory.CreateBearing( config, AllocateTempInstanceId(), - row.Rarity, + rarity, CreateRandomContext(sourceType, localOrdinal, config.Id)); return true; } @@ -247,7 +257,7 @@ namespace GeometryTD.CustomComponent droppedItem = ComponentItemFactory.CreateBase( config, AllocateTempInstanceId(), - row.Rarity, + rarity, CreateRandomContext(sourceType, localOrdinal, config.Id)); return true; } @@ -265,9 +275,14 @@ namespace GeometryTD.CustomComponent return _nextRewardTagOrdinal++; } - private TowerCompItemData BuildRewardCandidateItem(DROutGameDropPool row) + private TowerCompItemData BuildRewardCandidateItem(DROutGameDropPool row, RarityType rarity) { - if (!TryBuildDropItem(row, InventoryTagSourceType.Reward, AllocateRewardTagOrdinal(), out TowerCompItemData droppedItem)) + if (!TryBuildDropItem( + row, + rarity, + InventoryTagSourceType.Reward, + AllocateRewardTagOrdinal(), + out TowerCompItemData droppedItem)) { return null; } diff --git a/Assets/GameMain/Scripts/CustomComponent/InventoryGeneration/RewardCandidateBuilder.cs b/Assets/GameMain/Scripts/CustomComponent/InventoryGeneration/RewardCandidateBuilder.cs index e3abe08..545b4fa 100644 --- a/Assets/GameMain/Scripts/CustomComponent/InventoryGeneration/RewardCandidateBuilder.cs +++ b/Assets/GameMain/Scripts/CustomComponent/InventoryGeneration/RewardCandidateBuilder.cs @@ -19,7 +19,7 @@ namespace GeometryTD.CustomComponent int displayPhaseIndex, LevelThemeType themeType, int candidateCount, - Func buildRewardItem) + Func buildRewardItem) { int resolvedCount = Mathf.Max(0, candidateCount); if (resolvedCount <= 0) @@ -28,7 +28,7 @@ namespace GeometryTD.CustomComponent } List candidates = new List(resolvedCount); - HashSet selectedPoolRowIds = new HashSet(); + HashSet selectedPoolEntryKeys = new HashSet(); int maxAttempts = Mathf.Max(resolvedCount * 6, resolvedCount); int phaseIndex = Mathf.Max(1, displayPhaseIndex); @@ -36,17 +36,21 @@ namespace GeometryTD.CustomComponent while (candidates.Count < resolvedCount && attempts < maxAttempts) { attempts++; - if (!_dropPoolRoller.TryRollRow(phaseIndex, themeType, out DROutGameDropPool selectedRow) || selectedRow == null) + if (!_dropPoolRoller.TryRollRow( + phaseIndex, + themeType, + out DROutGameDropPool selectedRow, + out RarityType selectedRarity) || selectedRow == null) { break; } - if (!selectedPoolRowIds.Add(selectedRow.Id)) + if (!selectedPoolEntryKeys.Add(BuildSelectionKey(selectedRow.Id, selectedRarity))) { continue; } - TowerCompItemData candidate = buildRewardItem(selectedRow); + TowerCompItemData candidate = buildRewardItem(selectedRow, selectedRarity); if (candidate == null) { continue; @@ -59,12 +63,16 @@ namespace GeometryTD.CustomComponent while (candidates.Count < resolvedCount && attempts < maxAttempts) { attempts++; - if (!_dropPoolRoller.TryRollRow(phaseIndex, themeType, out DROutGameDropPool selectedRow) || selectedRow == null) + if (!_dropPoolRoller.TryRollRow( + phaseIndex, + themeType, + out DROutGameDropPool selectedRow, + out RarityType selectedRarity) || selectedRow == null) { break; } - TowerCompItemData candidate = buildRewardItem(selectedRow); + TowerCompItemData candidate = buildRewardItem(selectedRow, selectedRarity); if (candidate == null) { continue; @@ -75,5 +83,10 @@ namespace GeometryTD.CustomComponent return candidates; } + + private static long BuildSelectionKey(int rowId, RarityType rarity) + { + return ((long)rowId << 32) | (uint)rarity; + } } } diff --git a/Assets/GameMain/Scripts/DataTable/DROutGameDropPool.cs b/Assets/GameMain/Scripts/DataTable/DROutGameDropPool.cs index c4a0e6a..6972bed 100644 --- a/Assets/GameMain/Scripts/DataTable/DROutGameDropPool.cs +++ b/Assets/GameMain/Scripts/DataTable/DROutGameDropPool.cs @@ -1,5 +1,7 @@ +using System; using GeometryTD.CustomUtility; using GeometryTD.Definition; +using UnityEngine; using UnityGameFramework.Runtime; namespace GeometryTD.DataTable @@ -14,12 +16,11 @@ namespace GeometryTD.DataTable public override int Id => m_Id; public LevelThemeType LevelThemeType { get; private set; } - public RarityType Rarity { get; private set; } public string ItemType { get; private set; } public int ItemId { get; private set; } - public int Weight { get; private set; } - public int MinPhase { get; private set; } - public int MaxPhase { get; private set; } + public int[] Weights { get; private set; } + public int[] MinPhase { get; private set; } + public int[] MaxPhase { get; private set; } public override bool ParseDataRow(string dataRowString, object userData) { @@ -34,31 +35,110 @@ namespace GeometryTD.DataTable m_Id = int.Parse(columnStrings[index++]); index++; LevelThemeType = EnumUtility.Get(columnStrings[index++]); - Rarity = EnumUtility.Get(columnStrings[index++]); ItemType = columnStrings[index++]; ItemId = ParseIntOrDefault(columnStrings[index++], 0); - Weight = ParseIntOrDefault(columnStrings[index++], 1); - MinPhase = ParseIntOrDefault(columnStrings[index++], 1); - MaxPhase = ParseIntOrDefault(columnStrings[index++], int.MaxValue); - - if (Weight <= 0) - { - Weight = 1; - } - - if (MinPhase <= 0) - { - MinPhase = 1; - } - - if (MaxPhase < MinPhase) - { - MaxPhase = MinPhase; - } + Weights = ParseWeights(columnStrings[index++]); + MinPhase = ParsePhases(columnStrings[index++], 1); + MaxPhase = ParsePhases(columnStrings[index++], int.MaxValue); + NormalizePhaseRanges(); return true; } + public int GetWeight(RarityType rarity) + { + int index = Mathf.Clamp((int)rarity - 1, 0, RarityCount - 1); + return Weights[index]; + } + + public int GetMinPhase(RarityType rarity) + { + int index = Mathf.Clamp((int)rarity - 1, 0, RarityCount - 1); + return MinPhase[index]; + } + + public int GetMaxPhase(RarityType rarity) + { + int index = Mathf.Clamp((int)rarity - 1, 0, RarityCount - 1); + return MaxPhase[index]; + } + + private static int[] ParseWeights(string raw) + { + if (!raw.StartsWith('[') || !raw.EndsWith(']')) + { + throw new ArgumentException("Weights must be enclosed in square brackets."); + } + + if (raw.Length == 2) + { + return new int[RarityCount]; + } + + string[] raws = raw.Substring(1, raw.Length - 2).Split(","); + if (raws.Length != RarityCount) + { + throw new ArgumentException($"Weights must contain exactly {RarityCount} values."); + } + + int[] weights = new int[RarityCount]; + for (int i = 0; i < raws.Length; i++) + { + weights[i] = Mathf.Max(0, int.Parse(raws[i])); + } + + return weights; + } + + private static int[] ParsePhases(string raw, int fallbackValue) + { + if (!raw.StartsWith('[') || !raw.EndsWith(']')) + { + throw new ArgumentException("Phase ranges must be enclosed in square brackets."); + } + + if (raw.Length == 2) + { + int[] fallbackValues = new int[RarityCount]; + for (int i = 0; i < fallbackValues.Length; i++) + { + fallbackValues[i] = fallbackValue; + } + + return fallbackValues; + } + + string[] raws = raw.Substring(1, raw.Length - 2).Split(","); + if (raws.Length != RarityCount) + { + throw new ArgumentException($"Phase ranges must contain exactly {RarityCount} values."); + } + + int[] phases = new int[RarityCount]; + for (int i = 0; i < raws.Length; i++) + { + phases[i] = int.Parse(raws[i]); + } + + return phases; + } + + private void NormalizePhaseRanges() + { + for (int i = 0; i < RarityCount; i++) + { + if (MinPhase[i] <= 0) + { + MinPhase[i] = 1; + } + + if (MaxPhase[i] < MinPhase[i]) + { + MaxPhase[i] = MinPhase[i]; + } + } + } + private static int ParseIntOrDefault(string raw, int fallbackValue) { if (int.TryParse(raw, out int parsed)) @@ -68,5 +148,7 @@ namespace GeometryTD.DataTable return fallbackValue; } + + private const int RarityCount = (int)RarityType.Red; } } diff --git a/Assets/GameMain/Scripts/Utility/ItemDescUtility.cs b/Assets/GameMain/Scripts/Utility/ItemDescUtility.cs index 8031d5b..5fa5888 100644 --- a/Assets/GameMain/Scripts/Utility/ItemDescUtility.cs +++ b/Assets/GameMain/Scripts/Utility/ItemDescUtility.cs @@ -270,7 +270,7 @@ namespace GeometryTD.CustomUtility AttackPropertyType.None => "无效", AttackPropertyType.Physics => "物理", //yellow AttackPropertyType.Fire => "火", //red - AttackPropertyType.Water => "水/color>", //cyan + AttackPropertyType.Water => "水", //cyan AttackPropertyType.Earth => "自然", //lime AttackPropertyType.Poison => "毒", //green AttackPropertyType.Ice => "冰", //darkblue diff --git a/数据表/Entity.xlsx b/数据表/Entity.xlsx index 545c055b70df6fa342c357c76853b1c9bb325651..ceb0c6101f2bbb281b0d75de0481c3b758580c99 100644 GIT binary patch delta 5490 zcmZ8lcQhQ{y4AZFUG&krh+d-i7DVrp2!=uQAs9qUbTb(>7`>M$(V~kGB#0iP_cDl1 zc)7p(?z(Ti^T%FiecxVtoj=Yx-`P9g{LH)#j*Uk&ZOjT!#}DS)Xhn$C(0ybZrD zwW#GjtQyXlkgaYjwggKYUfek4or$T2y>qZg-s^O;-Sf1-G0N2IiNZg$v8m~S8etrL z6*2>uAT7Tu>-G)EPYz`y?cYVr(lgYt7Xsdr74+3L9sp`O#4`mKJgF7y4>` zwYfO2y|L>Dk*+8##}QFnzXV8-P+O&z`N@(H|>mD`{y= zVt=dV=Hi9plq)1&zfW%i<=yw_nak5cw%Brksn zA5?@Avs{W{KV^hvG4&;$@T5vNHWHWDqR1CObeJjS`P2i z(u&XsUlUl-_9Pa}Emadyge zxUV}%KgJv?8((b1F=a30v!v@=*zp@f;JsO|CXrT^^L6W45N=SRXMki<1@@QL4H~dt3FG_{ZU?;T*9L3f<;iVRX+@u5@&=US{uazz)NI=GfvM4&thJc4;fl(SmxlZ95#`vi3wQ1#K&R zLZACjD(E17AaYvJBzNiDa`8tKHu}LcG@nw~3a(Y>#3u70n~Tq3T!vWIaT+k4EnQDdWPDA^x1?Wffs}zP&zD)}J^Me`Hy?VzSS|vZFp3?nMT;y)g z)d~eD?EtwUKGJ)0WY>Mz)n@V;ylDGjFwl2^D0E`u}qZuC6cc=F8LuI0jBqFy^ z?07M00i`CP66+Bh_J-*+at>Q2COr_Hgbvcss4KuDHmlgDsaFyYs6Yx!Wel6yI?~-~ z(u2hdLI!-leXZTrP-;Fu{Ra}j(K_#{tCW-ue@>G83WugoKKWd)xwinUwA){3@^}qv zV_eMPMUHKdeg(9=r&gdzRQQS$y~M4&megqM!PrvG+ICxqVxXmG@ z-CZn%8$+M8G(Y7%carA6DHZ=%l}qnz3JQ-GZj0QmJ827X5*7%_sGt(i!ta&-xAYkqNelRThZN~$fW&zzn6QJ4s&F^ zoHLzajteL}Ap(^KKR`@hqAvF~^K7VK%Rc!5cF5%K+fLeEEm#*7S?IzpL0lQe+|;VZ z>>4S~NBMy1k0C2h=(qc0SD57?^bd+w&STKOmvf|&>r9@h7DJ)1jp>*?uH+bD=D^e949H z+1rlxrn%n)KZhzv>@~fbrQS#v+aO6t)m2z`p*352zS0s3=l_70jn>?n%VTpaf-U zt7Pi$sTWDz1Vj)=^LVNZV|kM@vtcC~~-;5tVLnbHBdqKrwLW@~})lzKy6G6;Yw0-qu91v`V%ix_dCZ2ai-}rcUM_!J*0b38YNnL(4QFv_snt63!-OHC_(Q0Z{ zjRaL`Bi(v2ZcZK+a>+6 zD@6TdOpHOf5ASYRsC1$v6S7F$zJ80@h5V5OIMkZMn9K%@{9n!i+0(iT+|2d%{KYw8 z!k*6SwF9FqyiK>$wl)pf53k(4|0&mq%5G_>6m~jGi=WJ_I&0op|4MK{BA2p2C9vw& z%+xNre;S*#{@9MjPSyXGNw~G}6K8emt!qBGva?iy7nlJXjnwTuJlX<8qhQ`en0>bV zE|j!-p{^(yXb9}yuxELL?)F)!r+U^8qvWpY=;5$wpkeLiuu^DcCN~K*J&mVQ#-~km zS}*FpcJ%k53SX^9%kpb;Z_Q8&uzxfZD)tKeV60RgGLgu`qZVMB6<3tG?OIeY?z>xHJyx7qy=6D77Q8A(=sM&14GZ7HiUY z0-=GBna@eR`xmcu@MesOl=j8qF?GT?!XpJ|p{GRD@5ecbXV&|sVI>=KH*Y$hgm2g{ zP<(h`Ep*tem0fkjdR{WS3zZFJbr@oNu*gZh{$gjHx=dN=V3|x^$!jq9hs8{YXrnw3 zy$Mu18>KEPH`vc=Hj~gCzq58tR z*4-}yt_d8y0}~m3OvjL37Q()QSCbo3si+xm!9A#IyQ(vZv|@!3#ITRN%VuUdp4yDN=CkVBC7TM3ac zQw!4U*Otk!zSM@u`LxN8b*-^|FG0Q(rT>Dh-i%un!Ct$f9q0;x&M2!N0Di%@S)?9RPC{$F4p9{P8RBXI(6cs zAtYE<^!|uBO8*W?q!P-n`z9HzKbi1wF^v754;gbUjiAEZ=9O^mib<4xf~kOyq)r}Y z!Iqwc9)+A#YSl9%ZurS%4-{X<9GB+hFvGmBk1jWEFuD4Zg;n}H$Idh0OgQXr;}re6 zUKzp8k3Hf+eCvO*{(a4%OZsZ@^AI5{amQ%*`S#a{b$$b0HnjYo?F%vdT-2vAun`C-x*mpTAS_D{wfv@^HxBO@3R8B_>WLX5b~(=3!gP zy*(bkyz?3i#ON#DDxfyJQ6wxH>`H3!6EbT~X0s){_bq>qk!Q&aV+EVg!(Wt7hO;RJ zBN1DLF#=Kjmy>Hn3dsa!aWRt%m=5SQ7jUIMpQQfL-E9NBYY96cIZr|1&-NR*Lx?Jf z^!@S(dw;Y5%s@ad69TPL#uzMXgeo$zDrEtbnyw&FeU*Ey{KR}Yop#e8$DUSa>^G*B zT##41NSv5oB#&X_8K#v+QXvWxQT0Mo0tj*ivACK3S2+W^RM2iRW?Z1+vuf43ql~Gj z41*?;mwlWT)Ev_P;w9VK#o1z;r+uwB&WLU=7>lGGju{l%AEmC-`G-dzP)IUcWX%o2 zb#}C?CM_)N7FecE^ZN1Lifq;o==`kyAJu5se`M+ZEjt@qjR3UbRATjWRALDtBLEHM z<|qhs#60?ciJt`2JuA%km{?oQ5^UvG-_(R&q!3CJ{r%&WW)h#`*$D`#yxwDxyNpg@&biq<=Ha0hMHssUXoZE9_RCeY1pv2$ z#ZD-e^I|00@A!|PeiPC_V>-O0;pHeO3$Tc@7}3DnU?CMhI>%qbQ*E#_1fKQ$$N*Xk^Yu zy=lqm-sRgS2%~I6l(4lYW~|ayuq`}hD|4XibzsaclH#S4k>M&r+QJE+on?+ISX3ps zV;@K}Md_T5ys2MBmC5Ea%A|IQa}k?WPa>2%0|# zs*18EPbgINBb8E|%c@H4zHD*7s7hr*Yj;AB+rK53U@?{Nnz9#I{9I`XHjH=N$Am@u ztFpMS^>r(Cz~)YkB56IranM!H!0{&HN1ajbZPJ<#a_awpr)C$+C4ZW?RxkxyEiEhx zdd;kBS|M$|*iRu0)TYpp^}y=&T+)k2eLV{R2j_6oDVKc9*T9C2$x*4AKYT55XJtSVmjH z+wyAisS#VokHK*!&zzulC8|4?;#x@tS`kq@mV*UTw7XVK=F)D7=7qN6ql+KW6K)#^ z=6d{0um6snN(siP=>VjQ3ya1yV_BO5m9v5d%v^lpU8!YSRkjlqv4IX9`0-9n@_d7w zbFh4!JUU;nC>!G)m1fLjMOkzCG)47rNpBKPq>t){$AA%P?n_cE3kUX1^UX{~K~S`d z$kc^UAm05ec2DtjwEu(55yH5ja}ZQA9L#npm>5EcGlVu=oLv;3@=-&B5&ok!$VC0! zF_HfF(_@D<;I9?Gf=Q3w-bMF(K^5d-mhir64zS-3V?DSOyw+UqRiZvBTxP-_-#fKy z=nrXmcNha)#5H2N277Z0sGNw>HQy1YFg8@P`{HAl!ht->*xT^uJmNTHKzKS&+P~9G zVctO;2@d!GY>AwaR3ybEj`T5tv#$x}AN^n0uUZ($Vj{e){g*WqA{-11* zp8pvRh8Pavm&B%n7w{`%)56#Iq1Z5Zt^hsUS3m%}{_jre|0Yam0R;j*o_{I+50GnV Ad;kCd delta 5444 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 delta 6913 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 CFk5#3