From b8f3fc5bcd3881ad345a105080d54bcf356a3e97 Mon Sep 17 00:00:00 2001 From: "ProjectKoi-Kalo\\Kalo" Date: Mon, 21 Jul 2025 12:33:45 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E7=88=86=E7=82=B8=E5=B0=84?= =?UTF-8?q?=E7=BA=BF=E6=AD=A6=E5=99=A8=E7=B3=BB=E7=BB=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 1.6/Assemblies/WulaFallenEmpire.dll | Bin 35840 -> 38400 bytes 1.6/Assemblies/WulaFallenEmpire.pdb | Bin 110080 -> 118272 bytes .../Weapons/WULA_ExplosiveBeamWeapons.xml | 204 ++++++++++++++ .../ThingDefs_Misc/Weapons/WULA_Weapon.xml | 2 +- .../ExplosiveBeamWeapons/开发指南.md | 259 +++++++++++++++++ .../ExplosiveBeamWeapons/测试说明.md | 157 +++++++++++ .../ExplosiveBeamWeapons/示例武器.md | 262 ++++++++++++++++++ .../ExplosiveBeamWeapons/配置说明.md | 116 ++++++++ Documentation/README.md | 30 ++ .../VerbPropertiesExplosiveBeam.cs | 49 ++++ .../Verb_ShootBeamExplosive.cs | 92 ++++++ .../WulaFallenEmpire/WulaFallenEmpire.csproj | 2 + 12 files changed, 1172 insertions(+), 1 deletion(-) create mode 100644 1.6/Defs/ThingDefs_Misc/Weapons/WULA_ExplosiveBeamWeapons.xml create mode 100644 Documentation/ExplosiveBeamWeapons/开发指南.md create mode 100644 Documentation/ExplosiveBeamWeapons/测试说明.md create mode 100644 Documentation/ExplosiveBeamWeapons/示例武器.md create mode 100644 Documentation/ExplosiveBeamWeapons/配置说明.md create mode 100644 Documentation/README.md create mode 100644 Source/WulaFallenEmpire/VerbPropertiesExplosiveBeam.cs create mode 100644 Source/WulaFallenEmpire/Verb_ShootBeamExplosive.cs diff --git a/1.6/Assemblies/WulaFallenEmpire.dll b/1.6/Assemblies/WulaFallenEmpire.dll index 83d99d5500f28e0a9ea748a731658066591f9d04..372405ab146b3274c338c2d245a8c845a6dc3e33 100644 GIT binary patch delta 14064 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 PRM4-*yZtNHSfKw8MayGX diff --git a/1.6/Assemblies/WulaFallenEmpire.pdb b/1.6/Assemblies/WulaFallenEmpire.pdb index 071f63bb5ebf12148532d8b7cf9dcebacdef61f1..bfb305f9627fcbfd3c844b2da4fd439c2f8317b8 100644 GIT binary patch delta 9396 zcmeHNd32OTwy)bsnsm|$=@7D$?(CsSAPHF@WCtY5lCTOi4WN!V!ib0tJP;ih76%Y~>_i_jj(NZP_18&Ye7>lV5- zVRlL2_e6-ZqobpztK2E(*1-NI`LEs3&y(~&$sqmp`&JF@@z?vb>F+;T9p3vpd&1*irew@Ws{ht7_*ia!9(PGv!b@JO1en$A2r+01i=Fs`x+ffW&Q>~*UgIW8q|Hkbxs6j#BF z16EmEpBT4>%nyKn^j6_{w+J7F@PsuUMvP?)v&n?Xb_2+?BRR6+w@an>lt^=9ckHMGaB#3VCSM_!pn98 z$Q}Dyj6B(MQLR3kg5!+U@(Mwi1C&&W_3k}Pyt^S9;Hx&05c5MRNH5G)|rc)+U(AVH7*HVc7_tjO^2oWqi zEPS|^0xUZ?N=`c)V+j;-mWenswT}Mds}?SpDP(g+wtQ>9x!#7&b9F+Uod=^~5N|3H zjNgfaAYeC6UJzKFGYk}3Ic=bUpoyTpK+{3d);Sn71hfz|9CQR|1n4->NKhy)um;Ww zA?k$<8JK~H2E_!}W}FX$qEqKeP?(~#0kkiu0__L79yA&B1xjyz(aYjW(dWcmC-o7{Y))PP$5L*X*$lSr>RwA&!*@P|!DZN@sZ z^o*7XNAqEej-%NI&*;|mNBzlb2c!iEC05LCNQ54J`# zLa;=QqjuqZbQXh?#Y1$j>vXg1nQMi7b5dqK9IEg%!k$2>H#t`rMjMt}f{9&3j&9tG z*&!m0)hXvEVH$6DO=Irt*^V0B%~vfzJsWxn6tJNUw{y#~Ufe#$r8A3SuCBYIYC&05 zEtlQO>q5-xk{RllKObctU%{d1z<$blw3> z*}x8gLTQ}AsSM5z6!c_x{15a5dgCQX*O%Y~M&X3x(V6Z>KmP9Xjk#CVI)+u&Rmy_p zDRv%%+q?b4F#WR8eU;Y7WXRZ~}s5k()41_czU|DXqTUzG!s%OjQv(3t1 zy!4ZHwgXX4LYdEa7HDr!UJ|Y!3Cd@F6eyqh@t~og_khArIN>KXA21b^&;ATh%-zYS z$`9)MiG|>>fAPn-N%i<)H^E8-Vxay&mX>D$Ke!QY$kXt~-ncfMIt_=7>_={lWWyj3 z(fkTe3j5{cX|jLmKDl_5;Y&0>lLddI&5Au3JDeO)J1A?8q@_|hB$`cM1e)S?-E4Y?pmbNT@ z*d9L|7EUhyYzS8Zaa!5EBD^Iod!bG{@&qrJ8zRA;v=xC}IC(|jhMhQJqP$Zfs|fQG z6FZlfm&vXfAc>x`aa^w)Urn@sr$6M-fs+jw2D7OE76WU6ZNLHG6mZ?rSd`Fo%w}8y zn{>v=gkyFC$e4;3W&5#6^HOj($GFaybYJRA zUL_LQnvNA`0!(!}$4}>Y%7!zcefX><0foREzzMtp>;}$C%ehO9WuuzT+RXDX+E%Rx zcL;aZV%Ta$(6ETf6XU|=<+G7ScHhZCjYSt*zFkGeVJJ;Tsix_?w-=m{m?{0v4~5KN4@n{}xN1Eu}K zB>SDX1DSnJr>9|5Tpq4>G6hGQ%V8v&E==?3tGAv=^2UW}cdpZ=Q{W|8Y6>D6rtg|u zbfezuSKu+f*)6a4`W2!e=Koc0ycpv1kzPvy^7j`X3qR-9RBwDp?`%t;9Cv9_V5KhI zs88%%plrFcz+efKF_*I}qhUeZbBZqYkgU9%UH*e!N<$UbKCVk`(ffE8$CvpgeI8Tw zA&2YjQgl`J>g}G=<$7D>x0mlQP>@W&l21G3gI5O7Lb>ruF4^R+V- z_8y!9P_St^Sd#2>HI&^)A>fpGS3^v;N01G`KRNYkgctLLTy{0o1g-d$;zW3THQ2|- zeD2pKe|L2fS856UT?;VugWzCe2UC&o> zzLadqn#Gr#OOh|gXn4}tuxMQ}JGHBJu~xfbN)Rq+T;6@P&NZf6IIZ>mA8z-r zRppw=+}7Yl=RGJ+Ei+MwPn<3|C{3+5Q9kwIx6A-l=tm~XR>3}$?ibii=`c0cM7<)y z^j4X-%qc?TN_wi7y5EO_mDz{94Vkml0(3|jYL^d9s}JwiSE#r-sCDa)O~wW4T9!=Q zs8M#V7F$}V(88{AE$-qSa5r*Q>Wy$?yC-`}Yvg*1xn*5E zU3O5{F0jI}a_{xnuvqu9&*-Xc=UP?iOWmsP>#ClKS;b0hVNy4(G^V?+nO(w1SXliD zeMNK*<={^dU1k-jZ-L!Rff125G(B#di5rufn7rLp^aPU zTL^`94wrGWsarKux4M;?q3-gdH=4`5X^lUb!-tE6r|-aHdIZKSgr8dhAI)*x9+OJ& zr(E9{Va7n5PVonrboGKiOmj>C`KS~ARO6ee1uv46UbIXe8OyYZk~2Q;C68MTtrU(mdaMv6}lsn!rQGskB}+ zocgL?^`crzQ2))OpPC*-OFUA<| z(LnWDF#U?+Rcr{_=O`5d&9YQS2t7(k>d{bIVlEUV@O+%A4Qhcu#oGA$*w1`d6KNTl zMMVQMGE`###hZtS9j<0#5NYk=e&M^C7&d%Zdhwu)VOm>CRUM&JPr0f-45V0fgwZot z#b?5yt4&!WF`I%28t*Yw98l4blqYu=o75K(G?b#b_8E#*TO;Y;DNhaQL;pra>b*WF zWvkLC`ZFcB4Ybl|Z*r*Ri4+pealZR;7@}*;gg2NY-bhW%i(}QEt}K7j*ruLGW3O|_ z`lu_&)?Y&w4p~e1FwvQ~pBt#-#|cGbqHDQYuQktE+$d1SC|bC5>?a}62-_yxv~|=zNBUA zJ)?1vaJNXvb|z*yW3<p1RyudA+WHM!HqSi~%x zL5fw&`;s*xJRVOrgNubv(;b{+nt<89*_TFm#o{#+r!01ufXz;Us>DulK6YG(N6~6p z54Ffn>Bc?Sy>?^U%XWIG$1i;Yc75Zurqit8pFauOS7fzsHHEZ2mriC{lR=S&^`^F{ z3|ige|N8R$P6plci(i&^XHdEPk2~|!r6F{#C*Q6K0MGiJGac%iT$(a97c*cp`4(YE zDCicHBSCrZ{6Q-r&7sjcTn~6>ix{i`-pd@%Yo_};%CJ=NpE&T$i-sKUQ366)t9mMr zYMaY^D5V6fB;aLuMcg?eKG8*y)lv*>kv~x5mJmrQEuTiJ!hABTrTH{J^GE112-ps^ zLtqee(!wQ-wGVj?%^H9@-Q`w8fgb9EO%y>MYIFe&i2n^*JqtVsJP)h~UH~=#8-W)A zPxbgFvRa^+rYWA={L~ix)aC-Z+l%LDZS#AD`jN^gqEIisfR?GTMHJ$<0@+7_mB3>v zrGR1^hn0D4M(Ncy%d7MkYKbZd{fGYf;*ERB+vvkK%qct`ANem*)4%>l{@d@n+wZ&E z?>o5YfBgIIpBcoq9bQOF47a1$pZV+X?I>2e!fuUJZ%45l{r(f8*e0qlR^qeK`$qM0 z6ZQ8^gEQF)SiL*{E5w4fb&{@m{Zgd*|His)`2P%%21K!*;fGF4`~<<7$TdE*^ZN~F zMm_u5iSN!fg?;cZ7Ts<`^!oQixAlKdbgRXdSko_nF9H5gd<-}aoB*JU_ye#H_yE`s zdJ_0@l{sK0)4mxmL>l$6RkGD delta 6075 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 T(EppY&7 + + + + + WULA_LightExplosiveBeam + + 乌拉帝国的轻型爆炸射线武器,每发射线都会在目标位置产生小型爆炸。适合对付轻装甲目标。 + Ultra + + Wula/Weapon/WULA_RW_Fractal_AR + Graphic_Single + 1.35 + + Interact_ChargeRifle + +

  • LongShots
  • +
  • RangedHeavy
  • + + + 15000 + 2.8 + 0.6 + 0.85 + 0.7 + 0.45 + 1.2 + + + 120 + 25 + 2 + + +
  • + WulaFallenEmpire.Verb_ShootBeamExplosive + true + 0.3 + 25 + 4 + 8 + 2 + Burn + BeamGraser_Shooting + Mote_GraserBeamBase + + + true + 1 + 1.8 + Flame + 15 + Explosion_Small + 0.6 +
  • +
    + + +
  • WULA_Cube_Productor_Energy
  • +
    + WULA_Synth_Weapon_2_Stun_Technology + + 4 + +
    + + + + + WULA_HeavyExplosiveBeam + + 乌拉帝国的重型爆炸射线武器,每三发射线会触发一次大威力爆炸,并在爆炸区域留下燃料污渍。 + Ultra + + Wula/Weapon/WULA_RW_Fractal_AR + Graphic_Single + 1.75 + + Interact_ChargeRifle + +
  • LongShots
  • +
  • RangedHeavy
  • +
    + + 35000 + 4.2 + 0.45 + 0.8 + 0.65 + 0.4 + 2.1 + + + 200 + 60 + 6 + 15 + + +
  • + WulaFallenEmpire.Verb_ShootBeamExplosive + true + 0.8 + 35 + 9 + 5 + 4 + Stun + BeamGraser_Shooting + Mote_GraserBeamBase + GraserBeam_End + + + true + 3 + 3.2 + Bomb + 35 + 0.4 + Explosion_Bomb + 0.4 + Filth_Fuel + 0.25 + 2 +
  • +
    + + +
  • WULA_Cube_Productor_Energy
  • +
    + WULA_Synth_Weapon_2_Stun_Technology + + 6 + +
    +
    + + + + WULA_ToxicExplosiveBeam + + 乌拉帝国的毒气射线武器,每两发射线会触发毒气爆炸,在目标区域释放有毒气体。 + Ultra + + Wula/Weapon/WULA_RW_Fractal_AR + Graphic_Single + 1.55 + + Interact_ChargeRifle + +
  • LongShots
  • +
  • RangedHeavy
  • +
    + + 28000 + 3.6 + 0.55 + 0.85 + 0.7 + 0.5 + 1.8 + + + 150 + 40 + 4 + 25 + + +
  • + WulaFallenEmpire.Verb_ShootBeamExplosive + true + 0.6 + 28 + 6 + 7 + 2.5 + ToxGas + BeamGraser_Shooting + Mote_GraserBeamBase + + + true + 2 + 2.8 + ToxGas + 20 + Explosion_Gas + ToxGas + 0.1 +
  • +
    + + +
  • WULA_Cube_Productor_Energy
  • +
    + WULA_Synth_Weapon_2_Stun_Technology + + 5 + +
    +
    + + \ No newline at end of file diff --git a/1.6/Defs/ThingDefs_Misc/Weapons/WULA_Weapon.xml b/1.6/Defs/ThingDefs_Misc/Weapons/WULA_Weapon.xml index e283cf9d..80fe6956 100644 --- a/1.6/Defs/ThingDefs_Misc/Weapons/WULA_Weapon.xml +++ b/1.6/Defs/ThingDefs_Misc/Weapons/WULA_Weapon.xml @@ -1,4 +1,4 @@ - + diff --git a/Documentation/ExplosiveBeamWeapons/开发指南.md b/Documentation/ExplosiveBeamWeapons/开发指南.md new file mode 100644 index 00000000..de01f3b0 --- /dev/null +++ b/Documentation/ExplosiveBeamWeapons/开发指南.md @@ -0,0 +1,259 @@ +# 爆炸射线武器开发指南 + +## 架构概述 + +爆炸射线武器系统基于RimWorld原版的射线武器系统,通过继承和扩展实现爆炸功能。 + +### 核心类结构 + +``` +Verb (RimWorld原版) +└── Verb_ShootBeam (RimWorld原版) + └── Verb_ShootBeamExplosive (自定义) + +VerbProperties (RimWorld原版) +└── VerbPropertiesExplosiveBeam (自定义) +``` + +## 代码架构 + +### 1. Verb_ShootBeamExplosive.cs + +#### 核心字段 +```csharp +private int explosionShotCounter = 0; // 爆炸计数器 +``` + +#### 关键方法 +- `TryCastShot()`: 重写射击方法,添加爆炸逻辑 +- `TriggerExplosion()`: 触发爆炸的核心方法 +- `ExposeData()`: 保存/加载数据 + +#### 工作流程 +1. 调用基类的 `TryCastShot()` +2. 如果射击成功且启用爆炸,递增计数器 +3. 当计数器达到间隔值时,触发爆炸并重置计数器 + +### 2. VerbPropertiesExplosiveBeam.cs + +#### 配置属性分类 +- **基础控制**: `enableExplosion`, `explosionShotInterval` +- **伤害属性**: `explosionRadius`, `explosionDamage`, `explosionDamageDef` +- **效果属性**: `explosionSound`, `explosionEffecter` +- **后续效果**: `postExplosionSpawn*`, `postExplosionGasType` + +## 扩展开发 + +### 添加新的爆炸类型 + +1. **在VerbPropertiesExplosiveBeam中添加新属性** +```csharp +public bool enableChainExplosion = false; +public int chainExplosionCount = 3; +public float chainExplosionDelay = 0.5f; +``` + +2. **在Verb_ShootBeamExplosive中实现逻辑** +```csharp +private void TriggerChainExplosion(VerbPropertiesExplosiveBeam props) +{ + // 实现连锁爆炸逻辑 +} +``` + +### 添加条件爆炸 + +```csharp +// 基于目标类型的条件爆炸 +private bool ShouldExplodeForTarget(Thing target) +{ + if (target is Pawn pawn) + { + return pawn.RaceProps.Humanlike; + } + return true; +} +``` + +### 添加爆炸延迟 + +```csharp +private void ScheduleDelayedExplosion(IntVec3 pos, float delay) +{ + Find.TickManager.ScheduleCallback(() => { + TriggerExplosion(explosiveProps); + }, (int)(delay * 60)); // 转换为ticks +} +``` + +## 性能优化 + +### 1. 爆炸频率控制 +- 避免每发都爆炸的设计 +- 使用合理的 `explosionShotInterval` +- 考虑武器的射速和爆炸威力平衡 + +### 2. 效果缓存 +```csharp +private static Dictionary cachedEffecters = new Dictionary(); + +private Effecter GetCachedEffecter(EffecterDef def) +{ + string key = def.defName; + if (!cachedEffecters.ContainsKey(key)) + { + cachedEffecters[key] = def.Spawn(); + } + return cachedEffecters[key]; +} +``` + +### 3. 范围检查优化 +```csharp +private bool IsValidExplosionPosition(IntVec3 pos) +{ + return pos.InBounds(caster.Map) && + pos.GetThingList(caster.Map).Any(t => t.def.category == ThingCategory.Pawn); +} +``` + +## 调试技巧 + +### 1. 日志输出 +```csharp +if (Prefs.DevMode) +{ + Log.Message($"[ExplosiveBeam] Shot {explosionShotCounter}/{explosiveProps.explosionShotInterval}"); +} +``` + +### 2. 可视化调试 +```csharp +if (DebugSettings.godMode) +{ + // 在爆炸位置显示调试信息 + MoteMaker.ThrowText(explosionCell.ToVector3(), caster.Map, + $"Explosion: {explosiveProps.explosionDamage}", Color.red); +} +``` + +### 3. 性能监控 +```csharp +private static Stopwatch explosionTimer = new Stopwatch(); + +private void TriggerExplosion(VerbPropertiesExplosiveBeam explosiveProps) +{ + explosionTimer.Start(); + // ... 爆炸逻辑 + explosionTimer.Stop(); + + if (explosionTimer.ElapsedMilliseconds > 5) + { + Log.Warning($"Explosion took {explosionTimer.ElapsedMilliseconds}ms"); + } + explosionTimer.Reset(); +} +``` + +## 兼容性考虑 + +### 1. 模组兼容性 +- 使用命名空间避免冲突 +- 检查其他模组的Harmony补丁 +- 提供配置选项禁用功能 + +### 2. 版本兼容性 +```csharp +#if VERSION_1_4 + // 1.4版本特定代码 +#elif VERSION_1_5 + // 1.5版本特定代码 +#endif +``` + +### 3. 保存兼容性 +```csharp +public override void ExposeData() +{ + base.ExposeData(); + + // 向后兼容的数据保存 + if (Scribe.mode == LoadSaveMode.LoadingVars) + { + // 处理旧版本数据 + } + + Scribe_Values.Look(ref explosionShotCounter, "explosionShotCounter", 0); +} +``` + +## 测试框架 + +### 单元测试示例 +```csharp +[Test] +public void TestExplosionInterval() +{ + var verb = new Verb_ShootBeamExplosive(); + var props = new VerbPropertiesExplosiveBeam + { + enableExplosion = true, + explosionShotInterval = 3 + }; + + // 模拟3次射击 + for (int i = 0; i < 3; i++) + { + bool shouldExplode = (i == 2); // 第3发应该爆炸 + Assert.AreEqual(shouldExplode, verb.ShouldTriggerExplosion()); + } +} +``` + +## 最佳实践 + +### 1. 配置验证 +```csharp +public override void PostLoad() +{ + base.PostLoad(); + + if (explosionShotInterval <= 0) + { + Log.Error($"Invalid explosionShotInterval: {explosionShotInterval}"); + explosionShotInterval = 1; + } + + if (explosionRadius < 0) + { + Log.Warning($"Negative explosion radius: {explosionRadius}"); + explosionRadius = 0; + } +} +``` + +### 2. 错误处理 +```csharp +private void TriggerExplosion(VerbPropertiesExplosiveBeam explosiveProps) +{ + try + { + // 爆炸逻辑 + } + catch (Exception e) + { + Log.Error($"Error in explosion: {e}"); + // 优雅降级,不影响基础射击功能 + } +} +``` + +### 3. 资源管理 +```csharp +public override void Destroy(DestroyMode mode = DestroyMode.Vanish) +{ + // 清理资源 + cachedEffecters.Clear(); + base.Destroy(mode); +} +``` \ No newline at end of file diff --git a/Documentation/ExplosiveBeamWeapons/测试说明.md b/Documentation/ExplosiveBeamWeapons/测试说明.md new file mode 100644 index 00000000..17acf3e8 --- /dev/null +++ b/Documentation/ExplosiveBeamWeapons/测试说明.md @@ -0,0 +1,157 @@ +# 爆炸射线武器测试说明 + +## 已实现的功能 + +### 1. 核心功能 +- ✅ 继承自原版 Verb_ShootBeam 的所有功能 +- ✅ 可配置的爆炸触发间隔 +- ✅ 可配置的爆炸伤害、范围、类型 +- ✅ 可配置的音效和特效 +- ✅ 可配置的爆炸后效果(生成物品、气体等) + +### 2. 配置选项 +- `enableExplosion`: 爆炸开关 +- `explosionShotInterval`: 爆炸间隔(每x发触发一次) +- `explosionRadius`: 爆炸半径 +- `explosionDamageDef`: 爆炸伤害类型 +- `explosionDamage`: 爆炸伤害值 +- `explosionSound`: 爆炸音效 +- `chanceToStartFire`: 点燃概率 +- `postExplosionSpawnThingDef`: 爆炸后生成物品 + +### 3. 示例武器 +已创建三个示例武器: +1. **CLa-15"蓝爆"轻型**: 每发都爆炸,火焰伤害 +2. **CLa-16"蓝爆"重型**: 每3发爆炸,炸弹伤害+燃料污渍 +3. **CLa-17"蓝毒"**: 每2发爆炸,毒气伤害+毒气云 + +## 测试步骤 + +### 1. 编译测试 +```bash +dotnet build "Source\WulaFallenEmpire\WulaFallenEmpire.csproj" +``` +✅ 编译成功 + +### 2. 游戏内测试准备 +1. 启动RimWorld +2. 启用开发者模式 (Options -> Dev mode) +3. 加载包含此模组的存档或创建新游戏 +4. 按 `~` 键打开开发者控制台 + +### 3. 生成测试武器 +使用以下命令生成测试武器: +``` +Thing.Spawn WULA_RW_Fractal_AR 1 +Thing.Spawn WULA_LightExplosiveBeam 1 +Thing.Spawn WULA_HeavyExplosiveBeam 1 +Thing.Spawn WULA_ToxicExplosiveBeam 1 +``` + +### 4. 功能验证清单 + +#### 基础射线功能 +- [ ] 射线正常发射和显示 +- [ ] 射线宽度和颜色正确 +- [ ] 射线伤害正常造成 +- [ ] 音效和视觉效果正常 + +#### 爆炸功能 +- [ ] 爆炸按配置间隔触发 +- [ ] 爆炸位置在射线命中点 +- [ ] 爆炸半径和伤害正确 +- [ ] 爆炸音效正常播放 +- [ ] 爆炸视觉效果正常 + +#### 特殊效果 +- [ ] 点燃效果正常工作 +- [ ] 爆炸后生成物品(燃料污渍等) +- [ ] 毒气云正常生成和扩散 +- [ ] 护甲穿透计算正确 + +### 5. 性能测试 +- [ ] 连续射击时帧率稳定 +- [ ] 多个单位同时使用时无卡顿 +- [ ] 内存使用正常,无内存泄漏 + +### 6. 平衡性测试 +- [ ] 武器伤害与成本匹配 +- [ ] 爆炸威力不会过于强大 +- [ ] AI正确使用武器 +- [ ] 友伤风险合理 + +## 测试场景 + +### 场景1:单目标测试 +1. 生成一个敌对的人形目标 +2. 装备测试武器 +3. 射击并观察: + - 射线效果 + - 爆炸触发时机 + - 伤害数值 + - 特殊效果 + +### 场景2:群体目标测试 +1. 生成多个敌对目标(5-10个) +2. 测试爆炸范围伤害 +3. 观察连锁效果(点燃、毒气扩散等) + +### 场景3:建筑物测试 +1. 建造一些墙壁和家具 +2. 测试爆炸对建筑物的影响 +3. 验证射线穿透和爆炸破坏 + +### 场景4:友军测试 +1. 在友军附近使用武器 +2. 验证友伤机制 +3. 测试AI的使用策略 + +## 常见问题排查 + +### 问题1:爆炸不触发 +- 检查 `enableExplosion` 是否为 true +- 检查 `explosionShotInterval` 设置 +- 确认射击确实命中目标 + +### 问题2:爆炸位置错误 +- 检查射线的 `InterpolatedPosition` 计算 +- 确认目标位置在地图范围内 + +### 问题3:音效不播放 +- 检查 `explosionSound` 定义是否正确 +- 确认音效文件存在 + +### 问题4:特效不显示 +- 检查 `explosionEffecter` 定义 +- 确认特效资源文件存在 + +## 调试工具 + +### 开发者命令 +``` +# 生成特定武器 +Thing.Spawn [武器DefName] [数量] + +# 生成敌对目标 +Pawn.Spawn Raider 5 + +# 治疗所有伤害 +Heal.All + +# 清除所有火焰 +Fire.Clear +``` + +### 日志监控 +监控游戏日志文件中的错误信息: +- `Player.log` (Windows) +- 搜索 "WulaFallenEmpire" 相关错误 + +## 报告问题 + +如果发现问题,请记录: +1. 具体的复现步骤 +2. 预期行为 vs 实际行为 +3. 相关的日志错误信息 +4. 游戏版本和模组版本 +5. 其他加载的模组列表 \ No newline at end of file diff --git a/Documentation/ExplosiveBeamWeapons/示例武器.md b/Documentation/ExplosiveBeamWeapons/示例武器.md new file mode 100644 index 00000000..eb615367 --- /dev/null +++ b/Documentation/ExplosiveBeamWeapons/示例武器.md @@ -0,0 +1,262 @@ +# 爆炸射线武器示例 + +本文档展示了不同类型的爆炸射线武器配置示例,涵盖各种使用场景。 + +## 基础示例 + +### 1. 简单爆炸射线 +最基础的爆炸射线武器配置: + +```xml + +
  • + WulaFallenEmpire.Verb_ShootBeamExplosive + true + 25 + 3 + 2 + Burn + + + true + 1 + 2.0 + Bomb + 20 +
  • +
    +``` + +## 进阶示例 + +### 2. 延迟爆炸射线 +每3发触发一次大威力爆炸: + +```xml + +
  • + WulaFallenEmpire.Verb_ShootBeamExplosive + true + 0.8 + 30 + 9 + 5 + 3 + Stun + + + true + 3 + 3.5 + Bomb + 40 + 0.5 + Explosion_Bomb + 0.4 +
  • +
    +``` + +### 3. 火焰爆炸射线 +专注于点燃和火焰伤害: + +```xml + +
  • + WulaFallenEmpire.Verb_ShootBeamExplosive + true + 28 + 6 + 2.5 + Flame + + + true + 2 + 2.8 + Flame + 25 + Explosion_Fire + 0.8 + Filth_Fuel + 0.3 + 3 +
  • +
    +``` + +## 特殊效果示例 + +### 4. 毒气爆炸射线 +产生毒气云的射线武器: + +```xml + +
  • + WulaFallenEmpire.Verb_ShootBeamExplosive + true + 26 + 4 + 2 + ToxGas + + + true + 2 + 3.0 + ToxGas + 18 + Explosion_Gas + ToxGas + 0.1 +
  • +
    +``` + +### 5. 冰冻爆炸射线 +造成冰冻效果的射线武器: + +```xml + +
  • + WulaFallenEmpire.Verb_ShootBeamExplosive + true + 24 + 5 + 2.2 + Frostbite + + + true + 2 + 2.5 + Frostbite + 22 + Explosion_Ice + 0.0 + Filth_Water + 0.4 +
  • +
    +``` + +## 高级配置示例 + +### 6. 多效果爆炸射线 +结合多种效果的复杂武器: + +```xml + +
  • + WulaFallenEmpire.Verb_ShootBeamExplosive + true + 1.2 + 35 + 12 + 4 + 4 + Bomb + + + true + 4 + 4.0 + Bomb + 50 + 0.6 + Explosion_Bomb + + + 0.5 + Filth_Fuel + 0.3 + 4 + Mote_ExplosionFlash + 1.0 + BlindSmoke +
  • +
    +``` + +### 7. 精确爆炸射线 +高精度、低频率爆炸的狙击型武器: + +```xml + +
  • + WulaFallenEmpire.Verb_ShootBeamExplosive + true + 2.0 + 45 + 1 + 1 + Bullet + 0.05 + + + true + 1 + 2.2 + Bomb + 60 + 0.8 + Explosion_Sharp + false +
  • +
    +``` + +## 平衡性考虑 + +### 轻型武器平衡 +- 爆炸半径:1.5-2.5 +- 爆炸伤害:15-25 +- 射击间隔:1-2发 +- 成本:低-中等 + +### 中型武器平衡 +- 爆炸半径:2.5-3.5 +- 爆炸伤害:25-40 +- 射击间隔:2-3发 +- 成本:中等-高 + +### 重型武器平衡 +- 爆炸半径:3.5-5.0 +- 爆炸伤害:40-70 +- 射击间隔:3-5发 +- 成本:高-极高 + +## 使用建议 + +### 1. 近战防御武器 +```xml + +15 +1 +3.0 +``` + +### 2. 中距离支援武器 +```xml + +28 +2 +2.5 +``` + +### 3. 远程狙击武器 +```xml + +40 +1 +2.0 +50 +``` + +### 4. 区域控制武器 +```xml + +4.0 +BlindSmoke +0.6 +``` \ No newline at end of file diff --git a/Documentation/ExplosiveBeamWeapons/配置说明.md b/Documentation/ExplosiveBeamWeapons/配置说明.md new file mode 100644 index 00000000..b606c587 --- /dev/null +++ b/Documentation/ExplosiveBeamWeapons/配置说明.md @@ -0,0 +1,116 @@ +# 爆炸射线武器配置说明 + +## 概述 +新的 `Verb_ShootBeamExplosive` 类扩展了原版的 `Verb_ShootBeam`,添加了可配置的爆炸效果。 + +## 配置属性 + +### 基础爆炸控制 +- `enableExplosion` (bool): 是否启用爆炸效果,默认 false +- `explosionShotInterval` (int): 每x发射击触发一次爆炸,默认 1 + +### 爆炸伤害属性 +- `explosionRadius` (float): 爆炸半径,默认 2.9 +- `explosionDamageDef` (DamageDef): 爆炸伤害类型,null时使用 Bomb +- `explosionDamage` (int): 爆炸伤害值,-1时使用武器默认伤害 +- `explosionArmorPenetration` (float): 爆炸护甲穿透,-1时使用武器默认值 + +### 音效和特效 +- `explosionSound` (SoundDef): 爆炸音效 +- `explosionEffecter` (EffecterDef): 爆炸特效 + +### 爆炸后效果 +- `postExplosionSpawnThingDef` (ThingDef): 爆炸后生成的物品 +- `postExplosionSpawnChance` (float): 生成概率 (0-1) +- `postExplosionSpawnThingCount` (int): 生成数量 + +### 爆炸前效果 +- `preExplosionSpawnThingDef` (ThingDef): 爆炸前生成的物品 +- `preExplosionSpawnChance` (float): 生成概率 (0-1) +- `preExplosionSpawnThingCount` (int): 生成数量 + +### 其他属性 +- `postExplosionGasType` (GasType?): 爆炸后的气体类型 +- `applyDamageToExplosionCellsNeighbors` (bool): 是否对邻近格子造成伤害 +- `chanceToStartFire` (float): 点燃概率 (0-1) +- `damageFalloff` (bool): 是否有伤害衰减 + +## 使用示例 + +```xml + +
  • + WulaFallenEmpire.Verb_ShootBeamExplosive + + + true + 0.5 + 30 + 6 + 3 + Stun + + + true + 3 + 2.5 + Bomb + 25 + Explosion_Bomb + 0.3 + Filth_Fuel + 0.15 +
  • +
    +``` + +## 工作原理 + +1. 武器正常进行射线攻击 +2. 每次成功射击后,计数器递增 +3. 当计数器达到 `explosionShotInterval` 时: + - 在当前射线位置触发爆炸 + - 播放爆炸音效和特效 + - 重置计数器 +4. 爆炸使用配置的参数进行伤害计算 + +## 注意事项 + +- 爆炸位置基于射线的插值位置 +- 如果爆炸位置超出地图边界,爆炸不会触发 +- 音效和特效是可选的,可以设置为 null +- 伤害值为 -1 时会尝试使用武器的默认伤害 +- 这个功能完全向后兼容,不启用爆炸时行为与原版相同 + +## 配置模板 + +### 轻型爆炸武器 +```xml +true +1 +1.8 +Flame +15 +0.6 +``` + +### 重型爆炸武器 +```xml +true +3 +3.2 +Bomb +35 +0.4 +Filth_Fuel +0.25 +``` + +### 毒气武器 +```xml +true +2 +2.8 +ToxGas +ToxGas +``` \ No newline at end of file diff --git a/Documentation/README.md b/Documentation/README.md new file mode 100644 index 00000000..b2215cde --- /dev/null +++ b/Documentation/README.md @@ -0,0 +1,30 @@ +# 乌拉帝国模组文档 + +本文件夹包含乌拉帝国模组的所有技术文档和说明。 + +## 文档结构 + +### 📁 ExplosiveBeamWeapons/ +爆炸射线武器系统的相关文档 +- 配置说明 +- 测试指南 +- 使用示例 + +### 📁 Features/ +各种功能特性的文档(未来扩展) + +### 📁 API/ +API文档和开发者指南(未来扩展) + +## 快速导航 + +### 爆炸射线武器系统 +- [📋 配置说明](ExplosiveBeamWeapons/配置说明.md) - 详细的配置参数说明 +- [🧪 测试指南](ExplosiveBeamWeapons/测试说明.md) - 测试步骤和验证清单 +- [👨‍💻 开发指南](ExplosiveBeamWeapons/开发指南.md) - 代码架构和扩展开发 +- [⚔️ 示例武器](ExplosiveBeamWeapons/示例武器.md) - 各种类型的武器配置示例 + +## 版本历史 + +- v1.0: 初始版本,包含基础乌拉帝国内容 +- v1.1: 添加爆炸射线武器系统 \ No newline at end of file diff --git a/Source/WulaFallenEmpire/VerbPropertiesExplosiveBeam.cs b/Source/WulaFallenEmpire/VerbPropertiesExplosiveBeam.cs new file mode 100644 index 00000000..cd033e97 --- /dev/null +++ b/Source/WulaFallenEmpire/VerbPropertiesExplosiveBeam.cs @@ -0,0 +1,49 @@ +using RimWorld; +using Verse; +using Verse.Sound; + +namespace WulaFallenEmpire +{ + public class VerbPropertiesExplosiveBeam : VerbProperties + { + // 爆炸开关 + public bool enableExplosion = false; + + // 每x个shotcount触发一次爆炸 + public int explosionShotInterval = 1; + + // 爆炸基础属性 + public float explosionRadius = 2.9f; + public DamageDef explosionDamageDef = null; // null时使用默认的Bomb + public int explosionDamage = -1; // -1时使用武器默认伤害 + public float explosionArmorPenetration = -1f; // -1时使用武器默认穿甲 + + // 爆炸音效和特效 + public SoundDef explosionSound = null; + public EffecterDef explosionEffecter = null; + + // 爆炸后生成物品 + public ThingDef postExplosionSpawnThingDef = null; + public float postExplosionSpawnChance = 0f; + public int postExplosionSpawnThingCount = 1; + + // 爆炸前生成物品 + public ThingDef preExplosionSpawnThingDef = null; + public float preExplosionSpawnChance = 0f; + public int preExplosionSpawnThingCount = 1; + + // 气体效果 + public GasType? postExplosionGasType = null; + + // 其他爆炸属性 + public bool applyDamageToExplosionCellsNeighbors = true; + public float chanceToStartFire = 0f; + public bool damageFalloff = true; + + public VerbPropertiesExplosiveBeam() + { + // 设置默认值 + verbClass = typeof(Verb_ShootBeamExplosive); + } + } +} \ No newline at end of file diff --git a/Source/WulaFallenEmpire/Verb_ShootBeamExplosive.cs b/Source/WulaFallenEmpire/Verb_ShootBeamExplosive.cs new file mode 100644 index 00000000..a10a9812 --- /dev/null +++ b/Source/WulaFallenEmpire/Verb_ShootBeamExplosive.cs @@ -0,0 +1,92 @@ +using System.Collections.Generic; +using RimWorld; +using UnityEngine; +using Verse; +using Verse.Sound; + +namespace WulaFallenEmpire +{ + public class Verb_ShootBeamExplosive : Verse.Verb_ShootBeam + { + private int explosionShotCounter = 0; + + protected override bool TryCastShot() + { + bool result = base.TryCastShot(); + + if (result && verbProps is VerbPropertiesExplosiveBeam explosiveProps && explosiveProps.enableExplosion) + { + explosionShotCounter++; + + if (explosionShotCounter >= explosiveProps.explosionShotInterval) + { + explosionShotCounter = 0; + TriggerExplosion(explosiveProps); + } + } + + return result; + } + + private void TriggerExplosion(VerbPropertiesExplosiveBeam explosiveProps) + { + Vector3 explosionPos = InterpolatedPosition; + IntVec3 explosionCell = explosionPos.ToIntVec3(); + + if (!explosionCell.InBounds(caster.Map)) + return; + + // 播放爆炸音效 + if (explosiveProps.explosionSound != null) + { + explosiveProps.explosionSound.PlayOneShot(new TargetInfo(explosionCell, caster.Map)); + } + + // 生成爆炸 + GenExplosion.DoExplosion( + center: explosionCell, + map: caster.Map, + radius: explosiveProps.explosionRadius, + damType: explosiveProps.explosionDamageDef ?? DamageDefOf.Bomb, + instigator: caster, + damAmount: explosiveProps.explosionDamage > 0 ? explosiveProps.explosionDamage : verbProps.defaultProjectile?.projectile?.GetDamageAmount(EquipmentSource) ?? 20, + armorPenetration: explosiveProps.explosionArmorPenetration >= 0 ? explosiveProps.explosionArmorPenetration : verbProps.defaultProjectile?.projectile?.GetArmorPenetration(EquipmentSource) ?? 0.3f, + explosionSound: null, // 我们已经手动播放了音效 + weapon: base.EquipmentSource?.def, + projectile: null, + intendedTarget: currentTarget.Thing, + postExplosionSpawnThingDef: explosiveProps.postExplosionSpawnThingDef, + postExplosionSpawnChance: explosiveProps.postExplosionSpawnChance, + postExplosionSpawnThingCount: explosiveProps.postExplosionSpawnThingCount, + postExplosionGasType: explosiveProps.postExplosionGasType, + applyDamageToExplosionCellsNeighbors: explosiveProps.applyDamageToExplosionCellsNeighbors, + preExplosionSpawnThingDef: explosiveProps.preExplosionSpawnThingDef, + preExplosionSpawnChance: explosiveProps.preExplosionSpawnChance, + preExplosionSpawnThingCount: explosiveProps.preExplosionSpawnThingCount, + chanceToStartFire: explosiveProps.chanceToStartFire, + damageFalloff: explosiveProps.damageFalloff, + direction: null, + ignoredThings: null, + affectedAngle: null, + doVisualEffects: true, + propagationSpeed: 0.6f, + excludeRadius: 0f, + doSoundEffects: false // 我们手动处理音效 + ); + + // 生成额外的视觉效果 + if (explosiveProps.explosionEffecter != null) + { + Effecter effecter = explosiveProps.explosionEffecter.Spawn(explosionCell, caster.Map); + effecter.Trigger(new TargetInfo(explosionCell, caster.Map), TargetInfo.Invalid); + effecter.Cleanup(); + } + } + + public override void ExposeData() + { + base.ExposeData(); + Scribe_Values.Look(ref explosionShotCounter, "explosionShotCounter", 0); + } + } +} \ No newline at end of file diff --git a/Source/WulaFallenEmpire/WulaFallenEmpire.csproj b/Source/WulaFallenEmpire/WulaFallenEmpire.csproj index 7173a617..24865da7 100644 --- a/Source/WulaFallenEmpire/WulaFallenEmpire.csproj +++ b/Source/WulaFallenEmpire/WulaFallenEmpire.csproj @@ -75,6 +75,8 @@ + +