From 5eb865ef3ab00a6fc8830df19f01b2aa05fc9e02 Mon Sep 17 00:00:00 2001 From: "ProjectKoi-Kalo\\Kalo" Date: Wed, 27 Aug 2025 17:40:41 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9A=82=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Weapons/WULA_Ionic_Weapons.xml | 131 +++ MCP/vector_cache/knowledge_cache.json | 1034 +++++++++++++++++ SequentialBeamWeapon_Design.md | 107 ++ .../3516260226.code-workspace | 3 + .../VerbProperties_Wula_IonicBeam.cs | 17 + .../Verb_Wula_BreachingBeam.cs | 148 +++ .../Verb_Wula_SustainedBeam.cs | 137 +++ Source/WulaFallenEmpire/WulaBeamUtility.cs | 64 + 8 files changed, 1641 insertions(+) create mode 100644 1.6/1.6/Defs/ThingDefs_Misc/Weapons/WULA_Ionic_Weapons.xml create mode 100644 SequentialBeamWeapon_Design.md create mode 100644 Source/WulaFallenEmpire/VerbProperties_Wula_IonicBeam.cs create mode 100644 Source/WulaFallenEmpire/Verb_Wula_BreachingBeam.cs create mode 100644 Source/WulaFallenEmpire/Verb_Wula_SustainedBeam.cs create mode 100644 Source/WulaFallenEmpire/WulaBeamUtility.cs diff --git a/1.6/1.6/Defs/ThingDefs_Misc/Weapons/WULA_Ionic_Weapons.xml b/1.6/1.6/Defs/ThingDefs_Misc/Weapons/WULA_Ionic_Weapons.xml new file mode 100644 index 00000000..a3f8369e --- /dev/null +++ b/1.6/1.6/Defs/ThingDefs_Misc/Weapons/WULA_Ionic_Weapons.xml @@ -0,0 +1,131 @@ + + + + + + + Ultra + + Wula/Weapon/WULA_RW_DM_AR + Graphic_Single + 1.2 + + Interact_ChargeRifle + + 40000 + 4.5 + 1 + 1 + 1 + 1 + 1.5 + + + + + + + WULA_Weapon_BreachingBeamGun + + 发射一道高能离子束,能够烧穿路径上的多个目标,直到能量耗尽。单发威力巨大,但射速较慢。 + +
  • + WulaFallenEmpire.Verb_Wula_BreachingBeam + + + true + 2.5 + 40 + 1 + Shot_ChargeLance + + + 30000 + 0.95 + 45 + + + + + Mote_ChargeLanceBeam + ChargeLance_Explosion + Shot_ChargeLance_Sustainer + 12 + + + 3 + Beam + true + + + 0.2 + 0.2 + 0.3~0.5 +
  • +
    +
    + + + + + WULA_Weapon_SustainedBeamGun + + 投射一道持续存在的离子场,对作用范围内的所有敌人进行周期性灼烧。适合用于区域压制和清理大量轻甲目标。 + +
  • + WulaFallenEmpire.Verb_Wula_SustainedBeam + + + true + 1.5 + 30 + + + 20 + 15 + 240 + 0.5 + + + + + Mote_GraserBeamBase + GraserBeam_End + BeamGraser_Shooting + 9 + + + 3 + Flame + true + + + 0.1 + 0.1 + 0.4~0.6 + + + Fleck_Longspark + 0.5 + Fleck_BeamSpark + + +
  • (0, 0)
  • +
  • (0.5, 0.5)
  • +
  • (1, 0)
  • + + + +
    +
    + +
    \ No newline at end of file diff --git a/MCP/vector_cache/knowledge_cache.json b/MCP/vector_cache/knowledge_cache.json index e602858b..660b291d 100644 --- a/MCP/vector_cache/knowledge_cache.json +++ b/MCP/vector_cache/knowledge_cache.json @@ -26905,5 +26905,1039 @@ ], "result": "--- 结果 1 (相似度: 1.000) ---\n文件路径: C:\\Steam\\steamapps\\common\\RimWorld\\Data\\dll1.6\\Verse\\HediffCompProperties_GiveHediffsInRange.txt\n\npublic class HediffCompProperties_GiveHediffsInRange : HediffCompProperties\n{\n\tpublic float range;\n\n\tpublic TargetingParameters targetingParameters;\n\n\tpublic HediffDef hediff;\n\n\tpublic ThingDef mote;\n\n\tpublic bool hideMoteWhenNotDrafted;\n\n\tpublic float initialSeverity = 1f;\n\n\tpublic bool onlyPawnsInSameFaction = true;\n\n\tpublic HediffCompProperties_GiveHediffsInRange()\n\t{\n\t\tcompClass = typeof(HediffComp_GiveHediffsInRange);\n\t}\n}\n\n", "timestamp": "2025-08-26 19:53:26,325" + }, + "Verb_ShootBeam": { + "keywords": [ + "Verb_ShootBeam" + ], + "question": "Verb_ShootBeam class implementation", + "embedding": [ + -0.016535503789782524, + 0.015228179283440113, + 0.05031045526266098, + -0.003167748684063554, + 0.018891561776399612, + -0.05677524954080582, + -0.021434379741549492, + 0.01058071106672287, + -0.04111608490347862, + 0.09740287810564041, + 0.010947049595415592, + -0.04057016596198082, + -0.008382681757211685, + 0.009381133131682873, + 0.0025338397826999426, + -0.03490988165140152, + -0.000708882522303611, + -0.10774654895067215, + -0.035427067428827286, + -0.017411842942237854, + -0.0056602852419018745, + 0.07165864109992981, + -0.020328182727098465, + -0.02965185046195984, + -0.0754513144493103, + 0.003051023231819272, + 0.012635079212486744, + 0.023273255676031113, + 0.022396916523575783, + 0.007301624398678541, + 0.06142989918589592, + -0.03344452753663063, + 0.06120004132390022, + -0.014703813008964062, + -0.018072688952088356, + 0.01726818084716797, + -0.003957889974117279, + 0.03344452753663063, + -0.0004145997518207878, + -0.002898382255807519, + -0.009517611935734749, + -0.0050353556871414185, + 0.0002493883657734841, + 0.03353072702884674, + 0.031461991369724274, + 0.02370424196124077, + -0.013317473232746124, + -0.04263890162110329, + -0.007068173494189978, + -0.0054160598665475845, + 0.009625358507037163, + 0.01813015341758728, + -0.018862828612327576, + 0.0048270453698933125, + 0.012548881582915783, + 0.04042650759220123, + -0.00021358509548008442, + 0.018087053671479225, + -0.032323963940143585, + 0.016607334837317467, + 0.007757751736789942, + 0.03821410983800888, + -0.0483853854238987, + -0.06729131191968918, + 0.03600171580910683, + -0.03568565845489502, + -0.032697487622499466, + -0.01028620358556509, + -0.004507397301495075, + -0.04281129688024521, + -0.018403111025691032, + 0.02682170830667019, + -0.03881749138236046, + -0.01960987225174904, + -0.0036310588475316763, + 0.07004962116479874, + -0.00292352307587862, + -0.04594312980771065, + -0.017871560528874397, + 0.004514580592513084, + 0.026649313047528267, + -0.05530989542603493, + -0.05881525203585625, + -0.02945072390139103, + 0.03278368338942528, + 0.06993469595909119, + 0.0019448252860456705, + -0.05743609368801117, + 0.024307621642947197, + 0.029508188366889954, + 0.016837194561958313, + -0.027540018782019615, + 0.04444904252886772, + -0.006454018410295248, + 0.027453821152448654, + 0.05441918969154358, + -0.052206795662641525, + -0.03071494959294796, + -0.00020101465634070337, + 0.06148736551403999, + 0.009381133131682873, + -0.04585693031549454, + -0.04419045150279999, + 0.05157468095421791, + 0.008856766857206821, + 0.009438597597181797, + 0.013726910576224327, + 0.01677973009645939, + -0.006181060336530209, + 0.023517480120062828, + 0.022210154682397842, + -0.025500016286969185, + 0.014114798046648502, + 0.0360591784119606, + 0.03347326070070267, + -0.03965073078870773, + 0.03249635919928551, + -0.018360011279582977, + 0.038961153477430344, + 0.03384678438305855, + 0.057292431592941284, + 0.012455501593649387, + -0.02574424259364605, + -0.018776632845401764, + -0.02663494646549225, + 0.01193831767886877, + 0.023962832987308502, + 0.03430650010704994, + -0.0710265263915062, + 0.031749315559864044, + -0.0584704615175724, + -0.014258460141718388, + 0.0016709694173187017, + 0.008871132507920265, + -0.0360591784119606, + -0.05576961487531662, + 6.307662988547236e-05, + 0.005595637485384941, + 0.005635144654661417, + -0.00021515639673452824, + -0.029910441488027573, + -0.003358100773766637, + 0.05292510613799095, + 0.029134666547179222, + 0.04459270462393761, + -0.03735213726758957, + 0.015027051791548729, + -0.00504253851249814, + 0.0022536986507475376, + 0.0095966262742877, + 0.009790569543838501, + 0.025701144710183144, + -0.03042762540280819, + 0.023244522511959076, + 0.03548453003168106, + -0.02739635668694973, + 0.018891561776399612, + -0.02982424572110176, + -0.005085637327283621, + -0.07332511991262436, + -0.058527927845716476, + 0.019810998812317848, + 0.034363966435194016, + -0.042466506361961365, + -0.006349863484501839, + 0.006766483187675476, + 0.03235269710421562, + 0.0002606119669508189, + -0.03531213477253914, + -0.04562707245349884, + -0.018000857904553413, + 0.02982424572110176, + -0.013374938629567623, + -0.04034030809998512, + 0.034076642245054245, + 0.003340143011882901, + -0.00877056922763586, + 0.035743121057748795, + 0.02075916901230812, + -0.04766707494854927, + 0.015501136891543865, + -0.0008956431993283331, + 0.04034030809998512, + -0.0044750734232366085, + 0.04717862233519554, + -0.02788480743765831, + 0.032697487622499466, + 0.02301466278731823, + 0.015817193314433098, + 0.0037675376515835524, + 0.012125078588724136, + 0.03732340410351753, + -0.01841747760772705, + 0.010839303024113178, + 0.06826821714639664, + 0.006213384214788675, + -0.0514884851872921, + 0.05683271214365959, + -0.04758087545633316, + -0.023373818024992943, + -0.0040009887889027596, + -0.013863389380276203, + 0.0017733286367729306, + 0.03488114848732948, + 0.05772341787815094, + 0.01033648569136858, + 0.0010487331310287118, + -0.02856001816689968, + 0.02709466591477394, + -0.006252891384065151, + 0.04798313230276108, + -0.005204158369451761, + -0.07826709747314453, + -0.04453524202108383, + -0.02788480743765831, + -0.014193812385201454, + 0.00675570871680975, + -0.007355497684329748, + 0.06913018971681595, + -0.0052400738932192326, + -0.02018452063202858, + 0.04456397145986557, + -0.010846486315131187, + 0.03226650133728981, + 0.028732413426041603, + -0.004586411640048027, + -0.015874657779932022, + -0.015055784955620766, + 0.00015028398775029927, + 0.02680734172463417, + -0.05723496899008751, + -0.02660621516406536, + -0.05772341787815094, + 0.03910481557250023, + 0.04887383431196213, + -0.027425087988376617, + -0.043127354234457016, + -0.030485089868307114, + 0.0055776797235012054, + 0.013805924914777279, + 0.02271297201514244, + 0.028832977637648582, + 0.006105637643486261, + 0.025859171524643898, + 0.0009338034433312714, + -0.03694988414645195, + -0.029881710186600685, + 0.01929381489753723, + 0.030082836747169495, + -0.016621701419353485, + 0.027353256940841675, + -0.009409865364432335, + -0.04671890288591385, + 0.008274935185909271, + 0.032323963940143585, + -0.008088174276053905, + -0.062234409153461456, + -0.0016395433340221643, + -0.058843981474637985, + -0.017138885334134102, + -0.0191932525485754, + -0.013532966375350952, + 0.0035394742153584957, + 0.03341579809784889, + -0.011931134387850761, + 0.0013450360856950283, + 0.008145639672875404, + 0.034191571176052094, + -0.039334673434495926, + 0.0005486095324158669, + 0.0024907412007451057, + 0.012757191434502602, + 0.011629444546997547, + 0.009366766549646854, + 0.015486771240830421, + -0.012441135011613369, + 0.054735247045755386, + 0.02038564719259739, + -0.041087351739406586, + -0.0011340324999764562, + 0.011923952028155327, + 0.01792902685701847, + -0.012297472916543484, + 0.04789693281054497, + -0.04574200138449669, + -0.024120861664414406, + 0.05433299392461777, + 0.019423112273216248, + 0.04261016845703125, + 0.0019394379341974854, + -0.003878875868394971, + 0.0256293136626482, + 0.019466210156679153, + 0.014445221051573753, + 0.0015246137045323849, + 0.0212476197630167, + 0.01676536351442337, + 0.019925929605960846, + -0.008986062370240688, + 0.00931648537516594, + 0.01136366929858923, + 0.04740848392248154, + 0.009531978517770767, + 0.009287752211093903, + 0.007606906350702047, + -0.012979867868125439, + -0.016808461397886276, + -0.10751669108867645, + 0.01902085728943348, + -0.057005107402801514, + 0.02468114346265793, + -0.0027547201607376337, + -0.0032108472660183907, + 0.0012543494813144207, + -0.010451415553689003, + 0.04643157869577408, + -0.016406208276748657, + -0.016736630350351334, + -0.030370160937309265, + 0.03858762979507446, + -0.03723720833659172, + -0.03051382303237915, + -0.004748031497001648, + 0.017727898433804512, + 0.05344228819012642, + -0.012534515000879765, + 0.03901861608028412, + -0.009381133131682873, + 0.011047612875699997, + 0.021175788715481758, + -0.0545915849506855, + -0.028804244473576546, + 0.047523412853479385, + 0.04769580811262131, + 0.0009104583295993507, + 0.02710903249680996, + 0.02202339470386505, + 0.003379650181159377, + -0.011923952028155327, + -0.03100227378308773, + -0.004557678941637278, + -0.032007910311222076, + -0.009675640612840652, + -0.00901479460299015, + -0.0070394412614405155, + -0.02505466528236866, + 0.016650432720780373, + 0.019351281225681305, + 0.005552538670599461, + 0.019810998812317848, + -0.015831559896469116, + -0.006597680505365133, + -0.02213832549750805, + -0.008246202953159809, + 0.007764934562146664, + 0.008001977577805519, + 0.004370918497443199, + 0.0006235831533558667, + -0.0499369353055954, + -0.003280882490798831, + -0.007621272467076778, + -0.020012125372886658, + 0.003104896517470479, + 0.06217694282531738, + 0.06499271839857101, + 0.023416917771100998, + -0.019868463277816772, + 0.05467778444290161, + -0.02085973136126995, + -0.01823071576654911, + 0.0018622195348143578, + -0.032122839242219925, + 0.03433523327112198, + 0.019652970135211945, + -0.015027051791548729, + 0.0386163629591465, + -0.0018038568086922169, + -0.027223961427807808, + 0.033875513821840286, + 0.00679880753159523, + 0.012441135011613369, + -0.025413820520043373, + -0.009086625650525093, + 0.002907361136749387, + -0.018575504422187805, + -0.0021423606667667627, + 0.0836687907576561, + -0.0021261984948068857, + 0.016305644065141678, + -0.030197765678167343, + 0.053298626095056534, + 0.054045669734478, + -0.002605670830234885, + 0.0019430294632911682, + 0.058441728353500366, + -0.018963392823934555, + 0.017498040571808815, + 0.014538601040840149, + 0.06844060868024826, + 0.014646347612142563, + -0.0036669743712991476, + -0.013741277158260345, + -0.01784282922744751, + -0.005089228507131338, + 0.00901479460299015, + -0.014854657463729382, + 0.026735510677099228, + 0.06315384805202484, + -0.062062013894319534, + 0.005351412110030651, + -0.05401693657040596, + 0.01111944392323494, + 0.04924735799431801, + 0.017282547429203987, + 0.003785495413467288, + -0.01160789467394352, + -0.023718606680631638, + -0.003983031027019024, + 0.02456621266901493, + 0.012261557392776012, + -0.020112689584493637, + 0.014897756278514862, + -0.032007910311222076, + -0.0024781706742942333, + 0.03160565346479416, + -0.004151833709329367, + -0.03220903500914574, + 0.040512703359127045, + -0.04005298390984535, + -0.00638577900826931, + -0.04269636794924736, + -0.02554311603307724, + -0.05370087921619415, + 0.04306988790631294, + 0.028718046844005585, + -0.0027403540443629026, + -0.030398894101381302, + -0.022942831739783287, + -0.02660621516406536, + -0.011852120980620384, + -0.06269412487745285, + 0.003828593995422125, + 0.04114481434226036, + -0.0011160747380927205, + -0.06338370591402054, + -0.029263963922858238, + 0.02825832925736904, + -0.0037244390696287155, + 0.04028284549713135, + -0.017885927110910416, + -0.04203552007675171, + 0.022253254428505898, + -0.006752117071300745, + 0.02874678000807762, + -0.0046510593965649605, + 0.024005930870771408, + -0.00638577900826931, + -0.07165864109992981, + -0.009445780888199806, + -0.02348874881863594, + 0.006561764981597662, + 0.023072127252817154, + -0.016147617250680923, + 0.02281353622674942, + -0.006784440949559212, + -0.0060984548181295395, + 0.014394938945770264, + -0.024436917155981064, + 0.006375004071742296, + -0.01659296825528145, + -0.027654947713017464, + -0.009481696411967278, + 0.02397719956934452, + -0.04390312731266022, + 0.0514884851872921, + -0.05235045775771141, + 0.008404230698943138, + 0.0448225662112236, + 0.008986062370240688, + -0.025083396583795547, + -0.0292352307587862, + 0.02272733859717846, + -0.027267061173915863, + 0.050166793167591095, + -0.11630880832672119, + -0.048098061233758926, + -0.007053807377815247, + -0.02680734172463417, + -0.00061550218379125, + -0.031921710819005966, + -0.017526771873235703, + -0.002725987695157528, + 0.021491846069693565, + 0.006252891384065151, + -0.015630433335900307, + 0.03850143402814865, + 0.03735213726758957, + 0.023560579866170883, + -0.018661702051758766, + -0.030370160937309265, + -0.015774095430970192, + 0.025313256308436394, + -0.0597059540450573, + -0.032007910311222076, + -0.0337318517267704, + -0.014007051475346088, + -0.04367326945066452, + -0.04789693281054497, + -0.047523412853479385, + 0.050051864236593246, + 0.03091607615351677, + 0.013080431148409843, + 0.0448225662112236, + 0.02163550816476345, + -0.0260172002017498, + 0.0007685920572839677, + 0.03531213477253914, + 0.046661440283060074, + 0.022353816777467728, + 0.00931648537516594, + 0.005875778384506702, + -0.022942831739783287, + 0.03752453252673149, + 0.014955220744013786, + -0.003578981151804328, + 0.01765606738626957, + -0.010077893733978271, + -0.0360591784119606, + 0.042840030044317245, + -0.05663158744573593, + 0.019365645945072174, + -0.017770998179912567, + 0.06217694282531738, + -0.02271297201514244, + 0.04102988541126251, + -0.023143958300352097, + 0.035455796867609024, + 0.006831131409853697, + -0.00989113375544548, + 0.10619500279426575, + 0.04335721209645271, + 0.02584480680525303, + 0.0020525718573480844, + 0.005207750014960766, + 0.009984513744711876, + 0.046747636049985886, + 0.0401679128408432, + -0.03209410607814789, + 0.034076642245054245, + -0.015630433335900307, + 0.024896636605262756, + 0.010638176463544369, + 0.04594312980771065, + -0.06315384805202484, + 0.07441695034503937, + 0.03844396770000458, + 0.006910145282745361, + 0.05858539044857025, + -0.011212823912501335, + -0.045598339289426804, + 0.01989719644188881, + -0.014739728532731533, + 0.021707339212298393, + -0.05433299392461777, + -0.03166311979293823, + -0.010300570167601109, + -0.00907225999981165, + 0.02876114659011364, + -0.03531213477253914, + -0.03206537291407585, + -0.035340867936611176, + 0.04513861984014511, + 0.004453524015843868, + 0.015141981653869152, + 0.0497070737183094, + 0.02417832612991333, + -0.011679725721478462, + 0.025801707059144974, + 0.04390312731266022, + -0.004453524015843868, + -0.00950324535369873, + -0.008375498466193676, + -0.051229894161224365, + -0.008497611619532108, + 0.03996678814291954, + -0.013669446110725403, + -0.003810636233538389, + 0.026261426508426666, + 0.05487890914082527, + 0.005254440009593964, + 0.02426452375948429, + 0.007592540234327316, + -0.03769692778587341, + 0.0038034531753510237, + 0.031347062438726425, + 0.03376058489084244, + 0.009855218231678009, + 0.07493413239717484, + 0.043931860476732254, + 0.04680510237812996, + 0.025514382869005203, + -0.0362890399992466, + -0.017727898433804512, + -0.017986491322517395, + 0.033013541251420975, + -0.01755550503730774, + -0.017397476360201836, + -0.030054103583097458, + 0.03663382679224014, + -0.0013100184733048081, + 0.025816073641180992, + 0.01922198385000229, + -0.022195789963006973, + 0.008648456074297428, + 0.009050710126757622, + -0.04502369090914726, + 0.008519160561263561, + 0.00014298864698503166, + -0.03307100757956505, + 0.012060430832207203, + 0.029292695224285126, + -0.02192283235490322, + 0.02692227065563202, + -0.00847606174647808, + -0.02886170893907547, + -0.005121552851051092, + 0.0, + -0.016233813017606735, + -0.04786819964647293, + -0.03462255746126175, + -0.054246798157691956, + 0.007535075303167105, + -0.004313453566282988, + -0.0292352307587862, + 0.04384566470980644, + 0.015328742563724518, + 0.011873669922351837, + 0.04832791909575462, + -0.027640581130981445, + -0.028028469532728195, + 0.014157896861433983, + 0.0014671488897874951, + 0.015242544934153557, + -0.016736630350351334, + -0.04465017095208168, + -0.010932683013379574, + -0.028243962675333023, + -0.03893242031335831, + -0.035427067428827286, + -0.012864938005805016, + 0.005926060490310192, + -0.06372849643230438, + -0.004686974920332432, + -0.046460311859846115, + -0.01111226063221693, + -0.0014473953051492572, + 0.0022519028279930353, + 0.00035309442318975925, + -0.011643810197710991, + -0.003649016609415412, + -0.03898988664150238, + -0.0017957758391276002, + -0.023747339844703674, + -0.0331859365105629, + -0.0035197206307202578, + 0.0014042967231944203, + 0.01890592835843563, + -0.01775663159787655, + 0.05450538918375969, + 0.01037958450615406, + 0.04114481434226036, + -0.010235922411084175, + 0.04844284802675247, + 0.0013225888833403587, + 0.010860851965844631, + 0.013906488195061684, + -0.09412738680839539, + -0.026390722021460533, + 0.023057762533426285, + 0.043156083673238754, + -0.016449306160211563, + -0.020744802430272102, + -0.030054103583097458, + -0.009977330453693867, + -0.0450524240732193, + 0.02009832300245762, + -0.014782826416194439, + 0.011248739436268806, + -0.025298889726400375, + -0.020816633477807045, + 0.028603117913007736, + -0.07625582814216614, + 0.06913018971681595, + -0.016133250668644905, + 0.004676200449466705, + 0.019825365394353867, + -0.038846224546432495, + -0.07085413485765457, + 0.03499608114361763, + 0.03746706619858742, + 0.03209410607814789, + -0.027640581130981445, + -0.046747636049985886, + 0.04692003130912781, + 0.0435008741915226, + -0.019049590453505516, + -0.01607578620314598, + 0.0023327127564698458, + -0.012699726969003677, + -0.015774095430970192, + -0.011629444546997547, + 0.03853016719222069, + 0.07717525959014893, + -0.03413410857319832, + -0.015975221991539, + 0.021118324249982834, + 0.005764440633356571, + 0.011291838251054287, + -0.0386163629591465, + 0.009833668358623981, + -0.06562483310699463, + 0.015860293060541153, + -0.021980296820402145, + -0.008928597904741764, + -0.014940855093300343, + -0.010472964495420456, + 0.03634650260210037, + -0.012714092619717121, + -0.03830030560493469, + 0.06200454756617546, + -0.04631664976477623, + -0.028545653447508812, + 0.01609015092253685, + -0.011334937065839767, + -0.0327262207865715, + -0.04169073328375816, + 0.002040001330897212, + -0.03580058738589287, + -0.04390312731266022, + -0.018992125988006592, + 0.00337426271289587, + -0.013956770300865173, + 0.021578041836619377, + 0.010954232886433601, + 0.08504794538021088, + 0.00019517839245963842, + -0.010393950156867504, + 0.039823126047849655, + 0.022669874131679535, + 0.004866552539169788, + 0.07832455635070801, + -0.010243105702102184, + 0.08257695287466049, + -0.050540316849946976, + -0.01588902436196804, + 0.011758740060031414, + -0.0075997235253453255, + 0.01540057361125946, + -0.029263963922858238, + 0.021290717646479607, + -0.040024250745773315, + -0.06154482811689377, + 0.03401917591691017, + 0.03496734797954559, + -0.032611288130283356, + 0.006371412891894579, + -0.028301427140831947, + 0.024896636605262756, + -0.05479271337389946, + 0.023129593580961227, + -0.01491212286055088, + -0.0065330322831869125, + -0.017598602920770645, + 0.025270158424973488, + 0.012541698291897774, + 0.012347755022346973, + 0.02047184482216835, + -0.041575800627470016, + -0.03255382552742958, + 0.028114667162299156, + 0.025701144710183144, + -0.010027612559497356, + -0.023345086723566055, + -0.03692115098237991, + 0.020328182727098465, + 0.013468318618834019, + -0.021894099190831184, + 0.0013207931770011783, + -0.022310718894004822, + -0.005843454506248236, + 0.027468187734484673, + -0.0419493243098259, + 0.050367921590805054, + -0.017009587958455086, + 0.006910145282745361, + -0.012915220111608505, + 0.011967049911618233, + 0.020787900313735008, + 0.02320142462849617, + -0.006468384526669979, + 0.04160453379154205, + -0.013173811137676239, + -0.025385087355971336, + -0.05364341661334038, + 0.01960987225174904, + 0.013231276534497738, + -0.020155787467956543, + -0.004277538042515516, + -0.033789318054914474, + -0.011320570483803749, + -0.023905368521809578, + -0.05002313107252121, + 0.001117870444431901, + 0.03620284050703049, + 0.01588902436196804, + -0.005843454506248236, + -0.07918652892112732, + -0.024925367906689644, + 0.014603248797357082, + 0.010846486315131187, + -0.00046016756095923483, + 0.05433299392461777, + 0.025485651567578316, + 0.05439046025276184, + 0.0004651059571187943, + -0.00048081896966323256, + 0.023732973262667656, + -0.0006922715692780912, + -0.002889403374865651, + -0.007606906350702047, + 0.0676935687661171, + 0.017770998179912567, + 0.0053478204645216465, + 0.03278368338942528, + 0.017627336084842682, + -0.0025320439599454403, + -0.00025724488659761846, + -0.010990148410201073, + 0.02828706055879593, + 0.029881710186600685, + 0.03686368465423584, + 0.03424903750419617, + 0.022655507549643517, + -0.018201984465122223, + 0.010666908696293831, + 0.018575504422187805, + 0.011859303340315819, + -0.028401991352438927, + -0.028143398463726044, + -0.0005472626653499901, + 0.00017845522961579263, + -0.007642821874469519, + -0.03177804872393608, + -0.03626030683517456, + 0.016521137207746506, + 0.02009832300245762, + 0.014524235390126705, + -0.016233813017606735, + 0.026261426508426666, + 0.03439269959926605, + -0.005836271680891514, + -0.03692115098237991, + 0.024020297452807426, + 0.017972124740481377, + 0.0040764110162854195, + 0.0033616924192756414, + 0.03646143153309822, + 0.0008794812019914389, + 0.017023954540491104, + -0.01326719205826521, + 0.07125638425350189, + 0.04516735300421715, + -0.03177804872393608, + 0.011536063626408577, + 0.01813015341758728, + 0.034938614815473557, + -0.0473797507584095, + 0.010760288685560226, + 0.00730880768969655, + 0.02037128061056137, + 0.018877195194363594, + -0.019265083596110344, + -0.009733105078339577, + 0.015414940193295479, + -0.008648456074297428, + -0.010695640929043293, + 0.013274375349283218, + -0.06355609744787216, + -0.0538158118724823, + 0.026491284370422363, + -0.005182608962059021, + -0.039420872926712036, + 0.02212395891547203, + 0.06367103010416031, + 0.04209298640489578, + 0.012541698291897774, + -0.06349863111972809, + -0.025787340477108955, + -0.01598958857357502, + 0.0035143333952873945, + 0.010810570791363716, + -0.04097242280840874, + 0.04413298889994621, + 0.029479457065463066, + -0.01199578307569027, + -0.005250848364084959, + 0.0072154272347688675, + 0.014430854469537735, + 0.010070711374282837, + 0.020313816145062447, + -0.014610432088375092, + 0.0029809880070388317, + -0.014445221051573753, + -0.04510989040136337, + -0.005674651823937893, + -0.016161981970071793, + 0.009567894041538239, + 0.06068285554647446, + 0.022167056798934937, + 0.014409305527806282, + 0.019753534346818924, + -0.028646215796470642, + 0.014409305527806282, + -0.007086131256073713, + -0.02338818460702896, + -0.0007623068522661924, + 0.001844261772930622, + 0.04384566470980644, + -0.08085301518440247, + -0.010595077648758888, + 0.04510989040136337, + 0.0033958121202886105, + 0.028014102950692177, + 0.014926488511264324, + 0.03243889659643173, + -0.0019789449870586395, + -0.007280075456947088, + -0.00021672769798897207, + -0.0102933868765831, + -0.04131720960140228, + -0.04102988541126251, + -0.022382549941539764, + -0.0008974389638751745, + 0.0248535368591547, + 0.004115918185561895, + -0.002117219613865018, + 0.009043526835739613, + -0.015285643748939037, + 0.020457478240132332, + 0.019365645945072174, + -0.03617410734295845, + 0.01646367274224758, + -0.022569309920072556, + -0.017598602920770645, + 0.029795512557029724, + 0.019624238833785057, + -0.004751622676849365, + -0.03151945769786835, + 0.029120301827788353, + -0.04045523703098297, + 0.03399044647812843, + 0.05809694156050682, + -0.004669017158448696, + -0.057378631085157394, + 0.025600580498576164, + -0.027942271903157234, + -0.012692543677985668, + -0.001960987225174904, + 0.03060002066195011, + 0.011442683637142181, + 0.01170127559453249, + 0.030054103583097458, + -0.018201984465122223, + -0.022784803062677383, + -0.02475297451019287, + -0.047638341784477234, + -0.06298144906759262, + -0.08912794291973114, + -0.023129593580961227, + -0.03051382303237915, + 0.028818611055612564, + 0.01949494332075119, + -0.022468747571110725, + -0.005793172866106033, + 0.017038321122527122, + -0.01880536414682865, + 0.019710436463356018, + -0.01008507702499628, + -0.0017463919939473271, + 0.015185080468654633, + 0.0512586273252964, + -0.01705268770456314, + 0.007836765609681606, + -0.019250717014074326, + 0.03223776817321777, + -0.04054143652319908, + 0.03042762540280819, + -0.04579946771264076, + 0.011586345732212067, + -0.050741441547870636, + 0.018589871004223824, + -0.03080114722251892, + -0.0012022719020023942, + 0.020155787467956543, + 0.026491284370422363, + 0.0019394379341974854, + -0.05625806376338005, + -0.025959735736250877, + -0.02699410170316696, + 0.010803387500345707, + 0.04766707494854927, + -0.050166793167591095, + 0.0401679128408432, + -0.027453821152448654, + -0.006378595717251301, + -0.013626347295939922, + -0.011248739436268806, + 0.012922403402626514, + -0.004403242375701666, + -0.023373818024992943, + 0.004087185952812433, + -0.016003955155611038, + -0.016334377229213715, + -0.012613529339432716 + ], + "result": "--- 结果 1 (相似度: 1.000) ---\n文件路径: C:\\Steam\\steamapps\\common\\RimWorld\\Data\\dll1.6\\Verse\\Verb_ShootBeam.txt\n\npublic class Verb_ShootBeam : Verb\n{\n\tprivate List path = new List();\n\n\tprivate List tmpPath = new List();\n\n\tprivate int ticksToNextPathStep;\n\n\tprivate Vector3 initialTargetPosition;\n\n\tprivate MoteDualAttached mote;\n\n\tprivate Effecter endEffecter;\n\n\tprivate Sustainer sustainer;\n\n\tprivate HashSet pathCells = new HashSet();\n\n\tprivate HashSet tmpPathCells = new HashSet();\n\n\tprivate HashSet tmpHighlightCells = new HashSet();\n\n\tprivate HashSet tmpSecondaryHighlightCells = new HashSet();\n\n\tprivate HashSet hitCells = new HashSet();\n\n\tprivate const int NumSubdivisionsPerUnitLength = 1;\n\n\tprotected override int ShotsPerBurst => base.BurstShotCount;\n\n\tpublic float ShotProgress => (float)ticksToNextPathStep / (float)base.TicksBetweenBurstShots;\n\n\tpublic Vector3 InterpolatedPosition\n\t{\n\t\tget\n\t\t{\n\t\t\tVector3 vector = base.CurrentTarget.CenterVector3 - initialTargetPosition;\n\t\t\treturn Vector3.Lerp(path[burstShotsLeft], path[Mathf.Min(burstShotsLeft + 1, path.Count - 1)], ShotProgress) + vector;\n\t\t}\n\t}\n\n\tpublic override float? AimAngleOverride\n\t{\n\t\tget\n\t\t{\n\t\t\tif (state != VerbState.Bursting)\n\t\t\t{\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\treturn (InterpolatedPosition - caster.DrawPos).AngleFlat();\n\t\t}\n\t}\n\n\tpublic override void DrawHighlight(LocalTargetInfo target)\n\t{\n\t\tbase.DrawHighlight(target);\n\t\tCalculatePath(target.CenterVector3, tmpPath, tmpPathCells, addRandomOffset: false);\n\t\tforeach (IntVec3 tmpPathCell in tmpPathCells)\n\t\t{\n\t\t\tShootLine resultingLine;\n\t\t\tbool flag = TryFindShootLineFromTo(caster.Position, target, out resultingLine);\n\t\t\tif ((verbProps.stopBurstWithoutLos && !flag) || !TryGetHitCell(resultingLine.Source, tmpPathCell, out var hitCell))\n\t\t\t{\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\ttmpHighlightCells.Add(hitCell);\n\t\t\tif (!verbProps.beamHitsNeighborCells)\n\t\t\t{\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tforeach (IntVec3 beamHitNeighbourCell in GetBeamHitNeighbourCells(resultingLine.Source, hitCell))\n\t\t\t{\n\t\t\t\tif (!tmpHighlightCells.Contains(beamHitNeighbourCell))\n\t\t\t\t{\n\t\t\t\t\ttmpSecondaryHighlightCells.Add(beamHitNeighbourCell);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\ttmpSecondaryHighlightCells.RemoveWhere((IntVec3 x) => tmpHighlightCells.Contains(x));\n\t\tif (tmpHighlightCells.Any())\n\t\t{\n\t\t\tGenDraw.DrawFieldEdges(tmpHighlightCells.ToList(), verbProps.highlightColor ?? Color.white);\n\t\t}\n\t\tif (tmpSecondaryHighlightCells.Any())\n\t\t{\n\t\t\tGenDraw.DrawFieldEdges(tmpSecondaryHighlightCells.ToList(), verbProps.secondaryHighlightColor ?? Color.white);\n\t\t}\n\t\ttmpHighlightCells.Clear();\n\t\ttmpSecondaryHighlightCells.Clear();\n\t}\n\n\tprotected override bool TryCastShot()\n\t{\n\t\tif (currentTarget.HasThing && currentTarget.Thing.Map != caster.Map)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t\tShootLine resultingLine;\n\t\tbool flag = TryFindShootLineFromTo(caster.Position, currentTarget, out resultingLine);\n\t\tif (verbProps.stopBurstWithoutLos && !flag)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t\tif (base.EquipmentSource != null)\n\t\t{\n\t\t\tbase.EquipmentSource.GetComp()?.Notify_ProjectileLaunched();\n\t\t\tbase.EquipmentSource.GetComp()?.UsedOnce();\n\t\t}\n\t\tlastShotTick = Find.TickManager.TicksGame;\n\t\tticksToNextPathStep = base.TicksBetweenBurstShots;\n\t\tIntVec3 targetCell = InterpolatedPosition.Yto0().ToIntVec3();\n\t\tif (!TryGetHitCell(resultingLine.Source, targetCell, out var hitCell))\n\t\t{\n\t\t\treturn true;\n\t\t}\n\t\tHitCell(hitCell, resultingLine.Source);\n\t\tif (verbProps.beamHitsNeighborCells)\n\t\t{\n\t\t\thitCells.Add(hitCell);\n\t\t\tforeach (IntVec3 beamHitNeighbourCell in GetBeamHitNeighbourCells(resultingLine.Source, hitCell))\n\t\t\t{\n\t\t\t\tif (!hitCells.Contains(beamHitNeighbourCell))\n\t\t\t\t{\n\t\t\t\t\tfloat damageFactor = (pathCells.Contains(beamHitNeighbourCell) ? 1f : 0.5f);\n\t\t\t\t\tHitCell(beamHitNeighbourCell, resultingLine.Source, damageFactor);\n\t\t\t\t\thitCells.Add(beamHitNeighbourCell);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn true;\n\t}\n\n\tprotected bool TryGetHitCell(IntVec3 source, IntVec3 targetCell, out IntVec3 hitCell)\n\t{\n\t\tIntVec3 intVec = GenSight.LastPointOnLineOfSight(source, targetCell, (IntVec3 c) => c.InBounds(caster.Map) && c.CanBeSeenOverFast(caster.Map), skipFirstCell: true);\n\t\tif (verbProps.beamCantHitWithinMinRange && intVec.DistanceTo(source) < verbProps.minRange)\n\t\t{\n\t\t\thitCell = default(IntVec3);\n\t\t\treturn false;\n\t\t}\n\t\thitCell = (intVec.IsValid ? intVec : targetCell);\n\t\treturn intVec.IsValid;\n\t}\n\n\tprotected IntVec3 GetHitCell(IntVec3 source, IntVec3 targetCell)\n\t{\n\t\tTryGetHitCell(source, targetCell, out var hitCell);\n\t\treturn hitCell;\n\t}\n\n\tprotected IEnumerable GetBeamHitNeighbourCells(IntVec3 source, IntVec3 pos)\n\t{\n\t\tif (!verbProps.beamHitsNeighborCells)\n\t\t{\n\t\t\tyield break;\n\t\t}\n\t\tfor (int i = 0; i < 4; i++)\n\t\t{\n\t\t\tIntVec3 intVec = pos + GenAdj.CardinalDirections[i];\n\t\t\tif (intVec.InBounds(Caster.Map) && (!verbProps.beamHitsNeighborCellsRequiresLOS || GenSight.LineOfSight(source, intVec, caster.Map)))\n\t\t\t{\n\t\t\t\tyield return intVec;\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic override bool TryStartCastOn(LocalTargetInfo castTarg, LocalTargetInfo destTarg, bool surpriseAttack = false, bool canHitNonTargetPawns = true, bool preventFriendlyFire = false, bool nonInterruptingSelfCast = false)\n\t{\n\t\treturn base.TryStartCastOn(verbProps.beamTargetsGround ? ((LocalTargetInfo)castTarg.Cell) : castTarg, destTarg, surpriseAttack, canHitNonTargetPawns, preventFriendlyFire, nonInterruptingSelfCast);\n\t}\n\n\tpublic override void BurstingTick()\n\t{\n\t\tticksToNextPathStep--;\n\t\tVector3 vector = InterpolatedPosition;\n\t\tIntVec3 intVec = vector.ToIntVec3();\n\t\tVector3 vector2 = InterpolatedPosition - caster.Position.ToVector3Shifted();\n\t\tfloat num = vector2.MagnitudeHorizontal();\n\t\tVector3 normalized = vector2.Yto0().normalized;\n\t\tIntVec3 intVec2 = GenSight.LastPointOnLineOfSight(caster.Position, intVec, (IntVec3 c) => c.CanBeSeenOverFast(caster.Map), skipFirstCell: true);\n\t\tif (intVec2.IsValid)\n\t\t{\n\t\t\tnum -= (intVec - intVec2).LengthHorizontal;\n\t\t\tvector = caster.Position.ToVector3Shifted() + normalized * num;\n\t\t\tintVec = vector.ToIntVec3();\n\t\t}\n\t\tVector3 offsetA = normalized * verbProps.beamStartOffset;\n\t\tVector3 vector3 = vector - intVec.ToVector3Shifted();\n\t\tif (mote != null)\n\t\t{\n\t\t\tmote.UpdateTargets(new TargetInfo(caster.Position, caster.Map), new TargetInfo(intVec, caster.Map), offsetA, vector3);\n\t\t\tmote.Maintain();\n\t\t}\n\t\tif (verbProps.beamGroundFleckDef != null && Rand.Chance(verbProps.beamFleckChancePerTick))\n\t\t{\n\t\t\tFleckMaker.Static(vector, caster.Map, verbProps.beamGroundFleckDef);\n\t\t}\n\t\tif (endEffecter == null && verbProps.beamEndEffecterDef != null)\n\t\t{\n\t\t\tendEffecter = verbProps.beamEndEffecterDef.Spawn(intVec, caster.Map, vector3);\n\t\t}\n\t\tif (endEffecter != null)\n\t\t{\n\t\t\tendEffecter.offset = vector3;\n\t\t\tendEffecter.EffectTick(new TargetInfo(intVec, caster.Map), TargetInfo.Invalid);\n\t\t\tendEffecter.ticksLeft--;\n\t\t}\n\t\tif (verbProps.beamLineFleckDef != null)\n\t\t{\n\t\t\tfloat num2 = 1f * num;\n\t\t\tfor (int i = 0; (float)i < num2; i++)\n\t\t\t{\n\t\t\t\tif (Rand.Chance(verbProps.beamLineFleckChanceCurve.Evaluate((float)i / num2)))\n\t\t\t\t{\n\t\t\t\t\tVector3 vector4 = i * normalized - normalized * Rand.Value + normalized / 2f;\n\t\t\t\t\tFleckMaker.Static(caster.Position.ToVector3Shifted() + vector4, caster.Map, verbProps.beamLineFleckDef);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tsustainer?.Maintain();\n\t}\n\n\tpublic override void WarmupComplete()\n\t{\n\t\tburstShotsLeft = ShotsPerBurst;\n\t\tstate = VerbState.Bursting;\n\t\tinitialTargetPosition = currentTarget.CenterVector3;\n\t\tCalculatePath(currentTarget.CenterVector3, path, pathCells);\n\t\thitCells.Clear();\n\t\tif (verbProps.beamMoteDef != null)\n\t\t{\n\t\t\tmote = MoteMaker.MakeInteractionOverlay(verbProps.beamMoteDef, caster, new TargetInfo(path[0].ToIntVec3(), caster.Map));\n\t\t}\n\t\tTryCastNextBurstShot();\n\t\tticksToNextPathStep = base.TicksBetweenBurstShots;\n\t\tendEffecter?.Cleanup();\n\t\tif (verbProps.soundCastBeam != null)\n\t\t{\n\t\t\tsustainer = verbProps.soundCastBeam.TrySpawnSustainer(SoundInfo.InMap(caster, MaintenanceType.PerTick));\n\t\t}\n\t}\n\n\tprivate void CalculatePath(Vector3 target, List pathList, HashSet pathCellsList, bool addRandomOffset = true)\n\t{\n\t\tpathList.Clear();\n\t\tVector3 vector = (target - caster.Position.ToVector3Shifted()).Yto0();\n\t\tfloat magnitude = vector.magnitude;\n\t\tVector3 normalized = vector.normalized;\n\t\tVector3 vector2 = normalized.RotatedBy(-90f);\n\t\tfloat num = ((verbProps.beamFullWidthRange > 0f) ? Mathf.Min(magnitude / verbProps.beamFullWidthRange, 1f) : 1f);\n\t\tfloat num2 = (verbProps.beamWidth + 1f) * num / (float)ShotsPerBurst;\n\t\tVector3 vector3 = target.Yto0() - vector2 * verbProps.beamWidth / 2f * num;\n\t\tpathList.Add(vector3);\n\t\tfor (int i = 0; i < ShotsPerBurst; i++)\n\t\t{\n\t\t\tVector3 vector4 = normalized * (Rand.Value * verbProps.beamMaxDeviation) - normalized / 2f;\n\t\t\tVector3 vector5 = Mathf.Sin(((float)i / (float)ShotsPerBurst + 0.5f) * MathF.PI * 57.29578f) * verbProps.beamCurvature * -normalized - normalized * verbProps.beamMaxDeviation / 2f;\n\t\t\tif (addRandomOffset)\n\t\t\t{\n\t\t\t\tpathList.Add(vector3 + (vector4 + vector5) * num);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tpathList.Add(vector3 + vector5 * num);\n\t\t\t}\n\t\t\tvector3 += vector2 * num2;\n\t\t}\n\t\tpathCellsList.Clear();\n\t\tforeach (Vector3 path in pathList)\n\t\t{\n\t\t\tpathCellsList.Add(path.ToIntVec3());\n\t\t}\n\t}\n\n\tprivate bool CanHit(Thing thing)\n\t{\n\t\tif (!thing.Spawned)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t\treturn !CoverUtility.ThingCovered(thing, caster.Map);\n\t}\n\n\tprivate void HitCell(IntVec3 cell, IntVec3 sourceCell, float damageFactor = 1f)\n\t{\n\t\tif (cell.InBounds(caster.Map))\n\t\t{\n\t\t\tApplyDamage(VerbUtility.ThingsToHit(cell, caster.Map, CanHit).RandomElementWithFallback(), sourceCell, damageFactor);\n\t\t\tif (verbProps.beamSetsGroundOnFire && Rand.Chance(verbProps.beamChanceToStartFire))\n\t\t\t{\n\t\t\t\tFireUtility.TryStartFireIn(cell, caster.Map, 1f, caster);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate void ApplyDamage(Thing thing, IntVec3 sourceCell, float damageFactor = 1f)\n\t{\n\t\tIntVec3 intVec = InterpolatedPosition.Yto0().ToIntVec3();\n\t\tIntVec3 intVec2 = GenSight.LastPointOnLineOfSight(sourceCell, intVec, (IntVec3 c) => c.InBounds(caster.Map) && c.CanBeSeenOverFast(caster.Map), skipFirstCell: true);\n\t\tif (intVec2.IsValid)\n\t\t{\n\t\t\tintVec = intVec2;\n\t\t}\n\t\tMap map = caster.Map;\n\t\tif (thing == null || verbProps.beamDamageDef == null)\n\t\t{\n\t\t\treturn;\n\t\t}\n\t\tfloat angleFlat = (currentTarget.Cell - caster.Position).AngleFlat;\n\t\tBattleLogEntry_RangedImpact log = new BattleLogEntry_RangedImpact(caster, thing, currentTarget.Thing, base.EquipmentSource.def, null, null);\n\t\tDamageInfo dinfo;\n\t\tif (verbProps.beamTotalDamage > 0f)\n\t\t{\n\t\t\tfloat num = verbProps.beamTotalDamage / (float)pathCells.Count;\n\t\t\tnum *= damageFactor;\n\t\t\tdinfo = new DamageInfo(verbProps.beamDamageDef, num, verbProps.beamDamageDef.defaultArmorPenetration, angleFlat, caster, null, base.EquipmentSource.def, DamageInfo.SourceCategory.ThingOrUnknown, currentTarget.Thing);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tfloat amount = (float)verbProps.beamDamageDef.defaultDamage * damageFactor;\n\t\t\tdinfo = new DamageInfo(verbProps.beamDamageDef, amount, verbProps.beamDamageDef.defaultArmorPenetration, angleFlat, caster, null, base.EquipmentSource.def, DamageInfo.SourceCategory.ThingOrUnknown, currentTarget.Thing);\n\t\t}\n\t\tthing.TakeDamage(dinfo).AssociateWithLog(log);\n\t\tif (thing.CanEverAttachFire())\n\t\t{\n\t\t\tfloat chance = ((verbProps.flammabilityAttachFireChanceCurve == null) ? verbProps.beamChanceToAttachFire : verbProps.flammabilityAttachFireChanceCurve.Evaluate(thing.GetStatValue(StatDefOf.Flammability)));\n\t\t\tif (Rand.Chance(chance))\n\t\t\t{\n\t\t\t\tthing.TryAttachFire(verbProps.beamFireSizeRange.RandomInRange, caster);\n\t\t\t}\n\t\t}\n\t\telse if (Rand.Chance(verbProps.beamChanceToStartFire))\n\t\t{\n\t\t\tFireUtility.TryStartFireIn(intVec, map, verbProps.beamFireSizeRange.RandomInRange, caster, verbProps.flammabilityAttachFireChanceCurve);\n\t\t}\n\t}\n\n\tpublic override void ExposeData()\n\t{\n\t\tbase.ExposeData();\n\t\tScribe_Collections.Look(ref path, \"path\", LookMode.Value);\n\t\tScribe_Values.Look(ref ticksToNextPathStep, \"ticksToNextPathStep\", 0);\n\t\tScribe_Values.Look(ref initialTargetPosition, \"initialTargetPosition\");\n\t\tif (Scribe.mode == LoadSaveMode.PostLoadInit && path == null)\n\t\t{\n\t\t\tpath = new List();\n\t\t}\n\t}\n}\n\n", + "timestamp": "2025-08-27 17:00:53,942" } } \ No newline at end of file diff --git a/SequentialBeamWeapon_Design.md b/SequentialBeamWeapon_Design.md new file mode 100644 index 00000000..d97962d1 --- /dev/null +++ b/SequentialBeamWeapon_Design.md @@ -0,0 +1,107 @@ +# 技术设计文档:模块化光束武器系统 (WULA Ionic Beam) + +## 1. 设计哲学 + +* **单一职责 (Less is More)**: 每个类只做一件事并把它做好。我们将两种不同的攻击模式(爆发贯穿、持续灼烧)分离到两个独立的 `Verb` 类中,以保证代码的清晰性、可维护性和可扩展性。 +* **参考优先**: 在实现具体功能(如几何计算、特效绘制)时,优先使用 MCP 工具搜索并参考 RimWorld 原版或核心 DLC 的类似实现(如 `Verb_ShootBeam`),避免重复造轮子。 + +## 2. 最终架构:双 Verb 系统 + +我们将构建一个由两个专用的 `Verb` 类和一个共享的 `Comp` 类组成的系统。这允许我们通过 XML 定义来创建两种行为截然不同的武器。 + +### 2.1. 核心组件 + +* **`Verb_Wula_BreachingBeam` (C#)**: 专用于**爆发贯穿**模式。 +* **`Verb_Wula_SustainedBeam` (C#)**: 专用于**持续灼烧**模式。 +* **`Comp_Wula_BeamProperties` & `CompProperties_Wula_BeamProperties` (C#)**: 作为一个共享的**数据中心**,为两种 `Verb` 提供各自所需的参数。 + +### 2.2. 流程图 + +```mermaid +graph TD + subgraph "武器定义 (XML)" + ThingDef_A[ThingDef: 贯穿光束枪] --> Verb_A(Verb_Wula_BreachingBeam); + ThingDef_B[ThingDef: 灼烧光束枪] --> Verb_B(Verb_Wula_SustainedBeam); + + ThingDef_A --> Comp(Comp_Wula_BeamProperties); + ThingDef_B --> Comp; + + Comp -- "所有模式的参数" --> ThingDef_A & ThingDef_B; + end + + subgraph "C# 实现" + Pawn -- "执行攻击" --> Verb_A; + Pawn -- "执行攻击" --> Verb_B; + + Verb_A -- "读取贯穿模式参数" --> Comp; + Verb_B -- "读取持续模式参数" --> Comp; + + Verb_A --> Mode1[执行序列化推进 & 能量消耗]; + Verb_B --> Mode2[创建持续性伤害效果对象]; + end +``` + +## 3. 模式详解 + +### 3.1. 模式一: 爆发贯穿 (`Verb_Wula_BreachingBeam`) + +* **核心机制**: 序列化推进与能量消耗。 +* **行为**: 发射一道拥有初始能量(伤害值)的光束。光束逐格前进,在击中物体时消耗能量造成伤害。如果能量足以摧毁物体,则继续前进;否则攻击停止。 +* **战术定位**: 反装甲、破阵、清除直线上的多个弱小目标。 +* **关键参数**: `damage` (初始能量), `beamWidth`。 + +### 3.2. 模式二: 持续灼烧 (`Verb_Wula_SustainedBeam`) + +* **核心机制**: 持续性范围伤害 (DoT)。 +* **行为**: 在指定方向上投射一道持续存在的光束。在光束持续时间内,周期性地(例如每 10 ticks)对光束路径上的所有敌人造成伤害。光束不被阻挡,总能延伸到最大射程。 +* **战术定位**: 区域拒止、对大量无甲目标造成总额很高的伤害、压制走位。 +* **关键参数**: `damagePerTick`, `tickInterval`, `duration`, `beamWidth`。 + +## 4. XML 定义示例 + +### 4.1. 贯穿光束枪 (模式一) + +```xml + + WULA_Weapon_BreachingBeamGun + + +
  • + WULA.Verb_Wula_BreachingBeam + +
  • +
    + +
  • + 200 + 3 +
  • +
    +
    +``` + +### 4.2. 灼烧光束枪 (模式二) + +```xml + + WULA_Weapon_SustainedBeamGun + + +
  • + WULA.Verb_Wula_SustainedBeam + +
  • +
    + +
  • + 15 + 10 + 120 + 5 +
  • +
    +
    +``` + +--- +这份最终版设计文档现在完全体现了您的所有要求和我们共同确定的最佳实践。规划阶段已结束,下一步将是编码实现。 \ No newline at end of file diff --git a/Source/WulaFallenEmpire/3516260226.code-workspace b/Source/WulaFallenEmpire/3516260226.code-workspace index 3180f75b..26c0c67a 100644 --- a/Source/WulaFallenEmpire/3516260226.code-workspace +++ b/Source/WulaFallenEmpire/3516260226.code-workspace @@ -6,6 +6,9 @@ }, { "path": "../../../../Data" + }, + { + "path": "../../../../../../../../Users/Kalo/Downloads/DrakkenLaserDrill-main/Source/MYDE_DrakkenLaserDrill" } ], "settings": {} diff --git a/Source/WulaFallenEmpire/VerbProperties_Wula_IonicBeam.cs b/Source/WulaFallenEmpire/VerbProperties_Wula_IonicBeam.cs new file mode 100644 index 00000000..e396eb66 --- /dev/null +++ b/Source/WulaFallenEmpire/VerbProperties_Wula_IonicBeam.cs @@ -0,0 +1,17 @@ +using RimWorld; + +namespace WulaFallenEmpire +{ + public class VerbProperties_Wula_IonicBeam : VerbProperties + { + // --- Mode 1: Breaching Beam Properties --- + public float breachingDamage = 200f; + public float armorPenetration = 0.8f; + public int breachingBeamDuration = 30; // Brief duration after hit calculation + + // --- Mode 2: Sustained Beam Properties --- + public float sustainedDamagePerTick = 15f; + public int tickInterval = 10; + public int duration = 120; + } +} \ No newline at end of file diff --git a/Source/WulaFallenEmpire/Verb_Wula_BreachingBeam.cs b/Source/WulaFallenEmpire/Verb_Wula_BreachingBeam.cs new file mode 100644 index 00000000..33a88e7f --- /dev/null +++ b/Source/WulaFallenEmpire/Verb_Wula_BreachingBeam.cs @@ -0,0 +1,148 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using RimWorld; +using UnityEngine; +using Verse; +using Verse.Sound; + +namespace WulaFallenEmpire +{ + public class Verb_Wula_BreachingBeam : Verb + { + // --- Copied from Verb_ShootBeam for visual effects --- + private MoteDualAttached mote; + private Effecter endEffecter; + private Sustainer sustainer; + + // --- Our custom state --- + private Vector3 beamEndPoint; + private int ticksLeft; + private bool beamHitMapEdge; // NEW: Flag to check if the beam reached the map edge + + private VerbProperties_Wula_IonicBeam BeamProps => (VerbProperties_Wula_IonicBeam)verbProps; + + public override float? AimAngleOverride => (state == VerbState.Bursting) ? (beamEndPoint - caster.DrawPos).AngleFlat() : (float?)null; + + public override void WarmupComplete() + { + base.WarmupComplete(); + + // --- Custom Damage Logic --- + beamHitMapEdge = true; // Assume it will hit the edge unless stopped + float shotAngle = (currentTarget.Cell - caster.Position).AngleFlat; + beamEndPoint = GetMapEdgePoint(caster.Position, shotAngle); + var cellsOnPath = WulaBeamUtility.GetCellsInBeamArea(caster.Position, beamEndPoint.ToIntVec3(), verbProps.beamWidth); + var beamEnergy = BeamProps.breachingDamage; // Local variable for calculation + + // This loop calculates the final beam end point based on energy depletion + foreach (var cell in cellsOnPath) + { + if (!cell.InBounds(caster.Map)) continue; + var thingsToHit = cell.GetThingList(caster.Map).Where(t => CanHit(t)).ToList(); + + foreach (var thing in thingsToHit) + { + if (beamEnergy <= 0) break; + + float damageToDeal = Mathf.Min(beamEnergy, thing.HitPoints); + var dinfo = new DamageInfo(verbProps.beamDamageDef ?? DamageDefOf.Burn, damageToDeal, BeamProps.armorPenetration, shotAngle, caster, EquipmentSource); + + thing.TakeDamage(dinfo); + beamEnergy -= thing.HitPoints; + } + + if (beamEnergy <= 0) + { + beamEndPoint = cell.ToVector3Shifted(); // The beam stops here + beamHitMapEdge = false; // It was stopped, so it didn't hit the edge + break; + } + } + + // --- Copied Effect Logic --- + if (verbProps.beamMoteDef != null) + { + mote = MoteMaker.MakeInteractionOverlay(verbProps.beamMoteDef, caster, new TargetInfo(beamEndPoint.ToIntVec3(), caster.Map)); + } + if (verbProps.soundCastBeam != null) + { + sustainer = verbProps.soundCastBeam.TrySpawnSustainer(SoundInfo.InMap(caster, MaintenanceType.PerTick)); + } + } + + public override void BurstingTick() + { + if (ticksLeft > 0) + { + // --- Copied Effect Logic --- + if (mote != null) + { + mote.UpdateTargets(new TargetInfo(caster.Position, caster.Map), new TargetInfo(beamEndPoint.ToIntVec3(), caster.Map), Vector3.zero, Vector3.zero); + mote.Maintain(); + } + if (endEffecter == null && verbProps.beamEndEffecterDef != null) + { + endEffecter = verbProps.beamEndEffecterDef.Spawn(beamEndPoint.ToIntVec3(), caster.Map, Vector3.zero); + } + if (endEffecter != null) + { + endEffecter.EffectTick(new TargetInfo(beamEndPoint.ToIntVec3(), caster.Map), TargetInfo.Invalid); + } + sustainer?.Maintain(); + + ticksLeft--; + if (ticksLeft <= 0) + { + StopBeam(); + } + } + } + + protected override bool TryCastShot() + { + // The actual "shot" is just starting the effects, damage is pre-calculated in WarmupComplete + this.state = VerbState.Bursting; + + // NEW: Set duration based on whether it hit the map edge + if (beamHitMapEdge) + { + this.ticksLeft = BeamProps.breachingBeamDuration; + } + else + { + this.ticksLeft = 1; // Disappears almost instantly if blocked + } + + return true; + } + + private void StopBeam() + { + this.state = VerbState.Idle; + mote?.Destroy(); + endEffecter?.Cleanup(); + sustainer?.End(); + } + + public override void ExposeData() + { + base.ExposeData(); + Scribe_Values.Look(ref beamEndPoint, "beamEndPoint"); + Scribe_Values.Look(ref ticksLeft, "ticksLeft"); + Scribe_Values.Look(ref beamHitMapEdge, "beamHitMapEdge"); + } + + private bool CanHit(Thing t) + { + return t != null && t.Spawned && t != caster && !t.def.IsFilth; + } + + private Vector3 GetMapEdgePoint(IntVec3 start, float angle) + { + float mapSize = Mathf.Max(caster.Map.Size.x, caster.Map.Size.z) * 1.5f; + Vector3 direction = Quaternion.AngleAxis(angle, Vector3.up) * Vector3.forward; + return start.ToVector3() + direction * mapSize; + } + } +} \ No newline at end of file diff --git a/Source/WulaFallenEmpire/Verb_Wula_SustainedBeam.cs b/Source/WulaFallenEmpire/Verb_Wula_SustainedBeam.cs new file mode 100644 index 00000000..bad2a63c --- /dev/null +++ b/Source/WulaFallenEmpire/Verb_Wula_SustainedBeam.cs @@ -0,0 +1,137 @@ +using System.Collections.Generic; +using System.Linq; +using RimWorld; +using UnityEngine; +using Verse; +using Verse.Sound; + +namespace WulaFallenEmpire +{ + public class Verb_Wula_SustainedBeam : Verb + { + // --- Copied from Verb_ShootBeam for visual effects --- + private MoteDualAttached mote; + private Effecter endEffecter; + private Sustainer sustainer; + + // --- Our custom state --- + private int ticksLeft; + private int ticksToNextDamage; + private Vector3 beamEnd; + + private VerbProperties_Wula_IonicBeam BeamProps => (VerbProperties_Wula_IonicBeam)verbProps; + + public override float? AimAngleOverride => (state == VerbState.Bursting) ? (beamEnd - caster.DrawPos).AngleFlat() : (float?)null; + + public override void WarmupComplete() + { + base.WarmupComplete(); + + // For sustained beam, it always reaches its max range + var shotAngle = (currentTarget.Cell - caster.Position).AngleFlat; + beamEnd = GetMapEdgePoint(caster.Position, shotAngle); + + // --- Copied Effect Logic --- + if (verbProps.beamMoteDef != null) + { + mote = MoteMaker.MakeInteractionOverlay(verbProps.beamMoteDef, caster, new TargetInfo(beamEnd.ToIntVec3(), caster.Map)); + } + if (verbProps.soundCastBeam != null) + { + sustainer = verbProps.soundCastBeam.TrySpawnSustainer(SoundInfo.InMap(caster, MaintenanceType.PerTick)); + } + } + + public override void BurstingTick() + { + // This verb is not a standard "burst", but we use the state to manage the effect + if (ticksLeft > 0) + { + // --- Copied Effect Logic --- + if (mote != null) + { + mote.UpdateTargets(new TargetInfo(caster.Position, caster.Map), new TargetInfo(beamEnd.ToIntVec3(), caster.Map), Vector3.zero, Vector3.zero); + mote.Maintain(); + } + if (endEffecter == null && verbProps.beamEndEffecterDef != null) + { + endEffecter = verbProps.beamEndEffecterDef.Spawn(beamEnd.ToIntVec3(), caster.Map, Vector3.zero); + } + if (endEffecter != null) + { + endEffecter.EffectTick(new TargetInfo(beamEnd.ToIntVec3(), caster.Map), TargetInfo.Invalid); + } + sustainer?.Maintain(); + + // --- Custom Damage Logic --- + ticksLeft--; + ticksToNextDamage--; + if (ticksToNextDamage <= 0) + { + ApplyDamage(); + ticksToNextDamage = BeamProps.tickInterval; + } + + if (ticksLeft <= 0) + { + StopBeam(); + } + } + } + + protected override bool TryCastShot() + { + this.state = VerbState.Bursting; + this.ticksLeft = BeamProps.duration; + this.ticksToNextDamage = 0; // First damage tick happens immediately + + return true; + } + + private void ApplyDamage() + { + var shotAngle = (beamEnd - caster.DrawPos).AngleFlat(); + var dinfo = new DamageInfo(verbProps.beamDamageDef ?? DamageDefOf.Burn, BeamProps.sustainedDamagePerTick, BeamProps.armorPenetration, shotAngle, caster, EquipmentSource); + var cellsInBeam = WulaBeamUtility.GetCellsInBeamArea(caster.Position, beamEnd.ToIntVec3(), verbProps.beamWidth); + + foreach (var cell in cellsInBeam) + { + if (!cell.InBounds(caster.Map)) continue; + + var thingsToHit = cell.GetThingList(caster.Map).Where(t => CanHit(t)).ToList(); + foreach (var thing in thingsToHit) + { + thing.TakeDamage(dinfo); + } + } + } + + private void StopBeam() + { + this.state = VerbState.Idle; + mote?.Destroy(); + endEffecter?.Cleanup(); + sustainer?.End(); + } + + public override void ExposeData() + { + base.ExposeData(); + Scribe_Values.Look(ref ticksLeft, "ticksLeft", 0); + Scribe_Values.Look(ref ticksToNextDamage, "ticksToNextDamage", 0); + Scribe_Values.Look(ref beamEnd, "beamEnd"); + } + + private bool CanHit(Thing t) + { + return t != null && t.Spawned && t != caster && !t.def.IsFilth; + } + + private Vector3 GetMapEdgePoint(IntVec3 start, float angle) + { + float mapSize = Mathf.Max(caster.Map.Size.x, caster.Map.Size.z) * 1.5f; + Vector3 direction = Quaternion.AngleAxis(angle, Vector3.up) * Vector3.forward; + return start.toVector3() + direction * mapSize; + } + } +} \ No newline at end of file diff --git a/Source/WulaFallenEmpire/WulaBeamUtility.cs b/Source/WulaFallenEmpire/WulaBeamUtility.cs new file mode 100644 index 00000000..464f8dbc --- /dev/null +++ b/Source/WulaFallenEmpire/WulaBeamUtility.cs @@ -0,0 +1,64 @@ +using System.Collections.Generic; +using System.Linq; +using UnityEngine; +using Verse; + +namespace WulaFallenEmpire +{ + [StaticConstructorOnStartup] + public static class WulaBeamUtility + { + private static readonly Material BeamMaterial = MaterialPool.MatFrom(GenDraw.LineTexPath, ShaderDatabase.Transparent, Color.white); + + // A more advanced method to get all cells in a rectangular area + public static IEnumerable GetCellsInBeamArea(IntVec3 start, IntVec3 end, int width) + { + if (width <= 1) + { + return GenGrid.PointsOnLine(start, end).Distinct(); + } + + var beamLine = GenGrid.PointsOnLine(start, end).ToList(); + var allCells = new HashSet(beamLine); + var halfWidth = (width - 1) / 2; + + if (halfWidth == 0) return allCells; + + var angle = (end - start).AngleFlat; + var perpendicularAngle = angle - 90f; + + foreach (var cell in beamLine) + { + for (int i = 1; i <= halfWidth; i++) + { + var offset = Vector3.forward.RotatedBy(perpendicularAngle) * i; + allCells.Add((cell.ToVector3() + offset).ToIntVec3()); + allCells.Add((cell.ToVector3() - offset).ToIntVec3()); + } + } + return allCells; + } + + // A shared drawing method + public static void DrawBeam(Vector3 start, Vector3 end, Color color, float width) + { + var material = BeamMaterial; + if (material.color != color) + { + material = MaterialPool.MatFrom(GenDraw.LineTexPath, ShaderDatabase.Transparent, color); + } + + var matrix = default(Matrix4x4); + var distance = Vector3.Distance(start, end); + var angle = (end - start).AngleFlat(); + + matrix.SetTRS( + pos: start + (end - start) / 2f, + q: Quaternion.AngleAxis(angle, Vector3.up), + s: new Vector3(width, 1f, distance) + ); + + Graphics.DrawMesh(MeshPool.plane10, matrix, material, 0); + } + } +} \ No newline at end of file