diff --git a/Assets/GameMain/DataTables/tbglobalconfig.bytes b/Assets/GameMain/DataTables/tbglobalconfig.bytes index 60f8db9..d245a7e 100644 Binary files a/Assets/GameMain/DataTables/tbglobalconfig.bytes and b/Assets/GameMain/DataTables/tbglobalconfig.bytes differ diff --git a/Assets/GameMain/DataTables/tbglobalconfig.json b/Assets/GameMain/DataTables/tbglobalconfig.json index d97e382..cbdf399 100644 --- a/Assets/GameMain/DataTables/tbglobalconfig.json +++ b/Assets/GameMain/DataTables/tbglobalconfig.json @@ -3,19 +3,19 @@ "weaponCapacity": 6, "propMaxCount": -1, "playerEntity": "Player", - "absorbSpeed": 15000, - "collectDistance": 350, - "defaultAbsorbRange": 3000, - "weaponRecycleRate": 300, + "absorbSpeed": 12, + "collectDistance": 0.5, + "defaultAbsorbRange": 4, + "weaponRecycleRate": 0.3, "shopGoodsCount": 4, - "shopPriceRandomPercent": 50, + "shopPriceRandomPercent": 0.05, "shopMinPrice": 1, "levelUpRefreshPriceBase": 2, "levelUpRewardCount": 4, "spawnEnemyMaxCount": 5000, - "enemySpawnDistanceMin": 14000, - "enemySpawnDistanceMax": 18000, - "weaponRotateSpeed": 5000, + "enemySpawnDistanceMin": 14, + "enemySpawnDistanceMax": 18, + "weaponRotateSpeed": 5, "weaponBaseCrit": 0.05, "playerGroupName": "Player", "enemyGroupName": "Enemy", diff --git a/Assets/GameMain/DataTables/tbpropconfig.bytes b/Assets/GameMain/DataTables/tbpropconfig.bytes index 570fd8e..965f711 100644 Binary files a/Assets/GameMain/DataTables/tbpropconfig.bytes and b/Assets/GameMain/DataTables/tbpropconfig.bytes differ diff --git a/Assets/GameMain/DataTables/tbpropconfig.json b/Assets/GameMain/DataTables/tbpropconfig.json index 837f278..e2715f8 100644 --- a/Assets/GameMain/DataTables/tbpropconfig.json +++ b/Assets/GameMain/DataTables/tbpropconfig.json @@ -6,7 +6,7 @@ "price": 120, "statModifierConfigs": [ { - "statType": 4, + "statType": 5, "value": 10, "modifierType": 100 }, @@ -35,7 +35,7 @@ "modifierType": 200 }, { - "statType": 4, + "statType": 5, "value": 11, "modifierType": 100 } @@ -88,11 +88,11 @@ "statModifierConfigs": [ { "statType": 14, - "value": 800, + "value": 0.8, "modifierType": 100 }, { - "statType": 4, + "statType": 5, "value": 10, "modifierType": 100 } @@ -107,11 +107,11 @@ "statModifierConfigs": [ { "statType": 13, - "value": 10, + "value": 0.1, "modifierType": 100 }, { - "statType": 4, + "statType": 5, "value": 12, "modifierType": 100 }, @@ -144,13 +144,13 @@ "price": 433, "statModifierConfigs": [ { - "statType": 4, + "statType": 6, "value": 44, "modifierType": 100 }, { "statType": 13, - "value": 27, + "value": 0.27, "modifierType": 100 } ], @@ -168,7 +168,7 @@ "modifierType": 100 }, { - "statType": 4, + "statType": 6, "value": 7, "modifierType": 100 }, @@ -201,7 +201,7 @@ "price": 341, "statModifierConfigs": [ { - "statType": 4, + "statType": 6, "value": 57, "modifierType": 100 } @@ -221,7 +221,7 @@ }, { "statType": 9, - "value": 27, + "value": 0.27, "modifierType": 100 } ], @@ -235,12 +235,12 @@ "statModifierConfigs": [ { "statType": 9, - "value": 5, + "value": 0.05, "modifierType": 100 }, { "statType": 13, - "value": 7, + "value": 0.07, "modifierType": 100 } ], @@ -254,7 +254,7 @@ "statModifierConfigs": [ { "statType": 14, - "value": 600, + "value": 0.6, "modifierType": 100 }, { @@ -273,7 +273,7 @@ "statModifierConfigs": [ { "statType": 14, - "value": 1600, + "value": 1.6, "modifierType": 100 }, { @@ -292,7 +292,7 @@ "statModifierConfigs": [ { "statType": 13, - "value": 28, + "value": 0.28, "modifierType": 100 }, { @@ -301,7 +301,7 @@ "modifierType": 100 }, { - "statType": 4, + "statType": 5, "value": 24, "modifierType": 100 } @@ -329,7 +329,7 @@ "price": 204, "statModifierConfigs": [ { - "statType": 4, + "statType": 7, "value": 17, "modifierType": 100 }, @@ -353,13 +353,13 @@ "modifierType": 100 }, { - "statType": 4, + "statType": 7, "value": 19, "modifierType": 100 }, { "statType": 13, - "value": 20, + "value": 0.2, "modifierType": 100 } ], @@ -377,7 +377,7 @@ "modifierType": 200 }, { - "statType": 4, + "statType": 7, "value": 29, "modifierType": 100 }, diff --git a/Assets/GameMain/DataTables/tbstatconfig.bytes b/Assets/GameMain/DataTables/tbstatconfig.bytes index bed3ac6..62ff604 100644 Binary files a/Assets/GameMain/DataTables/tbstatconfig.bytes and b/Assets/GameMain/DataTables/tbstatconfig.bytes differ diff --git a/Assets/GameMain/DataTables/tbstatconfig.json b/Assets/GameMain/DataTables/tbstatconfig.json index 5f3a0cd..e55b733 100644 --- a/Assets/GameMain/DataTables/tbstatconfig.json +++ b/Assets/GameMain/DataTables/tbstatconfig.json @@ -32,7 +32,7 @@ { "statType": 4, "name": "伤害", - "defaultBaseValue": 0, + "defaultBaseValue": 1, "hasMin": true, "minValue": -1, "hasMax": false, @@ -72,7 +72,7 @@ { "statType": 8, "name": "攻击速度", - "defaultBaseValue": 0, + "defaultBaseValue": 1, "hasMin": true, "minValue": -0.8, "hasMax": false, diff --git a/Assets/GameMain/DataTables/tbweaponconfig.bytes b/Assets/GameMain/DataTables/tbweaponconfig.bytes index f8ea49e..897d199 100644 Binary files a/Assets/GameMain/DataTables/tbweaponconfig.bytes and b/Assets/GameMain/DataTables/tbweaponconfig.bytes differ diff --git a/Assets/GameMain/DataTables/tbweaponconfig.json b/Assets/GameMain/DataTables/tbweaponconfig.json index b2a0c0e..4207145 100644 --- a/Assets/GameMain/DataTables/tbweaponconfig.json +++ b/Assets/GameMain/DataTables/tbweaponconfig.json @@ -5,14 +5,14 @@ "rarity": 1, "price": 120, "attack": 100, - "cooldown": 1500, + "cooldown": 1.5, "damageType": 1, - "attackRange": 5000, + "attackRange": 5, "attackSoundId": 10000, "parameters": [ [ 1, - 2000 + 2 ] ], "statModifierConfigs": [], @@ -25,9 +25,9 @@ "rarity": 1, "price": 130, "attack": 120, - "cooldown": 1000, + "cooldown": 1, "damageType": 2, - "attackRange": 15000, + "attackRange": 15, "attackSoundId": 10000, "parameters": [], "statModifierConfigs": [], @@ -40,9 +40,9 @@ "rarity": 1, "price": 100, "attack": 150, - "cooldown": 2000, + "cooldown": 2, "damageType": 1, - "attackRange": 5000, + "attackRange": 5, "attackSoundId": 10000, "parameters": [ [ @@ -60,14 +60,14 @@ "rarity": 1, "price": 150, "attack": 80, - "cooldown": 3000, + "cooldown": 3, "damageType": 4, - "attackRange": 12000, + "attackRange": 12, "attackSoundId": 10000, "parameters": [ [ 1, - 3000 + 3 ] ], "statModifierConfigs": [], @@ -80,22 +80,22 @@ "rarity": 1, "price": 100, "attack": 100, - "cooldown": 1500, + "cooldown": 1.5, "damageType": 1, - "attackRange": 5000, + "attackRange": 5, "attackSoundId": 10000, "parameters": [ [ 3, - 700 + 0.7 ], [ 4, - 4500 + 4.5 ], [ 5, - 500 + 0.5 ] ], "statModifierConfigs": [], diff --git a/Assets/GameMain/Scripts/Base/EntityData/Weapon/WeaponData.cs b/Assets/GameMain/Scripts/Base/EntityData/Weapon/WeaponData.cs index c447648..9de83ad 100644 --- a/Assets/GameMain/Scripts/Base/EntityData/Weapon/WeaponData.cs +++ b/Assets/GameMain/Scripts/Base/EntityData/Weapon/WeaponData.cs @@ -32,32 +32,21 @@ namespace SepCore.Entity public int Price => Config.Price; - public float Cooldown => Config.Cooldown / 1000f; + public float Cooldown => Config.Cooldown; - public float AttackRange => Config.AttackRange / 1000f; + public float AttackRange => Config.AttackRange; public int AttackSoundId => Config.AttackSoundId; - public IReadOnlyDictionary Parameters => Config.Parameters; + public IReadOnlyDictionary Parameters => Config.Parameters; public IReadOnlyList Modifiers => Config.StatModifierConfigs; - - public int GetParam(ParamType paramType) - { - if (Config.Parameters.TryGetValue(paramType, out int value)) - { - return value; - } - - Log.Error("Weapon parameter '{0}' not found for weapon '{1}'.", paramType, Config.WeaponType); - return 0; - } - + public float GetParamFloat(ParamType paramType) { - if (Config.Parameters.TryGetValue(paramType, out int val)) + if (Config.Parameters.TryGetValue(paramType, out float val)) { - return paramType == ParamType.SectorAngle ? val : val / 1000f; + return val; } Log.Error("Weapon parameter '{0}' not found for weapon '{1}'.", paramType, Config.WeaponType); @@ -65,4 +54,3 @@ namespace SepCore.Entity } } } - diff --git a/Assets/GameMain/Scripts/Base/Gen/GlobalConfig.cs b/Assets/GameMain/Scripts/Base/Gen/GlobalConfig.cs index fe91619..ebed467 100644 --- a/Assets/GameMain/Scripts/Base/Gen/GlobalConfig.cs +++ b/Assets/GameMain/Scripts/Base/Gen/GlobalConfig.cs @@ -20,19 +20,19 @@ public sealed partial class GlobalConfig : Luban.BeanBase PropMaxCount = _buf.ReadInt(); PlayerEntity = _buf.ReadString(); PlayerEntity_Ref = null; - AbsorbSpeed = _buf.ReadInt(); - CollectDistance = _buf.ReadInt(); - DefaultAbsorbRange = _buf.ReadInt(); - WeaponRecycleRate = _buf.ReadInt(); + AbsorbSpeed = _buf.ReadFloat(); + CollectDistance = _buf.ReadFloat(); + DefaultAbsorbRange = _buf.ReadFloat(); + WeaponRecycleRate = _buf.ReadFloat(); ShopGoodsCount = _buf.ReadInt(); - ShopPriceRandomPercent = _buf.ReadInt(); + ShopPriceRandomPercent = _buf.ReadFloat(); ShopMinPrice = _buf.ReadInt(); LevelUpRefreshPriceBase = _buf.ReadInt(); LevelUpRewardCount = _buf.ReadInt(); SpawnEnemyMaxCount = _buf.ReadInt(); - EnemySpawnDistanceMin = _buf.ReadInt(); - EnemySpawnDistanceMax = _buf.ReadInt(); - WeaponRotateSpeed = _buf.ReadInt(); + EnemySpawnDistanceMin = _buf.ReadFloat(); + EnemySpawnDistanceMax = _buf.ReadFloat(); + WeaponRotateSpeed = _buf.ReadFloat(); WeaponBaseCrit = _buf.ReadFloat(); PlayerGroupName = _buf.ReadString(); EnemyGroupName = _buf.ReadString(); @@ -75,19 +75,19 @@ public sealed partial class GlobalConfig : Luban.BeanBase /// /// 自动收集速度 /// - public readonly int AbsorbSpeed; + public readonly float AbsorbSpeed; /// /// 自动收集距离 /// - public readonly int CollectDistance; + public readonly float CollectDistance; /// /// 默认吸收距离 /// - public readonly int DefaultAbsorbRange; + public readonly float DefaultAbsorbRange; /// /// 武器回收价比例 /// - public readonly int WeaponRecycleRate; + public readonly float WeaponRecycleRate; /// /// 商店商品数量 /// @@ -95,7 +95,7 @@ public sealed partial class GlobalConfig : Luban.BeanBase /// /// 商品价格浮动 /// - public readonly int ShopPriceRandomPercent; + public readonly float ShopPriceRandomPercent; /// /// 商品最低价 /// @@ -115,15 +115,15 @@ public sealed partial class GlobalConfig : Luban.BeanBase /// /// 敌人生成最小距离 /// - public readonly int EnemySpawnDistanceMin; + public readonly float EnemySpawnDistanceMin; /// /// 敌人生成最大距离 /// - public readonly int EnemySpawnDistanceMax; + public readonly float EnemySpawnDistanceMax; /// /// 武器旋转速度 /// - public readonly int WeaponRotateSpeed; + public readonly float WeaponRotateSpeed; /// /// 武器基本暴击率 /// diff --git a/Assets/GameMain/Scripts/Base/Gen/TbGlobalConfig.cs b/Assets/GameMain/Scripts/Base/Gen/TbGlobalConfig.cs index 1bbdda1..c84b401 100644 --- a/Assets/GameMain/Scripts/Base/Gen/TbGlobalConfig.cs +++ b/Assets/GameMain/Scripts/Base/Gen/TbGlobalConfig.cs @@ -45,19 +45,19 @@ public partial class TbGlobalConfig /// /// 自动收集速度 /// - public int AbsorbSpeed => _data.AbsorbSpeed; + public float AbsorbSpeed => _data.AbsorbSpeed; /// /// 自动收集距离 /// - public int CollectDistance => _data.CollectDistance; + public float CollectDistance => _data.CollectDistance; /// /// 默认吸收距离 /// - public int DefaultAbsorbRange => _data.DefaultAbsorbRange; + public float DefaultAbsorbRange => _data.DefaultAbsorbRange; /// /// 武器回收价比例 /// - public int WeaponRecycleRate => _data.WeaponRecycleRate; + public float WeaponRecycleRate => _data.WeaponRecycleRate; /// /// 商店商品数量 /// @@ -65,7 +65,7 @@ public partial class TbGlobalConfig /// /// 商品价格浮动 /// - public int ShopPriceRandomPercent => _data.ShopPriceRandomPercent; + public float ShopPriceRandomPercent => _data.ShopPriceRandomPercent; /// /// 商品最低价 /// @@ -85,15 +85,15 @@ public partial class TbGlobalConfig /// /// 敌人生成最小距离 /// - public int EnemySpawnDistanceMin => _data.EnemySpawnDistanceMin; + public float EnemySpawnDistanceMin => _data.EnemySpawnDistanceMin; /// /// 敌人生成最大距离 /// - public int EnemySpawnDistanceMax => _data.EnemySpawnDistanceMax; + public float EnemySpawnDistanceMax => _data.EnemySpawnDistanceMax; /// /// 武器旋转速度 /// - public int WeaponRotateSpeed => _data.WeaponRotateSpeed; + public float WeaponRotateSpeed => _data.WeaponRotateSpeed; /// /// 武器基本暴击率 /// diff --git a/Assets/GameMain/Scripts/Base/Gen/WeaponConfig.cs b/Assets/GameMain/Scripts/Base/Gen/WeaponConfig.cs index 2a99935..048cb72 100644 --- a/Assets/GameMain/Scripts/Base/Gen/WeaponConfig.cs +++ b/Assets/GameMain/Scripts/Base/Gen/WeaponConfig.cs @@ -21,11 +21,11 @@ public sealed partial class WeaponConfig : Luban.BeanBase Rarity = (Rarity)_buf.ReadInt(); Price = _buf.ReadInt(); Attack = _buf.ReadInt(); - Cooldown = _buf.ReadInt(); + Cooldown = _buf.ReadFloat(); DamageType = (DamageType)_buf.ReadInt(); - AttackRange = _buf.ReadInt(); + AttackRange = _buf.ReadFloat(); AttackSoundId = _buf.ReadInt(); - {int n0 = System.Math.Min(_buf.ReadSize(), _buf.Size);Parameters = new System.Collections.Generic.Dictionary(n0 * 3 / 2);for(var i0 = 0 ; i0 < n0 ; i0++) { ParamType _k0; _k0 = (ParamType)_buf.ReadInt(); int _v0; _v0 = _buf.ReadInt(); Parameters.Add(_k0, _v0);}} + {int n0 = System.Math.Min(_buf.ReadSize(), _buf.Size);Parameters = new System.Collections.Generic.Dictionary(n0 * 3 / 2);for(var i0 = 0 ; i0 < n0 ; i0++) { ParamType _k0; _k0 = (ParamType)_buf.ReadInt(); float _v0; _v0 = _buf.ReadFloat(); Parameters.Add(_k0, _v0);}} {int n0 = System.Math.Min(_buf.ReadSize(), _buf.Size);StatModifierConfigs = new System.Collections.Generic.List(n0);for(var i0 = 0 ; i0 < n0 ; i0++) { StatModifierConfig _e0; _e0 = StatModifierConfig.DeserializeStatModifierConfig(_buf); StatModifierConfigs.Add(_e0);}} Prefab = _buf.ReadString(); Prefab_Ref = null; @@ -61,7 +61,7 @@ public sealed partial class WeaponConfig : Luban.BeanBase /// /// 冷却 /// - public readonly int Cooldown; + public readonly float Cooldown; /// /// 伤害类型 /// @@ -69,7 +69,7 @@ public sealed partial class WeaponConfig : Luban.BeanBase /// /// 攻击范围 /// - public readonly int AttackRange; + public readonly float AttackRange; /// /// 攻击音效编号 /// @@ -77,7 +77,7 @@ public sealed partial class WeaponConfig : Luban.BeanBase /// /// 参数类型 /// - public readonly System.Collections.Generic.Dictionary Parameters; + public readonly System.Collections.Generic.Dictionary Parameters; public readonly System.Collections.Generic.List StatModifierConfigs; /// /// 预制体 diff --git a/Assets/GameMain/Scripts/Presentation/Utility/ItemDescUtility.cs b/Assets/GameMain/Scripts/Presentation/Utility/ItemDescUtility.cs index fb533a9..4149f9d 100644 --- a/Assets/GameMain/Scripts/Presentation/Utility/ItemDescUtility.cs +++ b/Assets/GameMain/Scripts/Presentation/Utility/ItemDescUtility.cs @@ -51,13 +51,39 @@ namespace SepCore.CustomUtility string colorTag = statModifierConfig.Value >= 0 ? "green" : "red"; string sign = statModifierConfig.Value >= 0 ? "+" : ""; - if (statModifierConfig.ModifierType == ModifierType.PercentAdd) + StatConfig statConfig = null; + if (GameEntry.Luban != null && GameEntry.Luban.IsReady) + { + statConfig = GameEntry.Luban.Get(index); + } + + if (statConfig != null && !string.IsNullOrEmpty(statConfig.Name)) + { + name = statConfig.Name; + } + + // 是否以百分比展示:由 StatConfig.IsPercentDisplay 真正驱动(Luban 未就绪时 fallback 到已知百分比属性) + bool isPercentDisplay = statConfig != null + ? statConfig.IsPercentDisplay + : (statModifierConfig.StatType is StatType.DamagePercent or StatType.AttackSpeed or StatType.CritChance or StatType.Dodge); + + // 1. 修饰类型判断 + bool isPercentAdd = statModifierConfig.ModifierType == ModifierType.PercentAdd; + bool isPercentMult = statModifierConfig.ModifierType == ModifierType.PercentMult; + bool isFlat = statModifierConfig.ModifierType == ModifierType.Flat; + + // 2. UI 百分比展示裁决: + // - 任意属性的 PercentAdd 词条属于比例加成(如 攻速 +19%、伤害 +5%、移速 +15%) + // - 或属性自身在配置表中标记为百分比显示(IsPercentDisplay 为 true,如暴击率、闪避率等),其 Flat 加成应以百分比呈现(如 0.1 -> +10%) + bool shouldDisplayAsPercent = isPercentAdd || (isFlat && isPercentDisplay); + + if (shouldDisplayAsPercent) { float displayPercent = statModifierConfig.Value * 100f; return $"{name}: {sign}{displayPercent:0.##}%"; } - if (statModifierConfig.ModifierType == ModifierType.PercentMult) + if (isPercentMult) { return $"{name}: x{statModifierConfig.Value:0.##}"; } @@ -89,8 +115,8 @@ namespace SepCore.CustomUtility return null; } - return CreateWeaponDescription(weaponConfig.Attack, weaponConfig.Cooldown / 1000f, - weaponConfig.AttackRange / 1000f, weaponConfig.StatModifierConfigs, weaponConfig.Parameters); + return CreateWeaponDescription(weaponConfig.Attack, weaponConfig.Cooldown, + weaponConfig.AttackRange, weaponConfig.StatModifierConfigs, weaponConfig.Parameters); } public static string CreateWeaponDescription(WeaponBase weapon) @@ -125,7 +151,7 @@ namespace SepCore.CustomUtility } private static string CreateWeaponDescription(int attack, float cooldown, float attackRange, - IEnumerable modifiers, IReadOnlyDictionary parameters) + IEnumerable modifiers, IReadOnlyDictionary parameters) { StringBuilder sb = new StringBuilder(); sb.AppendLine($"攻击: {attack}"); @@ -152,7 +178,7 @@ namespace SepCore.CustomUtility string valStr = kvp.Key == ParamType.SectorAngle ? kvp.Value.ToString() - : (kvp.Value / 1000f).ToString("0.##"); + : kvp.Value.ToString("0.##"); sb.AppendLine($"{paramName}: {valStr}"); } diff --git a/Assets/GameMain/Scripts/Runtime/Battle/CharacterStat.cs b/Assets/GameMain/Scripts/Runtime/Battle/CharacterStat.cs index 64b414f..b756e88 100644 --- a/Assets/GameMain/Scripts/Runtime/Battle/CharacterStat.cs +++ b/Assets/GameMain/Scripts/Runtime/Battle/CharacterStat.cs @@ -13,6 +13,7 @@ namespace SepCore.Battle { private readonly List _modifiers = new(); private float _baseValue; + private bool _isBaseValueExplicitlySet; private bool _isDirty = true; private float _cachedValue; private StatConfig _config; @@ -26,6 +27,11 @@ namespace SepCore.Battle if (_config == null && GameEntry.Luban != null && GameEntry.Luban.IsReady) { _config = GameEntry.Luban.Get((int)Type); + if (!_isBaseValueExplicitlySet && _config != null) + { + _baseValue = _config.DefaultBaseValue; + _isDirty = true; + } } return _config; @@ -33,15 +39,35 @@ namespace SepCore.Battle set { _config = value; + if (!_isBaseValueExplicitlySet && _config != null) + { + _baseValue = _config.DefaultBaseValue; + } _isDirty = true; } } public float BaseValue { - get => _baseValue; + get + { + if (!_isBaseValueExplicitlySet) + { + if (Config != null) + { + _baseValue = Config.DefaultBaseValue; + } + else if (Type is StatType.DamagePercent or StatType.AttackSpeed) + { + _baseValue = 1.0f; + } + } + + return _baseValue; + } set { + _isBaseValueExplicitlySet = true; if (Math.Abs(_baseValue - value) > 1e-6f) { _baseValue = value; @@ -69,8 +95,21 @@ namespace SepCore.Battle public CharacterStat(StatType type, float baseValue = 0f, StatConfig config = null) { Type = type; - _baseValue = baseValue; _config = config; + if (Math.Abs(baseValue) > 1e-6f) + { + _baseValue = baseValue; + _isBaseValueExplicitlySet = true; + } + else if (_config != null) + { + _baseValue = _config.DefaultBaseValue; + _isBaseValueExplicitlySet = true; + } + else if (type is StatType.DamagePercent or StatType.AttackSpeed) + { + _baseValue = 1.0f; + } _isDirty = true; } @@ -154,7 +193,7 @@ namespace SepCore.Battle } } - float finalValue = ((_baseValue + sumFlat) * (1f + sumPercentAdd)) * prodPercentMult; + float finalValue = ((BaseValue + sumFlat) * (1f + sumPercentAdd)) * prodPercentMult; return ClampStat(finalValue); } diff --git a/Assets/GameMain/Scripts/Runtime/Battle/DamagePipeline.cs b/Assets/GameMain/Scripts/Runtime/Battle/DamagePipeline.cs index d32e790..e62bd2e 100644 --- a/Assets/GameMain/Scripts/Runtime/Battle/DamagePipeline.cs +++ b/Assets/GameMain/Scripts/Runtime/Battle/DamagePipeline.cs @@ -26,7 +26,15 @@ namespace SepCore.Battle float maxDodge = 0.8f; if (GameEntry.Luban != null && GameEntry.Luban.IsReady) { - maxDodge = GameEntry.Luban.Global.MaxDodgeRate / 1000f; + StatConfig dodgeConfig = GameEntry.Luban.Get((int)StatType.Dodge); + if (dodgeConfig != null && dodgeConfig.HasMax) + { + maxDodge = dodgeConfig.MaxValue; + } + else + { + maxDodge = GameEntry.Luban.Global.MaxDodgeRate / 1000f; + } } dodgeChance = Mathf.Clamp(dodgeChance, 0f, maxDodge); @@ -55,9 +63,11 @@ namespace SepCore.Battle // 3. 全局百分比增伤放大 (DamagePercent) float damagePercent = context.AttackerPipeline != null ? context.AttackerPipeline.GetValue(StatType.DamagePercent) - : 0f; - float amplifiedDamage = rawDamage * (1f + damagePercent); - amplifiedDamage = Mathf.Max(amplifiedDamage, 1f); + : 1f; + // 允许百分比降至 0,防止负向修饰(如 -100% 增伤/重度虚弱)被错误重置为 1 倍全额伤害 + damagePercent = Mathf.Max(0f, damagePercent); + float amplifiedDamage = rawDamage * damagePercent; + amplifiedDamage = Mathf.Max(amplifiedDamage, 0f); // 4. 暴击判定 (CritChance & CritMultiplier) float attackerCrit = context.AttackerPipeline != null @@ -65,12 +75,16 @@ namespace SepCore.Battle : 0f; float baseCrit = context.BaseCritChance; - if (baseCrit <= 0f && GameEntry.Luban != null && GameEntry.Luban.IsReady) + float maxCrit = 0.9f; + if (GameEntry.Luban != null && GameEntry.Luban.IsReady) { - baseCrit = GameEntry.Luban.Global.WeaponBaseCrit; + StatConfig critConfig = GameEntry.Luban.Get((int)StatType.CritChance); + if (critConfig != null && critConfig.HasMax) + { + maxCrit = critConfig.MaxValue; + } } - - float totalCritChance = Mathf.Clamp(baseCrit + attackerCrit, 0f, 0.9f); + float totalCritChance = Mathf.Clamp(baseCrit + attackerCrit, 0f, maxCrit); bool isCrit = totalCritChance > 0f && Random.value < totalCritChance; float critMultiplier = context.CritMultiplier; diff --git a/Assets/GameMain/Scripts/Runtime/Components/AbsorbComponent.cs b/Assets/GameMain/Scripts/Runtime/Components/AbsorbComponent.cs index 693bfbe..fc35bb5 100644 --- a/Assets/GameMain/Scripts/Runtime/Components/AbsorbComponent.cs +++ b/Assets/GameMain/Scripts/Runtime/Components/AbsorbComponent.cs @@ -8,13 +8,11 @@ namespace SepCore.Components private Player _player; private Transform _target; - private float AbsorbRangeBase => GameEntry.Luban.Global.DefaultAbsorbRange / 1000f; - private float AbsorbSpeed => GameEntry.Luban.Global.AbsorbSpeed / 1000f; - private float CollectDistance => GameEntry.Luban.Global.CollectDistance / 1000f; + public float AbsorbRange => GameEntry.Luban.Global.DefaultAbsorbRange; + public float AbsorbSpeed => GameEntry.Luban.Global.AbsorbSpeed; + public float CollectDistance => GameEntry.Luban.Global.CollectDistance; - private float AbsorbRange => AbsorbRangeBase; - - public void OnInit(Player player, StatComponent statComponent) + public void OnInit(Player player) { _player = player; _target = player.CachedTransform; diff --git a/Assets/GameMain/Scripts/Runtime/CustomComponent/EnemyManager/EnemyManagerComponent.cs b/Assets/GameMain/Scripts/Runtime/CustomComponent/EnemyManager/EnemyManagerComponent.cs index 4e87b5d..1b92ea0 100644 --- a/Assets/GameMain/Scripts/Runtime/CustomComponent/EnemyManager/EnemyManagerComponent.cs +++ b/Assets/GameMain/Scripts/Runtime/CustomComponent/EnemyManager/EnemyManagerComponent.cs @@ -80,8 +80,8 @@ namespace SepCore.EnemyManager _isStopped = false; _spawnEnemyMaxCount = GameEntry.Luban.Global.SpawnEnemyMaxCount; - float minDistance = GameEntry.Luban.Global.EnemySpawnDistanceMin / 1000f; - float maxDistance = GameEntry.Luban.Global.EnemySpawnDistanceMax / 1000f; + float minDistance = GameEntry.Luban.Global.EnemySpawnDistanceMin; + float maxDistance = GameEntry.Luban.Global.EnemySpawnDistanceMax; _player = player.CachedTransform; _spawnPositionStrategy = new RandomCircleSpawnStrategy(minDistance, maxDistance); diff --git a/Assets/GameMain/Scripts/Runtime/CustomComponent/Simulation/Jobs/SimulationWorld.EnemyJobs.cs b/Assets/GameMain/Scripts/Runtime/CustomComponent/Simulation/Jobs/SimulationWorld.EnemyJobs.cs index a7dc2f8..9d0f5b9 100644 --- a/Assets/GameMain/Scripts/Runtime/CustomComponent/Simulation/Jobs/SimulationWorld.EnemyJobs.cs +++ b/Assets/GameMain/Scripts/Runtime/CustomComponent/Simulation/Jobs/SimulationWorld.EnemyJobs.cs @@ -23,19 +23,19 @@ namespace SepCore.Simulation private float ResolveAbsorbRange() { if (_playerAbsorbRange >= 0f) return _playerAbsorbRange; - return GameEntry.Luban != null ? GameEntry.Luban.Global.DefaultAbsorbRange / 1000f : 2f; + return GameEntry.Luban != null ? GameEntry.Luban.Global.DefaultAbsorbRange : 2f; } private float ResolveAbsorbSpeed() { if (_playerAbsorbSpeed >= 0f) return _playerAbsorbSpeed; - return GameEntry.Luban != null ? GameEntry.Luban.Global.AbsorbSpeed / 1000f : 8f; + return GameEntry.Luban != null ? GameEntry.Luban.Global.AbsorbSpeed : 8f; } private float ResolveCollectDistance() { if (_playerCollectDistance >= 0f) return _playerCollectDistance; - return GameEntry.Luban != null ? GameEntry.Luban.Global.CollectDistance / 1000f : 0.5f; + return GameEntry.Luban != null ? GameEntry.Luban.Global.CollectDistance : 0.5f; } [Header("敌人互斥参数")] diff --git a/Assets/GameMain/Scripts/Runtime/EntityLogic/Player.cs b/Assets/GameMain/Scripts/Runtime/EntityLogic/Player.cs index 8088095..8fee5bd 100644 --- a/Assets/GameMain/Scripts/Runtime/EntityLogic/Player.cs +++ b/Assets/GameMain/Scripts/Runtime/EntityLogic/Player.cs @@ -216,7 +216,7 @@ namespace SepCore.Entity _inputComponent.OnInit(); _inputComponent.SetListening(true); - _absorbComponent.OnInit(this, _statComponent); + _absorbComponent.OnInit(this); _weaponEnabled = true; _currentLevel = 0; diff --git a/Assets/GameMain/Scripts/Runtime/EntityLogic/Weapon/WeaponBase.cs b/Assets/GameMain/Scripts/Runtime/EntityLogic/Weapon/WeaponBase.cs index b43dabe..e30184d 100644 --- a/Assets/GameMain/Scripts/Runtime/EntityLogic/Weapon/WeaponBase.cs +++ b/Assets/GameMain/Scripts/Runtime/EntityLogic/Weapon/WeaponBase.cs @@ -34,8 +34,8 @@ namespace SepCore.Entity get { if (WeaponData == null) return 0f; - float attackSpeed = _ownerAttributeProvider?.GetValue(StatType.AttackSpeed) ?? 0f; - float speedFactor = Mathf.Max(0.2f, 1f + attackSpeed); + float attackSpeed = _ownerAttributeProvider?.GetValue(StatType.AttackSpeed) ?? 1f; + float speedFactor = Mathf.Max(0.2f, attackSpeed); return Mathf.Max(0.02f, WeaponData.Cooldown / speedFactor); } } @@ -46,8 +46,7 @@ namespace SepCore.Entity { if (WeaponData == null) return 0f; float rangeBonus = _ownerAttributeProvider?.GetValue(StatType.Range) ?? 0f; - float effectiveBonus = rangeBonus >= 50f ? rangeBonus / 1000f : rangeBonus; - return Mathf.Max(0.5f, WeaponData.AttackRange + effectiveBonus); + return Mathf.Max(0.5f, WeaponData.AttackRange + rangeBonus); } } diff --git a/Assets/GameMain/Scripts/Runtime/UIBase/Shop/ShopUseCase.cs b/Assets/GameMain/Scripts/Runtime/UIBase/Shop/ShopUseCase.cs index f3bb3b6..1c9ae0a 100644 --- a/Assets/GameMain/Scripts/Runtime/UIBase/Shop/ShopUseCase.cs +++ b/Assets/GameMain/Scripts/Runtime/UIBase/Shop/ShopUseCase.cs @@ -124,7 +124,7 @@ namespace SepCore.UI _selections.Clear(); int currentLevel = _currentLevel; - float priceRandomPercent = GameEntry.Luban.Global.ShopPriceRandomPercent / 1000f; + float priceRandomPercent = GameEntry.Luban.Global.ShopPriceRandomPercent; for (int i = 0; i < finalCount; i++) { @@ -324,7 +324,7 @@ namespace SepCore.UI public int CalculateRecyclePrice(int basePrice) { - return Mathf.FloorToInt(basePrice * (GameEntry.Luban.Global.WeaponRecycleRate / 1000f)); + return Mathf.FloorToInt(basePrice * GameEntry.Luban.Global.WeaponRecycleRate); } } } diff --git a/Assets/Tests/Gameplay/EditMode/AttributePipelineTests.cs b/Assets/Tests/Gameplay/EditMode/AttributePipelineTests.cs index b935274..46048e8 100644 --- a/Assets/Tests/Gameplay/EditMode/AttributePipelineTests.cs +++ b/Assets/Tests/Gameplay/EditMode/AttributePipelineTests.cs @@ -169,5 +169,89 @@ namespace VampireLike.Tests.Gameplay.EditMode stat.Config = new StatConfig(StatType.Dodge, hasMax: true, maxValue: 0.80f); Assert.AreEqual(0.80f, stat.Value, 1e-4f); // 自动标记脏并重新钳制 } + + [Test] + public void DamagePercentAndAttackSpeed_DefaultBaseValueIsOne_AndPercentAddScalesCorrectly() + { + // 验证 DamagePercent 配置初值为 1 时,+5% 增伤(PercentAdd = 0.05)正确求值为 1.05 + var damageConfig = new StatConfig(StatType.DamagePercent, defaultBaseValue: 1.0f); + var damageStat = new CharacterStat(StatType.DamagePercent, config: damageConfig); + Assert.AreEqual(1.0f, damageStat.Value, 1e-4f); + + // 模拟“肌肉”+5% 伤害 + damageStat.AddModifier(new StatModifier(0.05f, ModifierType.PercentAdd)); + Assert.AreEqual(1.05f, damageStat.Value, 1e-4f); + + // 模拟额外叠加 +10% 增伤 + damageStat.AddModifier(new StatModifier(0.10f, ModifierType.PercentAdd)); + Assert.AreEqual(1.15f, damageStat.Value, 1e-4f); + + // 验证 AttackSpeed 配置初值为 1 时,+19% 攻速(PercentAdd = 0.19)正确求值为 1.19 + var speedConfig = new StatConfig(StatType.AttackSpeed, defaultBaseValue: 1.0f); + var speedStat = new CharacterStat(StatType.AttackSpeed, config: speedConfig); + Assert.AreEqual(1.0f, speedStat.Value, 1e-4f); + + // 模拟“疾风手套”+19% 攻速 + speedStat.AddModifier(new StatModifier(0.19f, ModifierType.PercentAdd)); + Assert.AreEqual(1.19f, speedStat.Value, 1e-4f); + + // 模拟叠加“鼻子”+5% 攻速 + speedStat.AddModifier(new StatModifier(0.05f, ModifierType.PercentAdd)); + Assert.AreEqual(1.24f, speedStat.Value, 1e-4f); + } + + [Test] + public void ItemDescUtility_FormatsDodgeCritPercentAndMoveSpeedCorrectly() + { + // 1. 闪避率(Dodge)Flat 修饰器以百分比展示: 0.1 -> +10%, 0.27 -> +27% + var dodgeMod1 = new StatModifierConfig(StatType.Dodge, 0.1f, ModifierType.Flat); + string dodgeDesc1 = SepCore.CustomUtility.ItemDescUtility.Describe(dodgeMod1); + Assert.IsTrue(dodgeDesc1.Contains("+10%"), $"Expected +10% in: {dodgeDesc1}"); + + var dodgeMod2 = new StatModifierConfig(StatType.Dodge, 0.27f, ModifierType.Flat); + string dodgeDesc2 = SepCore.CustomUtility.ItemDescUtility.Describe(dodgeMod2); + Assert.IsTrue(dodgeDesc2.Contains("+27%"), $"Expected +27% in: {dodgeDesc2}"); + + // 2. 暴击率(CritChance)Flat 修饰器以百分比展示: 0.27 -> +27%, 0.05 -> +5% + var critMod1 = new StatModifierConfig(StatType.CritChance, 0.27f, ModifierType.Flat); + string critDesc1 = SepCore.CustomUtility.ItemDescUtility.Describe(critMod1); + Assert.IsTrue(critDesc1.Contains("+27%"), $"Expected +27% in: {critDesc1}"); + + var critMod2 = new StatModifierConfig(StatType.CritChance, 0.05f, ModifierType.Flat); + string critDesc2 = SepCore.CustomUtility.ItemDescUtility.Describe(critMod2); + Assert.IsTrue(critDesc2.Contains("+5%"), $"Expected +5% in: {critDesc2}"); + + // 3. 移速(MoveSpeed)Flat 修饰器展示原小数: 0.8 -> +0.8 + var speedMod = new StatModifierConfig(StatType.MoveSpeed, 0.8f, ModifierType.Flat); + string speedDesc = SepCore.CustomUtility.ItemDescUtility.Describe(speedMod); + Assert.IsTrue(speedDesc.Contains("+0.8"), $"Expected +0.8 in: {speedDesc}"); + Assert.IsFalse(speedDesc.Contains("%"), $"Expected no % in: {speedDesc}"); + + // 4. 攻速(AttackSpeed)PercentAdd 修饰器以百分比展示: 0.19 -> +19% + var atkSpeedMod = new StatModifierConfig(StatType.AttackSpeed, 0.19f, ModifierType.PercentAdd); + string atkSpeedDesc = SepCore.CustomUtility.ItemDescUtility.Describe(atkSpeedMod); + Assert.IsTrue(atkSpeedDesc.Contains("+19%"), $"Expected +19% in: {atkSpeedDesc}"); + + // 5. 伤害(DamagePercent)PercentAdd 修饰器以百分比展示: 0.05 -> +5% + var dmgMod = new StatModifierConfig(StatType.DamagePercent, 0.05f, ModifierType.PercentAdd); + string dmgDesc = SepCore.CustomUtility.ItemDescUtility.Describe(dmgMod); + Assert.IsTrue(dmgDesc.Contains("+5%"), $"Expected +5% in: {dmgDesc}"); + + // 6. 近战伤害(MeleeDamage,非百分比属性)Flat 修饰器展示原数值: 12 -> +12,不带% + var meleeFlatMod = new StatModifierConfig(StatType.MeleeDamage, 12f, ModifierType.Flat); + string meleeFlatDesc = SepCore.CustomUtility.ItemDescUtility.Describe(meleeFlatMod); + Assert.IsTrue(meleeFlatDesc.Contains("+12"), $"Expected +12 in: {meleeFlatDesc}"); + Assert.IsFalse(meleeFlatDesc.Contains("%"), $"Expected no % in: {meleeFlatDesc}"); + + // 7. 移速(MoveSpeed)若为 PercentAdd 修饰器,以百分比展示: 0.15 -> +15% + var speedPercentMod = new StatModifierConfig(StatType.MoveSpeed, 0.15f, ModifierType.PercentAdd); + string speedPercentDesc = SepCore.CustomUtility.ItemDescUtility.Describe(speedPercentMod); + Assert.IsTrue(speedPercentDesc.Contains("+15%"), $"Expected +15% in: {speedPercentDesc}"); + + // 8. PercentMult 乘数修饰器以 x 表示: 1.25 -> x1.25 + var multMod = new StatModifierConfig(StatType.MaxHp, 1.25f, ModifierType.PercentMult); + string multDesc = SepCore.CustomUtility.ItemDescUtility.Describe(multMod); + Assert.IsTrue(multDesc.Contains("x1.25"), $"Expected x1.25 in: {multDesc}"); + } } } diff --git a/Assets/Tests/Gameplay/EditMode/DamagePipelineTests.cs b/Assets/Tests/Gameplay/EditMode/DamagePipelineTests.cs index 5be5839..be6643f 100644 --- a/Assets/Tests/Gameplay/EditMode/DamagePipelineTests.cs +++ b/Assets/Tests/Gameplay/EditMode/DamagePipelineTests.cs @@ -12,7 +12,8 @@ namespace VampireLike.Tests.Gameplay.EditMode { var attackerPipeline = new AttributePipeline(); attackerPipeline.SetBaseValue(StatType.MeleeDamage, 20f); - attackerPipeline.SetBaseValue(StatType.DamagePercent, 0.50f); // +50% + attackerPipeline.SetBaseValue(StatType.DamagePercent, 1.0f); // 基础 100% 伤害 + attackerPipeline.AddModifier(StatType.DamagePercent, new StatModifier(0.50f, ModifierType.PercentAdd)); // +50% 增伤加成 var context = new DamageContext { @@ -28,7 +29,7 @@ namespace VampireLike.Tests.Gameplay.EditMode }; // Raw = 100 + 20 = 120 - // Amplified = 120 * (1 + 0.5) = 180 + // Amplified = 120 * (1.0 * (1 + 0.5)) = 180 // Armor = 0 -> Mitigation = 1.0 -> 180 DamageResult result = DamagePipeline.Calculate(in context); Assert.AreEqual(180, result.Damage); @@ -246,19 +247,22 @@ namespace VampireLike.Tests.Gameplay.EditMode [Test] public void RangeBonus_CalculatesAttackRangeCorrectly() { - float baseRange = 5.0f; // 5m + float baseRange = 5.0f; // 5m(统一米制) - // 1. 增加 2m (direct units) + // 1. 增加 2.0m 攻击范围 -> 5.0 + 2.0 = 7.0m float bonus1 = 2.0f; - float eff1 = bonus1 >= 50f ? bonus1 / 1000f : bonus1; - float range1 = UnityEngine.Mathf.Max(0.5f, baseRange + eff1); + float range1 = UnityEngine.Mathf.Max(0.5f, baseRange + bonus1); Assert.AreEqual(7.0f, range1, 1e-4f); - // 2. 增加 1500 (millimeters) - float bonus2 = 1500f; - float eff2 = bonus2 >= 50f ? bonus2 / 1000f : bonus2; - float range2 = UnityEngine.Mathf.Max(0.5f, baseRange + eff2); - Assert.AreEqual(6.5f, range2, 1e-4f); + // 2. 减少 1.5m 攻击范围 -> 5.0 - 1.5 = 3.5m + float bonus2 = -1.5f; + float range2 = UnityEngine.Mathf.Max(0.5f, baseRange + bonus2); + Assert.AreEqual(3.5f, range2, 1e-4f); + + // 3. 极端负向减射程(-10m)触发 0.5m 最小射程保护 + float bonus3 = -10.0f; + float range3 = UnityEngine.Mathf.Max(0.5f, baseRange + bonus3); + Assert.AreEqual(0.5f, range3, 1e-4f); } [Test] @@ -312,5 +316,45 @@ namespace VampireLike.Tests.Gameplay.EditMode UnityEngine.Object.DestroyImmediate(go); } + + [Test] + public void ZeroBaseCrit_NeverProducesCriticalHit() + { + var context = new DamageContext + { + BaseDamage = 100, + BaseCritChance = 0f, + CritMultiplier = 2.0f, + FallbackDefenderArmor = 0f + }; + + for (int i = 0; i < 100; i++) + { + DamageResult result = DamagePipeline.Calculate(in context); + Assert.IsFalse(result.IsCrit, "Zero BaseCritChance should never produce a critical hit."); + Assert.AreEqual(100, result.Damage); + } + } + + [Test] + public void NegativeDamagePercent_DoesNotRevertToOneMultiplier_ScalesDownToMinDamage() + { + var attackerPipeline = new AttributePipeline(); + attackerPipeline.SetBaseValue(StatType.DamagePercent, 1.0f); + // 施加 -100% 伤害削弱(伤害倍率降为 0) + attackerPipeline.AddModifier(StatType.DamagePercent, new StatModifier(-1.0f, ModifierType.PercentAdd)); + + var context = new DamageContext + { + BaseDamage = 100, + AttackerPipeline = attackerPipeline, + FallbackDefenderArmor = 0f + }; + + DamageResult result = DamagePipeline.Calculate(in context); + // 修复前: damagePercent <= 0 会被重置为 1f,导致造成 100 满额伤害 + // 修复后: 伤害倍率为 0,最终受到全局 MinDamage(默认为 1)保底 + Assert.AreEqual(1, result.Damage, "Negative or zero damage percent must scale down to min damage (1), never bounce to full damage."); + } } } diff --git a/Assets/Tests/Gameplay/EditMode/Gameplay.EditModeTests.asmdef b/Assets/Tests/Gameplay/EditMode/Gameplay.EditModeTests.asmdef index f8988a7..f7fca60 100644 --- a/Assets/Tests/Gameplay/EditMode/Gameplay.EditModeTests.asmdef +++ b/Assets/Tests/Gameplay/EditMode/Gameplay.EditModeTests.asmdef @@ -6,7 +6,8 @@ "UnityEngine.TestRunner", "UnityEditor.TestRunner", "SepCore.Runtime", - "SepCore.Base" + "SepCore.Base", + "SepCore.Presentation" ], "includePlatforms": [ "Editor" diff --git a/数据表/Datas/EntityConfig_实体配置.xlsx b/数据表/Datas/EntityConfig_实体配置.xlsx index 64a95e2..14fb2ac 100644 Binary files a/数据表/Datas/EntityConfig_实体配置.xlsx and b/数据表/Datas/EntityConfig_实体配置.xlsx differ diff --git a/数据表/Datas/GlobalConfig_全局配置.xlsx b/数据表/Datas/GlobalConfig_全局配置.xlsx index 0e73089..4c5d7ed 100644 Binary files a/数据表/Datas/GlobalConfig_全局配置.xlsx and b/数据表/Datas/GlobalConfig_全局配置.xlsx differ diff --git a/数据表/Datas/LevelConfig_关卡配置.xlsx b/数据表/Datas/LevelConfig_关卡配置.xlsx index b73b6a2..5a47ec5 100644 Binary files a/数据表/Datas/LevelConfig_关卡配置.xlsx and b/数据表/Datas/LevelConfig_关卡配置.xlsx differ diff --git a/数据表/Datas/LevelUpRewardConfig_升级奖励配置.xlsx b/数据表/Datas/LevelUpRewardConfig_升级奖励配置.xlsx index c231cbf..81a7d7f 100644 Binary files a/数据表/Datas/LevelUpRewardConfig_升级奖励配置.xlsx and b/数据表/Datas/LevelUpRewardConfig_升级奖励配置.xlsx differ diff --git a/数据表/Datas/PropConfig_道具配置.xlsx b/数据表/Datas/PropConfig_道具配置.xlsx index be654ca..af04576 100644 Binary files a/数据表/Datas/PropConfig_道具配置.xlsx and b/数据表/Datas/PropConfig_道具配置.xlsx differ diff --git a/数据表/Datas/RoleConfig_职业配置.xlsx b/数据表/Datas/RoleConfig_职业配置.xlsx index 15f9f72..cc40d6a 100644 Binary files a/数据表/Datas/RoleConfig_职业配置.xlsx and b/数据表/Datas/RoleConfig_职业配置.xlsx differ diff --git a/数据表/Datas/StatConfig_属性边界配置.xlsx b/数据表/Datas/StatConfig_属性边界配置.xlsx new file mode 100644 index 0000000..142bd41 Binary files /dev/null and b/数据表/Datas/StatConfig_属性边界配置.xlsx differ diff --git a/数据表/Datas/WeaponConfig_武器配置.xlsx b/数据表/Datas/WeaponConfig_武器配置.xlsx index 3073538..7b466dc 100644 Binary files a/数据表/Datas/WeaponConfig_武器配置.xlsx and b/数据表/Datas/WeaponConfig_武器配置.xlsx differ diff --git a/数据表/Datas/__beans__.xlsx b/数据表/Datas/__beans__.xlsx index 786a35f..a5c069f 100644 Binary files a/数据表/Datas/__beans__.xlsx and b/数据表/Datas/__beans__.xlsx differ diff --git a/数据表/Datas/__enums__.xlsx b/数据表/Datas/__enums__.xlsx index 7d54eab..dff0a2e 100644 Binary files a/数据表/Datas/__enums__.xlsx and b/数据表/Datas/__enums__.xlsx differ diff --git a/数据表/Datas/__tables__.xlsx b/数据表/Datas/__tables__.xlsx index f7828d0..3798150 100644 Binary files a/数据表/Datas/__tables__.xlsx and b/数据表/Datas/__tables__.xlsx differ