diff --git a/1.6/1.6/Assemblies/WulaFallenEmpire.dll b/1.6/1.6/Assemblies/WulaFallenEmpire.dll index 1b2f27f5..018b8abd 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/AbilityDefs/WULA_Flyover_Ability.xml b/1.6/1.6/Defs/AbilityDefs/WULA_Flyover_Ability.xml index 55e2e1e5..636b874a 100644 --- a/1.6/1.6/Defs/AbilityDefs/WULA_Flyover_Ability.xml +++ b/1.6/1.6/Defs/AbilityDefs/WULA_Flyover_Ability.xml @@ -635,11 +635,12 @@ + WULA_Firepower_Minigun_Strafe 以战舰上的自动链炮对目标区域进行可选方向的扫射,射击速度和冷却都很快,对轻甲目标有效,但是威力欠佳。 - + Wula/UI/Abilities/WULA_Firepower_Minigun_Strafe 1 Misc12 false @@ -679,13 +680,16 @@ BombardmentFacility 需要拥有<color=#BD2F31><i>武器阵列</i></color>设施的战舰在地图上才能进行轨道炮击支援 +
  • + WULA_Firepower_Minigun_Technology +
  • WULA_Firepower_Cannon_Salvo 指挥战舰侧弦的副炮,进行一轮共计12发炮弹的齐射,造成中规中矩的毁伤。 - + Wula/UI/Abilities/WULA_Firepower_Cannon_Salvo 1 Misc12 false @@ -710,7 +714,7 @@ 10 3 90 - 12 + 24 120 @@ -726,13 +730,16 @@ BombardmentFacility 需要拥有<color=#BD2F31><i>武器阵列</i></color>设施的战舰在地图上才能进行轨道炮击支援 +
  • + WULA_Firepower_Cannon_Technology +
  • WULA_Firepower_Cannon_Surveillance 指挥战舰侧弦的副炮,监视一个区域0.3小时,对任何进入范围的敌对目标进行炮击。 - + Wula/UI/Abilities/WULA_Firepower_Cannon_Surveillance 1 Misc12 false @@ -764,13 +771,16 @@ BombardmentFacility 需要拥有<color=#BD2F31><i>武器阵列</i></color>设施的战舰在地图上才能进行轨道炮击支援 +
  • + WULA_Firepower_Cannon_Technology +
  • WULA_Firepower_EnergyLance_Strafe 指挥战舰侧弦的光矛阵列,发射一道光矛横扫战场,造成大量的热能伤害。 - + Wula/UI/Abilities/WULA_Firepower_EnergyLance_Strafe 1 Misc12 false @@ -787,10 +797,10 @@ - +
  • 450 20 @@ -798,11 +808,145 @@ WULA_EnergyLance_Base 4
  • - +
  • - + BombardmentFacility + 需要拥有<color=#BD2F31><i>武器阵列</i></color>设施的战舰在地图上才能进行轨道炮击支援 +
  • +
  • + WULA_Firepower_EnergyLance_Technology +
  • +
    +
    + + WULA_Firepower_EnergyLance_Surveillance + + 指挥战舰侧弦的副炮,监视一个区域1小时,对任何进入范围的敌对目标进行炮击。 + Wula/UI/Abilities/WULA_Firepower_EnergyLance_Surveillance + 1 + Misc12 + false + + Verb_CastAbility + false + false + 1 + 120 + true + + false + true + + + +
  • + 300 + BombardmentFacility +
  • +
  • + 180 + WULA_Firepower_EnergyLance_Surveillance_Skyfaller + 36 + (0.85,0.85,0.3,0.5) +
  • +
  • + + BombardmentFacility + 需要拥有<color=#BD2F31><i>武器阵列</i></color>设施的战舰在地图上才能进行轨道炮击支援 +
  • +
  • + WULA_Firepower_EnergyLance_Technology +
  • +
    +
    + + WULA_Firepower_Primary_Cannon_Strafe + + 以战舰上的主炮对目标区域进行可选方向的扫射,拥有夷平山脉的恐怖威力,但是响应速度、精准度都很差且需要大量时间再装填。 + Wula/UI/Abilities/WULA_Firepower_Primary_Cannon_Strafe + 1 + Misc12 + false + + Verb_CastAbility + false + false + 1 + 120 + true + + false + true + + + +
  • + 1000 + BombardmentFacility +
  • +
  • + 35 + 70 + 0.1 + 16 + 16 + 240 + 30 + 2 + true + 1.5 + 1.0,0.3,0.1,0.3 + WULA_Firepower_Primary_Cannon_Strafe_Skyfaller +
  • +
  • + + BombardmentFacility + 需要拥有<color=#BD2F31><i>武器阵列</i></color>设施的战舰在地图上才能进行轨道炮击支援 +
  • +
  • + WULA_Firepower_Primary_Cannon_Technology +
  • +
    +
    + + WULA_Firepower_Primary_Cannon_EMP_Surveillance + + 指挥战舰的主炮,监视极大范围3小时,对任何进入范围的敌对目标发射大范围EMP炮弹,蕴含的强大能量能使得机械体长时间地被麻痹。 + Wula/UI/Abilities/WULA_Firepower_Primary_Cannon_EMP_Surveillance + 1 + Misc12 + false + + Verb_CastAbility + false + false + 1 + 120 + true + + false + true + + + +
  • + 300 + BombardmentFacility +
  • +
  • + 180 + WULA_Firepower_Primary_Cannon_EMP_Surveillance_Skyfaller + 100 + (0.85,0.85,0.3,0.5) +
  • +
  • + + BombardmentFacility + 需要拥有<color=#BD2F31><i>武器阵列</i></color>设施的战舰在地图上才能进行轨道炮击支援 +
  • +
  • + WULA_Firepower_Primary_Cannon_Technology +
  • \ No newline at end of file diff --git a/1.6/1.6/Defs/DamageDefs/Damages_Wula.xml b/1.6/1.6/Defs/DamageDefs/Damages_Wula.xml index 093f756a..f8f80065 100644 --- a/1.6/1.6/Defs/DamageDefs/Damages_Wula.xml +++ b/1.6/1.6/Defs/DamageDefs/Damages_Wula.xml @@ -43,12 +43,24 @@ 5 + Wula_Dark_Matter_Flame - {0} 由于暗物质湮灭爆炸而死。 + {0} 被暗物质湮灭带来的高能射流蒸发。 + 15 + 2 + 5 + 5 + + WULA_Firepower_Minigun_Strafe_Damage + + 25 + Explosion_Bomb + + Wula_Psi_Damage true @@ -250,4 +262,12 @@ 0 + + WULA_DarkMatterBomb + + 550 + 2.0 + 1.30 + WULA_DarkMatterBomb_Shockwave + \ No newline at end of file diff --git a/1.6/1.6/Defs/HediffDefs/WULA_FM_Hediffs.xml b/1.6/1.6/Defs/HediffDefs/WULA_FM_Hediffs.xml index f49d9f3d..2afe9993 100644 --- a/1.6/1.6/Defs/HediffDefs/WULA_FM_Hediffs.xml +++ b/1.6/1.6/Defs/HediffDefs/WULA_FM_Hediffs.xml @@ -75,8 +75,11 @@
  • WULA_Firepower_Minigun_Strafe
  • WULA_Firepower_Cannon_Salvo
  • -
  • WULA_Firepower_Cannon_Surveillance_Beacon
  • +
  • WULA_Firepower_Cannon_Surveillance
  • WULA_Firepower_EnergyLance_Strafe
  • +
  • WULA_Firepower_EnergyLance_Surveillance
  • +
  • WULA_Firepower_Primary_Cannon_Strafe
  • +
  • WULA_Firepower_Primary_Cannon_EMP_Surveillance
  • diff --git a/1.6/1.6/Defs/ResearchProjectDefs/WULA_ResearchProjects_Remake.xml b/1.6/1.6/Defs/ResearchProjectDefs/WULA_ResearchProjects_Remake.xml index 6f7f7f98..7ca10a1e 100644 --- a/1.6/1.6/Defs/ResearchProjectDefs/WULA_ResearchProjects_Remake.xml +++ b/1.6/1.6/Defs/ResearchProjectDefs/WULA_ResearchProjects_Remake.xml @@ -92,6 +92,69 @@
  • WULA_Colony_License_LV3_Technology
  • + + + + WULA_Firepower_Minigun_Technology + + 允许殖民地申请来自武器阵列的链炮进行近地支援打击。\n\n链炮是一种射速非常快的大口径机炮,得益于乌拉帝国优秀的材料学,其弹头在穿越大气层后依然保有对轻甲目标的强大杀伤力。\n\n轨道攻击依赖于战舰的<color=#BD2F31><i>武器阵列</i></color>,只有携带此类设施的战舰出现在地图中时,才能呼叫轨道攻击。 + 600 + 1.00 + 5.00 + +
  • WULA_Colony_License_LV1_Technology
  • +
    +
    + + WULA_Battleship_Technology + + 允许殖民地建立信标增加护航舰配额,并使得机械乌拉可以调频天线以申请舰队空中支援。\n\n乌拉帝国边缘开发署的护航舰是近地支援舰队的基础作战单位,它们的体积虽然不如战列巡洋舰那样庞大,但是依然搭载了让地面武装望尘莫及的庞大火炮阵列,可以对地面发起骇人的轰炸。\n\n护航舰拥有以下设施:\n<color=#BD2F31><i>-武器阵列</i></color> + 600 + 2.00 + 5.00 + +
  • WULA_Firepower_Minigun_Technology
  • +
    +
    + + WULA_Firepower_Cannon_Technology + + 允许殖民地申请来自武器阵列的轻型舰炮进行近地支援打击。\n\n乌拉帝国的轻型舰炮是用于在太空战中对付中小型舰船的速射炮——当然,对地面目标同样有效。\n\n轨道攻击依赖于战舰的<color=#BD2F31><i>武器阵列</i></color>,只有携带此类设施的战舰出现在地图中时,才能呼叫轨道攻击。 + 600 + 5.00 + 5.00 + +
  • WULA_Battleship_Technology
  • +
    + +
  • WULA_Colony_License_LV2_Technology
  • +
    +
    + + WULA_Firepower_EnergyLance_Technology + + 允许殖民地申请来自武器阵列的光矛进行近地支援打击。\n\n暗物质光矛是乌拉帝国舰队现役的主战装备之一,杀伤力来源是近乎纯净的能量,无论何种装甲防御在其面前都是螳臂当车。\n\n轨道攻击依赖于战舰的<color=#BD2F31><i>武器阵列</i></color>,只有携带此类设施的战舰出现在地图中时,才能呼叫轨道攻击。 + 600 + 9.00 + 5.00 + +
  • WULA_Firepower_Cannon_Technology
  • +
    + +
  • WULA_Colony_License_LV3_Technology
  • +
    +
    + + WULA_Firepower_Primary_Cannon_Technology + + 允许殖民地申请来自武器阵列的主炮进行近地支援打击。\n\n乌拉帝国战舰的主炮被安装在轴线上,充当舰队战中的定音锤。如果把那些足以击碎舰队龙骨的炮弹射到地上的话···\n\n轨道攻击依赖于战舰的<color=#BD2F31><i>武器阵列</i></color>,只有携带此类设施的战舰出现在地图中时,才能呼叫轨道攻击。 + 600 + 10.00 + 5.00 + +
  • WULA_Firepower_EnergyLance_Technology
  • +
    +
    @@ -179,7 +242,7 @@ WULA_Turret_Base_AT_Technology - 6.00 + 7.00 1.40 允许殖民地申请空投反战车磁轨炮台,可以在远距离上击穿拥有厚重装甲的敌人。 @@ -194,7 +257,7 @@ WULA_Turret_Base_Laser_Technology - 7.00 + 6.00 1.40 允许殖民地申请空投激光炮台,可以持续定向烧灼敌军,最大限度地击伤对手并留存战利品和俘虏。 @@ -208,7 +271,6 @@ - WULA_Synth_Weapon_1_Base_Technology diff --git a/1.6/1.6/Defs/ThingDefs_Buildings/WULA_Drop_Buildings.xml b/1.6/1.6/Defs/ThingDefs_Buildings/WULA_Drop_Buildings.xml index c7710f1c..b70f3742 100644 --- a/1.6/1.6/Defs/ThingDefs_Buildings/WULA_Drop_Buildings.xml +++ b/1.6/1.6/Defs/ThingDefs_Buildings/WULA_Drop_Buildings.xml @@ -8,6 +8,9 @@ Wula/Building/Linked/WULA_Fortress_Wall_MenuIcon MinifiedThing Normal + + WulaWall +
  • BuildingsMisc
  • @@ -173,6 +176,9 @@ WulaDoor_Cleanzone 清理出一块场地并准备好资源,使得乌拉帝国母舰可以向此处投放建筑。建造好的信标可以收起或移至他处,但是必须要有母舰或者工程舰在上空才能投送建筑。\n\n乌拉帝国堡垒的大门不仅能够抵御大量爆炸和震荡伤害,还拥有无需通电即可运转的伺服系统来增加大门通过速度。 + + WulaDoor + Building_Door Building DoorMoveable @@ -462,6 +468,7 @@ Normal WulaSpecies + WULA_MaintenancePod
  • BuildingsMisc
  • @@ -655,6 +662,9 @@ Wula/Building/WULA_WeaponArmor_Productor MinifiedThing Normal + + WULA_WeaponArmor_Productor +
  • BuildingsMisc
  • @@ -817,6 +827,9 @@ Wula/Building/WULA_Machine_Recharger MinifiedThing Normal + + WULA_Machine_Recharger +
  • BuildingsMisc
  • @@ -984,6 +997,9 @@ Wula/Building/WULA_Charging_Station_Synth_south MinifiedThing Normal + + WULA_Charging_Station_Synth +
  • BuildingsMisc
  • @@ -1140,6 +1156,9 @@ Wula/Building/WULA_Cube_Productor_south MinifiedThing Normal + + WULA_Cube_Productor +
  • BuildingsMisc
  • @@ -1311,6 +1330,9 @@ Wula/Building/Wula_DarkEnergy_Generators MinifiedThing Normal + + Wula_DarkEnergy_Generators +
  • BuildingsMisc
  • diff --git a/1.6/1.6/Defs/ThingDefs_Buildings/WULA_Turret_Buildings.xml b/1.6/1.6/Defs/ThingDefs_Buildings/WULA_Turret_Buildings.xml index 430a1a0a..d15f6df2 100644 --- a/1.6/1.6/Defs/ThingDefs_Buildings/WULA_Turret_Buildings.xml +++ b/1.6/1.6/Defs/ThingDefs_Buildings/WULA_Turret_Buildings.xml @@ -255,6 +255,7 @@ MinifiedThing Normal + Wula_Base_ATGun_Turret Wula_Base_ATGun_Turret_Weapon @@ -529,7 +530,8 @@ MinifiedThing Normal - Wula_Base_ATGun_Turret_Weapon + Wula_Base_Laser_Turret + Wula_Base_Laser_Turret_Weapon
  • BuildingsMisc
  • @@ -551,7 +553,7 @@ false false -
  • WULA_Turret_Base_AT_Technology
  • +
  • WULA_Turret_Base_Laser_Technology
  • 1 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 index 25ca745a..0d91548c 100644 --- a/1.6/1.6/Defs/ThingDefs_Misc/WULA_Flyover_Item.xml +++ b/1.6/1.6/Defs/ThingDefs_Misc/WULA_Flyover_Item.xml @@ -743,21 +743,16 @@ 1 - - WULA_Firepower_Minigun_Strafe_Damage - - 25 - Explosion_Bomb - WULA_Firepower_Cannon_Salvo_Skyfaller (1, 1) - Wula/Projectile/WULA_Bullet_ChargeLanceShot_Red + Wula/Projectile/WULA_Energy_Shell Graphic_Single MoteGlow 8 + (86,66,157,255) Accelerate @@ -791,21 +786,25 @@ (1,1) - Wula/Building/WULA_WeaponArmor_Productor_Incoming + Wula/Building/WULA_Surveillance_Building Graphic_Single - CutoutFlying - (1,1) + TransparentPostLight + (24,24) + (255,255,255,150) + + false + - Accelerate + Decelerate Things/Skyfaller/SkyfallerShadowDropPod - (5, 5) + (0, 0) DropPod_Fall 100 - Explosion_Vaporize + 0.05 - 1 - 1 + 0 + 0
  • (0,0)
  • @@ -819,15 +818,17 @@ WULA_Firepower_Cannon_Surveillance_Beacon 一枚标定监视区的轰炸信标,进入此处的敌对势力都会被乌拉帝国舰队的舰炮狠狠打击。 - Wula/Building/WULA_WeaponArmor_Productor + Normal - true + false false (1,1) - Wula/Building/WULA_Dropping_Building_Cleanzone - Graphic_Multi - (3,3) + Wula/Building/WULA_Surveillance_Building + Graphic_Single + TransparentPostLight + (24,24) + (255,255,255,150) false @@ -847,22 +848,10 @@
    0 + false BuildingDestroyed_Metal_Small -
  • - 0.2 - (255, 20, 20, 242) -
  • -
  • - 12 - (0.85,0.85,0.3) - 0 - true - - 该信标所标定的舰炮监视范围,进入其中的敌军将遭到炮击 - true -
  • 12 true @@ -888,6 +877,12 @@
  • + + WULA_Firepower_Minigun_Strafe_Damage + + 25 + Explosion_Bomb + WULA_EnergyLance_Base @@ -900,11 +895,23 @@
  • - 0.001 - 3 - 0.8 + 9999 + 2 - 8 + 15 + + 3 + 2 + 5 + 90 + + true + false + 0 + + true + 15 + 20
  • WULA_RW_Base_AR @@ -916,7 +923,7 @@
  • 6 (147, 116, 201, 212) - OrbitalBeam +
  • @@ -926,8 +933,6 @@
  • - 30 - 15 (147, 116, 201) (147, 116, 185) @@ -947,11 +952,11 @@
  • SubEffecter_Sustainer - VoidStructure_Emerging + OrbitalBeam
  • SubEffecter_SprayerChance - EnergyLance_Fleck + WULA_EnergyLance_Fleck 1 999 40 @@ -961,17 +966,7 @@
  • SubEffecter_SprayerChance - EnergyLance_Fleck - 1 - 999 - 40 - 1~1 - 5 - OnSource -
  • -
  • - SubEffecter_SprayerChance - EnergyLance_Fleck + WULA_EnergyLance_Fleck 1 999 40 @@ -982,7 +977,7 @@ - EnergyLance_Fleck + WULA_EnergyLance_Fleck MoteOverhead 1 0 @@ -1001,4 +996,405 @@ 10.0 + + WULA_Firepower_EnergyLance_Surveillance_Skyfaller + + (1,1) + + Wula/Building/WULA_Surveillance_Building + Graphic_Single + TransparentPostLight + (72,72) + (255,255,255,150) + + false + + + + Decelerate + Things/Skyfaller/SkyfallerShadowDropPod + (0, 0) + DropPod_Fall + 100 + + 0.05 + 0 + 0 + + +
  • (0,0)
  • +
  • (1, 1)
  • + + + WULA_Firepower_EnergyLance_Surveillance_Beacon + +
    + + WULA_Firepower_EnergyLance_Surveillance_Beacon + + 一枚标定监视区的轰炸信标,进入此处的敌对势力都会被乌拉帝国舰队的舰炮狠狠打击。 + Wula/Building/WULA_WeaponArmor_Productor + Normal + false + false + (1,1) + + Wula/Building/WULA_Surveillance_Building + Graphic_Single + TransparentPostLight + (72,72) + (255,255,255,150) + + false + + + Building + Standable + false + 0.5 + false + 0 + false + false + + 1 + 0 + 0 + + 0 + + false + BuildingDestroyed_Metal_Small + + +
  • + WULA_EnergyLance_Surveillance + 600 + 25 + 36 + 30 + 20 + 45 + 180 +
  • +
  • + + true + false +
  • +
  • + 4000 +
  • +
  • + 6 + (0.85,0.85,0.3,0.5) +
  • +
    +
    + + WULA_EnergyLance_Surveillance + + 一束从乌拉帝国战舰上发射的纯净能量光束,将点燃路径上的一切活物。 + WulaFallenEmpire.EnergyLance + Normal + RealtimeOnly + true + true + + + +
  • + 9999 + + 1 + 10 + + 3 + 2 + 5 + 90 + + true + false + 0 + + true + 15 + 20 +
  • +
  • + WULA_RW_Base_AR +
  • +
    + + + +
  • + 6 + (147, 116, 201, 212) + +
  • + + +
  • + 0.02 +
  • + + +
  • + + (147, 116, 201) + (147, 116, 185) + (147, 116, 150) + 1.5 + +
  • + +
  • + WULA_EnergyLance_Effecter +
  • +
    +
    + + WULA_Firepower_Primary_Cannon_Strafe_Skyfaller + + (1, 1) + + Wula/Projectile/WULA_Bullet_Plasma_Yellow + Graphic_Single + MoteGlow + 15 + + + Accelerate + Things/Skyfaller/SkyfallerShadowDropPod + (5, 5) + DropPod_Fall + 100 + Explosion_Bomb + 0.05 + 1 + 1 + + +
  • (0,180)
  • +
  • (1, 181)
  • +
    +
    + + +
  • (0,0)
  • +
  • (1, 1)
  • +
    +
    + 35 + WULA_DarkMatterBomb + 1 + CraterLarge +
    +
    + + WULA_DarkMatterBomb_Shockwave + +
  • + SubEffecter_SprayerTriggered + Fleck_BlastMechBandShockwave + 1 + OnSource + true + 0~0 +
  • +
  • + SubEffecter_SprayerTriggered + WULA_DarkMatterBomb_MechBandRedLine_Fleck + 1 + OnSource + true + 0~0 +
  • +
  • + SubEffecter_SprayerTriggered + WULA_DarkMatterBomb_FlashStrong + 1 + OnSource + 24 +
  • +
    +
    + + WULA_DarkMatterBomb_MechBandRedLine_Fleck + LightingOverlay + 0.1 + 0.28 + 0.7 + 11 + true + + Things/Mote/RedLineGlow + Graphic_FleckPulse + MoteMultiplyAddCircular + (78,0,106,215) + + <_DistortionTex>/Things/Mote/RadiationDistortion_A + <_texAScale>0.5 + <_texBScale>2 + <_texAScrollSpeed>0 + <_texBScrollSpeed>-0.4 + <_Intensity>0.5 + <_InnerFadeAmount>0 + <_DistortionIntensity>0.5 + <_TexAScaleDivisorPerProgress>1.5 + + (7, 7) + + + + WULA_DarkMatterBomb_FlashStrong + MoteAttached + MoteOverhead + + 0.1 + 0.13 + 0.1 + + + Things/Mote/BrightFlash + MoteGlow + (78,0,106,215) + + + + WULA_Firepower_Primary_Cannon_EMP_Surveillance_Skyfaller + + (1,1) + + Wula/Building/WULA_Surveillance_Building + Graphic_Single + TransparentPostLight + (200,200) + (255,255,255,150) + + false + + + + Decelerate + Things/Skyfaller/SkyfallerShadowDropPod + (0, 0) + DropPod_Fall + 100 + + 0.05 + 0 + 0 + + +
  • (0,0)
  • +
  • (1, 1)
  • +
    +
    + WULA_Firepower_Primary_Cannon_EMP_Surveillance_Beacon +
    +
    + + WULA_Firepower_Primary_Cannon_EMP_Surveillance_Beacon + + 一枚标定监视区的轰炸信标,进入此处的敌对势力都会被乌拉帝国舰队的舰炮狠狠打击。 + Wula/Building/WULA_WeaponArmor_Productor + Normal + false + false + (1,1) + + Wula/Building/WULA_Surveillance_Building + Graphic_Single + TransparentPostLight + (170,170) + (255,255,255,150) + + false + + + Building + Standable + false + 0.5 + false + 0 + false + false + + 1 + 0 + 0 + + 0 + + false + BuildingDestroyed_Metal_Small + + +
  • + 100 + true + false + false + 1 + 15 + 240 + 6 + WULA_Firepower_Primary_Cannon_EMP_Skyfaller +
  • +
  • + + true + false +
  • +
  • + 12000 +
  • +
  • + 6 + (0.85,0.85,0.3,0.5) +
  • +
    +
    + + WULA_Firepower_Primary_Cannon_EMP_Skyfaller + + (1, 1) + + Wula/Projectile/WULA_Bullet_Plasma_Yellow + Graphic_Single + MoteGlow + 15 + (13,88,195,255) + + + Accelerate + Things/Skyfaller/SkyfallerShadowDropPod + (5, 5) + DropPod_Fall + 100 + Explosion_EMP + 0.05 + 1 + 1 + + +
  • (0,180)
  • +
  • (1, 181)
  • +
    +
    + + +
  • (0,0)
  • +
  • (1, 1)
  • +
    +
    + 35 + EMP + 10 +
    +
    \ 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 index eca26630..422614b0 100644 --- 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 @@ -344,7 +344,7 @@
  • WULA_WeaponArmor_Productor
  • - WULA_Synth_Weapon_2_Stun_Technology + WULA_Synth_Weapon_3_Melee_Technology 7 @@ -2006,7 +2006,7 @@ WULA_RW_Auto_GL - 乌拉帝国所装备的自动榴弹炮,主要发射用于对抗低护甲集群的杀伤性榴弹,优秀的供弹结构使其射速较同类武器快得多。除此之外,它也能临时装填和发射EMP榴弹或烟雾榴弹,这使其成为了一款多功能的支援型武器。 + 乌拉帝国所装备的自动榴弹炮,主要发射用于对抗低护甲集群的杀伤性榴弹,优秀的供弹结构使其射速较同类武器快得多。除此之外,它也能临时装填和发射烟雾榴弹,这使其成为了一款多功能的支援型武器。 Ultra None 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 245d42a7..292db35d 100644 --- a/1.6/1.6/Languages/ChineseSimplified (简体中文)/Keyed/Misc_Gameplay.xml +++ b/1.6/1.6/Languages/ChineseSimplified (简体中文)/Keyed/Misc_Gameplay.xml @@ -327,7 +327,7 @@ 武器阵列:{0}个就绪,{1}个冷却中 设施状态错误 武器阵列:{0}个就绪,{1}个冷却中 - 冷却时间:{0} + 使用此支援后,武器阵列的冷却时间:{0} 没有可用的武器阵列 diff --git a/Content/Textures/Wula/Building/WULA_Surveillance_Building.png b/Content/Textures/Wula/Building/WULA_Surveillance_Building.png new file mode 100644 index 00000000..2fdaad1b Binary files /dev/null and b/Content/Textures/Wula/Building/WULA_Surveillance_Building.png differ diff --git a/Content/Textures/Wula/Projectile/WULA_Energy_Shell.png b/Content/Textures/Wula/Projectile/WULA_Energy_Shell.png new file mode 100644 index 00000000..6da80603 Binary files /dev/null and b/Content/Textures/Wula/Projectile/WULA_Energy_Shell.png differ diff --git a/Content/Textures/Wula/UI/Abilities/WULA_Firepower_Cannon_Salvo.png b/Content/Textures/Wula/UI/Abilities/WULA_Firepower_Cannon_Salvo.png new file mode 100644 index 00000000..6cde67e9 Binary files /dev/null and b/Content/Textures/Wula/UI/Abilities/WULA_Firepower_Cannon_Salvo.png differ diff --git a/Content/Textures/Wula/UI/Abilities/WULA_Firepower_Cannon_Surveillance.png b/Content/Textures/Wula/UI/Abilities/WULA_Firepower_Cannon_Surveillance.png new file mode 100644 index 00000000..41243877 Binary files /dev/null and b/Content/Textures/Wula/UI/Abilities/WULA_Firepower_Cannon_Surveillance.png differ diff --git a/Content/Textures/Wula/UI/Abilities/WULA_Firepower_EnergyLance_Strafe.png b/Content/Textures/Wula/UI/Abilities/WULA_Firepower_EnergyLance_Strafe.png new file mode 100644 index 00000000..13bc09e6 Binary files /dev/null and b/Content/Textures/Wula/UI/Abilities/WULA_Firepower_EnergyLance_Strafe.png differ diff --git a/Content/Textures/Wula/UI/Abilities/WULA_Firepower_EnergyLance_Surveillance.png b/Content/Textures/Wula/UI/Abilities/WULA_Firepower_EnergyLance_Surveillance.png new file mode 100644 index 00000000..b2c200a1 Binary files /dev/null and b/Content/Textures/Wula/UI/Abilities/WULA_Firepower_EnergyLance_Surveillance.png differ diff --git a/Content/Textures/Wula/UI/Abilities/WULA_Firepower_Minigun_Strafe.png b/Content/Textures/Wula/UI/Abilities/WULA_Firepower_Minigun_Strafe.png new file mode 100644 index 00000000..987d21f2 Binary files /dev/null and b/Content/Textures/Wula/UI/Abilities/WULA_Firepower_Minigun_Strafe.png differ diff --git a/Content/Textures/Wula/UI/Abilities/WULA_Firepower_Primary_Cannon_EMP_Surveillance.png b/Content/Textures/Wula/UI/Abilities/WULA_Firepower_Primary_Cannon_EMP_Surveillance.png new file mode 100644 index 00000000..e23cde56 Binary files /dev/null and b/Content/Textures/Wula/UI/Abilities/WULA_Firepower_Primary_Cannon_EMP_Surveillance.png differ diff --git a/Content/Textures/Wula/UI/Abilities/WULA_Firepower_Primary_Cannon_Strafe.png b/Content/Textures/Wula/UI/Abilities/WULA_Firepower_Primary_Cannon_Strafe.png new file mode 100644 index 00000000..8cbfb989 Binary files /dev/null and b/Content/Textures/Wula/UI/Abilities/WULA_Firepower_Primary_Cannon_Strafe.png differ diff --git a/Source/WulaFallenEmpire/Ability/WULA_AbilitySurveillanceBombardment/CompAbilityEffect_CallSkyfaller.cs b/Source/WulaFallenEmpire/Ability/WULA_AbilityCallSkyfaller/CompAbilityEffect_CallSkyfaller.cs similarity index 100% rename from Source/WulaFallenEmpire/Ability/WULA_AbilitySurveillanceBombardment/CompAbilityEffect_CallSkyfaller.cs rename to Source/WulaFallenEmpire/Ability/WULA_AbilityCallSkyfaller/CompAbilityEffect_CallSkyfaller.cs diff --git a/Source/WulaFallenEmpire/Ability/WULA_AbilitySurveillanceBombardment/CompProperties_AbilityCallSkyfaller.cs b/Source/WulaFallenEmpire/Ability/WULA_AbilityCallSkyfaller/CompProperties_AbilityCallSkyfaller.cs similarity index 100% rename from Source/WulaFallenEmpire/Ability/WULA_AbilitySurveillanceBombardment/CompProperties_AbilityCallSkyfaller.cs rename to Source/WulaFallenEmpire/Ability/WULA_AbilityCallSkyfaller/CompProperties_AbilityCallSkyfaller.cs diff --git a/Source/WulaFallenEmpire/Ability/WULA_AbilitySurveillanceBombardment/MapComponent_SkyfallerDelayed.cs b/Source/WulaFallenEmpire/Ability/WULA_AbilityCallSkyfaller/MapComponent_SkyfallerDelayed.cs similarity index 100% rename from Source/WulaFallenEmpire/Ability/WULA_AbilitySurveillanceBombardment/MapComponent_SkyfallerDelayed.cs rename to Source/WulaFallenEmpire/Ability/WULA_AbilityCallSkyfaller/MapComponent_SkyfallerDelayed.cs diff --git a/Source/WulaFallenEmpire/Ability/WULA_AbilityEnergyLance/EnergyLance.cs b/Source/WulaFallenEmpire/Ability/WULA_AbilityEnergyLance/EnergyLance.cs index 584f3001..41f54091 100644 --- a/Source/WulaFallenEmpire/Ability/WULA_AbilityEnergyLance/EnergyLance.cs +++ b/Source/WulaFallenEmpire/Ability/WULA_AbilityEnergyLance/EnergyLance.cs @@ -15,22 +15,22 @@ namespace WulaFallenEmpire public IntVec3 endPosition; public float moveDistance; public bool useFixedDistance; - public float flightSpeed = 1f; + public float flightSpeed = 0.5f; // 提高移动速度 public float currentProgress = 0f; public float altitude = 20f; - + // 伤害配置 public int firesPerTick = 4; public float effectRadius = 15f; public int durationTicks = 600; private int ticksPassed = 0; - + // 移动状态 private Vector3 exactPosition; private Vector3 moveDirection; private bool hasStarted = false; private bool hasCompleted = false; - + // 视觉效果 private CompOrbitalBeam orbitalBeamComp; private Sustainer sustainer; @@ -42,11 +42,194 @@ namespace WulaFallenEmpire public Thing instigator; public ThingDef weaponDef; - // 精确位置计算(基于FlyOver的逻辑) + // 动态目标追踪支持 + private IntVec3 currentTargetPosition = IntVec3.Invalid; + private bool hasValidTarget = false; + private int lastTargetUpdateTick = 0; + private int maxIdleTicks = 180; // 3秒无目标更新后自毁 + + // 移动模式 + private bool useDynamicMovement = true; // 使用动态追踪模式 + + // 更新目标位置 + public void UpdateTargetPosition(IntVec3 targetPos) + { + if (targetPos.IsValid) + { + currentTargetPosition = targetPos; + hasValidTarget = true; + lastTargetUpdateTick = Find.TickManager.TicksGame; + + // 如果是首次设置目标,立即移动到目标位置 + if (!hasStarted) + { + exactPosition = targetPos.ToVector3(); + exactPosition.y = altitude; + base.Position = targetPos; + hasStarted = true; + } + + Log.Message($"[EnergyLance] Target updated to: {targetPos}, current position: {base.Position}"); + } + else + { + hasValidTarget = false; + Log.Message("[EnergyLance] Target cleared"); + } + } + + // 动态移动逻辑 - 直接追踪目标 + private void UpdateDynamicMovement() + { + if (hasValidTarget && currentTargetPosition.IsValid) + { + Vector3 targetVector = currentTargetPosition.ToVector3(); + targetVector.y = altitude; // 保持高度 + + Vector3 currentVector = exactPosition; + + // 计算移动方向 + Vector3 direction = (targetVector - currentVector).normalized; + + // 计算移动距离(基于速度) + float moveThisTick = flightSpeed * 0.1f; + + // 更新位置 + exactPosition += direction * moveThisTick; + + // 更新格子位置 + IntVec3 newCell = new IntVec3( + Mathf.RoundToInt(exactPosition.x), + Mathf.RoundToInt(exactPosition.y), + Mathf.RoundToInt(exactPosition.z) + ); + + if (newCell != base.Position && newCell.InBounds(base.Map)) + { + base.Position = newCell; + Log.Message($"[EnergyLance] Moved to new cell: {newCell}"); + } + + // 检查是否接近目标 + float distanceToTarget = Vector3.Distance(currentVector, targetVector); + if (distanceToTarget < 0.5f) + { + // 非常接近目标,直接设置到目标位置 + exactPosition = targetVector; + base.Position = currentTargetPosition; + Log.Message($"[EnergyLance] Reached target position: {currentTargetPosition}"); + } + } + else + { + // 没有有效目标,使用原始移动逻辑 + UpdateOriginalMovement(); + } + } + + // 原始移动逻辑(从起点到终点的线性移动) + private void UpdateOriginalMovement() + { + float totalDistance = useFixedDistance ? moveDistance : Vector3.Distance(startPosition.ToVector3(), endPosition.ToVector3()); + float progressPerTick = 1f / durationTicks; + currentProgress += progressPerTick; + currentProgress = Mathf.Clamp01(currentProgress); + + exactPosition = Vector3.Lerp(startPosition.ToVector3(), CalculateEndPosition(), currentProgress); + exactPosition.y = altitude; + + IntVec3 newCell = new IntVec3( + Mathf.RoundToInt(exactPosition.x), + Mathf.RoundToInt(exactPosition.y), + Mathf.RoundToInt(exactPosition.z) + ); + + if (newCell != base.Position && newCell.InBounds(base.Map)) + { + base.Position = newCell; + } + } + + protected override void Tick() + { + base.Tick(); + + if (!hasStarted || hasCompleted) + return; + + ticksPassed++; + + // 添加保护期检查 - 防止光束立即销毁 + if (ticksPassed < 5) + { + // 只更新移动,不检查销毁 + UpdateDynamicMovement(); + return; + } + + // 检查是否长时间没有收到目标更新 + if (hasValidTarget && Find.TickManager.TicksGame - lastTargetUpdateTick > maxIdleTicks) + { + Log.Message("[EnergyLance] No target updates received, self-destructing"); + CompleteEnergyLance(); + return; + } + + // 更新移动 + UpdateDynamicMovement(); + + // 造成伤害 + for (int i = 0; i < firesPerTick; i++) + { + StartRandomFireAndDoFlameDamage(); + } + + // 更新音效 + sustainer?.Maintain(); + + // 检查是否完成 + if (ticksPassed >= durationTicks || (!hasValidTarget && currentProgress >= 1f)) + { + CompleteEnergyLance(); + } + } + + private void CompleteEnergyLance() + { + hasCompleted = true; + + // 停止音效 + sustainer?.End(); + sustainer = null; + + Log.Message($"[EnergyLance] 光束完成 at position {base.Position}, ticksPassed: {ticksPassed}, durationTicks: {durationTicks}"); + + // 销毁自身 + Destroy(); + } + + public override void ExposeData() + { + base.ExposeData(); + + Scribe_Values.Look(ref currentTargetPosition, "currentTargetPosition"); + Scribe_Values.Look(ref hasValidTarget, "hasValidTarget", false); + Scribe_Values.Look(ref lastTargetUpdateTick, "lastTargetUpdateTick", 0); + Scribe_Values.Look(ref maxIdleTicks, "maxIdleTicks", 180); + Scribe_Values.Look(ref useDynamicMovement, "useDynamicMovement", true); + } + + // 精确位置计算 public override Vector3 DrawPos { get { + if (exactPosition != Vector3.zero) + { + return exactPosition; + } + + // 备用计算 Vector3 start = startPosition.ToVector3(); Vector3 end = CalculateEndPosition(); Vector3 basePos = Vector3.Lerp(start, end, currentProgress); @@ -74,7 +257,15 @@ namespace WulaFallenEmpire { get { - Vector3 direction = (CalculateEndPosition() - startPosition.ToVector3()).normalized; + Vector3 direction; + if (hasValidTarget && currentTargetPosition.IsValid) + { + direction = (currentTargetPosition.ToVector3() - exactPosition).normalized; + } + else + { + direction = (CalculateEndPosition() - startPosition.ToVector3()).normalized; + } return Quaternion.LookRotation(direction.Yto0()); } } @@ -82,30 +273,42 @@ namespace WulaFallenEmpire public override void SpawnSetup(Map map, bool respawningAfterLoad) { base.SpawnSetup(map, respawningAfterLoad); - + orbitalBeamComp = GetComp(); - + if (!respawningAfterLoad) { - base.Position = startPosition; + // 初始位置设置为目标位置(如果有效),否则使用起始位置 + if (endPosition.IsValid) + { + base.Position = endPosition; + exactPosition = endPosition.ToVector3(); + exactPosition.y = altitude; + } + else + { + base.Position = startPosition; + exactPosition = startPosition.ToVector3(); + exactPosition.y = altitude; + } + hasStarted = true; - + // 计算移动方向 Vector3 endPos = CalculateEndPosition(); moveDirection = (endPos - startPosition.ToVector3()).normalized; - + // 初始化光束组件 if (orbitalBeamComp != null) { - // 使用反射调用StartAnimation方法 StartOrbitalBeamAnimation(); } - + // 开始音效 StartSound(); - - Log.Message($"[EnergyLance] Spawned at {startPosition}, moving to {endPosition}, " + - $"distance: {moveDistance}, fixed: {useFixedDistance}"); + + Log.Message($"[EnergyLance] Spawned at {base.Position}, target: {endPosition}, " + + $"exact position: {exactPosition}"); } } @@ -141,102 +344,34 @@ namespace WulaFallenEmpire } } - protected override void Tick() - { - base.Tick(); - - if (!hasStarted || hasCompleted) - return; - - ticksPassed++; - - // 更新移动进度 - UpdateMovement(); - - // 造成伤害 - for (int i = 0; i < firesPerTick; i++) - { - StartRandomFireAndDoFlameDamage(); - } - - // 更新音效 - sustainer?.Maintain(); - - // 检查是否完成 - if (ticksPassed >= durationTicks || currentProgress >= 1f) - { - CompleteEnergyLance(); - } - } - - private void UpdateMovement() - { - // 计算总距离 - float totalDistance = useFixedDistance ? moveDistance : Vector3.Distance(startPosition.ToVector3(), endPosition.ToVector3()); - - // 计算移动速度(基于持续时间和总距离) - float progressPerTick = 1f / durationTicks; - currentProgress += progressPerTick; - currentProgress = Mathf.Clamp01(currentProgress); - - // 更新精确位置 - exactPosition = Vector3.Lerp(startPosition.ToVector3(), CalculateEndPosition(), currentProgress); - - // 更新格子位置 - IntVec3 newCell = new IntVec3( - Mathf.RoundToInt(exactPosition.x), - Mathf.RoundToInt(exactPosition.y), - Mathf.RoundToInt(exactPosition.z) - ); - - if (newCell != base.Position && newCell.InBounds(base.Map)) - { - base.Position = newCell; - } - } - private void StartRandomFireAndDoFlameDamage() { IntVec3 targetCell = (from x in GenRadial.RadialCellsAround(base.Position, effectRadius, useCenter: true) - where x.InBounds(base.Map) - select x).RandomElementByWeight((IntVec3 x) => 1f - Mathf.Min(x.DistanceTo(base.Position) / effectRadius, 1f) + 0.05f); + where x.InBounds(base.Map) + select x).RandomElementByWeight((IntVec3 x) => 1f - Mathf.Min(x.DistanceTo(base.Position) / effectRadius, 1f) + 0.05f); FireUtility.TryStartFireIn(targetCell, base.Map, Rand.Range(0.1f, 0.925f), instigator); - + tmpThings.Clear(); tmpThings.AddRange(targetCell.GetThingList(base.Map)); - + for (int i = 0; i < tmpThings.Count; i++) { int num = ((tmpThings[i] is Corpse) ? CorpseFlameDamageAmountRange.RandomInRange : FlameDamageAmountRange.RandomInRange); Pawn pawn = tmpThings[i] as Pawn; BattleLogEntry_DamageTaken battleLogEntry_DamageTaken = null; - + if (pawn != null) { battleLogEntry_DamageTaken = new BattleLogEntry_DamageTaken(pawn, RulePackDefOf.DamageEvent_PowerBeam, instigator as Pawn); Find.BattleLog.Add(battleLogEntry_DamageTaken); } - - DamageInfo damageInfo = new DamageInfo(DamageDefOf.Flame, num, 0f, -1f, instigator, null, weaponDef); + + DamageInfo damageInfo = new DamageInfo(WulaDamageDefOf.Wula_Dark_Matter_Flame, num, 2f, -1f, instigator, null, weaponDef); tmpThings[i].TakeDamage(damageInfo).AssociateWithLog(battleLogEntry_DamageTaken); } - - tmpThings.Clear(); - } - private void CompleteEnergyLance() - { - hasCompleted = true; - - // 停止音效 - sustainer?.End(); - sustainer = null; - - Log.Message($"[EnergyLance] Completed at position {base.Position}"); - - // 销毁自身 - Destroy(); + tmpThings.Clear(); } // 重写绘制方法,确保光束正确显示 @@ -246,27 +381,8 @@ namespace WulaFallenEmpire Comps_PostDraw(); } - public override void ExposeData() - { - base.ExposeData(); - - Scribe_Values.Look(ref startPosition, "startPosition"); - Scribe_Values.Look(ref endPosition, "endPosition"); - Scribe_Values.Look(ref moveDistance, "moveDistance"); - Scribe_Values.Look(ref useFixedDistance, "useFixedDistance"); - Scribe_Values.Look(ref flightSpeed, "flightSpeed", 1f); - Scribe_Values.Look(ref currentProgress, "currentProgress", 0f); - Scribe_Values.Look(ref altitude, "altitude", 20f); - Scribe_Values.Look(ref firesPerTick, "firesPerTick", 4); - Scribe_Values.Look(ref effectRadius, "effectRadius", 15f); - Scribe_Values.Look(ref durationTicks, "durationTicks", 600); - Scribe_Values.Look(ref ticksPassed, "ticksPassed", 0); - Scribe_Values.Look(ref hasStarted, "hasStarted", false); - Scribe_Values.Look(ref hasCompleted, "hasCompleted", false); - } - // 创建EnergyLance的静态方法 - public static EnergyLance MakeEnergyLance(ThingDef energyLanceDef, IntVec3 start, IntVec3 end, Map map, + public static EnergyLance MakeEnergyLance(ThingDef energyLanceDef, IntVec3 start, IntVec3 end, Map map, float distance = 15f, bool fixedDistance = true, int duration = 600, Pawn instigatorPawn = null) { EnergyLance energyLance = (EnergyLance)ThingMaker.MakeThing(energyLanceDef); @@ -276,10 +392,12 @@ namespace WulaFallenEmpire energyLance.useFixedDistance = fixedDistance; energyLance.durationTicks = duration; energyLance.instigator = instigatorPawn; - - GenSpawn.Spawn(energyLance, start, map); - - Log.Message($"[EnergyLance] Created {energyLanceDef.defName} from {start} to {end}"); + + // 直接在目标位置生成光束 + IntVec3 spawnPosition = end.IsValid ? end : start; + GenSpawn.Spawn(energyLance, spawnPosition, map); + + Log.Message($"[EnergyLance] Created {energyLanceDef.defName} at {spawnPosition}, target: {end}"); return energyLance; } } diff --git a/Source/WulaFallenEmpire/Ability/WULA_AbilityEnergyLance/EnergyLanceExtension.cs b/Source/WulaFallenEmpire/Ability/WULA_AbilityEnergyLance/EnergyLanceExtension.cs index a4ea5904..aaad95b9 100644 --- a/Source/WulaFallenEmpire/Ability/WULA_AbilityEnergyLance/EnergyLanceExtension.cs +++ b/Source/WulaFallenEmpire/Ability/WULA_AbilityEnergyLance/EnergyLanceExtension.cs @@ -9,9 +9,25 @@ namespace WulaFallenEmpire public float moveSmoothing = 0.1f; // 移动平滑度 (0-1),值越小越平滑 public int moteSpawnInterval = 3; // Mote生成间隔,值越大密度越低 public float moteScale = 0.8f; // Mote缩放比例 - + // 伤害配置 public int firesPerTick = 4; public float effectRadius = 15f; + + // 新增:移动速度配置 + public float flightSpeed = 5f; // 光束移动速度(格/秒) + public float acceleration = 2f; // 加速度 + public float maxSpeed = 10f; // 最大速度 + public float turnSpeed = 90f; // 转向速度(度/秒) + + // 移动模式配置 + public bool useDynamicMovement = true; // 使用动态追踪模式 + public bool snapToTarget = false; // 是否直接瞬移到目标 + public float snapDistance = 3f; // 瞬移触发距离 + + // 行为配置 + public bool hoverOverTarget = true; // 在目标上空悬停 + public float hoverAltitude = 20f; // 悬停高度 + public float attackRange = 15f; // 攻击范围 } -} +} \ No newline at end of file diff --git a/Source/WulaFallenEmpire/Ability/WULA_AbilitySurveillanceBombardment/CompBuildingBombardment.cs b/Source/WulaFallenEmpire/BuildingComp/WULA_BuildingBombardment/CompBuildingBombardment.cs similarity index 100% rename from Source/WulaFallenEmpire/Ability/WULA_AbilitySurveillanceBombardment/CompBuildingBombardment.cs rename to Source/WulaFallenEmpire/BuildingComp/WULA_BuildingBombardment/CompBuildingBombardment.cs diff --git a/Source/WulaFallenEmpire/Ability/WULA_AbilitySurveillanceBombardment/CompProperties_BuildingBombardment.cs b/Source/WulaFallenEmpire/BuildingComp/WULA_BuildingBombardment/CompProperties_BuildingBombardment.cs similarity index 100% rename from Source/WulaFallenEmpire/Ability/WULA_AbilitySurveillanceBombardment/CompProperties_BuildingBombardment.cs rename to Source/WulaFallenEmpire/BuildingComp/WULA_BuildingBombardment/CompProperties_BuildingBombardment.cs diff --git a/Source/WulaFallenEmpire/BuildingComp/WULA_EnergyLanceTurret/CompEnergyLanceTurret.cs b/Source/WulaFallenEmpire/BuildingComp/WULA_EnergyLanceTurret/CompEnergyLanceTurret.cs new file mode 100644 index 00000000..695f6bd9 --- /dev/null +++ b/Source/WulaFallenEmpire/BuildingComp/WULA_EnergyLanceTurret/CompEnergyLanceTurret.cs @@ -0,0 +1,646 @@ +using RimWorld; +using Verse; +using UnityEngine; +using System.Collections.Generic; +using System.Linq; + +namespace WulaFallenEmpire +{ + public class CompEnergyLanceTurret : ThingComp + { + public CompProperties_EnergyLanceTurret Props => (CompProperties_EnergyLanceTurret)props; + + // 状态变量 + private Pawn currentTarget; + private EnergyLance activeLance; + private int lastTargetUpdateTick; + private int warmupTicksRemaining; + private int cooldownTicksRemaining; + private bool isActive = false; + + // 位置追踪 + private IntVec3 lastTargetPosition; + private int lastPositionUpdateTick; + + // 调试计数器 + private int debugTickCounter = 0; + private const int DEBUG_LOG_INTERVAL = 120; // 每2秒输出一次调试信息 + + // 光束创建保护 + private int lanceCreationTick = -1; + private const int LANCE_GRACE_PERIOD = 60; // 光束创建后的保护期(1秒) + + // 目标丢失保护 + private int targetLostTick = -1; + private const int TARGET_LOST_GRACE_PERIOD = 60; // 目标丢失后的保护期(1秒) + + // 状态追踪 + private TurretState currentState = TurretState.Idle; + + private enum TurretState + { + Idle, // 待机 + WarmingUp, // 预热中 + Firing, // 发射中 + CoolingDown // 冷却中 + } + + public override void PostSpawnSetup(bool respawningAfterLoad) + { + base.PostSpawnSetup(respawningAfterLoad); + + if (!respawningAfterLoad) + { + ResetState(); + } + + Log.Message($"[EnergyLanceTurret] 炮塔生成在 {parent.Position}, 检测范围: {Props.detectionRange}"); + } + + // 在 StartEnergyLance 方法中修复光束创建逻辑 + private void StartEnergyLance() + { + // 双重检查目标有效性 + if (currentTarget == null || !IsTargetValid(currentTarget)) + { + Log.Warning($"[EnergyLanceTurret] 尝试启动能量光束但目标无效: {(currentTarget == null ? "目标为null" : "目标无效")}"); + + // 尝试重新寻找目标 + var potentialTargets = FindPotentialTargets(); + if (potentialTargets.Count > 0) + { + currentTarget = potentialTargets + .OrderBy(t => t.Position.DistanceTo(parent.Position)) + .First(); + Log.Message($"[EnergyLanceTurret] 重新获取目标: {currentTarget.LabelCap}"); + } + else + { + Log.Message("[EnergyLanceTurret] 无法重新获取目标,进入冷却"); + StartCooldown(); + return; + } + } + + try + { + // 创建能量光束 + var lanceDef = Props.energyLanceDef ?? ThingDef.Named("EnergyLance"); + if (lanceDef == null) + { + Log.Error("[EnergyLanceTurret] 能量光束定义为空!"); + StartCooldown(); + return; + } + + Log.Message($"[EnergyLanceTurret] 创建能量光束: {lanceDef.defName} 目标: {currentTarget.LabelCap} 在 {currentTarget.Position}"); + + // 关键修复:光束直接在目标位置生成,而不是建筑位置 + activeLance = EnergyLance.MakeEnergyLance( + lanceDef, + currentTarget.Position, // 起始位置设置为目标位置 + currentTarget.Position, // 目标位置也设置为目标位置 + parent.Map, + Props.energyLanceMoveDistance, + false, // 不使用固定距离 + Props.energyLanceDuration, + instigatorPawn: null // 建筑作为发起者 + ); + + if (activeLance == null) + { + Log.Error("[EnergyLanceTurret] 能量光束创建失败!"); + StartCooldown(); + return; + } + + // 设置光束保护期 + lanceCreationTick = Find.TickManager.TicksGame; + + // 设置建筑引用 + if (activeLance is EnergyLance lance) + { + lance.instigator = parent; + } + + lastTargetPosition = currentTarget.Position; + lastPositionUpdateTick = Find.TickManager.TicksGame; + targetLostTick = -1; // 重置目标丢失计时 + currentState = TurretState.Firing; + + // 立即更新光束位置,确保光束在正确位置开始 + UpdateEnergyLancePosition(); + + Log.Message($"[EnergyLanceTurret] 能量光束启动成功,追踪目标: {currentTarget.LabelCap}"); + } + catch (System.Exception ex) + { + Log.Error($"[EnergyLanceTurret] 启动能量光束错误: {ex}"); + StartCooldown(); + } + } + // 改进更新光束位置的方法 + private void UpdateEnergyLancePosition() + { + if (activeLance == null || activeLance.Destroyed) + return; + + // 如果有有效目标,更新光束位置 + if (currentTarget != null && IsTargetValid(currentTarget)) + { + // 向光束传递目标位置 + UpdateLanceTargetPosition(currentTarget.Position); + + // 添加更多调试信息 + if (debugTickCounter % 30 == 0) // 每0.5秒输出一次位置信息 + { + Log.Message($"[EnergyLanceTurret] 更新光束位置: 目标在 {currentTarget.Position}, 光束在 {activeLance.Position}"); + } + } + else if (lastTargetPosition.IsValid && Find.TickManager.TicksGame - lastPositionUpdateTick <= Props.targetUpdateInterval * 2) + { + // 使用最后已知位置 + UpdateLanceTargetPosition(lastTargetPosition); + } + else + { + // 传递空位置 + UpdateLanceTargetPosition(IntVec3.Invalid); + } + } + + public override void CompTick() + { + base.CompTick(); + + debugTickCounter++; + + if (parent.Destroyed || parent.Map == null) + return; + + // 定期输出调试信息 + if (debugTickCounter % DEBUG_LOG_INTERVAL == 0) + { + OutputDebugInfo(); + } + + // 根据状态处理逻辑 + switch (currentState) + { + case TurretState.CoolingDown: + HandleCoolingDown(); + break; + case TurretState.WarmingUp: + HandleWarmingUp(); + break; + case TurretState.Firing: + HandleFiring(); + break; + case TurretState.Idle: + HandleIdle(); + break; + } + } + + // 处理冷却状态 + private void HandleCoolingDown() + { + cooldownTicksRemaining--; + + if (debugTickCounter % 30 == 0) // 每0.5秒输出一次冷却信息 + { + Log.Message($"[EnergyLanceTurret] 冷却中: {cooldownTicksRemaining} ticks 剩余"); + } + + if (cooldownTicksRemaining <= 0) + { + Log.Message("[EnergyLanceTurret] 冷却完成,返回待机状态"); + currentState = TurretState.Idle; + isActive = false; + } + } + + // 处理预热状态 + private void HandleWarmingUp() + { + // 在预热过程中持续检查目标有效性 + if (currentTarget == null || !IsTargetValid(currentTarget)) + { + Log.Message($"[EnergyLanceTurret] 预热过程中目标失效,取消预热"); + ResetState(); + return; + } + + warmupTicksRemaining--; + + if (debugTickCounter % 10 == 0) // 每0.17秒输出一次预热信息 + { + Log.Message($"[EnergyLanceTurret] 预热中: {warmupTicksRemaining} ticks 剩余, 目标: {currentTarget?.LabelCap ?? "无"}"); + } + + if (warmupTicksRemaining <= 0) + { + Log.Message("[EnergyLanceTurret] 预热完成,开始发射光束"); + StartEnergyLance(); + } + } + + // 处理发射状态 + private void HandleFiring() + { + // 检查目标状态 + if (Find.TickManager.TicksGame - lastTargetUpdateTick >= Props.targetUpdateInterval) + { + UpdateTarget(); + lastTargetUpdateTick = Find.TickManager.TicksGame; + } + + // 更新光束位置 + if (activeLance != null && !activeLance.Destroyed) + { + UpdateEnergyLancePosition(); + } + + // 检查光束有效性 + CheckEnergyLanceValidity(); + } + + // 处理待机状态 + private void HandleIdle() + { + // 检查目标状态 + if (Find.TickManager.TicksGame - lastTargetUpdateTick >= Props.targetUpdateInterval) + { + UpdateTarget(); + lastTargetUpdateTick = Find.TickManager.TicksGame; + } + } + + // 输出调试信息 + private void OutputDebugInfo() + { + var targets = FindPotentialTargets(); + Log.Message($"[EnergyLanceTurret] 调试信息:"); + Log.Message($" - 状态: {currentState}"); + Log.Message($" - 当前目标: {currentTarget?.LabelCap ?? "无"}"); + Log.Message($" - 目标位置: {currentTarget?.Position.ToString() ?? "无"}"); + Log.Message($" - 活跃光束: {(activeLance != null && !activeLance.Destroyed ? "是" : "否")}"); + Log.Message($" - 检测到目标数: {targets.Count}"); + Log.Message($" - 冷却剩余: {cooldownTicksRemaining}"); + Log.Message($" - 预热剩余: {warmupTicksRemaining}"); + Log.Message($" - 是否活跃: {isActive}"); + Log.Message($" - 目标丢失保护: {(targetLostTick >= 0 ? (Find.TickManager.TicksGame - targetLostTick) + " ticks前" : "无")}"); + Log.Message($" - 光束保护期: {(lanceCreationTick >= 0 ? (Find.TickManager.TicksGame - lanceCreationTick) + " ticks前创建" : "无")}"); + + // 输出前3个检测到的目标 + for (int i = 0; i < Mathf.Min(3, targets.Count); i++) + { + var target = targets[i]; + Log.Message($" - 目标{i+1}: {target.LabelCap} 在 {target.Position}, 距离: {target.Position.DistanceTo(parent.Position):F1}"); + } + } + + // 重置状态 + private void ResetState() + { + currentTarget = null; + activeLance = null; + lastTargetUpdateTick = Find.TickManager.TicksGame; + warmupTicksRemaining = 0; + cooldownTicksRemaining = 0; + isActive = false; + lanceCreationTick = -1; + targetLostTick = -1; + currentState = TurretState.Idle; + } + + // 更新目标 + private void UpdateTarget() + { + Log.Message($"[EnergyLanceTurret] 更新目标检查 - 状态: {currentState}, 活跃光束: {(activeLance != null && !activeLance.Destroyed ? "是" : "否")}"); + + // 如果没有光束,寻找新目标 + if (activeLance == null || activeLance.Destroyed) + { + FindNewTarget(); + return; + } + + // 检查当前目标是否有效 + if (currentTarget != null && IsTargetValid(currentTarget)) + { + // 更新目标位置 + lastTargetPosition = currentTarget.Position; + lastPositionUpdateTick = Find.TickManager.TicksGame; + targetLostTick = -1; // 重置目标丢失计时 + Log.Message($"[EnergyLanceTurret] 目标仍然有效: {currentTarget.LabelCap}"); + return; + } + + // 当前目标无效,寻找新目标 + FindNewTargetForExistingLance(); + } + + // 寻找新目标(首次) + private void FindNewTarget() + { + Log.Message("[EnergyLanceTurret] 寻找新目标..."); + + if (currentState != TurretState.Idle) + { + Log.Message($"[EnergyLanceTurret] 无法寻找目标 - 当前状态: {currentState}"); + return; + } + + var potentialTargets = FindPotentialTargets(); + + if (potentialTargets.Count > 0) + { + // 选择最近的敌人 + currentTarget = potentialTargets + .OrderBy(t => t.Position.DistanceTo(parent.Position)) + .First(); + + Log.Message($"[EnergyLanceTurret] 发现新目标: {currentTarget.LabelCap} 在 {currentTarget.Position}"); + + // 开始预热 + StartWarmup(); + } + else + { + Log.Message("[EnergyLanceTurret] 没有发现有效目标"); + } + } + + // 为现有光束寻找新目标 + private void FindNewTargetForExistingLance() + { + if (activeLance == null || activeLance.Destroyed) + return; + + Log.Message("[EnergyLanceTurret] 为现有光束寻找新目标..."); + + var potentialTargets = FindPotentialTargets(); + + if (potentialTargets.Count > 0) + { + // 选择离光束最近的敌人 + currentTarget = potentialTargets + .OrderBy(t => t.Position.DistanceTo(activeLance.Position)) + .First(); + + lastTargetPosition = currentTarget.Position; + lastPositionUpdateTick = Find.TickManager.TicksGame; + targetLostTick = -1; // 重置目标丢失计时 + + Log.Message($"[EnergyLanceTurret] 切换到新目标: {currentTarget.LabelCap} 在 {currentTarget.Position}"); + } + else + { + // 没有目标,记录目标丢失时间 + if (targetLostTick < 0) + { + targetLostTick = Find.TickManager.TicksGame; + Log.Message($"[EnergyLanceTurret] 目标丢失,开始保护期: {TARGET_LOST_GRACE_PERIOD} ticks"); + } + + currentTarget = null; + lastTargetPosition = IntVec3.Invalid; + Log.Message("[EnergyLanceTurret] 没有有效目标,发送空位置"); + } + } + + // 寻找潜在目标 + private List FindPotentialTargets() + { + var targets = new List(); + var map = parent.Map; + + if (map == null) + return targets; + + // 获取所有在范围内的pawn + var allPawnsInRange = map.mapPawns.AllPawnsSpawned + .Where(p => p.Position.DistanceTo(parent.Position) <= Props.detectionRange) + .ToList(); + + foreach (var pawn in allPawnsInRange) + { + if (IsValidTarget(pawn) && CanShootAtTarget(pawn)) + { + targets.Add(pawn); + } + } + + return targets; + } + + // 检查目标是否有效 + private bool IsValidTarget(Pawn pawn) + { + if (pawn == null || pawn.Destroyed || !pawn.Spawned) + return false; + + if (pawn.Downed || pawn.Dead) + return false; + + // 检查派系关系 + if (pawn.Faction != null) + { + bool isHostile = pawn.HostileTo(parent.Faction); + bool isNeutral = !pawn.HostileTo(parent.Faction) && pawn.Faction != parent.Faction; + + if (Props.targetHostileFactions && isHostile) + return true; + else if (Props.targetNeutrals && isNeutral) + return true; + else + return false; + } + else + { + // 无派系的pawn,检查类型 + if (pawn.RaceProps.Animal && !Props.targetAnimals) + return false; + + if (pawn.RaceProps.IsMechanoid && !Props.targetMechs) + return false; + + return true; + } + } + + // 检查是否可以射击目标 + private bool CanShootAtTarget(Pawn target) + { + if (target == null) + return false; + + // 检查视线 + if (Props.requireLineOfSight) + { + return GenSight.LineOfSight(parent.Position, target.Position, parent.Map, skipFirstCell: true); + } + + return true; + } + + // 检查目标是否仍然有效 + private bool IsTargetValid(Pawn target) + { + return IsValidTarget(target) && + target.Position.DistanceTo(parent.Position) <= Props.detectionRange && + (!Props.requireLineOfSight || GenSight.LineOfSight(parent.Position, target.Position, parent.Map, skipFirstCell: true)); + } + + // 开始预热 + private void StartWarmup() + { + if (currentTarget == null) + { + Log.Warning("[EnergyLanceTurret] 尝试开始预热但没有目标"); + return; + } + + warmupTicksRemaining = Props.warmupTicks; + isActive = true; + currentState = TurretState.WarmingUp; + + Log.Message($"[EnergyLanceTurret] 开始预热: {warmupTicksRemaining} ticks, 目标: {currentTarget.LabelCap}"); + } + + // 更新光束目标位置 + private void UpdateLanceTargetPosition(IntVec3 targetPos) + { + if (activeLance == null || activeLance.Destroyed) + return; + + // 尝试直接转换为EnergyLance并调用方法 + if (activeLance is EnergyLance energyLance) + { + energyLance.UpdateTargetPosition(targetPos); + Log.Message($"[EnergyLanceTurret] 更新光束目标: {targetPos}"); + } + else + { + // 使用反射调用更新方法 + var moveMethod = activeLance.GetType().GetMethod("UpdateTargetPosition"); + if (moveMethod != null) + { + moveMethod.Invoke(activeLance, new object[] { targetPos }); + Log.Message($"[EnergyLanceTurret] 通过反射更新光束目标: {targetPos}"); + } + else + { + Log.Warning("[EnergyLanceTurret] 无法更新光束目标位置"); + } + } + } + + // 检查光束有效性 + private void CheckEnergyLanceValidity() + { + if (activeLance == null || activeLance.Destroyed) + { + // 光束已销毁,进入冷却 + Log.Message("[EnergyLanceTurret] 光束已销毁,开始冷却"); + StartCooldown(); + return; + } + + // 检查光束是否在保护期内 + if (lanceCreationTick >= 0 && Find.TickManager.TicksGame - lanceCreationTick < LANCE_GRACE_PERIOD) + { + // 光束还在保护期内,不检查销毁条件 + return; + } + + // 检查目标丢失保护期 + if (targetLostTick >= 0 && Find.TickManager.TicksGame - targetLostTick > TARGET_LOST_GRACE_PERIOD) + { + Log.Message("[EnergyLanceTurret] 目标丢失保护期结束,销毁光束"); + activeLance.Destroy(); + StartCooldown(); + return; + } + + // 检查光束是否长时间没有收到位置更新 + if (Find.TickManager.TicksGame - lastPositionUpdateTick > Props.targetUpdateInterval * 3) + { + Log.Message("[EnergyLanceTurret] 光束长时间未收到位置更新,销毁"); + activeLance.Destroy(); + StartCooldown(); + } + } + + // 开始冷却 + private void StartCooldown() + { + cooldownTicksRemaining = Props.cooldownTicks; + isActive = false; + currentTarget = null; + activeLance = null; + lanceCreationTick = -1; + targetLostTick = -1; + currentState = TurretState.CoolingDown; + + Log.Message($"[EnergyLanceTurret] 开始冷却: {cooldownTicksRemaining} ticks"); + } + + // 绘制检测范围 + public override void PostDraw() + { + base.PostDraw(); + + if (Find.Selector.IsSelected(parent)) + { + // 绘制检测范围 + GenDraw.DrawRadiusRing(parent.Position, Props.detectionRange, Color.red); + + // 绘制当前目标 + if (currentTarget != null && !currentTarget.Destroyed) + { + GenDraw.DrawLineBetween(parent.DrawPos, currentTarget.DrawPos, SimpleColor.Red, 0.2f); + GenDraw.DrawTargetHighlight(currentTarget.Position); + } + + // 绘制光束状态 + if (activeLance != null && !activeLance.Destroyed) + { + GenDraw.DrawLineBetween(parent.DrawPos, activeLance.DrawPos, SimpleColor.Yellow, 0.3f); + } + } + } + + public override void PostExposeData() + { + base.PostExposeData(); + + Scribe_References.Look(ref currentTarget, "currentTarget"); + Scribe_References.Look(ref activeLance, "activeLance"); + Scribe_Values.Look(ref lastTargetUpdateTick, "lastTargetUpdateTick", 0); + Scribe_Values.Look(ref warmupTicksRemaining, "warmupTicksRemaining", 0); + Scribe_Values.Look(ref cooldownTicksRemaining, "cooldownTicksRemaining", 0); + Scribe_Values.Look(ref isActive, "isActive", false); + Scribe_Values.Look(ref lastTargetPosition, "lastTargetPosition"); + Scribe_Values.Look(ref lastPositionUpdateTick, "lastPositionUpdateTick", 0); + Scribe_Values.Look(ref lanceCreationTick, "lanceCreationTick", -1); + Scribe_Values.Look(ref targetLostTick, "targetLostTick", -1); + Scribe_Values.Look(ref currentState, "currentState", TurretState.Idle); + } + + // 调试信息 + public override string CompInspectStringExtra() + { + string baseString = base.CompInspectStringExtra(); + string status = currentState.ToString(); + + string targetInfo = currentTarget != null ? $"\n目标: {currentTarget.LabelCap}" : ""; + string rangeInfo = $"\n检测范围: {Props.detectionRange}"; + + return string.IsNullOrEmpty(baseString) ? + $"{status}{targetInfo}{rangeInfo}" : + $"{baseString}\n{status}{targetInfo}{rangeInfo}"; + } + } +} diff --git a/Source/WulaFallenEmpire/BuildingComp/WULA_EnergyLanceTurret/CompProperties_EnergyLanceTurret.cs b/Source/WulaFallenEmpire/BuildingComp/WULA_EnergyLanceTurret/CompProperties_EnergyLanceTurret.cs new file mode 100644 index 00000000..54c8082a --- /dev/null +++ b/Source/WulaFallenEmpire/BuildingComp/WULA_EnergyLanceTurret/CompProperties_EnergyLanceTurret.cs @@ -0,0 +1,36 @@ +using RimWorld; +using Verse; + +namespace WulaFallenEmpire +{ + public class CompProperties_EnergyLanceTurret : CompProperties + { + // 光束配置 + public ThingDef energyLanceDef; // EnergyLance 定义 + public int energyLanceDuration = 600; // 光束持续时间 + public float energyLanceMoveDistance = 15f; // 光束移动距离 + + // 目标检测配置 + public float detectionRange = 30f; // 检测范围 + + // 使用现有的 RimWorld 目标类型 + public bool targetHostileFactions = true; // 目标敌对派系 + public bool targetNeutrals = false; // 目标中立单位 + public bool targetAnimals = false; // 目标动物 + public bool targetMechs = true; // 目标机械单位 + public bool requireLineOfSight = false; // 需要视线 + + // 锁定配置 + public int targetUpdateInterval = 60; // 目标更新间隔(ticks) + public float targetSwitchRange = 25f; // 切换目标的最大距离 + + // 光束生成配置 + public int warmupTicks = 30; // 预热时间 + public int cooldownTicks = 120; // 冷却时间 + + public CompProperties_EnergyLanceTurret() + { + compClass = typeof(CompEnergyLanceTurret); + } + } +} diff --git a/Source/WulaFallenEmpire/WulaDefOf.cs b/Source/WulaFallenEmpire/WulaDefOf.cs index 32c96501..0c2f2c33 100644 --- a/Source/WulaFallenEmpire/WulaDefOf.cs +++ b/Source/WulaFallenEmpire/WulaDefOf.cs @@ -63,4 +63,16 @@ namespace WulaFallenEmpire DefOfHelper.EnsureInitializedInCtor(typeof(WulaStatCategoryDefOf)); } } + + [DefOf] + public static class WulaDamageDefOf + { + public static DamageDef Wula_Dark_Matter_Flame; + + static WulaDamageDefOf() + { + DefOfHelper.EnsureInitializedInCtor(typeof(WulaDamageDefOf)); + } + } + } diff --git a/Source/WulaFallenEmpire/WulaFallenEmpire.csproj b/Source/WulaFallenEmpire/WulaFallenEmpire.csproj index 612883ea..ce6ffd2e 100644 --- a/Source/WulaFallenEmpire/WulaFallenEmpire.csproj +++ b/Source/WulaFallenEmpire/WulaFallenEmpire.csproj @@ -81,12 +81,14 @@ - - - - - + + + + + + + diff --git a/美术与文本源文件/Wula/Building/WULA_Surveillance_Building.sai2 b/美术与文本源文件/Wula/Building/WULA_Surveillance_Building.sai2 new file mode 100644 index 00000000..ccb18dc1 Binary files /dev/null and b/美术与文本源文件/Wula/Building/WULA_Surveillance_Building.sai2 differ diff --git a/美术与文本源文件/Wula/UI/Abilities/WULA_Firepower_Minigun_Strafe.sai2 b/美术与文本源文件/Wula/UI/Abilities/WULA_Firepower_Minigun_Strafe.sai2 new file mode 100644 index 00000000..ad72f684 Binary files /dev/null and b/美术与文本源文件/Wula/UI/Abilities/WULA_Firepower_Minigun_Strafe.sai2 differ diff --git a/美术与文本源文件/Wula/UI/Abilities/WULA_Spawn_Striker_Missile.sai2 b/美术与文本源文件/Wula/UI/Abilities/WULA_Spawn_Striker_Missile.sai2 index f5b302a9..ad016f10 100644 Binary files a/美术与文本源文件/Wula/UI/Abilities/WULA_Spawn_Striker_Missile.sai2 and b/美术与文本源文件/Wula/UI/Abilities/WULA_Spawn_Striker_Missile.sai2 differ