diff --git a/1.6/1.6/Assemblies/WulaFallenEmpire.dll b/1.6/1.6/Assemblies/WulaFallenEmpire.dll
index 4768d82b..6ad6fb6f 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/DamageDefs/Damages_Wula.xml b/1.6/1.6/Defs/DamageDefs/Damages_Wula.xml
index c43de112..a97e6863 100644
--- a/1.6/1.6/Defs/DamageDefs/Damages_Wula.xml
+++ b/1.6/1.6/Defs/DamageDefs/Damages_Wula.xml
@@ -60,7 +60,108 @@
25
Explosion_Bomb
-
+
+
+ WULA_Armour_Piercing_Projectile_1_Damage
+ 穿甲钢针
+ WulaFallenEmpire.DamageWorker_ExtraDamage
+ 15
+
+
+
+
+
+
+ WULA_Armour_Piercing_Projectile_2_Damage
+ 穿甲钢针
+ WulaFallenEmpire.DamageWorker_ExtraDamage
+ 30
+
+
+
+
+
+
+ WULA_Armour_Piercing_Projectile_3_Damage
+ 穿甲钢针
+ WulaFallenEmpire.DamageWorker_ExtraDamage
+ 50
+
+
+
+
+
+
+ WULA_Armour_Piercing_Projectile_4_Damage
+ 穿甲钢针
+ WulaFallenEmpire.DamageWorker_ExtraDamage
+ 100
+
+
+
+
+
+
Wula_Psi_Damage
true
diff --git a/1.6/1.6/Defs/Effects/WulaFleckDefs.xml b/1.6/1.6/Defs/Effects/WulaFleckDefs.xml
index fa4885d3..638d8176 100644
--- a/1.6/1.6/Defs/Effects/WulaFleckDefs.xml
+++ b/1.6/1.6/Defs/Effects/WulaFleckDefs.xml
@@ -19,18 +19,27 @@
-
+
WULA_GunTail_Lighting
Projectile
- 0.50
+
1
1.2
- 0.005
+ 0.1
Wula/Mote/WULA_Lighting_Beam
MoteGlow
(113,165,225,255)
- (0.5,2)
+ (0.75,2)
+
+
+
+ WULA_GunTail_Lighting_Small
+ 1
+ 0.25
+ 0.25
+
+ (0.3,2)
diff --git a/1.6/1.6/Defs/QuestScriptDefs/WULA_P_Mission_Attack_Camp.xml b/1.6/1.6/Defs/QuestScriptDefs/WULA_P_Mission_Attack_Camp.xml
deleted file mode 100644
index 8cd50d21..00000000
--- a/1.6/1.6/Defs/QuestScriptDefs/WULA_P_Mission_Attack_Camp.xml
+++ /dev/null
@@ -1,1332 +0,0 @@
-
-
-
- WULA_P_Mission_Attack_Camp
- 0
- false
- true
- 3
- true
- false
-
-
-
- questName->WULA_P_Mission_Attack_Camp_questName
-
-
-
-
- QuestHospitalityCommon
-
-
- questDescription->WULA_P_Mission_Attack_Camp_questDescription
-
-
-
-
-
-
- Util_RandomizePointsChallengeRating
-
- 1.5
- 2
-
-
-
-
- Util_AdjustPointsForDistantFight
-
-
-
- true
-
-
-
- siteTile
- true
- 0.5
-
- Oasis
- Lake
- LakeWithIsland
- LakeWithIslands
- Pond
- DryLake
- ToxicLake
- Wetland
- HotSprings
- Archipelago
- CoastalIsland
- Peninsula
- Bay
- Valley
- Cavern
- Chasm
- Cliffs
- Hollow
- TerraformingScar
- LavaLake
- Dunes
- AncientHeatVent
-
-
-
-
- sitePartDefs
- siteFaction
-
- BanditCamp
-
- $asker
-
-
-
- $siteTile
- $siteFaction
- $sitePartDefs
- sitePartsParams
-
-
-
- sitePoints
- $sitePartsParams
-
-
- Util_GetDefaultRewardValueFromPoints
-
-
- $sitePoints
-
-
-
-
-
- $rewardValue
- 1.75
- rewardValue
-
-
-
- Util_GenerateSite
-
-
-
- $site
-
-
-
- $site
- true
- $(randInt(12,28)*60000)
- site.MapGenerated
- true
-
-
-
- Quest expired: [resolvedQuestName]
- The bandit camp has packed up and moved on. The quest [resolvedQuestName] has expired.
-
-
- Fail
-
-
-
-
-
-
-
- site.Destroyed
-
-
-
- Quest failed: [resolvedQuestName]
- After being discovered, the bandit camp has dispersed. The quest [resolvedQuestName] has ended.
-
-
- Fail
-
-
-
-
-
-
- site.AllEnemiesDefeated
-
-
-
- $site
-
-
-
- true
- true
- ChosenPawnForReward
-
- true
- Payment arrived
- You have defeated the bandit camp!\n\nThe payment from [asker_faction_name] has arrived.
-
- ChoosePawn
- [asker_faction_royalFavorLabel]
- These colonists participated in the victory for the quest [resolvedQuestName]. [asker_definite] wants to know who should receive the [royalFavorReward_amount] [asker_faction_royalFavorLabel] for this service.
- $site
- ChosenPawnForReward
-
-
-
-
-
-
- site.AllEnemiesDefeated
- Success
-
-
-
-
-
-
- WULA_Recycle_PIA_Legion_File_UI_1
- 未知通讯
- Wula/Events/Portraits/WULA_Legion_3
- 「军团」,P.I.A
-
- 我现在没时间。\n\n这样吧,你们帮我做一件事,成功之后我就绕过程序给你们批复三级殖民地许可,如何?
-
-
-
- 要做什么?
- false
- false
- 我们还在追查保险箱下落,现在还不行
-
-
- WULA_Recycle_PIA_Legion_File_Lock
-
-
-
-
-
-
- WULA_Recycle_PIA_Legion_File_UI_2
-
-
-
-
-
-
-
- 现在不是太合适···
- false
-
-
-
-
- Wula_UI_Legion_1
-
-
-
-
-
-
-
-
-
- WULA_Recycle_PIA_Legion_File_UI_2
- 未知通讯
- Wula/Events/Portraits/WULA_Legion_1
- 「军团」,P.I.A
-
- 我要你们,在5天内帮我回收一个东西。\n\n一个黑色的保险箱,现在正在一支敌对乌拉帝国叛军手中,里面有关于皇室的很重要的资料,你们必须确保这个保险箱的安全——如果它被打开了,就要杀死在场的所有人。\n\n里面的东西一定不能泄露。
-
-
-
-
-
- WULA_Recycle_PIA_Legion_File_UI_7_Triggerd
- 0
- Int
-
-
-
-
-
-
- 叛军?我们可从来没听说过有叛军在这个星球上···
- false
-
-
-
-
- WULA_Recycle_PIA_Legion_File_UI_3
-
-
-
-
-
-
-
- 我们准备好了,告诉我们位置吧
- false
-
-
-
-
- WULA_Recycle_PIA_Legion_File_Lock
- 1800000
-
-
- WULA_Recycle_PIA_Legion_File
-
-
-
-
-
-
-
- 现在不是太合适···
- false
-
-
-
-
- Wula_UI_Legion_1
-
-
-
-
-
-
-
-
-
- WULA_Recycle_PIA_Legion_File_UI_3
- 未知通讯
- Wula/Events/Portraits/WULA_Legion_4
- 「军团」,P.I.A
-
- 你们知道进步派吗?这些反贼的存在目前还不是很多人知道。\n\n她们是乌拉帝国内部的分裂势力,正在密谋推翻皇室。现在整个银河系的安全部门都在追查这些人的下落,她们对知识分子和底层的渗透相当严重——这次被夺走的盒子中就有关乎到皇室安全的机密,不能让进步派成功获得里面的内容。
-
-
-
- 明白了···
- false
-
-
-
-
- WULA_Recycle_PIA_Legion_File_UI_2
-
-
-
-
-
-
-
-
-
- WULA_GiveQuest_Recycle_PIA_Legion_File
- GiveQuest
- 回收文件
-
- Map_PlayerHome
-
- WULA_Recycle_PIA_Legion_File
- IncidentWorker_GiveQuest
- 0
- True
-
-
- WULA_Recycle_PIA_Legion_File
- 0
- true
- true
- 4
- true
- false
-
-
-
- questName->WULA_Recycle_PIA_Legion_File_questName
-
-
-
-
- QuestHospitalityCommon
-
-
- questDescription->WULA_Recycle_PIA_Legion_File_questDescription
-
-
-
-
-
-
-
-
- WULA_Recycle_PIA_Legion_File_Reward
- recycleReward
-
-
-
-
-
- WULA_Safe_Box_For_Mission
-
-
-
-
-
-
- WULA_Hostile_Progressive_Outpost
- 1
-
-
- 5
- 10
- Wula/World/WorldObjects/Expanding/WULA_Progressive_Faction
- Wula/World/WorldObjects/Expanding/WULA_Progressive_Faction
- ProgressiveOutpost
-
-
- 5
- 10
-
-
-
-
-
- WULA_Safe_Box_For_Mission
- 1
- 600
- HandleSuccess
- HandleFailed
- true
- true
-
-
-
- HandleSuccess
-
-
-
- HandleSuccess
- WULA_Recycle_PIA_Legion_File_UI_10
-
-
- $recycleReward
-
-
- Success
- true
-
-
-
-
-
-
- 300000
-
-
-
-
- Handle_Outtime
-
-
-
-
-
-
- Handle_Outtime
-
-
-
- 保险箱失踪
- 你的上司委托你去寻找的保险箱已经失去信号了,舰队需要一些时间才能重新追踪盒子
- NegativeEvent
-
-
- Wula_PIA_Legion_Faction
- -50
- WULA_Recycle_PIA_Legion_File_Handle_Outtime
-
-
- Fail
-
-
-
-
-
-
-
-
- WULA_Recycle_PIA_Legion_File_Handle_Outtime
- 让重要机密流失
-
-
- WULA_Recycle_PIA_Legion_File_Reward
-
-
-
- 1
-
-
-
-
- Techprint_SP_WULA_Colony_License_LV3_Technology
-
-
- 1
-
-
-
-
-
-
-
- WULA_Recycle_PIA_Legion_File_UI_5
- 未知通讯
-
- 保险箱
-
- 一个通体漆黑的保险箱静静地躺在地上,多层鎏金花雕和显眼的铁十字凤凰证明其曾属于身份显贵之人,信号追踪器则毫无疑问地指向它——这就是那个和皇室相关的保险箱。看起来,进步派的叛军使用编织体的切割束将其锁头破坏了,但是这个切割手法非常的粗糙,导致里面传来阵阵焦香,或许已经不剩什么了。
-
-
-
- 打开看看
- false
-
-
-
-
- WULA_Recycle_PIA_Legion_File_UI_6
-
-
-
-
-
-
-
- 收起来
- false
-
-
-
-
-
-
-
-
-
-
-
- WULA_Recycle_PIA_Legion_File_UI_6
- 未知通讯
-
- 保险箱
-
- 里面已经一团乱麻,切割束确实暴力地扫过了整个保险箱内壁,半反射的内壁使得离子束在里面不断撞击,烧毁了绝大部分内容。\n\n在焦炭中,一个银色的人造物在熠熠生辉,似乎是一个经过特别加固的记录仪,记录了某些全息影像。
-
-
-
- 播放内容
- true
- (111,223,255,225)
- (158,242,255,255)
-
-
-
-
- WULA_Recycle_PIA_Legion_File_UI_7
-
-
-
-
-
-
-
- 当作没看见
- false
-
-
-
-
-
-
-
-
-
-
-
- WULA_Recycle_PIA_Legion_File_UI_7
- 未知通讯
- Wula/Events/Portraits/WULA_Legion_2
- 「军团」,P.I.A
-
- (投影画面上根本不是什么皇室秘闻,而是你的上司和另一个人的通话)\n\n···我现在抽不开身,行星封锁机关的舰队要在这边对整片星区施加存在压力,以推进这片星区的殖民任务。皇宫那边的事情我听说了,现在国教教会秘不发丧,皇宫区的秩序短时间内应该不会出现大的波澜——如果皇宫区真的突生变化,我会带着舰队回去增援的。\n\n你们在搞的小把戏我已经知道了,你们想把皇家机械行会踢出局再顺手给她们扣顶高帽,但是现在皇家机械行会立场不明,最好不要轻举妄动。\n\n就这样了,乌拉帝国现在正处于暴风雨前的宁静,希望我们都还能在彼端相见。
-
-
-
-
-
-
- WULA_Recycle_PIA_Legion_File_UI_7_Triggerd
- 1
- Add
-
-
-
-
-
-
- 关闭
- false
-
-
-
-
-
-
-
-
-
-
-
- WULA_Recycle_PIA_Legion_File_UI_10
- 未知通讯
- Wula/Events/Portraits/WULA_Legion_1
- 「军团」,P.I.A
-
- 不错,虽然已经被切割束烧的变形了,但是最终还是回收成功了。那么,看过这个保险箱的人都死了吗?
-
-
-
-
-
- Wula_Has_Receive_Reinforcement_From_PIA
-
-
- Wula_Has_Receive_MechWula_From_PIA
-
-
- Wula_Has_Receive_Silver_From_PIA
-
-
-
- Wula_Reinforcement_From_PIA_Level
- 1
- Add
-
-
-
-
-
-
- 看过的人已经命丧黄泉了
- false
- true
-
-
- WULA_Recycle_PIA_Legion_File_UI_7_Triggerd
- 0
-
-
-
-
-
-
- WULA_Recycle_PIA_Legion_File_UI_11
-
-
-
-
-
-
-
- 是的,我们遵守指示将叛军屠杀殆尽(避重就轻)
- false
- true
-
-
- WULA_Recycle_PIA_Legion_File_UI_7_Triggerd
- 1
-
-
-
-
-
-
- WULA_Recycle_PIA_Legion_File_UI_12
-
-
-
-
-
-
-
-
-
- WULA_Recycle_PIA_Legion_File_UI_11
- 未知通讯
- Wula/Events/Portraits/WULA_Legion_2
- 「军团」,P.I.A
-
- 好,看起来你们赶在她们把里面的内容取出来之前就杀了她们,干得不错。\n\n就像我之前承诺的那样,我会给你们的殖民地开一道绿灯,跳过繁琐的审查,将殖民地评级提升到三级,开放行星封锁机关的所有武器和建筑的使用权限。\n\n此外,我也将你们的支援系统重置了,你们可以再次申请之前申请过的支援,并且新的支援也会开放给你们。\n\n帝国荣光永存。
-
-
-
- 帝国荣光永存
- false
-
-
-
-
-
-
-
-
-
-
-
- WULA_Recycle_PIA_Legion_File_UI_12
- 未知通讯
- Wula/Events/Portraits/WULA_Legion_1
- 「军团」,P.I.A
-
- 是吗······\n\n那,就像我之前承诺的那样,我会给你们的殖民地开一道绿灯,跳过繁琐的审查,将殖民地评级提升到三级,开放行星封锁机关的所有武器和建筑的使用权限。\n\n此外,我也将你们的支援系统重置了,你们可以再次申请之前申请过的支援,并且新的支援也会开放给你们。\n\n帝国荣光永存。
-
-
-
- 帝国荣光永存
- false
-
-
-
-
-
-
-
-
-
-
-
-
- WULA_Hostile_Progressive_Outpost
- 乌拉帝国进步派哨站
- true
- (42, 1, 42)
- true
- 0
-
-
- WULA_Hostile_Progressive_Outpost_LootBox
- WULA_Awakened_Synth
- 可疑的乌拉帝国编织体
- 这个原本用于生产材料的乌拉帝国编织体正在使用其高能切割刀切割一个质地坚硬的保险箱——但是保险箱纹丝不动。
-
-
- Open_WULA_Hostile_Progressive_Outpost_LootBox
- Open
-
-
- BoxIsOpened
-
-
-
-
- (21,0,19)
- LootBox
- 100
- CQF_Open
- false
-
-
- WULA_Safe_Box
- 1
- 你的殖民者停用了编织体,外壳滚烫的保险箱掉了出来
-
-
- WULA_Safe_Box_For_Mission
-
-
-
-
-
-
-
-
- (25, 0, 20)
-
-
- WULA_Hostile_Defender
- WULA_Hostile_Progressive_Light_Unit
- true
- WULA_Defender_Group
- 1
- AncientsHostile
- DefendBase
- MapGeneration
-
-
-
-
- (22, 0, 17)
-
-
- WULA_Hostile_Defender
- WULA_Hostile_Progressive_Light_Unit
- true
- WULA_Defender_Group
- 1
- AncientsHostile
- DefendBase
- MapGeneration
-
-
-
-
- (25, 0, 23)
-
-
- WULA_Hostile_Defender
- WULA_Hostile_Progressive_Light_Unit
- true
- WULA_Defender_Group
- 1
- AncientsHostile
- DefendBase
- MapGeneration
-
-
-
-
- (19, 0, 17)
-
-
- WULA_Hostile_Defender
- WULA_Hostile_Progressive_Light_Unit
- true
- WULA_Defender_Group
- 1
- AncientsHostile
- DefendBase
- MapGeneration
-
-
-
-
- (22, 0, 26)
-
-
- WULA_Hostile_Defender
- WULA_Hostile_Progressive_Light_Unit
- true
- WULA_Defender_Group
- 1
- AncientsHostile
- DefendBase
- MapGeneration
-
-
-
-
- (16, 0, 20)
-
-
- WULA_Hostile_Defender
- WULA_Hostile_Progressive_Light_Unit
- true
- WULA_Defender_Group
- 1
- AncientsHostile
- DefendBase
- MapGeneration
-
-
-
-
- (16, 0, 23)
-
-
- WULA_Hostile_Defender
- WULA_Hostile_Progressive_Light_Unit
- true
- WULA_Defender_Group
- 1
- AncientsHostile
- DefendBase
- MapGeneration
-
-
-
-
- (19, 0, 26)
-
-
- WULA_Hostile_Defender
- WULA_Hostile_Progressive_Light_Unit
- true
- WULA_Defender_Group
- 1
- AncientsHostile
- DefendBase
- MapGeneration
-
-
-
-
- (25, 0, 11)
-
-
- WULA_Hostile_Defender_Cat
- WULA_Hostile_Progressive_Light_Unit
- true
- WULA_Defender_Group
- 1
- AncientsHostile
- DefendBase
- MapGeneration
-
-
-
-
- (31, 0, 17)
-
-
- WULA_Hostile_Defender_Cat
- WULA_Hostile_Progressive_Light_Unit
- true
- WULA_Defender_Group
- 1
- AncientsHostile
- DefendBase
- MapGeneration
-
-
-
-
- (16, 0, 11)
-
-
- WULA_Hostile_Defender_Cat
- WULA_Hostile_Progressive_Light_Unit
- true
- WULA_Defender_Group
- 1
- AncientsHostile
- DefendBase
- MapGeneration
-
-
-
-
- (31, 0, 26)
-
-
- WULA_Hostile_Defender_Cat
- WULA_Hostile_Progressive_Light_Unit
- true
- WULA_Defender_Group
- 1
- AncientsHostile
- DefendBase
- MapGeneration
-
-
-
-
- (25, 0, 32)
-
-
- WULA_Hostile_Defender_Cat
- WULA_Hostile_Progressive_Light_Unit
- true
- WULA_Defender_Group
- 1
- AncientsHostile
- DefendBase
- MapGeneration
-
-
-
-
- (10, 0, 17)
-
-
- WULA_Hostile_Defender_Cat
- WULA_Hostile_Progressive_Light_Unit
- true
- WULA_Defender_Group
- 1
- AncientsHostile
- DefendBase
- MapGeneration
-
-
-
-
- (16, 0, 32)
-
-
- WULA_Hostile_Defender_Cat
- WULA_Hostile_Progressive_Light_Unit
- true
- WULA_Defender_Group
- 1
- AncientsHostile
- DefendBase
- MapGeneration
-
-
-
-
- (10, 0, 26)
-
-
- WULA_Hostile_Defender_Cat
- WULA_Hostile_Progressive_Light_Unit
- true
- WULA_Defender_Group
- 1
- AncientsHostile
- DefendBase
- MapGeneration
-
-
-
-
-
-
- RoofConstructed
-
- (12,13,29,30)
- (17,10,24,12)
- (9,18,11,25)
- (30,18,32,25)
- (17,31,24,33)
-
-
-
-
-
- WulaFloor
-
- (17,10,24,33)
- (15,13,16,30)
- (12,16,14,27)
- (9,18,11,25)
- (25,13,26,30)
- (27,16,29,27)
- (30,18,32,25)
-
-
-
-
-
- WULA_Machine_Recharger
- AncientsHostile
- (21,0,23)
-
-
- WULA_Charging_Station_Synth
- AncientsHostile
-
- (20,19,20,19)
- (22,19,22,19)
-
-
-
- WulaWall
- AncientsHostile
-
- (17,10,24,10)
- (15,13,19,13)
- (12,16,15,16)
- (9,18,10,18)
- (17,11,17,11)
- (15,14,15,15)
- (12,17,12,20)
- (9,19,9,25)
- (19,14,19,16)
- (13,20,15,20)
- (22,13,26,13)
- (12,23,15,23)
- (22,14,22,16)
- (19,18,22,18)
- (17,20,17,23)
- (24,11,24,11)
- (12,24,12,27)
- (10,25,10,25)
- (26,14,26,16)
- (13,27,15,27)
- (24,20,24,23)
- (27,16,29,16)
- (19,25,22,25)
- (15,28,15,30)
- (26,20,29,20)
- (19,27,19,30)
- (29,17,29,19)
- (16,30,18,30)
- (26,23,29,23)
- (22,27,22,30)
- (31,18,32,18)
- (17,32,17,33)
- (32,19,32,25)
- (26,27,29,27)
- (18,33,24,33)
- (29,24,29,26)
- (23,30,26,30)
- (26,28,26,29)
- (31,25,31,25)
- (24,32,24,32)
-
-
-
- Table1x2c
- WULA_Alloy
- AncientsHostile
- (18,0,21)
-
-
- DiningChair
- Uranium
- AncientsHostile
- (18,0,20)
-
-
- DiningChair
- Uranium
- 2
- AncientsHostile
- (18,0,23)
-
-
- WULA_Wall_Flag_Building
- 3
- AncientsHostile
-
- (25,20,25,20)
- (25,23,25,23)
-
-
-
- HiddenConduit
- AncientsHostile
-
- (19,17,19,17)
- (16,20,16,20)
- (22,17,22,17)
- (16,23,16,23)
- (25,20,25,20)
- (19,26,19,26)
- (25,23,25,23)
- (22,26,22,26)
-
-
-
- WULA_Wall_Flag_Building
- AncientsHostile
-
- (19,17,19,17)
- (22,17,22,17)
-
-
-
- Sandbags
- Cloth
- AncientsHostile
-
- (7,8,10,8)
- (7,9,7,11)
- (17,17,17,18)
- (16,18,16,18)
- (24,17,24,18)
- (16,25,17,25)
- (25,18,25,18)
- (17,26,17,26)
- (31,8,34,8)
- (7,32,7,35)
- (24,25,25,25)
- (34,9,34,11)
- (24,26,24,26)
- (8,35,10,35)
- (34,32,34,35)
- (31,35,33,35)
-
-
-
- WULA_Wall_Flag_Building
- 2
- AncientsHostile
-
- (19,26,19,26)
- (22,26,22,26)
-
-
-
- WULA_Wall_Flag_Building
- 1
- AncientsHostile
-
- (16,20,16,20)
- (16,23,16,23)
-
-
-
- Wula_Fusion_Generators
- AncientsHostile
- 29.432827
-
- (17,15,17,15)
- (14,18,14,18)
- (24,15,24,15)
- (14,25,14,25)
- (27,18,27,18)
- (17,28,17,28)
- (27,25,27,25)
- (24,28,24,28)
-
-
-
- Turret_MiniTurret
- Steel
- AncientsHostile
- 60
-
- (16,17,16,17)
- (25,17,25,17)
- (16,26,16,26)
- (25,26,25,26)
-
-
-
- Wula_Base_Laser_Turret
- AncientsHostile
-
- (13,14,13,14)
- (28,14,28,14)
- (13,29,13,29)
- (28,29,28,29)
-
-
-
- TrapIED_Incendiary
- AncientsHostile
-
- (18,12,18,12)
- (11,19,11,19)
- (23,12,23,12)
- (11,24,11,24)
- (30,19,30,19)
- (18,31,18,31)
- (30,24,30,24)
- (23,31,23,31)
-
-
-
- WulaDoor
- AncientsHostile
-
- (11,18,11,18)
- (11,25,11,25)
- (30,18,30,18)
- (30,25,30,25)
-
-
-
- WulaDoor
- 1
- AncientsHostile
-
- (17,12,17,12)
- (24,12,24,12)
- (17,31,17,31)
- (24,31,24,31)
-
-
-
- WULA_Cat_Bunker
- AncientsHostile
-
- (9,10,9,10)
- (32,10,32,10)
- (9,33,9,33)
- (32,33,32,33)
-
-
-
-
-
- WULA_Hostile_Progressive_Outpost_LootBox
- 可疑的乌拉帝国编织体
- 这个原本用于生产材料的乌拉帝国编织体正在使用其高能切割刀切割一个质地坚硬的保险箱——但是保险箱纹丝不动。
- QuestEditor_Library.LootBox
- Building
- true
- false
- Normal
- Building
- true
-
- -5
-
-
- Graphic_Multi
- Wula/Building/WULA_Cube_Productor
-
-
- true
- false
-
-
-
- WULA_Safe_Box_For_Mission
- 乌拉帝国保险箱
- 印有乌拉帝国凤凰标志的保险箱,是你的上司要求你回收的东西。因为编织仪的持续切割,多层合金锁貌似已经坏掉了。\n\n<color=#BD2F31><i>不要偷看。</i></color>
- ThingWithComps
- Item
- MapMeshOnly
- false
- false
- true
-
- Wula/Item/WULA_Safe_Box_For_Mission
- Graphic_Single
-
- 1
-
- 0
- 0
- 0
- 8650000
- 0.3
- 450
-
- Item
- Rare
-
- ResourcesRaw
-
- true
- 14
- 200
- 0
- None
- Last
- true
- 1
-
-
-
-
- 检查保险箱···
- UseItem
-
-
-
- WULA_Recycle_PIA_Legion_File_UI_5
- false
-
-
-
-
\ No newline at end of file
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 a1a3cacc..116551dc 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
@@ -766,10 +766,10 @@
5.9
75
1
- 0.1
WULA_MW_Mass_Drivers_Shootingsound
GunTail_Heavy
18
+ false
@@ -783,7 +783,8 @@
0
true
WULA_GunTail_Lighting
- Bullet_WULA_WM_Panzer_Turret_Hit
+ 0
+ Bullet_WULA_RW_Fractal_RF_Hit
Normal
@@ -797,72 +798,14 @@
- Bullet
- 180
- 220
+ WULA_Armour_Piercing_Projectile_4_Damage
+ 100
+ 180
2
- 3.5
- Artillery_HitThickRoof
- MortarBomb_Explode
- MortarRound_PreImpact
MortarRound_Ambient
10
-
-
- WULA_GunTail_Lighting
- 5
-
-
-
- Bullet_WULA_WM_Panzer_Turret_Hit
-
-
- SubEffecter_SprayerTriggered
- 0.1
- WULA_Mote_halo
- 1~1
- 0.4~0.8
- 0.05~0.05
- OnSource
- (255,255,255)
-
-
- SubEffecter_SprayerTriggered
- 0.02
- WULA_Mote_halo
- 1~1
- 0.3~0.4
- 5~10
- 0.1~0.2
- OnSource
- (255,255,255)
-
-
- SubEffecter_SprayerTriggered
- WULA_Mote_ChargeLanceShot
- 6~12
- 0.4~0.8
- 20~40
- 135~225
- 0.01
- OnSource
-
-
- SubEffecter_SprayerTriggered
- WULA_Mote_ChargeLanceShot
- 5~9
- 0.4~0.8
- 10~20
- 135~225
- 0.01
- OnSource
-
-
- 0.25~0.25
- 0.1
-
diff --git a/1.6/1.6/Defs/ThingDefs_Misc/Weapons/WULA_FE_Machine_Weapon.xml b/1.6/1.6/Defs/ThingDefs_Misc/Weapons/WULA_FE_Machine_Weapon.xml
index b3eddfe2..b60848d7 100644
--- a/1.6/1.6/Defs/ThingDefs_Misc/Weapons/WULA_FE_Machine_Weapon.xml
+++ b/1.6/1.6/Defs/ThingDefs_Misc/Weapons/WULA_FE_Machine_Weapon.xml
@@ -154,47 +154,47 @@
Bullet_Wula_MR_Mobile_Factory_Turret
0
32
- 3
- 0.1
- 6
- 6
- Shot_ChargeRifle
- GunTail_Medium
+ 4
+ 1
+ 4
+ WULA_MW_Mass_Drivers_Shootingsound
+ GunTail_Heavy
9
true
true
true
+ false
Bullet_Wula_MR_Mobile_Factory_Turret
- 陨磷自动炮炮弹
+ 陨磷钢针弹
Wula/Projectile/WULA_Bullet_ChargeLanceShot_Red
Graphic_Single
MoteGlow
2.5
- WulaFallenEmpire.Projectile_ExplosiveWithTrail
-
- Bullet
- 12
- 90
- 1.2
- 0.4
- Explosion_Rocket
- 0.75
- 0.1
-
+ WulaFallenEmpire.Projectile_WulaLineAttack
-
- WULA_GunTail_Lighting
- 1
+
+ -1
+ 0
+ true
+ WULA_GunTail_Lighting
+ 0
+ Bullet_WULA_RW_Fractal_RF_Hit
+
+ WULA_Armour_Piercing_Projectile_3_Damage
+ 100
+ 120
+ 1.5
+
Wula_LR_Mobile_Factory_Turret
@@ -390,44 +390,45 @@
Bullet_Wula_AI_Heavy_Panzer_Turret_Weapon
0
5.9
- 50
- 3
- 6
- 6
+ 60
+ 4
+ 1
+ 4
true
- 0.1
- Shot_ChargeRifle
+ WULA_MW_Mass_Drivers_Shootingsound
GunTail_Heavy
18
+ false
Bullet_Wula_AI_Heavy_Panzer_Turret_Weapon
- 青金石自动炮炮弹
+ 青金石钢针弹
Wula/Projectile/WULA_Bullet_ChargeLanceShot_Red
Graphic_Single
MoteGlow
2.5
- WulaFallenEmpire.Projectile_ExplosiveWithTrail
-
- Bullet
- 12
- 90
- 2.1
- 0
- Explosion_Rocket
- 1.5
- 0.1
-
+ WulaFallenEmpire.Projectile_WulaLineAttack
-
- WULA_GunTail_Lighting
- 1
+
+ -1
+ 0
+ true
+ WULA_GunTail_Lighting
+ 0
+ Bullet_WULA_RW_Fractal_RF_Hit
+
+ WULA_Armour_Piercing_Projectile_3_Damage
+ 100
+ 120
+ 1.2
+ 1.5
+
Wula_AI_Heavy_Panzer_Main_Weapon
diff --git a/1.6/1.6/Defs/ThingDefs_Misc/Weapons/WULA_FE_Manpack_Weapon.xml b/1.6/1.6/Defs/ThingDefs_Misc/Weapons/WULA_FE_Manpack_Weapon.xml
index d7065634..f3529010 100644
--- a/1.6/1.6/Defs/ThingDefs_Misc/Weapons/WULA_FE_Manpack_Weapon.xml
+++ b/1.6/1.6/Defs/ThingDefs_Misc/Weapons/WULA_FE_Manpack_Weapon.xml
@@ -826,7 +826,7 @@
- WulaFallenEmpire.Verb_ShootBeyondTarge
+ WulaFallenEmpire.Verb_ShootWithOffset
true
Bullet_WULA_RW_Fractal_RF
1.25
@@ -835,6 +835,7 @@
WULA_RW_Railgun_Shootingsound
GunTail_Medium
9
+ false
@@ -864,8 +865,9 @@
-1
0
true
- WULA_GunTail_Lighting
-
+ WULA_GunTail_Lighting_Small
+ 0
+ Bullet_WULA_RW_Fractal_RF_Hit
@@ -875,10 +877,10 @@
1.4
- Bullet
- 25
- 230
- 0.5
+ WULA_Armour_Piercing_Projectile_2_Damage
+ 20
+ 130
+ 1
5
@@ -908,7 +910,7 @@
SubEffecter_SprayerTriggered
- WULA_Mote_ChargeLanceShot
+ WULA_RW_Fractal_RF_Spark_Mote
6~12
0.4~0.8
20~40
@@ -918,7 +920,7 @@
SubEffecter_SprayerTriggered
- WULA_Mote_ChargeLanceShot
+ WULA_RW_Fractal_RF_Spark_Mote
5~9
0.4~0.8
10~20
@@ -930,6 +932,23 @@
0.25~0.25
0.1
+
+ WULA_RW_Fractal_RF_Spark_Mote
+
+ Things/Projectile/ChargeLanceShot
+ (0.75,1.5)
+ MoteGlow
+ (0.3,0.5,0.7,1)
+
+ Projectile
+
+ 0.2
+ 0.4
+ 0.2
+ -0.8
+ true
+
+
WULA_RW_StarDrift_SG
DCs-7"黑曜石"
@@ -1019,7 +1038,7 @@
WULA_RW_AutoCannon
FLm-78"萤石"
- 一般由乌拉帝国跳帮组或骑士军团携带的自动炮,在拥有长射程的同时火力也非常凶猛,会造成区域性的爆炸效果以控制集群敌军。它同时下挂了一具长射程的EMP榴弹发射器,可以用于控制机械族的集群冲击。
+ 一般由乌拉帝国跳帮组或骑士军团携带的自动磁轨炮,在拥有长射程的同时火力也非常凶猛,能够穿透一大群敌军。它同时下挂了一具长射程的EMP榴弹发射器,可以用于控制机械族的集群冲击。
Ultra
Wula_Ranged_Weapon_T3
@@ -1061,12 +1080,12 @@
Bullet_WULA_RW_AutoCannon
2
32
- 0.1
- 3
+ 6
8
Shot_ChargeRifle
GunTail_Medium
9
+ false
true
true
@@ -1095,25 +1114,30 @@
Bullet_WULA_RW_AutoCannon
- 萤石自动炮子弹
- Projectile_Explosive
- Normal
- True
+ 萤石钢针弹
+ WulaFallenEmpire.Projectile_WulaLineAttack
+
+
+ -1
+ 0
+ true
+ WULA_GunTail_Lighting_Small
+ 0
+ Bullet_WULA_RW_Fractal_RF_Hit
+
+
Wula/Projectile/WULA_Bullet_ChargeLanceShot_Red
Graphic_Single
- MoteGlow
- 2.5
+ TransparentPostLight
+ 1
- Bullet
- 12
- 90
- 1.2
- 0.4
- Explosion_Rocket
- 0.75
- 0.1
+ WULA_Armour_Piercing_Projectile_1_Damage
+ 15
+ 130
+ 1.5
+ 5
diff --git a/About/ModIcon.png b/About/ModIcon.png
new file mode 100644
index 00000000..75f5b720
Binary files /dev/null and b/About/ModIcon.png differ
diff --git a/About/preview.png b/About/preview.png
index f1976179..7a10bd48 100644
Binary files a/About/preview.png and b/About/preview.png differ
diff --git a/Source/WulaFallenEmpire/Damage/DamageDef_ExtraDamageExtension.cs b/Source/WulaFallenEmpire/Damage/DamageDef_ExtraDamageExtension.cs
index 0b7df42b..c40c1ce8 100644
--- a/Source/WulaFallenEmpire/Damage/DamageDef_ExtraDamageExtension.cs
+++ b/Source/WulaFallenEmpire/Damage/DamageDef_ExtraDamageExtension.cs
@@ -235,16 +235,8 @@ namespace WulaFallenEmpire
return true;
case ConditionTarget.Pawn:
return target is Pawn;
- case ConditionTarget.Animal:
- return target is Pawn pawn && pawn.RaceProps.Animal;
- case ConditionTarget.Humanlike:
- return target is Pawn pawn && pawn.RaceProps.Humanlike;
- case ConditionTarget.Mechanoid:
- return target is Pawn pawn && pawn.RaceProps.IsMechanoid;
case ConditionTarget.Building:
return target is Building;
- case ConditionTarget.SpecificRaces:
- return target is Pawn pawn && specificRaces.Contains(pawn.def);
default:
return true;
}
@@ -264,12 +256,6 @@ namespace WulaFallenEmpire
{
if (requiredTags == null || requiredTags.Count == 0)
return true;
-
- foreach (var tag in requiredTags)
- {
- if (target.def.HasTag(tag))
- return true;
- }
return false;
}
diff --git a/Source/WulaFallenEmpire/Damage/DamageWorker_ExtraDamage.cs b/Source/WulaFallenEmpire/Damage/DamageWorker_ExtraDamage.cs
index a22a5628..d808e5e9 100644
--- a/Source/WulaFallenEmpire/Damage/DamageWorker_ExtraDamage.cs
+++ b/Source/WulaFallenEmpire/Damage/DamageWorker_ExtraDamage.cs
@@ -1,245 +1,47 @@
-using System.Collections.Generic;
using RimWorld;
using Verse;
-using System.Linq;
-using System.Text;
+using System.Collections.Generic;
namespace WulaFallenEmpire
{
- public class DamageWorker_ExtraDamage : DamageWorker
+ public class DamageWorker_ExtraDamage : DamageWorker_AddInjury
{
- ///
- /// 重写伤害应用方法
- ///
public override DamageResult Apply(DamageInfo dinfo, Thing victim)
{
- // 先应用原始伤害
- DamageResult originalResult = base.Apply(dinfo, victim);
+ // 首先应用原始伤害
+ DamageResult result = base.Apply(dinfo, victim);
- // 获取额外伤害扩展
- DamageDef_ExtraDamageExtension extension =
- dinfo.Def.GetModExtension();
-
- if (extension != null && victim != null && !victim.Destroyed)
+ // 检查是否有额外伤害扩展
+ var extension = dinfo.Def.GetModExtension();
+ if (extension != null && extension.extraDamages != null)
{
- // 应用额外伤害
- var extraDamageResults = ApplyExtraDamages(extension, dinfo, victim, originalResult);
-
- // 如果需要,添加战斗日志
- if (extension.showExtraLog && extraDamageResults.Count > 0)
+ foreach (var extraDamage in extension.extraDamages)
{
- AddCombatLog(extension, dinfo, victim, extraDamageResults);
- }
- }
-
- return originalResult;
- }
-
- ///
- /// 应用额外伤害
- ///
- private List ApplyExtraDamages(
- DamageDef_ExtraDamageExtension extension,
- DamageInfo originalDinfo,
- Thing victim,
- DamageResult originalResult)
- {
- List results = new List();
-
- var applicableDamages = extension.GetApplicableExtraDamages(victim, originalDinfo);
-
- foreach (var extraDamage in applicableDamages)
- {
- if (ShouldApplyExtraDamage(extraDamage, originalDinfo, victim))
- {
- DamageResult result = ApplySingleExtraDamage(extraDamage, originalDinfo, victim);
- if (result != null)
+ if (extraDamage.damageDef != null && extraDamage.amount > 0)
{
- results.Add(result);
+ // 直接应用额外伤害
+ DamageInfo extraDinfo = new DamageInfo(
+ extraDamage.damageDef,
+ extraDamage.amount,
+ extraDamage.armorPenetration >= 0 ? extraDamage.armorPenetration : extraDamage.damageDef.defaultArmorPenetration,
+ dinfo.Angle,
+ dinfo.Instigator,
+ null,
+ dinfo.Weapon,
+ dinfo.Category
+ );
+
+ victim.TakeDamage(extraDinfo);
+
+ // 调试信息
+ if (Prefs.DevMode)
+ {
+ Log.Message($"应用额外伤害: {extraDamage.damageDef.defName} 伤害值: {extraDamage.amount}");
+ }
}
}
}
-
- return results;
- }
-
- ///
- /// 检查是否应该应用额外伤害
- ///
- private bool ShouldApplyExtraDamage(ExtraDamageDef extraDamage, DamageInfo originalDinfo, Thing victim)
- {
- // 检查最小触发伤害
- if (originalDinfo.Amount < extraDamage.minTriggerDamage)
- return false;
-
- return true;
- }
-
- ///
- /// 应用单个额外伤害
- ///
- private DamageResult ApplySingleExtraDamage(ExtraDamageDef extraDamage, DamageInfo originalDinfo, Thing victim)
- {
- try
- {
- // 计算伤害值
- float damageAmount = extraDamage.CalculateActualAmount(originalDinfo, victim);
- if (damageAmount <= 0)
- return null;
-
- // 计算护甲穿透
- float armorPenetration = extraDamage.CalculateActualArmorPenetration();
-
- // 创建伤害信息
- DamageInfo extraDinfo = new DamageInfo(
- def: extraDamage.damageDef,
- amount: damageAmount,
- armorPenetration: armorPenetration,
- angle: originalDinfo.Angle,
- instigator: originalDinfo.Instigator,
- hitPart: GetTargetBodyPart(victim, extraDamage.targetBodyPart),
- weapon: originalDinfo.Weapon,
- category: DamageInfo.SourceCategory.ThingOrUnknown,
- intendedTarget: originalDinfo.IntendedTarget
- );
-
- // 如果是真实伤害,设置特殊标志(如果需要特殊处理)
- if (extraDamage.isTrueDamage)
- {
- // 这里可能需要特殊的处理方式
- // 例如,可以设置伤害信息中的特殊标志
- }
-
- // 应用伤害
- DamageResult result = victim.TakeDamage(extraDinfo);
-
- // 播放效果
- PlayExtraDamageEffects(extraDamage, victim, damageAmount);
-
- return result;
- }
- catch (System.Exception ex)
- {
- Log.Warning($"应用额外伤害时出错: {ex.Message}");
- return null;
- }
- }
-
- ///
- /// 获取目标部位
- ///
- private BodyPartRecord GetTargetBodyPart(Thing victim, BodyPartDef bodyPartDef)
- {
- if (bodyPartDef == null || !(victim is Pawn pawn))
- return null;
-
- return pawn.RaceProps.body.GetPartsWithDef(bodyPartDef).FirstOrDefault();
- }
-
- ///
- /// 播放额外伤害效果
- ///
- private void PlayExtraDamageEffects(ExtraDamageDef extraDamage, Thing victim, float damageAmount)
- {
- if (victim.Map == null)
- return;
-
- // 播放音效
- if (extraDamage.soundDef != null)
- {
- extraDamage.soundDef.PlayOneShot(new TargetInfo(victim.Position, victim.Map));
- }
-
- // 播放粒子效果
- if (extraDamage.fleckDef != null)
- {
- FleckMaker.Static(victim.DrawPos, victim.Map, extraDamage.fleckDef);
- }
-
- // 播放效果器
- if (extraDamage.effecterDef != null)
- {
- Effecter effecter = extraDamage.effecterDef.Spawn();
- effecter.Trigger(new TargetInfo(victim.Position, victim.Map), new TargetInfo(victim.Position, victim.Map));
- effecter.Cleanup();
- }
- }
-
- ///
- /// 添加战斗日志
- ///
- private void AddCombatLog(
- DamageDef_ExtraDamageExtension extension,
- DamageInfo originalDinfo,
- Thing victim,
- List extraResults)
- {
- if (victim is Pawn victimPawn)
- {
- StringBuilder sb = new StringBuilder();
- sb.AppendLine($"{extension.extraLabel} - 额外伤害:");
-
- foreach (var result in extraResults)
- {
- if (result != null && result.totalDamageDealt > 0)
- {
- sb.AppendLine($" {result.totalDamageDealt:F1} 伤害");
- }
- }
-
- // 这里可以添加更详细的战斗日志逻辑
- // 例如,创建一个自定义的战斗日志条目
- }
- }
-
- ///
- /// 重写爆炸伤害处理
- ///
- protected override void ExplosionDamageThing(Explosion explosion, Thing t, List damagedThings, List ignoredThings, IntVec3 cell)
- {
- base.ExplosionDamageThing(explosion, t, damagedThings, ignoredThings, cell);
-
- // 检查并应用额外伤害
- DamageDef_ExtraDamageExtension extension =
- explosion.damType.GetModExtension();
-
- if (extension != null && !t.Destroyed)
- {
- // 为爆炸中的每个目标应用额外伤害
- // 注意:这里需要创建适当的DamageInfo
- }
- }
-
- ///
- /// 获取伤害描述(用于UI显示)
- ///
- public string GetExtraDamageDescription(DamageDef damageDef)
- {
- DamageDef_ExtraDamageExtension extension =
- damageDef.GetModExtension();
-
- if (extension == null || extension.extraDamages.Count == 0)
- return "";
-
- StringBuilder sb = new StringBuilder();
- sb.AppendLine("额外伤害效果:");
-
- foreach (var extraDamage in extension.extraDamages)
- {
- string damageType = extraDamage.damageDef.label;
- string amountStr = extraDamage.isPercentage ?
- $"{extraDamage.percentageMultiplier * 100}% 原始伤害" :
- $"{extraDamage.amount} 点";
-
- sb.AppendLine($" {damageType}: {amountStr}");
-
- if (extraDamage.minTriggerDamage > 0)
- {
- sb.AppendLine($" 触发条件: 原始伤害 > {extraDamage.minTriggerDamage}");
- }
- }
-
- return sb.ToString();
+ return result;
}
}
}
diff --git a/Source/WulaFallenEmpire/Projectiles/Projectile_WulaPenetratingBullet.cs b/Source/WulaFallenEmpire/Projectiles/Projectile_WulaPenetratingBullet.cs
index e0e38fe2..31bc51f5 100644
--- a/Source/WulaFallenEmpire/Projectiles/Projectile_WulaPenetratingBullet.cs
+++ b/Source/WulaFallenEmpire/Projectiles/Projectile_WulaPenetratingBullet.cs
@@ -2,416 +2,184 @@ using System.Collections.Generic;
using RimWorld;
using UnityEngine;
using Verse;
-using System.Linq;
namespace WulaFallenEmpire
{
- public class Wula_PathPierce_Extension : DefModExtension
+ // 在 Wula_PathPierce_Extension 类中添加粒子特效相关的属性
+ public class Wula_PathPierce_Extension : DefModExtension
+ {
+ // 原有的穿透属性
+ public int maxHits = 3;
+ public float damageFalloff = 0.25f;
+ public bool preventFriendlyFire = false;
+ public FleckDef tailFleckDef;
+ public int fleckDelayTicks = 10;
+
+ // 新增的击中特效属性(来自 Projectile_BulletWithEffect_Extension)
+ public EffecterDef impactEffecter; // 击中时的特效
+ }
+ public class Projectile_WulaLineAttack : Bullet
+ {
+ private int hitCounter = 0;
+ private List alreadyDamaged = new List();
+ private Vector3 lastTickPosition;
+ private int Fleck_MakeFleckTick;
+ public int Fleck_MakeFleckTickMax = 1;
+ public IntRange Fleck_MakeFleckNum = new IntRange(1, 1);
+ public FloatRange Fleck_Angle = new FloatRange(-180f, 180f);
+ public FloatRange Fleck_Scale = new FloatRange(1f, 1f);
+ public FloatRange Fleck_Speed = new FloatRange(0f, 0f);
+ public FloatRange Fleck_Rotation = new FloatRange(-180f, 180f);
+ private Wula_PathPierce_Extension Props => def.GetModExtension();
+ public override void ExposeData()
{
- // 设置正数表示有限命中次数,-1 表示无限穿透
- public int maxHits = 3;
+ base.ExposeData();
+ Scribe_Values.Look(ref hitCounter, "hitCounter", 0);
+ Scribe_Collections.Look(ref alreadyDamaged, "alreadyDamaged", LookMode.Reference);
+ Scribe_Values.Look(ref lastTickPosition, "lastTickPosition");
+ if (alreadyDamaged == null)
+ {
+ alreadyDamaged = new List();
+ }
+ }
+ public override void Launch(Thing launcher, Vector3 origin, LocalTargetInfo usedTarget, LocalTargetInfo intendedTarget, ProjectileHitFlags hitFlags, bool preventFriendlyFire = false, Thing equipment = null, ThingDef targetCoverDef = null)
+ {
+ base.Launch(launcher, origin, usedTarget, intendedTarget, hitFlags, preventFriendlyFire, equipment, targetCoverDef);
+ this.lastTickPosition = origin;
+ this.alreadyDamaged.Clear();
+ this.hitCounter = 0;
+ this.preventFriendlyFire = preventFriendlyFire || (Props?.preventFriendlyFire ?? false);
+ }
+ protected override void Tick()
+ {
+ Vector3 startPos = this.lastTickPosition;
+ base.Tick();
- // 每次命中的伤害损失百分比。0.25 表示每次命中损失25%伤害
- public float damageFalloff = 0.25f;
+ if (this.Destroyed) return;
+ this.Fleck_MakeFleckTick++;
+ if (this.Fleck_MakeFleckTick >= Props.fleckDelayTicks)
+ {
+ if (this.Fleck_MakeFleckTick >= (Props.fleckDelayTicks + this.Fleck_MakeFleckTickMax))
+ {
+ this.Fleck_MakeFleckTick = Props.fleckDelayTicks;
+ }
+ Map map = base.Map;
+ int randomInRange = this.Fleck_MakeFleckNum.RandomInRange;
+ Vector3 currentPosition = this.ExactPosition;
+ for (int i = 0; i < randomInRange; i++)
+ {
+ float currentBulletAngle = ExactRotation.eulerAngles.y;
+ float fleckRotationAngle = currentBulletAngle;
+ float velocityAngle = this.Fleck_Angle.RandomInRange + currentBulletAngle;
+ float randomInRange2 = this.Fleck_Scale.RandomInRange;
+ float randomInRange3 = this.Fleck_Speed.RandomInRange;
- // 如果为 true,无论游戏设置如何,这个抛射体都不会造成友军伤害
- public bool preventFriendlyFire = false;
+ if (Props?.tailFleckDef != null)
+ {
+ FleckCreationData dataStatic = FleckMaker.GetDataStatic(currentPosition, map, Props.tailFleckDef, randomInRange2);
+ dataStatic.rotation = fleckRotationAngle;
+ dataStatic.rotationRate = this.Fleck_Rotation.RandomInRange;
+ dataStatic.velocityAngle = velocityAngle;
+ dataStatic.velocitySpeed = randomInRange3;
+ map.flecks.CreateFleck(dataStatic);
+ }
+ }
+ }
+ if (this.Destroyed) return;
+ Vector3 endPos = this.ExactPosition;
- // 尾部拖尾特效的 FleckDef
- public FleckDef tailFleckDef;
-
- // 拖尾特效延迟生成时间(tick)
- public int fleckDelayTicks = 10;
-
-
- // 1. 击中敌人时播放的效果器(Effecter)
- public EffecterDef hitEffecterDef;
- // 2. 击中敌人时播放的粒子(Fleck)
- public FleckDef hitFleckDef;
- // 4. 特效持续时间(tick,仅对效果器有效)
- public int effectDurationTicks = 60;
- // 5. 是否对每个命中的敌人都播放特效
- public bool playEffectOnEveryHit = true;
- // 6. 特效位置偏移(相对于被击中目标)
- public Vector3 effectOffset = Vector3.zero;
- // 7. 特效缩放
- public float effectScale = 1.0f;
- // 8. 伤害阈值:只有达到这个伤害值才会播放特效(0表示总是播放)
- public float damageThreshold = 0f;
- // 9. 随机播放的特效列表(随机选择一个)
- public List randomHitEffecters;
- // 10. 随机粒子列表(随机选择一个)
- public List randomHitFlecks;
+ CheckPathForDamage(startPos, endPos);
+ this.lastTickPosition = endPos;
}
- public class Projectile_WulaLineAttack : Bullet
+ protected override void Impact(Thing hitThing, bool blockedByShield = false)
{
- private int hitCounter = 0;
- private List alreadyDamaged = new List();
- private Vector3 lastTickPosition;
- private int fleckMakeFleckTick; // 拖尾特效的计时器
- public int fleckMakeFleckTickMax = 1; // 拖尾特效的生成频率
- public IntRange fleckMakeFleckNum = new IntRange(1, 1); // 每次生成的粒子数量
- public FloatRange fleckAngle = new FloatRange(-180f, 180f); // 粒子角度
- public FloatRange fleckScale = new FloatRange(1f, 1f); // 粒子大小
- public FloatRange fleckSpeed = new FloatRange(0f, 0f); // 粒子速度
- public FloatRange fleckRotation = new FloatRange(-180f, 180f); // 粒子旋转
-
- // 特效维护列表
- private List activeEffecters = new List();
- private Dictionary effecterEndTicks = new Dictionary();
-
- private Wula_PathPierce_Extension Props => def.GetModExtension();
+ // 原有的穿透检测
+ CheckPathForDamage(lastTickPosition, this.ExactPosition);
- public override void ExposeData()
- {
- base.ExposeData();
- Scribe_Values.Look(ref hitCounter, "hitCounter", 0);
- Scribe_Collections.Look(ref alreadyDamaged, "alreadyDamaged", LookMode.Reference);
- Scribe_Values.Look(ref lastTickPosition, "lastTickPosition");
- Scribe_Collections.Look(ref activeEffecters, "activeEffecters", LookMode.Deep);
- Scribe_Collections.Look(ref effecterEndTicks, "effecterEndTicks", LookMode.Reference, LookMode.Value);
-
- if (alreadyDamaged == null)
- {
- alreadyDamaged = new List();
- }
- if (activeEffecters == null)
- {
- activeEffecters = new List();
- }
- if (effecterEndTicks == null)
- {
- effecterEndTicks = new Dictionary();
- }
- }
+ if (hitThing != null && alreadyDamaged.Contains(hitThing))
+ {
+ base.Impact(null, blockedByShield);
+ }
+ else
+ {
+ base.Impact(hitThing, blockedByShield);
+ }
- public override void Launch(Thing launcher, Vector3 origin, LocalTargetInfo usedTarget, LocalTargetInfo intendedTarget, ProjectileHitFlags hitFlags, bool preventFriendlyFire = false, Thing equipment = null, ThingDef targetCoverDef = null)
- {
- base.Launch(launcher, origin, usedTarget, intendedTarget, hitFlags, preventFriendlyFire, equipment, targetCoverDef);
- this.lastTickPosition = origin;
- this.alreadyDamaged.Clear();
- this.hitCounter = 0;
- // 如果游戏设置为 true 或 XML 扩展为 true,则防止友军伤害
- this.preventFriendlyFire = preventFriendlyFire || (Props?.preventFriendlyFire ?? false);
-
- // 清理旧的特效器
- CleanupOldEffecters();
- }
+ // 新增:触发击中特效(来自 Projectile_BulletWithEffect 的功能)
+ if (Props?.impactEffecter != null)
+ {
+ // 创建一个新的 Effecter 实例并触发
+ Effecter effecter = Props.impactEffecter.Spawn();
+ effecter.Trigger(new TargetInfo(this.ExactPosition.ToIntVec3(), this.launcher.Map, false), this.launcher);
- protected override void Tick()
- {
- Vector3 startPos = this.lastTickPosition;
- base.Tick();
-
- if (this.Destroyed) return;
-
- // 更新拖尾特效
- UpdateTrailFlecks();
-
- // 更新击中特效器
- UpdateHitEffecters();
-
- if (this.Destroyed) return;
-
- Vector3 endPos = this.ExactPosition;
-
- CheckPathForDamage(startPos, endPos);
-
- this.lastTickPosition = endPos;
- }
-
- ///
- /// 更新拖尾粒子特效
- ///
- private void UpdateTrailFlecks()
- {
- this.fleckMakeFleckTick++;
-
- // 只有当达到延迟时间后才开始生成 Fleck
- if (this.fleckMakeFleckTick >= Props?.fleckDelayTicks)
- {
- if (this.fleckMakeFleckTick >= (Props.fleckDelayTicks + this.fleckMakeFleckTickMax))
- {
- this.fleckMakeFleckTick = Props.fleckDelayTicks; // 重置计时器,从延迟时间开始循环
- }
-
- Map map = base.Map;
- int randomInRange = this.fleckMakeFleckNum.RandomInRange;
- Vector3 currentPosition = this.ExactPosition; // 子弹当前位置
-
- for (int i = 0; i < randomInRange; i++)
- {
- float currentBulletAngle = ExactRotation.eulerAngles.y; // 使用子弹当前的水平旋转角度
- float fleckRotationAngle = currentBulletAngle; // Fleck 的旋转角度与子弹方向一致
- float velocityAngle = this.fleckAngle.RandomInRange + currentBulletAngle; // Fleck 的速度角度基于子弹方向加上随机偏移
- float randomInRange2 = this.fleckScale.RandomInRange;
- float randomInRange3 = this.fleckSpeed.RandomInRange;
-
- if (Props?.tailFleckDef != null)
- {
- FleckCreationData dataStatic = FleckMaker.GetDataStatic(currentPosition, map, Props.tailFleckDef, randomInRange2);
- dataStatic.rotation = fleckRotationAngle;
- dataStatic.rotationRate = this.fleckRotation.RandomInRange;
- dataStatic.velocityAngle = velocityAngle;
- dataStatic.velocitySpeed = randomInRange3;
- map.flecks.CreateFleck(dataStatic);
- }
- }
- }
- }
-
- ///
- /// 更新击中特效器
- ///
- private void UpdateHitEffecters()
- {
- if (activeEffecters == null || activeEffecters.Count == 0)
- return;
-
- var ticksGame = Find.TickManager.TicksGame;
- var effectersToRemove = new List();
- var pawnsToRemove = new List();
-
- // 检查每个特效器是否应该结束
- foreach (var kvp in effecterEndTicks)
- {
- if (ticksGame >= kvp.Value || kvp.Key == null || kvp.Key.Destroyed || !kvp.Key.Spawned)
- {
- pawnsToRemove.Add(kvp.Key);
- }
- }
-
- // 清理结束的特效器
- foreach (var pawn in pawnsToRemove)
- {
- effecterEndTicks.Remove(pawn);
- }
- }
-
- ///
- /// 清理旧的特效器
- ///
- private void CleanupOldEffecters()
- {
- if (activeEffecters != null)
- {
- foreach (var effecter in activeEffecters)
- {
- effecter?.Cleanup();
- }
- activeEffecters.Clear();
- }
-
- effecterEndTicks?.Clear();
- }
-
- protected override void Impact(Thing hitThing, bool blockedByShield = false)
- {
- CheckPathForDamage(lastTickPosition, this.ExactPosition);
-
- if (hitThing != null && alreadyDamaged.Contains(hitThing))
- {
- base.Impact(null, blockedByShield);
- }
- else
- {
- base.Impact(hitThing, blockedByShield);
- }
- }
-
- private void CheckPathForDamage(Vector3 startPos, Vector3 endPos)
- {
- if (startPos == endPos) return;
-
- int maxHits = Props?.maxHits ?? 1;
- bool infinitePenetration = maxHits < 0;
-
- if (!infinitePenetration && hitCounter >= maxHits) return;
-
- Map map = this.Map;
- float distance = Vector3.Distance(startPos, endPos);
- Vector3 direction = (endPos - startPos).normalized;
-
- for (float i = 0; i < distance; i += 0.8f)
- {
- if (!infinitePenetration && hitCounter >= maxHits) break;
-
- Vector3 checkPos = startPos + direction * i;
- var thingsInCell = new HashSet(map.thingGrid.ThingsListAt(checkPos.ToIntVec3()));
-
- foreach (Thing thing in thingsInCell)
- {
- if (thing is Pawn pawn && pawn != this.launcher && !alreadyDamaged.Contains(pawn))
- {
- bool shouldDamage = false;
-
- // 情况1:如果预期目标是pawn,总是造成伤害。这允许狩猎。
- if (this.intendedTarget.Thing == pawn)
- {
- shouldDamage = true;
- }
- // 情况2:总是对路径上的敌对pawn造成伤害。
- else if (pawn.HostileTo(this.launcher))
- {
- shouldDamage = true;
- }
- // 情况3:如果射击本身没有标记为防止友军伤害,则对非敌对(友好,中立)造成伤害。
- else if (!this.preventFriendlyFire)
- {
- shouldDamage = true;
- }
-
- if (shouldDamage)
- {
- ApplyPathDamage(pawn);
- if (!infinitePenetration && hitCounter >= maxHits) break;
- }
- }
- }
- }
- }
-
- private void ApplyPathDamage(Pawn pawn)
- {
- Wula_PathPierce_Extension props = Props;
- float falloff = props?.damageFalloff ?? 0.25f;
-
- // 伤害衰减现在普遍适用,即使是无限穿透。
- float damageMultiplier = Mathf.Pow(1f - falloff, hitCounter);
-
- int damageAmount = (int)(this.DamageAmount * damageMultiplier);
- if (damageAmount <= 0) return;
-
- // 检查伤害阈值
- if (props?.damageThreshold > 0 && damageAmount < props.damageThreshold)
- {
- return;
- }
-
- var dinfo = new DamageInfo(
- this.def.projectile.damageDef,
- damageAmount,
- this.ArmorPenetration * damageMultiplier,
- this.ExactRotation.eulerAngles.y,
- this.launcher,
- null,
- this.equipmentDef,
- DamageInfo.SourceCategory.ThingOrUnknown,
- this.intendedTarget.Thing);
-
- pawn.TakeDamage(dinfo);
- alreadyDamaged.Add(pawn);
- hitCounter++;
-
- // 播放击中特效
- PlayHitEffects(pawn, damageAmount);
- }
-
- ///
- /// 播放击中敌人时的特效
- ///
- /// 被击中的Pawn
- /// 造成的伤害值
- private void PlayHitEffects(Pawn pawn, int damageAmount)
- {
- if (pawn == null || pawn.Destroyed || pawn.Map == null)
- return;
-
- Wula_PathPierce_Extension props = Props;
- if (props == null)
- return;
-
- // 是否对每个命中都播放特效
- if (!props.playEffectOnEveryHit && hitCounter > 1)
- return;
-
- // 播放粒子特效
- PlayHitFleck(pawn);
-
- // 播放效果器特效
- PlayHitEffecter(pawn);
- }
-
- ///
- /// 播放击中粒子特效
- ///
- private void PlayHitFleck(Pawn pawn)
- {
- Wula_PathPierce_Extension props = Props;
- if (props == null)
- return;
-
- FleckDef fleckDef = null;
-
- // 选择粒子:优先使用随机列表,然后使用固定粒子
- if (props.randomHitFlecks != null && props.randomHitFlecks.Count > 0)
- {
- fleckDef = props.randomHitFlecks.RandomElement();
- }
- else if (props.hitFleckDef != null)
- {
- fleckDef = props.hitFleckDef;
- }
-
- if (fleckDef != null)
- {
- Vector3 position = pawn.DrawPos + props.effectOffset;
- float scale = props.effectScale;
-
- FleckCreationData data = FleckMaker.GetDataStatic(position, pawn.Map, fleckDef, scale);
- pawn.Map.flecks.CreateFleck(data);
- }
- }
-
- ///
- /// 播放击中效果器特效
- ///
- private void PlayHitEffecter(Pawn pawn)
- {
- Wula_PathPierce_Extension props = Props;
- if (props == null)
- return;
-
- EffecterDef effecterDef = null;
-
- // 选择效果器:优先使用随机列表,然后使用固定效果器
- if (props.randomHitEffecters != null && props.randomHitEffecters.Count > 0)
- {
- effecterDef = props.randomHitEffecters.RandomElement();
- }
- else if (props.hitEffecterDef != null)
- {
- effecterDef = props.hitEffecterDef;
- }
-
- if (effecterDef != null)
- {
- Vector3 position = pawn.DrawPos + props.effectOffset;
-
- // 创建效果器
- Effecter effecter = effecterDef.Spawn();
- effecter.Trigger(new TargetInfo(pawn.Position, pawn.Map), new TargetInfo(pawn.Position, pawn.Map));
-
- // 如果需要持续效果,添加到维护列表
- if (props.effectDurationTicks > 0)
- {
- activeEffecters.Add(effecter);
- effecterEndTicks[pawn] = Find.TickManager.TicksGame + props.effectDurationTicks;
- }
- else
- {
- // 立即清理效果器
- effecter.Cleanup();
- }
- }
- }
-
- public override void Destroy(DestroyMode mode = DestroyMode.Vanish)
- {
- // 清理所有特效器
- CleanupOldEffecters();
- base.Destroy(mode);
- }
+ // 可选:在一段时间后清理 Effecter
+ // 这里我们使用一个临时的 Effecter,所以不需要手动清理
+ }
}
-}
+ private void CheckPathForDamage(Vector3 startPos, Vector3 endPos)
+ {
+ if (startPos == endPos) return;
+ int maxHits = Props?.maxHits ?? 1;
+ bool infinitePenetration = maxHits < 0;
+ if (!infinitePenetration && hitCounter >= maxHits) return;
+ Map map = this.Map;
+ float distance = Vector3.Distance(startPos, endPos);
+ Vector3 direction = (endPos - startPos).normalized;
+ for (float i = 0; i < distance; i += 0.8f)
+ {
+ if (!infinitePenetration && hitCounter >= maxHits) break;
+ Vector3 checkPos = startPos + direction * i;
+ var thingsInCell = new HashSet(map.thingGrid.ThingsListAt(checkPos.ToIntVec3()));
+ foreach (Thing thing in thingsInCell)
+ {
+ if (thing is Pawn pawn && pawn != this.launcher && !alreadyDamaged.Contains(pawn))
+ {
+ bool shouldDamage = false;
+ if (this.intendedTarget.Thing == pawn)
+ {
+ shouldDamage = true;
+ }
+ else if (pawn.HostileTo(this.launcher))
+ {
+ shouldDamage = true;
+ }
+ else if (!this.preventFriendlyFire)
+ {
+ shouldDamage = true;
+ }
+ if (shouldDamage)
+ {
+ ApplyPathDamage(pawn);
+ if (!infinitePenetration && hitCounter >= maxHits) break;
+ }
+ }
+ }
+ }
+ }
+ private void ApplyPathDamage(Pawn pawn)
+ {
+ Wula_PathPierce_Extension props = Props;
+ float falloff = props?.damageFalloff ?? 0.25f;
+
+ float damageMultiplier = Mathf.Pow(1f - falloff, hitCounter);
+
+ int damageAmount = (int)(this.DamageAmount * damageMultiplier);
+ if (damageAmount <= 0) return;
+ var dinfo = new DamageInfo(
+ this.def.projectile.damageDef,
+ damageAmount,
+ this.ArmorPenetration * damageMultiplier,
+ this.ExactRotation.eulerAngles.y,
+ this.launcher,
+ null,
+ this.equipmentDef,
+ DamageInfo.SourceCategory.ThingOrUnknown,
+ this.intendedTarget.Thing);
+
+ pawn.TakeDamage(dinfo);
+ alreadyDamaged.Add(pawn);
+ hitCounter++;
+ }
+ }
+}
\ No newline at end of file
diff --git a/Source/WulaFallenEmpire/Verb/Verb_ShootBeyondTarget.cs b/Source/WulaFallenEmpire/Verb/Verb_ShootBeyondTarget.cs
deleted file mode 100644
index 767bd377..00000000
--- a/Source/WulaFallenEmpire/Verb/Verb_ShootBeyondTarget.cs
+++ /dev/null
@@ -1,63 +0,0 @@
-using RimWorld;
-using System;
-using UnityEngine;
-using Verse;
-
-namespace WulaFallenEmpire
-{
- public class Verb_ShootBeyondTarge : Verb_ShootWithOffset
- {
- ///
- /// 重写射击逻辑,直接修改当前目标为延长线目标
- ///
- protected override bool TryCastShot()
- {
- // 保存原始目标
- LocalTargetInfo originalTarget = currentTarget;
-
- try
- {
- // 计算延长线目标
- LocalTargetInfo beyondTarget = CalculateBeyondTarget(originalTarget);
-
- // 设置为延长线目标
- currentTarget = beyondTarget;
-
- // 调用基类射击逻辑
- return base.TryCastShot();
- }
- finally
- {
- // 恢复原始目标
- currentTarget = originalTarget;
- }
- }
-
- ///
- /// 计算延长线目标
- ///
- private LocalTargetInfo CalculateBeyondTarget(LocalTargetInfo target)
- {
- if (!target.IsValid || caster == null || caster.Map == null)
- return target;
-
- Vector3 shooterPos = caster.DrawPos;
- Vector3 targetPos = target.HasThing ?
- target.Thing.DrawPos :
- target.Cell.ToVector3Shifted();
-
- Vector3 direction = (targetPos - shooterPos).normalized;
- float maxRange = EffectiveRange;
- Vector3 beyondTargetPos = shooterPos + direction * maxRange;
- IntVec3 beyondTargetCell = beyondTargetPos.ToIntVec3();
-
- // 确保在地图范围内
- if (!beyondTargetCell.InBounds(caster.Map))
- {
- beyondTargetCell = beyondTargetCell.ClampInsideMap(caster.Map);
- }
-
- return new LocalTargetInfo(beyondTargetCell);
- }
- }
-}
diff --git a/Source/WulaFallenEmpire/WulaFallenEmpire.csproj b/Source/WulaFallenEmpire/WulaFallenEmpire.csproj
index ddd7a88a..c767427d 100644
--- a/Source/WulaFallenEmpire/WulaFallenEmpire.csproj
+++ b/Source/WulaFallenEmpire/WulaFallenEmpire.csproj
@@ -137,6 +137,8 @@
+
+
@@ -347,7 +349,6 @@
-
@@ -387,6 +388,9 @@
+
+
+
diff --git a/美术与文本源文件/Wula/Storyteller/军团/test.png b/美术与文本源文件/Wula/Storyteller/军团/test.png
deleted file mode 100644
index 6187eb86..00000000
Binary files a/美术与文本源文件/Wula/Storyteller/军团/test.png and /dev/null differ
diff --git a/美术与文本源文件/Wula/Storyteller/军团/新建画布2.sai2 b/美术与文本源文件/Wula/Storyteller/军团/指挥服.sai2
similarity index 100%
rename from 美术与文本源文件/Wula/Storyteller/军团/新建画布2.sai2
rename to 美术与文本源文件/Wula/Storyteller/军团/指挥服.sai2
diff --git a/美术与文本源文件/Wula/Storyteller/军团/泳装.sai2 b/美术与文本源文件/Wula/Storyteller/军团/泳装.sai2
new file mode 100644
index 00000000..f83f2cd3
Binary files /dev/null and b/美术与文本源文件/Wula/Storyteller/军团/泳装.sai2 differ
diff --git a/美术与文本源文件/thumbnail.sai2 b/美术与文本源文件/thumbnail.sai2
index 309bcdaa..04f1e01a 100644
Binary files a/美术与文本源文件/thumbnail.sai2 and b/美术与文本源文件/thumbnail.sai2 differ