diff --git a/1.6/1.6/Assemblies/WulaFallenEmpire.dll b/1.6/1.6/Assemblies/WulaFallenEmpire.dll index 9da1e209..4f393ed2 100644 Binary files a/1.6/1.6/Assemblies/WulaFallenEmpire.dll and b/1.6/1.6/Assemblies/WulaFallenEmpire.dll differ diff --git a/1.6/1.6/Defs/Effects/Mote_Wula.xml b/1.6/1.6/Defs/Effects/Mote_Wula.xml index b79d37d0..3629b15f 100644 --- a/1.6/1.6/Defs/Effects/Mote_Wula.xml +++ b/1.6/1.6/Defs/Effects/Mote_Wula.xml @@ -60,9 +60,11 @@ true - Things/Projectile/ChargeLanceShot + Things/Mote/GraserBeam Graphic_MoteWithAgeSecs MoteBeam + (0.25,1) + (165, 44, 2, 255) <_ScrollSpeedA>0 <_ScrollSpeedB>0 @@ -70,4 +72,29 @@ + + + Mote_WULA_Beam_Charge + MoteAttached + MoteOverhead + + 0.15 + 0.3 + 999999 + True + + + Wula/Mote/Mote_WULA_Beam_Charge + Graphic_MoteWithAgeSecs + MoteGlow + + <_RandomTex>/Things/Mote/RandomFlicker + <_FlickerFrequency>0.25 + <_FlickerAmount>0.6 + <_InnerCircleIntensity>0.1 + <_InnerCircleSize>0.1 + <_InnerCircleShimmerAmount>0.14 + + + \ No newline at end of file diff --git a/1.6/1.6/Defs/Effects/WulaFleckDefs.xml b/1.6/1.6/Defs/Effects/WulaFleckDefs.xml index 8f47e1a3..574b6491 100644 --- a/1.6/1.6/Defs/Effects/WulaFleckDefs.xml +++ b/1.6/1.6/Defs/Effects/WulaFleckDefs.xml @@ -68,4 +68,17 @@ 0.08 0.13 + + + WULA_Smoke_Tail + + Things/Mote/Smoke + true + + MoteOverhead + 0.50 + 1 + 1.2 + 0.005 + diff --git a/1.6/1.6/Defs/FactionDefs/Factions_Player_WULA.xml b/1.6/1.6/Defs/FactionDefs/Factions_Player_WULA.xml index 1fc9bba0..7725dee0 100644 --- a/1.6/1.6/Defs/FactionDefs/Factions_Player_WULA.xml +++ b/1.6/1.6/Defs/FactionDefs/Factions_Player_WULA.xml @@ -98,8 +98,6 @@ 100 60 30 - 10 - 10 @@ -138,8 +136,6 @@ Combat 30 - 2 - 2 10 3 3 diff --git a/1.6/1.6/Defs/HediffDefs/Hediffs_WULA.xml b/1.6/1.6/Defs/HediffDefs/Hediffs_WULA.xml index d40c6eb2..440e47f0 100644 --- a/1.6/1.6/Defs/HediffDefs/Hediffs_WULA.xml +++ b/1.6/1.6/Defs/HediffDefs/Hediffs_WULA.xml @@ -4,7 +4,7 @@ Wula_Synth - 乌拉帝国制式合成人,拥有一部分机械体的特性——她们无法被点燃、不会中毒、免疫大量疾病、不会抱怨温度,但是无法自我修复,并且需要获取能量以维持机体运转。 + 乌拉帝国的合成人,拥有一部分机械体的特性——她们难以被点燃、免疫常规疾病、可以使用纳米系统自我修复,但是需要获取能量以维持机体运转。 Hediff_High false false @@ -20,16 +20,9 @@ 0 0 - - - -100 - 120 - 1 - 1 - - - 0 + + 0.05 @@ -75,71 +68,10 @@ - - - WULA_Heavy_Infantry_PowerArmor_PowerFist - - 动力拳 - 一个由外骨骼和加压线圈组成的拳套,内置于乌拉帝国重装装甲的夹层中,可以击碎任何胆敢靠近的敌军的头颅。这套武备是由神经系统直接驱动的——无论盔甲穿戴者是否还拥有生物学意义上的“手”。 - -
  • - -
  • - - -
  • Poke
  • - - 25 - 2.2 - true - - -
  • - Stun - 12 -
  • -
    -
    - - - - -
  • - - - - - WULA_Shutdown - - 机械乌拉的机体能量已完全耗尽,所有非核心功能已下线,需要立刻补充能量。\n\n如果需要重启机械乌拉,你需要建造一个抢修点或者合成人充电站,可以从事医生职位的殖民者将会把失能的机械乌拉带到修复站,并使用乌拉帝国能源核心重启机械乌拉。 - HediffWithComps - true - -
  • - - 0 - -
  • - Consciousness - 0.1 -
  • -
  • - Moving - 0.1 -
  • -
  • - Manipulation - 0.1 -
  • - - - -
    WULA_Maintenance_Neglect - 如果缺乏定期维护,身体机能将会出现衰退迹象。需要进入维护舱进行修复。 + 乌拉帝国的合成人因为设计的过于繁琐,导致需要频繁维护。当她们处于良好维护状态时,各方面的能力都会有所上升,反之如果常年得不到维护或是短时间受到大量伤害,则其将变得难以自主运行甚至直接停机! Hediff_High (0.8, 0.35, 0.35) false @@ -213,6 +145,67 @@ + + WULA_Heavy_Infantry_PowerArmor_PowerFist + + 动力拳 + 一个由外骨骼和加压线圈组成的拳套,内置于乌拉帝国重装装甲的夹层中,可以击碎任何胆敢靠近的敌军的头颅。这套武备是由神经系统直接驱动的——无论盔甲穿戴者是否还拥有生物学意义上的“手”。 + +
  • + +
  • + + +
  • Poke
  • + + 25 + 2.2 + true + + +
  • + Stun + 12 +
  • +
    +
    + + + + +
  • + + + + + WULA_Shutdown + + 机械乌拉的机体能量已完全耗尽,所有非核心功能已下线,需要立刻补充能量。\n\n如果需要重启机械乌拉,你需要建造一个抢修点或者合成人充电站,可以从事医生职位的殖民者将会把失能的机械乌拉带到修复站,并使用乌拉帝国能源核心重启机械乌拉。 + HediffWithComps + true + +
  • + + 0 + +
  • + Consciousness + 0.1 +
  • +
  • + Moving + 0.1 +
  • +
  • + Manipulation + 0.1 +
  • + + + +
    + WULA_MechCarrierSwitchHediff @@ -302,4 +295,35 @@ false + + + WULA_NanoRepairHediff + + 乌拉帝国的机械体集成了纳米修复系统,只要有电量,它们就能一直修复机械体受到的损伤——这套系统的设计使其需要在一段时间内未受到伤害才能启动。 + HediffWithComps + (0.6, 0.4, 0.8) + false + false + + + +
  • + + 0 +
  • +
  • + + 1 +
  • +
    + +
  • + 0.5 + 1.5 + 0.1 + 0.01 + 1200 +
  • +
    +
    \ No newline at end of file diff --git a/1.6/1.6/Defs/NeedDefs/WULA_Needs.xml b/1.6/1.6/Defs/NeedDefs/WULA_Needs.xml index 88ba42e3..01a3f2ae 100644 --- a/1.6/1.6/Defs/NeedDefs/WULA_Needs.xml +++ b/1.6/1.6/Defs/NeedDefs/WULA_Needs.xml @@ -4,7 +4,7 @@ WULA_Energy WulaFallenEmpire.Need_WulaEnergy - 乌拉帝国的合成人正常活动需要能量维持,在缺少能量时将倒地不起,无法进行任何工作。\n\n机械乌拉和常规机械体不同,她们只有一种指定的能量接口,只能通过能源核心补充能量,在乌拉帝国编织体工作台制造这种核心。 + 乌拉帝国的合成人正常活动需要能量维持,在缺少能量时将倒地不起,无法进行任何工作。\n\n机械乌拉的充电站是特殊的,她们只能在合成人充电站充电,无法使用常规充电站。 800 true true diff --git a/1.6/1.6/Defs/PawnKinds/PawnKinds_Wula.xml b/1.6/1.6/Defs/PawnKinds/PawnKinds_Wula.xml index 1120143c..3067c795 100644 --- a/1.6/1.6/Defs/PawnKinds/PawnKinds_Wula.xml +++ b/1.6/1.6/Defs/PawnKinds/PawnKinds_Wula.xml @@ -267,7 +267,6 @@ -
  • @@ -288,24 +287,6 @@ 9999~9999 0.65 --> - - Mech_WULA_Cat_Fire - - Mech_WULA_Cat_Fire - 200 - -
  • GrenadeFlame
  • - -
    - - Mech_WULA_Cat_EMP - - Mech_WULA_Cat_EMP - 200 - -
  • GrenadeEMP
  • -
    -
    Mech_WULA_Cat_Constructor @@ -346,30 +327,6 @@
  • Wula_Assault_Cat_Weapon
  • - - Mech_WULA_Cat_DM - - Mech_WULA_Cat_DM - PlayerColony - False - 1000 - -
  • - - Wula/Things/WULA_DM_Cat/WULA_Cat_Thin - Wula/Things/WULA_DM_Cat/AllegianceOverlays/None - CutoutWithOverlay - Graphic_Multi - 1.1 - -
  • -
    - -
  • Mech_WULA_Cat_DM_HediffTag
  • -
    - 9999~9999 - 1 -
    diff --git a/1.6/1.6/Defs/RecipeDefs/Recipes_WULA.xml b/1.6/1.6/Defs/RecipeDefs/Recipes_WULA.xml index 20c683a8..675bff65 100644 --- a/1.6/1.6/Defs/RecipeDefs/Recipes_WULA.xml +++ b/1.6/1.6/Defs/RecipeDefs/Recipes_WULA.xml @@ -648,66 +648,6 @@ WULA_Machine_Productor_Technology - - WULA_Build_Mech_Cat_EMP - - 建造一台CAt-23"闪电猫猫"辅助机器人,可以执行搬运、清理、和灭火工作,配备EMP手榴弹。 - -
  • - - -
  • Steel
  • - - - 50 - -
  • - - -
  • ComponentIndustrial
  • - - - 4 - -
    - - 1 - - - Mech_WULA_Cat_EMP - - WULA_Machine_Productor_1_Technology -
    - - WULA_Build_Mech_Cat_Fire - - 建造一台CAt-42"烈焰猫猫"辅助机器人,可以执行搬运、清理、和灭火工作,配备燃烧瓶。 - -
  • - - -
  • Steel
  • - - - 50 - -
  • - - -
  • ComponentIndustrial
  • - - - 4 - -
    - - 1 - - - Mech_WULA_Cat_Fire - - WULA_Machine_Productor_1_Technology -
    WULA_Build_Mech_Cat_Assault @@ -738,42 +678,4 @@ WULA_Machine_Productor_1_Technology - - WULA_Build_Mech_Cat_DM - - 建造一台CAt-96"暗物质猫猫"辅助机器人,可以执行包括搬运、烹饪、种植收割、清理、急救和灭火一类的简单工作,无需充电,但是死亡时会产生湮灭爆炸。 - -
  • - - -
  • Steel
  • - - - 50 - -
  • - - -
  • ComponentIndustrial
  • - - - 4 - -
  • - - -
  • WULA_Dark_Matter_Item
  • - - - 1 - -
    - - 1 - - - Mech_WULA_Cat_DM - - WULA_Mech_WULA_Cat_DM_Technology -
    \ No newline at end of file diff --git a/1.6/1.6/Defs/SoundDefs/Wula_Sound_Weapons.xml b/1.6/1.6/Defs/SoundDefs/Wula_Sound_Weapons.xml index 74731cba..7e0d6fc8 100644 --- a/1.6/1.6/Defs/SoundDefs/Wula_Sound_Weapons.xml +++ b/1.6/1.6/Defs/SoundDefs/Wula_Sound_Weapons.xml @@ -32,4 +32,57 @@ + + WULA_MW_Breaker_Bar_Hit + MapOnly + 2 + +
  • + +
  • + Wula/WULA_MW_Breaker_Bar_Hit +
  • + + 65 + 0.9~1.1 + +
    +
    + + WULA_RW_Railgun_Shootingsound + MapOnly + 2 + +
  • + +
  • + Wula/WULA_RW_Railgun_Shootingsound +
  • + + 65 + 0.9~1.1 + +
    +
    + + WULA_RW_Beam_Shootingsound + true + MapOnly + 99 + PrioritizeNearest + + +
  • + + +
  • + Wula/WULA_RW_Beam_Shootingsound +
  • + + 0.99~1.01 + 50 + 0.2 + +
    +
    \ No newline at end of file diff --git a/1.6/1.6/Defs/ThingDefs_Buildings/Buildings_Drop.xml b/1.6/1.6/Defs/ThingDefs_Buildings/Buildings_Drop.xml new file mode 100644 index 00000000..2d60658b --- /dev/null +++ b/1.6/1.6/Defs/ThingDefs_Buildings/Buildings_Drop.xml @@ -0,0 +1,233 @@ + + + + + WULA_RecycleMechanoid + WulaFallenEmpire.JobDriver_RecycleMechanoid + 正在准备进入猫猫地堡。 + + + WULA_Cat_Bunker_Cleanzone + + 清理出一块场地并准备好资源,使得乌拉帝国母舰可以向此处投放建筑。建造好的信标可以收起或移至他处,但是必须要有母舰或者后勤舰在上空才能投送建筑。\n\n乌拉猫猫地堡是集生产和防御为一体的坚实建筑,3只乌拉猫猫自律机械体会和地堡一起空降。地堡可供乌拉猫猫更换工作类型,并允许乌拉猫猫进驻使用内部武器击败来犯敌军。 + Wula/Building/WULA_Cat_Bunker_south + MinifiedThing + Normal + + WULA_Cat_Bunker + Mech_WULA_Cat + Mech_WULA_Cat_Constructor + Mech_WULA_Cat_Assault + + +
  • BuildingsMisc
  • +
    + + Wula/Building/WULA_Dropping_Building_Cleanzone + Graphic_Multi + (3,3) + + false + + + Building + PassThroughOnly + false + 0.5 + false + 0 + false + + + 1 + 1 + 1 + 0 + + (3,3) + 0 + 1 + + 300 + + + BuildingDestroyed_Metal_Small + + WULA_Buildings + +
  • + WULA_Cat_Bunker_Incoming + true + 1 + WULA_Flyover_BaseBuilder + true + false + 乌拉帝国母舰或后勤舰 +
  • +
    +
    + + WULA_Cat_Bunker_Incoming + + (3,3) + + Wula/Building/WULA_Cat_Bunker_Incoming + Graphic_Single + CutoutFlying + (3,3) + + + Accelerate + Things/Skyfaller/SkyfallerShadowDropPod + (2, 2) + DropPod_Fall + 100 + Explosion_Vaporize + 0.05 + 1 + 1 + + +
  • (0,0)
  • +
  • (1, 1)
  • +
    +
    + WULA_Cat_Bunker +
    + +
  • + Smoke_Joint +
  • +
    +
    + + WULA_Cat_Bunker + + 这是一个从乌拉帝国母舰上空投下来的地堡,它拥有一些预制件,可以供乌拉猫猫更换其工作类型。此外,当敌人袭击时,可将乌拉猫猫召回至地堡内,它们将在地堡里对外射击以击退来犯者。 + WulaFallenEmpire.Building_MechanoidRecycler + Normal + + WULA_Cat_Bunker_TurretGun + Mech_WULA_Cat + Mech_WULA_Cat_Constructor + Mech_WULA_Cat_Assault + + + Wula/Building/WULA_Cat_Bunker + Graphic_Multi + (3,3) + + false + + + (1.65, 1.65, 0.85) + (0, 0, -0.2) + + + Building + PassThroughOnly + false + 0.5 + false + 42 + false + + 0 + + 2500 + 1 + 20 + 0 + + (3,3) + + 200 + + + BuildingDestroyed_Metal_Small + 3.5 + + +
  • BuildingsMisc
  • +
    + +
  • + 6 + + + +
  • Mech_WULA_Cat
  • +
  • Mech_WULA_Cat_Constructor
  • +
  • Mech_WULA_Cat_Assault
  • + + WULA_RecycleMechanoid + 5 + + + +
  • Mech_WULA_Cat
  • +
  • Mech_WULA_Cat_Constructor
  • +
  • Mech_WULA_Cat_Assault
  • +
    + + + +
  • + Mech_WULA_Cat + 1 +
  • +
  • + Mech_WULA_Cat_Constructor + 1 +
  • +
  • + Mech_WULA_Cat_Assault + 1 +
  • +
    + + + +
  • + WULA_Cat_Bunker_TurretGun + 0 + true + 6 + 1.5 +
  • +
    +
    + + WULA_Cat_Bunker_TurretGun + + 由进入地堡的乌拉猫猫操纵的炮塔——说那么多干什么,扣扳机就完了,殖民地会报销弹药的。 + + Wula/Weapon/WULA_Weapon_Empty + Graphic_Single + + + 0.5 + 0.3 + 0.25 + 0.12 + 4.8 + 0 + 5 + 0 + + +
  • + Verb_Shoot + Bullet_WULA_RW_Base_AR + 0 + 21 + 32 + 2 + Shot_AssaultRifle + GunTail_Medium + 9 + 1 +
  • +
    +
    +
    \ No newline at end of file diff --git a/1.6/1.6/Defs/ThingDefs_Buildings/Buildings_Spawner.xml b/1.6/1.6/Defs/ThingDefs_Buildings/Buildings_Spawner.xml deleted file mode 100644 index 023f2222..00000000 --- a/1.6/1.6/Defs/ThingDefs_Buildings/Buildings_Spawner.xml +++ /dev/null @@ -1,103 +0,0 @@ - - - - - WULA_ComponentAssembler - - 一台复杂的机器,可以缓慢地用原材料组装零部件。需要钢铁和木材才能运作。 - Building - - Things/Building/Production/FabricationBench - Graphic_Multi - (3.5, 1.5) - - Damage/Corner - Damage/Corner - Damage/Corner - Damage/Corner - - - Building - PassThroughOnly - 0.5 - 70 - true - - 350 - 4000 - 1.0 - -15 - - Normal - (3,1) - - 200 - 8 - - - -
  • - CompPowerTrader - 350 -
  • -
  • - - -
  • - 120000~120000 - -
  • - ComponentIndustrial - 5 -
  • -
  • - ComponentSpacer - 1 -
  • - - true - - - -
  • - steel - 钢材储量 - - -
  • Steel
  • - - - 200 - 1 - true - true - true - - - -
  • - wood - 木材储量 - - -
  • WoodLog
  • - - - 300 - 2 - true - true - true - - -
  • - - Heavy - Production - 6 - -
  • Fabrication
  • - -
    - -
    \ No newline at end of file diff --git a/1.6/1.6/Defs/ThingDefs_Buildings/Buildings_WULA.xml b/1.6/1.6/Defs/ThingDefs_Buildings/Buildings_WULA.xml index 9ecc932e..eb897d06 100644 --- a/1.6/1.6/Defs/ThingDefs_Buildings/Buildings_WULA.xml +++ b/1.6/1.6/Defs/ThingDefs_Buildings/Buildings_WULA.xml @@ -344,18 +344,6 @@ - - - Wula_SleepingSpot - - 指定一块地方,供机械乌拉躺下以进行抢修。 - - Things/Building/Furniture/Bed/SleepSpot - Graphic_Multi - (3,4) - - (1,2) - @@ -837,78 +825,4 @@
  • PlaceWorker_PreventInteractionSpotOverlap
  • - - - - WULA_Steel_Assembler - - 一台来自于乌拉帝国的极其复杂的机器,无法在边缘世界建造。其可以将有机物转化通过分子重构转换为无机物钢铁,以辅助乌拉帝国殖民地的开拓进程。 - Building - MinifiedThing - - Things/Building/Production/FabricationBench - Graphic_Multi - (3.5, 1.5) - - Damage/Corner - Damage/Corner - Damage/Corner - Damage/Corner - - - Building - PassThroughOnly - 0.5 - 70 - true - -
  • BuildingsMisc
  • -
    - - 1000 - 0 - -15 - 20 - - Normal - (3,3) - - -
  • - CompPowerTrader - 100 -
  • -
  • - -
  • - 120000~120000 - -
  • - Steel - 100 -
  • - - true - - -
  • - steel - 有机物储量 - - -
  • Wula_Organic_Precursor
  • - - - 200 - 10 - true - 1 - false - true - true - -
  • - - Heavy - \ No newline at end of file diff --git a/1.6/1.6/Defs/ThingDefs_Misc/WULA_Flyover_Item.xml b/1.6/1.6/Defs/ThingDefs_Misc/WULA_Flyover_Item.xml new file mode 100644 index 00000000..6c0a85e5 --- /dev/null +++ b/1.6/1.6/Defs/ThingDefs_Misc/WULA_Flyover_Item.xml @@ -0,0 +1,342 @@ + + + + WULA_BattleShip + + WulaFallenEmpire.FlyOver + Normal + RealtimeOnly + + Wula/FlyoverThing/WULA_BattleShip_Shadow + Graphic_Single + TransparentPostLight + (100,250) + (195,195,195,45) + + + Wula/Weapon/WULA_Weapon_Empty + (0, 0) + 0 + FlyOver/Flying + FlyOver/Landing + + +
  • + Wula/Weapon/WULA_Weapon_Empty + true + 0.8 + 0 + 0 + 0 + 0 + + true + 1 + 50 +
  • + + true + false + false + false + MetaOverlays + + +
  • + 60 + 帝国母舰已抵达 + 一艘帝国母舰响应请求抵达殖民地上空! + PositiveEvent + true + true + false +
  • +
  • + WULA_Flyover_BaseBuilder + true +
  • +
    +
    + + WULA_CallBattleShip + + 发送增援请求,呼叫乌拉帝国舰队的战舰前往殖民地 + Wula/UI/Abilities/WULA_CallBattleShip + 1 + Misc12 + false + + Verb_CastAbility + false + false + true + 1 + 19.9 + true + + True + + + +
  • + WULA_BattleShip + Standard + 0.01 + 20 + MapEdge + OppositeMapEdge + true +
  • +
    +
    + + + + WulaFallenEmpire.FlyOver + Normal + RealtimeOnly + + + Wula/FlyoverThing/WULA_Fighter_Shadow + Graphic_Single + TransparentPostLight + (40,20) + (195,195,195,45) + + false + 0 + + Wula/Weapon/WULA_Weapon_Empty + (0, 0) + 0 + FlyOver/Flying + FlyOver/Landing + + +
  • + Wula/Weapon/WULA_Weapon_Empty + true + 0.8 + 0 + 0 + 0 + 0 + + true + 1 + 20 +
  • +
    + true + false + false + false + MetaOverlays +
    + + WULA_Fighter_A + +
  • + Bullet_WULA_Fighter_A_Rocket + 50 + + + 13 + 0 + 0 + 0 + Alternating + + + 10 + 10 + 10 + Fixed + + + true + Mote_SparkSimple +
  • +
  • + Bullet_WULA_RW_Fractal_RF + 30 + 50 + 3 + 0.3 + 24 + + + 13 + 0 + 0 + 0 + Alternating + + + 13 + 13 + 13 + Fixed + + + true + Mote_SparkSimple +
  • +
    +
    + + Bullet_WULA_Fighter_A_Rocket + + + Wula/Projectile/WULA_Loitering_Munition + Graphic_Single + + WulaFallenEmpire.Projectile_ExplosiveWithTrail + + BombSuper + 180 + 30 + 1 + 2.0 + 4 + MortarBomb_Explode + 0.5 + false + + +
  • + WULA_GunTail_Plasma + 3 +
  • +
    +
    + + WULA_Spawn_Fighter_Rocket + + 指挥乌拉帝国的战机,中速掠过战场,使用其导弹对目标区域发起打击。\n\n在飞行期间,它会使用磁轨炮打击遇到的敌人。 + + 1 + Misc12 + false + + Verb_CastAbility + false + false + 1 + 120 + true + + false + true + + + + +
  • + WULA_Fighter_A + GroundStrafing + 3 + 20 + true + Perpendicular + + + true + 4 + 25 + 0.13 + + 12 + 16 + + + true + + + true + (1.0,0.3,0.1,0.2) + + + true + (0.3,0.7,1.0,0.3) +
  • +
    +
    + + WULA_Fighter_B + +
  • + Bullet_WULA_RW_Fractal_RF + 30 + 50 + 6 + 0.1 + -1 + + + 13 + 0 + 0 + 0 + Alternating + + + 13 + 13 + 13 + Fixed + + + true + Mote_SparkSimple +
  • +
    +
    + + WULA_Spawn_Fighter_RailGun + + 指挥乌拉帝国的战机,低速掠过战场,使用其磁轨炮打击遇到的所有敌人。 + + 1 + Misc12 + false + + Verb_CastAbility + false + false + 1 + 120 + true + + false + true + + + + +
  • + WULA_Fighter_B + GroundStrafing + 3 + 20 + true + Perpendicular + + + true + + + true + (0.3,0.7,1.0,0.3) +
  • +
    +
    + \ No newline at end of file diff --git a/1.6/1.6/Defs/ThingDefs_Misc/Weapons/WULA_FE_Balistic_Weapon.xml b/1.6/1.6/Defs/ThingDefs_Misc/Weapons/WULA_FE_Balistic_Weapon.xml deleted file mode 100644 index 78f90418..00000000 --- a/1.6/1.6/Defs/ThingDefs_Misc/Weapons/WULA_FE_Balistic_Weapon.xml +++ /dev/null @@ -1,217 +0,0 @@ - - - - WULA_RW_Base_AR - - 乌拉帝国的旧式突击步枪,仍然使用落后的导气式结构驱动自动射击构件,通常被派发给炮灰战斗人员。 - Normal - Spacer - - Wula/Weapon/WULA_RW_Base_AR - Graphic_Single - - Interact_Rifle - - -
  • WULA_Cube_Productor_BIO
  • -
  • WULA_Cube_Productor_Energy
  • -
    - WULA_Synth_Weapon_Technology - UnfinishedWeapon -
    - - 1300 - - 3.5 - 0.75 - 0.75 - 0.65 - 0.45 - 1.2 - - -
  • - Verb_Shoot - true - Bullet_AssaultRifle - 1 - 25 - 1 - 3 - Shot_AssaultRifle - GunTail_Medium - 7 -
  • -
    - - 60 - 8 - - -
  • Wula_Weapon_Init
  • -
    - -
  • RewardStandardQualitySuper
  • -
    -
    - - - WULA_RW_Fractal_RF - - 乌拉帝国的旧式猎枪,使用简易的磁轨结构发射钢针,射速较慢,但是强大的动能使其在击中第一个目标后仍能继续飞行,对路径上的多个敌人造成伤害。 - Spacer - - Wula/Weapon/WULA_RW_Fractal_RF - Graphic_Single - - - - Interact_Rifle - -
  • LongShots
  • -
  • RangedHeavy
  • -
    - - - -
  • WULA_Cube_Productor_BIO
  • -
  • WULA_Cube_Productor_Energy
  • -
    - WULA_Synth_Weapon_Technology - UnfinishedWeapon -
    - - 1300 - 3.5 - 0.3 - 0.8 - 0.9 - 0.8 - 0.8 - - - 120 - 6 - - -
  • - Verb_Shoot - true - Bullet_WULA_RW_Fractal_RF - 2 - 38 - 1 - Shot_ChargeBlaster - GunTail_Medium - 9 -
  • -
    - -
  • Wula_Ranged_Weapon_T2
  • -
    - -
  • RewardStandardQualitySuper
  • -
    -
    - - Bullet_WULA_RW_Fractal_RF - - WulaFallenEmpire.Projectile_WulaLineAttack - -
  • - -1 - 0 - false - WULA_GunTail_Lighting -
  • -
    - - Wula/Projectile/WULA_Bullet_ChargeLanceShot_Red - Graphic_Single - TransparentPostLight - 1.4 - - - Bullet - 25 - 130 - 0.5 - 5 - -
    - - - - WULA_RW_StarDrift_SG - - 乌拉帝国配发的近距离霰弹枪,以威力巨大的梭镖破甲弹为核心,专注于在短距离上的快速反应战斗和持续性压制能力 - Ultra - -
  • Wula_Ranged_Weapon_T2
  • -
    - - - Wula/Weapon/WULA_RW_StarDrift_SG - Graphic_Single - - Interact_ChargeRifle - - -
  • WULA_Cube_Productor_BIO
  • -
  • WULA_Cube_Productor_Energy
  • -
    - WULA_Synth_Weapon_Technology - UnfinishedWeapon -
    - - 25000 - 3.5 - 1 - 0.9 - 0.5 - 0.25 - 1.4 - - - 120 - 6 - - -
  • - WulaFallenEmpire.Verb_ShootShotgun - true - WULA_Bullet_StarDrift_Shotgun_Spear - 0.2 - 18 - 3 - 3 - Shot_BeamRepeater - GunTail_Medium - 7 -
  • -
    - -
  • RewardStandardQualitySuper
  • -
    -
    - - WULA_Bullet_StarDrift_Shotgun_Spear - - - Wula/Projectile/WULA_Bullet_StarDrift_Shotgun_Spear - Graphic_Single - - - Bullet - 8 - 2.5 - 0.65 - 55 - - -
  • - 3 -
  • -
    -
    -
    \ No newline at end of file diff --git a/1.6/1.6/Defs/ThingDefs_Misc/Weapons/WULA_FE_Laser_Weapon.xml b/1.6/1.6/Defs/ThingDefs_Misc/Weapons/WULA_FE_Laser_Weapon.xml index b850578b..eda8471a 100644 --- a/1.6/1.6/Defs/ThingDefs_Misc/Weapons/WULA_FE_Laser_Weapon.xml +++ b/1.6/1.6/Defs/ThingDefs_Misc/Weapons/WULA_FE_Laser_Weapon.xml @@ -1,389 +1,8 @@ - - WULA_RW_Beam_Base_AR - - 一把经过实验性改造的步枪,使用小型能量光束,通常被派发给炮灰战斗人员。 - Normal - Spacer - - Wula/Weapon/WULA_RW_Beam_Base_AR - Graphic_Single - - Interact_Rifle - - -
  • WULA_Cube_Productor_BIO
  • -
  • WULA_Cube_Productor_Energy
  • -
    - WULA_Synth_Weapon_2_Laser_Technology - UnfinishedWeapon -
    - - 1300 - - 3.5 - 0.75 - 0.75 - 0.65 - 0.45 - 1.2 - - -
  • - Verb_Shoot - true - Bullet_WULA_RW_Penetrating_Rifle - 2 - 16 - 3 - 12 - Shot_BeamRepeater - GunTail_Medium - 7 - Mote_BeamRepeater_Charge - 1.07 -
  • -
    - - 60 - 4 - 20 - - -
  • Wula_Ranged_Weapon_T2
  • -
    - -
  • RewardStandardQualitySuper
  • -
    -
    - - Bullet_WULA_RW_Penetrating_Rifle - - WulaFallenEmpire.Projectile_WulaLineAttack - -
  • - -1 - 0 - true - WULA_GunTail_Plasma -
  • -
    - Normal - True - - Things/Projectile/ChargeLanceShot - Graphic_Single - TransparentPostLight - 1.4 - - - BeamBypassShields - 5 - 130 - 0.9 - 1 - -
    - - - WULA_RW_Penetrating_Beam_Rifle - - 一把经过实验性改造的“蓝锥”步枪,能够发射一道可以穿透多个目标的能量光束。 - Spacer - - Wula/Weapon/WULA_RW_Penetrating_Beam_Rifle - Graphic_Single - - Interact_Rifle - -
  • LongShots
  • -
  • RangedHeavy
  • -
    - - 1300 - 3.5 - 0.65 - 0.72 - 0.65 - 0.6 - 1.5 - - - 120 - 6 - 20 - - - -
  • WULA_Cube_Productor_Energy
  • -
    - WULA_Synth_Weapon_2_Laser_Technology - UnfinishedWeapon -
    - -
  • - WulaFallenEmpire.Verb_ShootShotgun - true - Bullet_WULA_RW_Penetrating_Beam - 2.0 - 28 - 3 - 12 - Shot_BeamRepeater - GunTail_Medium - 9 - Mote_BeamRepeater_Charge - 1.07 -
  • -
    - -
  • Wula_Ranged_Weapon_T2
  • -
    - -
  • RewardStandardQualitySuper
  • -
    - -
  • - WULA_RW_Penetrating_Beam_Rifle_Ranged - WULA_RW_Penetrating_Beam_RifleSwitchAbility -
  • -
    -
    - - - WULA_RW_Penetrating_Beam_Rifle_Ranged - - 一把经过实验性改造的“蓝锥”步枪,能够发射一道可以穿透多个目标的能量光束。 - Spacer - - Wula/Weapon/WULA_RW_Penetrating_Beam_Rifle_Ranged - Graphic_Single - - Interact_Rifle - -
  • LongShots
  • -
  • RangedHeavy
  • -
    - - 1300 - 3.5 - 0.65 - 0.8 - 0.9 - 0.8 - 2.0 - - - 120 - 6 - - - -
  • - Verb_Shoot - true - Bullet_WULA_RW_Penetrating_Beam_Ranged - 3.0 - 38 - 3 - 12 - Shot_BeamRepeater - GunTail_Medium - 9 - Mote_BeamRepeater_Charge - 1.07 -
  • -
    - -
  • Wula_Weapon_Init
  • -
    - -
  • RewardStandardQualitySuper
  • -
    - -
  • - WULA_RW_Penetrating_Beam_Rifle - WULA_RW_Penetrating_Beam_RifleSwitchAbility -
  • -
    - - - - 0 -
    - - - Bullet_WULA_RW_Penetrating_Beam - - WulaFallenEmpire.Projectile_WulaPenetratingBeam - -
  • - -1 - 0 - true - Mote_WULA_RW_Penetrating_Beam - 0.5 -
  • -
  • - 3 -
  • -
    - - Things/Projectile/ChargeLanceShot - Graphic_Single - - - BeamBypassShields - 5 - 0.8 - 1 - -
    - - - Bullet_WULA_RW_Penetrating_Beam_Ranged - - WulaFallenEmpire.Projectile_WulaPenetratingBeam - -
  • - -1 - 0 - true - Mote_WULA_RW_Penetrating_Beam - 0.5 -
  • -
    - - Things/Projectile/ChargeLanceShot - Graphic_Single - - - BeamBypassShields - 15 - 0.8 - 1 - -
    - - WULA_RW_Penetrating_Beam_RifleSwitchAbility - - 控制分光棱镜档位,以决定SLb-15 "三叉戟"是否切换到光束散射模式。 - 601 - Wula/UI/Abilities/WULA_WeaponSwitchAbility - false - false - false - false - false - - - - - - Verb_CastAbility - 0 - false - false - false - - true - - - -
  • - WulaFallenEmpire.CompAbilityEffect_Switch -
  • - - -
    -
    - - - WULA_RW_Sphene_MG - - 乌拉帝国的通用机枪,负责在班组中提供如暴雨倾泻的高速连射光束流,产生的高温熔烧效果将融化一切敌人的装甲。 - Ultra - -
  • Wula_Ranged_Weapon_T3
  • -
    - - - Wula/Weapon/WULA_RW_Sphene_MG - Graphic_Single - - Interact_ChargeRifle - - -
  • WULA_Cube_Productor_Energy
  • -
    - WULA_Synth_Weapon_2_Ranged_Technology - UnfinishedWeapon -
    - - 350 - 200 - 8 - - - 40000 - 4.5 - 0.5 - 0.5 - 0.5 - 0.4 - 2 - - -
  • - Verb_Shoot - true - Bullet_WULA_RW_Sphene_MG - 0.5 - 33.9 - 32 - 6 - Shot_ChargeRifle - GunTail_Medium - 9 -
  • -
    - -
  • RewardStandardQualitySuper
  • -
    -
    - - Bullet_WULA_RW_Sphene_MG - - WulaFallenEmpire.Projectile_WulaPenetratingBeam - - Things/Projectile/ChargeLanceShot - Graphic_Single - - - BeamBypassShields - 5 - 0.5 - 1.5 - 1 - - -
  • - -1 - 0 - true - Mote_WULA_RW_Penetrating_Beam - 0.5 -
  • -
    -
    diff --git a/1.6/1.6/Defs/ThingDefs_Misc/Weapons/WULA_FE_Missile_Weapon.xml b/1.6/1.6/Defs/ThingDefs_Misc/Weapons/WULA_FE_Missile_Weapon.xml deleted file mode 100644 index 746ad60b..00000000 --- a/1.6/1.6/Defs/ThingDefs_Misc/Weapons/WULA_FE_Missile_Weapon.xml +++ /dev/null @@ -1,97 +0,0 @@ - - - - WULA_RW_Base_Loitering_Munition - - 乌拉帝国使用的一种反装甲肩扛式巡飞弹,开火速度和飞弹飞行速度都较慢,但是可以在远距离上击穿装甲并造成伤害。 - Normal - Spacer - - Wula/Weapon/WULA_RW_Base_Loitering_Munition - Graphic_Single - 1.35 - - 0.8 - Interact_Rifle - - -
  • WULA_Cube_Productor_Energy
  • -
    - WULA_Synth_Weapon_2_Missile_Technology - UnfinishedWeapon -
    - -
  • WULA_Adv_WorkTable_Technology
  • -
    - - 2500 - - 8 - 1 - 1 - 1 - 1 - 3.5 - - -
  • - Verb_Shoot - true - - Bullet_WULA_RW_Base_Loitering_Munition - 5 - 46 - 1 - RocketswarmLauncher_Fire - GunTail_Heavy - 12 - - true - true - true - -
  • -
    - - 200 - 12 - - -
  • Wula_Ranged_Weapon_T2
  • -
    - -
  • RewardStandardQualitySuper
  • -
    -
    - - Bullet_WULA_RW_Base_Loitering_Munition - - - Wula/Projectile/WULA_Loitering_Munition - Graphic_Single - - WulaFallenEmpire.Projectile_ExplosiveTrackingBullet - - 25 - Bomb - 100 - 1.5 - 10 - - -
  • - 1.5 - Bomb -
  • -
  • - 0.75 - 0 - - 60 - 120 - - 1 -
  • -
    -
    -
    \ No newline at end of file diff --git a/1.6/1.6/Defs/ThingDefs_Misc/Weapons/WULA_FE_Plasma_Weapon.xml b/1.6/1.6/Defs/ThingDefs_Misc/Weapons/WULA_FE_Plasma_Weapon.xml deleted file mode 100644 index 4d47bcc5..00000000 --- a/1.6/1.6/Defs/ThingDefs_Misc/Weapons/WULA_FE_Plasma_Weapon.xml +++ /dev/null @@ -1,536 +0,0 @@ - - - - - WULA_RW_Plasma_AR - - 乌拉帝国的旧式多用途突击步枪,搭载了一套用于发射等离子体的谐振器,可以射出高精度的等离子体,也可以在近距离搏斗上当成等离子喷枪来使用。 - - Spacer - - Wula/Weapon/WULA_RW_Plasma_AR - Graphic_Single - 1.4 - - Interact_Rifle - - -
  • WULA_Cube_Productor_BIO
  • -
  • WULA_Cube_Productor_Energy
  • -
    - WULA_Synth_Weapon_2_Plasma_Technology - UnfinishedWeapon -
    - - 7500 - - 3.5 - 0.85 - 0.85 - 0.75 - 0.5 - 1.2 - - -
  • - Verb_Shoot - true - Bullet_WULA_RW_Plasma_AR - 2.0 - 16 - 2 - 12 - ChargeLance_Fire - GunTail_Medium - 7 - Mote_BeamRepeater_Charge - 1.07 - 0.1 -
  • -
    - - 60 - 4 - 20 - - -
  • Wula_Ranged_Weapon_T2
  • -
    - -
  • RewardStandardQualitySuper
  • -
    - -
  • - WULA_RW_Plasma_AR_Melee - WULA_RW_Plasma_AR_WeaponSwitchAbility -
  • -
    -
    - - WULA_RW_Plasma_AR_Melee - - 乌拉帝国的旧式多用途突击步枪,搭载了一套用于发射等离子体的谐振器,可以射出高精度的等离子体,也可以在近距离搏斗上当成等离子喷枪来使用。 - - Spacer - - Wula/Weapon/WULA_RW_Plasma_AR_Melee - Graphic_Single - 1.4 - - Interact_Rifle - - 0 - - 7500 - - 3.5 - - -
  • - - -
  • Blunt
  • - - 25 - 2 - 0.75 - ChargeLance_Fire - -
    - - 180 - 10 - - -
  • Wula_Weapon_Init
  • -
    - -
  • RewardStandardQualitySuper
  • -
    - -
  • - WULA_RW_Plasma_AR - WULA_RW_Plasma_AR_WeaponSwitchAbility -
  • -
    -
    - - Bullet_WULA_RW_Plasma_AR - - - Wula/Projectile/WULA_Bullet_Plasma_Yellow - Graphic_Single - MoteGlow - - (0.75,1) - - - Damage_WULA_Plasma - 6 - 0.9 - Explosion_EMP - 0.75 - 55 - - WulaFallenEmpire.Projectile_ExplosiveWithTrail - -
  • - WULA_GunTail_Plasma_Yellow -
  • -
    -
    - - WULA_RW_Plasma_AR_WeaponSwitchAbility - - 控制谐振器的等离子喷射方案,以决定PMa-72"磷叶"是否切换到近距离格斗模式 - 601 - Wula/UI/Abilities/WULA_WeaponSwitchAbility - false - false - false - false - false - - - - - - Verb_CastAbility - 0 - false - false - false - - true - - - -
  • - WulaFallenEmpire.CompAbilityEffect_Switch -
  • - - -
    -
    - - - WULA_RW_Plasma_Homing_AR - - 乌拉帝国的等离子体霰弹枪,搭载了一套用于发射等离子体的谐振器,可以喷射多道等离子体射流;也可以进入超频状态,聚焦于主枪管以发射能量高度集中且会产生爆炸的射弹。 - Spacer - - Wula/Weapon/WULA_RW_Plasma_Homing_AR - Graphic_Single - 1.4 - - 1 - Interact_Rifle - -
  • LongShots
  • -
  • RangedHeavy
  • -
    - - -
  • WULA_Cube_Productor_Energy
  • -
    - WULA_Synth_Weapon_2_Plasma_Technology - UnfinishedWeapon -
    - -
  • WULA_Adv_WorkTable_Technology
  • -
    - - 1500 - 3.0 - 0.6 - 0.75 - 0.85 - 0.8 - 1.2 - - - 120 - 6 - 20 - - -
  • - WulaFallenEmpire.Verb_ShootShotgun - true - Bullet_WULA_RW_Plasma_Homing_AR - 2.0 - 28 - 3 - 12 - ChargeLance_Fire - GunTail_Medium - 9 - Mote_BeamRepeater_Charge - 1.07 - 1.1 -
  • -
    - -
  • Wula_Ranged_Weapon_T2
  • -
    - -
  • RewardStandardQualitySuper
  • -
    - -
  • - WULA_RW_Plasma_Homing_AR_Ex - WULA_RW_Plasma_Homing_AR_WeaponSwitchAbility -
  • -
    -
    - - WULA_RW_Plasma_Homing_AR_Ex - - 乌拉帝国的等离子体霰弹枪,搭载了一套用于发射等离子体的谐振器,可以喷射多道等离子体射流;也可以进入超频状态,聚焦于主枪管以发射能量高度集中且会产生爆炸的射弹。 - Spacer - - Wula/Weapon/WULA_RW_Plasma_Homing_AR_Ex - Graphic_Single - 1.4 - - Interact_Rifle - -
  • LongShots
  • -
  • RangedHeavy
  • -
    - - 0 - - 1500 - 3.0 - 0.6 - 0.75 - 0.85 - 0.8 - 1.2 - - - 100 - 5 - 20 - - -
  • - WulaFallenEmpire.Verb_ShootShotgun - true - Bullet_WULA_RW_Plasma_Homing_AR_Ex - 2.0 - 12 - 3 - 12 - ChargeLance_Fire - GunTail_Medium - 9 - Mote_BeamRepeater_Charge - 1.07 - 1.1 -
  • -
    - -
  • Wula_Weapon_Init
  • -
    - -
  • RewardStandardQualitySuper
  • -
    - -
  • - WULA_RW_Plasma_Homing_AR - WULA_RW_Plasma_Homing_AR_WeaponSwitchAbility -
  • -
    -
    - - Bullet_WULA_RW_Plasma_Homing_AR - - - Wula/Projectile/WULA_Bullet_Plasma_Yellow - Graphic_Single - - (0.75,1) - - - - Damage_WULA_Plasma - 6 - 0.9 - Explosion_EMP - 0.75 - 55 - - WulaFallenEmpire.Projectile_ExplosiveWithTrail - -
  • - WULA_GunTail_Plasma_Yellow -
  • -
  • - 3 -
  • -
    -
    - - Bullet_WULA_RW_Plasma_Homing_AR_Ex - - - Wula/Projectile/WULA_Bullet_Plasma - Graphic_Single - MoteGlow - - (2,1.5) - - - Damage_WULA_Plasma_Explosive - 16 - 2 - Explosion_EMP - 0.75 - 55 - - WulaFallenEmpire.Projectile_ExplosiveWithTrail - -
  • - WULA_GunTail_Plasma -
  • -
    -
    - - WULA_RW_Plasma_Homing_AR_WeaponSwitchAbility - - 控制谐振器的等离子喷射方案,以决定PMr-88"三叶"是否放弃追踪射弹切换到充能等离子模式 - 601 - Wula/UI/Abilities/WULA_WeaponSwitchAbility - false - false - false - false - false - - - - - - Verb_CastAbility - 0 - false - false - false - - true - - - -
  • - WulaFallenEmpire.CompAbilityEffect_Switch -
  • - - -
    -
    - - - - WULA_RW_Handle_Cannon - - 一般由乌拉帝国跳帮组或骑士军团携带的手持火炮,能够在锁定后连续发射三轮炮弹,夷平敌人的复合型工事或舰船内壁,并给敌人送来最炽热的消亡。 - Ultra - -
  • Wula_Ranged_Weapon_Wall_Destoryer
  • -
    - - Wula/Weapon/WULA_RW_Handle_Cannon - Graphic_Single - 1.35 - - None - - -
  • WULA_Cube_Productor_Energy
  • -
    - WULA_Synth_Weapon_3_Bomb_Technology - UnfinishedWeapon -
    - - 50000 - 20 - 0.03 - 0.03 - 0.03 - 0.02 - 3.0 - - - 500 - 300 - 12 - - -
  • - Verb_Shoot - true - Bullet_WULA_RW_Handle_Cannon - 3 - 20 - Shot_HellsphereCannonGun - GunTail_Heavy - 9 - 6 - true - true - true - 50 - 6 - - true - false - - Mote_HellsphereCannon_Aim - Mote_HellsphereCannon_Charge - 1.07 - 3.9 - Mote_HellsphereCannon_Target - 3 - true - HellsphereCannon_Aiming - false - 1.1 -
  • -
    - -
  • - - -
  • Blunt
  • -
  • Poke
  • - - 9 - 2.6 - -
    - -
  • - - -
  • RewardStandardQualitySuper
  • - -
    - - Bullet_WULA_RW_Handle_Cannon - - - Wula/Projectile/WULA_Bullet_Plasma - Graphic_Single - MoteGlow - - (3,4) - - WulaFallenEmpire.Projectile_ExplosiveWithTrail - - - 25 - Damage_WULA_Plasma_Explosive - 40 - 0.7 - 2.0 - 2.5 - Explosion_EMP - 0.75 - 0.5 - true - - - - -
  • - WULA_GunTail_Plasma - 3 -
  • -
  • - 3 -
  • -
    -
    -
    \ No newline at end of file diff --git a/1.6/1.6/Defs/ThingDefs_Misc/Weapons/WULA_FE_Remake_Weapon.xml b/1.6/1.6/Defs/ThingDefs_Misc/Weapons/WULA_FE_Remake_Weapon.xml new file mode 100644 index 00000000..044846e3 --- /dev/null +++ b/1.6/1.6/Defs/ThingDefs_Misc/Weapons/WULA_FE_Remake_Weapon.xml @@ -0,0 +1,1853 @@ + + + + + WULA_MW_Charge_Mace + + 这种乌拉帝国战士使用的近战武器由多层复合的高密度钨合金或贫铀合金核心构成,可以利用无与伦比的冲击质量击晕对手。 + + Wula/Weapon/WULA_MW_Charge_Mace/WULA_MW_Charge_Mace + Graphic_Single + CutoutComplex + + +
  • Wula_Melee_Weapon_T2
  • +
    + -65 + Spacer + + 20000 + 5 + + 60 + +
  • Metallic
  • +
    + + 5 + 6 + + +
  • + + +
  • Poke
  • + + 12 + 1.5 + 0.8 + +
  • + Stun + 0.5 +
  • +
    + +
  • + + +
  • Poke
  • + + 9 + 1 + 0.5 + +
  • + Stun + 0.5 +
  • +
    + +
    + + +
  • WULA_Cube_Productor_Energy
  • +
    + WULA_Synth_Weapon_2_Stun_Technology + + 7 + + 450 + UnfinishedWeapon +
    + +
  • + Wula/Weapon/WULA_MW_Charge_Mace/WULA_MW_Charge_Mace_Anim + 8 + 8 +
  • +
    +
    + + WULA_MW_ChainSword + + 这种嗡嗡作响的乌拉帝国链锯类武器有多条环绕剑脊高速旋转的多层复合锯齿链条,之间嵌有能量传导节点或微型冷却剂喷口,是力量与纯粹疯狂的象征——它在一次的攻击中会造成大量的伤口,足以从头到脚撕裂敌人的身体。 + + Wula/Weapon/WULA_MW_ChainSword/WULA_MW_ChainSword + Graphic_Single + CutoutComplex + + Interact_WULA_MW_ChainSword + + Spacer + 60 + +
  • Metallic
  • +
    + + 5 + 3 + + + 20000 + 2.5 + + +
  • + + +
  • WULA_MW_ChainSword_MultiStrike
  • + + 0.5 + 16 + 1.6 + WULA_MW_ChainSword_Hit + WULA_MW_ChainSword_Hit + +
    + + +
  • WULA_Cube_Productor_Energy
  • +
    + WULA_Synth_Weapon_2_Melee_Technology + + 7 + + 450 + UnfinishedWeapon +
    + +
  • Wula_Melee_Weapon_T2
  • +
    + +
  • RewardStandardQualitySuper
  • +
    + +
  • + Wula/Weapon/WULA_MW_ChainSword/WULA_MW_ChainSword_Anim + 8 + 8 +
  • +
  • + 5~8 + 0.2 +
  • +
    +
    + + WULA_MW_ChainSword_MultiStrike + + + + WULA_MW_ChainSword_Maneuver + WULA_MW_ChainSword_MultiStrike + + WulaFallenEmpire.Verb_MeleeAttack_MultiStrike + Cut + + MeleeAttack + Maneuver_Slash_MeleeHit + Maneuver_Slash_MeleeDeflect + Maneuver_Slash_MeleeMiss + Maneuver_Slash_MeleeDodge + + + WULA_MW_Breaker_Bar + + 一种沉重的破墙设备,通常由装备外骨骼的乌拉帝国士兵携带,可以通过加压挥出势大力沉的一击,连续击倒多名敌人。 + + Wula/Weapon/WULA_MW_Breaker_Bar/WULA_MW_Breaker_Bar + CutoutComplex + Graphic_Single + 1.5 + + -65 + +
  • Wula_Melee_Weapon_T3
  • +
    + 0.8 + Spacer + 50 + + + 20000 + 20 + + +
  • Metallic
  • +
    + + 20 + 4 + + +
  • + + +
  • WULA_MW_Breaker_Bar_Demolish
  • + + 35 + 3 + 2 + WULA_MW_Breaker_Bar_Hit + WULA_MW_Breaker_Bar_Hit + + +
    + + +
  • WULA_Cube_Productor_Energy
  • +
    + WULA_Synth_Weapon_2_Stun_Technology + + 7 + + 450 + UnfinishedWeapon +
    + +
  • + Wula/Weapon/WULA_MW_Breaker_Bar/WULA_MW_Breaker_Bar_Anim + 8 + 8 +
  • +
  • + 90 + 2.5 + 0.5 + false + Blunt +
  • +
  • + +
  • WULA_Melee_Cleave
  • + + + 1 + 1 + + +
    +
    + + WULA_MW_Breaker_Bar_Demolish + + + + WULA_MW_Breaker_Bar_Maneuver + WULA_MW_Breaker_Bar_Demolish + + WulaFallenEmpire.Verb_MeleeAttack_Cleave + Demolish + + MeleeAttack + Maneuver_Slash_MeleeHit + Maneuver_Slash_MeleeDeflect + Maneuver_Slash_MeleeMiss + Maneuver_Slash_MeleeDodge + + + WULA_MW_Constructor_Hammer + + 供乌拉猫猫使用的多功能工具,兼具施工和开采的能力。 + + Wula/Weapon/WULA_MW_Constructor_Hammer + Graphic_Single + CutoutComplex + + -65 + Spacer + false + 0 + + 100 + 1000 + 1 + + + 20 + + +
  • + + +
  • Poke
  • + + 5 + 1.5 + 0.1 + +
    + + + + +
  • Wula_Constructor_Cat_Weapon
  • +
    +
    + + + + WULA_RW_Base_AR + + 乌拉帝国的基础突击步枪,仍然使用可靠的导气式结构驱动自动射击构件,是一种便宜但好用的武器,通常派发给殖民地作自卫武器之用。它下挂了一个眩光弹发射器,可以发射一枚眩光弹击晕区域内的敌人。 + Normal + Spacer + + Wula/Weapon/WULA_RW_Base_AR + Graphic_Single + + Interact_Rifle + + +
  • WULA_Cube_Productor_BIO
  • +
  • WULA_Cube_Productor_Energy
  • +
    + WULA_Synth_Weapon_Technology + UnfinishedWeapon +
    + + 1300 + + 3.5 + 0.75 + 0.75 + 0.65 + 0.45 + 1.2 + + +
  • + Verb_Shoot + true + Bullet_WULA_RW_Base_AR + 1 + 25 + 3 + 3 + Shot_AssaultRifle + GunTail_Medium + 7 +
  • +
    + + 60 + 8 + + +
  • Wula_Weapon_Init
  • +
  • Wula_Assault_Cat_Weapon
  • +
    + +
  • + WULA_RW_Base_AR_Ability + 眩光弹 +
  • +
    +
    + + Bullet_WULA_RW_Base_AR + + + Things/Projectile/Bullet_Small + Graphic_Single_AgeSecs + MoteGlow + (0.75,1.5) + (188, 112, 255, 255) + + + Bullet + 8 + 70 + + + + WULA_RW_Base_AR_Ability + + 使用DLa-1"页岩"下挂的眩光弹发射器射出一发眩光弹,它落地之后需要一小段时间才会爆炸,将眩晕附近的所有生物和机械体。 + Wula/UI/Abilities/WULA_RW_Base_AR_Ability + True + False + Misc11 + false + 12800 + + Verb_CastAbility + 30 + 1 + 9 + true + Mortar_LaunchA + false + + + true + false + true + true + true + + + +
  • + Grenade_WULA_RW_Base_AR +
  • +
    +
    + + Grenade_WULA_RW_Base_AR + + Projectile_Explosive + + Wula/Projectile/Grenade_WULA_RW_Base_AR + Graphic_Single + 0.5 + + + 45 + 3.5 + Stun + 8 + + 30 + + + + WULA_RW_StarDrift_SG + + 乌拉帝国配发的近距离霰弹枪,以威力巨大的梭镖破甲弹为核心,专注于在短距离上的快速反应战斗和持续性压制能力 + Ultra + +
  • Wula_Ranged_Weapon_T2
  • +
    + + + Wula/Weapon/WULA_RW_StarDrift_Shotgun/WULA_RW_StarDrift_Shotgun + Graphic_Single + 1.2 + + Interact_ChargeRifle + + +
  • WULA_Cube_Productor_BIO
  • +
  • WULA_Cube_Productor_Energy
  • +
    + WULA_Synth_Weapon_Technology + UnfinishedWeapon +
    + + 25000 + 3.5 + 1 + 0.9 + 0.5 + 0.25 + 1.4 + + + 120 + 6 + + +
  • + WulaFallenEmpire.Verb_ShootShotgun + true + WULA_Bullet_StarDrift_Shotgun_Spear + 0.2 + 18 + 3 + 3 + Shot_BeamRepeater + GunTail_Medium + 7 +
  • +
    + +
  • + Wula/Weapon/WULA_RW_StarDrift_Shotgun/WULA_RW_StarDrift_Shotgun_Anim + 8 + 8 +
  • +
    +
    + + WULA_Bullet_StarDrift_Shotgun_Spear + + + Wula/Projectile/WULA_Bullet_StarDrift_Shotgun_Spear + Graphic_Single + MoteGlow + + + Bullet + 8 + 2.5 + 0.65 + 55 + + +
  • + 3 +
  • +
    +
    + + WULA_RW_Fractal_RF + + 乌拉帝国的磁轨狙击枪,通过引导强大的动能发射钢针,射速较慢,但是在击中目标后仍能继续飞行,对路径上的多个敌人造成伤害。 + Spacer + + Wula/Weapon/WULA_RW_Fractal_RF/WULA_RW_Fractal_RF + Graphic_Single + 1.4 + + + Interact_Rifle + +
  • LongShots
  • +
  • RangedHeavy
  • +
    + + + +
  • WULA_Cube_Productor_BIO
  • +
  • WULA_Cube_Productor_Energy
  • +
    + WULA_Synth_Weapon_Technology + UnfinishedWeapon +
    + + 1300 + 3.5 + 0.3 + 0.7 + 1 + 1 + 0.8 + + + 120 + 6 + + +
  • + Verb_Shoot + true + Bullet_WULA_RW_Fractal_RF + 4 + 85 + 1 + WULA_RW_Railgun_Shootingsound + GunTail_Medium + 9 +
  • +
    + +
  • Wula_Ranged_Weapon_T2
  • +
    + +
  • + Wula/Weapon/WULA_RW_Fractal_RF/WULA_RW_Fractal_RF_Anim + 8 + 8 +
  • +
    +
    + + Bullet_WULA_RW_Fractal_RF + + WulaFallenEmpire.Projectile_WulaLineAttack + +
  • + -1 + 0 + true + WULA_GunTail_Lighting +
  • +
    + + Wula/Projectile/WULA_Bullet_ChargeLanceShot_Red + Graphic_Single + TransparentPostLight + 1.4 + + + Bullet + 25 + 230 + 0.5 + 5 + +
    + + WULA_RW_AutoCannon + + 一般由乌拉帝国跳帮组或骑士军团携带的自动炮,在拥有长射程的同时火力也非常凶猛,会造成区域性的爆炸效果以控制集群敌军。它同时下挂了一具长射程的EMP榴弹发射器,可以用于控制机械族的集群冲击。 + Ultra + +
  • Wula_Ranged_Weapon_T3
  • +
    + + + Wula/Weapon/WULA_RW_AutoCannon/WULA_RW_AutoCannon + Graphic_Single + 1.65 + + None + 0.75 + Interact_ChargeRifle + + +
  • WULA_Cube_Productor_Energy
  • +
    + WULA_Synth_Weapon_3_Bomb_Technology + UnfinishedWeapon +
    + + 300 + 80 + 8 + + + 40000 + 20 + 0.85 + 0.85 + 0.75 + 0.65 + 0.5 + + +
  • + WulaFallenEmpire.Verb_ShootWithOffset + true + Bullet_WULA_RW_AutoCannon + 2 + 32 + 0.1 + 3 + 8 + Shot_ChargeRifle + GunTail_Medium + 9 + + true + true + true + +
  • +
    + +
  • + +
  • (0.1, -2.6)
  • + + +
    + +
  • + Wula/Weapon/WULA_RW_AutoCannon/WULA_RW_AutoCannon_Anim + 8 + 8 +
  • +
  • + WULA_RW_EMP_RF_EMP_Ability + EMP榴弹 +
  • +
    +
    + + Bullet_WULA_RW_AutoCannon + + Projectile_Explosive + Normal + True + + Wula/Projectile/WULA_Bullet_ChargeLanceShot_Red + Graphic_Single + MoteGlow + 2.5 + + + Bullet + 15 + 90 + 1.2 + 0.4 + Explosion_Rocket + 0.75 + 0.1 + + + + WULA_RW_EMP_RF_EMP_Ability + + 使用FLm-78"萤石"下挂的榴弹发射器发射一枚EMP榴弹以击破护盾和控制机械族,这种重型榴弹发射器发射距离较远,但是需要一点时间架设开火。 + Wula/UI/Abilities/WULA_RW_Auto_GL_Smoke_Ability + True + False + Misc11 + false + 3200 + + Verb_CastAbility + 38 + 2 + 9 + true + Mortar_LaunchA + false + + + true + false + true + true + true + + + +
  • + Bullet_Shell_EMP +
  • +
    +
    + + + + WULA_Beam_Weapon_Aiming_Hediff + + 在开火前,乌拉帝国的光束类武器需要先预热一段时间,随后便可以进行持续的射击。 + (0.52, 1, 0.95) + HediffWithComps + +
  • +
  • + 60 + true +
  • +
    + +
  • + + true + + 0 + +
  • +
    +
    + + WULA_RW_Beam_Base_AR + + 乌拉帝国殖民地的制式装备之一,在预热后通过高能电容能量的瞬间释放产生短光束,烧穿敌军。作为手持武器,其功率不算太高,因此虽然有强大的贯穿能力却没办法造成太大的伤害。 + Normal + Spacer + + Wula/Weapon/WULA_RW_Beam_Base_AR/WULA_RW_Beam_Base_AR + Graphic_Single + + Interact_Rifle + + +
  • WULA_Cube_Productor_BIO
  • +
  • WULA_Cube_Productor_Energy
  • +
    + WULA_Synth_Weapon_2_Laser_Technology + UnfinishedWeapon +
    + + 1300 + + 3.5 + 0.75 + 0.75 + 0.65 + 0.45 + 0.25 + + +
  • + WulaFallenEmpire.Verb_ShootWithOffset + true + Bullet_WULA_RW_Penetrating_Rifle + 3 + 20 + 3 + 12 + Shot_BeamRepeater + GunTail_Medium + 7 + Mote_WULA_Beam_Charge + 1.07 +
  • +
    + + 60 + 4 + 20 + + +
  • Wula_Ranged_Weapon_T2
  • +
    + +
  • RewardStandardQualitySuper
  • +
    + +
  • + +
  • (0.1, -2.6)
  • + + +
    + +
  • + Wula/Weapon/WULA_RW_Beam_Base_AR/WULA_RW_Beam_Base_AR_Anim + 8 + 8 +
  • +
  • + WULA_Beam_Weapon_Aiming_Hediff + 1 +
  • +
    +
    + + Bullet_WULA_RW_Penetrating_Rifle + + WulaFallenEmpire.Projectile_WulaLineAttack + +
  • + -1 + 0 + true + +
  • +
    + Normal + True + + Things/Projectile/ChargeLanceShot + Graphic_Single + MoteGlow + (165, 44, 2, 255) + (1.4,7) + + + BeamBypassShields + 2.5 + 130 + 0.65 + 1 + +
    + + WULA_RW_Penetrating_Beam_Rifle + + 乌拉帝国的多用途穿透型光束武器,可以在散射和集束模式下切换以应对不同的情况。当分光棱镜打开时,其所发射的光束将分裂为多道,伤害和射程有所降低但是获得了更大的散射面积。 + Spacer + + Wula/Weapon/WULA_RW_Penetrating_Beam_Rifle/WULA_RW_Penetrating_Beam_Rifle + Graphic_Single + + Interact_Rifle + +
  • LongShots
  • +
  • RangedHeavy
  • +
    + + 1300 + 3.5 + 0.65 + 0.72 + 0.65 + 0.6 + 1.5 + + + 120 + 6 + 20 + + + +
  • WULA_Cube_Productor_Energy
  • +
    + WULA_Synth_Weapon_2_Laser_Technology + UnfinishedWeapon +
    + +
  • + WulaFallenEmpire.Verb_ShootShotgun + true + Bullet_WULA_RW_Penetrating_Beam + 2.0 + 28 + 3 + 12 + Shot_BeamRepeater + GunTail_Medium + 9 + Mote_BeamRepeater_Charge + 1.07 +
  • +
    + +
  • Wula_Ranged_Weapon_T2
  • +
    + +
  • + Wula/Weapon/WULA_RW_Penetrating_Beam_Rifle/WULA_RW_Penetrating_Beam_Rifle_Anim + 8 + 8 +
  • +
  • + WULA_RW_Penetrating_Beam_Rifle_Ranged + WULA_RW_Penetrating_Beam_RifleSwitchAbility +
  • +
    +
    + + WULA_RW_Penetrating_Beam_Rifle_Ranged + + 乌拉帝国的多用途穿透型光束武器,可以在散射和集束模式下切换以应对不同的情况。当分光棱镜关闭时,其所发射的光束将集中在一个目标上,获得更大的对单目标的输出能力。 + Spacer + + Wula/Weapon/WULA_RW_Penetrating_Beam_Rifle/WULA_RW_Penetrating_Beam_Rifle_Ranged + Graphic_Single + + Interact_Rifle + +
  • LongShots
  • +
  • RangedHeavy
  • +
    + + 1300 + 3.5 + 0.65 + 0.8 + 0.9 + 0.8 + 2.0 + + + 120 + 6 + + + +
  • + Verb_Shoot + true + Bullet_WULA_RW_Penetrating_Beam_Ranged + 3.0 + 38 + 3 + 12 + Shot_BeamRepeater + GunTail_Medium + 9 + Mote_BeamRepeater_Charge + 1.07 +
  • +
    + +
  • Wula_Weapon_Init
  • +
    + +
  • + Wula/Weapon/WULA_RW_Penetrating_Beam_Rifle/WULA_RW_Penetrating_Beam_Rifle_Ranged_Anim + 8 + 8 +
  • +
  • + WULA_RW_Penetrating_Beam_Rifle + WULA_RW_Penetrating_Beam_RifleSwitchAbility +
  • +
    + + + + 0 +
    + + Bullet_WULA_RW_Penetrating_Beam + + WulaFallenEmpire.Projectile_WulaPenetratingBeam + +
  • + -1 + 0 + true + Mote_WULA_RW_Penetrating_Beam + 0.5 +
  • +
  • + 3 +
  • +
    + + Things/Projectile/ChargeLanceShot + Graphic_Single + + + BeamBypassShields + 6 + 0.8 + 1 + +
    + + Bullet_WULA_RW_Penetrating_Beam_Ranged + + WulaFallenEmpire.Projectile_WulaPenetratingBeam + +
  • + -1 + 0 + true + Mote_WULA_RW_Penetrating_Beam + 0.5 +
  • +
    + + Things/Projectile/ChargeLanceShot + Graphic_Single + + + BeamBypassShields + 8 + 0.8 + 1 + +
    + + WULA_RW_Penetrating_Beam_RifleSwitchAbility + + 控制分光棱镜档位,以决定SLb-15 "三叉戟"是否切换到光束散射模式。 + 601 + Wula/UI/Abilities/WULA_WeaponSwitchAbility + false + false + false + false + false + + + + + + Verb_CastAbility + 0 + false + false + false + + true + + + +
  • + WulaFallenEmpire.CompAbilityEffect_Switch +
  • + + +
    +
    + + WULA_RW_Sphene_MG + + 乌拉帝国的通用机枪,负责在班组中提供如暴雨倾泻的高速连射光束流,产生的高温熔烧穿透效果极好,可以贯穿融化一条线上所有敌人。由于其光束武器的性质,在开始连射前有一段很长时间的预热,非常需要保护。 + Ultra + +
  • Wula_Ranged_Weapon_T3
  • +
    + + + Wula/Weapon/WULA_RW_Sphene_MG/WULA_RW_Sphene_MG + Graphic_Single + + Interact_ChargeRifle + + +
  • WULA_Cube_Productor_Energy
  • +
    + WULA_Synth_Weapon_2_Ranged_Technology + UnfinishedWeapon +
    + + 350 + 200 + 8 + + + 40000 + 4.5 + 0.5 + 0.5 + 0.5 + 0.4 + 0 + + +
  • + WulaFallenEmpire.Verb_ShootWithOffset + true + Bullet_WULA_RW_Sphene_MG + 4 + 33.9 + 36 + 1 + Shot_ChargeRifle + GunTail_Medium + 9 + Mote_WULA_Beam_Charge + 1.07 +
  • +
    + +
  • + +
  • (0.2, -1.4)
  • + + +
    + +
  • + Wula/Weapon/WULA_RW_Sphene_MG/WULA_RW_Sphene_MG_Anim + 8 + 8 +
  • +
  • + WULA_Beam_Weapon_Aiming_Hediff + 1 +
  • +
    +
    + + Bullet_WULA_RW_Sphene_MG + + WulaFallenEmpire.Projectile_WulaPenetratingBeam + + Things/Mote/GraserBeam + (165, 44, 2, 255) + Graphic_MoteWithAgeSecs + MoteBeam + + <_ExtraTexA>/Things/Mote/BeamSecondaryNoise_A + <_ExtraTexB>/Things/Mote/BeamSecondaryNoise_B + <_ScrollSpeedA>-4 + <_ScrollSpeedB>3 + <_Intensity>2 + + + + BeamBypassShields + 1.75 + 0.5 + 2 + 1 + + +
  • + -1 + 0 + true + Mote_WULA_RW_Penetrating_Beam + 0.5 +
  • +
    +
    + + WULA_RW_Handle_Cannon + + 由乌拉帝国跳帮组或骑士军团携带的手持光束炮,需要很长的时间进行瞄准,但是可以射出在远距离上击穿单体强大光束流。 + Ultra + +
  • Wula_Ranged_Weapon_Wall_Destoryer
  • +
    + + Wula/Weapon/WULA_RW_Handle_Cannon/WULA_RW_Handle_Cannon + Graphic_Single + 1.35 + + 0.85 + None + + +
  • WULA_Cube_Productor_Energy
  • +
    + WULA_Synth_Weapon_3_Bomb_Technology + UnfinishedWeapon +
    + + 50000 + 10 + 0.03 + 0.03 + 0.03 + 0.02 + 0 + + + 500 + 300 + 12 + + +
  • + WulaFallenEmpire.Verb_ShootBeamExplosive + + + true + 6 + 45 + 32 + 1 + WULA_RW_Handle_Cannon_Burn + 1 + + + 1000 + -1 + 0 + 0 + 0 + + + 0 + WULA_RW_Beam_Shootingsound + Mote_WULA_RW_Handle_Cannon_Beam + GraserBeam_End + + 0 + + + 1 + 0 + 0 + + + 0.8 + true + + +
  • (0, 0)
  • +
  • (0.65, 0.4)
  • +
  • (1, 0.75)
  • + + + + + + false + + + + false + 1 + 0 + Burn + 1 + + 1 + + Mote_WULA_Beam_Charge + 1.07 + +
    + +
  • + Wula/Weapon/WULA_RW_Handle_Cannon/WULA_RW_Handle_Cannon_Anim + 8 + 8 +
  • +
  • + WULA_Beam_Weapon_Aiming_Hediff + 1 +
  • +
    +
    + + Mote_WULA_RW_Handle_Cannon_Beam + MoteDualAttached + MoteOverhead + + 0.2 + 0.3 + 999999 + True + True + True + True + + true + + Things/Mote/GraserBeam + (165, 44, 2, 255) + Graphic_MoteWithAgeSecs + MoteBeam + + <_ExtraTexA>/Things/Mote/BeamSecondaryNoise_A + <_ExtraTexB>/Things/Mote/BeamSecondaryNoise_B + <_ScrollSpeedA>-4 + <_ScrollSpeedB>3 + <_Intensity>2 + + + + + WULA_RW_Handle_Cannon_Burn + DamageWorker_Flame + + false + false + false + true + {0} has burned to death. + Burn + Heat + 15 + 10 + 1 + 15 + BlastFlame + (1, 0.7, 0.7) + (1, 1, 0.7) + Explosion_Flame + Damage_Flame + false + false + true + +
  • + WULA_RW_Handle_Cannon_Burn_Hediff + 0.015 + true + true +
  • +
    +
    + + WULA_RW_Handle_Cannon_Burn_Hediff + + 乌拉帝国的大型光束武器会融化敌人的护甲,使其对热能的抗性降低。 + (165, 44, 2) + HediffWithComps + +
  • + -4 +
  • +
  • + 1800 +
  • +
  • + + +
  • + + true +
  • +
  • + + 0.2 + + -0.2 + + + 2 + 1.1 + 1.1 + 1.1 + +
  • +
  • + + 0.35 + + -0.5 + + + 3 + 1.2 + 1.2 + 1.2 + +
  • +
  • + + 0.5 + + -1 + + + 4 + 1.3 + 1.3 + 1.3 + +
  • +
  • + + 0.65 + + -1.3 + + + 5 + 1.4 + 1.4 + 1.4 + +
  • +
  • + + 0.85 + + -2 + + + 6 + 1.5 + 1.5 + 1.5 + +
  • + +
    + + WULA_MW_Lance + + 乌拉帝国骑士所喜爱的远近合一的重型近战武器,采用高强度纳米碳纤维复合材料内芯,外层覆盖着带有散热格栅和能量导流槽的记忆合金装甲板,既可以在近战中刺穿对手,也可以从远距离上发射光束融化敌军装甲。 + + + + 50 + 0.6 + + Wula/Weapon/WULA_MW_Lance/WULA_MW_Lance + Graphic_Single + CutoutWithOverlay + 1.6 + + Spacer + 120 + +
  • Metallic
  • +
    + + 150 + 2 + + + 20000 + 10 + 1 + 1 + 1 + 1 + 0.4 + + +
  • + + +
  • Blunt
  • +
  • Poke
  • + + 12 + 1.6 + +
  • + WULA_RW_Handle_Cannon_Burn + 10 +
  • +
    + +
    + + + + 0 + + + +
  • + WulaFallenEmpire.Verb_ShootWithOffset + true + Bullet_WULA_MW_Lance + 3 + 30 + 3 + 12 + Shot_BeamRepeater + GunTail_Medium + 7 + Mote_WULA_Beam_Charge + 1.07 +
  • +
    + +
  • + +
  • (0, -2.6)
  • + + +
    + +
  • + Wula/Weapon/WULA_MW_Lance/WULA_MW_Lance_Anim + 8 + 8 +
  • +
  • + WULA_Beam_Weapon_Aiming_Hediff + 1 +
  • +
    +
    + + Bullet_WULA_MW_Lance + + WulaFallenEmpire.Projectile_WulaLineAttack + +
  • + -1 + 0 + true + +
  • +
    + Normal + True + + Things/Projectile/ChargeLanceShot + Graphic_Single + MoteGlow + (165, 44, 2, 255) + (2,6) + + + WULA_RW_Handle_Cannon_Burn + 5 + 130 + 1 + 1 + +
    + + + + WULA_RW_Base_Loitering_Munition + + 乌拉帝国使用的一种反装甲肩扛式巡飞弹,开火速度和飞弹飞行速度都较慢,但是可以在远距离上击穿装甲并造成伤害。 + Normal + Spacer + + Wula/Weapon/WULA_RW_Base_Loitering_Munition + Graphic_Single + 1.35 + + 0.8 + Interact_Rifle + + +
  • WULA_Cube_Productor_Energy
  • +
    + WULA_Synth_Weapon_2_Missile_Technology + UnfinishedWeapon +
    + +
  • WULA_Adv_WorkTable_Technology
  • +
    + + 2500 + + 8 + 1 + 1 + 1 + 1 + 3.5 + + +
  • + Verb_Shoot + true + + Bullet_WULA_RW_Base_Loitering_Munition + 5 + 40 + 1 + RocketswarmLauncher_Fire + GunTail_Heavy + 12 + + true + true + true + +
  • +
    + + 200 + 12 + + +
  • Wula_Ranged_Weapon_T2
  • +
    + +
  • RewardStandardQualitySuper
  • +
    + +
  • + WULA_RW_Base_Loitering_Munition_Ability + 引导系统 +
  • +
    +
    + + Bullet_WULA_RW_Base_Loitering_Munition + + + Wula/Projectile/WULA_Loitering_Munition + Graphic_Single + + WulaFallenEmpire.Projectile_ExplosiveTrackingBullet + + 25 + Bomb + 40 + 1 + 10 + + +
  • + 2 + Bomb +
  • +
  • + WULA_Smoke_Tail + 1 +
  • +
  • + 0.75 + 0 + + 60 + 120 + + 1 +
  • +
    +
    + + WULA_RW_Base_Loitering_Munition_Ability + + 启动WLl-35"沸石"的自引导系统,使得其在短时间内可以连续发射飞弹而不需要漫长的引导。 + Wula/UI/Abilities/WULA_RW_Base_Loitering_Munition_Ability + True + False + Misc11 + false + 3600 + + 6 + + + Verb_CastAbility + -1 + 0 + true + MechanoidsWakeUp + false + false + + + true + + + +
  • + CompAbilityEffect_GiveHediff + WULA_RW_Base_Loitering_Munition_Hediff + True + true +
  • +
    +
    + + WULA_RW_Base_Loitering_Munition_Hediff + + WLl-35"沸石"的引导系统可以使其巡飞弹射后不理,但是只能开机一小段时间。 + (0.52, 1, 0.95) + HediffWithComps + +
  • +
  • + 160 + true +
  • +
    + +
  • + + true + + 0 + 1.5 + +
  • +
    +
    + + WULA_RW_Auto_GL + + 乌拉帝国所装备的自动榴弹炮,主要发射用于对抗低护甲集群的杀伤性榴弹,优秀的供弹结构使其射速较同类武器快得多。除此之外,它也能临时装填和发射EMP榴弹或烟雾榴弹,这使其成为了一款多功能的支援型武器。 + Ultra + None + + + Wula/Weapon/WULA_RW_Auto_GL/WULA_RW_Auto_GL + Graphic_Single + 1.45 + + +
  • Wula_Ranged_Weapon_T3
  • +
    + 0.8 + + +
  • WULA_Cube_Productor_Energy
  • +
    + WULA_Synth_Weapon_3_Bomb_Technology + UnfinishedWeapon +
    + + 380 + 60 + 8 + + + 40000 + 10 + 0.5 + 0.5 + 0.4 + 0.3 + 1 + + +
  • + Verb_Shoot + true + Bullet_WULA_RW_Auto_GL + 0.2 + true + false + 4 + 42 + 1 + Mortar_LaunchA + 12 + 6 + + true + +
  • +
    + +
  • + Wula/Weapon/WULA_RW_Auto_GL/WULA_RW_Auto_GL_Anim + 8 + 8 +
  • +
  • + WULA_RW_Auto_GL_Smoke_Ability + 烟雾弹 +
  • +
    +
    + + Bullet_WULA_RW_Auto_GL + + + Wula/Projectile/WULA_Shrapnel + Graphic_Single + + WulaFallenEmpire.Projectile_ExplosiveWithTrail + + Bomb + 8 + 35 + 3.5 + 0.1 + true + Artillery_HitThickRoof + MortarBomb_Explode + MortarRound_PreImpact + MortarRound_Ambient + 10 + + +
  • + WULA_Smoke_Tail + 1 +
  • +
    +
    + + WULA_RW_Auto_GL_Smoke_Ability + + 使用SEl-78"角砾岩"临时装填并发射一枚烟雾弹,用于遮蔽炮塔的瞄准和防止己方被流弹击中。 + Wula/UI/Abilities/WULA_RW_Auto_GL_Smoke_Ability + True + False + Misc11 + false + 3 + true + 1200 + + Verb_CastAbility + 42 + 1.2 + 9 + true + Mortar_LaunchA + false + + + true + false + true + true + true + + + +
  • + Bullet_Shell_Smoke +
  • +
    +
    +
    \ No newline at end of file diff --git a/1.6/1.6/Defs/ThingDefs_Misc/Weapons/WULA_Weapon.xml b/1.6/1.6/Defs/ThingDefs_Misc/Weapons/WULA_Weapon.xml index 01f16ca7..c9e0e5c2 100644 --- a/1.6/1.6/Defs/ThingDefs_Misc/Weapons/WULA_Weapon.xml +++ b/1.6/1.6/Defs/ThingDefs_Misc/Weapons/WULA_Weapon.xml @@ -1,945 +1,6 @@ - - - WULA_MW_Mace - - 这种细长的狼牙棒很适合在狭窄空间挥舞,也是乌拉帝国王权的象征——尽管在你手里这只是一根带刺的棍子。 - - Wula/Weapon/WULA_MW_Mace - Graphic_Single - CutoutComplex - 0.8 - - 1.1 - Medieval - - - 300 - 2 - - -65 - - 10 - - 30 - -
  • Metallic
  • -
  • Woody
  • -
  • Stony
  • -
    - - -
  • WULA_Cube_Productor_BIO
  • -
  • WULA_Cube_Productor_Energy
  • -
    - WULA_Synth_Weapon_Technology - 300 - UnfinishedWeapon -
    - -
  • - - -
  • Poke
  • - - 9 - 1 - 0.5 - -
  • - - false - -
  • Stab
  • - - 18 - 1.25 - -
    - -
  • Wula_Weapon_Init
  • -
    - -
  • RewardStandardQualitySuper
  • -
    -
    - - - WULA_MW_Constructor_Hammer - - 供乌拉猫猫使用的多功能工具,兼具施工和开采的能力。 - - Wula/Weapon/WULA_MW_Constructor_Hammer - Graphic_Single - CutoutComplex - - -65 - Spacer - false - 0 - - 100 - 1000 - 1 - - - 20 - - -
  • - - -
  • Poke
  • - - 14 - 1.5 - 0.8 - -
    - - - - -
  • Wula_Constructor_Cat_Weapon
  • -
    -
    - - WULA_RW_Base_AR_Cat - - 乌拉帝国的旧式突击步枪,比起DLa-1"页岩"来说更小一些,射程和精度有所下降,但是下挂了一把刺刀用于近身战斗,专为乌拉猫猫机械体设计。 - - Normal - Spacer - -
  • Wula_Assault_Cat_Weapon
  • -
    - - Wula/Weapon/WULA_RW_Base_AR_Cat - Graphic_Single - 0.7 - - Interact_Rifle - 0 - - 700 - - 3.5 - 0.6 - 0.6 - 0.5 - 0.25 - 1.6 - - -
  • - Verb_Shoot - true - Bullet_AssaultRifle - 0.7 - 20 - 3 - 3 - Shot_AssaultRifle - GunTail_Medium - 7 -
  • -
    - - 60 - 8 - - -
  • - - -
  • Stab
  • - - 15 - 0.50 - 2.2 - -
    - - - - -
    - - - WULA_MW_Breaker_Bar - - 一种沉重的破墙设备,通常由装备外骨骼的乌拉帝国士兵携带,可以通过加压挥出势大力沉的一击,连续击倒多名敌人。 - - Wula/Weapon/WULA_MW_Breaker_Bar - CutoutComplex - Graphic_Single - 1.35 - - -65 - -
  • Wula_Melee_Weapon_T3
  • -
    - Spacer - 50 - - - 20000 - 20 - - -
  • Metallic
  • -
    - - 20 - 4 - - -
  • - - -
  • WULA_MW_Breaker_Bar_Demolish
  • - - 150 - 5 - 1 - - -
    - - -
  • WULA_Cube_Productor_Energy
  • -
    - WULA_Synth_Weapon_2_Stun_Technology - - 7 - - 450 - UnfinishedWeapon -
    - -
  • RewardStandardQualitySuper
  • -
    - -
  • - 90 - 2.5 - 0.5 - false - Blunt -
  • -
  • - -
  • WULA_Melee_Cleave
  • - - - 1 - 1 - - -
    -
    - - WULA_MW_Breaker_Bar_Demolish - - - - WULA_MW_Breaker_Bar_Maneuver - WULA_MW_Breaker_Bar_Demolish - - WulaFallenEmpire.Verb_MeleeAttack_Cleave - Demolish - - MeleeAttack - Maneuver_Slash_MeleeHit - Maneuver_Slash_MeleeDeflect - Maneuver_Slash_MeleeMiss - Maneuver_Slash_MeleeDodge - - - - WULA_MW_Charge_Mace - - 这种乌拉帝国战士使用的近战武器由多层复合的高密度钨合金或贫铀合金核心构成,可以利用无与伦比的冲击质量击碎护甲,同时锤头镶嵌着数个单分子碳化硅撞针,用于为EMP装置的释放创造接触点。 - - Wula/Weapon/WULA_MW_Charge_Mace - Graphic_Single - CutoutComplex - - -
  • Wula_Melee_Weapon_T2
  • -
    - -65 - Spacer - - 20000 - 5 - - 60 - -
  • Metallic
  • -
    - - 5 - 6 - - -
  • - - -
  • Poke
  • - - 18 - 1.5 - 0.8 - -
  • - Stun - 4 -
  • -
    - -
    - - -
  • WULA_Cube_Productor_Energy
  • -
    - WULA_Synth_Weapon_2_Stun_Technology - - 7 - - 450 - UnfinishedWeapon -
    - -
  • RewardStandardQualitySuper
  • -
    -
    - - - WULA_MW_ChainSword - - 这种嗡嗡作响的乌拉帝国链锯类武器有多条环绕剑脊高速旋转的多层复合锯齿链条,之间嵌有能量传导节点或微型冷却剂喷口,是力量与纯粹疯狂的象征——它在一次的攻击中会造成大量的伤口,足以从头到脚撕裂敌人的身体。 - - Wula/Weapon/WULA_MW_ChainSword - Graphic_Single - CutoutComplex - - Interact_WULA_MW_ChainSword - - Spacer - 60 - -
  • Metallic
  • -
    - - 5 - 3 - - - 20000 - 2.5 - - -
  • - - -
  • WULA_MW_ChainSword_MultiStrike
  • - - 0.5 - 25 - 1.2 - WULA_MW_ChainSword_Hit - WULA_MW_ChainSword_Hit - -
  • - - -
  • Blunt
  • -
  • Poke
  • - - 18 - 1.5 - - -
  • - Stun - 5 -
  • -
    -
    - -
    - - -
  • WULA_Cube_Productor_Energy
  • -
    - WULA_Synth_Weapon_2_Melee_Technology - - 7 - - 450 - UnfinishedWeapon -
    - -
  • Wula_Melee_Weapon_T2
  • -
    - -
  • RewardStandardQualitySuper
  • -
    - -
  • - 5~8 - 0.2 -
  • -
    -
    - - WULA_MW_ChainSword_MultiStrike - - - - WULA_MW_ChainSword_Maneuver - WULA_MW_ChainSword_MultiStrike - - WulaFallenEmpire.Verb_MeleeAttack_MultiStrike - Cut - - MeleeAttack - Maneuver_Slash_MeleeHit - Maneuver_Slash_MeleeDeflect - Maneuver_Slash_MeleeMiss - Maneuver_Slash_MeleeDodge - - - - WULA_MW_Glaive - - 乌拉帝国修女惯用的大型双头刀,装备了悬浮轴承、能量刃、惯性控制场和精密的传感器系统,让使用者能像舞蹈般挥舞两端的致命锋刃。 - -
  • Wula_Melee_Weapon_FE_Spiritualist
  • - -
    - - Wula/Weapon/WULA_MW_Glaive - Graphic_Single - CutoutComplex - 1.5 - - 0.75 - - Spacer - - 200 - -
  • Metallic
  • -
    - - 10 - 6 - - - 30000 - 5 - - -
  • - - -
  • Cut
  • - - 35 - 1.9 - 0.50 - -
  • - - -
  • Stab
  • - - 40 - 0.90 - 2.2 - -
    - - -
  • WULA_Cube_Productor_Energy
  • -
    - WULA_Synth_Weapon_2_Melee_Technology - UnfinishedWeapon -
    - -
  • Wula_Melee_Weapon_T2
  • -
    - -
  • RewardStandardQualitySuper
  • -
    -
    - - - - WULA_RW_AutoCannon - - 一般由乌拉帝国跳帮组或骑士军团携带的自动炮,在拥有长射程的同时火力也非常凶猛,会造成区域性的爆炸效果以控制集群敌军。 - Ultra - -
  • Wula_Ranged_Weapon_T3
  • -
    - - - Wula/Weapon/WULA_RW_AutoCannon - Graphic_Single - 1.65 - - None - 0.75 - Interact_ChargeRifle - - -
  • WULA_Cube_Productor_Energy
  • -
    - WULA_Synth_Weapon_3_Bomb_Technology - UnfinishedWeapon -
    - - 300 - 80 - 8 - - - 40000 - 20 - 0.85 - 0.85 - 0.75 - 0.65 - 1 - - -
  • - Verb_Shoot - true - Bullet_WULA_RW_AutoCannon - 1.5 - 32 - 0.1 - 6 - 8 - Shot_ChargeRifle - GunTail_Medium - 9 - - true - true - true - -
  • -
    - -
  • RewardStandardQualitySuper
  • -
    -
    - - Bullet_WULA_RW_AutoCannon - - Projectile_Explosive - Normal - True - - Wula/Projectile/WULA_Bullet_ChargeLanceShot_Red - Graphic_Single - TransparentPostLight - 1.4 - - - Bullet - 22 - 90 - 1.2 - 0.4 - Explosion_Rocket - 0.75 - 0.1 - - - - - WULA_RW_Auto_GL - - 乌拉帝国所装备的自动榴弹炮,所发射高抛的高爆榴弹或许杀伤力没有想象的这么强,但是射速极快,几乎可以依靠单兵创造一片轰炸区。 - Ultra - None - - - Wula/Weapon/WULA_RW_Auto_GL - Graphic_Single - 1.65 - - -
  • Wula_Ranged_Weapon_T3
  • -
    - 0.75 - - -
  • WULA_Cube_Productor_Energy
  • -
    - WULA_Synth_Weapon_3_Bomb_Technology - UnfinishedWeapon -
    - - 380 - 60 - 8 - - - 40000 - 20 - 0.5 - 0.5 - 0.4 - 0.3 - 1 - - -
  • - Verb_Shoot - true - Bullet_WULA_RW_Auto_GL - 0.2 - 4 - 4 - true - false - 4 - 48 - 1 - Mortar_LaunchA - 12 - - true - -
  • -
    - -
  • RewardStandardQualitySuper
  • -
    -
    - - Bullet_WULA_RW_Auto_GL - - - Wula/Projectile/WULA_Shrapnel - Graphic_Single - TransparentPostLight - - - Projectile_Explosive - - Bomb - 25 - 35 - 3.5 - 0.1 - true - Artillery_HitThickRoof - MortarBomb_Explode - MortarRound_PreImpact - MortarRound_Ambient - - - - - - WULA_MW_Lance - - 乌拉帝国骑士所喜爱的枪炮合一的重型近战武器,采用高强度纳米碳纤维复合材料内芯,外层覆盖着带有散热格栅和能量导流槽的记忆合金装甲板,既可以在近战中刺穿对手,也可以从远距离上发射暗物质射流打击敌军。 - -
  • Spear
  • -
    - - Wula/Weapon/WULA_MW_Lance - Graphic_Single - CutoutComplex - 2 - - Spacer - 120 - 0 - -
  • Metallic
  • -
    - - 150 - 2 - - - 20000 - 10 - 0.5 - 0.5 - 0.4 - 0.3 - 0 - - -
  • - - -
  • Blunt
  • -
  • Poke
  • - - 42 - 1.6 - - -
  • - Stun - 14 -
  • -
    -
    - -
  • - - -
  • Stab
  • - - 65 - 0.80 - 2.6 - -
    - - -
  • WULA_Cube_Productor_Energy
  • -
    - WULA_Synth_Weapon_4_DM_Base_Technology - - 7 - - 450 - UnfinishedWeapon -
    - - - - -
  • RewardStandardQualitySuper
  • -
    - -
  • - WULA_MW_Lance_Ranged - WULA_WULA_MW_Lance_WeaponSwitchAbility -
  • -
    -
    - - WULA_MW_Lance_Ranged - - 乌拉帝国骑士所喜爱的枪炮合一的重型近战武器,采用高强度纳米碳纤维复合材料内芯,外层覆盖着带有散热格栅和能量导流槽的记忆合金装甲板,既可以在近战中刺穿对手,也可以从远距离上发射暗物质射流打击敌军。 - - - - - Wula/Weapon/WULA_MW_Lance_Ranged - Graphic_Single - CutoutComplex - 2 - - Spacer - 120 - -
  • Metallic
  • -
    - - 150 - 2 - - - 20000 - 10 - 1 - 1 - 1 - 1 - 0 - - -
  • - - -
  • Blunt
  • -
  • Poke
  • - - 42 - 1.6 - - -
  • - Stun - 14 -
  • -
    -
    - -
  • - - -
  • Stab
  • - - 65 - 0.80 - 2.6 - -
    - - - - 0 - - - -
  • - WulaFallenEmpire.Verb_ShootBeamExplosive - - - true - 1 - 24 - 6 - 4 - Wula_Dark_Matter_Beam - - - 1000 - -1 - 0 - 0 - 0 - - - 0 - BeamGraser_Shooting - Fleck_BeamBurn - 0.32 - Mote_Wula_Dark_Matter_Beam - GraserBeam_End - - 0.35 - - - 0.6 - 0.6 - 0.25 - - - true - - -
  • (0, 0)
  • -
  • (0.65, 0.4)
  • -
  • (1, 0.75)
  • - - - - - - true - - - true - 3 - 0.25 - Wula_Dark_Matter_Flame - 15 - Explosion_Bomb - 0.6 - -
    - -
  • RewardStandardQualitySuper
  • -
    - -
  • - WULA_MW_Lance - WULA_WULA_MW_Lance_WeaponSwitchAbility -
  • -
    -
    - - WULA_WULA_MW_Lance_WeaponSwitchAbility - - 控制暗物质能源炉的能量输出,以决定CMl-28"铳枪"是否可以发射暗物质射流 - 601 - Wula/UI/Abilities/WULA_WeaponSwitchAbility - false - false - false - false - false - - - - - - Verb_CastAbility - 0 - false - false - false - - true - - - -
  • - WulaFallenEmpire.CompAbilityEffect_Switch -
  • - - -
    -
    - - - WULA_WM_Panzer_Turret diff --git a/1.6/1.6/Defs/ThingDefs_Races/Races_Wulaspecies.xml b/1.6/1.6/Defs/ThingDefs_Races/Races_Wulaspecies.xml index 1643202d..ed0e4852 100644 --- a/1.6/1.6/Defs/ThingDefs_Races/Races_Wulaspecies.xml +++ b/1.6/1.6/Defs/ThingDefs_Races/Races_Wulaspecies.xml @@ -234,8 +234,7 @@ WulaSpecies - 诞生于乌拉帝国的机械生命体 - Wula/Things/WulaSpecies/WULA_Species_Icon + 诞生于乌拉帝国的机械生命体,是对这个帝国的统治者精妙的仿制。作为机械生命,乌拉帝国合成人比常规的人类要坚韧的多——她们不害怕极端气候、真空和毒气侵袭,也不需要常规意义上的食物。\n\n然而,她们也有自己的缺陷——她们移动速度较慢、害怕EMP攻击、不擅长采矿和建造,并且如时钟发条的精密的身体难以连续承受高额伤害,必须定期返回维修舱检修。 @@ -256,7 +255,7 @@ true
  • WULA_Charging_Station_Synth
  • -
  • Wula_SleepingSpot
  • +
  • SleepingSpot
  • @@ -621,13 +620,16 @@ BulletImpact_Metal 7200 - 12000 + 10000 50 - 4.5 + 4 1000 -100 - 100 + 250 + 1 + 1 + 1 0.25 @@ -639,18 +641,18 @@ 0.25 - 1 + 0.25 - 1 + 0.5 1 1 - 1 + 0.25 + 0.5 1 - 1 @@ -661,8 +663,8 @@ Humanlike Filth_MachineBits - - 1.5 + + 1 Steel Steel @@ -696,9 +698,28 @@
  • - Wula_Species_Lifestage + HumanlikeBaby 0
  • +
  • + HumanlikeChild + 0.25 +
  • +
  • + HumanlikePreTeenager + 0.5 +
  • +
  • + HumanlikeTeenager + 0.75 +
  • +
  • + HumanlikeAdult + 1 + + Pawn_Mech_Warqueen_Death + +
  • true
    @@ -747,6 +768,13 @@
  • FacialAnimation.FacialAnimationControllerComp
  • +
  • + +
  • WULA_NanoRepairHediff
  • + + 1.0 + false + @@ -924,7 +952,6 @@ 0.5 0.10 0.20 - 0.66 true None @@ -962,6 +989,7 @@ +
  • CompMechanoid
  • @@ -970,20 +998,27 @@ 30 MechanoidsWakeUp + +
  • + +
  • + + -10 + 999999 + 0 +
  • true true true
  • - -
  • -
  • -
  • - - -10 - 999999 - 0 +
  • + +
  • WULA_NanoRepairHediff
  • + + 1.0 + false
    @@ -1045,16 +1080,6 @@
    - - Mech_WULA_Cat_EMP - - 乌拉帝国的一种小型自律机械体,无需监管者,只能执行救火、搬运和清扫任务,但是相比起基础型号多配备了一个EMP投掷物,可以辅助乌拉帝国军团对抗机械部队。 - - - Mech_WULA_Cat_Fire - - 乌拉帝国的一种小型自律机械体,无需监管者,只能执行救火、搬运和清扫任务,但是相比起基础型号多配备了一个燃烧瓶投掷物,可以点燃靠近阵线的敌军。 - Mech_WULA_Cat_Constructor @@ -1089,36 +1114,6 @@ 4 - - Mech_WULA_Cat_DM - - 乌拉帝国的一种小型自律机械体,无需监管者,可以执行包括搬运、烹饪、种植收割、清理、急救和灭火一类的简单工作。这种型号的乌拉猫猫内置了一台不稳定暗物质引擎,这使得其无需充电,但是在死亡时会产生巨大的爆炸。 - Wula/Things/WULA_DM_Cat/WULA_Cat_Thin_south - - - 6 - 0.001 - -1 - - - -
  • Hauling
  • -
  • Cooking
  • -
  • PlantCutting
  • -
  • Growing
  • -
  • Cleaning
  • -
  • Doctor
  • -
  • Firefighter
  • -
    -
    - -
  • - 30 - BombSuper - 550 -
  • -
    -
    @@ -1309,9 +1304,9 @@
  • MechanoidFullyFormed 0 - Pawn_Mech_Warqueen_Wounded + Pawn_Mech_Warqueen_Death - Pawn_Mech_Warqueen_Call +
  • 5 diff --git a/1.6/1.6/Defs/ThinkTreeDefs/WULA_AutonomousMech.xml b/1.6/1.6/Defs/ThinkTreeDefs/WULA_AutonomousMech.xml index d49741ee..c8150647 100644 --- a/1.6/1.6/Defs/ThinkTreeDefs/WULA_AutonomousMech.xml +++ b/1.6/1.6/Defs/ThinkTreeDefs/WULA_AutonomousMech.xml @@ -49,7 +49,7 @@
  • - +
  • @@ -57,11 +57,6 @@
  • - -
  • - 8 - 30 -
  • @@ -206,36 +201,4 @@ - - - - WULA_AutonomousCombat - - 战斗中 - 战斗 - false - 99 - Violent - true - - - - WULA_AutonomousWaitCombat - WulaFallenEmpire.JobDriver_AutonomousWaitCombat - standing guard. - true - true - false - true - false - true - false - -
  • - true - true - 35 -
  • -
    -
    diff --git a/1.6/1.6/Languages/ChineseSimplified (简体中文)/Keyed/Misc_Gameplay.xml b/1.6/1.6/Languages/ChineseSimplified (简体中文)/Keyed/Misc_Gameplay.xml index b4ddf964..d3531b35 100644 --- a/1.6/1.6/Languages/ChineseSimplified (简体中文)/Keyed/Misc_Gameplay.xml +++ b/1.6/1.6/Languages/ChineseSimplified (简体中文)/Keyed/Misc_Gameplay.xml @@ -39,4 +39,57 @@ 征召自律机械 使自律机械进入征召状态 + + 纳米修复系统:修复中 + 纳米修复系统:待机 + 当前能量:{0} + 无能量需求 + 检测到损伤 + 无损伤 + 修复冷却:{0}秒 + + + 禁用纳米修复 + 关闭纳米修复系统以节省能量 + 启用纳米修复 + 开启纳米修复系统以自动修复损伤 + {0}的纳米修复系统已启用 + {0}的纳米修复系统已禁用 + 纳米修复: 已禁用 + + + 附近没有可回收的乌拉猫猫。 + 地堡已满。 + 已调用 {0} 个乌拉猫猫回到地堡。 + 已回收 {0}。 + 没有可转换的乌拉猫猫。 + 地堡内的的乌拉猫猫不足。 + 正在将地堡内的{0}个乌拉猫猫转换为{1}。 + + 呼叫乌拉猫猫进驻 + 呼叫{0}格内的乌拉猫猫前来报到,以便转换为其他类型的猫猫,或是使用地堡内武器抵御敌军。 + 地堡存储已满。 + 释放乌拉猫猫 + 将地堡内的乌拉猫猫释放出来,它们可以在离开前重新选择装备以转变类型。\n容量:{0}/{1} + 地堡内没有乌拉猫猫待命。 + + 容量:{0}/{1} + + 召唤空投建筑 + 从乌拉帝国的舰队呼叫对应的建筑空投到此处 + 空投建筑将在 {0} 后到达 + 空投建筑将在 {0} 后到达 + 准备召唤空投建筑 + + 可空投建筑 + 需要 {0} 在殖民地上空时才可以空投建筑 + 需要 {0} 在殖民地上空时才可以空投建筑 + 需要 {0} 在殖民地上空时才可以空投建筑 + + 厚岩顶阻挡空投 + 屋顶阻挡空投 + 该空投地点顶部有厚岩顶,无法进行空投 + 该空投地点顶部有屋顶,无法进行空投 + 被厚岩顶阻挡 + 被屋顶阻挡 \ No newline at end of file diff --git a/Content/Sounds/Wula/WULA_MW_Breaker_Bar_Hit.wav b/Content/Sounds/Wula/WULA_MW_Breaker_Bar_Hit.wav new file mode 100644 index 00000000..1412ae11 Binary files /dev/null and b/Content/Sounds/Wula/WULA_MW_Breaker_Bar_Hit.wav differ diff --git a/Content/Sounds/Wula/WULA_RW_Beam_Shootingsound.wav b/Content/Sounds/Wula/WULA_RW_Beam_Shootingsound.wav new file mode 100644 index 00000000..c6daeade Binary files /dev/null and b/Content/Sounds/Wula/WULA_RW_Beam_Shootingsound.wav differ diff --git a/Content/Sounds/Wula/WULA_RW_Railgun_Shootingsound.wav b/Content/Sounds/Wula/WULA_RW_Railgun_Shootingsound.wav new file mode 100644 index 00000000..f43d405b Binary files /dev/null and b/Content/Sounds/Wula/WULA_RW_Railgun_Shootingsound.wav differ diff --git a/Content/Textures/Wula/Building/WULA_Cat_Bunker_Incoming.png b/Content/Textures/Wula/Building/WULA_Cat_Bunker_Incoming.png new file mode 100644 index 00000000..3f1030c0 Binary files /dev/null and b/Content/Textures/Wula/Building/WULA_Cat_Bunker_Incoming.png differ diff --git a/Content/Textures/Wula/Building/WULA_Cat_Bunker_east.png b/Content/Textures/Wula/Building/WULA_Cat_Bunker_east.png new file mode 100644 index 00000000..4968e56b Binary files /dev/null and b/Content/Textures/Wula/Building/WULA_Cat_Bunker_east.png differ diff --git a/Content/Textures/Wula/Building/WULA_Cat_Bunker_north.png b/Content/Textures/Wula/Building/WULA_Cat_Bunker_north.png new file mode 100644 index 00000000..4968e56b Binary files /dev/null and b/Content/Textures/Wula/Building/WULA_Cat_Bunker_north.png differ diff --git a/Content/Textures/Wula/Building/WULA_Cat_Bunker_south.png b/Content/Textures/Wula/Building/WULA_Cat_Bunker_south.png new file mode 100644 index 00000000..4968e56b Binary files /dev/null and b/Content/Textures/Wula/Building/WULA_Cat_Bunker_south.png differ diff --git a/Content/Textures/Wula/Building/WULA_Dropping_Building_Cleanzone.png b/Content/Textures/Wula/Building/WULA_Dropping_Building_Cleanzone.png new file mode 100644 index 00000000..cfdd2ef4 Binary files /dev/null and b/Content/Textures/Wula/Building/WULA_Dropping_Building_Cleanzone.png differ diff --git a/Content/Textures/Wula/FlyoverThing/WULA_BattleShip_Shadow.png b/Content/Textures/Wula/FlyoverThing/WULA_BattleShip_Shadow.png new file mode 100644 index 00000000..d2de877d Binary files /dev/null and b/Content/Textures/Wula/FlyoverThing/WULA_BattleShip_Shadow.png differ diff --git a/Content/Textures/Wula/FlyoverThing/WULA_Fighter_Shadow.png b/Content/Textures/Wula/FlyoverThing/WULA_Fighter_Shadow.png new file mode 100644 index 00000000..6aa6bd71 Binary files /dev/null and b/Content/Textures/Wula/FlyoverThing/WULA_Fighter_Shadow.png differ diff --git a/Content/Textures/Wula/Mote/Mote_WULA_Beam_Charge.png b/Content/Textures/Wula/Mote/Mote_WULA_Beam_Charge.png new file mode 100644 index 00000000..ebc066c8 Binary files /dev/null and b/Content/Textures/Wula/Mote/Mote_WULA_Beam_Charge.png differ diff --git a/Content/Textures/Wula/Projectile/Grenade_WULA_RW_Base_AR.png b/Content/Textures/Wula/Projectile/Grenade_WULA_RW_Base_AR.png new file mode 100644 index 00000000..483fb88f Binary files /dev/null and b/Content/Textures/Wula/Projectile/Grenade_WULA_RW_Base_AR.png differ diff --git a/Content/Textures/Wula/Projectile/WULA_Bullet_StarDrift_Shotgun_Spear.png b/Content/Textures/Wula/Projectile/WULA_Bullet_StarDrift_Shotgun_Spear.png index 73c8ac71..320a07e2 100644 Binary files a/Content/Textures/Wula/Projectile/WULA_Bullet_StarDrift_Shotgun_Spear.png and b/Content/Textures/Wula/Projectile/WULA_Bullet_StarDrift_Shotgun_Spear.png differ diff --git a/Content/Textures/Wula/Projectile/WULA_Shrapnel.png b/Content/Textures/Wula/Projectile/WULA_Shrapnel.png index 5916ae8e..0540126a 100644 Binary files a/Content/Textures/Wula/Projectile/WULA_Shrapnel.png and b/Content/Textures/Wula/Projectile/WULA_Shrapnel.png differ diff --git a/Content/Textures/Wula/UI/Abilities/WULA_CallBattleShip.png b/Content/Textures/Wula/UI/Abilities/WULA_CallBattleShip.png new file mode 100644 index 00000000..cfccfacb Binary files /dev/null and b/Content/Textures/Wula/UI/Abilities/WULA_CallBattleShip.png differ diff --git a/Content/Textures/Wula/UI/Abilities/WULA_RW_Auto_GL_Smoke_Ability.png b/Content/Textures/Wula/UI/Abilities/WULA_RW_Auto_GL_Smoke_Ability.png new file mode 100644 index 00000000..16c3c749 Binary files /dev/null and b/Content/Textures/Wula/UI/Abilities/WULA_RW_Auto_GL_Smoke_Ability.png differ diff --git a/Content/Textures/Wula/UI/Abilities/WULA_RW_Base_AR_Ability.png b/Content/Textures/Wula/UI/Abilities/WULA_RW_Base_AR_Ability.png new file mode 100644 index 00000000..9b614649 Binary files /dev/null and b/Content/Textures/Wula/UI/Abilities/WULA_RW_Base_AR_Ability.png differ diff --git a/Content/Textures/Wula/UI/Abilities/WULA_RW_Base_Loitering_Munition_Ability.png b/Content/Textures/Wula/UI/Abilities/WULA_RW_Base_Loitering_Munition_Ability.png new file mode 100644 index 00000000..ff34d8d4 Binary files /dev/null and b/Content/Textures/Wula/UI/Abilities/WULA_RW_Base_Loitering_Munition_Ability.png differ diff --git a/Content/Textures/Wula/UI/Abilities/WULA_RW_EMP_RF_EMP_Ability.png b/Content/Textures/Wula/UI/Abilities/WULA_RW_EMP_RF_EMP_Ability.png new file mode 100644 index 00000000..f1b71279 Binary files /dev/null and b/Content/Textures/Wula/UI/Abilities/WULA_RW_EMP_RF_EMP_Ability.png differ diff --git a/Content/Textures/Wula/UI/Abilities/WULA_WeaponSwitchAbility.png b/Content/Textures/Wula/UI/Abilities/WULA_WeaponSwitchAbility.png index a0778f0b..6c323df7 100644 Binary files a/Content/Textures/Wula/UI/Abilities/WULA_WeaponSwitchAbility.png and b/Content/Textures/Wula/UI/Abilities/WULA_WeaponSwitchAbility.png differ diff --git a/Content/Textures/Wula/UI/Commands/WULA_ConvertMechanoids.png b/Content/Textures/Wula/UI/Commands/WULA_ConvertMechanoids.png new file mode 100644 index 00000000..28b5ca37 Binary files /dev/null and b/Content/Textures/Wula/UI/Commands/WULA_ConvertMechanoids.png differ diff --git a/Content/Textures/Wula/UI/Commands/WULA_DropBuilding.png b/Content/Textures/Wula/UI/Commands/WULA_DropBuilding.png new file mode 100644 index 00000000..231293b7 Binary files /dev/null and b/Content/Textures/Wula/UI/Commands/WULA_DropBuilding.png differ diff --git a/Content/Textures/Wula/UI/Commands/WULA_NanoRepairHediff_Switch.png b/Content/Textures/Wula/UI/Commands/WULA_NanoRepairHediff_Switch.png new file mode 100644 index 00000000..26ffb56c Binary files /dev/null and b/Content/Textures/Wula/UI/Commands/WULA_NanoRepairHediff_Switch.png differ diff --git a/Content/Textures/Wula/UI/Commands/WULA_RecycleNearbyMechanoids.png b/Content/Textures/Wula/UI/Commands/WULA_RecycleNearbyMechanoids.png new file mode 100644 index 00000000..ccfa75f4 Binary files /dev/null and b/Content/Textures/Wula/UI/Commands/WULA_RecycleNearbyMechanoids.png differ diff --git a/Content/Textures/Wula/Weapon/WULA_MW_Armour_Lance.png b/Content/Textures/Wula/Weapon/WULA_MW_Armour_Lance.png deleted file mode 100644 index 2edb826e..00000000 Binary files a/Content/Textures/Wula/Weapon/WULA_MW_Armour_Lance.png and /dev/null differ diff --git a/Content/Textures/Wula/Weapon/WULA_MW_Breaker_Bar.png b/Content/Textures/Wula/Weapon/WULA_MW_Breaker_Bar.png deleted file mode 100644 index 569f5470..00000000 Binary files a/Content/Textures/Wula/Weapon/WULA_MW_Breaker_Bar.png and /dev/null differ diff --git a/Content/Textures/Wula/Weapon/WULA_MW_Breaker_Bar/WULA_MW_Breaker_Bar.png b/Content/Textures/Wula/Weapon/WULA_MW_Breaker_Bar/WULA_MW_Breaker_Bar.png new file mode 100644 index 00000000..3552cdc0 Binary files /dev/null and b/Content/Textures/Wula/Weapon/WULA_MW_Breaker_Bar/WULA_MW_Breaker_Bar.png differ diff --git a/Content/Textures/Wula/Weapon/WULA_MW_Breaker_Bar/WULA_MW_Breaker_Bar_Anim.png b/Content/Textures/Wula/Weapon/WULA_MW_Breaker_Bar/WULA_MW_Breaker_Bar_Anim.png new file mode 100644 index 00000000..5eb1045e Binary files /dev/null and b/Content/Textures/Wula/Weapon/WULA_MW_Breaker_Bar/WULA_MW_Breaker_Bar_Anim.png differ diff --git a/Content/Textures/Wula/Weapon/WULA_MW_ChainSword.png b/Content/Textures/Wula/Weapon/WULA_MW_ChainSword.png deleted file mode 100644 index 1fc8e548..00000000 Binary files a/Content/Textures/Wula/Weapon/WULA_MW_ChainSword.png and /dev/null differ diff --git a/Content/Textures/Wula/Weapon/WULA_MW_ChainSword/WULA_MW_ChainSword.png b/Content/Textures/Wula/Weapon/WULA_MW_ChainSword/WULA_MW_ChainSword.png new file mode 100644 index 00000000..48dbf775 Binary files /dev/null and b/Content/Textures/Wula/Weapon/WULA_MW_ChainSword/WULA_MW_ChainSword.png differ diff --git a/Content/Textures/Wula/Weapon/WULA_MW_ChainSword/WULA_MW_ChainSword_Anim.png b/Content/Textures/Wula/Weapon/WULA_MW_ChainSword/WULA_MW_ChainSword_Anim.png new file mode 100644 index 00000000..6481ac87 Binary files /dev/null and b/Content/Textures/Wula/Weapon/WULA_MW_ChainSword/WULA_MW_ChainSword_Anim.png differ diff --git a/Content/Textures/Wula/Weapon/WULA_MW_Charge_Mace.png b/Content/Textures/Wula/Weapon/WULA_MW_Charge_Mace.png deleted file mode 100644 index 09ed9e53..00000000 Binary files a/Content/Textures/Wula/Weapon/WULA_MW_Charge_Mace.png and /dev/null differ diff --git a/Content/Textures/Wula/Weapon/WULA_MW_Charge_Mace/WULA_MW_Charge_Mace.png b/Content/Textures/Wula/Weapon/WULA_MW_Charge_Mace/WULA_MW_Charge_Mace.png new file mode 100644 index 00000000..482be83d Binary files /dev/null and b/Content/Textures/Wula/Weapon/WULA_MW_Charge_Mace/WULA_MW_Charge_Mace.png differ diff --git a/Content/Textures/Wula/Weapon/WULA_MW_Charge_Mace/WULA_MW_Charge_Mace_Anim.png b/Content/Textures/Wula/Weapon/WULA_MW_Charge_Mace/WULA_MW_Charge_Mace_Anim.png new file mode 100644 index 00000000..18b26ff8 Binary files /dev/null and b/Content/Textures/Wula/Weapon/WULA_MW_Charge_Mace/WULA_MW_Charge_Mace_Anim.png differ diff --git a/Content/Textures/Wula/Weapon/WULA_MW_Constructor_Hammer.png b/Content/Textures/Wula/Weapon/WULA_MW_Constructor_Hammer.png index 489b38e6..9db3205d 100644 Binary files a/Content/Textures/Wula/Weapon/WULA_MW_Constructor_Hammer.png and b/Content/Textures/Wula/Weapon/WULA_MW_Constructor_Hammer.png differ diff --git a/Content/Textures/Wula/Weapon/WULA_MW_Glaive.png b/Content/Textures/Wula/Weapon/WULA_MW_Glaive.png deleted file mode 100644 index 617d4592..00000000 Binary files a/Content/Textures/Wula/Weapon/WULA_MW_Glaive.png and /dev/null differ diff --git a/Content/Textures/Wula/Weapon/WULA_MW_Lance.png b/Content/Textures/Wula/Weapon/WULA_MW_Lance.png deleted file mode 100644 index 706354c6..00000000 Binary files a/Content/Textures/Wula/Weapon/WULA_MW_Lance.png and /dev/null differ diff --git a/Content/Textures/Wula/Weapon/WULA_MW_Lance/WULA_MW_Lance.png b/Content/Textures/Wula/Weapon/WULA_MW_Lance/WULA_MW_Lance.png new file mode 100644 index 00000000..b6144937 Binary files /dev/null and b/Content/Textures/Wula/Weapon/WULA_MW_Lance/WULA_MW_Lance.png differ diff --git a/Content/Textures/Wula/Weapon/WULA_MW_Lance/WULA_MW_Lance_Anim.png b/Content/Textures/Wula/Weapon/WULA_MW_Lance/WULA_MW_Lance_Anim.png new file mode 100644 index 00000000..46035342 Binary files /dev/null and b/Content/Textures/Wula/Weapon/WULA_MW_Lance/WULA_MW_Lance_Anim.png differ diff --git a/Content/Textures/Wula/Weapon/WULA_MW_Lance_Ranged.png b/Content/Textures/Wula/Weapon/WULA_MW_Lance_Ranged.png deleted file mode 100644 index 4c884872..00000000 Binary files a/Content/Textures/Wula/Weapon/WULA_MW_Lance_Ranged.png and /dev/null differ diff --git a/Content/Textures/Wula/Weapon/WULA_MW_Mace.png b/Content/Textures/Wula/Weapon/WULA_MW_Mace.png deleted file mode 100644 index 749e4093..00000000 Binary files a/Content/Textures/Wula/Weapon/WULA_MW_Mace.png and /dev/null differ diff --git a/Content/Textures/Wula/Weapon/WULA_RW_AutoCannon.png b/Content/Textures/Wula/Weapon/WULA_RW_AutoCannon.png deleted file mode 100644 index 0a2f7e74..00000000 Binary files a/Content/Textures/Wula/Weapon/WULA_RW_AutoCannon.png and /dev/null differ diff --git a/Content/Textures/Wula/Weapon/WULA_RW_AutoCannon/WULA_RW_AutoCannon.png b/Content/Textures/Wula/Weapon/WULA_RW_AutoCannon/WULA_RW_AutoCannon.png new file mode 100644 index 00000000..2116d60e Binary files /dev/null and b/Content/Textures/Wula/Weapon/WULA_RW_AutoCannon/WULA_RW_AutoCannon.png differ diff --git a/Content/Textures/Wula/Weapon/WULA_RW_AutoCannon/WULA_RW_AutoCannon_Anim.png b/Content/Textures/Wula/Weapon/WULA_RW_AutoCannon/WULA_RW_AutoCannon_Anim.png new file mode 100644 index 00000000..42c421c3 Binary files /dev/null and b/Content/Textures/Wula/Weapon/WULA_RW_AutoCannon/WULA_RW_AutoCannon_Anim.png differ diff --git a/Content/Textures/Wula/Weapon/WULA_RW_Auto_GL.png b/Content/Textures/Wula/Weapon/WULA_RW_Auto_GL.png deleted file mode 100644 index 003c1d62..00000000 Binary files a/Content/Textures/Wula/Weapon/WULA_RW_Auto_GL.png and /dev/null differ diff --git a/Content/Textures/Wula/Weapon/WULA_RW_Auto_GL/WULA_RW_Auto_GL.png b/Content/Textures/Wula/Weapon/WULA_RW_Auto_GL/WULA_RW_Auto_GL.png new file mode 100644 index 00000000..d0af3db2 Binary files /dev/null and b/Content/Textures/Wula/Weapon/WULA_RW_Auto_GL/WULA_RW_Auto_GL.png differ diff --git a/Content/Textures/Wula/Weapon/WULA_RW_Auto_GL/WULA_RW_Auto_GL_Anim.png b/Content/Textures/Wula/Weapon/WULA_RW_Auto_GL/WULA_RW_Auto_GL_Anim.png new file mode 100644 index 00000000..7916d5a6 Binary files /dev/null and b/Content/Textures/Wula/Weapon/WULA_RW_Auto_GL/WULA_RW_Auto_GL_Anim.png differ diff --git a/Content/Textures/Wula/Weapon/WULA_RW_Base_AR.png b/Content/Textures/Wula/Weapon/WULA_RW_Base_AR.png index 2c337c31..190313f8 100644 Binary files a/Content/Textures/Wula/Weapon/WULA_RW_Base_AR.png and b/Content/Textures/Wula/Weapon/WULA_RW_Base_AR.png differ diff --git a/Content/Textures/Wula/Weapon/WULA_RW_Base_AR_Cat.png b/Content/Textures/Wula/Weapon/WULA_RW_Base_AR_Cat.png deleted file mode 100644 index 52afaf1d..00000000 Binary files a/Content/Textures/Wula/Weapon/WULA_RW_Base_AR_Cat.png and /dev/null differ diff --git a/Content/Textures/Wula/Weapon/WULA_RW_Base_Loitering_Munition.png b/Content/Textures/Wula/Weapon/WULA_RW_Base_Loitering_Munition.png index 0456ab36..c8a081a5 100644 Binary files a/Content/Textures/Wula/Weapon/WULA_RW_Base_Loitering_Munition.png and b/Content/Textures/Wula/Weapon/WULA_RW_Base_Loitering_Munition.png differ diff --git a/Content/Textures/Wula/Weapon/WULA_RW_Beam_Base_AR.png b/Content/Textures/Wula/Weapon/WULA_RW_Beam_Base_AR.png deleted file mode 100644 index e49298a6..00000000 Binary files a/Content/Textures/Wula/Weapon/WULA_RW_Beam_Base_AR.png and /dev/null differ diff --git a/Content/Textures/Wula/Weapon/WULA_RW_Beam_Base_AR/WULA_RW_Beam_Base_AR.png b/Content/Textures/Wula/Weapon/WULA_RW_Beam_Base_AR/WULA_RW_Beam_Base_AR.png new file mode 100644 index 00000000..b49db17e Binary files /dev/null and b/Content/Textures/Wula/Weapon/WULA_RW_Beam_Base_AR/WULA_RW_Beam_Base_AR.png differ diff --git a/Content/Textures/Wula/Weapon/WULA_RW_Beam_Base_AR/WULA_RW_Beam_Base_AR_Anim.png b/Content/Textures/Wula/Weapon/WULA_RW_Beam_Base_AR/WULA_RW_Beam_Base_AR_Anim.png new file mode 100644 index 00000000..4a3acf7a Binary files /dev/null and b/Content/Textures/Wula/Weapon/WULA_RW_Beam_Base_AR/WULA_RW_Beam_Base_AR_Anim.png differ diff --git a/Content/Textures/Wula/Weapon/WULA_RW_Fractal_RF.png b/Content/Textures/Wula/Weapon/WULA_RW_Fractal_RF.png deleted file mode 100644 index 61cc51d8..00000000 Binary files a/Content/Textures/Wula/Weapon/WULA_RW_Fractal_RF.png and /dev/null differ diff --git a/Content/Textures/Wula/Weapon/WULA_RW_Fractal_RF/WULA_RW_Fractal_RF.png b/Content/Textures/Wula/Weapon/WULA_RW_Fractal_RF/WULA_RW_Fractal_RF.png new file mode 100644 index 00000000..150b6c2f Binary files /dev/null and b/Content/Textures/Wula/Weapon/WULA_RW_Fractal_RF/WULA_RW_Fractal_RF.png differ diff --git a/Content/Textures/Wula/Weapon/WULA_RW_Fractal_RF/WULA_RW_Fractal_RF_Anim.png b/Content/Textures/Wula/Weapon/WULA_RW_Fractal_RF/WULA_RW_Fractal_RF_Anim.png new file mode 100644 index 00000000..55286528 Binary files /dev/null and b/Content/Textures/Wula/Weapon/WULA_RW_Fractal_RF/WULA_RW_Fractal_RF_Anim.png differ diff --git a/Content/Textures/Wula/Weapon/WULA_RW_Handle_Cannon.png b/Content/Textures/Wula/Weapon/WULA_RW_Handle_Cannon.png deleted file mode 100644 index 62203f7d..00000000 Binary files a/Content/Textures/Wula/Weapon/WULA_RW_Handle_Cannon.png and /dev/null differ diff --git a/Content/Textures/Wula/Weapon/WULA_RW_Handle_Cannon/WULA_RW_Handle_Cannon.png b/Content/Textures/Wula/Weapon/WULA_RW_Handle_Cannon/WULA_RW_Handle_Cannon.png new file mode 100644 index 00000000..c82ac3be Binary files /dev/null and b/Content/Textures/Wula/Weapon/WULA_RW_Handle_Cannon/WULA_RW_Handle_Cannon.png differ diff --git a/Content/Textures/Wula/Weapon/WULA_RW_Handle_Cannon/WULA_RW_Handle_Cannon_Anim.png b/Content/Textures/Wula/Weapon/WULA_RW_Handle_Cannon/WULA_RW_Handle_Cannon_Anim.png new file mode 100644 index 00000000..ff385e57 Binary files /dev/null and b/Content/Textures/Wula/Weapon/WULA_RW_Handle_Cannon/WULA_RW_Handle_Cannon_Anim.png differ diff --git a/Content/Textures/Wula/Weapon/WULA_RW_Penetrating_Beam_Rifle.png b/Content/Textures/Wula/Weapon/WULA_RW_Penetrating_Beam_Rifle.png deleted file mode 100644 index 419e9c17..00000000 Binary files a/Content/Textures/Wula/Weapon/WULA_RW_Penetrating_Beam_Rifle.png and /dev/null differ diff --git a/Content/Textures/Wula/Weapon/WULA_RW_Penetrating_Beam_Rifle/WULA_RW_Penetrating_Beam_Rifle.png b/Content/Textures/Wula/Weapon/WULA_RW_Penetrating_Beam_Rifle/WULA_RW_Penetrating_Beam_Rifle.png new file mode 100644 index 00000000..946d65d1 Binary files /dev/null and b/Content/Textures/Wula/Weapon/WULA_RW_Penetrating_Beam_Rifle/WULA_RW_Penetrating_Beam_Rifle.png differ diff --git a/Content/Textures/Wula/Weapon/WULA_RW_Penetrating_Beam_Rifle/WULA_RW_Penetrating_Beam_Rifle_Anim.png b/Content/Textures/Wula/Weapon/WULA_RW_Penetrating_Beam_Rifle/WULA_RW_Penetrating_Beam_Rifle_Anim.png new file mode 100644 index 00000000..fc8f8354 Binary files /dev/null and b/Content/Textures/Wula/Weapon/WULA_RW_Penetrating_Beam_Rifle/WULA_RW_Penetrating_Beam_Rifle_Anim.png differ diff --git a/Content/Textures/Wula/Weapon/WULA_RW_Penetrating_Beam_Rifle/WULA_RW_Penetrating_Beam_Rifle_Ranged.png b/Content/Textures/Wula/Weapon/WULA_RW_Penetrating_Beam_Rifle/WULA_RW_Penetrating_Beam_Rifle_Ranged.png new file mode 100644 index 00000000..66cdde71 Binary files /dev/null and b/Content/Textures/Wula/Weapon/WULA_RW_Penetrating_Beam_Rifle/WULA_RW_Penetrating_Beam_Rifle_Ranged.png differ diff --git a/Content/Textures/Wula/Weapon/WULA_RW_Penetrating_Beam_Rifle/WULA_RW_Penetrating_Beam_Rifle_Ranged_Anim.png b/Content/Textures/Wula/Weapon/WULA_RW_Penetrating_Beam_Rifle/WULA_RW_Penetrating_Beam_Rifle_Ranged_Anim.png new file mode 100644 index 00000000..390fbca8 Binary files /dev/null and b/Content/Textures/Wula/Weapon/WULA_RW_Penetrating_Beam_Rifle/WULA_RW_Penetrating_Beam_Rifle_Ranged_Anim.png differ diff --git a/Content/Textures/Wula/Weapon/WULA_RW_Penetrating_Beam_Rifle_Ranged.png b/Content/Textures/Wula/Weapon/WULA_RW_Penetrating_Beam_Rifle_Ranged.png deleted file mode 100644 index ef5963cb..00000000 Binary files a/Content/Textures/Wula/Weapon/WULA_RW_Penetrating_Beam_Rifle_Ranged.png and /dev/null differ diff --git a/Content/Textures/Wula/Weapon/WULA_RW_Plasma_AR.png b/Content/Textures/Wula/Weapon/WULA_RW_Plasma_AR.png deleted file mode 100644 index cbd9d22b..00000000 Binary files a/Content/Textures/Wula/Weapon/WULA_RW_Plasma_AR.png and /dev/null differ diff --git a/Content/Textures/Wula/Weapon/WULA_RW_Plasma_AR_Melee.png b/Content/Textures/Wula/Weapon/WULA_RW_Plasma_AR_Melee.png deleted file mode 100644 index 20033689..00000000 Binary files a/Content/Textures/Wula/Weapon/WULA_RW_Plasma_AR_Melee.png and /dev/null differ diff --git a/Content/Textures/Wula/Weapon/WULA_RW_Plasma_Homing_AR.png b/Content/Textures/Wula/Weapon/WULA_RW_Plasma_Homing_AR.png deleted file mode 100644 index 936f5898..00000000 Binary files a/Content/Textures/Wula/Weapon/WULA_RW_Plasma_Homing_AR.png and /dev/null differ diff --git a/Content/Textures/Wula/Weapon/WULA_RW_Plasma_Homing_AR_Ex.png b/Content/Textures/Wula/Weapon/WULA_RW_Plasma_Homing_AR_Ex.png deleted file mode 100644 index 6b34e40c..00000000 Binary files a/Content/Textures/Wula/Weapon/WULA_RW_Plasma_Homing_AR_Ex.png and /dev/null differ diff --git a/Content/Textures/Wula/Weapon/WULA_RW_Sphene_MG.png b/Content/Textures/Wula/Weapon/WULA_RW_Sphene_MG.png deleted file mode 100644 index 7e69a2dd..00000000 Binary files a/Content/Textures/Wula/Weapon/WULA_RW_Sphene_MG.png and /dev/null differ diff --git a/Content/Textures/Wula/Weapon/WULA_RW_Sphene_MG/WULA_RW_Sphene_MG.png b/Content/Textures/Wula/Weapon/WULA_RW_Sphene_MG/WULA_RW_Sphene_MG.png new file mode 100644 index 00000000..7b172ab8 Binary files /dev/null and b/Content/Textures/Wula/Weapon/WULA_RW_Sphene_MG/WULA_RW_Sphene_MG.png differ diff --git a/Content/Textures/Wula/Weapon/WULA_RW_Sphene_MG/WULA_RW_Sphene_MG_Anim.png b/Content/Textures/Wula/Weapon/WULA_RW_Sphene_MG/WULA_RW_Sphene_MG_Anim.png new file mode 100644 index 00000000..b58d678b Binary files /dev/null and b/Content/Textures/Wula/Weapon/WULA_RW_Sphene_MG/WULA_RW_Sphene_MG_Anim.png differ diff --git a/Content/Textures/Wula/Weapon/WULA_RW_StarDrift_SG.png b/Content/Textures/Wula/Weapon/WULA_RW_StarDrift_SG.png deleted file mode 100644 index 96264e27..00000000 Binary files a/Content/Textures/Wula/Weapon/WULA_RW_StarDrift_SG.png and /dev/null differ diff --git a/Content/Textures/Wula/Weapon/WULA_RW_StarDrift_Shotgun/WULA_RW_StarDrift_Shotgun.png b/Content/Textures/Wula/Weapon/WULA_RW_StarDrift_Shotgun/WULA_RW_StarDrift_Shotgun.png new file mode 100644 index 00000000..05658ded Binary files /dev/null and b/Content/Textures/Wula/Weapon/WULA_RW_StarDrift_Shotgun/WULA_RW_StarDrift_Shotgun.png differ diff --git a/Content/Textures/Wula/Weapon/WULA_RW_StarDrift_Shotgun/WULA_RW_StarDrift_Shotgun_Anim.png b/Content/Textures/Wula/Weapon/WULA_RW_StarDrift_Shotgun/WULA_RW_StarDrift_Shotgun_Anim.png new file mode 100644 index 00000000..c201b81b Binary files /dev/null and b/Content/Textures/Wula/Weapon/WULA_RW_StarDrift_Shotgun/WULA_RW_StarDrift_Shotgun_Anim.png differ diff --git a/Source/WulaFallenEmpire/BuildingComp/WULA_MechanoidRecycler/Building_MechanoidRecycler.cs b/Source/WulaFallenEmpire/BuildingComp/WULA_MechanoidRecycler/Building_MechanoidRecycler.cs new file mode 100644 index 00000000..67abc7fd --- /dev/null +++ b/Source/WulaFallenEmpire/BuildingComp/WULA_MechanoidRecycler/Building_MechanoidRecycler.cs @@ -0,0 +1,414 @@ +using RimWorld; +using System.Collections.Generic; +using System.Text; +using UnityEngine; +using Verse; +using Verse.AI; + +namespace WulaFallenEmpire +{ + public class Building_MechanoidRecycler : Building + { + // 翻译键定义 + public static class TranslationKeys + { + // 消息文本 + public const string NoRecyclableMechanoidsNearby = "WULA_NoRecyclableMechanoidsNearby"; + public const string RecyclerStorageFull = "WULA_RecyclerStorageFull"; + public const string CalledMechanoidsForRecycling = "WULA_CalledMechanoidsForRecycling"; + public const string MechanoidRecycled = "WULA_MechanoidRecycled"; + public const string NoMechanoidsAvailableForConversion = "WULA_NoMechanoidsAvailableForConversion"; + public const string NotEnoughStoredMechanoids = "WULA_NotEnoughStoredMechanoids"; + public const string ConvertingMechanoids = "WULA_ConvertingMechanoids"; + + // Gizmo 文本 + public const string RecycleNearbyMechanoids = "WULA_RecycleNearbyMechanoids"; + public const string RecycleNearbyMechanoidsDesc = "WULA_RecycleNearbyMechanoidsDesc"; + public const string RecycleNearbyMechanoidsDisabled = "WULA_RecycleNearbyMechanoidsDisabled"; + public const string ConvertMechanoids = "WULA_ConvertMechanoids"; + public const string ConvertMechanoidsDesc = "WULA_ConvertMechanoidsDesc"; + public const string ConvertMechanoidsDisabled = "WULA_ConvertMechanoidsDisabled"; + + // 检查字符串 + public const string StoredInfo = "WULA_StoredInfo"; + } + + public CompProperties_MechanoidRecycler Props => def.GetCompProperties(); + + // 存储的机械族列表 + public List storedMechanoids = new List(); + + // 生成队列 + private Queue spawnQueue = new Queue(); + + // 是否已经生成初始单位 + private bool initialUnitsSpawned = false; + + // 是否已经执行过归属权转换 + private bool ownershipTransferred = false; + + public int StoredCount => storedMechanoids.Count; + public int MaxStorage => Props.maxStorageCapacity; + + // 强制归属权转换 + private void TransferOwnership() + { + if (ownershipTransferred) + return; + + // 获取目标派系(默认为玩家派系) + Faction targetFaction = Props.ownershipFaction ?? Faction.OfPlayer; + + if (Faction != targetFaction) + { + Log.Message($"[MechanoidRecycler] Transferring ownership from {Faction?.Name ?? "NULL"} to {targetFaction.Name}"); + SetFaction(targetFaction); + } + + ownershipTransferred = true; + } + + // 生成初始单位 + private void SpawnInitialUnits() + { + if (initialUnitsSpawned || Props.initialUnits == null || Props.initialUnits.Count == 0) + return; + + foreach (var initialUnit in Props.initialUnits) + { + if (storedMechanoids.Count >= MaxStorage) + break; + + // 生成初始机械族 + PawnGenerationRequest request = new PawnGenerationRequest( + initialUnit.pawnKindDef, + Faction, // 使用当前建筑的派系 + PawnGenerationContext.NonPlayer, + -1, + forceGenerateNewPawn: true, + allowDead: false, + allowDowned: false, + canGeneratePawnRelations: false, + mustBeCapableOfViolence: true + ); + + Pawn initialMech = PawnGenerator.GeneratePawn(request); + storedMechanoids.Add(initialMech); + + Log.Message($"Mechanoid Recycler spawned initial unit: {initialMech.LabelCap} for faction: {Faction.Name}"); + } + + initialUnitsSpawned = true; + } + + public override void SpawnSetup(Map map, bool respawningAfterLoad) + { + base.SpawnSetup(map, respawningAfterLoad); + + // 执行归属权转换 + if (!respawningAfterLoad) + { + TransferOwnership(); + } + + // 如果不是从存档加载,生成初始单位 + if (!respawningAfterLoad) + { + SpawnInitialUnits(); + } + } + + // 回收附近机械族 + public void RecycleNearbyMechanoids() + { + if (!CanRecycleNow()) + return; + + List nearbyMechs = FindNearbyRecyclableMechanoids(); + + if (nearbyMechs.Count == 0) + { + Messages.Message(TranslationKeys.NoRecyclableMechanoidsNearby.Translate(), MessageTypeDefOf.RejectInput); + return; + } + + int assignedCount = 0; + foreach (Pawn mech in nearbyMechs) + { + if (StartRecycleJob(mech)) + { + assignedCount++; + } + } + + Messages.Message(TranslationKeys.CalledMechanoidsForRecycling.Translate(assignedCount), MessageTypeDefOf.PositiveEvent); + } + + private bool CanRecycleNow() + { + if (storedMechanoids.Count >= Props.maxStorageCapacity) + { + return false; + } + return true; + } + + private List FindNearbyRecyclableMechanoids() + { + List result = new List(); + CellRect searchRect = CellRect.CenteredOn(Position, Props.recycleRange); + + foreach (Pawn pawn in Map.mapPawns.AllPawnsSpawned) + { + if (searchRect.Contains(pawn.Position) && + IsRecyclableMechanoid(pawn) && + !storedMechanoids.Contains(pawn) && + !IsAlreadyGoingToRecycler(pawn) && // 检查是否已经在前往回收器 + pawn.CanReach(this, PathEndMode.InteractionCell, Danger.Some)) + { + result.Add(pawn); + } + } + + return result; + } + + private bool IsRecyclableMechanoid(Pawn pawn) + { + return pawn.RaceProps.IsMechanoid && + Props.recyclableRaces.Contains(pawn.def) && + !pawn.Downed && + pawn.Faction == Faction; // 使用当前建筑的派系 + } + + // 检查机械族是否已经在前往此回收器 + private bool IsAlreadyGoingToRecycler(Pawn mech) + { + // 检查当前工作是否是前往此回收器 + Job curJob = mech.CurJob; + if (curJob != null && curJob.def == Props.recycleJobDef && curJob.targetA.Thing == this) + return true; + + return false; + } + + private bool StartRecycleJob(Pawn mech) + { + // 防止重复分配 + if (IsAlreadyGoingToRecycler(mech)) + return false; + + Job job = JobMaker.MakeJob(Props.recycleJobDef, this); + if (mech.jobs.TryTakeOrderedJob(job)) + { + return true; + } + return false; + } + + // 机械族进入建筑 + public void AcceptMechanoid(Pawn mech) + { + if (storedMechanoids.Contains(mech)) + return; + + if (storedMechanoids.Count >= Props.maxStorageCapacity) + { + Messages.Message(TranslationKeys.RecyclerStorageFull.Translate(), MessageTypeDefOf.RejectInput); + return; + } + + storedMechanoids.Add(mech); + mech.DeSpawn(); + + Messages.Message(TranslationKeys.MechanoidRecycled.Translate(mech.LabelCap), MessageTypeDefOf.PositiveEvent); + } + + protected override void Tick() + { + base.Tick(); + + // 处理生成队列 + if (spawnQueue.Count > 0 && Find.TickManager.TicksGame % 10 == 0) + { + TrySpawnFromQueue(); + } + } + + // 打开生成界面 + public void OpenSpawnInterface() + { + if (storedMechanoids.Count == 0) + { + Messages.Message(TranslationKeys.NoMechanoidsAvailableForConversion.Translate(), MessageTypeDefOf.RejectInput); + return; + } + + List kindOptions = new List(); + + foreach (PawnKindDef kindDef in Props.spawnablePawnKinds) + { + kindOptions.Add(new FloatMenuOption( + kindDef.LabelCap, + () => TrySpawnMechanoids(kindDef, 1) + )); + } + + Find.WindowStack.Add(new FloatMenu(kindOptions)); + } + + private void TrySpawnMechanoids(PawnKindDef kindDef, int count) + { + if (storedMechanoids.Count < count) + { + Messages.Message(TranslationKeys.NotEnoughStoredMechanoids.Translate(), MessageTypeDefOf.RejectInput); + return; + } + + // 消耗存储的机械族并生成 + for (int i = 0; i < count; i++) + { + if (storedMechanoids.Count > 0) + { + Pawn consumedMech = storedMechanoids[0]; + storedMechanoids.RemoveAt(0); + + if (consumedMech.Spawned) + consumedMech.Destroy(); + } + + PawnGenerationRequest request = new PawnGenerationRequest( + kindDef, + Faction, // 使用当前建筑的派系 + PawnGenerationContext.NonPlayer, + -1, + forceGenerateNewPawn: true, + allowDead: false, + allowDowned: false, + canGeneratePawnRelations: false, + mustBeCapableOfViolence: true + ); + + spawnQueue.Enqueue(request); + } + + TrySpawnFromQueue(); + Messages.Message(TranslationKeys.ConvertingMechanoids.Translate(count, kindDef.LabelCap), MessageTypeDefOf.PositiveEvent); + } + + private void TrySpawnFromQueue() + { + if (spawnQueue.Count == 0) + return; + + int spawnCount = Mathf.Min(spawnQueue.Count, 5); + for (int i = 0; i < spawnCount; i++) + { + if (spawnQueue.Count == 0) + break; + + PawnGenerationRequest request = spawnQueue.Dequeue(); + Pawn newMech = PawnGenerator.GeneratePawn(request); + + IntVec3 spawnPos = GetSpawnPosition(); + if (spawnPos.IsValid) + { + GenSpawn.Spawn(newMech, spawnPos, Map); + } + else + { + GenSpawn.Spawn(newMech, Position, Map); + } + } + } + + private IntVec3 GetSpawnPosition() + { + for (int i = 1; i <= 3; i++) + { + foreach (IntVec3 cell in GenRadial.RadialCellsAround(Position, i, true)) + { + if (cell.InBounds(Map) && cell.Walkable(Map) && cell.GetFirstPawn(Map) == null) + return cell; + } + } + return IntVec3.Invalid; + } + + // 右键菜单选项 + public override IEnumerable GetGizmos() + { + foreach (Gizmo g in base.GetGizmos()) + yield return g; + + // 回收附近机械族按钮 + Command_Action recycleCommand = new Command_Action + { + defaultLabel = TranslationKeys.RecycleNearbyMechanoids.Translate(), + defaultDesc = TranslationKeys.RecycleNearbyMechanoidsDesc.Translate(Props.recycleRange), + icon = ContentFinder.Get("Wula/UI/Commands/WULA_RecycleNearbyMechanoids"), + action = RecycleNearbyMechanoids + }; + + if (!CanRecycleNow()) + { + recycleCommand.Disable(TranslationKeys.RecycleNearbyMechanoidsDisabled.Translate()); + } + + yield return recycleCommand; + + // 生成机械族按钮 + Command_Action spawnCommand = new Command_Action + { + defaultLabel = TranslationKeys.ConvertMechanoids.Translate(), + defaultDesc = TranslationKeys.ConvertMechanoidsDesc.Translate(storedMechanoids.Count, Props.maxStorageCapacity), + icon = ContentFinder.Get("Wula/UI/Commands/WULA_ConvertMechanoids"), + action = OpenSpawnInterface + }; + + if (storedMechanoids.Count == 0) + { + spawnCommand.Disable(TranslationKeys.ConvertMechanoidsDisabled.Translate()); + } + + yield return spawnCommand; + } + + public override string GetInspectString() + { + StringBuilder stringBuilder = new StringBuilder(); + string baseString = base.GetInspectString(); + + if (!string.IsNullOrEmpty(baseString)) + { + stringBuilder.Append(baseString); + } + + string storedInfo = TranslationKeys.StoredInfo.Translate(storedMechanoids.Count, Props.maxStorageCapacity); + + if (stringBuilder.Length > 0) + stringBuilder.AppendLine(); + stringBuilder.Append(storedInfo); + + return stringBuilder.ToString(); + } + + public override void ExposeData() + { + base.ExposeData(); + + Scribe_Collections.Look(ref storedMechanoids, "storedMechanoids", LookMode.Reference); + Scribe_Collections.Look(ref spawnQueue, "spawnQueue", LookMode.Deep); + Scribe_Values.Look(ref initialUnitsSpawned, "initialUnitsSpawned", false); + Scribe_Values.Look(ref ownershipTransferred, "ownershipTransferred", false); + + if (Scribe.mode == LoadSaveMode.PostLoadInit) + { + storedMechanoids?.RemoveAll(pawn => pawn == null); + + if (spawnQueue == null) + spawnQueue = new Queue(); + } + } + } +} diff --git a/Source/WulaFallenEmpire/BuildingComp/WULA_MechanoidRecycler/CompProperties_MechanoidRecycler.cs b/Source/WulaFallenEmpire/BuildingComp/WULA_MechanoidRecycler/CompProperties_MechanoidRecycler.cs new file mode 100644 index 00000000..a68d1682 --- /dev/null +++ b/Source/WulaFallenEmpire/BuildingComp/WULA_MechanoidRecycler/CompProperties_MechanoidRecycler.cs @@ -0,0 +1,42 @@ +using System.Collections.Generic; +using RimWorld; +using Verse; + +namespace WulaFallenEmpire +{ + // 初始单位配置类 + public class InitialUnitConfig + { + public PawnKindDef pawnKindDef; + public int count = 1; + } + + public class CompProperties_MechanoidRecycler : CompProperties + { + // 回收相关 + public List recyclableRaces = new List(); + public int recycleRange = 15; + public JobDef recycleJobDef; + public int maxStorageCapacity = 5; + + // 生成相关 + public List spawnablePawnKinds = new List(); + + // 初始单位配置 + public List initialUnits = new List(); + + // 归属权配置 + public Faction ownershipFaction = null; // 如果为null,则默认使用玩家派系 + + public CompProperties_MechanoidRecycler() + { + compClass = typeof(CompMechanoidRecycler); + } + } + + // 空的组件类,用于属性存储 + public class CompMechanoidRecycler : ThingComp + { + // 组件逻辑主要在建筑类中实现 + } +} diff --git a/Source/WulaFallenEmpire/BuildingComp/WULA_MechanoidRecycler/JobDriver_RecycleMechanoid.cs b/Source/WulaFallenEmpire/BuildingComp/WULA_MechanoidRecycler/JobDriver_RecycleMechanoid.cs new file mode 100644 index 00000000..3d76ba65 --- /dev/null +++ b/Source/WulaFallenEmpire/BuildingComp/WULA_MechanoidRecycler/JobDriver_RecycleMechanoid.cs @@ -0,0 +1,36 @@ +using RimWorld; +using Verse; +using Verse.AI; +using System.Collections.Generic; + +namespace WulaFallenEmpire +{ + public class JobDriver_RecycleMechanoid : JobDriver + { + private Building_MechanoidRecycler Recycler => job.targetA.Thing as Building_MechanoidRecycler; + + public override bool TryMakePreToilReservations(bool errorOnFailed) + { + return pawn.Reserve(job.targetA, job, 1, -1, null, errorOnFailed); + } + + protected override IEnumerable MakeNewToils() + { + // 前往回收器 + yield return Toils_Goto.GotoThing(TargetIndex.A, PathEndMode.InteractionCell); + + // 进入回收器 + yield return new Toil + { + initAction = () => + { + if (Recycler != null) + { + Recycler.AcceptMechanoid(pawn); + } + }, + defaultCompleteMode = ToilCompleteMode.Instant + }; + } + } +} diff --git a/Source/WulaFallenEmpire/ThingComp/WULA_Shuttle/ArmedShuttleIncoming.cs b/Source/WulaFallenEmpire/BuildingComp/WULA_Shuttle/ArmedShuttleIncoming.cs similarity index 100% rename from Source/WulaFallenEmpire/ThingComp/WULA_Shuttle/ArmedShuttleIncoming.cs rename to Source/WulaFallenEmpire/BuildingComp/WULA_Shuttle/ArmedShuttleIncoming.cs diff --git a/Source/WulaFallenEmpire/ThingComp/WULA_Shuttle/Building_ArmedShuttle.cs b/Source/WulaFallenEmpire/BuildingComp/WULA_Shuttle/Building_ArmedShuttle.cs similarity index 100% rename from Source/WulaFallenEmpire/ThingComp/WULA_Shuttle/Building_ArmedShuttle.cs rename to Source/WulaFallenEmpire/BuildingComp/WULA_Shuttle/Building_ArmedShuttle.cs diff --git a/Source/WulaFallenEmpire/ThingComp/WULA_Shuttle/Building_ArmedShuttleWithPocket.cs b/Source/WulaFallenEmpire/BuildingComp/WULA_Shuttle/Building_ArmedShuttleWithPocket.cs similarity index 100% rename from Source/WulaFallenEmpire/ThingComp/WULA_Shuttle/Building_ArmedShuttleWithPocket.cs rename to Source/WulaFallenEmpire/BuildingComp/WULA_Shuttle/Building_ArmedShuttleWithPocket.cs diff --git a/Source/WulaFallenEmpire/ThingComp/WULA_Shuttle/Building_PocketMapExit.cs b/Source/WulaFallenEmpire/BuildingComp/WULA_Shuttle/Building_PocketMapExit.cs similarity index 100% rename from Source/WulaFallenEmpire/ThingComp/WULA_Shuttle/Building_PocketMapExit.cs rename to Source/WulaFallenEmpire/BuildingComp/WULA_Shuttle/Building_PocketMapExit.cs diff --git a/Source/WulaFallenEmpire/ThingComp/WULA_Shuttle/Dialog_ArmedShuttleTransfer.cs b/Source/WulaFallenEmpire/BuildingComp/WULA_Shuttle/Dialog_ArmedShuttleTransfer.cs similarity index 100% rename from Source/WulaFallenEmpire/ThingComp/WULA_Shuttle/Dialog_ArmedShuttleTransfer.cs rename to Source/WulaFallenEmpire/BuildingComp/WULA_Shuttle/Dialog_ArmedShuttleTransfer.cs diff --git a/Source/WulaFallenEmpire/ThingComp/WULA_Shuttle/GenStep_WulaPocketSpaceSmall.cs b/Source/WulaFallenEmpire/BuildingComp/WULA_Shuttle/GenStep_WulaPocketSpaceSmall.cs similarity index 100% rename from Source/WulaFallenEmpire/ThingComp/WULA_Shuttle/GenStep_WulaPocketSpaceSmall.cs rename to Source/WulaFallenEmpire/BuildingComp/WULA_Shuttle/GenStep_WulaPocketSpaceSmall.cs diff --git a/Source/WulaFallenEmpire/ThingComp/WULA_Shuttle/PocketSpaceThingHolder.cs b/Source/WulaFallenEmpire/BuildingComp/WULA_Shuttle/PocketSpaceThingHolder.cs similarity index 100% rename from Source/WulaFallenEmpire/ThingComp/WULA_Shuttle/PocketSpaceThingHolder.cs rename to Source/WulaFallenEmpire/BuildingComp/WULA_Shuttle/PocketSpaceThingHolder.cs diff --git a/Source/WulaFallenEmpire/BuildingComp/WULA_SkyfallerCaller/CompSkyfallerCaller.cs b/Source/WulaFallenEmpire/BuildingComp/WULA_SkyfallerCaller/CompSkyfallerCaller.cs new file mode 100644 index 00000000..43a55886 --- /dev/null +++ b/Source/WulaFallenEmpire/BuildingComp/WULA_SkyfallerCaller/CompSkyfallerCaller.cs @@ -0,0 +1,372 @@ +using System.Collections.Generic; +using System.Linq; +using RimWorld; +using UnityEngine; +using Verse; +using Verse.AI; + +namespace WulaFallenEmpire +{ + public class CompProperties_SkyfallerCaller : CompProperties + { + public ThingDef skyfallerDef; + public bool destroyBuilding = true; + public int delayTicks = 0; + public string requiredFlyOverType = "default"; // 需要的 FlyOver 类型 + public bool allowThinRoof = true; // 允许砸穿薄屋顶 + public bool allowThickRoof = false; // 是否允许在厚岩顶下空投 + public string requiredFlyOverLabel = "FlyOver"; // 显示给玩家的标签 + + public CompProperties_SkyfallerCaller() + { + compClass = typeof(CompSkyfallerCaller); + } + } + + public class CompSkyfallerCaller : ThingComp + { + private CompProperties_SkyfallerCaller Props => (CompProperties_SkyfallerCaller)props; + + private bool used = false; + private int callTick = -1; + private bool calling = false; + + public bool CanCall => !used && !calling; + + // 获取所需的 FlyOver 显示标签 + public string RequiredFlyOverLabel + { + get + { + // 优先使用建筑配置的显示标签 + if (!Props.requiredFlyOverLabel.NullOrEmpty()) + return Props.requiredFlyOverLabel; + + // 如果没有配置,回退到类型名称 + return Props.requiredFlyOverType; + } + } + + // 检查是否有对应类型的 FlyOver + public bool HasRequiredFlyOver + { + get + { + if (parent?.Map == null) return false; + + // 查找地图上所有具有 FlyOverType 组件的物体 + List allThings = parent.Map.listerThings.AllThings; + int flyOverCount = 0; + int matchingTypeCount = 0; + + foreach (Thing thing in allThings) + { + var typeComp = thing.TryGetComp(); + if (typeComp != null) + { + flyOverCount++; + if (typeComp.FlyOverType == Props.requiredFlyOverType && typeComp.IsRequiredForDrop) + { + matchingTypeCount++; + Log.Message($"[SkyfallerCaller] Found required FlyOver of type: {Props.requiredFlyOverType} at {thing.Position}"); + } + } + } + + Log.Message($"[SkyfallerCaller] Searched {allThings.Count} things, found {flyOverCount} FlyOvers, {matchingTypeCount} matching type: {Props.requiredFlyOverType}"); + + return matchingTypeCount > 0; + } + } + + // 检查屋顶条件 + public bool CheckRoofConditions + { + get + { + if (parent?.Map == null) return false; + + IntVec3 targetPos = parent.Position; + RoofDef roof = targetPos.GetRoof(parent.Map); + + if (roof == null) + { + Log.Message($"[SkyfallerCaller] No roof at target position, skyfaller allowed"); + return true; // 没有屋顶,允许空投 + } + + if (roof.isThickRoof) + { + Log.Message($"[SkyfallerCaller] Thick roof detected at target position: {roof.defName}"); + return Props.allowThickRoof; // 厚岩顶,根据配置决定 + } + else + { + Log.Message($"[SkyfallerCaller] Thin roof detected at target position: {roof.defName}"); + return Props.allowThinRoof; // 薄屋顶,根据配置决定 + } + } + } + + // 检查所有召唤条件 + public bool CanCallSkyfaller + { + get + { + if (!CanCall) + { + Log.Message($"[SkyfallerCaller] Cannot call: already used or calling"); + return false; + } + + if (!HasRequiredFlyOver) + { + Log.Message($"[SkyfallerCaller] Cannot call: missing required FlyOver type: {Props.requiredFlyOverType}"); + return false; + } + + if (!CheckRoofConditions) + { + Log.Message($"[SkyfallerCaller] Cannot call: roof conditions not met"); + return false; + } + + Log.Message($"[SkyfallerCaller] All conditions met for skyfaller call"); + return true; + } + } + + public override void PostExposeData() + { + base.PostExposeData(); + Scribe_Values.Look(ref used, "used", false); + Scribe_Values.Look(ref callTick, "callTick", -1); + Scribe_Values.Look(ref calling, "calling", false); + } + + public override void CompTick() + { + base.CompTick(); + + if (calling && callTick >= 0 && Find.TickManager.TicksGame >= callTick) + { + ExecuteSkyfallerCall(); + } + } + + public void CallSkyfaller() + { + if (!CanCallSkyfaller) + { + // 显示相应的错误消息 + if (!HasRequiredFlyOver) + { + Messages.Message("WULA_NoRequiredFlyOver".Translate(RequiredFlyOverLabel), parent, MessageTypeDefOf.RejectInput); + } + else if (!CheckRoofConditions) + { + if (parent.Position.GetRoof(parent.Map)?.isThickRoof == true) + { + Messages.Message("WULA_ThickRoofBlocking".Translate(), parent, MessageTypeDefOf.RejectInput); + } + else + { + Messages.Message("WULA_RoofBlocking".Translate(), parent, MessageTypeDefOf.RejectInput); + } + } + return; + } + + Log.Message($"[SkyfallerCaller] Starting skyfaller call from {parent.Label} at {parent.Position}"); + + calling = true; + used = true; + callTick = Find.TickManager.TicksGame + Props.delayTicks; + + if (Props.delayTicks <= 0) + { + ExecuteSkyfallerCall(); + } + else + { + Messages.Message("WULA_SkyfallerIncoming".Translate(Props.delayTicks.ToStringTicksToPeriod()), parent, MessageTypeDefOf.ThreatBig); + } + } + + private void ExecuteSkyfallerCall() + { + Log.Message($"[SkyfallerCaller] Executing skyfaller call at {parent.Position}"); + + if (Props.skyfallerDef == null) + { + Log.Error("[SkyfallerCaller] Skyfaller def is null!"); + return; + } + + // 检查屋顶并处理 + HandleRoofDestruction(); + + // 创建Skyfaller + Skyfaller skyfaller = SkyfallerMaker.MakeSkyfaller(Props.skyfallerDef); + if (skyfaller == null) + { + Log.Error("[SkyfallerCaller] Failed to create skyfaller!"); + return; + } + + IntVec3 spawnPos = parent.Position; + Log.Message($"[SkyfallerCaller] Spawning skyfaller at {spawnPos}"); + + GenSpawn.Spawn(skyfaller, spawnPos, parent.Map); + + if (Props.destroyBuilding) + { + Log.Message($"[SkyfallerCaller] Destroying building {parent.Label}"); + parent.Destroy(DestroyMode.Vanish); + } + + calling = false; + callTick = -1; + } + + private void HandleRoofDestruction() + { + if (parent?.Map == null) return; + + IntVec3 targetPos = parent.Position; + RoofDef roof = targetPos.GetRoof(parent.Map); + + if (roof != null && !roof.isThickRoof && Props.allowThinRoof) + { + Log.Message($"[SkyfallerCaller] Destroying thin roof at {targetPos}"); + parent.Map.roofGrid.SetRoof(targetPos, null); + + // 生成屋顶破坏效果 + FleckMaker.ThrowDustPuffThick(targetPos.ToVector3Shifted(), parent.Map, 2f, new Color(1f, 1f, 1f, 2f)); + } + } + + public override IEnumerable CompGetGizmosExtra() + { + foreach (var gizmo in base.CompGetGizmosExtra()) + yield return gizmo; + + if (!CanCall) + yield break; + + Command_Action callCommand = new Command_Action + { + defaultLabel = "WULA_CallSkyfaller".Translate(), + defaultDesc = GetCallDescription(), + icon = ContentFinder.Get("Wula/UI/Commands/WULA_DropBuilding"), + action = CallSkyfaller, + disabledReason = GetDisabledReason() + }; + + yield return callCommand; + } + + private string GetCallDescription() + { + string desc = "WULA_CallSkyfallerDesc".Translate(); + + if (!HasRequiredFlyOver) + { + desc += $"\n{"WULA_RequiresFlyOver".Translate(RequiredFlyOverLabel)}"; + } + + // 添加 null 检查 + if (parent?.Map != null) + { + RoofDef roof = parent.Position.GetRoof(parent.Map); + if (roof != null) + { + if (roof.isThickRoof && !Props.allowThickRoof) + { + desc += $"\n{"WULA_ThickRoofBlockingDesc".Translate()}"; + } + else if (!roof.isThickRoof && !Props.allowThinRoof) + { + desc += $"\n{"WULA_RoofBlockingDesc".Translate()}"; + } + } + } + + return desc; + } + + private string GetDisabledReason() + { + if (!HasRequiredFlyOver) + { + return "WULA_NoRequiredFlyOver".Translate(RequiredFlyOverLabel); + } + + if (!CheckRoofConditions) + { + // 添加 null 检查 + if (parent?.Map != null) + { + RoofDef roof = parent.Position.GetRoof(parent.Map); + if (roof?.isThickRoof == true) + { + return "WULA_ThickRoofBlocking".Translate(); + } + else + { + return "WULA_RoofBlocking".Translate(); + } + } + } + + return null; + } + + public override string CompInspectStringExtra() + { + // 添加 null 检查,防止在小型化建筑上出现异常 + if (parent?.Map == null) + return base.CompInspectStringExtra(); + + if (calling) + { + int ticksLeft = callTick - Find.TickManager.TicksGame; + if (ticksLeft > 0) + { + return "WULA_SkyfallerArrivingIn".Translate(ticksLeft.ToStringTicksToPeriod()); + } + } + else if (!used) + { + string status = "WULA_ReadyToCallSkyfaller".Translate(); + + // 添加条件信息 + if (!HasRequiredFlyOver) + { + status += $"\n{"WULA_MissingFlyOver".Translate(RequiredFlyOverLabel)}"; + } + + // 添加 null 检查 + if (parent?.Map != null) + { + RoofDef roof = parent.Position.GetRoof(parent.Map); + if (roof != null) + { + if (roof.isThickRoof && !Props.allowThickRoof) + { + status += $"\n{"WULA_BlockedByThickRoof".Translate()}"; + } + else if (!roof.isThickRoof && !Props.allowThinRoof) + { + status += $"\n{"WULA_BlockedByRoof".Translate()}"; + } + } + } + + return status; + } + + return base.CompInspectStringExtra(); + } + } +} diff --git a/Source/WulaFallenEmpire/BuildingComp/WULA_StorageTurret/CompProperties_StorageTurret.cs b/Source/WulaFallenEmpire/BuildingComp/WULA_StorageTurret/CompProperties_StorageTurret.cs new file mode 100644 index 00000000..20fa5799 --- /dev/null +++ b/Source/WulaFallenEmpire/BuildingComp/WULA_StorageTurret/CompProperties_StorageTurret.cs @@ -0,0 +1,19 @@ +using System.Collections.Generic; +using Verse; + +namespace WulaFallenEmpire +{ + public class CompProperties_StorageTurret : CompProperties + { + public CompProperties_StorageTurret() + { + this.compClass = typeof(CompStorageTurret); + } + + public ThingDef turretDef; + public float angleOffset; + public bool autoAttack = true; + public int maxTurrets = 5; // 最大炮塔数量 + public float turretSpacing = 1f; // 炮塔间距 + } +} diff --git a/Source/WulaFallenEmpire/BuildingComp/WULA_StorageTurret/CompStorageTurret.cs b/Source/WulaFallenEmpire/BuildingComp/WULA_StorageTurret/CompStorageTurret.cs new file mode 100644 index 00000000..6280eba1 --- /dev/null +++ b/Source/WulaFallenEmpire/BuildingComp/WULA_StorageTurret/CompStorageTurret.cs @@ -0,0 +1,303 @@ +using System; +using System.Collections.Generic; +using UnityEngine; +using Verse; +using Verse.AI; +using RimWorld; + +namespace WulaFallenEmpire +{ + public class CompStorageTurret : ThingComp + { + public Thing Thing => this.parent; + + private CompProperties_StorageTurret Props => (CompProperties_StorageTurret)this.props; + + // 存储的炮塔列表 + private List turrets = new List(); + + // 获取当前机械族存储数量 + private int StoredMechanoidCount + { + get + { + var recycler = parent as Building_MechanoidRecycler; + if (recycler != null) + { + return recycler.StoredCount; + } + + return 0; + } + } + + public override void Initialize(CompProperties props) + { + base.Initialize(props); + UpdateTurrets(); + } + + public override void CompTick() + { + base.CompTick(); + + // 更新炮塔数量 + if (Find.TickManager.TicksGame % 60 == 0) + { + UpdateTurrets(); + } + + // 更新所有炮塔 + for (int i = 0; i < turrets.Count; i++) + { + if (i < StoredMechanoidCount) + { + turrets[i].TurretTick(); + } + } + } + + private void UpdateTurrets() + { + int currentCount = Mathf.Min(StoredMechanoidCount, Props.maxTurrets); + + // 添加缺少的炮塔 + while (turrets.Count < currentCount) + { + turrets.Add(new TurretInstance(this, turrets.Count)); + } + + // 移除多余的炮塔 + while (turrets.Count > currentCount) + { + turrets.RemoveAt(turrets.Count - 1); + } + } + + public override void PostDraw() + { + base.PostDraw(); + + // 绘制所有激活的炮塔 + for (int i = 0; i < turrets.Count; i++) + { + if (i < StoredMechanoidCount) + { + turrets[i].DrawTurret(); + } + } + } + + public override void PostExposeData() + { + base.PostExposeData(); + Scribe_Collections.Look(ref turrets, "turrets", LookMode.Deep); + + if (Scribe.mode == LoadSaveMode.PostLoadInit && turrets == null) + { + turrets = new List(); + } + } + + // 单个炮塔实例类,实现 IAttackTargetSearcher 接口 + public class TurretInstance : IExposable, IAttackTargetSearcher + { + private CompStorageTurret parent; + private int index; + + // 炮塔状态 + public Thing gun; + public int burstCooldownTicksLeft; + public int burstWarmupTicksLeft; + public LocalTargetInfo currentTarget = LocalTargetInfo.Invalid; + public float curRotation; + public Material turretMat; + + // IAttackTargetSearcher 接口实现 + public Thing Thing => parent.parent; + public Verb CurrentEffectiveVerb => AttackVerb; + public LocalTargetInfo LastAttackedTarget => LocalTargetInfo.Invalid; + public int LastAttackTargetTick => -1; + public Thing TargetCurrentlyAimingAt => currentTarget.Thing; + + private bool WarmingUp => burstWarmupTicksLeft > 0; + + public Verb AttackVerb + { + get + { + var compEq = gun?.TryGetComp(); + return compEq?.PrimaryVerb; + } + } + + private bool CanShoot + { + get + { + if (!parent.parent.Spawned || parent.parent.Destroyed) + return false; + + if (AttackVerb == null) + return false; + + if (TurretDestroyed) + return false; + + return true; + } + } + + public bool TurretDestroyed + { + get + { + var verbProps = AttackVerb?.verbProps; + if (verbProps == null) + return false; + + // 这里可以添加建筑炮塔的破坏检查逻辑 + return false; + } + } + + public TurretInstance() { } + + public TurretInstance(CompStorageTurret parent, int index) + { + this.parent = parent; + this.index = index; + MakeGun(); + } + + private void MakeGun() + { + gun = ThingMaker.MakeThing(parent.Props.turretDef, null); + UpdateGunVerbs(); + } + + private void UpdateGunVerbs() + { + var compEq = gun.TryGetComp(); + if (compEq == null) return; + + foreach (var verb in compEq.AllVerbs) + { + verb.caster = parent.parent; + verb.castCompleteCallback = () => + { + burstCooldownTicksLeft = AttackVerb.verbProps.defaultCooldownTime.SecondsToTicks(); + }; + } + } + + public void TurretTick() + { + if (!CanShoot) return; + + // 更新炮塔旋转 + if (currentTarget.IsValid) + { + Vector3 targetPos = currentTarget.Cell.ToVector3Shifted(); + Vector3 turretPos = GetTurretDrawPos(); + curRotation = (targetPos - turretPos).AngleFlat() + parent.Props.angleOffset; + } + + AttackVerb.VerbTick(); + + if (AttackVerb.state != VerbState.Bursting) + { + if (WarmingUp) + { + burstWarmupTicksLeft--; + if (burstWarmupTicksLeft == 0) + { + AttackVerb.TryStartCastOn(currentTarget, false, true, false, true); + } + } + else + { + if (burstCooldownTicksLeft > 0) + { + burstCooldownTicksLeft--; + } + + if (burstCooldownTicksLeft <= 0 && parent.parent.IsHashIntervalTick(10)) + { + // 修复:将 this 作为 IAttackTargetSearcher 传递 + currentTarget = (Thing)AttackTargetFinder.BestShootTargetFromCurrentPosition( + this, TargetScanFlags.NeedThreat | TargetScanFlags.NeedAutoTargetable, + null, 0f, 9999f); + + if (currentTarget.IsValid) + { + burstWarmupTicksLeft = 1; + } + else + { + ResetCurrentTarget(); + } + } + } + } + } + + private void ResetCurrentTarget() + { + currentTarget = LocalTargetInfo.Invalid; + burstWarmupTicksLeft = 0; + } + + public void DrawTurret() + { + Vector3 drawPos = GetTurretDrawPos(); + float angle = curRotation; + + if (turretMat == null) + { + turretMat = MaterialPool.MatFrom(parent.Props.turretDef.graphicData.texPath); + } + + Matrix4x4 matrix = default(Matrix4x4); + matrix.SetTRS(drawPos, Quaternion.AngleAxis(angle, Vector3.up), Vector3.one); + Graphics.DrawMesh(MeshPool.plane10, matrix, turretMat, 0); + } + + private Vector3 GetTurretDrawPos() + { + // 计算炮塔位置(围绕建筑排列) + float angle = 360f * index / parent.Props.maxTurrets; + float radius = parent.Props.turretSpacing; + + Vector3 offset = new Vector3( + Mathf.Cos(angle * Mathf.Deg2Rad) * radius, + 0, + Mathf.Sin(angle * Mathf.Deg2Rad) * radius + ); + + return parent.parent.DrawPos + offset + new Vector3(0, 0.5f, 0); + } + + public void ExposeData() + { + Scribe_Values.Look(ref burstCooldownTicksLeft, "burstCooldownTicksLeft", 0); + Scribe_Values.Look(ref burstWarmupTicksLeft, "burstWarmupTicksLeft", 0); + Scribe_TargetInfo.Look(ref currentTarget, "currentTarget"); + Scribe_Deep.Look(ref gun, "gun"); + Scribe_Values.Look(ref curRotation, "curRotation", 0f); + + if (Scribe.mode == LoadSaveMode.PostLoadInit) + { + if (gun == null) + { + MakeGun(); + } + else + { + UpdateGunVerbs(); + } + } + } + } + } +} diff --git a/Source/WulaFallenEmpire/Flyover/WULA_FlyOverType/CompProperties_FlyOverType.cs b/Source/WulaFallenEmpire/Flyover/WULA_FlyOverType/CompProperties_FlyOverType.cs new file mode 100644 index 00000000..01851a9b --- /dev/null +++ b/Source/WulaFallenEmpire/Flyover/WULA_FlyOverType/CompProperties_FlyOverType.cs @@ -0,0 +1,33 @@ +using Verse; + +namespace WulaFallenEmpire +{ + public class CompProperties_FlyOverType : CompProperties + { + public string flyOverType = "default"; // FlyOver 类型标识符 + public bool isRequiredForDrop = true; // 是否是需要用于空投的类型 + + public CompProperties_FlyOverType() + { + compClass = typeof(CompFlyOverType); + } + } + + public class CompFlyOverType : ThingComp + { + private CompProperties_FlyOverType Props => (CompProperties_FlyOverType)props; + + public string FlyOverType => Props.flyOverType; + public bool IsRequiredForDrop => Props.isRequiredForDrop; + + public override void PostExposeData() + { + base.PostExposeData(); + } + + public override string CompInspectStringExtra() + { + return $"FlyOver Type: {FlyOverType}"; + } + } +} diff --git a/Source/WulaFallenEmpire/Flyover/WULA_GroundStrafing/CompGroundStrafing.cs b/Source/WulaFallenEmpire/Flyover/WULA_GroundStrafing/CompGroundStrafing.cs index ddc3ea1f..c20bcc60 100644 --- a/Source/WulaFallenEmpire/Flyover/WULA_GroundStrafing/CompGroundStrafing.cs +++ b/Source/WulaFallenEmpire/Flyover/WULA_GroundStrafing/CompGroundStrafing.cs @@ -302,10 +302,10 @@ namespace WulaFallenEmpire private Thing GetLauncher() { FlyOver flyOver = parent as FlyOver; - if (flyOver != null && flyOver.caster != null) - { - return flyOver.caster; - } + //if (flyOver != null && flyOver.caster != null) + //{ + // return flyOver.caster; + //} return parent; } diff --git a/Source/WulaFallenEmpire/Flyover/WULA_SectorSurveillance/CompSectorSurveillance.cs b/Source/WulaFallenEmpire/Flyover/WULA_SectorSurveillance/CompSectorSurveillance.cs index ba55f8f6..76322c75 100644 --- a/Source/WulaFallenEmpire/Flyover/WULA_SectorSurveillance/CompSectorSurveillance.cs +++ b/Source/WulaFallenEmpire/Flyover/WULA_SectorSurveillance/CompSectorSurveillance.cs @@ -651,11 +651,11 @@ namespace WulaFallenEmpire private Thing GetLauncher() { FlyOver flyOver = parent as FlyOver; - if (flyOver != null && flyOver.caster != null) - { - Log.Message($"SectorSurveillance: Using caster as launcher: {flyOver.caster.Label}"); - return flyOver.caster; - } + //if (flyOver != null && flyOver.caster != null) + //{ + // Log.Message($"SectorSurveillance: Using caster as launcher: {flyOver.caster.Label}"); + // return flyOver.caster; + //} Log.Message($"SectorSurveillance: Using parent as launcher: {parent.Label}"); return parent; diff --git a/Source/WulaFallenEmpire/HediffComp/HediffCompProperties_NanoRepair.cs b/Source/WulaFallenEmpire/HediffComp/HediffCompProperties_NanoRepair.cs new file mode 100644 index 00000000..b16fc4b6 --- /dev/null +++ b/Source/WulaFallenEmpire/HediffComp/HediffCompProperties_NanoRepair.cs @@ -0,0 +1,803 @@ +using RimWorld; +using Verse; +using System.Collections.Generic; +using UnityEngine; + +namespace WulaFallenEmpire +{ + public class HediffCompProperties_NanoRepair : HediffCompProperties + { + public float activeSeverity = 0.5f; // 有能量且损伤时的严重性 + public float inactiveSeverity = 1.5f; // 其他情况的严重性 + public float minEnergyThreshold = 0.1f; // 最低能量阈值 + public float repairCostPerHP = 0.1f; // 每点生命值修复的能量消耗 + public int repairCooldownAfterDamage = 300; // 受到伤害后的修复冷却时间 + public float repairTolerance = 0f; // 修复容忍度,低于此值认为已完全修复 + + public HediffCompProperties_NanoRepair() + { + compClass = typeof(HediffComp_NanoRepair); + } + } + + public class HediffComp_NanoRepair : HediffComp + { + public HediffCompProperties_NanoRepair Props => (HediffCompProperties_NanoRepair)props; + + private int lastDamageTick = -9999; + private const int CheckInterval = 60; + private int debugCounter = 0; + private bool repairSystemEnabled = true; // 默认开启修复系统 + + // 获取可用的能量源 + private Need GetEnergyNeed() + { + if (Pawn?.needs == null) return null; + + // 优先尝试 WULA_Energy + var wulaEnergy = Pawn.needs.TryGetNeed(DefDatabase.GetNamedSilentFail("WULA_Energy")); + if (wulaEnergy != null) + { + if (debugCounter % 10 == 0) + Log.Message($"[NanoRepair] 使用 WULA_Energy 作为能量源"); + return wulaEnergy; + } + + // 回退到 MechEnergy + var mechEnergy = Pawn.needs?.TryGetNeed(); + if (mechEnergy != null) + { + if (debugCounter % 10 == 0) + Log.Message($"[NanoRepair] 使用 MechEnergy 作为能量源"); + return mechEnergy; + } + + if (debugCounter % 10 == 0) + Log.Message($"[NanoRepair] 没有找到可用的能量源"); + return null; + } + + // 获取能量源名称(用于显示) + private string GetEnergyNeedName() + { + var energyNeed = GetEnergyNeed(); + if (energyNeed == null) return "Unknown"; + + if (energyNeed.def.defName == "WULA_Energy") + return "WULA Energy"; + else if (energyNeed is Need_MechEnergy) + return "Mech Energy"; + else + return energyNeed.def.defName; + } + + public override void CompPostTick(ref float severityAdjustment) + { + base.CompPostTick(ref severityAdjustment); + + // 如果修复系统关闭,跳过所有修复逻辑 + if (!repairSystemEnabled) + { + // 如果系统关闭,设置为不活跃状态 + if (parent.Severity != Props.inactiveSeverity) + { + parent.Severity = Props.inactiveSeverity; + if (debugCounter % 10 == 0) + Log.Message($"[NanoRepair] 修复系统已关闭,设置为不活跃状态"); + } + return; + } + + // 每60 ticks检查一次状态 + if (Find.TickManager.TicksGame % CheckInterval == 0) + { + debugCounter++; + if (debugCounter % 10 == 0) + { + Log.Message($"[NanoRepair] Tick {Find.TickManager.TicksGame} - 开始检查修复状态"); + } + UpdateSeverityAndRepair(); + } + } + + private void UpdateSeverityAndRepair() + { + if (Pawn == null || Pawn.Dead) + { + if (debugCounter % 10 == 0) + Log.Message($"[NanoRepair] Pawn为null或已死亡"); + return; + } + + bool shouldBeActive = ShouldBeActive(); + float targetSeverity = shouldBeActive ? Props.activeSeverity : Props.inactiveSeverity; + + // 更新严重性 + if (parent.Severity != targetSeverity) + { + parent.Severity = targetSeverity; + if (debugCounter % 10 == 0) + Log.Message($"[NanoRepair] 更新严重性: {parent.Severity} -> {targetSeverity}"); + } + + // 如果处于活跃状态,执行修复 + if (shouldBeActive) + { + if (debugCounter % 10 == 0) + Log.Message($"[NanoRepair] 系统活跃,尝试修复损伤"); + TryRepairDamage(); + } + else + { + if (debugCounter % 10 == 0) + Log.Message($"[NanoRepair] 系统不活跃,跳过修复"); + } + } + + private bool ShouldBeActive() + { + // 如果修复系统关闭,直接返回不活跃 + if (!repairSystemEnabled) + { + if (debugCounter % 10 == 0) + Log.Message($"[NanoRepair] 修复系统已关闭,系统不活跃"); + return false; + } + + // 检查能量 + var energyNeed = GetEnergyNeed(); + if (energyNeed == null) + { + if (debugCounter % 10 == 0) + Log.Message($"[NanoRepair] 没有能量需求,系统不活跃"); + return false; + } + + if (energyNeed.CurLevelPercentage < Props.minEnergyThreshold) + { + if (debugCounter % 10 == 0) + Log.Message($"[NanoRepair] 能量不足: {energyNeed.CurLevelPercentage:P0} < {Props.minEnergyThreshold:P0},系统不活跃"); + return false; + } + + // 检查是否在冷却期内 + int cooldownRemaining = Props.repairCooldownAfterDamage - (Find.TickManager.TicksGame - lastDamageTick); + if (cooldownRemaining > 0) + { + if (debugCounter % 10 == 0) + Log.Message($"[NanoRepair] 冷却中: {cooldownRemaining} ticks剩余,系统不活跃"); + return false; + } + + // 检查是否有需要修复的损伤 + if (!HasDamageToRepair()) + { + if (debugCounter % 10 == 0) + Log.Message($"[NanoRepair] 没有需要修复的损伤,系统不活跃"); + return false; + } + + if (debugCounter % 10 == 0) + Log.Message($"[NanoRepair] 所有条件满足,系统活跃"); + return true; + } + + private bool HasDamageToRepair() + { + if (Pawn.health == null || Pawn.health.hediffSet == null) + { + if (debugCounter % 10 == 0) + Log.Message($"[NanoRepair] Health或HediffSet为null"); + return false; + } + + // 检查是否有缺失部件 + var missingParts = Pawn.health.hediffSet.GetMissingPartsCommonAncestors(); + if (missingParts.Count > 0) + { + if (debugCounter % 10 == 0) + Log.Message($"[NanoRepair] 检测到缺失部件: {missingParts.Count}个"); + return true; + } + + // 使用 GetPartHealth 检查是否有损伤 + if (HasDamagedParts()) + { + if (debugCounter % 10 == 0) + Log.Message($"[NanoRepair] 检测到损伤部位"); + return true; + } + + // 检查是否有需要治疗的疾病 + if (Pawn.health.hediffSet.HasTendableNonInjuryNonMissingPartHediff()) + { + if (debugCounter % 10 == 0) + Log.Message($"[NanoRepair] 检测到可治疗疾病"); + return true; + } + + if (debugCounter % 10 == 0) + Log.Message($"[NanoRepair] 没有检测到任何需要修复的损伤"); + return false; + } + + // 使用 GetPartHealth 检测损伤 + private bool HasDamagedParts() + { + var bodyParts = Pawn.RaceProps.body.AllParts; + int damagedCount = 0; + + foreach (var part in bodyParts) + { + // 如果部位不是缺失的,但健康值小于最大健康值,说明有损伤 + if (!Pawn.health.hediffSet.PartIsMissing(part)) + { + float maxHealth = part.def.GetMaxHealth(Pawn); + float currentHealth = Pawn.health.hediffSet.GetPartHealth(part); + + // 使用修复容忍度,只有当损伤大于容忍度时才认为需要修复 + if (currentHealth < maxHealth - Props.repairTolerance) + { + damagedCount++; + if (debugCounter % 10 == 0 && damagedCount == 1) + Log.Message($"[NanoRepair] 部位 {part.def.defName} 有损伤: {currentHealth}/{maxHealth} (容忍度: {Props.repairTolerance})"); + } + } + } + + if (debugCounter % 10 == 0 && damagedCount > 0) + Log.Message($"[NanoRepair] 总共检测到 {damagedCount} 个损伤部位"); + + return damagedCount > 0; + } + + // 获取所有需要修复的部位 + private List GetDamagedParts() + { + var damagedParts = new List(); + var bodyParts = Pawn.RaceProps.body.AllParts; + + foreach (var part in bodyParts) + { + if (!Pawn.health.hediffSet.PartIsMissing(part)) + { + float maxHealth = part.def.GetMaxHealth(Pawn); + float currentHealth = Pawn.health.hediffSet.GetPartHealth(part); + + // 使用修复容忍度 + if (currentHealth < maxHealth - Props.repairTolerance) + { + damagedParts.Add(part); + if (debugCounter % 10 == 0 && damagedParts.Count <= 3) + Log.Message($"[NanoRepair] 损伤部位: {part.def.defName} ({currentHealth}/{maxHealth})"); + } + } + } + + if (debugCounter % 10 == 0 && damagedParts.Count > 3) + Log.Message($"[NanoRepair] ... 还有 {damagedParts.Count - 3} 个损伤部位"); + + return damagedParts; + } + + private void TryRepairDamage() + { + var energyNeed = GetEnergyNeed(); + if (energyNeed == null) + { + if (debugCounter % 10 == 0) + Log.Message($"[NanoRepair] 能量需求为null,无法修复"); + return; + } + + if (debugCounter % 10 == 0) + Log.Message($"[NanoRepair] 当前能量({GetEnergyNeedName()}): {energyNeed.CurLevel:F1}/{energyNeed.MaxLevel:F1} ({energyNeed.CurLevelPercentage:P0})"); + + // 优先修复缺失部件 + if (TryRepairMissingParts(energyNeed)) + { + if (debugCounter % 10 == 0) + Log.Message($"[NanoRepair] 已修复缺失部件"); + return; + } + + // 然后修复损伤 + if (TryRepairDamagedParts(energyNeed)) + { + if (debugCounter % 10 == 0) + Log.Message($"[NanoRepair] 已修复损伤部位"); + return; + } + + // 最后修复疾病 + if (TryRepairDiseases(energyNeed)) + { + if (debugCounter % 10 == 0) + Log.Message($"[NanoRepair] 已修复疾病"); + return; + } + + if (debugCounter % 10 == 0) + Log.Message($"[NanoRepair] 没有执行任何修复"); + } + + private bool TryRepairMissingParts(Need energyNeed) + { + var missingParts = Pawn.health.hediffSet.GetMissingPartsCommonAncestors(); + if (missingParts == null || missingParts.Count == 0) + { + if (debugCounter % 10 == 0) + Log.Message($"[NanoRepair] 没有缺失部件需要修复"); + return false; + } + + if (debugCounter % 10 == 0) + Log.Message($"[NanoRepair] 检查修复缺失部件,共有 {missingParts.Count} 个"); + + // 选择最小的缺失部件进行修复(成本较低) + Hediff_MissingPart partToRepair = null; + float minHealth = float.MaxValue; + + foreach (var missingPart in missingParts) + { + float partHealth = missingPart.Part.def.GetMaxHealth(Pawn); + if (partHealth < minHealth) + { + minHealth = partHealth; + partToRepair = missingPart; + } + } + + if (partToRepair != null) + { + // 计算修复成本 - 使用正常损伤的修复成本 + float repairCost = minHealth * Props.repairCostPerHP; + + // 根据机械族的能量消耗属性调整成本 + var mechEnergyLoss = Pawn.GetStatValue(StatDefOf.MechEnergyLossPerHP); + if (mechEnergyLoss > 0) + { + repairCost *= mechEnergyLoss; + } + + if (debugCounter % 10 == 0) + Log.Message($"[NanoRepair] 尝试修复缺失部件 {partToRepair.Part.def.defName}, 成本: {repairCost:F2}, 当前能量: {energyNeed.CurLevel:F2}"); + + if (energyNeed.CurLevel >= repairCost) + { + if (ConvertMissingPartToInjury(partToRepair, repairCost)) + { + energyNeed.CurLevel -= repairCost; + if (debugCounter % 10 == 0) + Log.Message($"[NanoRepair] 成功将缺失部件 {partToRepair.Part.def.defName} 转换为损伤, 消耗能量: {repairCost:F2}"); + return true; + } + } + else + { + if (debugCounter % 10 == 0) + Log.Message($"[NanoRepair] 能量不足修复缺失部件: {energyNeed.CurLevel:F2} < {repairCost:F2}"); + } + } + return false; + } + + private bool TryRepairDamagedParts(Need energyNeed) + { + var damagedParts = GetDamagedParts(); + if (damagedParts.Count == 0) + { + if (debugCounter % 10 == 0) + Log.Message($"[NanoRepair] 没有损伤部位需要修复"); + return false; + } + + if (debugCounter % 10 == 0) + Log.Message($"[NanoRepair] 检查修复损伤部位,共有 {damagedParts.Count} 个"); + + // 选择健康值最低的部位进行修复 + BodyPartRecord partToRepair = null; + float minHealthRatio = float.MaxValue; + + foreach (var part in damagedParts) + { + float maxHealth = part.def.GetMaxHealth(Pawn); + float currentHealth = Pawn.health.hediffSet.GetPartHealth(part); + float healthRatio = currentHealth / maxHealth; + + if (healthRatio < minHealthRatio) + { + minHealthRatio = healthRatio; + partToRepair = part; + } + } + + if (partToRepair != null) + { + float maxHealth = partToRepair.def.GetMaxHealth(Pawn); + float currentHealth = Pawn.health.hediffSet.GetPartHealth(partToRepair); + float healthToRepair = maxHealth - currentHealth; + + // 计算修复成本 + float repairCost = healthToRepair * Props.repairCostPerHP; + + // 根据机械族的能量消耗属性调整成本 + var mechEnergyLoss = Pawn.GetStatValue(StatDefOf.MechEnergyLossPerHP); + if (mechEnergyLoss > 0) + { + repairCost *= mechEnergyLoss; + } + + if (debugCounter % 10 == 0) + Log.Message($"[NanoRepair] 尝试修复部位 {partToRepair.def.defName}, 健康: {currentHealth:F1}/{maxHealth:F1}, 修复量: {healthToRepair:F1}, 成本: {repairCost:F2}"); + + if (energyNeed.CurLevel >= repairCost) + { + if (RepairDamagedPart(partToRepair, repairCost)) + { + energyNeed.CurLevel -= repairCost; + if (debugCounter % 10 == 0) + Log.Message($"[NanoRepair] 成功修复部位 {partToRepair.def.defName}, 消耗能量: {repairCost:F2}"); + return true; + } + } + else + { + if (debugCounter % 10 == 0) + Log.Message($"[NanoRepair] 能量不足修复损伤: {energyNeed.CurLevel:F2} < {repairCost:F2}"); + } + } + return false; + } + + private bool TryRepairDiseases(Need energyNeed) + { + var diseases = Pawn.health.hediffSet.GetTendableNonInjuryNonMissingPartHediffs(); + if (diseases == null) + { + if (debugCounter % 10 == 0) + Log.Message($"[NanoRepair] 没有可治疗疾病"); + return false; + } + + int diseaseCount = 0; + foreach (var disease in diseases) + { + if (disease.TendableNow()) + diseaseCount++; + } + + if (diseaseCount == 0) + { + if (debugCounter % 10 == 0) + Log.Message($"[NanoRepair] 没有可治疗的疾病"); + return false; + } + + if (debugCounter % 10 == 0) + Log.Message($"[NanoRepair] 检查修复疾病,共有 {diseaseCount} 个"); + + foreach (var disease in diseases) + { + if (disease.TendableNow()) + { + float repairCost = CalculateRepairCost(disease); + + if (debugCounter % 10 == 0) + Log.Message($"[NanoRepair] 尝试修复疾病 {disease.def.defName}, 严重性: {disease.Severity:F2}, 成本: {repairCost:F2}, 当前能量: {energyNeed.CurLevel:F2}"); + + if (energyNeed.CurLevel >= repairCost) + { + if (RepairDisease(disease, repairCost)) + { + energyNeed.CurLevel -= repairCost; + if (debugCounter % 10 == 0) + Log.Message($"[NanoRepair] 成功修复疾病 {disease.def.defName}, 消耗能量: {repairCost:F2}"); + return true; + } + } + else + { + if (debugCounter % 10 == 0) + Log.Message($"[NanoRepair] 能量不足修复疾病: {energyNeed.CurLevel:F2} < {repairCost:F2}"); + } + } + } + return false; + } + + private float CalculateRepairCost(Hediff hediff) + { + float baseCost = Props.repairCostPerHP; + + // 根据机械族的能量消耗属性调整成本 + var mechEnergyLoss = Pawn.GetStatValue(StatDefOf.MechEnergyLossPerHP); + if (mechEnergyLoss > 0) + { + baseCost *= mechEnergyLoss; + } + + float severityMultiplier = 1.0f; + + if (hediff is Hediff_Injury injury) + { + severityMultiplier = injury.Severity; + } + else if (hediff is Hediff_MissingPart) + { + // 缺失部件修复成本使用正常计算 + severityMultiplier = 1.0f; + } + else + { + severityMultiplier = hediff.Severity * 1.5f; + } + + float finalCost = baseCost * severityMultiplier; + + if (debugCounter % 10 == 0) + Log.Message($"[NanoRepair] 计算修复成本: 基础={Props.repairCostPerHP}, 机械族能耗系数={mechEnergyLoss}, 严重性系数={severityMultiplier}, 最终成本={finalCost:F2}"); + + return finalCost; + } + + private bool RepairDamagedPart(BodyPartRecord part, float repairCost) + { + try + { + float maxHealth = part.def.GetMaxHealth(Pawn); + float currentHealth = Pawn.health.hediffSet.GetPartHealth(part); + float healthToRepair = Mathf.Min(maxHealth - currentHealth, repairCost / Props.repairCostPerHP); + + if (debugCounter % 10 == 0) + Log.Message($"[NanoRepair] 开始修复部位 {part.def.defName}, 计划修复量: {healthToRepair:F1}"); + + // 直接修复部位的健康值,而不是查找特定的hediff + // 找到该部位的所有hediff并尝试修复 + var hediffsOnPart = new List(); + foreach (var hediff in Pawn.health.hediffSet.hediffs) + { + if (hediff.Part == part) + { + hediffsOnPart.Add(hediff); + if (debugCounter % 10 == 0) + Log.Message($"[NanoRepair] 部位 {part.def.defName} 上的hediff: {hediff.def.defName}, 类型: {hediff.GetType()}, 严重性: {hediff.Severity}"); + } + } + + if (hediffsOnPart.Count == 0) + { + if (debugCounter % 10 == 0) + Log.Message($"[NanoRepair] 部位 {part.def.defName} 上没有找到任何hediff"); + return false; + } + + if (debugCounter % 10 == 0) + Log.Message($"[NanoRepair] 在部位 {part.def.defName} 上找到 {hediffsOnPart.Count} 个hediff"); + + // 按严重性排序,先修复最严重的hediff + hediffsOnPart.Sort((a, b) => b.Severity.CompareTo(a.Severity)); + + float remainingRepair = healthToRepair; + bool anyRepairDone = false; + + foreach (var hediff in hediffsOnPart) + { + if (remainingRepair <= 0) + break; + + // 检查hediff是否可修复 + if (!CanRepairHediff(hediff)) + { + if (debugCounter % 10 == 0) + Log.Message($"[NanoRepair] 跳过不可修复的hediff: {hediff.def.defName}"); + continue; + } + + float healAmount = Mathf.Min(hediff.Severity, remainingRepair); + hediff.Severity -= healAmount; + remainingRepair -= healAmount; + anyRepairDone = true; + + if (debugCounter % 10 == 0) + Log.Message($"[NanoRepair] 修复hediff {hediff.def.defName}, 修复量: {healAmount:F1}, 剩余严重性: {hediff.Severity:F1}"); + + // 使用修复容忍度,只有当严重性大于容忍度时才移除hediff + if (hediff.Severity <= Props.repairTolerance) + { + Pawn.health.RemoveHediff(hediff); + if (debugCounter % 10 == 0) + Log.Message($"[NanoRepair] hediff {hediff.def.defName} 已完全修复并移除"); + } + } + + if (debugCounter % 10 == 0) + Log.Message($"[NanoRepair] 部位 {part.def.defName} 修复完成,总修复量: {healthToRepair - remainingRepair:F1}"); + + return anyRepairDone; + } + catch (System.Exception ex) + { + Log.Error($"[NanoRepair] 修复部位 {part.def.defName} 时出错: {ex}"); + return false; + } + } + + // 检查hediff是否可修复 + private bool CanRepairHediff(Hediff hediff) + { + // 如果是机械族特有的hediff,总是可以修复 + if (IsMechSpecificHediff(hediff)) + return true; + + // 如果是可治疗的hediff,可以修复 + if (hediff.TendableNow()) + return true; + + // 如果是损伤类型的hediff,可以修复 + if (hediff is Hediff_Injury) + return true; + + // 其他情况不可修复 + return false; + } + + // 将缺失部件转换为指定的hediff + private bool ConvertMissingPartToInjury(Hediff_MissingPart missingPart, float repairCost) + { + try + { + if (debugCounter % 10 == 0) + Log.Message($"[NanoRepair] 开始将缺失部件 {missingPart.Part.def.defName} 转换为损伤"); + + float partMaxHealth = missingPart.Part.def.GetMaxHealth(Pawn); + + // 关键修复:确保转换后的损伤不会导致部位再次缺失 + // 我们设置损伤严重性为最大健康值-1,这样部位健康值至少为1 + float injurySeverity = partMaxHealth - 1; + + // 如果最大健康值为1,则设置为0.5,确保部位健康值大于0 + if (partMaxHealth <= 1) + { + injurySeverity = 0.5f; + } + + // 移除缺失部件hediff + Pawn.health.RemoveHediff(missingPart); + + // 添加指定的hediff (Crush) + HediffDef injuryDef = DefDatabase.GetNamedSilentFail("Crush"); + if (injuryDef == null) + { + Log.Error($"[NanoRepair] 找不到指定的hediff定义: Crush"); + return false; + } + + // 创建损伤 + Hediff injury = HediffMaker.MakeHediff(injuryDef, Pawn, missingPart.Part); + injury.Severity = injurySeverity; + + Pawn.health.AddHediff(injury); + + if (debugCounter % 10 == 0) + Log.Message($"[NanoRepair] 成功将缺失部件 {missingPart.Part.def.defName} 转换为 {injuryDef.defName} 损伤, 严重性: {injurySeverity} (最大健康值: {partMaxHealth})"); + + return true; + } + catch (System.Exception ex) + { + Log.Error($"[NanoRepair] 转换缺失部件 {missingPart.Part.def.defName} 时出错: {ex}"); + return false; + } + } + + // 检查是否是机械族特有的hediff(可能不可治疗但需要修复) + private bool IsMechSpecificHediff(Hediff hediff) + { + // 机械族的损伤可能不是标准的Hediff_Injury + // 这里可以根据需要添加更多机械族特有的hediff判断 + return hediff.def.defName.Contains("Mech") || + hediff.def.defName.Contains("Mechanical") || + hediff.def.defName.Contains("Gunshot"); // 包括枪伤 + } + + private bool RepairDisease(Hediff disease, float repairCost) + { + try + { + // 修复疾病 + float healAmount = Mathf.Min(disease.Severity, repairCost / (Props.repairCostPerHP * 1.5f)); + disease.Severity -= healAmount; + + if (debugCounter % 10 == 0) + Log.Message($"[NanoRepair] 修复疾病 {disease.def.defName}, 修复量: {healAmount:F2}, 剩余严重性: {disease.Severity:F2}"); + + // 使用修复容忍度 + if (disease.Severity <= Props.repairTolerance) + { + Pawn.health.RemoveHediff(disease); + if (debugCounter % 10 == 0) + Log.Message($"[NanoRepair] 疾病 {disease.def.defName} 已完全修复并移除"); + } + return true; + } + catch (System.Exception ex) + { + Log.Error($"[NanoRepair] 修复疾病 {disease.def.defName} 时出错: {ex}"); + return false; + } + } + + public override void Notify_PawnPostApplyDamage(DamageInfo dinfo, float totalDamageDealt) + { + base.Notify_PawnPostApplyDamage(dinfo, totalDamageDealt); + + // 记录最后一次受到伤害的时间 + lastDamageTick = Find.TickManager.TicksGame; + Log.Message($"[NanoRepair] 受到伤害,开始修复冷却: {lastDamageTick}"); + } + + // 添加Gizmo(小工具)用于切换修复系统 + public override IEnumerable CompGetGizmos() + { + // 只有玩家派系的机械族才显示Gizmo + if (Pawn.Faction == Faction.OfPlayer) + { + Command_Toggle toggleCommand = new Command_Toggle + { + defaultLabel = repairSystemEnabled ? "WULA_NanoRepair_Disable".Translate() : "WULA_NanoRepair_Enable".Translate(), + defaultDesc = repairSystemEnabled ? "WULA_NanoRepair_DisableDesc".Translate() : "WULA_NanoRepair_EnableDesc".Translate(), + icon = ContentFinder.Get("Wula/UI/Commands/WULA_NanoRepairHediff_Switch"), + isActive = () => repairSystemEnabled, + toggleAction = () => { + repairSystemEnabled = !repairSystemEnabled; + Messages.Message( + repairSystemEnabled ? + "WULA_NanoRepair_EnabledMsg".Translate(Pawn.LabelShort) : + "WULA_NanoRepair_DisabledMsg".Translate(Pawn.LabelShort), + MessageTypeDefOf.SilentInput + ); + Log.Message($"[NanoRepair] 修复系统已{(repairSystemEnabled ? "启用" : "禁用")}"); + }, + hotKey = KeyBindingDefOf.Misc1 + }; + + yield return toggleCommand; + } + } + + public override string CompTipStringExtra + { + get + { + string status = repairSystemEnabled ? + (ShouldBeActive() ? + "WULA_NanoRepair_Active".Translate() : + "WULA_NanoRepair_Inactive".Translate()) : + "WULA_NanoRepair_Disabled".Translate(); + + var energyNeed = GetEnergyNeed(); + + string damageInfo = HasDamageToRepair() ? + "WULA_DamageDetected".Translate() : + "WULA_NoDamage".Translate(); + + string cooldownInfo = ""; + int cooldownRemaining = Props.repairCooldownAfterDamage - (Find.TickManager.TicksGame - lastDamageTick); + if (cooldownRemaining > 0) + { + cooldownInfo = "\n" + "WULA_RepairCooldown".Translate((cooldownRemaining / 60f).ToString("F1")); + } + + return status + "\n" + damageInfo + cooldownInfo; + } + } + + public override void CompExposeData() + { + base.CompExposeData(); + Scribe_Values.Look(ref lastDamageTick, "lastDamageTick", -9999); + Scribe_Values.Look(ref repairSystemEnabled, "repairSystemEnabled", true); + } + } +} diff --git a/Source/WulaFallenEmpire/Pawn/WULA_AutonomousMech/CompAutonomousMech.cs b/Source/WulaFallenEmpire/Pawn/WULA_AutonomousMech/CompAutonomousMech.cs index d02b8108..f67426f1 100644 --- a/Source/WulaFallenEmpire/Pawn/WULA_AutonomousMech/CompAutonomousMech.cs +++ b/Source/WulaFallenEmpire/Pawn/WULA_AutonomousMech/CompAutonomousMech.cs @@ -38,7 +38,6 @@ namespace WulaFallenEmpire Shutdown // 关机模式:立即休眠 } - public class CompProperties_AutonomousMech : CompProperties { public bool enableAutonomousDrafting = true; @@ -70,7 +69,7 @@ namespace WulaFallenEmpire { get { - if (MechPawn == null || MechPawn.Dead || MechPawn.Downed) + if (MechPawn == null || MechPawn.Dead ) return false; if (!Props.enableAutonomousDrafting) @@ -79,13 +78,6 @@ namespace WulaFallenEmpire if (MechPawn.GetOverseer() != null) return false; - if (Props.requirePowerForAutonomy) - { - // 在临界能量下不允许自主模式 - if (GetEnergyLevel() < Props.criticalEnergyThreshold) - return false; - } - return true; } } @@ -118,6 +110,33 @@ namespace WulaFallenEmpire } } + // 在 CompAutonomousMech 类中添加这个新属性 + public bool CanFightAutonomously + { + get + { + if (MechPawn == null || MechPawn.Dead || MechPawn.Downed) + return false; + + if (!Props.enableAutonomousDrafting) + return false; + + if (MechPawn.GetOverseer() != null) + return false; + + if (!MechPawn.drafter?.Drafted == true) + return false; + + if (Props.requirePowerForAutonomy) + { + if (GetEnergyLevel() < Props.criticalEnergyThreshold) + return false; + } + + return true; + } + } + public AutonomousWorkMode CurrentWorkMode => currentWorkMode; // 新增:能量状态检查方法 @@ -131,7 +150,6 @@ namespace WulaFallenEmpire public bool IsCriticalEnergy => GetEnergyLevel() < Props.criticalEnergyThreshold; public bool IsFullyCharged => GetEnergyLevel() >= Props.rechargeCompleteThreshold; - // ... 现有代码 ... public override void PostSpawnSetup(bool respawningAfterLoad) { base.PostSpawnSetup(respawningAfterLoad); @@ -139,6 +157,7 @@ namespace WulaFallenEmpire // 确保使用独立战斗系统 InitializeAutonomousCombat(); } + private void InitializeAutonomousCombat() { // 确保有 draftController @@ -152,48 +171,8 @@ namespace WulaFallenEmpire { MechPawn.drafter.FireAtWill = true; } + } - // 确保工作设置不会干扰战斗 - EnsureCombatWorkSettings(); - } - private void EnsureCombatWorkSettings() - { - if (MechPawn.workSettings == null) - return; - // 设置自主战斗工作类型(如果存在) - WorkTypeDef autonomousCombat = DefDatabase.GetNamedSilentFail("WULA_AutonomousCombat"); - if (autonomousCombat != null) - { - MechPawn.workSettings.SetPriority(autonomousCombat, 1); - } - } - public override void CompTick() - { - base.CompTick(); - - // 定期检查战斗状态 - if (Find.TickManager.TicksGame % 60 == 0) - { - CheckCombatStatus(); - } - } - private void CheckCombatStatus() - { - if (MechPawn.drafter?.Drafted == true && MechPawn.CurJob == null) - { - // 如果被征召但没有工作,强制进入自主战斗状态 - ForceAutonomousCombat(); - } - } - private void ForceAutonomousCombat() - { - JobDef autonomousCombatJob = DefDatabase.GetNamedSilentFail("WULA_AutonomousWaitCombat"); - if (autonomousCombatJob != null) - { - Job job = JobMaker.MakeJob(autonomousCombatJob); - MechPawn.jobs.StartJob(job, JobCondition.InterruptForced); - } - } public override void CompTick() { base.CompTick(); @@ -211,7 +190,6 @@ namespace WulaFallenEmpire { if (!CanWorkAutonomously) return; - bool isLowEnergyNow = IsLowEnergy; // 如果能量状态发生变化 @@ -374,4 +352,4 @@ namespace WulaFallenEmpire Scribe_Values.Look(ref wasLowEnergy, "wasLowEnergy", false); } } -} +} \ No newline at end of file diff --git a/Source/WulaFallenEmpire/Pawn/WULA_AutonomousMech/JobDriver_AutonomousWaitCombat.cs b/Source/WulaFallenEmpire/Pawn/WULA_AutonomousMech/JobDriver_AutonomousWaitCombat.cs deleted file mode 100644 index 1cd48ca1..00000000 --- a/Source/WulaFallenEmpire/Pawn/WULA_AutonomousMech/JobDriver_AutonomousWaitCombat.cs +++ /dev/null @@ -1,234 +0,0 @@ -// JobDriver_AutonomousWaitCombat.cs -using System; -using System.Collections.Generic; -using RimWorld; -using Verse; -using Verse.AI; - -namespace WulaFallenEmpire -{ - public class JobDriver_AutonomousWaitCombat : JobDriver - { - private const int TargetSearchInterval = 4; - private bool collideWithPawns; - - private JobExtension_AutonomousCombat CombatExtension => - job.def.GetModExtension(); - - public override bool TryMakePreToilReservations(bool errorOnFailed) - { - return true; - } - - protected override IEnumerable MakeNewToils() - { - Toil waitToil = new Toil(); - waitToil.initAction = delegate - { - if (pawn.Spawned) - { - pawn.Map.pawnDestinationReservationManager.Reserve(pawn, job, pawn.Position); - pawn.pather?.StopDead(); - } - - // 初始化战斗设置 - InitializeCombatSettings(); - - // 立即检查攻击目标 - CheckForAutoAttack(); - }; - - waitToil.tickAction = delegate - { - // 定期检查攻击目标 - if (Find.TickManager.TicksGame % TargetSearchInterval == 0) - { - CheckForAutoAttack(); - } - - // 处理朝向 - HandleFacing(); - }; - - waitToil.defaultCompleteMode = ToilCompleteMode.Never; - yield return waitToil; - } - - private void InitializeCombatSettings() - { - var comp = pawn.GetComp(); - if (comp?.CanWorkAutonomously == true) - { - // 确保征召设置正确 - if (pawn.drafter != null) - { - pawn.drafter.FireAtWill = CombatExtension?.forceFireAtWill ?? true; - } - } - } - - private void HandleFacing() - { - // 如果有指定朝向,就面向该方向 - if (job.overrideFacing != Rot4.Invalid) - { - pawn.rotationTracker.FaceTarget(pawn.Position + job.overrideFacing.FacingCell); - return; - } - - // 如果有职责焦点,就面向焦点 - if (pawn.mindState?.duty?.focus != null) - { - pawn.rotationTracker.FaceTarget(pawn.mindState.duty.focus); - return; - } - - // 自动寻找敌人并面向它 - Thing enemyTarget = FindNearestEnemy(); - if (enemyTarget != null) - { - pawn.rotationTracker.FaceTarget(enemyTarget); - } - } - - private void CheckForAutoAttack() - { - if (!CanAutoAttack()) - return; - - // 先检查近战攻击 - if (CheckMeleeAttack()) - return; - - // 再检查远程攻击 - CheckRangedAttack(); - } - - private bool CanAutoAttack() - { - // 基础状态检查 - if (pawn.Downed || pawn.stances.FullBodyBusy || pawn.IsCarryingPawn()) - return false; - - var comp = pawn.GetComp(); - if (comp?.CanWorkAutonomously != true) - return false; - - // 检查扩展设置 - if (CombatExtension?.autoAttackEnabled != true) - return false; - - // 忽略工作标签检查,因为这是独立系统 - if (!CombatExtension.ignoreWorkTags) - { - if (pawn.WorkTagIsDisabled(WorkTags.Violent)) - return false; - } - - return true; - } - - private bool CheckMeleeAttack() - { - if (!pawn.kindDef.canMeleeAttack) - return false; - - // 检查相邻格子的敌人 - for (int i = 0; i < 9; i++) - { - IntVec3 cell = pawn.Position + GenAdj.AdjacentCellsAndInside[i]; - if (!cell.InBounds(pawn.Map)) - continue; - - foreach (Thing thing in cell.GetThingList(pawn.Map)) - { - if (thing is Pawn targetPawn && IsValidMeleeTarget(targetPawn)) - { - pawn.meleeVerbs.TryMeleeAttack(targetPawn); - collideWithPawns = true; - return true; - } - } - } - - return false; - } - - private bool IsValidMeleeTarget(Pawn target) - { - return !target.ThreatDisabled(pawn) && - pawn.HostileTo(target) && - GenHostility.IsActiveThreatTo(target, pawn.Faction) && - !pawn.ThreatDisabledBecauseNonAggressiveRoamer(target); - } - - private void CheckRangedAttack() - { - if (!CanUseRangedWeapon()) - return; - - Verb verb = pawn.CurrentEffectiveVerb; - if (verb == null || verb.verbProps.IsMeleeAttack) - return; - - Thing shootTarget = FindRangedTarget(); - if (shootTarget != null) - { - pawn.TryStartAttack(shootTarget); - collideWithPawns = true; - } - } - - private bool CanUseRangedWeapon() - { - if (!CombatExtension?.canUseRangedWeapon ?? false) - return false; - - // 检查武器 - if (pawn.equipment?.Primary == null || !pawn.equipment.Primary.def.IsRangedWeapon) - return false; - - // 检查 FireAtWill 设置 - if (pawn.drafter != null && !pawn.drafter.FireAtWill) - return false; - - return true; - } - - private Thing FindRangedTarget() - { - int searchRadius = CombatExtension?.attackSearchRadius ?? 25; - - TargetScanFlags flags = TargetScanFlags.NeedLOSToAll | - TargetScanFlags.NeedThreat | - TargetScanFlags.NeedAutoTargetable; - - if (pawn.CurrentEffectiveVerb?.IsIncendiary_Ranged() == true) - { - flags |= TargetScanFlags.NeedNonBurning; - } - - return (Thing)AttackTargetFinder.BestShootTargetFromCurrentPosition( - pawn, flags, null, 0f, searchRadius); - } - - private Thing FindNearestEnemy() - { - int searchRadius = CombatExtension?.attackSearchRadius ?? 25; - - return (Thing)AttackTargetFinder.BestAttackTarget( - pawn, - TargetScanFlags.NeedThreat, - x => x is Pawn p && pawn.HostileTo(p), - 0f, searchRadius, - default, - float.MaxValue, - canTakeTargets: true); - } - - public override string GetReport() - { - return "WULA_StandingGuard".Translate(); // 自定义报告文本 - } - } -} diff --git a/Source/WulaFallenEmpire/Pawn/WULA_AutonomousMech/JobExtension_AutonomousCombat.cs b/Source/WulaFallenEmpire/Pawn/WULA_AutonomousMech/JobExtension_AutonomousCombat.cs deleted file mode 100644 index e742ec89..00000000 --- a/Source/WulaFallenEmpire/Pawn/WULA_AutonomousMech/JobExtension_AutonomousCombat.cs +++ /dev/null @@ -1,14 +0,0 @@ -// JobExtension_AutonomousCombat.cs -using Verse; - -namespace WulaFallenEmpire -{ - public class JobExtension_AutonomousCombat : DefModExtension - { - public bool canUseRangedWeapon = true; - public bool autoAttackEnabled = true; - public int attackSearchRadius = 25; - public bool ignoreWorkTags = true; - public bool forceFireAtWill = true; - } -} diff --git a/Source/WulaFallenEmpire/Pawn/WULA_AutonomousMech/JobGiver_AutonomousCombat.cs b/Source/WulaFallenEmpire/Pawn/WULA_AutonomousMech/JobGiver_AutonomousCombat.cs deleted file mode 100644 index b4e9715f..00000000 --- a/Source/WulaFallenEmpire/Pawn/WULA_AutonomousMech/JobGiver_AutonomousCombat.cs +++ /dev/null @@ -1,42 +0,0 @@ -// JobGiver_AutonomousCombat.cs -using RimWorld; -using Verse; -using Verse.AI; - -namespace WulaFallenEmpire -{ - public class JobGiver_AutonomousCombat : ThinkNode_JobGiver - { - public float priority = 8f; - public int expiryInterval = 30; - - public override float GetPriority(Pawn pawn) - { - // 只有在征召状态下才有优先级 - if (pawn.drafter?.Drafted == true && - pawn.GetComp()?.CanWorkAutonomously == true) - { - return priority; - } - return 0f; - } - - protected override Job TryGiveJob(Pawn pawn) - { - // 确保是自主机械族且被征召 - var comp = pawn.GetComp(); - if (comp?.CanWorkAutonomously != true || pawn.drafter?.Drafted != true) - return null; - - // 创建自主战斗工作 - Job job = JobMaker.MakeJob(DefDatabase.GetNamed("WULA_AutonomousWaitCombat")); - job.expiryInterval = expiryInterval; - job.checkOverrideOnDamage = true; - - // 设置工作标签,确保不会被其他工作干扰 - pawn.mindState?.prioritizedWork?.Clear(); - - return job; - } - } -} diff --git a/Source/WulaFallenEmpire/Pawn/WULA_AutonomousMech/JobGiver_AutonomousWaitCombat.cs b/Source/WulaFallenEmpire/Pawn/WULA_AutonomousMech/JobGiver_AutonomousWaitCombat.cs deleted file mode 100644 index fcd4588f..00000000 --- a/Source/WulaFallenEmpire/Pawn/WULA_AutonomousMech/JobGiver_AutonomousWaitCombat.cs +++ /dev/null @@ -1,37 +0,0 @@ -// JobGiver_AutonomousWaitCombat.cs -using RimWorld; -using Verse; -using Verse.AI; - -namespace WulaFallenEmpire -{ - public class JobGiver_AutonomousWaitCombat : ThinkNode_JobGiver - { - public bool canUseRangedWeapon = true; - - public override float GetPriority(Pawn pawn) - { - // 只有在征召状态下才有高优先级 - if (pawn.drafter?.Drafted == true) - { - return 9.5f; // 比常规工作低,但比空闲高 - } - return 0f; - } - - protected override Job TryGiveJob(Pawn pawn) - { - // 只有在征召状态下才使用 Wait_Combat - if (pawn.drafter?.Drafted == true && - pawn.GetComp()?.CanWorkAutonomously == true) - { - Job job = JobMaker.MakeJob(JobDefOf.Wait_Combat); - job.canUseRangedWeapon = canUseRangedWeapon; - job.expiryInterval = 30; // 短时间,便于重新评估 - return job; - } - - return null; - } - } -} diff --git a/Source/WulaFallenEmpire/Pawn/WULA_AutonomousMech/Patch_FloatMenuOptionProvider_SelectedPawnValid.cs b/Source/WulaFallenEmpire/Pawn/WULA_AutonomousMech/Patch_FloatMenuOptionProvider_SelectedPawnValid.cs new file mode 100644 index 00000000..89a15801 --- /dev/null +++ b/Source/WulaFallenEmpire/Pawn/WULA_AutonomousMech/Patch_FloatMenuOptionProvider_SelectedPawnValid.cs @@ -0,0 +1,31 @@ +using HarmonyLib; +using RimWorld; +using Verse; + +namespace WulaFallenEmpire +{ + [HarmonyPatch(typeof(FloatMenuOptionProvider), "SelectedPawnValid")] + public static class Patch_FloatMenuOptionProvider_SelectedPawnValid + { + [HarmonyPostfix] + public static void Postfix(Pawn pawn, FloatMenuContext context, ref bool __result) + { + // 如果已经有效,不需要修改 + if (__result) + return; + + // 检查是否是机械族且被原版逻辑拒绝 + if (!pawn.RaceProps.IsMechanoid) + return; + + // 检查是否有自主机械组件 + var comp = pawn.GetComp(); + if (comp == null || !comp.CanWorkAutonomously) + return; + + // 对于自主机械族,直接返回true,跳过机械族限制 + // 其他条件已经在原版方法中检查过了 + __result = true; + } + } +} diff --git a/Source/WulaFallenEmpire/Pawn/WULA_AutonomousMech/Patch_IsColonyMechPlayerControlled.cs b/Source/WulaFallenEmpire/Pawn/WULA_AutonomousMech/Patch_IsColonyMechPlayerControlled.cs new file mode 100644 index 00000000..a2b7c5c8 --- /dev/null +++ b/Source/WulaFallenEmpire/Pawn/WULA_AutonomousMech/Patch_IsColonyMechPlayerControlled.cs @@ -0,0 +1,41 @@ +using HarmonyLib; +using RimWorld; +using Verse; + +namespace WulaFallenEmpire +{ + [HarmonyPatch(typeof(Pawn), "get_IsColonyMechPlayerControlled")] + public static class Patch_IsColonyMechPlayerControlled + { + [HarmonyPostfix] + public static void Postfix(Pawn __instance, ref bool __result) + { + // 如果原版已经返回true,不需要修改 + if (__result) + return; + + // 检查是否是殖民地机械 + if (!__instance.IsColonyMech) + return; + + // 检查是否有自主机械组件 + var comp = __instance.GetComp(); + if (comp == null) + return; + + // 如果机械族处于自主战斗模式,则视为玩家控制 + if (comp.CanFightAutonomously) + { + __result = true; + return; + } + + // 如果机械族处于自主工作模式,也视为玩家控制(用于工作相关判定) + if (comp.CanWorkAutonomously) + { + __result = true; + return; + } + } + } +} diff --git a/Source/WulaFallenEmpire/Pawn/WULA_CompHediffGiver/CompHediffGiver.cs b/Source/WulaFallenEmpire/Pawn/WULA_CompHediffGiver/CompHediffGiver.cs new file mode 100644 index 00000000..e82124fb --- /dev/null +++ b/Source/WulaFallenEmpire/Pawn/WULA_CompHediffGiver/CompHediffGiver.cs @@ -0,0 +1,70 @@ +using System; +using System.Collections.Generic; +using Verse; +using RimWorld; + +namespace WulaFallenEmpire +{ + public class CompHediffGiver : ThingComp + { + private bool hediffsApplied = false; // 新增:标记是否已经应用过hediff + + public CompProperties_HediffGiver Props => (CompProperties_HediffGiver)this.props; + + public override void PostSpawnSetup(bool respawningAfterLoad) + { + base.PostSpawnSetup(respawningAfterLoad); + + // 只有当thing是pawn时才添加hediff + if (this.parent is Pawn pawn) + { + // 新增:检查是否已经应用过hediff,或者是否是读档 + if (!hediffsApplied && !respawningAfterLoad) + { + AddHediffsToPawn(pawn); + hediffsApplied = true; // 标记为已应用 + } + } + } + + private void AddHediffsToPawn(Pawn pawn) + { + // 检查是否有hediff列表 + if (Props.hediffs == null || Props.hediffs.Count == 0) + return; + + // 检查概率 + if (Props.addChance < 1.0f && Rand.Value > Props.addChance) + return; + + // 为每个hediff添加到pawn + foreach (HediffDef hediffDef in Props.hediffs) + { + // 检查是否允许重复添加 + if (!Props.allowDuplicates && pawn.health.hediffSet.HasHediff(hediffDef)) + continue; + + // 添加hediff + pawn.health.AddHediff(hediffDef); + } + } + + // 新增:序列化hediffsApplied标记 + public override void PostExposeData() + { + base.PostExposeData(); + Scribe_Values.Look(ref hediffsApplied, "hediffsApplied", false); + } + + // 新增:调试方法,用于手动触发hediff添加(仅开发模式) + public void DebugApplyHediffs() + { + if (this.parent is Pawn pawn && !hediffsApplied) + { + AddHediffsToPawn(pawn); + hediffsApplied = true; + Log.Message($"Debug: Applied hediffs to {pawn.Label}"); + } + } + } +} diff --git a/Source/WulaFallenEmpire/Pawn/WULA_CompHediffGiver/CompProperties_HediffGiver.cs b/Source/WulaFallenEmpire/Pawn/WULA_CompHediffGiver/CompProperties_HediffGiver.cs new file mode 100644 index 00000000..d8df962e --- /dev/null +++ b/Source/WulaFallenEmpire/Pawn/WULA_CompHediffGiver/CompProperties_HediffGiver.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; +using Verse; + +namespace WulaFallenEmpire +{ + public class CompProperties_HediffGiver : CompProperties + { + // 要添加的hediff列表 + public List hediffs; + + // 添加hediff的概率(0-1之间) + public float addChance = 1.0f; + + // 是否允许重复添加相同的hediff + public bool allowDuplicates = false; + + public CompProperties_HediffGiver() + { + this.compClass = typeof(CompHediffGiver); + } + } +} diff --git a/Source/WulaFallenEmpire/ThingComp/CompAndPatch_GiveHediffOnShot.cs b/Source/WulaFallenEmpire/ThingComp/CompAndPatch_GiveHediffOnShot.cs new file mode 100644 index 00000000..23368a90 --- /dev/null +++ b/Source/WulaFallenEmpire/ThingComp/CompAndPatch_GiveHediffOnShot.cs @@ -0,0 +1,102 @@ +using HarmonyLib; +using RimWorld; +using Verse; + +namespace WulaFallenEmpire +{ + public class CompProperties_GiveHediffOnShot : CompProperties + { + public HediffDef hediffDef; + public float severityToAdd = 0.1f; + + public CompProperties_GiveHediffOnShot() + { + compClass = typeof(CompGiveHediffOnShot); + } + } + + public class CompGiveHediffOnShot : ThingComp + { + public CompProperties_GiveHediffOnShot Props => (CompProperties_GiveHediffOnShot)props; + } + + // Patch 1: For all standard projectile verbs. + [HarmonyPatch(typeof(Verb_LaunchProjectile), "TryCastShot")] + public static class Patch_Verb_LaunchProjectile_TryCastShot + { + public static void Postfix(Verb_LaunchProjectile __instance, bool __result) + { + if (!__result) return; + if (__instance.CasterPawn == null || __instance.EquipmentSource == null) return; + + CompGiveHediffOnShot comp = __instance.EquipmentSource.GetComp(); + if (comp == null || comp.Props.hediffDef == null) return; + + Hediff hediff = __instance.CasterPawn.health.GetOrAddHediff(comp.Props.hediffDef); + hediff.Severity += comp.Props.severityToAdd; + + var disappearsComp = hediff.TryGetComp(); + disappearsComp?.ResetElapsedTicks(); + } + } + + // Patch 2: Specifically for Verb_ShootWithOffset. + [HarmonyPatch(typeof(Verb_ShootWithOffset), "TryCastShot")] + public static class Patch_Verb_ShootWithOffset_TryCastShot + { + public static void Postfix(Verb_ShootWithOffset __instance, bool __result) + { + if (!__result) return; + if (__instance.CasterPawn == null || __instance.EquipmentSource == null) return; + + CompGiveHediffOnShot comp = __instance.EquipmentSource.GetComp(); + if (comp == null || comp.Props.hediffDef == null) return; + + Hediff hediff = __instance.CasterPawn.health.GetOrAddHediff(comp.Props.hediffDef); + hediff.Severity += comp.Props.severityToAdd; + + var disappearsComp = hediff.TryGetComp(); + disappearsComp?.ResetElapsedTicks(); + } + } + + // Patch 3: Specifically for our new Verb_ShootShotgunWithOffset. + [HarmonyPatch(typeof(Verb_ShootShotgunWithOffset), "TryCastShot")] + public static class Patch_Verb_ShootShotgunWithOffset_TryCastShot + { + public static void Postfix(Verb_ShootShotgunWithOffset __instance, bool __result) + { + if (!__result) return; + if (__instance.CasterPawn == null || __instance.EquipmentSource == null) return; + + CompGiveHediffOnShot comp = __instance.EquipmentSource.GetComp(); + if (comp == null || comp.Props.hediffDef == null) return; + + Hediff hediff = __instance.CasterPawn.health.GetOrAddHediff(comp.Props.hediffDef); + hediff.Severity += comp.Props.severityToAdd; + + var disappearsComp = hediff.TryGetComp(); + disappearsComp?.ResetElapsedTicks(); + } + } + + // 新增补丁:为 Verb_ShootBeamExplosive 添加支持 + [HarmonyPatch(typeof(Verb_ShootBeamExplosive), "TryCastShot")] + public static class Patch_Verb_ShootBeamExplosive_TryCastShot + { + public static void Postfix(Verb_ShootBeamExplosive __instance, bool __result) + { + if (!__result) return; + if (__instance.CasterPawn == null || __instance.EquipmentSource == null) return; + + CompGiveHediffOnShot comp = __instance.EquipmentSource.GetComp(); + if (comp == null || comp.Props.hediffDef == null) return; + + Hediff hediff = __instance.CasterPawn.health.GetOrAddHediff(comp.Props.hediffDef); + hediff.Severity += comp.Props.severityToAdd; + + var disappearsComp = hediff.TryGetComp(); + disappearsComp?.ResetElapsedTicks(); + } + } +} diff --git a/Source/WulaFallenEmpire/ThingComp/Comp_WeaponRenderDynamic.cs b/Source/WulaFallenEmpire/ThingComp/Comp_WeaponRenderDynamic.cs new file mode 100644 index 00000000..5369e537 --- /dev/null +++ b/Source/WulaFallenEmpire/ThingComp/Comp_WeaponRenderDynamic.cs @@ -0,0 +1,208 @@ +using HarmonyLib; +using RimWorld; +using System; +using UnityEngine; +using Verse; + +namespace WulaFallenEmpire +{ + public class CompProperties_WeaponRenderDynamic : CompProperties + { + public CompProperties_WeaponRenderDynamic() + { + this.compClass = typeof(Comp_WeaponRenderDynamic); + } + public string TexturePath; + public int totalFrames; + public int ticksPerFrame; + public Vector2 DrawSize = Vector2.one; + public Vector3 Offset = Vector3.zero; + } + public class Comp_WeaponRenderDynamic : ThingComp + { + private CompProperties_WeaponRenderDynamic Props + { + get + { + return (CompProperties_WeaponRenderDynamic)this.props; + } + } + public override void PostDraw() + { + Matrix4x4 matrix = default(Matrix4x4); + Vector3 vector = this.parent.DrawPos + new Vector3(0f, 0.1f, 0f) + this.parent.Graphic.DrawOffset(this.parent.Rotation); + Vector3 vector2 = new Vector3(this.parent.Graphic.drawSize.x, 1f, this.parent.Graphic.drawSize.y); + matrix.SetTRS(vector, Quaternion.AngleAxis(this.AngleOnGround, Vector3.up), vector2); + this.PostDrawExtraGlower(this.DefaultMesh, matrix); + } + private float AngleOnGround + { + get + { + return this.DrawAngle(this.parent.DrawPos, this.parent.def, this.parent); + } + } + + public float DrawAngle(Vector3 loc, ThingDef thingDef, Thing thing) + { + float result = 0f; + float? rotInRack = this.GetRotInRack(thing, thingDef, loc.ToIntVec3()); + if (rotInRack != null) + { + result = rotInRack.Value; + } + else + { + if (thing != null) + { + result = -this.parent.def.graphicData.onGroundRandomRotateAngle + (float)(thing.thingIDNumber * 542) % (this.parent.def.graphicData.onGroundRandomRotateAngle * 2f); + } + } + return result; + } + private float? GetRotInRack(Thing thing, ThingDef thingDef, IntVec3 loc) + { + float? result; + if (thing == null || !thingDef.IsWeapon || !thing.Spawned || !loc.InBounds(thing.Map) || loc.GetEdifice(thing.Map) == null || loc.GetItemCount(thing.Map) < 2) + { + result = null; + } + else + { + if (thingDef.rotateInShelves) + { + result = new float?(-90f); + } + else + { + result = new float?(0f); + } + } + return result; + } + public void PostDrawExtraGlower(Mesh mesh, Matrix4x4 matrix) + { + int num = Find.TickManager.TicksGame / this.Props.ticksPerFrame % this.Props.totalFrames; + Vector2 vector = new Vector2(1f / (float)this.Props.totalFrames, 1f); + Vector2 mainTextureOffset = new Vector2((float)num * vector.x, 0f); + Material getMaterial = this.GetMaterial; + getMaterial.mainTextureOffset = mainTextureOffset; + getMaterial.mainTextureScale = vector; + getMaterial.shader = ShaderTypeDefOf.MoteGlow.Shader; + Graphics.DrawMesh(mesh, matrix, getMaterial, 0); + } + private Material GetMaterial + { + get + { + Material materialS; + if (this.MaterialS != null) + { + materialS = this.MaterialS; + } + else + { + this.MaterialS = MaterialPool.MatFrom(this.Props.TexturePath, ShaderTypeDefOf.MoteGlow.Shader); + materialS = this.MaterialS; + } + return materialS; + } + } + public override void PostExposeData() + { + Scribe_Values.Look(ref this.Camocolor, "Camocolor", default(Color), false); + base.PostExposeData(); + } + private Material MaterialS; + private readonly Mesh DefaultMesh = MeshPool.plane10; + public Color Camocolor = Color.white; + } + [StaticConstructorOnStartup] + public class DrawWeaponExtraEquipped + { + public static void DrawExtraMatStatic(Thing eq, Vector3 drawLoc, float aimAngle) + { + string texPath = eq.def.graphicData.texPath; + try + { + float num = aimAngle - 90f; + Mesh mesh; + if (aimAngle > 20f && aimAngle < 160f) + { + mesh = MeshPool.plane10; + num += eq.def.equippedAngleOffset; + } + else + { + if (aimAngle > 200f && aimAngle < 340f) + { + mesh = MeshPool.plane10Flip; + num -= 180f; + num -= eq.def.equippedAngleOffset; + } + else + { + mesh = MeshPool.plane10; + num += eq.def.equippedAngleOffset; + } + } + num %= 360f; + CompEquippable compEquippable = eq.TryGetComp(); + if (compEquippable != null) + { + Vector3 vector; + float num2; + EquipmentUtility.Recoil(eq.def, EquipmentUtility.GetRecoilVerb(compEquippable.AllVerbs), out vector, out num2, aimAngle); + drawLoc += vector; + num += num2; + } + Graphic_StackCount graphic_StackCount = eq.Graphic as Graphic_StackCount; + Material material; + if (graphic_StackCount != null) + { + material = graphic_StackCount.SubGraphicForStackCount(1, eq.def).MatSingleFor(eq); + } + else + { + material = eq.Graphic.MatSingleFor(eq); + } + Vector3 vector2 = new Vector3(eq.Graphic.drawSize.x, 0f, eq.Graphic.drawSize.y); + Matrix4x4 matrix4x = Matrix4x4.TRS(drawLoc, Quaternion.AngleAxis(num, Vector3.up), vector2); + Graphics.DrawMesh(mesh, matrix4x, material, 0); + Comp_WeaponRenderDynamic comp_WeaponRenderDynamic = eq.TryGetComp(); + if (comp_WeaponRenderDynamic != null) + { + comp_WeaponRenderDynamic.PostDrawExtraGlower(mesh, matrix4x); + } + //Comp_WeaponRenderStatic comp_WeaponRenderStatic = eq.TryGetComp(); + //bool flag6 = comp_WeaponRenderStatic != null; + //if (flag6) + //{ + // comp_WeaponRenderStatic.PostDrawExtraGlower(mesh, matrix4x); + //} + } + catch (Exception) + { + } + } + [HarmonyPatch(typeof(PawnRenderUtility), "DrawEquipmentAiming")] + private class HarmonyPatch_PawnWeaponRenderer + { + public static bool Prefix(Thing eq, Vector3 drawLoc, float aimAngle) + { + bool flag = eq != null && eq.TryGetComp() != null && eq.TryGetComp().ParentHolder != null; + bool result; + if (flag) + { + DrawWeaponExtraEquipped.DrawExtraMatStatic(eq, drawLoc, aimAngle); + result = false; + } + else + { + result = true; + } + return result; + } + } + } +} \ No newline at end of file diff --git a/Source/WulaFallenEmpire/Utils/BezierUtil.cs b/Source/WulaFallenEmpire/Utils/BezierUtil.cs new file mode 100644 index 00000000..ef48acfe --- /dev/null +++ b/Source/WulaFallenEmpire/Utils/BezierUtil.cs @@ -0,0 +1,30 @@ +using System.Collections.Generic; +using UnityEngine; + +namespace WulaFallenEmpire.Utils +{ + public static class BezierUtil + { + // Generates points for a quadratic Bezier curve. + public static List GenerateQuadraticPoints(Vector3 start, Vector3 control, Vector3 end, int segments) + { + List points = new List(); + if (segments <= 0) segments = 1; + + for (int i = 0; i <= segments; i++) + { + float t = (float)i / segments; + float u = 1f - t; + float tt = t * t; + float uu = u * u; + + Vector3 p = uu * start; // (1-t)^2 * P0 + p += 2 * u * t * control; // 2(1-t)t * P1 + p += tt * end; // t^2 * P2 + + points.Add(p); + } + return points; + } + } +} \ No newline at end of file diff --git a/Source/WulaFallenEmpire/Verb/Verb_ShootBeamSplitAndChain.cs b/Source/WulaFallenEmpire/Verb/Verb_ShootBeamSplitAndChain.cs new file mode 100644 index 00000000..b6871e07 --- /dev/null +++ b/Source/WulaFallenEmpire/Verb/Verb_ShootBeamSplitAndChain.cs @@ -0,0 +1,223 @@ +using System.Collections.Generic; +using System.Linq; +using RimWorld; +using UnityEngine; +using Verse; +using Verse.AI; +using Verse.Sound; +using WulaFallenEmpire.Utils; + +namespace WulaFallenEmpire +{ + public class VerbProperties_SplitAndChain : VerbProperties + { + public bool isSplit = false; + public int splitNum; + public float splitRange; + public int conductNum; + public float conductRange; + public float splitDamageFactor = 0.8f; + public float conductDamageFactor = 0.6f; + public float beamArmorPenetration = 0f; + public int beamPathSteps = 15; + public float flecksPerCell = 2f; // Flecks per cell to control beam density + + public FleckDef splitMoteDef; + public FleckDef chainMoteDef; + + public VerbProperties_SplitAndChain() + { + this.verbClass = typeof(Verb_ShootBeamSplitAndChain); + } + } + + public class Verb_ShootBeamSplitAndChain : Verb + { + private VerbProperties_SplitAndChain Props => this.verbProps as VerbProperties_SplitAndChain; + private Dictionary> attackChains = new Dictionary>(); + private Dictionary endEffecters = new Dictionary(); + private Sustainer sustainer; + private int ticksToNextPathStep; + + public override void WarmupComplete() + { + this.Cleanup(); + + List mainTargets = new List(); + if (!this.currentTarget.HasThing) { base.WarmupComplete(); return; } + + Thing primaryTarget = this.currentTarget.Thing; + if (primaryTarget is Pawn p_primary && (p_primary.Dead || p_primary.Downed)) return; + + mainTargets.Add(primaryTarget); + + if (this.Props.isSplit && this.Props.splitNum > 0) + { + var potentialTargets = GenRadial.RadialDistinctThingsAround(primaryTarget.Position, this.caster.Map, this.Props.splitRange, false) + .OfType() + .Where(p => !p.Dead && !p.Downed && p.HostileTo(this.caster.Faction) && !mainTargets.Contains(p) && GenSight.LineOfSight(primaryTarget.Position, p.Position, this.caster.Map, true)) + .OrderBy(p => p.Position.DistanceToSquared(primaryTarget.Position)) + .Take(this.Props.splitNum); + + mainTargets.AddRange(potentialTargets); + } + + foreach (Thing mainTarget in mainTargets) + { + List currentChain = new List(); + currentChain.Add(mainTarget); + + Thing lastTargetInChain = mainTarget; + for (int i = 0; i < this.Props.conductNum; i++) + { + Thing nextInChain = GenRadial.RadialDistinctThingsAround(lastTargetInChain.Position, this.caster.Map, this.Props.conductRange, false) + .OfType() + .Where(p => !p.Dead && !p.Downed && !currentChain.Contains(p) && !mainTargets.Except(new[]{mainTarget}).Contains(p) && this.Caster.HostileTo(p) && GenSight.LineOfSight(lastTargetInChain.Position, p.Position, this.caster.Map, true)) + .OrderBy(p => p.Position.DistanceToSquared(lastTargetInChain.Position)) + .FirstOrDefault(); + + if (nextInChain != null) + { + currentChain.Add(nextInChain); + lastTargetInChain = nextInChain; + } + else { break; } + } + attackChains[mainTarget] = currentChain; + } + + this.burstShotsLeft = this.verbProps.burstShotCount; + this.state = VerbState.Bursting; + if (this.Props.soundCastBeam != null) + { + this.sustainer = this.Props.soundCastBeam.TrySpawnSustainer(SoundInfo.InMap(this.caster, MaintenanceType.PerTick)); + } + base.TryCastNextBurstShot(); + } + + public override void BurstingTick() + { + if (this.burstShotsLeft <= 0) + { + this.Cleanup(); + base.BurstingTick(); + return; + } + + List deadOrInvalidChains = attackChains.Keys.Where(t => t == null || !t.Spawned).ToList(); + foreach (var key in deadOrInvalidChains) + { + if(endEffecters.ContainsKey(key)) + { + endEffecters[key].Cleanup(); + endEffecters.Remove(key); + } + attackChains.Remove(key); + } + + Vector3 casterPos = this.caster.DrawPos; + foreach (var chainEntry in attackChains) + { + Thing mainTarget = chainEntry.Key; + List conductTargets = chainEntry.Value; + + DrawCurvedBeam(casterPos, mainTarget.DrawPos, Props.splitMoteDef ?? verbProps.beamLineFleckDef); + + for (int i = 0; i < conductTargets.Count - 1; i++) + { + DrawCurvedBeam(conductTargets[i].DrawPos, conductTargets[i+1].DrawPos, Props.chainMoteDef ?? verbProps.beamLineFleckDef); + } + + foreach (Thing target in conductTargets) + { + if (!endEffecters.ContainsKey(target) || endEffecters[target] == null) + { + endEffecters[target] = verbProps.beamEndEffecterDef?.Spawn(target.Position, target.Map, Vector3.zero); + } + endEffecters[target]?.EffectTick(new TargetInfo(target), TargetInfo.Invalid); + } + } + sustainer?.Maintain(); + } + + protected override bool TryCastShot() + { + if (this.attackChains.NullOrEmpty()) return false; + + bool anyDamaged = false; + foreach (var chainEntry in attackChains) + { + Thing mainTarget = chainEntry.Key; + List conductTargets = chainEntry.Value; + + ApplyDamage(mainTarget, Props.splitDamageFactor); + anyDamaged = true; + + for (int i = 1; i < conductTargets.Count; i++) + { + ApplyDamage(conductTargets[i], Props.conductDamageFactor); + } + } + + this.ticksToNextPathStep = this.verbProps.ticksBetweenBurstShots; + return anyDamaged; + } + + private void DrawCurvedBeam(Vector3 start, Vector3 end, FleckDef fleckDef) + { + if (fleckDef == null) return; + + float magnitude = (end - start).MagnitudeHorizontal(); + if (magnitude <= 0) return; + + // 1. Generate Bezier curve points + int segments = Mathf.Max(3, Mathf.CeilToInt(magnitude * Props.flecksPerCell)); + + // --- ULTIMATE CURVE FIX --- + // The control point must be offset perpendicular to the beam's direction on the XZ plane, not on the Y axis. + Vector3 direction = (end - start).normalized; + Vector3 perpendicular = new Vector3(-direction.z, 0, direction.x); // Rotated 90 degrees on the XZ plane. + + Vector3 controlPoint = Vector3.Lerp(start, end, 0.5f) + perpendicular * magnitude * Props.beamCurvature; + var path = BezierUtil.GenerateQuadraticPoints(start, controlPoint, end, segments); + // 2. Check if there are enough points to connect + if (path.Count < 2) + { + return; + } + + // 3. Iterate through adjacent point pairs and draw connecting lines + for (int i = 0; i < path.Count - 1; i++) + { + Vector3 pointA = path[i]; + Vector3 pointB = path[i + 1]; + FleckMaker.ConnectingLine(pointA, pointB, fleckDef, this.caster.Map, 1f); + } + } + + private void ApplyDamage(Thing thing, float damageFactor) + { + if (thing == null || verbProps.beamDamageDef == null) return; + + float totalDamage = verbProps.beamTotalDamage > 0 ? verbProps.beamTotalDamage / verbProps.burstShotCount : verbProps.beamDamageDef.defaultDamage; + float finalDamage = totalDamage * damageFactor; + + var dinfo = new DamageInfo(verbProps.beamDamageDef, finalDamage, Props.beamArmorPenetration, -1, this.caster, null, base.EquipmentSource.def); + thing.TakeDamage(dinfo); + } + + private void Cleanup() + { + attackChains.Clear(); + foreach (var effecter in endEffecters.Values) effecter.Cleanup(); + endEffecters.Clear(); + sustainer?.End(); + sustainer = null; + } + + public override void ExposeData() + { + base.ExposeData(); + } + } +} \ No newline at end of file diff --git a/Source/WulaFallenEmpire/Verb/Verb_ShootShotgunWithOffset.cs b/Source/WulaFallenEmpire/Verb/Verb_ShootShotgunWithOffset.cs new file mode 100644 index 00000000..ee0d1659 --- /dev/null +++ b/Source/WulaFallenEmpire/Verb/Verb_ShootShotgunWithOffset.cs @@ -0,0 +1,158 @@ +using RimWorld; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using UnityEngine; +using Verse; + +namespace WulaFallenEmpire +{ + public class Verb_ShootShotgunWithOffset : Verb_Shoot + { + protected override bool TryCastShot() + { + // Fire the first shot + bool initialShotSuccess = this.BaseTryCastShot(0); + if (initialShotSuccess && CasterIsPawn) + { + CasterPawn.records.Increment(RecordDefOf.ShotsFired); + } + + // Get shotgun extension + ShotgunExtension shotgunExtension = ShotgunExtension.Get(this.verbProps.defaultProjectile); + if (initialShotSuccess && shotgunExtension != null && shotgunExtension.pelletCount > 1) + { + // Fire the rest of the pellets in a loop + for (int i = 1; i < shotgunExtension.pelletCount; i++) + { + this.BaseTryCastShot(i); + } + } + return initialShotSuccess; + } + + protected bool BaseTryCastShot(int pelletIndex) + { + if (currentTarget.HasThing && currentTarget.Thing.Map != caster.Map) + { + return false; + } + + ThingDef projectile = Projectile; + if (projectile == null) + { + return false; + } + + ShootLine resultingLine; + bool flag = TryFindShootLineFromTo(caster.Position, currentTarget, out resultingLine); + if (verbProps.stopBurstWithoutLos && !flag) + { + return false; + } + + if (base.EquipmentSource != null) + { + base.EquipmentSource.GetComp()?.Notify_ProjectileLaunched(); + base.EquipmentSource.GetComp()?.UsedOnce(); + } + + lastShotTick = Find.TickManager.TicksGame; + Thing manningPawn = caster; + Thing equipmentSource = base.EquipmentSource; + CompMannable compMannable = caster.TryGetComp(); + if (compMannable?.ManningPawn != null) + { + manningPawn = compMannable.ManningPawn; + equipmentSource = caster; + } + + Vector3 drawPos = caster.DrawPos; + drawPos = ApplyProjectileOffset(drawPos, equipmentSource, pelletIndex); + Projectile projectile2 = (Projectile)GenSpawn.Spawn(projectile, resultingLine.Source, caster.Map); + if (equipmentSource.TryGetComp(out CompUniqueWeapon comp)) + { + foreach (WeaponTraitDef item in comp.TraitsListForReading) + { + if (item.damageDefOverride != null) + { + projectile2.damageDefOverride = item.damageDefOverride; + } + + if (!item.extraDamages.NullOrEmpty()) + { + if (projectile2.extraDamages == null) + { + projectile2.extraDamages = new List(); + } + projectile2.extraDamages.AddRange(item.extraDamages); + } + } + } + + if (verbProps.ForcedMissRadius > 0.5f) + { + float num = verbProps.ForcedMissRadius; + if (manningPawn is Pawn pawn) + { + num *= verbProps.GetForceMissFactorFor(equipmentSource, pawn); + } + + float num2 = VerbUtility.CalculateAdjustedForcedMiss(num, currentTarget.Cell - caster.Position); + if (num2 > 0.5f) + { + IntVec3 forcedMissTarget = GetForcedMissTarget(num2); + if (forcedMissTarget != currentTarget.Cell) + { + projectile2.Launch(manningPawn, drawPos, forcedMissTarget, currentTarget, ProjectileHitFlags.All, preventFriendlyFire, equipmentSource); + return true; + } + } + } + + ShotReport shotReport = ShotReport.HitReportFor(caster, this, currentTarget); + if (verbProps.canGoWild && !Rand.Chance(shotReport.AimOnTargetChance_IgnoringPosture)) + { + bool flyOverhead = projectile2?.def?.projectile != null && projectile2.def.projectile.flyOverhead; + resultingLine.ChangeDestToMissWild(shotReport.AimOnTargetChance_StandardTarget, flyOverhead, caster.Map); + projectile2.Launch(manningPawn, drawPos, resultingLine.Dest, currentTarget, ProjectileHitFlags.NonTargetWorld, preventFriendlyFire, equipmentSource, shotReport.GetRandomCoverToMissInto()?.def); + return true; + } + + if (currentTarget.Thing != null && currentTarget.Thing.def.CanBenefitFromCover && !Rand.Chance(shotReport.PassCoverChance)) + { + projectile2.Launch(manningPawn, drawPos, shotReport.GetRandomCoverToMissInto(), currentTarget, ProjectileHitFlags.NonTargetWorld, preventFriendlyFire, equipmentSource, shotReport.GetRandomCoverToMissInto()?.def); + return true; + } + + projectile2.Launch(manningPawn, drawPos, currentTarget, currentTarget, ProjectileHitFlags.IntendedTarget, preventFriendlyFire, equipmentSource, shotReport.GetRandomCoverToMissInto()?.def); + return true; + } + + private Vector3 ApplyProjectileOffset(Vector3 originalDrawPos, Thing equipmentSource, int pelletIndex) + { + if (equipmentSource != null) + { + ModExtension_ShootWithOffset offsetExtension = (base.EquipmentSource?.def)?.GetModExtension(); + + if (offsetExtension != null && offsetExtension.offsets != null && offsetExtension.offsets.Count > 0) + { + Vector2 offset = offsetExtension.GetOffsetFor(pelletIndex); + + Vector3 targetPos = currentTarget.CenterVector3; + Vector3 casterPos = caster.DrawPos; + float rimworldAngle = targetPos.AngleToFlat(casterPos); + + float correctedAngle = -rimworldAngle - 90f; + + Vector2 rotatedOffset = offset.RotatedBy(correctedAngle); + + originalDrawPos += new Vector3(rotatedOffset.x, 0f, rotatedOffset.y); + } + } + return originalDrawPos; + } + } +} \ No newline at end of file diff --git a/Source/WulaFallenEmpire/Verb/Verb_ShootWithOffset.cs b/Source/WulaFallenEmpire/Verb/Verb_ShootWithOffset.cs new file mode 100644 index 00000000..9ecd90a4 --- /dev/null +++ b/Source/WulaFallenEmpire/Verb/Verb_ShootWithOffset.cs @@ -0,0 +1,262 @@ +using RimWorld; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using UnityEngine; +using Verse; + +namespace WulaFallenEmpire +{ + public class PlaceWorker_ShowTurretWithOffsetRadius : PlaceWorker + { + public override AcceptanceReport AllowsPlacing(BuildableDef checkingDef, IntVec3 loc, Rot4 rot, Map map, Thing thingToIgnore = null, Thing thing = null) + { + VerbProperties verbProperties = ((ThingDef)checkingDef).building.turretGunDef.Verbs.Find((VerbProperties v) => v.verbClass == typeof(Verb_ShootWithOffset)); + if (verbProperties.range > 0f) + { + GenDraw.DrawRadiusRing(loc, verbProperties.range); + } + if (verbProperties.minRange > 0f) + { + GenDraw.DrawRadiusRing(loc, verbProperties.minRange); + } + return true; + } + } + public class ModExtension_ShootWithOffset : DefModExtension + { + public Vector2 GetOffsetFor(int index) + { + Vector2 result; + if (this.offsets.NullOrEmpty()) + { + result = Vector2.zero; + } + else + { + int index2 = index % this.offsets.Count; + result = this.offsets[index2]; + } + return result; + } + public List offsets = new List(); + } + public class Verb_ShootWithOffset : Verb_Shoot + { + public int offset = 0; + protected override bool TryCastShot() + { + bool num = BaseTryCastShot(); + if (num && CasterIsPawn) + { + CasterPawn.records.Increment(RecordDefOf.ShotsFired); + } + + return num; + } + protected bool BaseTryCastShot() + { + + if (currentTarget.HasThing && currentTarget.Thing.Map != caster.Map) + { + return false; + } + + ThingDef projectile = Projectile; + if (projectile == null) + { + return false; + } + + ShootLine resultingLine; + bool flag = TryFindShootLineFromTo(caster.Position, currentTarget, out resultingLine); + if (verbProps.stopBurstWithoutLos && !flag) + { + return false; + } + + if (base.EquipmentSource != null) + { + base.EquipmentSource.GetComp()?.Notify_ProjectileLaunched(); + base.EquipmentSource.GetComp()?.UsedOnce(); + } + + lastShotTick = Find.TickManager.TicksGame; + Thing manningPawn = caster; + Thing equipmentSource = base.EquipmentSource; + CompMannable compMannable = caster.TryGetComp(); + if (compMannable?.ManningPawn != null) + { + manningPawn = compMannable.ManningPawn; + equipmentSource = caster; + } + + Vector3 drawPos = caster.DrawPos; + drawPos = ApplyProjectileOffset(drawPos, equipmentSource); + Projectile projectile2 = (Projectile)GenSpawn.Spawn(projectile, resultingLine.Source, caster.Map); + if (equipmentSource.TryGetComp(out CompUniqueWeapon comp)) + { + foreach (WeaponTraitDef item in comp.TraitsListForReading) + { + if (item.damageDefOverride != null) + { + projectile2.damageDefOverride = item.damageDefOverride; + } + + if (!item.extraDamages.NullOrEmpty()) + { + Projectile projectile3 = projectile2; + if (projectile3.extraDamages == null) + { + projectile3.extraDamages = new List(); + } + + projectile2.extraDamages.AddRange(item.extraDamages); + } + } + } + + if (verbProps.ForcedMissRadius > 0.5f) + { + float num = verbProps.ForcedMissRadius; + if (manningPawn is Pawn pawn) + { + num *= verbProps.GetForceMissFactorFor(equipmentSource, pawn); + } + + float num2 = VerbUtility.CalculateAdjustedForcedMiss(num, currentTarget.Cell - caster.Position); + if (num2 > 0.5f) + { + IntVec3 forcedMissTarget = GetForcedMissTarget(num2); + if (forcedMissTarget != currentTarget.Cell) + { + ProjectileHitFlags projectileHitFlags = ProjectileHitFlags.NonTargetWorld; + if (Rand.Chance(0.5f)) + { + projectileHitFlags = ProjectileHitFlags.All; + } + + if (!canHitNonTargetPawnsNow) + { + projectileHitFlags &= ~ProjectileHitFlags.NonTargetPawns; + } + + projectile2.Launch(manningPawn, drawPos, forcedMissTarget, currentTarget, projectileHitFlags, preventFriendlyFire, equipmentSource); + return true; + } + } + } + + ShotReport shotReport = ShotReport.HitReportFor(caster, this, currentTarget); + Thing randomCoverToMissInto = shotReport.GetRandomCoverToMissInto(); + ThingDef targetCoverDef = randomCoverToMissInto?.def; + if (verbProps.canGoWild && !Rand.Chance(shotReport.AimOnTargetChance_IgnoringPosture)) + { + bool flyOverhead = projectile2?.def?.projectile != null && projectile2.def.projectile.flyOverhead; + resultingLine.ChangeDestToMissWild(shotReport.AimOnTargetChance_StandardTarget, flyOverhead, caster.Map); + ProjectileHitFlags projectileHitFlags2 = ProjectileHitFlags.NonTargetWorld; + if (Rand.Chance(0.5f) && canHitNonTargetPawnsNow) + { + projectileHitFlags2 |= ProjectileHitFlags.NonTargetPawns; + } + + projectile2.Launch(manningPawn, drawPos, resultingLine.Dest, currentTarget, projectileHitFlags2, preventFriendlyFire, equipmentSource, targetCoverDef); + return true; + } + + if (currentTarget.Thing != null && currentTarget.Thing.def.CanBenefitFromCover && !Rand.Chance(shotReport.PassCoverChance)) + { + ProjectileHitFlags projectileHitFlags3 = ProjectileHitFlags.NonTargetWorld; + if (canHitNonTargetPawnsNow) + { + projectileHitFlags3 |= ProjectileHitFlags.NonTargetPawns; + } + + projectile2.Launch(manningPawn, drawPos, randomCoverToMissInto, currentTarget, projectileHitFlags3, preventFriendlyFire, equipmentSource, targetCoverDef); + return true; + } + + ProjectileHitFlags projectileHitFlags4 = ProjectileHitFlags.IntendedTarget; + if (canHitNonTargetPawnsNow) + { + projectileHitFlags4 |= ProjectileHitFlags.NonTargetPawns; + } + + if (!currentTarget.HasThing || currentTarget.Thing.def.Fillage == FillCategory.Full) + { + projectileHitFlags4 |= ProjectileHitFlags.NonTargetWorld; + } + if (currentTarget.Thing != null) + { + projectile2.Launch(manningPawn, drawPos, currentTarget, currentTarget, projectileHitFlags4, preventFriendlyFire, equipmentSource, targetCoverDef); + } + else + { + projectile2.Launch(manningPawn, drawPos, resultingLine.Dest, currentTarget, projectileHitFlags4, preventFriendlyFire, equipmentSource, targetCoverDef); + } + return true; + } + + private Vector3 ApplyProjectileOffset(Vector3 originalDrawPos, Thing equipmentSource) + { + if (equipmentSource != null) + { + // 获取投射物偏移的模组扩展 + ModExtension_ShootWithOffset offsetExtension = + equipmentSource.def.GetModExtension(); + + if (offsetExtension != null && offsetExtension.offsets != null && offsetExtension.offsets.Count > 0) + { + // 获取当前连发射击的剩余次数 + int burstShotsLeft = GetBurstShotsLeft(); + + // 计算从发射者到目标的角度 + Vector3 targetPos = currentTarget.CenterVector3; + Vector3 casterPos = caster.DrawPos; + float rimworldAngle = targetPos.AngleToFlat(casterPos); + + // 将RimWorld角度转换为适合偏移计算的角度 + float correctedAngle = ConvertRimWorldAngleToOffsetAngle(rimworldAngle); + + // 应用偏移并旋转到正确方向 + Vector2 offset = offsetExtension.GetOffsetFor(burstShotsLeft); + Vector2 rotatedOffset = offset.RotatedBy(correctedAngle); + + // 将2D偏移转换为3D并应用到绘制位置 + originalDrawPos += new Vector3(rotatedOffset.x, 0f, rotatedOffset.y); + } + } + + return originalDrawPos; + } + + /// + /// 获取当前连发射击剩余次数 + /// + /// 连发射击剩余次数 + private int GetBurstShotsLeft() + { + if (burstShotsLeft >= 0) + { + return (int)burstShotsLeft; + } + return 0; + } + + /// + /// 将RimWorld角度转换为偏移计算用的角度 + /// RimWorld使用顺时针角度系统,需要转换为标准的数学角度系统 + /// + /// RimWorld角度 + /// 转换后的角度 + private float ConvertRimWorldAngleToOffsetAngle(float rimworldAngle) + { + // RimWorld角度:0°=东,90°=北,180°=西,270°=南 + // 转换为:0°=东,90°=南,180°=西,270°=北 + return -rimworldAngle - 90f; + } + + } +} \ No newline at end of file diff --git a/Source/WulaFallenEmpire/WulaFallenEmpire.csproj b/Source/WulaFallenEmpire/WulaFallenEmpire.csproj index 3eb5a034..6808b591 100644 --- a/Source/WulaFallenEmpire/WulaFallenEmpire.csproj +++ b/Source/WulaFallenEmpire/WulaFallenEmpire.csproj @@ -71,6 +71,12 @@ + + + + + + @@ -91,6 +97,7 @@ + @@ -99,13 +106,15 @@ + - + + @@ -113,6 +122,8 @@ + + @@ -136,11 +147,13 @@ + + @@ -153,13 +166,14 @@ - - - - - - - + + + + + + + + @@ -187,12 +201,14 @@ + - + + diff --git a/美术与文本源文件/Wula/Building/WULA_Cat_Bunker.sai2 b/美术与文本源文件/Wula/Building/WULA_Cat_Bunker.sai2 new file mode 100644 index 00000000..ef8a7c73 Binary files /dev/null and b/美术与文本源文件/Wula/Building/WULA_Cat_Bunker.sai2 differ diff --git a/美术与文本源文件/Wula/Building/WULA_Dropping_Building_Cleanzone.sai2 b/美术与文本源文件/Wula/Building/WULA_Dropping_Building_Cleanzone.sai2 new file mode 100644 index 00000000..74c7595e Binary files /dev/null and b/美术与文本源文件/Wula/Building/WULA_Dropping_Building_Cleanzone.sai2 differ diff --git a/美术与文本源文件/Wula/Flyover/WULA_BattleShip_Shadow.sai2 b/美术与文本源文件/Wula/Flyover/WULA_BattleShip_Shadow.sai2 new file mode 100644 index 00000000..3a506d98 Binary files /dev/null and b/美术与文本源文件/Wula/Flyover/WULA_BattleShip_Shadow.sai2 differ diff --git a/美术与文本源文件/Wula/Flyover/WULA_Fighter_Shadow.sai2 b/美术与文本源文件/Wula/Flyover/WULA_Fighter_Shadow.sai2 new file mode 100644 index 00000000..a2161aed Binary files /dev/null and b/美术与文本源文件/Wula/Flyover/WULA_Fighter_Shadow.sai2 differ diff --git a/美术与文本源文件/Wula/Mote/Mote_WULA_Beam_Charge.sai2 b/美术与文本源文件/Wula/Mote/Mote_WULA_Beam_Charge.sai2 new file mode 100644 index 00000000..2a8d7931 Binary files /dev/null and b/美术与文本源文件/Wula/Mote/Mote_WULA_Beam_Charge.sai2 differ diff --git a/美术与文本源文件/Wula/Projectile/Grenade_WULA_RW_Base_AR.sai2 b/美术与文本源文件/Wula/Projectile/Grenade_WULA_RW_Base_AR.sai2 new file mode 100644 index 00000000..2f6a4251 Binary files /dev/null and b/美术与文本源文件/Wula/Projectile/Grenade_WULA_RW_Base_AR.sai2 differ diff --git a/美术与文本源文件/Wula/Projectile/WULA_Bullet_StarDrift_Shotgun_Spear.png b/美术与文本源文件/Wula/Projectile/WULA_Bullet_StarDrift_Shotgun_Spear.png deleted file mode 100644 index 73c8ac71..00000000 Binary files a/美术与文本源文件/Wula/Projectile/WULA_Bullet_StarDrift_Shotgun_Spear.png and /dev/null differ diff --git a/美术与文本源文件/Wula/Projectile/WULA_Bullet_StarDrift_Shotgun_Spear.sai2 b/美术与文本源文件/Wula/Projectile/WULA_Bullet_StarDrift_Shotgun_Spear.sai2 index 776422cf..2d1f6e1f 100644 Binary files a/美术与文本源文件/Wula/Projectile/WULA_Bullet_StarDrift_Shotgun_Spear.sai2 and b/美术与文本源文件/Wula/Projectile/WULA_Bullet_StarDrift_Shotgun_Spear.sai2 differ diff --git a/美术与文本源文件/Wula/Projectile/WULA_Loitering_Munition.png b/美术与文本源文件/Wula/Projectile/WULA_Loitering_Munition.png deleted file mode 100644 index e4cc4de0..00000000 Binary files a/美术与文本源文件/Wula/Projectile/WULA_Loitering_Munition.png and /dev/null differ diff --git a/美术与文本源文件/Wula/Projectile/WULA_Shrapnel.png b/美术与文本源文件/Wula/Projectile/WULA_Shrapnel.png index 5916ae8e..0540126a 100644 Binary files a/美术与文本源文件/Wula/Projectile/WULA_Shrapnel.png and b/美术与文本源文件/Wula/Projectile/WULA_Shrapnel.png differ diff --git a/美术与文本源文件/Wula/UI/Abilities/WULA_CallBattleShip.sai2 b/美术与文本源文件/Wula/UI/Abilities/WULA_CallBattleShip.sai2 new file mode 100644 index 00000000..fd51154f Binary files /dev/null and b/美术与文本源文件/Wula/UI/Abilities/WULA_CallBattleShip.sai2 differ diff --git a/美术与文本源文件/Wula/UI/Abilities/WULA_NanoRepairHediff_Switch.png b/美术与文本源文件/Wula/UI/Abilities/WULA_NanoRepairHediff_Switch.png new file mode 100644 index 00000000..92ccd524 Binary files /dev/null and b/美术与文本源文件/Wula/UI/Abilities/WULA_NanoRepairHediff_Switch.png differ diff --git a/美术与文本源文件/Wula/UI/Abilities/WULA_RW_Auto_GL_Smoke_Ability.sai2 b/美术与文本源文件/Wula/UI/Abilities/WULA_RW_Auto_GL_Smoke_Ability.sai2 new file mode 100644 index 00000000..c1d41278 Binary files /dev/null and b/美术与文本源文件/Wula/UI/Abilities/WULA_RW_Auto_GL_Smoke_Ability.sai2 differ diff --git a/美术与文本源文件/Wula/UI/Abilities/WULA_RW_Base_AR_Ability.sai2 b/美术与文本源文件/Wula/UI/Abilities/WULA_RW_Base_AR_Ability.sai2 new file mode 100644 index 00000000..40199eb5 Binary files /dev/null and b/美术与文本源文件/Wula/UI/Abilities/WULA_RW_Base_AR_Ability.sai2 differ diff --git a/美术与文本源文件/Wula/UI/Abilities/WULA_RW_Base_Loitering_Munition_Ability.sai2 b/美术与文本源文件/Wula/UI/Abilities/WULA_RW_Base_Loitering_Munition_Ability.sai2 new file mode 100644 index 00000000..9f1cb8d2 Binary files /dev/null and b/美术与文本源文件/Wula/UI/Abilities/WULA_RW_Base_Loitering_Munition_Ability.sai2 differ diff --git a/美术与文本源文件/Wula/UI/Abilities/WULA_RW_EMP_RF_EMP_Ability.sai2 b/美术与文本源文件/Wula/UI/Abilities/WULA_RW_EMP_RF_EMP_Ability.sai2 new file mode 100644 index 00000000..e16f43f7 Binary files /dev/null and b/美术与文本源文件/Wula/UI/Abilities/WULA_RW_EMP_RF_EMP_Ability.sai2 differ diff --git a/美术与文本源文件/Wula/UI/Abilities/WULA_WeaponSwitchAbility.sai2 b/美术与文本源文件/Wula/UI/Abilities/WULA_WeaponSwitchAbility.sai2 index 60ba73e2..7b8516dd 100644 Binary files a/美术与文本源文件/Wula/UI/Abilities/WULA_WeaponSwitchAbility.sai2 and b/美术与文本源文件/Wula/UI/Abilities/WULA_WeaponSwitchAbility.sai2 differ diff --git a/美术与文本源文件/Wula/UI/Commands/WULA_ConvertMechanoids.sai2 b/美术与文本源文件/Wula/UI/Commands/WULA_ConvertMechanoids.sai2 new file mode 100644 index 00000000..5885082b Binary files /dev/null and b/美术与文本源文件/Wula/UI/Commands/WULA_ConvertMechanoids.sai2 differ diff --git a/美术与文本源文件/Wula/UI/Commands/WULA_DropBuilding.sai2 b/美术与文本源文件/Wula/UI/Commands/WULA_DropBuilding.sai2 new file mode 100644 index 00000000..8230ca65 Binary files /dev/null and b/美术与文本源文件/Wula/UI/Commands/WULA_DropBuilding.sai2 differ diff --git a/美术与文本源文件/Wula/UI/Commands/WULA_NanoRepairHediff_Switch.sai2 b/美术与文本源文件/Wula/UI/Commands/WULA_NanoRepairHediff_Switch.sai2 new file mode 100644 index 00000000..ec0bf281 Binary files /dev/null and b/美术与文本源文件/Wula/UI/Commands/WULA_NanoRepairHediff_Switch.sai2 differ diff --git a/美术与文本源文件/Wula/UI/Commands/WULA_RecycleNearbyMechanoids.sai2 b/美术与文本源文件/Wula/UI/Commands/WULA_RecycleNearbyMechanoids.sai2 new file mode 100644 index 00000000..a8239260 Binary files /dev/null and b/美术与文本源文件/Wula/UI/Commands/WULA_RecycleNearbyMechanoids.sai2 differ diff --git a/美术与文本源文件/Wula/Weapon/WULA_MW_Armour_Lance.png b/美术与文本源文件/Wula/Weapon/WULA_MW_Armour_Lance.png deleted file mode 100644 index 2edb826e..00000000 Binary files a/美术与文本源文件/Wula/Weapon/WULA_MW_Armour_Lance.png and /dev/null differ diff --git a/美术与文本源文件/Wula/Weapon/WULA_MW_Breaker_Bar.png b/美术与文本源文件/Wula/Weapon/WULA_MW_Breaker_Bar.png deleted file mode 100644 index 569f5470..00000000 Binary files a/美术与文本源文件/Wula/Weapon/WULA_MW_Breaker_Bar.png and /dev/null differ diff --git a/美术与文本源文件/Wula/Weapon/WULA_MW_Breaker_Bar.sai2 b/美术与文本源文件/Wula/Weapon/WULA_MW_Breaker_Bar.sai2 index 645a0042..b4ee484e 100644 Binary files a/美术与文本源文件/Wula/Weapon/WULA_MW_Breaker_Bar.sai2 and b/美术与文本源文件/Wula/Weapon/WULA_MW_Breaker_Bar.sai2 differ diff --git a/美术与文本源文件/Wula/Weapon/WULA_MW_ChainSword.png b/美术与文本源文件/Wula/Weapon/WULA_MW_ChainSword.png deleted file mode 100644 index 1fc8e548..00000000 Binary files a/美术与文本源文件/Wula/Weapon/WULA_MW_ChainSword.png and /dev/null differ diff --git a/美术与文本源文件/Wula/Weapon/WULA_MW_ChainSword.sai2 b/美术与文本源文件/Wula/Weapon/WULA_MW_ChainSword.sai2 index d457d096..1147d923 100644 Binary files a/美术与文本源文件/Wula/Weapon/WULA_MW_ChainSword.sai2 and b/美术与文本源文件/Wula/Weapon/WULA_MW_ChainSword.sai2 differ diff --git a/美术与文本源文件/Wula/Weapon/WULA_MW_Charge_Mace.png b/美术与文本源文件/Wula/Weapon/WULA_MW_Charge_Mace.png deleted file mode 100644 index 09ed9e53..00000000 Binary files a/美术与文本源文件/Wula/Weapon/WULA_MW_Charge_Mace.png and /dev/null differ diff --git a/美术与文本源文件/Wula/Weapon/WULA_MW_Charge_Mace.sai2 b/美术与文本源文件/Wula/Weapon/WULA_MW_Charge_Mace.sai2 index d70ac7bc..cc8928f1 100644 Binary files a/美术与文本源文件/Wula/Weapon/WULA_MW_Charge_Mace.sai2 and b/美术与文本源文件/Wula/Weapon/WULA_MW_Charge_Mace.sai2 differ diff --git a/美术与文本源文件/Wula/Weapon/WULA_MW_Constructor_Hammer.png b/美术与文本源文件/Wula/Weapon/WULA_MW_Constructor_Hammer.png deleted file mode 100644 index 489b38e6..00000000 Binary files a/美术与文本源文件/Wula/Weapon/WULA_MW_Constructor_Hammer.png and /dev/null differ diff --git a/美术与文本源文件/Wula/Weapon/WULA_MW_Constructor_Hammer.sai2 b/美术与文本源文件/Wula/Weapon/WULA_MW_Constructor_Hammer.sai2 index 9ece732f..11e2f1f1 100644 Binary files a/美术与文本源文件/Wula/Weapon/WULA_MW_Constructor_Hammer.sai2 and b/美术与文本源文件/Wula/Weapon/WULA_MW_Constructor_Hammer.sai2 differ diff --git a/美术与文本源文件/Wula/Weapon/WULA_MW_Glaive.png b/美术与文本源文件/Wula/Weapon/WULA_MW_Glaive.png deleted file mode 100644 index 9086b555..00000000 Binary files a/美术与文本源文件/Wula/Weapon/WULA_MW_Glaive.png and /dev/null differ diff --git a/美术与文本源文件/Wula/Weapon/WULA_MW_Lance.png b/美术与文本源文件/Wula/Weapon/WULA_MW_Lance.png deleted file mode 100644 index 2d2c17ef..00000000 Binary files a/美术与文本源文件/Wula/Weapon/WULA_MW_Lance.png and /dev/null differ diff --git a/美术与文本源文件/Wula/Weapon/WULA_MW_Lance.sai2 b/美术与文本源文件/Wula/Weapon/WULA_MW_Lance.sai2 index 2283cb74..17a98352 100644 Binary files a/美术与文本源文件/Wula/Weapon/WULA_MW_Lance.sai2 and b/美术与文本源文件/Wula/Weapon/WULA_MW_Lance.sai2 differ diff --git a/美术与文本源文件/Wula/Weapon/WULA_MW_Mace.png b/美术与文本源文件/Wula/Weapon/WULA_MW_Mace.png deleted file mode 100644 index 749e4093..00000000 Binary files a/美术与文本源文件/Wula/Weapon/WULA_MW_Mace.png and /dev/null differ diff --git a/美术与文本源文件/Wula/Weapon/WULA_RW_AutoCannon.png b/美术与文本源文件/Wula/Weapon/WULA_RW_AutoCannon.png deleted file mode 100644 index 0a2f7e74..00000000 Binary files a/美术与文本源文件/Wula/Weapon/WULA_RW_AutoCannon.png and /dev/null differ diff --git a/美术与文本源文件/Wula/Weapon/WULA_RW_AutoCannon.sai2 b/美术与文本源文件/Wula/Weapon/WULA_RW_AutoCannon.sai2 index 13294426..cad02151 100644 Binary files a/美术与文本源文件/Wula/Weapon/WULA_RW_AutoCannon.sai2 and b/美术与文本源文件/Wula/Weapon/WULA_RW_AutoCannon.sai2 differ diff --git a/美术与文本源文件/Wula/Weapon/WULA_RW_Auto_GL.png b/美术与文本源文件/Wula/Weapon/WULA_RW_Auto_GL.png deleted file mode 100644 index 003c1d62..00000000 Binary files a/美术与文本源文件/Wula/Weapon/WULA_RW_Auto_GL.png and /dev/null differ diff --git a/美术与文本源文件/Wula/Weapon/WULA_RW_Auto_GL.sai2 b/美术与文本源文件/Wula/Weapon/WULA_RW_Auto_GL.sai2 index 94b3f4c5..b07b88b7 100644 Binary files a/美术与文本源文件/Wula/Weapon/WULA_RW_Auto_GL.sai2 and b/美术与文本源文件/Wula/Weapon/WULA_RW_Auto_GL.sai2 differ diff --git a/美术与文本源文件/Wula/Weapon/WULA_RW_Base_AR.png b/美术与文本源文件/Wula/Weapon/WULA_RW_Base_AR.png deleted file mode 100644 index 2c337c31..00000000 Binary files a/美术与文本源文件/Wula/Weapon/WULA_RW_Base_AR.png and /dev/null differ diff --git a/美术与文本源文件/Wula/Weapon/WULA_RW_Base_AR.sai2 b/美术与文本源文件/Wula/Weapon/WULA_RW_Base_AR.sai2 new file mode 100644 index 00000000..1a593d6e Binary files /dev/null and b/美术与文本源文件/Wula/Weapon/WULA_RW_Base_AR.sai2 differ diff --git a/美术与文本源文件/Wula/Weapon/WULA_RW_Base_AR_Cat.png b/美术与文本源文件/Wula/Weapon/WULA_RW_Base_AR_Cat.png deleted file mode 100644 index 52afaf1d..00000000 Binary files a/美术与文本源文件/Wula/Weapon/WULA_RW_Base_AR_Cat.png and /dev/null differ diff --git a/美术与文本源文件/Wula/Weapon/WULA_RW_Base_Loitering_Munition.sai2 b/美术与文本源文件/Wula/Weapon/WULA_RW_Base_Loitering_Munition.sai2 index 4794f472..0eb1a90f 100644 Binary files a/美术与文本源文件/Wula/Weapon/WULA_RW_Base_Loitering_Munition.sai2 and b/美术与文本源文件/Wula/Weapon/WULA_RW_Base_Loitering_Munition.sai2 differ diff --git a/美术与文本源文件/Wula/Weapon/WULA_RW_Beam_Base_AR.sai2 b/美术与文本源文件/Wula/Weapon/WULA_RW_Beam_Base_AR.sai2 index 57310198..e148c313 100644 Binary files a/美术与文本源文件/Wula/Weapon/WULA_RW_Beam_Base_AR.sai2 and b/美术与文本源文件/Wula/Weapon/WULA_RW_Beam_Base_AR.sai2 differ diff --git a/美术与文本源文件/Wula/Weapon/WULA_RW_Fractal_RF.sai2 b/美术与文本源文件/Wula/Weapon/WULA_RW_Fractal_RF.sai2 index 2a657f5e..6bbdb7ff 100644 Binary files a/美术与文本源文件/Wula/Weapon/WULA_RW_Fractal_RF.sai2 and b/美术与文本源文件/Wula/Weapon/WULA_RW_Fractal_RF.sai2 differ diff --git a/美术与文本源文件/Wula/Weapon/WULA_RW_Handle_Cannon.png b/美术与文本源文件/Wula/Weapon/WULA_RW_Handle_Cannon.png deleted file mode 100644 index 62203f7d..00000000 Binary files a/美术与文本源文件/Wula/Weapon/WULA_RW_Handle_Cannon.png and /dev/null differ diff --git a/美术与文本源文件/Wula/Weapon/WULA_RW_Handle_Cannon.sai2 b/美术与文本源文件/Wula/Weapon/WULA_RW_Handle_Cannon.sai2 index c671db54..6b20d2fd 100644 Binary files a/美术与文本源文件/Wula/Weapon/WULA_RW_Handle_Cannon.sai2 and b/美术与文本源文件/Wula/Weapon/WULA_RW_Handle_Cannon.sai2 differ diff --git a/美术与文本源文件/Wula/Weapon/WULA_RW_Penetrating_Beam_Rifle.sai2 b/美术与文本源文件/Wula/Weapon/WULA_RW_Penetrating_Beam_Rifle.sai2 index 1f7b6c8c..57a2aa4e 100644 Binary files a/美术与文本源文件/Wula/Weapon/WULA_RW_Penetrating_Beam_Rifle.sai2 and b/美术与文本源文件/Wula/Weapon/WULA_RW_Penetrating_Beam_Rifle.sai2 differ diff --git a/美术与文本源文件/Wula/Weapon/WULA_RW_Plasm_AR.sai2 b/美术与文本源文件/Wula/Weapon/WULA_RW_Plasm_AR.sai2 deleted file mode 100644 index d85fded1..00000000 Binary files a/美术与文本源文件/Wula/Weapon/WULA_RW_Plasm_AR.sai2 and /dev/null differ diff --git a/美术与文本源文件/Wula/Weapon/WULA_RW_Plasma_Homing_AR.sai2 b/美术与文本源文件/Wula/Weapon/WULA_RW_Plasma_Homing_AR.sai2 deleted file mode 100644 index 999ca0e7..00000000 Binary files a/美术与文本源文件/Wula/Weapon/WULA_RW_Plasma_Homing_AR.sai2 and /dev/null differ diff --git a/美术与文本源文件/Wula/Weapon/WULA_RW_Sphene_MG.png b/美术与文本源文件/Wula/Weapon/WULA_RW_Sphene_MG.png deleted file mode 100644 index 7e69a2dd..00000000 Binary files a/美术与文本源文件/Wula/Weapon/WULA_RW_Sphene_MG.png and /dev/null differ diff --git a/美术与文本源文件/Wula/Weapon/WULA_RW_Sphene_MG.sai2 b/美术与文本源文件/Wula/Weapon/WULA_RW_Sphene_MG.sai2 index a5ecf570..e9fabffb 100644 Binary files a/美术与文本源文件/Wula/Weapon/WULA_RW_Sphene_MG.sai2 and b/美术与文本源文件/Wula/Weapon/WULA_RW_Sphene_MG.sai2 differ diff --git a/美术与文本源文件/Wula/Weapon/WULA_RW_StarDrift_SG.png b/美术与文本源文件/Wula/Weapon/WULA_RW_StarDrift_SG.png deleted file mode 100644 index 96264e27..00000000 Binary files a/美术与文本源文件/Wula/Weapon/WULA_RW_StarDrift_SG.png and /dev/null differ diff --git a/美术与文本源文件/Wula/Weapon/WULA_RW_StarDrift_Shotgun.sai2 b/美术与文本源文件/Wula/Weapon/WULA_RW_StarDrift_Shotgun.sai2 index 96766f63..198c72a9 100644 Binary files a/美术与文本源文件/Wula/Weapon/WULA_RW_StarDrift_Shotgun.sai2 and b/美术与文本源文件/Wula/Weapon/WULA_RW_StarDrift_Shotgun.sai2 differ