diff --git a/1.6/1.6/Assemblies/WulaFallenEmpire.dll b/1.6/1.6/Assemblies/WulaFallenEmpire.dll
index 122dd57b..e500a146 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 922a162e..c94a659c 100644
--- a/1.6/1.6/Defs/AbilityDefs/WULA_Flyover_Ability.xml
+++ b/1.6/1.6/Defs/AbilityDefs/WULA_Flyover_Ability.xml
@@ -8,6 +8,8 @@
1
Misc12
false
+ true
+ false
Verb_CastAbility
true
@@ -182,7 +184,6 @@
1.5
1.0,0.3,0.1,0.3
ShipChunkIncoming
- true
diff --git a/1.6/1.6/Defs/EventDefs/EventDef_Examples.xml b/1.6/1.6/Defs/EventDefs/EventDef_Examples.xml
index 541d50bb..581808c2 100644
--- a/1.6/1.6/Defs/EventDefs/EventDef_Examples.xml
+++ b/1.6/1.6/Defs/EventDefs/EventDef_Examples.xml
@@ -6,7 +6,6 @@
Wula/Events/Portraits/WULA_Anisia_1
URa-1138「艾妮西娅」
- WulaFallenEmpire.Dialog_NewLayoutDisplay
很高兴看到你们的殖民地没有变成荒野中的烂泥。那么,今天找我有什么事情?
宇宙生存法则第一条:不要惹平胸火气大的女人。
diff --git a/1.6/1.6/Defs/EventDefs/EventDef_Wula/Wula_MainEvent.xml b/1.6/1.6/Defs/EventDefs/EventDef_Wula/Wula_MainEvent.xml
index df640178..52c34cac 100644
--- a/1.6/1.6/Defs/EventDefs/EventDef_Wula/Wula_MainEvent.xml
+++ b/1.6/1.6/Defs/EventDefs/EventDef_Wula/Wula_MainEvent.xml
@@ -9,6 +9,61 @@
这里是P.I.A,通讯信号良好,等待输入。
+
+
+ true
+ (133,206,219,185)
+ (133,206,219,185)
+ (255,255,255,255)
+ (255,255,255,255)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
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 9972c004..1e3efef3 100644
--- a/1.6/1.6/Defs/HediffDefs/WULA_FM_Hediffs.xml
+++ b/1.6/1.6/Defs/HediffDefs/WULA_FM_Hediffs.xml
@@ -26,7 +26,7 @@
Wula_FM_Switc_Aircraft
0
- Wula/UI/Commands/WULA_NanoSwitch
+ Wula/UI/Commands/WULA_Antenna_Switch
false
diff --git a/1.6/1.6/Defs/ThingDefs/WULA_Item.xml b/1.6/1.6/Defs/ThingDefs/WULA_Item.xml
index 86f1ae76..9802a6aa 100644
--- a/1.6/1.6/Defs/ThingDefs/WULA_Item.xml
+++ b/1.6/1.6/Defs/ThingDefs/WULA_Item.xml
@@ -1,5 +1,168 @@
+
+ WULA_Alloy
+
+
+
+ Wula/Item/WULA_Neutronium
+ Graphic_Single
+
+ None
+ false
+ Metal_Drop
+ Metal_Drop
+ false
+ false
+
+ 1
+ 1
+ 3
+ 3
+ 1
+ 0
+ 0
+ 2
+ 3
+
+
+ ResourcesRaw
+
+ false
+ true
+
+
+ Metallic
+
+ Metal
+ 0
+ false
+ ConstructMetal
+ (63, 74, 70)
+ BulletImpact_Metal
+ MeleeHit_Metal_Sharp
+ MeleeHit_Metal_Blunt
+ Pawn_Melee_Punch_HitBuilding_Metal
+
+ 0
+
+
+ 5
+ 0
+ 10
+ 10
+ 10
+ 1.1
+
+
+ Heavy
+ 200
+ 50
+
+
+ WULA_Dark_Matter_Item
+
+ 由乌拉帝国技术完成封装的一小块暗物质,这种神秘物质具有许多似乎可以打破所谓自然法则的性质。\n\n注意:暗物质约束装置很脆弱,受到冲击时将引发大范围湮灭反应!
+
+ Wula/Item/WULA_Dark_Matter_Item
+ Graphic_Single
+
+ Normal
+ false
+ false
+ Metal_Drop
+ Metal_Drop
+ false
+ false
+
+ 1000
+ 0.01
+ 50
+
+
+ ResourcesRaw
+
+ false
+ Medium
+ 80
+ 1
+
+
+ 30
+ BombSuper
+ 1
+
+ Bullet
+ Arrow
+ ArrowHighVelocity
+
+ 0.333
+
+ 1
+ 1
+
+
+
+
+ WULA_Neutronium
+
+ 零素也称中子元素,是中子星的主要构成成分,相比常规合金更适合作为装甲和近战武器的铸造材料,乌拉帝国通过以暗物质驱动的科技进行材料压缩,可以人为地制造这种强大材料。
+
+ Wula/Item/WULA_Neutronium
+ Graphic_Single
+
+ None
+ false
+ Metal_Drop
+ Metal_Drop
+ false
+ false
+
+ 1
+ 1
+ 3
+ 3
+ 1
+ 0
+ 0
+ 2
+ 3
+
+
+ ResourcesRaw
+
+ false
+ true
+
+
+ Metallic
+
+ Metal
+ 0
+ false
+ ConstructMetal
+ (63, 74, 70)
+ BulletImpact_Metal
+ MeleeHit_Metal_Sharp
+ MeleeHit_Metal_Blunt
+ Pawn_Melee_Punch_HitBuilding_Metal
+
+ 0
+
+
+ 5
+ 0
+ 10
+ 10
+ 10
+ 1.1
+
+
+ Heavy
+ 200
+ 50
+
+
WULA_Charge_Cube
@@ -206,110 +369,6 @@
50
-
- WULA_Dark_Matter_Item
-
- 由乌拉帝国技术完成封装的一小块暗物质,这种神秘物质具有许多似乎可以打破所谓自然法则的性质。\n\n注意:暗物质约束装置很脆弱,受到冲击时将引发大范围湮灭反应!
-
- Wula/Item/WULA_Dark_Matter_Item
- Graphic_Single
-
- Normal
- false
- false
- Metal_Drop
- Metal_Drop
- false
- false
-
- 1000
- 0.01
- 50
-
-
- ResourcesRaw
-
- false
- Medium
- 80
- 1
-
-
- 30
- BombSuper
- 1
-
- Bullet
- Arrow
- ArrowHighVelocity
-
- 0.333
-
- 1
- 1
-
-
-
-
- WULA_Neutronium
-
- 零素也称中子元素,是中子星的主要构成成分,相比常规合金更适合作为装甲和近战武器的铸造材料,乌拉帝国通过以暗物质驱动的科技进行材料压缩,可以人为地制造这种强大材料。
-
- Wula/Item/WULA_Neutronium
- Graphic_Single
-
- None
- false
- Metal_Drop
- Metal_Drop
- false
- false
-
- 1
- 1
- 3
- 3
- 1
- 0
- 0
- 2
- 3
-
-
- ResourcesRaw
-
- false
- true
-
-
- Metallic
-
- Metal
- 0
- false
- ConstructMetal
- (63, 74, 70)
- BulletImpact_Metal
- MeleeHit_Metal_Sharp
- MeleeHit_Metal_Blunt
- Pawn_Melee_Punch_HitBuilding_Metal
-
- 0
-
-
- 5
- 0
- 10
- 10
- 10
- 1.1
-
-
- Heavy
- 200
- 50
-
-
Wula_Organic_Precursor
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 32cd228b..5eac5c1e 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
@@ -58,6 +58,7 @@
WULA_Flyover_BaseBuilder
true
+ 3
@@ -111,6 +112,13 @@
false
false
MetaOverlays
+
+
+ WULA_Flyover_Airstrick
+ true
+ 0
+
+
WULA_Fighter_A
diff --git a/1.6/1.6/Defs/ThingDefs_Misc/Weapons/WULA_FE_Remake_Weapon.xml b/1.6/1.6/Defs/ThingDefs_Misc/Weapons/WULA_FE_Remake_Weapon.xml
index 3181ff15..b007904d 100644
--- a/1.6/1.6/Defs/ThingDefs_Misc/Weapons/WULA_FE_Remake_Weapon.xml
+++ b/1.6/1.6/Defs/ThingDefs_Misc/Weapons/WULA_FE_Remake_Weapon.xml
@@ -69,27 +69,27 @@
Melee
- 1.5
+ 1
true
WULA_ExperienceDataPack_Melee
- 1000
+ 2000
Good
WULA_WeaponEvolving
- 3000
+ 6000
Excellent
WULA_WeaponEvolving
- 6000
+ 12000
Masterwork
WULA_WeaponEvolving
- 10000
+ 20000
Legendary
WULA_WeaponMastering
@@ -435,27 +435,27 @@
Shooting
- 1.5
+ 1
true
WULA_ExperienceDataPack_Shooting
- 1000
+ 2000
Good
WULA_WeaponEvolving
- 3000
+ 6000
Excellent
WULA_WeaponEvolving
- 6000
+ 12000
Masterwork
WULA_WeaponEvolving
- 10000
+ 20000
Legendary
WULA_WeaponMastering
diff --git a/1.6/1.6/Defs/WulaMiscSettingDefs/EventUIConfig.xml b/1.6/1.6/Defs/WulaMiscSettingDefs/EventUIConfig.xml
index 88d27abe..257a266d 100644
--- a/1.6/1.6/Defs/WulaMiscSettingDefs/EventUIConfig.xml
+++ b/1.6/1.6/Defs/WulaMiscSettingDefs/EventUIConfig.xml
@@ -1,37 +1,53 @@
-
+
-
Wula_EventUIConfig
-
- Small
- true
+
+ false
+ false
+ Wula/Events/tile_large_bg
+
+
+ (600,850)
+
+
+ true
+ false
+ true
+ true
+ true
+
+
+ false
+
+
+ (600,400)
+ (600,40)
+ (600,30)
+ (500,150)
+ (600,200)
+ (500,150)
+
+
+ (0,10)
+ (10,0)
+ (10,0)
+ (10,20)
+ (10,0)
+
+
+ (10,25)
+
+
+ (20,20)
+
+
+ 20
+
+
+ false
false
- true
-
-
-
- (1093, 687)
- (593, 530)
- (593, 330)
- 750
-
-
- 0
- 0
-
- (693, 887)
-
-
- (200, 50)
- (600, 200)
- (600, 200)
- 600
- 20
- 20
- 20
-
+ Medium
-
-
+
\ No newline at end of file
diff --git a/Content/Textures/Wula/Events/Portraits/PIA.png b/Content/Textures/Wula/Events/Portraits/PIA.png
new file mode 100644
index 00000000..e59a9188
Binary files /dev/null and b/Content/Textures/Wula/Events/Portraits/PIA.png differ
diff --git a/Content/Textures/Wula/Events/Portraits/WULA_Legion_1.png b/Content/Textures/Wula/Events/Portraits/WULA_Legion_1.png
index 4893933c..fccf58df 100644
Binary files a/Content/Textures/Wula/Events/Portraits/WULA_Legion_1.png and b/Content/Textures/Wula/Events/Portraits/WULA_Legion_1.png differ
diff --git a/Content/Textures/Wula/Events/tile_large_bg.png b/Content/Textures/Wula/Events/tile_large_bg.png
new file mode 100644
index 00000000..51e97906
Binary files /dev/null and b/Content/Textures/Wula/Events/tile_large_bg.png differ
diff --git a/Content/Textures/Wula/Storyteller/WULA_Legion.png b/Content/Textures/Wula/Storyteller/WULA_Legion.png
index 328fe49f..0fe83e60 100644
Binary files a/Content/Textures/Wula/Storyteller/WULA_Legion.png and b/Content/Textures/Wula/Storyteller/WULA_Legion.png differ
diff --git a/Content/Textures/Wula/Storyteller/WULA_Legion_TINY.png b/Content/Textures/Wula/Storyteller/WULA_Legion_TINY.png
index 6f3f30dc..c1f30154 100644
Binary files a/Content/Textures/Wula/Storyteller/WULA_Legion_TINY.png and b/Content/Textures/Wula/Storyteller/WULA_Legion_TINY.png differ
diff --git a/Content/Textures/Wula/UI/Commands/WULA_Antenna_Switch.png b/Content/Textures/Wula/UI/Commands/WULA_Antenna_Switch.png
new file mode 100644
index 00000000..48d5ece7
Binary files /dev/null and b/Content/Textures/Wula/UI/Commands/WULA_Antenna_Switch.png differ
diff --git a/Source/WulaFallenEmpire/EventSystem/Dialog_CustomDisplay.cs b/Source/WulaFallenEmpire/EventSystem/Dialog_CustomDisplay.cs
index 0a660a56..a1663173 100644
--- a/Source/WulaFallenEmpire/EventSystem/Dialog_CustomDisplay.cs
+++ b/Source/WulaFallenEmpire/EventSystem/Dialog_CustomDisplay.cs
@@ -27,24 +27,28 @@ namespace WulaFallenEmpire
}
}
+ // 使用配置的窗口尺寸
public override Vector2 InitialSize
{
get
{
- if (def.windowSize != Vector2.zero)
- {
- return def.windowSize;
- }
- return Config.defaultWindowSize;
+ return def.windowSize != Vector2.zero ? def.windowSize : Config.windowSize;
}
}
public Dialog_CustomDisplay(EventDef def)
{
this.def = def;
- this.forcePause = true;
+
+ // 关键修改:使用配置控制是否暂停游戏
+ this.forcePause = Config.pauseGameOnOpen;
+
this.absorbInputAroundWindow = true;
this.doCloseX = true;
+
+ // 根据配置设置是否绘制窗口背景和阴影
+ this.doWindowBackground = Config.showMainWindow;
+ this.drawShadow = Config.showMainWindow;
var eventVarManager = Find.World.GetComponent();
if (!def.descriptions.NullOrEmpty())
@@ -73,12 +77,33 @@ namespace WulaFallenEmpire
public override void PreOpen()
{
base.PreOpen();
- if (!def.portraitPath.NullOrEmpty())
+
+ // 加载立绘
+ if (Config.showPortrait && !def.portraitPath.NullOrEmpty())
{
portrait = ContentFinder.Get(def.portraitPath);
}
- string bgPath = !def.backgroundImagePath.NullOrEmpty() ? def.backgroundImagePath : Config.defaultBackgroundImagePath;
+ // 加载背景 - 优先级:事件定义背景 > 自定义背景 > 默认背景
+ string bgPath = null;
+
+ // 1. 首先检查事件定义中的背景
+ if (!def.backgroundImagePath.NullOrEmpty())
+ {
+ bgPath = def.backgroundImagePath;
+ }
+ // 2. 然后检查自定义背景
+ else if (!string.IsNullOrEmpty(Config.customBackgroundImagePath))
+ {
+ bgPath = Config.customBackgroundImagePath;
+ }
+ // 3. 最后检查是否使用默认背景
+ else if (Config.useDefaultBackground)
+ {
+ // 这里可以设置一个默认背景路径,或者留空
+ // bgPath = "UI/Backgrounds/DefaultEventBackground";
+ }
+
if (!bgPath.NullOrEmpty())
{
background = ContentFinder.Get(bgPath);
@@ -103,60 +128,55 @@ namespace WulaFallenEmpire
public override void DoWindowContents(Rect inRect)
{
- // 绘制背景
+ // 绘制自定义背景(如果有)
if (background != null)
{
- GUI.DrawTexture(inRect, background, ScaleMode.ScaleToFit);
+ GUI.DrawTexture(inRect, background, ScaleMode.StretchToFill);
}
- // 调试信息(def名称)
- if (Config.showDefName)
+ float currentY = 0f;
+
+ // 1. 立绘
+ if (Config.showPortrait)
{
- Text.Font = GameFont.Tiny;
- GUI.color = Color.gray;
- Widgets.Label(new Rect(5, 5, inRect.width - 10, 20f), def.defName);
- GUI.color = Color.white;
+ currentY += Config.GetScaledMargin(Config.portraitMargins.x, inRect);
+
+ Rect portraitRect = Config.GetScaledRect(Config.portraitSize, inRect);
+ portraitRect.y = currentY;
+
+ if (portrait != null)
+ {
+ // 保持图片比例
+ float aspectRatio = (float)portrait.width / portrait.height;
+ float portraitWidth = portraitRect.height * aspectRatio;
+
+ // 居中显示
+ Rect centeredPortraitRect = new Rect(
+ portraitRect.center.x - portraitWidth / 2,
+ portraitRect.y,
+ portraitWidth,
+ portraitRect.height
+ );
+
+ GUI.DrawTexture(centeredPortraitRect, portrait, ScaleMode.ScaleToFit);
+ }
+
+ if (Config.drawBorders)
+ {
+ Widgets.DrawBox(portraitRect);
+ }
+
+ currentY += portraitRect.height + Config.GetScaledMargin(Config.portraitMargins.y, inRect);
}
- // 使用新的布局参数
- float scale = CalculateScale(inRect);
-
- // 使用新的布局尺寸
- float scaledLihuiWidth = Config.newLayoutLihuiSize.x * scale;
- float scaledLihuiHeight = Config.newLayoutLihuiSize.y * scale;
- float scaledTextWidth = Config.newLayoutTextSize.x * scale;
- float scaledTextHeight = Config.newLayoutTextSize.y * scale;
- float scaledOptionsWidth = Config.newLayoutOptionsWidth * scale;
-
- // 计算各元素高度
- float labelHeight = 30f * scale;
- float characterNameHeight = 25f * scale;
- float descriptionHeight = scaledTextHeight;
- float optionsHeight = CalculateOptionsHeight(def.options, scaledOptionsWidth, scale);
-
- // 使用新的间距参数
- float topMargin = Config.newLayoutPadding * scale;
- float elementSpacing = Config.newLayoutTextNameOffset * scale;
- float textOptionsSpacing = Config.newLayoutOptionsTextOffset * scale;
-
- float currentY = topMargin;
-
- // 1. 立绘(水平居中,顶着顶部)
- Rect lihuiRect = new Rect((inRect.width - scaledLihuiWidth) / 2, currentY, scaledLihuiWidth, scaledLihuiHeight);
- if (portrait != null)
- {
- GUI.DrawTexture(lihuiRect, portrait, ScaleMode.ScaleToFit);
- }
- if (Config.drawBorders)
- {
- Widgets.DrawBox(lihuiRect);
- }
- currentY += scaledLihuiHeight + elementSpacing;
-
- // 2. Label(水平居中)
+ // 2. Label
if (Config.showLabel)
{
- Rect labelRect = new Rect(0, currentY, inRect.width, labelHeight);
+ currentY += Config.GetScaledMargin(Config.labelMargins.x, inRect);
+
+ Rect labelRect = Config.GetScaledRect(Config.labelSize, inRect);
+ labelRect.y = currentY;
+
Text.Anchor = TextAnchor.MiddleCenter;
Text.Font = Config.labelFont;
Widgets.Label(labelRect, def.label);
@@ -167,68 +187,108 @@ namespace WulaFallenEmpire
{
Widgets.DrawBox(labelRect);
}
- currentY += labelHeight + elementSpacing;
+
+ currentY += labelRect.height + Config.GetScaledMargin(Config.labelMargins.y, inRect);
}
- // 3. CharacterName(水平居中)
- Rect nameRect = new Rect(0, currentY, inRect.width, characterNameHeight);
- Text.Anchor = TextAnchor.MiddleCenter;
- Text.Font = GameFont.Medium;
- Widgets.Label(nameRect, def.characterName);
- Text.Font = GameFont.Small;
- Text.Anchor = TextAnchor.UpperLeft;
-
- if (Config.drawBorders)
+ // 3. CharacterName
+ if (Config.showCharacterName)
{
- Widgets.DrawBox(nameRect);
+ currentY += Config.GetScaledMargin(Config.characterNameMargins.x, inRect);
+
+ Rect nameRect = Config.GetScaledRect(Config.characterNameSize, inRect);
+ nameRect.y = currentY;
+
+ Text.Anchor = TextAnchor.MiddleCenter;
+ Text.Font = GameFont.Medium;
+ Widgets.Label(nameRect, def.characterName);
+ Text.Font = GameFont.Small;
+ Text.Anchor = TextAnchor.UpperLeft;
+
+ if (Config.drawBorders)
+ {
+ Widgets.DrawBox(nameRect);
+ }
+
+ currentY += nameRect.height + Config.GetScaledMargin(Config.characterNameMargins.y, inRect);
}
- currentY += characterNameHeight + elementSpacing;
- // 4. Descriptions(水平居中)
- Rect textRect = new Rect((inRect.width - scaledTextWidth) / 2, currentY, scaledTextWidth, descriptionHeight);
- if (Config.drawBorders)
+ // 4. 描述
+ if (Config.showDescriptions)
{
- Widgets.DrawBox(textRect);
+ currentY += Config.GetScaledMargin(Config.descriptionsMargins.x, inRect);
+
+ Rect descriptionRect = Config.GetScaledRect(Config.descriptionsSize, inRect);
+ descriptionRect.y = currentY;
+
+ if (Config.drawBorders)
+ {
+ Widgets.DrawBox(descriptionRect);
+ }
+
+ // 应用描述区域内边距
+ Vector2 scaledDescriptionsPadding = Config.GetScaledDescriptionsPadding(descriptionRect);
+ Rect descriptionInnerRect = descriptionRect.ContractedBy(scaledDescriptionsPadding.y, scaledDescriptionsPadding.x);
+
+ // 使用可滚动的文本区域
+ float textHeight = Text.CalcHeight(selectedDescription, descriptionInnerRect.width);
+ Rect viewRect = new Rect(0, 0, descriptionInnerRect.width, Mathf.Max(textHeight, descriptionInnerRect.height));
+
+ Widgets.BeginScrollView(descriptionInnerRect, ref descriptionScrollPosition, viewRect);
+ Widgets.Label(new Rect(0, 0, viewRect.width, viewRect.height), selectedDescription);
+ Widgets.EndScrollView();
+
+ currentY += descriptionRect.height + Config.GetScaledMargin(Config.descriptionsMargins.y, inRect);
}
-
- // 增加内边距
- float textInnerPadding = 15f * scale;
- Rect textInnerRect = textRect.ContractedBy(textInnerPadding);
- Widgets.LabelScrollable(textInnerRect, selectedDescription, ref scrollPosition);
-
- currentY += descriptionHeight + textOptionsSpacing;
- // 5. Options(水平居中)
- Rect optionRect = new Rect((inRect.width - scaledOptionsWidth) / 2, currentY, scaledOptionsWidth, optionsHeight);
- if (Config.drawBorders)
+ // 5. 选项列表
+ if (Config.showOptions)
{
- Widgets.DrawBox(optionRect);
+ currentY += Config.GetScaledMargin(Config.optionsListMargins.x, inRect);
+
+ Rect optionsRect = Config.GetScaledRect(Config.optionsListSize, inRect);
+ optionsRect.y = currentY;
+
+ if (Config.drawBorders)
+ {
+ Widgets.DrawBox(optionsRect);
+ }
+
+ DrawOptions(optionsRect, def.options);
+
+ currentY += optionsRect.height + Config.GetScaledMargin(Config.optionsListMargins.y, inRect);
+ }
+
+ // 调试信息
+ if (Config.showDefName)
+ {
+ Text.Font = GameFont.Tiny;
+ GUI.color = Color.gray;
+ Widgets.Label(new Rect(5, 5, inRect.width - 10, 20f), def.defName);
+ GUI.color = Color.white;
}
-
- // 增加内边距
- float optionsInnerPadding = 10f * scale;
- DrawOptions(optionRect.ContractedBy(optionsInnerPadding), def.options, scale);
}
- // 计算缩放比例 - 使用新的布局参数
- private float CalculateScale(Rect inRect)
- {
- float virtualWidth = Mathf.Max(
- Config.newLayoutLihuiSize.x,
- Config.newLayoutTextSize.x,
- Config.newLayoutOptionsWidth
- );
- float scaleX = inRect.width / virtualWidth;
- return Mathf.Min(scaleX, 1.0f) * 0.85f; // 稍微减少缩放以留出更多边距
- }
+ // 滚动位置
+ private Vector2 descriptionScrollPosition = Vector2.zero;
+ private Vector2 optionsScrollPosition = Vector2.zero;
- // 计算选项区域高度
- private float CalculateOptionsHeight(List options, float optionsWidth, float scale)
+ // 绘制选项区域
+ private void DrawOptions(Rect rect, List options)
{
if (options == null || options.Count == 0)
- return 0f;
+ return;
- float totalHeight = 0f;
+ // 应用选项列表内边距
+ Vector2 scaledPadding = Config.GetScaledOptionsListPadding(rect);
+ Rect optionsInnerRect = rect.ContractedBy(scaledPadding.x, scaledPadding.y);
+
+ // 计算缩放后的选项尺寸和间距
+ Vector2 scaledOptionSize = Config.GetScaledOptionSize(optionsInnerRect);
+ float scaledOptionSpacing = Config.GetScaledOptionSpacing(optionsInnerRect);
+
+ // 计算可见的选项
+ var visibleOptions = new List();
var eventVarManager = Find.World.GetComponent();
foreach (var option in options)
@@ -240,56 +300,149 @@ namespace WulaFallenEmpire
{
continue;
}
-
- // 增加选项高度和间距
- totalHeight += 35f * scale; // 每个选项高度
- totalHeight += 8f * scale; // 选项间距
+ visibleOptions.Add(option);
}
- return totalHeight;
- }
-
- // 绘制选项
- private void DrawOptions(Rect rect, List options, float scale)
- {
- if (options == null || options.Count == 0)
+ if (visibleOptions.Count == 0)
return;
- Listing_Standard listing = new Listing_Standard();
- listing.Begin(rect);
-
- // 增加选项之间的间距
- listing.verticalSpacing = 8f * scale;
-
- foreach (var option in options)
+ // 计算选项列表的总高度
+ float totalOptionsHeight = (scaledOptionSize.y * visibleOptions.Count) +
+ (scaledOptionSpacing * (visibleOptions.Count - 1));
+
+ bool needsScroll = totalOptionsHeight > optionsInnerRect.height;
+
+ // 如果需要滚动,使用滚动视图
+ if (needsScroll)
{
- string reason;
- bool conditionsMet = AreConditionsMet(option.conditions, out reason);
-
- if (conditionsMet)
+ Rect viewRect = new Rect(0, 0, optionsInnerRect.width - 20f, totalOptionsHeight);
+ Widgets.BeginScrollView(optionsInnerRect, ref optionsScrollPosition, viewRect);
+
+ float currentY = 0f;
+ foreach (var option in visibleOptions)
{
- if (listing.ButtonText(option.label))
+ DrawSingleOption(new Rect(0, currentY, viewRect.width, scaledOptionSize.y), option);
+ currentY += scaledOptionSize.y + scaledOptionSpacing;
+ }
+
+ Widgets.EndScrollView();
+ }
+ else
+ {
+ // 不需要滚动,垂直居中显示所有选项
+ float totalHeight = (scaledOptionSize.y * visibleOptions.Count) +
+ (scaledOptionSpacing * (visibleOptions.Count - 1));
+ float startY = optionsInnerRect.y + (optionsInnerRect.height - totalHeight) / 2;
+
+ float currentY = startY;
+ foreach (var option in visibleOptions)
+ {
+ DrawSingleOption(new Rect(optionsInnerRect.x, currentY, optionsInnerRect.width, scaledOptionSize.y), option);
+ currentY += scaledOptionSize.y + scaledOptionSpacing;
+ }
+ }
+ }
+
+ // 绘制单个选项
+ private void DrawSingleOption(Rect rect, EventOption option)
+ {
+ string reason;
+ bool conditionsMet = AreConditionsMet(option.conditions, out reason);
+
+ // 水平居中选项
+ float optionWidth = Mathf.Min(rect.width, Config.optionSize.x * (rect.width / Config.windowSize.x));
+ float optionX = rect.x + (rect.width - optionWidth) / 2;
+ Rect optionRect = new Rect(optionX, rect.y, optionWidth, rect.height);
+
+ if (conditionsMet)
+ {
+ // 保存原始颜色状态
+ Color originalColor = GUI.color;
+ GameFont originalFont = Text.Font;
+ Color originalTextColor = GUI.contentColor;
+
+ try
+ {
+ // 应用自定义颜色
+ if (option.useCustomColors)
+ {
+ ApplyOptionColors(option, optionRect);
+ }
+
+ if (Widgets.ButtonText(optionRect, option.label))
{
HandleAction(option.optionEffects);
}
}
- else
+ finally
{
- if (option.hideWhenDisabled)
- {
- continue;
- }
- Rect buttonRect = listing.GetRect(35f * scale); // 增加按钮高度
- Widgets.ButtonText(buttonRect, option.label, false, true, false);
- TooltipHandler.TipRegion(buttonRect, GetDisabledReason(option, reason));
+ // 恢复原始颜色状态
+ GUI.color = originalColor;
+ Text.Font = originalFont;
+ GUI.contentColor = originalTextColor;
}
}
+ else
+ {
+ // 禁用状态的选项
+ Color originalColor = GUI.color;
+ GameFont originalFont = Text.Font;
+ Color originalTextColor = GUI.contentColor;
- listing.End();
+ try
+ {
+ // 应用禁用状态的自定义颜色
+ if (option.useCustomColors && option.disabledColor.HasValue)
+ {
+ GUI.color = option.disabledColor.Value;
+ }
+ if (option.useCustomColors && option.textDisabledColor.HasValue)
+ {
+ GUI.contentColor = option.textDisabledColor.Value;
+ }
+
+ Widgets.ButtonText(optionRect, option.label, false, true, false);
+ TooltipHandler.TipRegion(optionRect, GetDisabledReason(option, reason));
+ }
+ finally
+ {
+ // 恢复原始颜色状态
+ GUI.color = originalColor;
+ Text.Font = originalFont;
+ GUI.contentColor = originalTextColor;
+ }
+ }
}
- // 滚动位置用于描述文本
- private Vector2 scrollPosition = Vector2.zero;
+ // 应用选项颜色
+ private void ApplyOptionColors(EventOption option, Rect rect)
+ {
+ if (!option.useCustomColors)
+ return;
+
+ // 检查鼠标是否悬停在选项上
+ bool isMouseOver = Mouse.IsOver(rect);
+
+ // 设置按钮背景颜色
+ if (isMouseOver && option.hoverColor.HasValue)
+ {
+ GUI.color = option.hoverColor.Value;
+ }
+ else if (option.normalColor.HasValue)
+ {
+ GUI.color = option.normalColor.Value;
+ }
+
+ // 设置文本颜色
+ if (isMouseOver && option.textHoverColor.HasValue)
+ {
+ GUI.contentColor = option.textHoverColor.Value;
+ }
+ else if (option.textColor.HasValue)
+ {
+ GUI.contentColor = option.textColor.Value;
+ }
+ }
private void HandleAction(List conditionalEffects)
{
diff --git a/Source/WulaFallenEmpire/EventSystem/Dialog_NewLayoutDisplay.cs b/Source/WulaFallenEmpire/EventSystem/Dialog_NewLayoutDisplay.cs
deleted file mode 100644
index 3816ecf8..00000000
--- a/Source/WulaFallenEmpire/EventSystem/Dialog_NewLayoutDisplay.cs
+++ /dev/null
@@ -1,277 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text.RegularExpressions;
-using UnityEngine;
-using Verse;
-
-namespace WulaFallenEmpire
-{
- public class Dialog_NewLayoutDisplay : Window
- {
- private EventDef def;
- private Texture2D portrait;
- private Texture2D background;
- private string selectedDescription;
-
- private static EventUIConfigDef config;
- public static EventUIConfigDef Config
- {
- get
- {
- if (config == null)
- {
- config = DefDatabase.GetNamed("Wula_EventUIConfig");
- }
- return config;
- }
- }
-
- public override Vector2 InitialSize
- {
- get
- {
- if (def.windowSize != Vector2.zero)
- {
- return def.windowSize;
- }
- return Config.defaultWindowSize;
- }
- }
-
- public Dialog_NewLayoutDisplay(EventDef def)
- {
- this.def = def;
- this.forcePause = true;
- this.absorbInputAroundWindow = true;
- this.doCloseX = true;
-
- var eventVarManager = Find.World.GetComponent();
- if (!def.descriptions.NullOrEmpty())
- {
- if (def.descriptionMode == DescriptionSelectionMode.Random)
- {
- selectedDescription = def.descriptions.RandomElement();
- }
- else
- {
- string indexVarName = $"_seq_desc_index_{def.defName}";
- int currentIndex = eventVarManager.GetVariable(indexVarName, 0);
-
- selectedDescription = def.descriptions[currentIndex];
-
- int nextIndex = (currentIndex + 1) % def.descriptions.Count;
- eventVarManager.SetVariable(indexVarName, nextIndex);
- }
- }
- else
- {
- selectedDescription = "Error: No descriptions found in def.";
- }
- }
-
- public override void PreOpen()
- {
- base.PreOpen();
- if (!def.portraitPath.NullOrEmpty())
- {
- portrait = ContentFinder.Get(def.portraitPath);
- }
-
- string bgPath = !def.backgroundImagePath.NullOrEmpty() ? def.backgroundImagePath : Config.defaultBackgroundImagePath;
- if (!bgPath.NullOrEmpty())
- {
- background = ContentFinder.Get(bgPath);
- }
-
- HandleAction(def.immediateEffects);
-
- if (!def.conditionalDescriptions.NullOrEmpty())
- {
- foreach (var condDesc in def.conditionalDescriptions)
- {
- string reason;
- if (AreConditionsMet(condDesc.conditions, out reason))
- {
- selectedDescription += "\n\n" + condDesc.text;
- }
- }
- }
-
- selectedDescription = FormatDescription(selectedDescription);
- }
-
- public override void DoWindowContents(Rect inRect)
- {
- if (background != null)
- {
- GUI.DrawTexture(inRect, background, ScaleMode.ScaleToFit);
- }
-
- if (Config.showDefName)
- {
- Text.Font = GameFont.Tiny;
- GUI.color = Color.gray;
- Widgets.Label(new Rect(5, 5, inRect.width - 10, 20f), def.defName);
- GUI.color = Color.white;
- }
-
- if (Config.showLabel)
- {
- Text.Font = Config.labelFont;
- Widgets.Label(new Rect(5, 20f, inRect.width - 10, 30f), def.label);
- Text.Font = GameFont.Small;
- }
-
- // 假设一个统一的边距
- float padding = Config.newLayoutPadding;
-
- // 名称区域
- float nameHeight = Config.newLayoutNameSize.y;
- float nameWidth = Config.newLayoutNameSize.x;
- Rect nameRect = new Rect(inRect.x + (inRect.width - nameWidth) / 2f, inRect.y + padding, nameWidth, nameHeight);
- if (Config.drawBorders)
- {
- Widgets.DrawBox(nameRect);
- }
- Text.Anchor = TextAnchor.MiddleCenter;
- Text.Font = GameFont.Medium;
- Widgets.Label(nameRect, def.characterName);
- Text.Font = GameFont.Small;
- Text.Anchor = TextAnchor.UpperLeft;
-
- // 立绘区域
- float lihuiWidth = Config.newLayoutLihuiSize.x;
- float lihuiHeight = Config.newLayoutLihuiSize.y;
- Rect lihuiRect = new Rect(inRect.x + (inRect.width - lihuiWidth) / 2f, nameRect.yMax + padding, lihuiWidth, lihuiHeight);
- if (portrait != null)
- {
- GUI.DrawTexture(lihuiRect, portrait, ScaleMode.ScaleToFit);
- }
- if (Config.drawBorders)
- {
- Widgets.DrawBox(lihuiRect);
- }
-
- // 选项区域 (预先计算高度)
- float optionButtonHeight = 30f; // 每个按钮的高度
- float optionSpacing = 5f; // 按钮之间的间距
- float calculatedOptionHeight = 0f;
- if (def.options != null && def.options.Any())
- {
- calculatedOptionHeight = def.options.Count * optionButtonHeight + (def.options.Count - 1) * optionSpacing;
- }
- calculatedOptionHeight = Mathf.Max(calculatedOptionHeight, 100f); // 最小高度
-
- float optionsWidth = Config.newLayoutOptionsWidth;
- Rect optionRect = new Rect(inRect.x + (inRect.width - optionsWidth) / 2f, inRect.yMax - padding - calculatedOptionHeight, optionsWidth, calculatedOptionHeight);
-
- // 描述区域
- float textWidth = Config.newLayoutTextSize.x;
- Rect textRect = new Rect(inRect.x + (inRect.width - textWidth) / 2f, lihuiRect.yMax + padding, textWidth, optionRect.y - (lihuiRect.yMax + padding) - padding);
- if (Config.drawBorders)
- {
- Widgets.DrawBox(textRect);
- }
- Rect textInnerRect = textRect.ContractedBy(padding);
- Widgets.Label(textInnerRect, selectedDescription);
-
- // 选项列表的绘制
- Listing_Standard listing = new Listing_Standard();
- listing.Begin(optionRect); // 使用完整的 optionRect
- if (def.options != null)
- {
- foreach (var option in def.options)
- {
- string reason;
- bool conditionsMet = AreConditionsMet(option.conditions, out reason);
-
- if (conditionsMet)
- {
- if (listing.ButtonText(option.label))
- {
- HandleAction(option.optionEffects);
- }
- }
- else
- {
- if (option.hideWhenDisabled)
- {
- continue;
- }
- Rect rect = listing.GetRect(30f);
- Widgets.ButtonText(rect, option.label, false, true, false);
- TooltipHandler.TipRegion(rect, GetDisabledReason(option, reason));
- }
- }
- }
- listing.End();
- }
-
- private void HandleAction(List conditionalEffects)
- {
- if (conditionalEffects.NullOrEmpty())
- {
- return;
- }
-
- foreach (var ce in conditionalEffects)
- {
- if (AreConditionsMet(ce.conditions, out _))
- {
- ce.Execute(this);
- }
- }
- }
-
- private bool AreConditionsMet(List conditions, out string reason)
- {
- reason = "";
- if (conditions.NullOrEmpty())
- {
- return true;
- }
-
- foreach (var condition in conditions)
- {
- if (!condition.IsMet(out string singleReason))
- {
- reason = singleReason;
- return false;
- }
- }
- return true;
- }
-
- private string GetDisabledReason(EventOption option, string reason)
- {
- if (!option.disabledReason.NullOrEmpty())
- {
- return option.disabledReason;
- }
- return reason;
- }
-
- public override void PostClose()
- {
- base.PostClose();
- HandleAction(def.dismissEffects);
- }
-
- private string FormatDescription(string description)
- {
- var eventVarManager = Find.World.GetComponent();
- // Use regex to find all placeholders like {variableName}
- return Regex.Replace(description, @"\{(.+?)\}", match =>
- {
- string varName = match.Groups[1].Value;
- if (eventVarManager.HasVariable(varName))
- {
- // Important: GetVariable