From 4f524845a95303ffc561847be26dda24a6be1a26 Mon Sep 17 00:00:00 2001 From: "ProjectKoi-Kalo\\Kalo" Date: Tue, 22 Jul 2025 16:36:01 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A1=A5=E6=9A=82=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 1.6/Assemblies/WulaFallenEmpire.dll | Bin 54272 -> 51200 bytes 1.6/Defs/PawnKinds/PawnKinds_Wula.xml | 2 - .../Apparel/WULA_ShieldBelt.xml | 247 --------- 1.6/Defs/ThinkTreeDefs/WULA_ThinkTrees.xml | 490 +++++++++++++++++- .../Keyed/WULA_SkillTrainer.xml | 7 + .../.vs/WulaFallenEmpire/v17/.suo | Bin 77312 -> 91648 bytes .../WulaFallenEmpire/v17/DocumentLayout.json | 102 +++- .../CompProperties_WulaShieldBelt.cs | 31 -- .../CompUseEffect_WulaSkillTrainer.cs | 2 +- Source/WulaFallenEmpire/CompWulaShieldBelt.cs | 308 ----------- .../JobDriver_FeedWulaPatient.cs | 71 ++- .../JobDriver_IngestWulaEnergy.cs | 81 ++- .../JobGiverDefExtension_WulaPackEnergy.cs | 10 + .../JobGiver_WulaGetEnergy.cs | 22 +- .../JobGiver_WulaPackEnergy.cs | 86 +++ .../WulaFallenEmpire/WulaFallenEmpire.csproj | 5 +- .../WulaFallenEmpire/WulaFallenEmpireMod.cs | 3 - .../WulaFallenEmpire/WulaShieldBeltPatches.cs | 97 ---- 18 files changed, 793 insertions(+), 771 deletions(-) delete mode 100644 1.6/Defs/ThingDefs_Misc/Apparel/WULA_ShieldBelt.xml create mode 100644 Languages/ChineseSimplified (简体中文)/Keyed/WULA_SkillTrainer.xml delete mode 100644 Source/WulaFallenEmpire/CompProperties_WulaShieldBelt.cs delete mode 100644 Source/WulaFallenEmpire/CompWulaShieldBelt.cs create mode 100644 Source/WulaFallenEmpire/JobGiverDefExtension_WulaPackEnergy.cs create mode 100644 Source/WulaFallenEmpire/JobGiver_WulaPackEnergy.cs delete mode 100644 Source/WulaFallenEmpire/WulaShieldBeltPatches.cs diff --git a/1.6/Assemblies/WulaFallenEmpire.dll b/1.6/Assemblies/WulaFallenEmpire.dll index 76101c875dfa68c4652b489c098841136ee6e529..0956495e4ab0eeeb2e58a1664f0e3e897bf975f8 100644 GIT binary patch delta 22822 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 literal 54272 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 -
  • WULA_EmergencyEnergyRestore
  • 0 0 @@ -74,7 +73,6 @@
  • Wula_Apparel_Init
  • -
  • WULA_EmergencyEnergyRestore
  • diff --git a/1.6/Defs/ThingDefs_Misc/Apparel/WULA_ShieldBelt.xml b/1.6/Defs/ThingDefs_Misc/Apparel/WULA_ShieldBelt.xml deleted file mode 100644 index 03f61d51..00000000 --- a/1.6/Defs/ThingDefs_Misc/Apparel/WULA_ShieldBelt.xml +++ /dev/null @@ -1,247 +0,0 @@ - - - - - WULA_ShieldBelt - - 乌拉帝国的个人护盾装置,可以产生动量排斥场来阻挡来袭的投射物。护盾可以通过能力按钮开关,并且具有可配置的护盾值和范围。 - Ultra - - WULA_Synth_Weapon_2_Stun_Technology - UnfinishedBelt - -
  • WULA_Cube_Productor_Energy
  • -
    - - 8 - -
    - - Things/Item/Equipment/WeaponMelee/Knife - Graphic_Single - - - 50 - 25 - 3 - 1 - - - 12000 - 1.2 - 0.4 - - -
  • Apparel
  • -
    - - -
  • Waist
  • -
    - Things/Pawn/Humanlike/Apparel/ShieldBelt/ShieldBelt - -
  • Belt
  • -
    - -
  • BeltDefensePop
  • -
    - -
  • Soldier
  • -
    -
    - -
  • - - 200 - - 3.0 - - true - - false - - false - - false - - (0.2, 0.6, 1.0) - - 5.0 - - 300 - - BulletShield_Ambience - - BulletShieldGenerator_Reactivate - - false - - true -
  • -
    -
    - - - - WULA_ShieldBelt_Advanced - - 乌拉帝国的高级个人护盾装置,具有更强的护盾值、更大的范围,并且可以抵抗近战攻击和EMP伤害。 - Ultra - - WULA_Synth_Weapon_2_Stun_Technology - UnfinishedBelt - -
  • WULA_Cube_Productor_Energy
  • -
    - - 10 - -
    - - Things/Item/Equipment/WeaponMelee/Knife - Graphic_Single - - - 100 - 50 - 6 - 2 - 10 - - - 20000 - 2.0 - 0.2 - - -
  • Apparel
  • -
    - - -
  • Waist
  • -
    - Things/Pawn/Humanlike/Apparel/ShieldBelt/ShieldBelt - -
  • Belt
  • -
    - -
  • BeltDefensePop
  • -
    - -
  • Soldier
  • -
    -
    - -
  • - - 400 - - 4.5 - - true - - true - - true - - true - - (1.0, 0.6, 0.2) - - 8.0 - - 180 - - BulletShield_Ambience - - BulletShieldGenerator_Reactivate - - false - - true -
  • -
    -
    - - - - WULA_ShieldBelt_Deflector - - 乌拉帝国的偏转型个人护盾装置,采用低角护盾技术,不会被破坏但只能偏转投射物。这种护盾永远不会过载,但也无法完全阻挡攻击。 - Ultra - - WULA_Synth_Weapon_2_Stun_Technology - UnfinishedBelt - -
  • WULA_Cube_Productor_Energy
  • -
    - - 6 - -
    - - Things/Item/Equipment/WeaponMelee/Knife - Graphic_Single - - - 30 - 15 - 2 - 1 - - - 8000 - 0.8 - 0.4 - - -
  • Apparel
  • -
    - - -
  • Waist
  • -
    - Things/Pawn/Humanlike/Apparel/ShieldBelt/ShieldBelt - -
  • Belt
  • -
    - -
  • BeltDefensePop
  • -
    - -
  • Soldier
  • -
    -
    - -
  • - - 100 - - 2.5 - - true - - false - - false - - false - - (0.6, 1.0, 0.6) - - 0 - - 0 - - BulletShield_Ambience - - BulletShieldGenerator_Reactivate - - true - - false -
  • -
    -
    - -
    \ No newline at end of file diff --git a/1.6/Defs/ThinkTreeDefs/WULA_ThinkTrees.xml b/1.6/Defs/ThinkTreeDefs/WULA_ThinkTrees.xml index b7ca98e0..d0e7ff40 100644 --- a/1.6/Defs/ThinkTreeDefs/WULA_ThinkTrees.xml +++ b/1.6/Defs/ThinkTreeDefs/WULA_ThinkTrees.xml @@ -1,24 +1,492 @@ - + WULA_Humanlike - -
  • - 0.5 - 0.1 - 5.0 - 9.5 + + +
  • + +
  • + +
  • + SatisfyingNeeds + +
  • + +
  • +
    + + - + + +
  • + + +
  • + true +
  • + + +
  • + SatisfyingNeeds + +
  • + +
  • + +
  • + +
  • +
  • + +
  • + + + + +
  • + +
  • +
  • - Humanlike + Downed
  • -
  • - HumanlikeConstant + BurningResponse
  • +
  • + MentalStateCritical +
  • + + +
  • + Abilities_Escape +
  • + + +
  • + + +
  • + MentalStateNonCritical +
  • + + +
  • + RopedPawn +
  • + + +
  • + Humanlike_PostMentalState +
  • + + +
  • + + +
  • + +
  • + DraftedOrder + +
  • +
  • + +
  • + + + + +
  • + +
  • + +
  • + + +
  • + HighPriority + +
  • + LordDuty +
  • + + + + +
  • + Humanlike_PostDuty +
  • + + +
  • + true + + +
  • + true + + +
  • + Idle + +
  • + Deadly +
  • + + + + +
  • + Escaping + +
  • + +
  • + + + + +
  • + +
  • + Misc + +
  • + Walk +
  • + + + + + +
  • + RestingForMedicalReasons + +
  • + +
  • + +
  • + ChangingApparel + +
  • + +
  • + +
  • + SatisfyingNeeds + +
  • + +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • + +
  • +
  • + +
  • +
  • + +
  • + + + + +
  • + + +
  • + true + +
  • + Escaping + +
  • + +
  • + + + +
  • + Idle + +
  • + Deadly +
  • + + + + + +
  • + Idle + +
  • + Deadly +
  • + + + +
  • + +
  • + + +
  • + + +
  • + + +
  • +
  • + + +
  • + + +
  • + true + true +
  • + + +
  • + WULA_Energy + 0.5 + true + +
  • + SatisfyingNeeds + +
  • + true + 0.5 + 0.1 + 5 + 9.5 + 30 + 1 +
  • + + + + + + +
  • + Misc + +
  • + +
  • + +
  • + MediumPriority + +
  • + LordDuty +
  • + + + + +
  • + true +
  • + + +
  • + ChangingApparel + +
  • + true +
  • + + + + +
  • + +
  • + +
  • + + +
  • + + +
  • + TakeForInventoryStock + +
  • + true +
  • + + + + +
  • + UnloadingOwnInventory + +
  • + +
  • + + +
  • + WULA_Energy + 0.6 + true + +
  • + true + 0.6 + 2 +
  • + + + + + + +
  • + + +
  • + Humanlike_PreMain +
  • + + +
  • + +
  • + MainColonistBehaviorCore + true +
  • + + + +
  • + WildMan + +
  • + MainWildManBehaviorCore + true +
  • + + + + +
  • + Humanlike_PostMain +
  • + + +
  • + +
  • + Idle + + +
  • + Joy + 0.9 + true + +
  • + +
  • + + +
  • + None +
  • + + + + + + +
  • + WildMan + +
  • + Idle + + +
  • + Deadly + 120~240 +
  • + + + + + + +
  • + +
  • + +
  • + RestingForMedicalReasons + +
  • + +
  • + +
  • + Misc + +
  • + Walk +
  • + + + + + + + + +
  • + true + +
  • + Misc + +
  • + Walk +
  • + + + + + + +
  • + Idle + +
  • + Deadly +
  • + + + +
  • diff --git a/Languages/ChineseSimplified (简体中文)/Keyed/WULA_SkillTrainer.xml b/Languages/ChineseSimplified (简体中文)/Keyed/WULA_SkillTrainer.xml new file mode 100644 index 00000000..334455e6 --- /dev/null +++ b/Languages/ChineseSimplified (简体中文)/Keyed/WULA_SkillTrainer.xml @@ -0,0 +1,7 @@ + + + + {0}的{1}技能获得了经验。 + {0}的{1}技能经验减少了。 + + diff --git a/Source/WulaFallenEmpire/.vs/WulaFallenEmpire/v17/.suo b/Source/WulaFallenEmpire/.vs/WulaFallenEmpire/v17/.suo index 695c7b1c678cdef51274b9d268ce6313f4a2c970..20a87eb67970806f069cc1387741da9799767e29 100644 GIT binary patch delta 7195 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 r&Mx~ugWh{>AVaprGU2|LV$LjFqdHJAb<(gEbl6 delta 3592 zcmcIm3viUx75>k^yV*Q;H=75WH|&Nbi7}6VlO->pm<~xQ{P;SR}P>$(JO~h9ZAr6b>@>m zayY?{pd#oA(S)glpAjMm2Eug0P5M8dYUW49&mBvOvBOfQ2qd8q6#=aUt4OLNtR`3q zYY1xz>j>)!6RvLe29oOu4U=rF-?$D-7_{T%fJ6tsK{ND+1K&kN7_@qbARph_mDE=d zK|ZNZJ;{s@Hg1TwW_+-=VV)vQe7LwAdii6*y)k131~1$q21d}wa* z5!ptavMD}6bvxlnua1#{LKJJ*<27_rEfV%J9SeT6;8a5;xO7FJ1~yY5Gpo^}Gomfx zf*Pifg$01mD%rGlfEej|hz!6VZ-oBb?>=fa24YKCDfaM!UlOTF9F7`(s`4?%f&m-i z^|&WKT%OF7qwz-p(K5X*n?}U28q~g zY=s$k-Pr2K25pYOmKmk0U=q^^J`#f1wtLSjx~mpo#lj5eM@SR#H`QjtZpZe2Y+Dk4 z$<*HW&v##cETU)sKvS+5b^n9^ZvESq^>07V(Z*qZmE95g)om#ZnxK%zAf^fyPLrng zHi4QQAGSXXN!Zw@SEq4J+y-vr|19A?%VO_;#R4aw+hDyXJApkWo%n?n!lh($Cx8nJ z66ea;fRFdb;nx0ee3sy>48>*riNN8;{wQV%p+C4(!o)|C^DV&DZ^dHlkkK*k0aYf= zodt}KY{@on7dSKzsMwigiO|>ZyiEg;fX%@>(Vmxp3HrE+AkLcfkD`eb4Q|nwVUI>o zY$i>PH}qwynIvUT{&DNXkA^Z8>pyQ&Q@}P-JS4My(;5ZsjT4H8i_}m3>R5m)A@zuQ zfE}0H#!hyrifz~A*im?5N4gPL3M_N`{hHeU&SA^6?M{JrzhWnQ1 zY?Ufrex>B4`1I{BnCm@Z2!I{==_v3j3dpl}aRij!BYssgBVHdilK5> z0k8B1JTC2Da+jgz%;%jcyfcH>vh8JDv*gJ#4{ED~DIKIZ2rNCZMpmYsvK$B3Y#S&F z$y$k9=IrRG(thuVfN1IZj54@wRH@m7XfRJ1#J0p%R|4hVL9uNq{24DL#2VJw4~#!u z^w*_H7hjw6Y=%y`$3Fh)ilM>Fn&ZDTnSbB4mC+t?Kl!H+QVA>=(+L7`-6ojCp*fHN zoERJoablqns>LrBL%8F|g1CP<7+uAi0m^Yp$qq-kT~$tQY^zv=;_Kytdi=Qsf8@9~ z&!+?x7jhWzP`0c769_nWb@}>adZVnv13MoP4~9S`zGu?odCNGoOK&zT@^?He7ayGu zQ^m;D5F3?7uYx8|zw-;rOLWwC5#0#&T!R>~8sb8}-b@!eGn=ro#vdbVE=nJ^#4DZc zflikk54M|G0%2$8TL}btd%0xa`?B(0tZ0@(v577&E1tqA96wwvbsgLf62D9*`{7oa zjN6>Er3Pn@3=3^dEd zzdNFpb{(~W^m$hWNEPpY#`|cY|4$pG>eEMMxcM-JbdL=ydj%!C`ImDwxT80hGKGN; z$6p-w$G`MWr+f~5a~*x>BslMuDcHuX!b7bm@WtmMrSbi|+A{=JocPSqe=_V_DWB%# zy$+-=`$IhGUy2?2gr@$%fWkWiV|sJM!~@i5&CbfUX69z4uFA?ZrT$I8oPc){I+XRh1?E1rBc1}l5acd;Nq%R4i~5gwLF zvqn~c^yJ5D0QX(hpnmM6tGDBh?&AM5H4zP6Krhu<9D6ty5K(Qzb7j>R0`ZOEIp3QR z>CBb)_*={I5C%%rT{FRXY`ip&5!Zbo75=1DP}tB(JEVr6h*~AA>E0L!gMf`UQ*ms} z`Ar`pyIyPq$Pss|K_%K%;4e)Z3y^tKOy~VEzg+Im?rv7Z0wXLHR~ABsn6H5(F-ZfF zpzdzdKr3L1IZaHGlkW~K zf (CompProperties_WulaShieldBelt)props; - - public float ShieldHitPoints => shieldHitPoints; - public float ShieldMaxHitPoints => Props.maxShieldHitPoints; - - private bool ShouldDisplay - { - get - { - Pawn wearer = GetWearer(); - return wearer != null && wearer.Spawned && (wearer.Drafted || (wearer.Faction != null && wearer.Faction.IsPlayer) || Find.TickManager.TicksGame < lastKeepDisplayTick + 50); - } - } - - public override void PostExposeData() - { - base.PostExposeData(); - Scribe_Values.Look(ref shieldHitPoints, "shieldHitPoints", 0f); - Scribe_Values.Look(ref ticksToReset, "ticksToReset", -1); - } - - public override void PostSpawnSetup(bool respawningAfterLoad) - { - base.PostSpawnSetup(respawningAfterLoad); - if (!respawningAfterLoad) - { - shieldHitPoints = Props.maxShieldHitPoints; - } - } - - public override void CompTick() - { - base.CompTick(); - - Pawn wearer = GetWearer(); - if (wearer == null) return; - - if (sustainer == null && Props.activeSound != null) - { - sustainer = Props.activeSound.TrySpawnSustainer(SoundInfo.InMap(wearer, MaintenanceType.PerTick)); - } - sustainer?.Maintain(); - - if (ticksToReset > 0) - { - ticksToReset--; - if (ticksToReset <= 0) - { - Reset(); - } - } - else if (Props.useHitPointsMode && shieldHitPoints < Props.maxShieldHitPoints) - { - shieldHitPoints += Props.rechargeRate / 60f; // 每秒恢复 - if (shieldHitPoints > Props.maxShieldHitPoints) - { - shieldHitPoints = Props.maxShieldHitPoints; - } - } - } - - public override void PostDraw() - { - base.PostDraw(); - if (ShouldDisplay) - { - float num = Mathf.Lerp(1.2f, 1.55f, shieldHitPoints / Props.maxShieldHitPoints); - Vector3 drawPos = GetWearer().Drawer.DrawPos; - drawPos.y = AltitudeLayer.MoteOverhead.AltitudeFor(); - int num2 = Find.TickManager.TicksGame - lastAbsorbDamageTick; - if (num2 < 8) - { - float num3 = (8 - num2) / 8f * 0.05f; - drawPos += impactAngleVect * num3; - num -= num3; - } - - float alpha; - if (Props.useHitPointsMode) - { - // 生命值模式:透明度根据护盾生命值变化 - alpha = Mathf.Lerp(0.2f, 0.7f, shieldHitPoints / Props.maxShieldHitPoints); - } - else - { - // 偏转模式:固定透明度,稍微闪烁效果 - alpha = 0.4f + Mathf.Sin(Time.time * 2f) * 0.1f; - } - Color color = Props.shieldColor; - color.a = alpha; - - Matrix4x4 matrix = default(Matrix4x4); - matrix.SetTRS(drawPos, Quaternion.identity, Vector3.one * num * Props.shieldRadius); - Graphics.DrawMesh(MeshPool.plane10, matrix, BubbleMat, 0, null, 0, MaterialPropertyBlock); - } - } - - private MaterialPropertyBlock materialPropertyBlock; - private MaterialPropertyBlock MaterialPropertyBlock - { - get - { - if (materialPropertyBlock == null) - { - materialPropertyBlock = new MaterialPropertyBlock(); - } - materialPropertyBlock.SetColor(ShaderPropertyIDs.Color, Props.shieldColor); - return materialPropertyBlock; - } - } - - public bool CheckIntercept(Projectile projectile, Vector3 lastExactPos, Vector3 newExactPos) - { - // 如果使用生命值模式且护盾已破坏,则不拦截 - if (Props.useHitPointsMode && shieldHitPoints <= 0f) - return false; - - Pawn wearer = GetWearer(); - if (wearer == null || !wearer.Spawned) - return false; - - if (!Props.interceptGroundProjectiles && !projectile.def.projectile.flyOverhead) - return false; - - if (!Props.interceptAirProjectiles && projectile.def.projectile.flyOverhead) - return false; - - Vector3 center = wearer.TrueCenter(); - float radius = Props.shieldRadius; - - // 简单检查:如果射线起点和终点都在圆外,且连线不穿过圆,则不相交 - float distanceFromLastPos = Vector3.Distance(lastExactPos, center); - float distanceFromNewPos = Vector3.Distance(newExactPos, center); - - if (distanceFromLastPos > radius && distanceFromNewPos > radius) - { - // 计算点到线段的最短距离 - Vector3 line = newExactPos - lastExactPos; - float lineLength = line.magnitude; - Vector3 lineDirection = line / lineLength; - float projection = Mathf.Clamp(Vector3.Dot(center - lastExactPos, lineDirection), 0f, lineLength); - Vector3 closestPoint = lastExactPos + lineDirection * projection; - float distanceToLine = Vector3.Distance(center, closestPoint); - - if (distanceToLine > radius) - return false; - } - - lastKeepDisplayTick = Find.TickManager.TicksGame + 40; - - // 根据模式处理伤害 - if (Props.useHitPointsMode) - { - // 生命值模式:吸收伤害并可能破坏护盾 - AbsorbDamage(projectile.DamageAmount, projectile.ExactPosition); - } - else - { - // 偏转模式:只是偏转,不消耗护盾生命值 - DeflectProjectile(projectile.ExactPosition); - } - - return true; - } - - public bool CheckMeleeIntercept(DamageInfo dinfo, Pawn attacker) - { - if (!Props.interceptMeleeAttacks || shieldHitPoints <= 0f) - return false; - - Pawn wearer = GetWearer(); - if (wearer == null || !wearer.Spawned) - return false; - - lastKeepDisplayTick = Find.TickManager.TicksGame + 40; - AbsorbDamage(dinfo.Amount, attacker.Position.ToVector3()); - return true; - } - - private void AbsorbDamage(float damage, Vector3 impactPos) - { - if (Props.empImmune && damage > 0f) - { - // EMP免疫时减少EMP伤害 - damage *= 0.1f; - } - - // 只有在生命值模式下才扣除护盾生命值 - if (Props.useHitPointsMode) - { - shieldHitPoints -= damage; - } - - lastAbsorbDamageTick = Find.TickManager.TicksGame; - - Pawn wearer = GetWearer(); - if (wearer != null) - { - impactAngleVect = Vector3Utility.HorizontalVectorFromAngle((impactPos - wearer.TrueCenter()).AngleFlat() + 180f); - } - - // 只有在生命值模式下才会破坏护盾 - if (Props.useHitPointsMode && shieldHitPoints <= 0f) - { - Break(); - } - } - - private void DeflectProjectile(Vector3 impactPos) - { - // 偏转模式:只显示视觉效果,不消耗护盾生命值 - lastAbsorbDamageTick = Find.TickManager.TicksGame; - - Pawn wearer = GetWearer(); - if (wearer != null) - { - impactAngleVect = Vector3Utility.HorizontalVectorFromAngle((impactPos - wearer.TrueCenter()).AngleFlat() + 180f); - - // 播放偏转特效 - FleckMaker.ThrowLightningGlow(impactPos, wearer.Map, 0.5f); - } - } - - private void Break() - { - shieldHitPoints = 0f; - ticksToReset = Props.rechargeCooldownTicks; - sustainer?.End(); - sustainer = null; - - Pawn wearer = GetWearer(); - if (wearer != null && wearer.Map != null) - { - FleckMaker.Static(wearer.TrueCenter(), wearer.Map, FleckDefOf.ExplosionFlash, 12f); - for (int i = 0; i < 6; i++) - { - FleckMaker.ThrowDustPuff(wearer.TrueCenter() + Vector3Utility.HorizontalVectorFromAngle(Rand.Range(0, 360)) * Rand.Range(0.3f, 0.6f), wearer.Map, Rand.Range(0.8f, 1.2f)); - } - } - } - - private void Reset() - { - if (parent.Spawned) - { - SoundDefOf.EnergyShield_Reset.PlayOneShot(new TargetInfo(parent.Position, parent.Map)); - FleckMaker.ThrowLightningGlow(GetWearer().TrueCenter(), parent.Map, 3f); - - if (Props.reactivateEffect != null) - { - Effecter effecter = Props.reactivateEffect.Spawn(parent.Position, parent.Map); - effecter.Trigger(new TargetInfo(parent.Position, parent.Map), TargetInfo.Invalid); - effecter.Cleanup(); - } - } - shieldHitPoints = Props.maxShieldHitPoints; - } - - - private Pawn GetWearer() - { - if (parent is Apparel apparel) - { - return apparel.Wearer; - } - return null; - } - - // 添加初始化方法,确保护盾值正确设置 - public override void Initialize(CompProperties props) - { - base.Initialize(props); - shieldHitPoints = ((CompProperties_WulaShieldBelt)props).maxShieldHitPoints; - } - - public override string CompInspectStringExtra() - { - if (Props.useHitPointsMode) - { - return $"护盾: {shieldHitPoints:F0} / {Props.maxShieldHitPoints} (生命值模式)"; - } - else - { - return "护盾: 激活 (偏转模式)"; - } - } - } -} diff --git a/Source/WulaFallenEmpire/JobDriver_FeedWulaPatient.cs b/Source/WulaFallenEmpire/JobDriver_FeedWulaPatient.cs index c3a50deb..371ba3b8 100644 --- a/Source/WulaFallenEmpire/JobDriver_FeedWulaPatient.cs +++ b/Source/WulaFallenEmpire/JobDriver_FeedWulaPatient.cs @@ -30,16 +30,41 @@ namespace WulaFallenEmpire protected override IEnumerable MakeNewToils() { - // 失败条件:如果食物来源或病患被摧毁、为空或被禁止 - this.FailOn(() => FoodSource.DestroyedOrNull() || !FoodSource.IngestibleNow); + // 失败条件:如果病患被摧毁、为空或不在床上 this.FailOn(() => Patient.DestroyedOrNull()); - this.FailOn(() => !Patient.InBed()); // 确保病患在床上 + this.FailOn(() => !Patient.InBed()); - // Toil 1: 前往食物来源 + // Toil 0: 检查医生库存中是否有能量核心 + Toil checkInventoryToil = ToilMaker.MakeToil("CheckInventory"); + checkInventoryToil.initAction = delegate + { + Thing inventoryFood = null; + foreach (Thing t in pawn.inventory.innerContainer) + { + ThingDefExtension_EnergySource energySourceExt = t.def.GetModExtension(); + if (energySourceExt != null && t.IngestibleNow) + { + inventoryFood = t; + break; + } + } + + if (inventoryFood != null) + { + // 如果库存中有食物,则将Job的目标设置为库存食物,并跳过拾取步骤,直接前往病患 + job.SetTarget(FoodSourceInd, inventoryFood); + pawn.jobs.curDriver.JumpToToil(Toils_Goto.GotoThing(PatientInd, PathEndMode.Touch)); // 跳转到前往病患的Toil + } + // 如果库存中没有,则继续执行下一个Toil(前往地图上的食物来源) + }; + yield return checkInventoryToil; + + // Toil 1: 前往食物来源 (如果库存中没有,则执行此Toil) yield return Toils_Goto.GotoThing(FoodSourceInd, PathEndMode.ClosestTouch) - .FailOnDespawnedNullOrForbidden(FoodSourceInd); + .FailOnDespawnedNullOrForbidden(FoodSourceInd) + .FailOn(() => !pawn.CanReserve(FoodSource, 1, -1, null, false)); // 在这里预留食物来源 - // Toil 2: 拾取食物来源 + // Toil 2: 拾取食物来源 (如果库存中没有,则执行此Toil) yield return Toils_Haul.StartCarryThing(FoodSourceInd); // 使用 StartCarryThing 拾取物品 // Toil 3: 前往病患 @@ -51,12 +76,17 @@ namespace WulaFallenEmpire feedToil.initAction = delegate { Pawn actor = feedToil.actor; - Thing food = actor.carryTracker.CarriedThing; // 医生携带的食物 + Thing food = actor.carryTracker.CarriedThing; // 医生携带的食物 (从地图拾取) + // 如果医生没有携带食物,检查是否在库存中 (从库存获取) if (food == null) { - actor.jobs.EndCurrentJob(JobCondition.Incompletable); - return; + food = job.GetTarget(FoodSourceInd).Thing; // 此时FoodSourceInd应该指向库存中的物品 + if (food == null || !actor.inventory.innerContainer.Contains(food)) + { + actor.jobs.EndCurrentJob(JobCondition.Incompletable); + return; + } } // 获取乌拉能量需求 @@ -79,10 +109,25 @@ namespace WulaFallenEmpire energyNeed.CurLevel += ext.energyAmount; // 消耗物品 - food.Destroy(DestroyMode.Vanish); // 销毁医生携带的物品 - - // 移除医生携带的物品 - actor.carryTracker.innerContainer.ClearAndDestroyContents(); + if (actor.carryTracker.CarriedThing == food) // 如果是携带的物品 + { + food.Destroy(DestroyMode.Vanish); // 销毁医生携带的物品 + actor.carryTracker.innerContainer.ClearAndDestroyContents(); // 移除医生携带的物品 + } + else if (actor.inventory.innerContainer.Contains(food)) // 如果是库存中的物品 + { + food.stackCount--; // 减少库存物品数量 + if (food.stackCount <= 0) + { + food.Destroy(DestroyMode.Vanish); // 如果数量为0,销毁物品 + } + } + else + { + // 理论上不应该发生 + actor.jobs.EndCurrentJob(JobCondition.Errored); + return; + } // 记录能量摄入 (可选) // Patient.records.AddTo(RecordDefOf.NutritionEaten, ext.energyAmount); diff --git a/Source/WulaFallenEmpire/JobDriver_IngestWulaEnergy.cs b/Source/WulaFallenEmpire/JobDriver_IngestWulaEnergy.cs index 457814fc..6afba9df 100644 --- a/Source/WulaFallenEmpire/JobDriver_IngestWulaEnergy.cs +++ b/Source/WulaFallenEmpire/JobDriver_IngestWulaEnergy.cs @@ -10,21 +10,41 @@ namespace WulaFallenEmpire public class JobDriver_IngestWulaEnergy : JobDriver { private const TargetIndex IngestibleSourceInd = TargetIndex.A; + private bool eatingFromInventory; // 新增字段 + + private Toil chewing; // 新增咀嚼Toil字段 private Thing IngestibleSource => job.GetTarget(IngestibleSourceInd).Thing; + // 新增咀嚼时间乘数属性 + private float ChewDurationMultiplier + { + get + { + Thing ingestibleSource = IngestibleSource; + // 假设乌拉能量核心也有EatingSpeed属性影响咀嚼速度,或者固定为1f + return 1f / pawn.GetStatValue(StatDefOf.EatingSpeed); + } + } + + public override void ExposeData() + { + base.ExposeData(); + Scribe_Values.Look(ref eatingFromInventory, "eatingFromInventory", defaultValue: false); + } + public override bool TryMakePreToilReservations(bool errorOnFailed) { - // 尝试预留能量核心 if (pawn.Faction != null) { Thing ingestibleSource = IngestibleSource; + // 使用FoodUtility.GetMaxAmountToPickup int maxAmountToPickup = FoodUtility.GetMaxAmountToPickup(ingestibleSource, pawn, job.count); if (!pawn.Reserve(ingestibleSource, job, 10, maxAmountToPickup, null, errorOnFailed)) { return false; } - job.count = maxAmountToPickup; // 更新job.count以匹配实际预留数量 + job.count = maxAmountToPickup; } return true; } @@ -34,30 +54,28 @@ namespace WulaFallenEmpire // 失败条件:如果能量核心被摧毁、为空或被禁止 this.FailOn(() => IngestibleSource.DestroyedOrNull() || !IngestibleSource.IngestibleNow); - // Toil 1: 前往能量核心 - yield return Toils_Goto.GotoThing(IngestibleSourceInd, PathEndMode.ClosestTouch) - .FailOnDespawnedNullOrForbidden(IngestibleSourceInd); + // 初始化 eatingFromInventory + eatingFromInventory = pawn.inventory != null && pawn.inventory.Contains(IngestibleSource); - // Toil 2: 拾取能量核心并放入carryTracker - yield return Toils_Haul.StartCarryThing(IngestibleSourceInd); + // 定义咀嚼Toil + chewing = Toils_Ingest.ChewIngestible(pawn, ChewDurationMultiplier, IngestibleSourceInd, TargetIndex.None) + .FailOn((Toil x) => !IngestibleSource.Spawned && (pawn.carryTracker == null || pawn.carryTracker.CarriedThing != IngestibleSource)) + .FailOnCannotTouch(IngestibleSourceInd, PathEndMode.Touch); - // Toil 3: “摄取”能量核心 (模拟咀嚼过程,可以是一个简单的延迟) - Toil chewToil = ToilMaker.MakeToil("ChewWulaEnergy"); - chewToil.initAction = delegate + // 根据是否从背包摄入,选择不同的Toil序列 + foreach (Toil item in PrepareToIngestToils(chewing)) { - // 设定一个短暂的“咀嚼”时间 - pawn.jobs.curDriver.ticksLeftThisToil = 60; // 1秒 - }; - chewToil.defaultCompleteMode = ToilCompleteMode.Delay; - yield return chewToil; + yield return item; + } - // Toil 4: 最终处理能量摄取 + yield return chewing; + + // 最终处理能量摄取 Toil finalizeToil = ToilMaker.MakeToil("FinalizeWulaEnergyIngest"); finalizeToil.initAction = delegate { Pawn actor = finalizeToil.actor; - // 从Pawn的carryTracker中获取能量核心 - Thing thing = actor.carryTracker.CarriedThing; + Thing thing = actor.carryTracker.CarriedThing; // 从carryTracker获取,因为Toils_Ingest.ChewIngestible会处理携带 if (thing == null) { @@ -65,7 +83,6 @@ namespace WulaFallenEmpire return; } - // 获取乌拉能量需求 Need_WulaEnergy energyNeed = actor.needs.TryGetNeed(); if (energyNeed == null) { @@ -73,7 +90,6 @@ namespace WulaFallenEmpire return; } - // 检查食物来源是否有自定义能量扩展 ThingDefExtension_EnergySource ext = thing.def.GetModExtension(); if (ext == null) { @@ -81,17 +97,30 @@ namespace WulaFallenEmpire return; } - // 补充乌拉的能量 energyNeed.CurLevel += ext.energyAmount; - - // 消耗物品 thing.Destroy(DestroyMode.Vanish); - - // 记录能量摄入 (可选,如果需要类似 NutritionEaten 的记录) - // actor.records.AddTo(RecordDefOf.NutritionEaten, ext.energyAmount); }; finalizeToil.defaultCompleteMode = ToilCompleteMode.Instant; yield return finalizeToil; } + + // 辅助方法,根据情况返回不同的Toil序列 + private IEnumerable PrepareToIngestToils(Toil chewToil) + { + if (eatingFromInventory) + { + yield return Toils_Misc.TakeItemFromInventoryToCarrier(pawn, IngestibleSourceInd); + } + else + { + // 类似原版JobDriver_Ingest的ToolUser逻辑 + yield return Toils_Goto.GotoThing(IngestibleSourceInd, PathEndMode.ClosestTouch) + .FailOnDespawnedNullOrForbidden(IngestibleSourceInd); + yield return Toils_Ingest.PickupIngestible(IngestibleSourceInd, pawn); + } + // 不处理FindAdjacentEatSurface,因为乌拉能量核心可能不需要“吃表面” + // 也不处理takeExtraIngestibles,因为乌拉能量核心通常是单次消耗 + yield break; // 确保迭代器结束 + } } } diff --git a/Source/WulaFallenEmpire/JobGiverDefExtension_WulaPackEnergy.cs b/Source/WulaFallenEmpire/JobGiverDefExtension_WulaPackEnergy.cs new file mode 100644 index 00000000..30c3cb98 --- /dev/null +++ b/Source/WulaFallenEmpire/JobGiverDefExtension_WulaPackEnergy.cs @@ -0,0 +1,10 @@ +using Verse; + +namespace WulaFallenEmpire +{ + public class JobGiverDefExtension_WulaPackEnergy : DefModExtension + { + public float packEnergyThreshold = 0.5f; // 默认打包能量阈值 + public int packEnergyCount = 10; // 默认打包数量 + } +} diff --git a/Source/WulaFallenEmpire/JobGiver_WulaGetEnergy.cs b/Source/WulaFallenEmpire/JobGiver_WulaGetEnergy.cs index c75c56b4..02d844a9 100644 --- a/Source/WulaFallenEmpire/JobGiver_WulaGetEnergy.cs +++ b/Source/WulaFallenEmpire/JobGiver_WulaGetEnergy.cs @@ -11,6 +11,8 @@ namespace WulaFallenEmpire public float emergencyThreshold = 0.1f; public float normalPriority = 5f; public float emergencyPriority = 9.5f; + public float searchRadius = 20f; // 添加 searchRadius + public int ingestCount = 1; // 添加 ingestCount public override ThinkNode DeepCopy(bool resolve = true) { @@ -19,6 +21,8 @@ namespace WulaFallenEmpire obj.emergencyThreshold = emergencyThreshold; obj.normalPriority = normalPriority; obj.emergencyPriority = emergencyPriority; + obj.searchRadius = searchRadius; + obj.ingestCount = ingestCount; return obj; } @@ -58,14 +62,26 @@ namespace WulaFallenEmpire return null; } - // 寻找最佳能量核心 + // 优先检查小人背包中的能量核心 + foreach (Thing t in pawn.inventory.innerContainer) + { + ThingDefExtension_EnergySource energySourceExt = t.def.GetModExtension(); + if (energySourceExt != null && t.IngestibleNow) + { + Job job = JobMaker.MakeJob(DefDatabase.GetNamed("WULA_IngestWulaEnergy"), t); + job.count = ingestCount; + return job; + } + } + + // 如果背包中没有,则寻找最佳能量核心 Thing bestEnergySource = GenClosest.ClosestThingReachable( pawn.Position, pawn.Map, ThingRequest.ForGroup(ThingRequestGroup.HaulableEver), // 扫描所有可搬运的物品 PathEndMode.ClosestTouch, TraverseParms.For(pawn, Danger.Deadly, TraverseMode.ByPawn, false), - 9999f, + searchRadius, // 使用类中的 searchRadius (Thing t) => { // 检查物品是否是能量核心 @@ -92,7 +108,7 @@ namespace WulaFallenEmpire { // 创建摄取能量核心的Job Job job = JobMaker.MakeJob(DefDatabase.GetNamed("WULA_IngestWulaEnergy"), bestEnergySource); - job.count = 1; // 每次摄取一个 + job.count = ingestCount; // 使用类中的 ingestCount return job; } diff --git a/Source/WulaFallenEmpire/JobGiver_WulaPackEnergy.cs b/Source/WulaFallenEmpire/JobGiver_WulaPackEnergy.cs new file mode 100644 index 00000000..21706f63 --- /dev/null +++ b/Source/WulaFallenEmpire/JobGiver_WulaPackEnergy.cs @@ -0,0 +1,86 @@ +using System.Collections.Generic; +using UnityEngine; +using Verse; +using Verse.AI; +using RimWorld; // For JobDefOf, ThingDefOf, StatDefOf + +namespace WulaFallenEmpire +{ + public class JobGiver_WulaPackEnergy : ThinkNode_JobGiver + { + public float packEnergyThreshold = 0.5f; // 默认打包能量阈值 + public int packEnergyCount = 2; // 默认打包数量 + + // 定义乌拉能量核心的ThingDef + private static ThingDef WULA_Charge_Cube_Def => ThingDef.Named("WULA_Charge_Cube"); + + public override ThinkNode DeepCopy(bool resolve = true) + { + JobGiver_WulaPackEnergy obj = (JobGiver_WulaPackEnergy)base.DeepCopy(resolve); + obj.packEnergyThreshold = packEnergyThreshold; + obj.packEnergyCount = packEnergyCount; + return obj; + } + + protected override Job TryGiveJob(Pawn pawn) + { + if (pawn.inventory == null) + { + return null; + } + + // 检查背包中是否有足够的能量核心,这里可以根据Need_WulaEnergy的当前值来判断是否需要打包 + // 简化逻辑:如果能量低于某个阈值,并且背包中没有能量核心,则尝试打包 + Need_WulaEnergy energyNeed = pawn.needs.TryGetNeed(); + if (energyNeed == null) + { + return null; + } + + // 只有当能量低于阈值,并且背包中能量核心数量少于2个时,才尝试打包 + if (energyNeed.CurLevelPercentage > packEnergyThreshold || pawn.inventory.innerContainer.TotalStackCountOfDef(WULA_Charge_Cube_Def) >= 2) + { + return null; + } + + // 检查是否超重 + if (MassUtility.IsOverEncumbered(pawn)) + { + return null; + } + + // 寻找地图上可触及的WULA_Charge_Cube + Thing thing = GenClosest.ClosestThing_Regionwise_ReachablePrioritized( + pawn.Position, + pawn.Map, + ThingRequest.ForDef(WULA_Charge_Cube_Def), // 只寻找WULA_Charge_Cube + PathEndMode.ClosestTouch, + TraverseParms.For(pawn), + 20f, // 搜索距离 + delegate(Thing t) + { + // 检查物品是否被禁止,是否可预留,是否社交得体 + return !t.IsForbidden(pawn) && pawn.CanReserve(t) && t.IsSociallyProper(pawn); + }, + (Thing x) => 0f // 优先级,这里可以根据距离或其他因素调整 + ); + + if (thing == null) + { + return null; + } + + // 计算需要打包的数量,限制在1到2个 + int countToTake = Mathf.Min(thing.stackCount, 2); // 限制为最多2个 + if (WULA_Charge_Cube_Def != null) + { + countToTake = Mathf.Min(countToTake, WULA_Charge_Cube_Def.stackLimit); + } + + // 创建TakeInventory Job + Job job = JobMaker.MakeJob(JobDefOf.TakeInventory, thing); + job.count = countToTake; + return job; + } + } +} diff --git a/Source/WulaFallenEmpire/WulaFallenEmpire.csproj b/Source/WulaFallenEmpire/WulaFallenEmpire.csproj index 4bb48509..b389c7da 100644 --- a/Source/WulaFallenEmpire/WulaFallenEmpire.csproj +++ b/Source/WulaFallenEmpire/WulaFallenEmpire.csproj @@ -82,13 +82,12 @@ - - - + + diff --git a/Source/WulaFallenEmpire/WulaFallenEmpireMod.cs b/Source/WulaFallenEmpire/WulaFallenEmpireMod.cs index 41cb256b..cb6a4608 100644 --- a/Source/WulaFallenEmpire/WulaFallenEmpireMod.cs +++ b/Source/WulaFallenEmpire/WulaFallenEmpireMod.cs @@ -13,9 +13,6 @@ namespace WulaFallenEmpire // 初始化Harmony var harmony = new Harmony("tourswen.wulafallenempire"); // 替换为您的唯一Mod ID harmony.PatchAll(Assembly.GetExecutingAssembly()); - - // 手动应用护盾腰带的近战拦截补丁 - WulaShieldBeltPatches.ApplyMeleePatch(harmony); Log.Message("[WulaFallenEmpire] Harmony patches applied."); } diff --git a/Source/WulaFallenEmpire/WulaShieldBeltPatches.cs b/Source/WulaFallenEmpire/WulaShieldBeltPatches.cs deleted file mode 100644 index 3b706712..00000000 --- a/Source/WulaFallenEmpire/WulaShieldBeltPatches.cs +++ /dev/null @@ -1,97 +0,0 @@ -using HarmonyLib; -using RimWorld; -using System.Collections.Generic; -using System.Linq; -using UnityEngine; -using Verse; - -namespace WulaFallenEmpire -{ - public static class WulaShieldBeltPatches - { - // 拦截投射物 - [HarmonyPatch(typeof(Projectile), "CheckForFreeInterceptBetween")] - [HarmonyPrefix] - public static bool CheckForFreeInterceptBetween_Prefix(Projectile __instance, Vector3 lastExactPos, Vector3 newExactPos, ref bool __result) - { - var map = __instance.Map; - if (map == null) return true; - - // 检查所有穿戴护盾腰带的pawn - var pawns = map.mapPawns.AllPawnsSpawned; - foreach (var pawn in pawns) - { - if (pawn.apparel?.WornApparel == null) continue; - - foreach (var apparel in pawn.apparel.WornApparel) - { - var shieldComp = apparel.GetComp(); - if (shieldComp != null && shieldComp.CheckIntercept(__instance, lastExactPos, newExactPos)) - { - // 使用反射调用protected方法 - typeof(Projectile).GetMethod("Impact", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic) - .Invoke(__instance, new object[] { null, true }); - __result = true; - return false; - } - } - } - - return true; - } - - // 拦截近战攻击 - 使用Harmony的手动补丁方式 - public static void ApplyMeleePatch(Harmony harmony) - { - // 获取Thing.TakeDamage方法 - var originalMethod = typeof(Thing).GetMethod("TakeDamage", - System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance); - - if (originalMethod != null) - { - // 获取我们的前缀方法 - var prefixMethod = typeof(WulaShieldBeltPatches).GetMethod("TakeDamage_Manual_Prefix", - System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.Public); - - // 应用补丁 - harmony.Patch(originalMethod, new HarmonyMethod(prefixMethod)); - } - } - - // 手动补丁方法 - public static bool TakeDamage_Manual_Prefix(Thing __instance, DamageInfo dinfo, ref DamageWorker.DamageResult __result) - { - // 只有当实例是Pawn时才执行护盾腰带的逻辑 - if (__instance is Pawn pawn) - { - if (pawn.apparel?.WornApparel == null) return true; - - // 检查是否有护盾腰带可以拦截这次攻击 - foreach (var apparel in pawn.apparel.WornApparel) - { - var shieldComp = apparel.GetComp(); - if (shieldComp != null && dinfo.Instigator is Pawn attacker) - { - if (shieldComp.CheckMeleeIntercept(dinfo, attacker)) - { - __result = new DamageWorker.DamageResult(); - return false; - } - } - } - } - - return true; - } - - // 为护盾腰带添加投射物拦截器接口支持 - [HarmonyPatch(typeof(CompProjectileInterceptor), "CheckIntercept")] - [HarmonyPostfix] - public static void CheckIntercept_Postfix(CompProjectileInterceptor __instance, Projectile projectile, Vector3 lastExactPos, Vector3 newExactPos, ref bool __result) - { - if (__result) return; // 如果已经被拦截了就不需要再检查 - - // 这个补丁确保我们的护盾系统与原版的投射物拦截系统兼容 - } - } -}