From c61eb7fb68e9ca7a1f9b9fb5a5c4b30a78b4f8d8 Mon Sep 17 00:00:00 2001 From: basil <2428390463@qq.com> Date: Thu, 24 Sep 2026 23:03:59 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B0=83=E6=95=B4=E6=95=8C=E4=BA=BA=E7=BB=8F?= =?UTF-8?q?=E9=AA=8C=E9=85=8D=E7=BD=AE=E3=80=81=E4=BF=AE=E5=A4=8D=E7=99=BE?= =?UTF-8?q?=E5=88=86=E7=8E=87=E5=B1=9E=E6=80=A7=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../GameMain/DataTables/tbenemyconfig.bytes | Bin 410 -> 410 bytes Assets/GameMain/DataTables/tbenemyconfig.json | 14 +++++----- .../Scripts/Runtime/Battle/CharacterStat.cs | 16 ++++++++++- .../EditMode/AttributePipelineTests.cs | 25 ++++++++++++++++++ 数据表/Datas/EnemyConfig_敌人配置.xlsx | Bin 11066 -> 11074 bytes 5 files changed, 47 insertions(+), 8 deletions(-) diff --git a/Assets/GameMain/DataTables/tbenemyconfig.bytes b/Assets/GameMain/DataTables/tbenemyconfig.bytes index 766f79d61b6b254d7219c183b160497973fad085..48e58a5aa45105ba71ed70525c2f015d76377caa 100644 GIT binary patch delta 44 ucmbQmJd1gPEThOoISU{WZpJ7%vCj%foOEE6o6N;%4kVozt$}16qYME2-U_b( delta 44 wcmbQmJd1gPEF<{9 diff --git a/Assets/GameMain/DataTables/tbenemyconfig.json b/Assets/GameMain/DataTables/tbenemyconfig.json index 90c0b5c..a4f0371 100644 --- a/Assets/GameMain/DataTables/tbenemyconfig.json +++ b/Assets/GameMain/DataTables/tbenemyconfig.json @@ -9,7 +9,7 @@ "attackRange": 1.5, "speed": 3, "coinDrop": 5, - "expDrop": 1, + "expDrop": 20, "dropPercent": 0.3, "scale": 1, "color": "#44FF44", @@ -25,7 +25,7 @@ "attackRange": 8, "speed": 2.5, "coinDrop": 4, - "expDrop": 2, + "expDrop": 20, "dropPercent": 0.2, "scale": 1, "color": "#FF44FF", @@ -41,7 +41,7 @@ "attackRange": 1.2, "speed": 6, "coinDrop": 3, - "expDrop": 1, + "expDrop": 25, "dropPercent": 0.4, "scale": 0.5, "color": "#FF4444", @@ -57,7 +57,7 @@ "attackRange": 1.8, "speed": 2.5, "coinDrop": 6, - "expDrop": 2, + "expDrop": 25, "dropPercent": 0.3, "scale": 1.3, "color": "#CCCCCC", @@ -73,7 +73,7 @@ "attackRange": 2.5, "speed": 1.5, "coinDrop": 10, - "expDrop": 3, + "expDrop": 30, "dropPercent": 0.25, "scale": 2, "color": "#888888", @@ -89,7 +89,7 @@ "attackRange": 10, "speed": 3, "coinDrop": 5, - "expDrop": 2, + "expDrop": 30, "dropPercent": 0.3, "scale": 0.8, "color": "#88CCFF", @@ -105,7 +105,7 @@ "attackRange": 12, "speed": 2, "coinDrop": 8, - "expDrop": 3, + "expDrop": 30, "dropPercent": 0.2, "scale": 1.2, "color": "#FF8800", diff --git a/Assets/GameMain/Scripts/Runtime/Battle/CharacterStat.cs b/Assets/GameMain/Scripts/Runtime/Battle/CharacterStat.cs index b756e88..a457383 100644 --- a/Assets/GameMain/Scripts/Runtime/Battle/CharacterStat.cs +++ b/Assets/GameMain/Scripts/Runtime/Battle/CharacterStat.cs @@ -193,7 +193,21 @@ namespace SepCore.Battle } } - float finalValue = ((BaseValue + sumFlat) * (1f + sumPercentAdd)) * prodPercentMult; + float finalValue; + if (Type is StatType.CritChance or StatType.Dodge or StatType.LifeSteal) + { + // 概率/比率型属性(暴击率、闪避率、生命窃取):底数通常为 0~1 的小数概率。 + // 无论是 Flat(如道具填 0.27)还是 PercentAdd(如升级奖励填 0.30),本质上均为点数直接加算(+30% 概率)。 + // 若沿用标量乘法公式,由于 BaseValue 为 0,会导致 (0 + 0) * (1 + 0.30) = 0,从而百分比奖励完全失效。 + finalValue = (BaseValue + sumFlat + sumPercentAdd) * prodPercentMult; + } + else + { + // 标量属性与倍率属性(MaxHp、MoveSpeed、DamagePercent、AttackSpeed 等): + // (Base + Flat) * (1 + PercentAdd) * PercentMult + finalValue = ((BaseValue + sumFlat) * (1f + sumPercentAdd)) * prodPercentMult; + } + return ClampStat(finalValue); } diff --git a/Assets/Tests/Gameplay/EditMode/AttributePipelineTests.cs b/Assets/Tests/Gameplay/EditMode/AttributePipelineTests.cs index 46048e8..172aab5 100644 --- a/Assets/Tests/Gameplay/EditMode/AttributePipelineTests.cs +++ b/Assets/Tests/Gameplay/EditMode/AttributePipelineTests.cs @@ -253,5 +253,30 @@ namespace VampireLike.Tests.Gameplay.EditMode string multDesc = SepCore.CustomUtility.ItemDescUtility.Describe(multMod); Assert.IsTrue(multDesc.Contains("x1.25"), $"Expected x1.25 in: {multDesc}"); } + + [Test] + public void RateStats_CritChanceAndDodge_ZeroBaseValue_CorrectlyAccumulatesPercentAddModifiers() + { + var pipeline = new AttributePipeline(); + + // 1. 验证默认初值为 0 + Assert.AreEqual(0f, pipeline.GetValue(StatType.CritChance), 1e-4f); + Assert.AreEqual(0f, pipeline.GetValue(StatType.Dodge), 1e-4f); + + // 2. 模拟选了两个 +30% 暴击率奖励(即升级奖励 1015,ModifierType 为 PercentAdd 0.30) + pipeline.AddModifier(StatType.CritChance, new StatModifier(0.30f, ModifierType.PercentAdd)); + Assert.AreEqual(0.30f, pipeline.GetValue(StatType.CritChance), 1e-4f); + + pipeline.AddModifier(StatType.CritChance, new StatModifier(0.30f, ModifierType.PercentAdd)); + Assert.AreEqual(0.60f, pipeline.GetValue(StatType.CritChance), 1e-4f); // 此时暴击率应正确累加到 60% + + // 3. 模拟叠加 Flat 词条道具(如磨刀石 +27% 暴击率,ModifierType 为 Flat 0.27) + pipeline.AddModifier(StatType.CritChance, new StatModifier(0.27f, ModifierType.Flat)); + Assert.AreEqual(0.87f, pipeline.GetValue(StatType.CritChance), 1e-4f); // 0.60 + 0.27 = 0.87 + + // 4. 验证闪避率同理:0 基础值下 PercentAdd 0.15 正确累加为 15% 闪避 + pipeline.AddModifier(StatType.Dodge, new StatModifier(0.15f, ModifierType.PercentAdd)); + Assert.AreEqual(0.15f, pipeline.GetValue(StatType.Dodge), 1e-4f); + } } } diff --git a/数据表/Datas/EnemyConfig_敌人配置.xlsx b/数据表/Datas/EnemyConfig_敌人配置.xlsx index 1438ddb48de7bdffca7f5556b5ce27bbabab08a3..a0f41e14846c6edea4f882f6390852c3ec0ed30b 100644 GIT binary patch delta 2152 zcmV-u2$%P|R>D@WkpTtQ10Q2Fla>JfAQ*=4CjN(pdkbyn;+mEvYIbso$!cc2 zA$;42g%Uu!{d-y0)fqi_B=5_^^L>=_y=tOQuuitRLTN%!1e&)(>TQLd>qUHvBIlVF ztZ6k==l~AQ>Gf5~O~G3WPqsB+y#yBpl6D0*720`k3XC1!fnqKR4IRQwYZde1e`vSZ zF#gWAfHOj-Sb=APd4`X`*o;IpAO#-yi9xP6JH0NZU-#^p~L^G02V={|LUZ=BSa#IlUTH52IT@eH87_s>tKU$f@|&;bb+%%R(R1^@selfVQoe?XVmF3YJHgzi#m zug@4EiwY82z*h3_)5C4(11l)!A;LP}G&6mAnvwMQ<;N*d-n}UH!}CPdwZ5u&XE)sY z=hun)_h0s>J5`Aj=e&1<@a#?0pI)qfdHVgg$7>jUkB^?0C=}rwPt;?QTpoJ8*gbkD zC)UD?cP8Z!Mkgnse?OzwUVMo>XP*u_1wEtRANNjy4^fvG;o;!Bo)x-pC-0nO zK_V}35}JQ}^e=G{?Z>`TynW*Pe=-!7jh@P!ul;s<{6GhJ>mAuo|}uGgz}f4#(-d(LN3Ns#`z=OyM_ zoP;OKNgVa*F?HZu)O&i|`;Qg_jW+Vp^m@%lkF?RjNO5ppBYAP+>Zc_3q;8FCu8 zM-TJS^jb`V0_7{XJ(O;duAg3up<}K8ffbDNK=fJ!f9g8@&-qY#ErzBICN<#p^odKS zPp`$$kv7!F(a9(XQUmuFFG-ZI#y-b>nKR zj?2?2joGZ|q6jtoP^s!gt%{306lJZ}L86O)S=q|GSn6lqHmJ@V->3a<)1KgyOM`-&1@9Pzl*A82;8et~@@j^3j9 z)QnEU7u{|o5vSP{})>1LVQN>Vo%6b4J zo->3tjYPl+vjG7stOf+Un6@K!J2GoPz|wg;vS>$^4G64g)sCzi5SZ?!9oaS@V8E`9 z7_yF8?NF1&Q%qyG5f7D#O3%TvFbpXB=M14XClM%nvmLS8k!d?(wI19gX|^-cKob~f&DyhUp>dEPcLkmp?! zBlFBki4G~9N{Kj8N`^Q=rOA8F-=V54e+y>-MwvN7^N|b~WtEILNsYjw=}pyUDmXX0 zCC<61L6#Rx1}oE#x0H)vdiH~nD>kyy{L`eZncCMN@`lN=sP zF)vf5>M+*kD*uEqV`5(eFXv3wG2;s+L%Uou5mLQkq5)H0GqtZl#x@|s=xr%itcJ<$ zGNx+vKz2}OHJuSVSxsEcYWZ}?f1da`!>opsTO}i`zJpFQW$GAIo2jrpW=yPkIR_c0 zwP136S2G!sy<%d`Y^K(mH47krfT*G zx{_5g*}eupr%cvy-`h-v9X4ZP&9M1xdBJ48*2K9C(_S$ZkB4ifQWuBqf4gBi6!Eqc zrQIW7b{W&fZgGb1+aJpP)h>@3IG5Avsnx78v>0blc6OQ zlU^q(0rr!LCo=&Wlf5UC1=j-~V>FXhC{zLFld32{0b7&nC@=v+lN>2F0%;_ZeIy){ za49MQNt2r?K>@v!-6=W&S(6wlHUWT>PbxqH0}_*wDmwvulg%n28y3u=+j|B803sd$ e02lxO000000096X0001}lL;#;1|=r|0002C_7r*m delta 2152 zcmV-u2$%Q5R=QTOkpTr05$;|!la>J3`mLJ6SV{=Ka0>Wn^^@IubHALky*+0NA2C-|TnTOnEyl!29v(som!r`0^4qAWyV zm8csF71~2UGk$qdO2=g5;n6n^eAE!KM6!WNSD|f;j$s_+7K{i*a@ZuU8*fBRe^@@rUk{{-U!}=KL-Kx2^hpr?be(0wbAudvtYYpml&zImL zm^bhx{wAR?$NJ;;vnIZn#+`0jo+M|?y^lbqb-WW1s`?CP2k@>=4PtDols z(DVuZL8OUD8A)e)Mmzy{m;2|Z^Dj_K0|b+eC>pZ_1F``Lojo$`as~hZ9h1KVFMrT2 zw##xV7DDKr+UqlxkVQoZEnqA8_vvAPp%1K}><5E6AI(gko@OjPe)$ocw0AFx{qQ{2 zO{1%8-gy`9{qyTs|NAfd)19uxiF@9=r||5J^`Bm>e|h@-x5sN3eUFcxmuM8>9FO&5 zl3X4-op^Wj0yj3oi+3jF5JrKU(0`xNYbU-$p1V(P3QnC~w>#Cm}`t@x5zYI@c2S z*iae?Y)Ehc1kAU>3?5;pB%^fy`EqDBfL7E|9VWux(L5Z=a^qfr?Cr96p(&v zfiKEi*8=y49J&l<_Kp5fRQS&m6*uWJNcN~ahP=C%-A%`9cK6U2-u2Z_5r~i*f%;h> zI%a`-eWRy_ar^E;b~hdKVNjrK2DfjeN2K$oV}9$%=zd@Zqbv{|^M62XhyOXdm5%wX zX^Tk>xIKL0(&5uFzjbH~%u(?}F|{mJNgm2H${B6z4XwK@ zlvr3B5=)Yc#~ zuT*i8J+^oMvApKBYJZOUcWPj268*Fp$xe~BB+(_G9;5K8(Ho>_397GX@x>J{JoAA@ zNAnlhSK{ar#iwQz)7AHNIo+Ux^DF~AjlPb~UgjFT_oS0UL0VnJ#G33Oo zN{l$+REf`=m{*BAPAsa#Jtvk`!i1!*Y7ofkx(0!?ZfX$7>wmTeQHkwPu@n_k^st7C zA&x4Bs#Dbi81XC-S~Lm)CnhxrSYg#5;Kj5Vv73=u4FZ-r&B(kNS=1mfqh&L)szG45 z>tqQwfmwA7bg*e111rd`V_?P4>KIthP7TvnOEI0-ypDmzwWwoYbuH@{$n&a>fjqD4 z7|8Rcj)6RH>ll@1R!X!`;1{uLx0Atf)P&NK_8kjbp)!-R9GD|CRVI; zK!#z>nOt4dOon7HnFzyLF|pdYnQUTX-xPAmYh`4b^{r&ucuhO~R$hw_K44Yj`*o5r zWv_=&=T^bURSkAdnQY>!x0wvUNRNNwPGT*a9F%+rbDf4 z3V%_#Jp^VenKo{V?RzV`1z7PLCN{|-W;k>%OF_bM+%`|SjJdJ748=496-{$M2iN9Y zhS@E+3Z^Z&3XZI}T3zC(L+jZny<|HKVVgl^-~aF3Ej}e~=ezvCitW*c(A*{>nkWwD zJ2ZYvLBe-A-yxMLRC1R!fwrTE`z$@D)_SGDpbshtJTdK*DLR%jnYf5 z!w|$5Z6f(MU6@Xs