diff --git a/1.6/1.6/Assemblies/WulaFallenEmpire.dll b/1.6/1.6/Assemblies/WulaFallenEmpire.dll index 3a775e30..3da91b4b 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 9e360091..246f9250 100644 --- a/1.6/1.6/Defs/AbilityDefs/WULA_Flyover_Ability.xml +++ b/1.6/1.6/Defs/AbilityDefs/WULA_Flyover_Ability.xml @@ -1028,116 +1028,4 @@ - - - - WULA_Support_Holographic_Flag - - 从拒止舰队上扔一面全息旗帜到指定地点,激励附近的乌拉星人更英勇地战斗。 - Wula/UI/Abilities/WULA_Firepower_Minigun_Strafe - 1 - Misc12 - false - - Verb_CastAbility - false - false - 1 - 120 - true - - false - true - - - -
  • - 0 - WULA_Holographic_Flag_Building_Skyfaller - 15 - (1,1,1,0.5) -
  • -
  • - FactoryFacility - 需要拥有<color=#BD2F31><i>支援设施</i></color>设施的战舰在地图上才能进行轨道炮击支援 -
  • - -
    -
    - - WULA_Support_Shield_Projection - - 从拒止舰队上扔一面附拒止护盾的全息旗帜到指定地点,激励附近的乌拉星人更英勇地战斗。拒止护盾可以反射所有的敌方射弹,己方的开火不受影响。\n\n在工作一段时间后,该系统将自行烧毁。 - Wula/UI/Abilities/WULA_Firepower_Minigun_Strafe - 1 - Misc12 - false - - Verb_CastAbility - false - false - 1 - 120 - true - - false - true - - - -
  • - 0 - WULA_Support_Shield_Projection_Skyfaller - 12 - (0.6,0.8,0.8,0.5) -
  • -
  • - - FactoryFacility - 需要拥有<color=#BD2F31><i>支援设施</i></color>设施的战舰在地图上才能进行轨道炮击支援 -
  • - -
    -
    - - WULA_Support_AreaTeleporter - - 从拒止舰队上扔一面附拒止护盾的全息旗帜到指定地点,激励附近的乌拉星人更英勇地战斗。拒止护盾可以反射所有的敌方射弹,己方的开火不受影响。\n\n在工作一段时间后,该系统将自行烧毁。 - Wula/UI/Abilities/WULA_Firepower_Minigun_Strafe - 1 - Misc12 - false - - Verb_CastAbility - false - false - 1 - 120 - true - - false - true - - - -
  • - 0 - WULA_Support_AreaTeleporter_Skyfaller - 20 - (0.6,0.8,0.8,0.5) -
  • -
  • - - FactoryFacility - 需要拥有<color=#BD2F31><i>支援设施</i></color>设施的战舰在地图上才能进行轨道炮击支援 -
  • - -
    -
    \ No newline at end of file diff --git a/1.6/1.6/Defs/BackstoryDefs/Solid/Solid_Adult_WULA.xml b/1.6/1.6/Defs/BackstoryDefs/Solid/Solid_Adult_WULA.xml index 6b53300f..955a2053 100644 --- a/1.6/1.6/Defs/BackstoryDefs/Solid/Solid_Adult_WULA.xml +++ b/1.6/1.6/Defs/BackstoryDefs/Solid/Solid_Adult_WULA.xml @@ -1055,6 +1055,25 @@ + + WULA_Adult_Backstory_Legion_Escort + Adulthood + 断爪卫队 + 断爪卫队 + [PAWN_nameDef]是断爪卫队的一员,该卫队是乌拉帝国行星封锁机关总控AI「军团」的心腹和黑手套,负责和其分体出席各种场合。 + AllWork + Thin + Thin + Thin + + 999 + 999 + + +
  • Wula_Backstory_Categories_Legion_Escort
  • +
    +
    + WULA_Adult_Backstory999 diff --git a/1.6/1.6/Defs/HediffDefs/Hediffs_BodyParts_WULA.xml b/1.6/1.6/Defs/HediffDefs/Hediffs_BodyParts_WULA.xml index 5c44c0ca..6055e5aa 100644 --- a/1.6/1.6/Defs/HediffDefs/Hediffs_BodyParts_WULA.xml +++ b/1.6/1.6/Defs/HediffDefs/Hediffs_BodyParts_WULA.xml @@ -93,7 +93,7 @@ WULA_AutoJumpdrive - 安装在乌拉帝国合成人军团体内的微型跃迁引擎,会在合成人到达指定作战时间或死亡时将其回收 + 安装在乌拉帝国合成人军团体内的微型跃迁引擎,会在合成人到达指定作战时间时将其回收 WULA_AutoJumpdrive
  • @@ -108,10 +108,10 @@
  • - + WULA_AutoJumpdrive - - A chest implant for preventing enemy use of captured equipment. Upon the user's death, it releases powerful chemicals that dissolve gear in contact with the user's body. It doesn't damage others. + + 安装在乌拉帝国合成人军团体内的微型跃迁引擎,会在合成人到达指定作战时间时将其回收 Spacer Things/Item/Health/HealthItem @@ -151,4 +151,50 @@ WULA_AutoJumpdrive + + WULA_AutoJumpdrive_Week + + 安装在乌拉帝国合成人军团体内的微型跃迁引擎,会在合成人到达指定作战时间时将其回收 + WULA_AutoJumpdrive + +
  • + 420000 + true + PsycastAreaEffect + 2.5 + false + true + true + {0} 通过传送离开了殖民地 +
  • +
    +
    + + WULA_AutoJumpdrive_Week + + + Install_WULA_AutoJumpdrive_Week + + Install a death acidifier. + Installing death acidifier. + +
  • + + +
  • WULA_AutoJumpdrive_Week
  • + + + 1 + +
    + + +
  • WULA_AutoJumpdrive_Week
  • +
    +
    + +
  • Torso
  • +
    + WULA_AutoJumpdrive_Week +
    \ 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 d43b6265..dae62903 100644 --- a/1.6/1.6/Defs/HediffDefs/WULA_FM_Hediffs.xml +++ b/1.6/1.6/Defs/HediffDefs/WULA_FM_Hediffs.xml @@ -147,31 +147,4 @@ - - Wula_FM_Switc_Construction - - 允许乌拉帝国的合成人呼叫舰队支援,包含一系列防御性能力和生产加速能力,一般需要有拒止舰队部署在轨道上才能启动。 - Hediff_High - false - false - True - false - -
  • - false -
  • -
    - -
  • - -
  • WULA_CallMotherShip
  • -
  • WULA_CallConstructionShip
  • -
  • WULA_ClearFlightPath
  • -
  • WULA_Support_Holographic_Flag
  • -
  • WULA_Support_Shield_Projection
  • -
  • WULA_Support_AreaTeleporter
  • - - -
    -
    \ No newline at end of file diff --git a/1.6/1.6/Defs/PawnKinds/PawnKinds_Wula.xml b/1.6/1.6/Defs/PawnKinds/PawnKinds_Wula.xml index 6f810275..12024838 100644 --- a/1.6/1.6/Defs/PawnKinds/PawnKinds_Wula.xml +++ b/1.6/1.6/Defs/PawnKinds/PawnKinds_Wula.xml @@ -616,6 +616,10 @@ 0 0 99999~99999 + +
  • WULA_AutoJumpdrive_Week
  • +
  • DeathAcidifier
  • +
    Wula_PIA_Legion_Escort_Unit @@ -664,6 +668,7 @@ 999999~999999 999999~999999 +
  • WULA_AutoJumpdrive_Week
  • DeathAcidifier
  • @@ -671,12 +676,11 @@
  • ImplantEmpireCommon
  • - -
  • - -
  • Wula_Backstory_Categories
  • - - -
    + +
  • WULA_Child_Backstory03
  • +
    + +
  • WULA_Adult_Backstory_Legion_Escort
  • +
    \ No newline at end of file diff --git a/1.6/1.6/Defs/QuestScriptDefs/WULA_Colony_Promotion.xml b/1.6/1.6/Defs/QuestScriptDefs/WULA_Colony_Promotion.xml index dd8a8c1b..ef97f2ea 100644 --- a/1.6/1.6/Defs/QuestScriptDefs/WULA_Colony_Promotion.xml +++ b/1.6/1.6/Defs/QuestScriptDefs/WULA_Colony_Promotion.xml @@ -133,8 +133,8 @@
  • faction.BecameHostileToPlayer - - LetterTextFactionBecameHostile + + [faction_name]开始敌视你。
  • faction.BecameHostileToPlayer @@ -237,9 +237,9 @@
  • - + NegativeEvent - The shuttle sent to drop off [pawnsLabelDef] has been destroyed. You have failed the quest '[resolvedQuestName]'.\n\nYour relations with [asker_faction_name] have changed by [goodwillChangeOnShuttleDestroyed]. + 被派遣来运输[asker_nameDef]的穿梭机已被破坏。
  • Fail @@ -262,9 +262,9 @@
  • - + NegativeEvent - {SUBJECT_definite}, who you were charged to protect, has died. [failLetterEndingCommon] + 需要你护卫的{SUBJECT_definite}已经死亡。[failLetterEndingCommon] OngoingOrNotYetAccepted
  • @@ -302,8 +302,8 @@ 应该乘坐穿梭机离开
  • - - The shuttle has arrived to collect the [asker_faction_leaderTitle].\n\nAll of you can accompany the [asker_faction_leaderTitle] on the shuttle and travel to the Imperial flotilla to begin a new life. + + 穿梭机已经前来迎接[asker_nameDef]。 $pickupShipThing
  • @@ -355,9 +355,9 @@
  • - + NegativeEvent - {SUBJECT_definite}, who you were charged to protect and keep happy, has been below the minimum mood of [lodgersMoodThreshold] too long. [failLetterEndingCommon] + 需要你护卫和满足需求的{SUBJECT_definite},其情绪值已经长时间低于最低限度[lodgersMoodThreshold]。[failLetterEndingCommon]
  • Fail @@ -372,9 +372,9 @@
  • - + NegativeEvent - {SUBJECT_definite}, who you were charged to protect, has been arrested. [failLetterEndingCommon] + 需要你护卫的{SUBJECT_definite}已经被俘虏。[failLetterEndingCommon]
  • Fail @@ -392,9 +392,9 @@
  • - + NegativeEvent - Unauthorized, violating surgery has been performed on {SUBJECT_definite}, who you were charged to protect. [failLetterEndingCommon] + 需要你护卫的{SUBJECT_definite}接受了一场未授权的多余手术。[failLetterEndingCommon]
  • Fail @@ -412,9 +412,9 @@
  • - + NegativeEvent - {SUBJECT_definite}, who you were charged to protect, has had {SUBJECT_possessive} xenogerm forcibly absorbed. [failLetterEndingCommon] + 指定由你保护的{SUBJECT_definite}在你的殖民地被吸收了异种胚芽。[failLetterEndingCommon]
  • Fail @@ -432,9 +432,9 @@
  • - + NegativeEvent - {SUBJECT_definite}, who you were charged to protect, has left the assigned settlement. [failLetterEndingCommon] + 需要你护卫的{SUBJECT_definite}失踪在你的殖民地。[failLetterEndingCommon]
  • Fail @@ -452,9 +452,9 @@
  • - + NegativeEvent - The shuttle sent to collect the [asker_faction_leaderTitle] has been destroyed. [failLetterEndingCommon] + 前来迎接[asker_faction_leaderTitle]的穿梭机被摧毁了。[failLetterEndingCommon]
  • Fail @@ -472,9 +472,9 @@
  • - + NegativeEvent - {SUBJECT_definite}, who you were charged to protect, has run wild. [failLetterEndingCommon] + 需要你护卫的{SUBJECT_definite}在你的殖民地回归自然。[failLetterEndingCommon]
  • Fail @@ -510,9 +510,9 @@
  • - + NegativeEvent - The shuttle sent to collect the [asker_faction_leaderTitle] has departed without [asker_objective]. [asker_pronoun] will now leave on foot. [failLetterEndingCommon] + 前来迎接[asker_faction_leaderTitle]的穿梭机没有接到[asker_objective]。[asker_pronoun]现在只能走回去。[failLetterEndingCommon]
  • Fail diff --git a/1.6/1.6/Defs/QuestScriptDefs/WULA_Intro_Spy.xml b/1.6/1.6/Defs/QuestScriptDefs/WULA_Intro_Spy.xml index cea32bb2..2319287e 100644 --- a/1.6/1.6/Defs/QuestScriptDefs/WULA_Intro_Spy.xml +++ b/1.6/1.6/Defs/QuestScriptDefs/WULA_Intro_Spy.xml @@ -125,8 +125,8 @@ $points $enemyFaction $walkInSpot - {BASELABEL} chasing [../asker_nameDef] - {BASETEXT}\nThe [enemyFaction_pawnsPlural] have come to get [../asker_nameDef]. + {BASELABEL} 追捕[../asker_nameDef] + {BASETEXT}\n\n[enemyFaction_pawnsPlural]来此追捕[../asker_nameDef]。 @@ -151,12 +151,12 @@
  • $asker - Should depart on shuttle + 应该乘坐穿梭机出发
  • - - The shuttle has arrived to collect [asker_nameDef]. + + 前来迎接[asker_nameDef]的穿梭机已抵达。 $pickupShipThing
  • @@ -191,9 +191,9 @@
  • - + NegativeEvent - {SUBJECT_definite}, who you were charged to protect, has died. [failLetterEndingCommon] + 需要你小心保护的{SUBJECT_definite}已经死亡。[failLetterEndingCommon]
  • Fail @@ -210,7 +210,7 @@
  • - + NegativeEvent {SUBJECT_definite}, who you were charged to protect, has been left behind. [failLetterEndingCommon]
  • @@ -229,9 +229,9 @@
  • - + NegativeEvent - Unauthorized, violating surgery has been performed on {SUBJECT_definite}, who you were charged to protect. Because of this violation, [asker_pronoun] will now attempt to leave. [failLetterEndingCommon] + 需要你小心保护的{SUBJECT_definite}接受了一次未授权的额外手术。因为你违规在先,[asker_pronoun]将要离开此处。[failLetterEndingCommon]
  • Fail @@ -248,9 +248,9 @@
  • - + NegativeEvent - {SUBJECT_definite}, who you were charged to protect, has had {SUBJECT_possessive} xenogerm forcibly absorbed. Because of this violation, {SUBJECT_pronoun} will now attempt to leave. [failLetterEndingCommon] + 指定由你保护的{SUBJECT_definite}在你的殖民地被吸收了异种胚芽。这是一种侵犯行为,{SUBJECT_pronoun}现在将会直接离开[failLetterEndingCommon]。
  • Fail @@ -267,9 +267,9 @@
  • - + NegativeEvent - {SUBJECT_definite}, who you were charged to host, has been arrested. [failLetterEndingCommon] + 需要你小心保护的{SUBJECT_definite}已被俘虏。[failLetterEndingCommon]
  • Fail @@ -286,9 +286,9 @@
  • - + NegativeEvent - {SUBJECT_definite}, who you were charged to protect, has left the designated settlement. [failLetterEndingCommon] + 需要你小心保护的{SUBJECT_definite}在你的殖民地失踪了。[failLetterEndingCommon]
  • Fail @@ -305,9 +305,9 @@
  • - + NegativeEvent - {SUBJECT_definite}, who you were charged to protect, has run wild. [failLetterEndingCommon] + 需要你小心保护的{SUBJECT_definite}在你的殖民地回归自然。[failLetterEndingCommon]
  • Fail @@ -324,9 +324,9 @@
  • - + NegativeEvent - The shuttle sent to collect [asker_nameDef] has been destroyed. [asker_pronoun] will now leave on foot. [failLetterEndingCommon] + 前来迎接[asker_nameDef]的穿梭机已被毁。[asker_pronoun]现在只能走回去了。[failLetterEndingCommon]
  • Fail @@ -343,9 +343,9 @@
  • - + NegativeEvent - The shuttle sent to collect [asker_nameDef] has been left behind. [asker_pronoun] will now leave on foot. + 前来迎接[asker_nameDef]的穿梭机已被遗弃。[asker_pronoun]现在只能走回去了。
  • Fail @@ -390,9 +390,9 @@
  • - + NegativeEvent - The shuttle sent to collect [asker_nameDef] has departed without [asker_objective]. [asker_pronoun] will now leave on foot. [failLetterEndingCommon] + 前来迎接[asker_nameDef]的穿梭机在离开时因为一些原因落下了[asker_objective]。[asker_pronoun]现在只能走回去了。[failLetterEndingCommon]
  • Fail 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 ec8b13d3..8096f35f 100644 --- a/1.6/1.6/Defs/ResearchProjectDefs/WULA_ResearchProjects_Remake.xml +++ b/1.6/1.6/Defs/ResearchProjectDefs/WULA_ResearchProjects_Remake.xml @@ -202,7 +202,7 @@ 允许殖民地建立信标增加攻击舰队配额,并使得机械乌拉可以调频天线以申请舰队空中支援,包含2艘可以发起轨道炮击的巡洋舰和1艘可以提供航空器支援的航空舰。 600 1.00 - 4.40 + 5.60
  • WULA_Colony_License_LV1_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 f7ce7808..4e6e1280 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 @@ -521,10 +521,10 @@ true Building - PassThroughOnly - 42 + Impassable true - 0.5 + 1 + false false 250 @@ -1283,7 +1283,6 @@ 1 Building - 0.5 True Light @@ -1293,8 +1292,10 @@ (1,1) 2120 - PassThroughOnly - 50 + Impassable + true + 1 + false True (0,0,-1) Item @@ -1359,11 +1360,12 @@
    Building - PassThroughOnly + Impassable + true + 1 + false false - 0.5 false - 0 false false Light diff --git a/1.6/1.6/Defs/ThingDefs_Buildings/WULA_Misc_Buildings.xml b/1.6/1.6/Defs/ThingDefs_Buildings/WULA_Misc_Buildings.xml index 0396aa38..59ef4a03 100644 --- a/1.6/1.6/Defs/ThingDefs_Buildings/WULA_Misc_Buildings.xml +++ b/1.6/1.6/Defs/ThingDefs_Buildings/WULA_Misc_Buildings.xml @@ -665,58 +665,6 @@ Thing
    - - - WULA_Wall_Flag_Building - - 乌拉帝国行星封锁机关的旗帜,没什么用但是可以宣示乌拉帝国的主权。 - Building - Building - PassThroughOnly - WULA_Buildings - true - 0.20 - 14 - false - BulletImpact_Metal - Wula/Building/Flag/WULA_Flag_Building_B_north - true - true - - Wula/Building/Flag/WULA_Flag_Building_B - Graphic_Multi - (0.7,0.75) - (0,0,0.7) - (0,0,-0.7) - (-0.6,0,0.1) - (0.6,0,0.1) - - false - - - BuildingOnTop - - 50 - 1.0 - 330 - 2 - - 2991 - Standable - - 0 - North - (0, 0, 0.2) - - false - true - - -
  • Placeworker_AttachedToWall
  • -
    -
    - - WULA_Sky_Lock 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 6d8a03e5..13a679a5 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 @@ -135,11 +135,12 @@ Building - PassThroughOnly + Impassable + true + 1 + false false - 0.5 false - 42 false 0 @@ -217,7 +218,7 @@ 6 转换为BUk-1"地堡猫猫" 让地堡中的两只乌拉猫猫继续操纵地堡中的机枪,剩下的乌拉猫猫抬着地堡移动——虽然很难相信但是事实就是这样的。 - Wula/UI/Commands/WULA_TransformToPawn + Wula/UI/Commands/WULA_BunkerCat @@ -406,9 +407,10 @@ false Normal - PassThroughOnly - 50 - 0.5 + Impassable + true + 1 + false true Light @@ -683,9 +685,10 @@ false Normal - PassThroughOnly - 50 - 0.5 + Impassable + true + 1 + false true 640 @@ -960,9 +963,10 @@ false Normal - PassThroughOnly - 50 - 0.5 + Impassable + true + 1 + false true 450 @@ -1090,4 +1094,292 @@
    + + + + WULA_Wall_Flag_Building + + 乌拉帝国行星封锁机关的旗帜,没什么用但是可以宣示乌拉帝国的主权。 + Building + Building + PassThroughOnly + WULA_Buildings + true + 0.20 + 14 + false + BulletImpact_Metal + Wula/Building/Flag/WULA_Flag_Building_B_north + true + true + + Wula/Building/Flag/WULA_Flag_Building_B + Graphic_Multi + (0.7,0.75) + (0,0,0.7) + (0,0,-0.7) + (-0.6,0,0.1) + (0.6,0,0.1) + + false + + + BuildingOnTop + + 50 + 1.0 + 330 + 2 + + 2991 + Standable + + 0 + North + (0, 0, 0.2) + + false + true + + +
  • Placeworker_AttachedToWall
  • +
    +
    + + WULA_Holographic_Flag_Building_Skyfaller + + (1,1) + + Wula/Building/Flag/WULA_Flag_Building_Mount_Incoming + Graphic_Single + MoteGlow + (1,1) + + false + + + + Accelerate + Things/Skyfaller/SkyfallerShadowDropPod + (0, 0) + DropPod_Fall + 100 + Explosion_Vaporize + 0.05 + 1 + 1 + + +
  • (0,0)
  • +
  • (1, 1)
  • +
    +
    + WULA_Holographic_Flag_Building +
    + +
  • + Smoke_Joint +
  • +
    +
    + + WULA_Holographic_Flag_Building + + 乌拉帝国行星封锁机关的全息旗帜投影,能激励附近的乌拉星人更加凶狠地战斗。这台投影仪的底座附带了一个拒止护盾,可以反射大部分的敌方射弹,己方的开火不受影响。 + WulaFallenEmpire.Building_ExtraGraphics + true + Building + 50 + true + PassThroughOnly + 1 + (1,1) + true + None + (0.56, 0.62, 0.9) + Wula/Building/Flag/WULA_Flag_Building_A + false + + Wula/Building/Flag/WULA_Flag_Building_Mount + Graphic_Single + (1,1) + + + 4 + + + 50 + 0.5 + 1000 + 5 + + Normal + true + false + North + true + Light + BulletImpact_Metal + true + RealtimeOnly + ConstructMetal + true + + + false + BuildingDestroyed_Metal_Big + true + true + + +
  • + 0 + 0 + + +
  • + Wula/Building/Flag/WULA_Flag_Building_A + MoteGlow + (3,3) + 0 + (0,1,2) + 1.5 + 0.2 + 0 +
  • +
  • + Wula/Building/Flag/WULA_Flag_Building_Mount + Transparent + (1,1) + 1 + (0,1,0) + 0 + 0 + 0 +
  • + + +
    + +
  • + 12 + 200 + 2400 + 30 + + + Interceptor_BlockedProjectile + Interceptor_BlockedProjectile + Shield_Break + BulletShieldGenerator_Reactivate + + (0.9, 0.2, 0.2, 0.5) + + + true + false + true + + + true + 0.5 + 30 + 0 + Interceptor_BlockedProjectile +
  • +
  • + 15 + Wula_Holographic_Flag_Hediff + 0.5 + true + 120 + 125 + +
  • WulaSpecies
  • + + true + false + false + +
  • + + true + false +
  • +
  • + 3 + (120,240,252,0) +
  • +
    +
    + + WULA_Support_AreaTeleporter_Skyfaller + + + WULA_Support_AreaTeleporter + + + + WULA_Support_AreaTeleporter + + 乌拉帝国行星封锁机关的全息旗帜,除了宣誓主权外,也能激励附近的乌拉星人更加凶狠地战斗。这面旗帜的底座附带了一个区域传送器,可以使得机械乌拉在旗帜区域内传送。\n\n在工作一段时间后,该系统将自行烧毁。 + + +
  • + 0 + 0 + + +
  • + Wula/Building/Flag/WULA_Flag_Building_C + MoteGlow + (3,3) + 0 + (0,1,2) + 1.5 + 0.2 + 0 +
  • +
  • + Wula/Building/Flag/WULA_Flag_Building_Mount + Transparent + (1,1) + 1 + (0,1,0) + 0 + 0 + 0 +
  • + + +
    + + +
  • + 20 + (1, 1, 1) + 0 + true + + 区域传送器提供的传送范围 + true +
  • +
  • + 3600 +
  • +
  • + 20 + 60 + + +
  • WulaSpecies
  • + + true + + Skip_Entry + Skip_Exit + Psycast_Skip_Entry + +
    +
    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 2491615d..6d86dbea 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 @@ -2176,290 +2176,4 @@ - - - WULA_Holographic_Flag_Building_Skyfaller - - (1,1) - - Wula/Building/Flag/WULA_Flag_Building_Mount_Incoming - Graphic_Single - MoteGlow - (1,1) - - false - - - - Accelerate - Things/Skyfaller/SkyfallerShadowDropPod - (0, 0) - DropPod_Fall - 100 - Explosion_Vaporize - 0.05 - 1 - 1 - - -
  • (0,0)
  • -
  • (1, 1)
  • -
    -
    - WULA_Holographic_Flag_Building -
    - -
  • - Smoke_Joint -
  • -
    -
    - - WULA_Holographic_Flag_Building - - 乌拉帝国行星封锁机关的全息旗帜,除了宣誓主权外,也能激励附近的乌拉星人更加凶狠地战斗。 - WulaFallenEmpire.Building_ExtraGraphics - true - Building - 50 - true - PassThroughOnly - 1 - (1,1) - true - None - (0.56, 0.62, 0.9) - Wula/Building/Flag/WULA_Flag_Building_A - false - - Wula/Building/Flag/WULA_Flag_Building_Mount - Graphic_Single - (1,1) - - - 1 - - - 50 - 0.5 - 1000 - 5 - - Normal - true - false - North - true - Light - BulletImpact_Metal - true - RealtimeOnly - ConstructMetal - true - - - false - BuildingDestroyed_Metal_Big - true - true - - -
  • - 0 - 0 - - -
  • - Wula/Building/Flag/WULA_Flag_Building_A - MoteGlow - (3,3) - 0 - (0,1,2) - 1.5 - 0.2 - 0 -
  • -
  • - Wula/Building/Flag/WULA_Flag_Building_Mount - Transparent - (1,1) - 1 - (0,1,0) - 0 - 0 - 0 -
  • - - -
    - -
  • - 15 - Wula_Holographic_Flag_Hediff - 0.5 - true - 120 - 125 - -
  • WulaSpecies
  • - - true - false - false - -
  • - - true - false -
  • -
  • - 3 - (120,240,252,0) -
  • -
    -
    - - WULA_Support_Shield_Projection_Skyfaller - - - WULA_Support_Shield - - - - WULA_Support_Shield - - 乌拉帝国行星封锁机关的全息旗帜,除了宣誓主权外,也能激励附近的乌拉星人更加凶狠地战斗。这面旗帜的底座附带了一个大型拒止护盾,可以反射所有的敌方射弹,己方的开火不受影响。\n\n在工作一段时间后,该系统将自行烧毁。 - - -
  • - 0 - 0 - - -
  • - Wula/Building/Flag/WULA_Flag_Building_B - MoteGlow - (3,3) - 0 - (0,1,2) - 1.5 - 0.2 - 0 -
  • -
  • - Wula/Building/Flag/WULA_Flag_Building_Mount - Transparent - (1,1) - 1 - (0,1,0) - 0 - 0 - 0 -
  • - - -
    - - -
  • - 3600 -
  • -
  • - 12 - 150000 - 2400 - 30 - - - Interceptor_BlockedProjectile - Interceptor_BlockedProjectile - Shield_Break - BulletShieldGenerator_Reactivate - - (0.9, 0.2, 0.2, 0.5) - - - true - false - true - - - true - 1 - 30 - 0 - Interceptor_BlockedProjectile -
  • -
    -
    - - WULA_Support_AreaTeleporter_Skyfaller - - - WULA_Support_AreaTeleporter - - - - WULA_Support_AreaTeleporter - - 乌拉帝国行星封锁机关的全息旗帜,除了宣誓主权外,也能激励附近的乌拉星人更加凶狠地战斗。这面旗帜的底座附带了一个区域传送器,可以使得机械乌拉在旗帜区域内传送。\n\n在工作一段时间后,该系统将自行烧毁。 - - -
  • - 0 - 0 - - -
  • - Wula/Building/Flag/WULA_Flag_Building_C - MoteGlow - (3,3) - 0 - (0,1,2) - 1.5 - 0.2 - 0 -
  • -
  • - Wula/Building/Flag/WULA_Flag_Building_Mount - Transparent - (1,1) - 1 - (0,1,0) - 0 - 0 - 0 -
  • - - -
    - - -
  • - 20 - (1, 1, 1) - 0 - true - - 区域传送器提供的传送范围 - true -
  • -
  • - 3600 -
  • -
  • - 20 - 60 - - -
  • WulaSpecies
  • - - true - - Skip_Entry - Skip_Exit - Psycast_Skip_Entry - -
    -
    \ No newline at end of file diff --git a/1.6/1.6/Defs/ThingDefs_Races/Races_Wulaspecies.xml b/1.6/1.6/Defs/ThingDefs_Races/Races_Wulaspecies.xml index b256ae65..029e3e79 100644 --- a/1.6/1.6/Defs/ThingDefs_Races/Races_Wulaspecies.xml +++ b/1.6/1.6/Defs/ThingDefs_Races/Races_Wulaspecies.xml @@ -1132,7 +1132,7 @@ WULA_Cat_Bunker 部署为乌拉猫猫地堡 乌拉猫猫们把地堡扔在地上然后钻进去,重新转变为建筑。每一次转变为建筑后,都会有24小时的冷却时间,在此期间不允许重新变为BUk-1"地堡猫猫"。 - Wula/UI/Commands/WULA_TransformToBuilding + Wula/UI/Commands/WULA_BunkerCat @@ -1699,6 +1699,21 @@ MFm-2"陆行舰"可以将舰身稍微下沉一些并创造低压区,以碾压靠近的敌军——这同时会使得它伤害附近所有的散落物品。 Wula/UI/Commands/Wula_Mech_Mobile_Factory_AreaDamage + + +
  • + 20 + 60 + + +
  • WulaSpecies
  • + + true + + Skip_Entry + Skip_Exit + Psycast_Skip_Entry + diff --git a/1.6/1.6/Languages/ChineseSimplified (简体中文)/DefInjected/QuestScriptDef/WULA_Colony_Promotion.xml b/1.6/1.6/Languages/ChineseSimplified (简体中文)/DefInjected/QuestScriptDef/WULA_Colony_Promotion.xml index 8c2da0cc..2e6cf941 100644 --- a/1.6/1.6/Languages/ChineseSimplified (简体中文)/DefInjected/QuestScriptDef/WULA_Colony_Promotion.xml +++ b/1.6/1.6/Languages/ChineseSimplified (简体中文)/DefInjected/QuestScriptDef/WULA_Colony_Promotion.xml @@ -6,33 +6,4 @@
  • questDescription->殖民地已经承接了视察任务。\n\n行星封锁机关的总控AI已经派遣了自己的一个分体和护卫队抵达殖民地。考察持续12天,她会检查殖民地方方面面的运转情况,你需要确保其心情始终高于25%。考察完成后,她和卫队会搭乘穿梭机离开,如果一切顺利你们将获得殖民地晋升的机会,以解锁更多的许可科技。\n\n小心,附近的敌对派系已经知道了殖民地来了一个大人物,这些劫掠者会尝试袭击殖民地并抓住这个分体,你可能需要面对大量袭击!
  • - 任务失败:[resolvedQuestName] - - 应该乘坐穿梭机离开 - [faction_name]开始敌视你。 - 穿梭机被破坏 - 被派遣来运输[asker_nameDef]的穿梭机已被破坏。 - [asker_nameDef]已抵达 - [asker_nameDef]的分体和她的卫队已经抵达殖民地。\n\n你必须在穿梭机抵达前[shuttleDelayTicks_duration]内为[asker_objective]提供护卫并且满足[asker_possessive]各种需求。 - 宾客{SUBJECT_definite}死亡。 - 需要你护卫的{SUBJECT_definite}已经死亡。[failLetterEndingCommon] - - 穿梭机已抵达 - 穿梭机已经前来迎接[asker_nameDef]。 - {SUBJECT_bestRoyalTitle}情绪低落 - 需要你护卫和满足需求的{SUBJECT_definite},其情绪值已经长时间低于最低限度[lodgersMoodThreshold]。[failLetterEndingCommon] - 宾客{SUBJECT_definite}被俘。 - 需要你护卫的{SUBJECT_definite}已经被俘虏。[failLetterEndingCommon] - 未授权手术:{SUBJECT_definite} - 需要你护卫的{SUBJECT_definite}接受了一场未授权的多余手术。[failLetterEndingCommon] - 异种胚芽被吸收 - 指定由你保护的{SUBJECT_definite}在你的殖民地被吸收了异种胚芽。[failLetterEndingCommon] - 宾客失踪:{SUBJECT_definite} - 需要你护卫的{SUBJECT_definite}失踪在你的殖民地。[failLetterEndingCommon] - 穿梭机已被毁 - 前来迎接[asker_faction_leaderTitle]的穿梭机被摧毁了。[failLetterEndingCommon] - 宾客失踪:{SUBJECT_definite} - 需要你护卫的{SUBJECT_definite}在你的殖民地回归自然。[failLetterEndingCommon] - 任务失败:[resolvedQuestName] - 前来迎接[asker_faction_leaderTitle]的穿梭机没有接到[asker_objective]。[asker_pronoun]现在只能走回去。[failLetterEndingCommon] \ No newline at end of file diff --git a/1.6/1.6/Languages/ChineseSimplified (简体中文)/DefInjected/QuestScriptDef/WULA_Intro_Spy.xml b/1.6/1.6/Languages/ChineseSimplified (简体中文)/DefInjected/QuestScriptDef/WULA_Intro_Spy.xml index f2173c4f..26e15d02 100644 --- a/1.6/1.6/Languages/ChineseSimplified (简体中文)/DefInjected/QuestScriptDef/WULA_Intro_Spy.xml +++ b/1.6/1.6/Languages/ChineseSimplified (简体中文)/DefInjected/QuestScriptDef/WULA_Intro_Spy.xml @@ -6,30 +6,5 @@
  • questDescription->乌拉帝国行星封锁机关的总控AI向殖民地发送了一个请求。一位乌拉帝国密探已经暴露,正在遭受其他派系追杀——密探手无寸铁且携带重要信息,殖民地需要掩护它直到乌拉帝国的穿梭机抵达并将其接走。虽然对方未透露更多信息,不过她指明袭击不会太剧烈,密探已经甩掉了大部分敌人。
  • - {BASELABEL} 追捕[../asker_nameDef] - {BASETEXT}\n\n[enemyFaction_pawnsPlural]来此追捕[../asker_nameDef]。 - - 应该乘坐穿梭机出发 - 穿梭机已抵达 - 前来迎接[asker_nameDef]的穿梭机已抵达。 - 宾客已死亡:{SUBJECT_definite} - 需要你小心保护的{SUBJECT_definite}已经死亡。[failLetterEndingCommon] - 宾客被遗弃:{SUBJECT_definite} - 需要你小心保护的{SUBJECT_definite}被遗弃。[failLetterEndingCommon] - 未授权手术:{SUBJECT_definite} - 需要你小心保护的{SUBJECT_definite}接受了一次未授权的额外手术。因为你违规在先,[asker_pronoun]将要离开此处。[failLetterEndingCommon] - 异种胚芽被吸收:{SUBJECT_definite} - 指定由你保护的{SUBJECT_definite}在你的殖民地被吸收了异种胚芽。这是一种侵犯行为,{SUBJECT_pronoun}现在将会直接离开[failLetterEndingCommon]。 - 已被俘:{SUBJECT_definite} - 需要你小心保护的{SUBJECT_definite}已被俘虏。[failLetterEndingCommon] - 宾客失踪:{SUBJECT_definite} - 需要你小心保护的{SUBJECT_definite}在你的殖民地回归自然。[failLetterEndingCommon] - 宾客失踪:{SUBJECT_definite} - 需要你小心保护的{SUBJECT_definite}在你的殖民地回归自然。[failLetterEndingCommon] - 穿梭机被毁 - 前来迎接[asker_nameDef]的穿梭机已被毁。[asker_pronoun]现在只能走回去了。[failLetterEndingCommon] - 穿梭机被遗弃 - 前来迎接[asker_nameDef]的穿梭机已被遗弃。[asker_pronoun]现在只能走回去了。 - 任务失败:[resolvedQuestName] - 前来迎接[asker_nameDef]的穿梭机在离开时因为一些原因落下了[asker_objective]。[asker_pronoun]现在只能走回去了。[failLetterEndingCommon] + \ No newline at end of file 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 be17452a..a993352f 100644 --- a/1.6/1.6/Languages/ChineseSimplified (简体中文)/Keyed/Misc_Gameplay.xml +++ b/1.6/1.6/Languages/ChineseSimplified (简体中文)/Keyed/Misc_Gameplay.xml @@ -306,4 +306,9 @@ 扔掉当前武器,并装备该单位的初始武器 {0} 更换了武器为 {1} {0} 没有可用的武器类型 + + 隐藏区域反射盾 + 显示区域反射盾 + 隐藏该单位的区域反射盾,这不会影响其实际功能,仅影响视觉效果 + 显示该单位的区域反射盾,这不会影响其实际功能,仅影响视觉效果 \ No newline at end of file diff --git a/Content/Textures/Wula/Things/WULA_Mobile_Bunker/Bodies/Naked_Thin_east.png b/Content/Textures/Wula/Things/WULA_Mobile_Bunker/Bodies/Naked_Thin_east.png index 054c0023..c517e96b 100644 Binary files a/Content/Textures/Wula/Things/WULA_Mobile_Bunker/Bodies/Naked_Thin_east.png and b/Content/Textures/Wula/Things/WULA_Mobile_Bunker/Bodies/Naked_Thin_east.png differ diff --git a/Content/Textures/Wula/Things/WULA_Mobile_Bunker/Bodies/Naked_Thin_north.png b/Content/Textures/Wula/Things/WULA_Mobile_Bunker/Bodies/Naked_Thin_north.png index 00ec72b0..55688a31 100644 Binary files a/Content/Textures/Wula/Things/WULA_Mobile_Bunker/Bodies/Naked_Thin_north.png and b/Content/Textures/Wula/Things/WULA_Mobile_Bunker/Bodies/Naked_Thin_north.png differ diff --git a/Content/Textures/Wula/Things/WULA_Mobile_Bunker/Bodies/Naked_Thin_south.png b/Content/Textures/Wula/Things/WULA_Mobile_Bunker/Bodies/Naked_Thin_south.png index bd4812ec..c20f9645 100644 Binary files a/Content/Textures/Wula/Things/WULA_Mobile_Bunker/Bodies/Naked_Thin_south.png and b/Content/Textures/Wula/Things/WULA_Mobile_Bunker/Bodies/Naked_Thin_south.png differ diff --git a/Content/Textures/Wula/UI/Commands/WULA_BunkerCat.png b/Content/Textures/Wula/UI/Commands/WULA_BunkerCat.png new file mode 100644 index 00000000..63528ebc Binary files /dev/null and b/Content/Textures/Wula/UI/Commands/WULA_BunkerCat.png differ diff --git a/Content/Textures/Wula/UI/Commands/WULA_HideAreaShield.png b/Content/Textures/Wula/UI/Commands/WULA_HideAreaShield.png new file mode 100644 index 00000000..337b1658 Binary files /dev/null and b/Content/Textures/Wula/UI/Commands/WULA_HideAreaShield.png differ diff --git a/Source/WulaFallenEmpire/BuildingComp/WULA_TransformAtFullCapacity/CompTransformIntoBuilding.cs b/Source/WulaFallenEmpire/BuildingComp/WULA_TransformAtFullCapacity/CompTransformIntoBuilding.cs index e719840c..bd448d76 100644 --- a/Source/WulaFallenEmpire/BuildingComp/WULA_TransformAtFullCapacity/CompTransformIntoBuilding.cs +++ b/Source/WulaFallenEmpire/BuildingComp/WULA_TransformAtFullCapacity/CompTransformIntoBuilding.cs @@ -2,6 +2,7 @@ using RimWorld; using System.Collections.Generic; using UnityEngine; using Verse; +using System.Text; namespace WulaFallenEmpire { @@ -14,6 +15,11 @@ namespace WulaFallenEmpire private ThingDef restoreBuildingDef; private int restoreMechanoidCount; + // 缓存校验结果 + private bool? lastValidationResult = null; + private string lastValidationReason = null; + private int lastValidationTick = 0; + public override void Initialize(CompProperties props) { base.Initialize(props); @@ -46,9 +52,12 @@ namespace WulaFallenEmpire }; // 检查是否可以转换 - if (!CanTransformNow()) + string failReason; + bool canTransform = CanTransformNow(out failReason); + + if (!canTransform) { - command.Disable("无法在当前位置转换"); + command.Disable(failReason); } yield return command; @@ -57,12 +66,38 @@ namespace WulaFallenEmpire private string GetGizmoDescription() { - string desc = Props.gizmoDesc; + StringBuilder sb = new StringBuilder(); + sb.Append(Props.gizmoDesc); + if (restoreBuildingDef != null) { - desc += $"\n\n将恢复为: {restoreBuildingDef.LabelCap}"; + sb.AppendLine(); + sb.AppendLine(); + sb.Append($"将恢复为: {restoreBuildingDef.LabelCap}"); + + if (restoreMechanoidCount > 0) + { + sb.AppendLine(); + sb.Append($"恢复机械族储存: {restoreMechanoidCount}"); + } } - return desc; + + // 添加空间校验信息 + string failReason; + bool isValid = CanTransformNow(out failReason); + + sb.AppendLine(); + sb.AppendLine(); + if (isValid) + { + sb.Append("✓ 当前位置可以放置建筑"); + } + else + { + sb.Append($"✗ {failReason}"); + } + + return sb.ToString(); } private Texture2D GetGizmoIcon() @@ -74,25 +109,84 @@ namespace WulaFallenEmpire return TexCommand.Install; } - private bool CanTransformNow() + /// + /// 检查是否可以转换(带详细失败原因) + /// + private bool CanTransformNow(out string failReason) { - if (parent == null || !parent.Spawned) - return false; + failReason = null; - // 检查空间是否足够 + if (parent == null || !parent.Spawned) + { + failReason = "单位未生成或已销毁"; + return false; + } + + // 确定要生成的建筑类型 ThingDef buildingDef = restoreBuildingDef ?? Props.targetBuildingDef; if (buildingDef == null) - return false; - - foreach (IntVec3 cell in GenAdj.CellsOccupiedBy(Pawn.Position, Rot4.North, buildingDef.Size)) { - if (!cell.InBounds(Pawn.Map) || !cell.Walkable(Pawn.Map) || cell.GetEdifice(Pawn.Map) != null) + failReason = "无法确定目标建筑类型"; + return false; + } + + // 使用缓存优化性能(每60 tick检查一次) + if (lastValidationResult.HasValue && Find.TickManager.TicksGame - lastValidationTick < 60) + { + failReason = lastValidationReason; + return lastValidationResult.Value; + } + + // 执行完整的空间校验(排除被转换的Pawn本身) + bool isValid = TransformValidationUtility.CanPlaceBuildingAt( + buildingDef, + Pawn.Position, + Pawn.Map, + Pawn.Faction, + Pawn, // 排除被转换的Pawn本身 + out failReason + ); + + // 更新缓存 + lastValidationResult = isValid; + lastValidationReason = failReason; + lastValidationTick = Find.TickManager.TicksGame; + + return isValid; + } + + /// + /// 查找最近的可用位置 + /// + private bool TryFindNearbyValidPosition(out IntVec3 validPosition, out string failReason) + { + validPosition = IntVec3.Invalid; + failReason = null; + + ThingDef buildingDef = restoreBuildingDef ?? Props.targetBuildingDef; + if (buildingDef == null) + { + failReason = "无法确定目标建筑类型"; + return false; + } + + // 在周围搜索可用位置 + for (int radius = 1; radius <= 5; radius++) + { + foreach (IntVec3 cell in GenRadial.RadialPatternInRadius(radius)) { - return false; + IntVec3 checkPos = Pawn.Position + cell; + + if (TransformValidationUtility.CanPlaceBuildingAt(buildingDef, checkPos, Pawn.Map, Pawn.Faction, Pawn, out failReason)) + { + validPosition = checkPos; + return true; + } } } - return true; + failReason = "周围没有找到合适的放置位置"; + return false; } public void TransformToBuilding() @@ -101,7 +195,7 @@ namespace WulaFallenEmpire return; Map map = Pawn.Map; - IntVec3 position = Pawn.Position; + IntVec3 desiredPosition = Pawn.Position; Faction faction = Pawn.Faction; // 确定要生成的建筑类型 @@ -112,11 +206,29 @@ namespace WulaFallenEmpire return; } + // 最终校验(排除被转换的Pawn本身) + string failReason; + if (!TransformValidationUtility.CanPlaceBuildingAt(buildingDef, desiredPosition, map, faction, Pawn, out failReason)) + { + // 尝试寻找附近的位置 + IntVec3 alternativePosition; + if (TryFindNearbyValidPosition(out alternativePosition, out failReason)) + { + desiredPosition = alternativePosition; + Messages.Message($"将在附近位置 {desiredPosition} 部署建筑", MessageTypeDefOf.NeutralEvent); + } + else + { + Messages.Message($"无法部署建筑: {failReason}", MessageTypeDefOf.RejectInput); + return; + } + } + // 移除Pawn Pawn.DeSpawn(DestroyMode.Vanish); // 生成建筑 - Building newBuilding = (Building)GenSpawn.Spawn(buildingDef, position, map, WipeMode.Vanish); + Building newBuilding = (Building)GenSpawn.Spawn(buildingDef, desiredPosition, map, WipeMode.Vanish); newBuilding.SetFaction(faction); // 恢复机械族计数 @@ -151,20 +263,33 @@ namespace WulaFallenEmpire Messages.Message($"{Pawn.LabelCap} 已部署为 {newBuilding.Label}", MessageTypeDefOf.PositiveEvent); // 播放转换效果 - PlayTransformEffects(position, map); + PlayTransformEffects(desiredPosition, map); + + // 清除缓存 + lastValidationResult = null; + lastValidationReason = null; } private void PlayTransformEffects(IntVec3 position, Map map) { - //// 播放转换视觉效果 + // 播放转换视觉效果 //for (int i = 0; i < 3; i++) //{ // MoteMaker.ThrowSmoke(position.ToVector3Shifted() + new Vector3(0, 0, 0.5f), map, 1.5f); // MoteMaker.ThrowMicroSparks(position.ToVector3Shifted(), map); //} + } + + // 每tick更新校验状态(用于实时反馈) + public override void CompTick() + { + base.CompTick(); - //// 播放音效 - //SoundDefOf.MechClusterDefeated.PlayOneShot(new TargetInfo(position, map)); + // 每60 tick清除一次缓存,确保校验结果实时更新 + if (Find.TickManager.TicksGame % 60 == 0) + { + lastValidationResult = null; + } } } } diff --git a/Source/WulaFallenEmpire/BuildingComp/WULA_TransformAtFullCapacity/TransformValidationUtility.cs b/Source/WulaFallenEmpire/BuildingComp/WULA_TransformAtFullCapacity/TransformValidationUtility.cs new file mode 100644 index 00000000..96beeb6e --- /dev/null +++ b/Source/WulaFallenEmpire/BuildingComp/WULA_TransformAtFullCapacity/TransformValidationUtility.cs @@ -0,0 +1,218 @@ +using RimWorld; +using System.Collections.Generic; +using System.Text; +using UnityEngine; +using Verse; +using System.Linq; + +namespace WulaFallenEmpire +{ + public static class TransformValidationUtility + { + /// + /// 检查位置是否可以放置目标建筑(通用版本) + /// + public static bool CanPlaceBuildingAt(ThingDef buildingDef, IntVec3 center, Map map, Faction faction, out string failReason) + { + return CanPlaceBuildingAt(buildingDef, center, map, faction, null, out failReason); + } + + /// + /// 检查位置是否可以放置目标建筑(带忽略物体版本) + /// + public static bool CanPlaceBuildingAt(ThingDef buildingDef, IntVec3 center, Map map, Faction faction, Thing thingToIgnore, out string failReason) + { + failReason = null; + + // 1. 检查建筑定义 + if (buildingDef == null) + { + failReason = "目标建筑定义为空"; + return false; + } + + // 2. 检查建筑尺寸是否为奇数(根据您的需求) + if (!IsOddSizedBuilding(buildingDef)) + { + failReason = $"建筑 {buildingDef.LabelCap} 的尺寸不是奇数,不符合放置要求"; + return false; + } + + // 3. 检查地图边界 + if (!IsWithinMapBounds(buildingDef, center, map, out failReason)) + return false; + + // 4. 检查地形affordance + if (!HasValidTerrainAffordance(buildingDef, center, map, out failReason)) + return false; + + // 5. 检查其他建筑挤占(排除要忽略的物体) + if (!IsAreaClearOfBlockingBuildings(buildingDef, center, map, thingToIgnore, out failReason)) + return false; + + // 6. 检查特殊放置条件(如不可放置在水上等) + if (!MeetsSpecialPlacementConditions(buildingDef, center, map, out failReason)) + return false; + + // 7. 使用RimWorld原生的放置检查(最终验证) + if (!GenConstruct.CanPlaceBlueprintAt(buildingDef, center, Rot4.North, map, false, null, null, null)) + { + failReason = "该位置不符合建筑放置要求"; + return false; + } + + return true; + } + + /// + /// 检查建筑尺寸是否为奇数 + /// + public static bool IsOddSizedBuilding(ThingDef buildingDef) + { + return buildingDef.Size.x % 2 == 1 && buildingDef.Size.z % 2 == 1; + } + + /// + /// 检查地图边界 + /// + private static bool IsWithinMapBounds(ThingDef buildingDef, IntVec3 center, Map map, out string failReason) + { + CellRect occupiedRect = GenAdj.OccupiedRect(center, Rot4.North, buildingDef.Size); + + if (!occupiedRect.InBounds(map)) + { + failReason = "建筑超出地图边界"; + return false; + } + + failReason = null; + return true; + } + + /// + /// 检查地形affordance + /// + private static bool HasValidTerrainAffordance(ThingDef buildingDef, IntVec3 center, Map map, out string failReason) + { + TerrainAffordanceDef requiredAffordance = buildingDef.terrainAffordanceNeeded; + if (requiredAffordance == null) + { + // 如果没有指定affordance要求,则跳过检查 + failReason = null; + return true; + } + + CellRect occupiedRect = GenAdj.OccupiedRect(center, Rot4.North, buildingDef.Size); + + foreach (IntVec3 cell in occupiedRect) + { + if (!cell.InBounds(map)) + continue; + + TerrainDef terrain = map.terrainGrid.TerrainAt(cell); + if (terrain == null || !terrain.affordances.Contains(requiredAffordance)) + { + failReason = $"地形 {terrain?.LabelCap ?? "未知"} 不支持放置 {buildingDef.LabelCap}"; + return false; + } + } + + failReason = null; + return true; + } + + /// + /// 检查区域是否被其他建筑阻挡(排除指定物体) + /// + private static bool IsAreaClearOfBlockingBuildings(ThingDef buildingDef, IntVec3 center, Map map, Thing thingToIgnore, out string failReason) + { + CellRect occupiedRect = GenAdj.OccupiedRect(center, Rot4.North, buildingDef.Size); + List blockingThings = new List(); + + foreach (IntVec3 cell in occupiedRect) + { + if (!cell.InBounds(map)) + continue; + + // 检查该单元格上的所有建筑 + List thingList = map.thingGrid.ThingsListAt(cell); + foreach (Thing thing in thingList) + { + // 跳过要忽略的物体(如被转换的Pawn本身) + if (thing == thingToIgnore) + continue; + + if (thing.def.category == ThingCategory.Building || thing.def.category == ThingCategory.Pawn) + { + // 忽略蓝图和框架 + if (thing.def.IsBlueprint || thing.def.IsFrame) + continue; + + // 忽略被转换的Pawn本身 + if (thing == thingToIgnore) + continue; + + blockingThings.Add(thing); + } + } + } + + if (blockingThings.Count > 0) + { + StringBuilder sb = new StringBuilder(); + sb.AppendLine("以下物体阻挡了建筑放置:"); + + foreach (Thing thing in blockingThings) + { + sb.AppendLine($" - {thing.LabelCap}"); + } + + failReason = sb.ToString().TrimEnd(); + return false; + } + + failReason = null; + return true; + } + + /// + /// 检查特殊放置条件 + /// + private static bool MeetsSpecialPlacementConditions(ThingDef buildingDef, IntVec3 center, Map map, out string failReason) + { + CellRect occupiedRect = GenAdj.OccupiedRect(center, Rot4.North, buildingDef.Size); + + // 检查是否在水体上 + foreach (IntVec3 cell in occupiedRect) + { + if (!cell.InBounds(map)) + continue; + + TerrainDef terrain = map.terrainGrid.TerrainAt(cell); + if (terrain != null && (terrain.IsWater || terrain.defName.Contains("Water"))) + { + failReason = "无法在水体上放置建筑"; + return false; + } + + // 检查是否在不可建造的地形上 + if (terrain != null && !terrain.BuildableByPlayer) + { + failReason = $"地形 {terrain.LabelCap} 不可建造"; + return false; + } + } + + failReason = null; + return true; + } + + /// + /// 获取建筑占用的所有单元格 + /// + public static List GetOccupiedCells(ThingDef buildingDef, IntVec3 center) + { + return GenAdj.OccupiedRect(center, Rot4.North, buildingDef.Size).Cells.ToList(); + } + } +} diff --git a/Source/WulaFallenEmpire/ThingComp/WULA_AreaShield/ThingComp_AreaShield.cs b/Source/WulaFallenEmpire/ThingComp/WULA_AreaShield/ThingComp_AreaShield.cs index fd97d7c6..acb3cc43 100644 --- a/Source/WulaFallenEmpire/ThingComp/WULA_AreaShield/ThingComp_AreaShield.cs +++ b/Source/WulaFallenEmpire/ThingComp/WULA_AreaShield/ThingComp_AreaShield.cs @@ -10,12 +10,16 @@ namespace WulaFallenEmpire [StaticConstructorOnStartup] public class ThingComp_AreaShield : ThingComp { + // 现有的字段保持不变... private int lastInterceptTicks = -999999; public int ticksToReset = 0; public int currentHitPoints; private bool wasNotAtFullHp = false; private bool wasActiveLastCheck = false; + // 新增:绘制控制字段 + private bool drawShield = true; + // 视觉效果变量 private float lastInterceptAngle; private bool drawInterceptCone; @@ -43,30 +47,51 @@ namespace WulaFallenEmpire private const float TextureActualRingSizeFactor = 1.1601562f; private static readonly Color InactiveColor = new Color(0.2f, 0.2f, 0.2f); - // 护盾绘制方法 - 参考原版实现 + + // 新增:检查是否应该显示绘制控制按钮 + public bool ShouldShowDrawToggleGizmo + { + get + { + // 条件1:装备且穿戴在己方pawn身上 + if (IsEquipment && Wearer != null && Wearer.Faction == Faction.OfPlayer) + return true; + + // 条件2:固定物品且属于己方派系 + if (IsStandalone && parent.Faction == Faction.OfPlayer) + return true; + + return false; + } + } + + // 护盾绘制方法 - 修改:添加绘制控制检查 public override void CompDrawWornExtras() { base.CompDrawWornExtras(); - if (!IsEquipment) return; // 只有装备使用这个方法 + if (!IsEquipment || !drawShield) return; // 新增绘制控制检查 DrawShield(); } + public override void PostDraw() { base.PostDraw(); - if (IsEquipment) return; // 装备使用 CompDrawWornExtras + if (IsEquipment || !drawShield) return; // 新增绘制控制检查 DrawShield(); } + /// - /// 统一的护盾绘制方法 - 参考原版实现 + /// 统一的护盾绘制方法 - 修改:添加绘制控制检查 /// private void DrawShield() { - if (!Active || Holder?.Map == null || Holder.Destroyed) + if (!drawShield || !Active || Holder?.Map == null || Holder.Destroyed) // 新增绘制控制检查 return; + Vector3 drawPos = GetHolderDrawPos(); drawPos.y = AltitudeLayer.MoteOverhead.AltitudeFor(); float currentAlpha = GetCurrentAlpha(); @@ -96,9 +121,8 @@ namespace WulaFallenEmpire Graphics.DrawMesh(MeshPool.plane10, matrix, ForceFieldConeMat, 0, null, 0, MatPropertyBlock); } } - /// - /// 获取当前透明度 - 参考原版的多状态叠加 - /// + + // 现有的其他方法保持不变... private float GetCurrentAlpha() { // 多个透明度来源叠加,取最大值 @@ -113,9 +137,7 @@ namespace WulaFallenEmpire 0.1f // 最小透明度 ); } - /// - /// 空闲状态透明度 - /// + private float GetCurrentAlpha_Idle() { if (!Active) return 0f; @@ -144,9 +166,7 @@ namespace WulaFallenEmpire return 0f; } - /// - /// 被选中状态透明度 - 参考原版实现 - /// + private float GetCurrentAlpha_Selected() { // 如果被选中,显示更高的透明度 @@ -158,17 +178,13 @@ namespace WulaFallenEmpire return 0f; } - /// - /// 最近拦截状态透明度 - /// + private float GetCurrentAlpha_RecentlyIntercepted() { int ticksSinceIntercept = Find.TickManager.TicksGame - lastInterceptTicks; return Mathf.Clamp01(1f - (float)ticksSinceIntercept / 40f) * 0.3f; } - /// - /// 拦截锥形透明度 - /// + private float GetCurrentConeAlpha() { if (!drawInterceptCone) return 0f; @@ -176,9 +192,7 @@ namespace WulaFallenEmpire int ticksSinceIntercept = Find.TickManager.TicksGame - lastInterceptTicks; return Mathf.Clamp01(1f - (float)ticksSinceIntercept / 40f) * 0.82f; } - /// - /// 获取持有者绘制位置(回退机制) - /// + private Vector3 GetHolderDrawPos() { if (Holder is Pawn pawn) @@ -224,6 +238,7 @@ namespace WulaFallenEmpire { base.PostPostMake(); currentHitPoints = HitPointsMax; + drawShield = true; // 默认启用绘制 } public override void PostExposeData() @@ -232,6 +247,7 @@ namespace WulaFallenEmpire Scribe_Values.Look(ref lastInterceptTicks, "lastInterceptTicks", -999999); Scribe_Values.Look(ref ticksToReset, "ticksToReset", 0); Scribe_Values.Look(ref currentHitPoints, "currentHitPoints", 0); + Scribe_Values.Look(ref drawShield, "drawShield", true); // 新增:保存绘制状态 } public override void CompTick() @@ -273,6 +289,56 @@ namespace WulaFallenEmpire } } + // 新增:绘制控制Gizmo + private Gizmo CreateDrawToggleGizmo() + { + Command_Toggle toggle = new Command_Toggle + { + defaultLabel = drawShield ? "WULA_HideAreaShieldLabel".Translate() : "WULA_ShowAreaShieldLabel".Translate(), + defaultDesc = drawShield ? "WULA_HideAreaShieldDesc".Translate() : "WULA_ShowAreaShieldDesc".Translate(), + icon = ContentFinder.Get("Wula/UI/Commands/WULA_HideAreaShield"), + isActive = () => drawShield, + toggleAction = () => drawShield = !drawShield + }; + + return toggle; + } + + public override IEnumerable CompGetWornGizmosExtra() + { + EnsureInitialized(); + + // 原有的状态显示Gizmo + if (IsEquipment && Wearer != null && Find.Selector.SingleSelectedThing == Wearer) + { + yield return new Gizmo_AreaShieldStatus { shield = this }; + + // 新增:绘制控制按钮(只在符合条件的装备上显示) + if (ShouldShowDrawToggleGizmo) + { + yield return CreateDrawToggleGizmo(); + } + } + } + + public override IEnumerable CompGetGizmosExtra() + { + EnsureInitialized(); + + // 原有的状态显示Gizmo + if (IsStandalone && Find.Selector.SingleSelectedThing == parent) + { + yield return new Gizmo_AreaShieldStatus { shield = this }; + + // 新增:绘制控制按钮(只在符合条件的固定物品上显示) + if (ShouldShowDrawToggleGizmo) + { + yield return CreateDrawToggleGizmo(); + } + } + } + + // 现有的其他方法保持不变... private void ApplyCosts(int cost = 1) { currentHitPoints -= cost; @@ -566,6 +632,7 @@ namespace WulaFallenEmpire return false; } } + private void EnsureInitialized() { if (initialized) return; @@ -579,27 +646,6 @@ namespace WulaFallenEmpire initialized = true; } - public override IEnumerable CompGetWornGizmosExtra() - { - EnsureInitialized(); - - if (IsEquipment && Wearer != null && Find.Selector.SingleSelectedThing == Wearer) - { - yield return new Gizmo_AreaShieldStatus { shield = this }; - } - } - - public override IEnumerable CompGetGizmosExtra() - { - EnsureInitialized(); - - // 固定物品也显示护盾状态 - if (IsStandalone && Find.Selector.SingleSelectedThing == parent) - { - yield return new Gizmo_AreaShieldStatus { shield = this }; - } - } - public override void Notify_Equipped(Pawn pawn) { base.Notify_Equipped(pawn); diff --git a/Source/WulaFallenEmpire/ThingComp/WULA_AreaTeleporter/ThingComp_AreaTeleporter.cs b/Source/WulaFallenEmpire/ThingComp/WULA_AreaTeleporter/ThingComp_AreaTeleporter.cs index 33db4ec0..dc82d436 100644 --- a/Source/WulaFallenEmpire/ThingComp/WULA_AreaTeleporter/ThingComp_AreaTeleporter.cs +++ b/Source/WulaFallenEmpire/ThingComp/WULA_AreaTeleporter/ThingComp_AreaTeleporter.cs @@ -509,14 +509,14 @@ namespace WulaFallenEmpire try { // 绘制当前传送器范围 - GenDraw.DrawRadiusRing(parent.Position, Props.teleportRadius, Color.blue); + GenDraw.DrawRadiusRing(parent.Position, Props.teleportRadius, new Color(0.3f, 0.7f, 1, 0.3f)); // 绘制网络范围(所有传送器的范围) foreach (var teleporter in GetNetworkTeleporters()) { if (teleporter != this && teleporter.parent.Spawned) { - GenDraw.DrawRadiusRing(teleporter.parent.Position, teleporter.Props.teleportRadius, new Color(0, 0, 1, 0.3f)); + GenDraw.DrawRadiusRing(teleporter.parent.Position, teleporter.Props.teleportRadius, new Color(0.3f, 0.7f, 1, 0.3f)); } } } diff --git a/Source/WulaFallenEmpire/WulaFallenEmpire.csproj b/Source/WulaFallenEmpire/WulaFallenEmpire.csproj index 7f738072..b9545d6c 100644 --- a/Source/WulaFallenEmpire/WulaFallenEmpire.csproj +++ b/Source/WulaFallenEmpire/WulaFallenEmpire.csproj @@ -126,6 +126,7 @@ + diff --git a/美术与文本源文件/Wula/UI/Commands/WULA_BunkerCat.png b/美术与文本源文件/Wula/UI/Commands/WULA_BunkerCat.png new file mode 100644 index 00000000..63528ebc Binary files /dev/null and b/美术与文本源文件/Wula/UI/Commands/WULA_BunkerCat.png differ diff --git a/美术与文本源文件/Wula/UI/Commands/WULA_BunkerCat.sai2 b/美术与文本源文件/Wula/UI/Commands/WULA_BunkerCat.sai2 new file mode 100644 index 00000000..6751a070 Binary files /dev/null and b/美术与文本源文件/Wula/UI/Commands/WULA_BunkerCat.sai2 differ diff --git a/美术与文本源文件/Wula/UI/Commands/WULA_ShowAreaShield.sai2 b/美术与文本源文件/Wula/UI/Commands/WULA_ShowAreaShield.sai2 new file mode 100644 index 00000000..86f645e8 Binary files /dev/null and b/美术与文本源文件/Wula/UI/Commands/WULA_ShowAreaShield.sai2 differ