From 502edf03a0f0d1f656ebb0842dc856563894f409 Mon Sep 17 00:00:00 2001 From: "ProjectKoi-Kalo\\Kalo" Date: Sun, 27 Jul 2025 16:45:42 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9A=82=E5=AD=983?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 1.6/Assemblies/WulaFallenEmpire.dll | Bin 72704 -> 76800 bytes 1.6/Defs/ConfigDefs/EventUIConfig.xml | 24 ++++ 1.6/Defs/CustomUIDefs/CustomUI_Example.xml | 2 +- Documentation/EventSystem_Documentation.md | 105 +++++++++++++++--- .../.vs/WulaFallenEmpire/v17/.suo | Bin 120320 -> 120832 bytes .../{ => EventSystem}/Condition.cs | 2 + .../{ => EventSystem}/CustomUIDef.cs | 1 + .../{ => EventSystem}/Dialog_CustomDisplay.cs | 92 ++++++++++----- .../{ => EventSystem}/Effect.cs | 82 ++++++++++++++ .../{ => EventSystem}/EventContext.cs | 0 .../EventSystem/EventUIConfigDef.cs | 23 ++++ .../WulaFallenEmpire/WulaFallenEmpire.csproj | 11 +- 12 files changed, 291 insertions(+), 51 deletions(-) create mode 100644 1.6/Defs/ConfigDefs/EventUIConfig.xml rename Source/WulaFallenEmpire/{ => EventSystem}/Condition.cs (98%) rename Source/WulaFallenEmpire/{ => EventSystem}/CustomUIDef.cs (87%) rename Source/WulaFallenEmpire/{ => EventSystem}/Dialog_CustomDisplay.cs (64%) rename Source/WulaFallenEmpire/{ => EventSystem}/Effect.cs (63%) rename Source/WulaFallenEmpire/{ => EventSystem}/EventContext.cs (100%) create mode 100644 Source/WulaFallenEmpire/EventSystem/EventUIConfigDef.cs diff --git a/1.6/Assemblies/WulaFallenEmpire.dll b/1.6/Assemblies/WulaFallenEmpire.dll index 74c54aec4a296cfed55bec1f5b7b6167c7c6031f..29cc4e9218b4d3a8285e499f5aca7c3f65a1bdeb 100644 GIT binary patch delta 27481 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 delta 24299 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 diff --git a/1.6/Defs/ConfigDefs/EventUIConfig.xml b/1.6/Defs/ConfigDefs/EventUIConfig.xml new file mode 100644 index 00000000..a03791be --- /dev/null +++ b/1.6/Defs/ConfigDefs/EventUIConfig.xml @@ -0,0 +1,24 @@ + + + + + Wula_EventUIConfig + + + Small + true + + + + (500, 800) + (260, 130) + (650, 500) + 610 + + + 20 + 20 + + + + diff --git a/1.6/Defs/CustomUIDefs/CustomUI_Example.xml b/1.6/Defs/CustomUIDefs/CustomUI_Example.xml index 26cde88f..7c5ae061 100644 --- a/1.6/Defs/CustomUIDefs/CustomUI_Example.xml +++ b/1.6/Defs/CustomUIDefs/CustomUI_Example.xml @@ -4,7 +4,7 @@ Wula_ExampleUI - + UI/HeroArt/Storytellers/Randy 兰迪·随机 这是一个事件链的开端。选择第一个选项将会打开第二个事件窗口。 diff --git a/Documentation/EventSystem_Documentation.md b/Documentation/EventSystem_Documentation.md index cbf1a381..2613f96d 100644 --- a/Documentation/EventSystem_Documentation.md +++ b/Documentation/EventSystem_Documentation.md @@ -9,10 +9,49 @@ - **`Effect`**: 定义一个选项被点击后执行的具体动作(例如,给予物品、改变关系、打开新窗口等)。 - **`Condition`**: 定义一个选项是否可选的前提条件(例如,需要某个变量达到特定值)。 - **`EventContext`**: 一个全局的静态变量存储系统,允许在不同事件和效果之间传递数据。 +- **`EventUIConfigDef`**: 一个全局的外观和布局配置文件,用于统一管理所有事件窗口的视觉风格。 --- -## 2. 如何创建事件 (`CustomUIDef`) +## 2. 全局UI配置 (`EventUIConfigDef`) + +为了方便统一修改所有事件窗口的外观和布局,系统使用一个单例的 `EventUIConfigDef`。你应该在 `Defs` 文件夹下创建一个XML文件来定义它。 + +**文件示例 (`1.6/Defs/ConfigDefs/EventUIConfig.xml`):** +```xml + + + Wula_EventUIConfig + + + Small + true + UI/Backgrounds/DefaultBG + + + (500, 800) + (260, 130) + (650, 500) + 610 + + + 20 + 20 + + + +``` + +**字段说明:** +- `labelFont`: 事件标题 (`label`) 的字体大小。可选值: `Tiny`, `Small`, `Medium`, `Large`。 +- `drawBorders`: 是否为立绘、名称和描述区域绘制白色边框。 +- `defaultBackgroundImagePath`: 所有事件窗口默认使用的背景图路径。 +- `lihuiSize`, `nameSize`, `textSize`, `optionsWidth`: 定义了UI各部分的基础虚拟尺寸,代码会根据窗口大小按比例缩放它们。 +- `textNameOffset`, `optionsTextOffset`: 定义了各部分之间的垂直间距。 + +--- + +## 3. 如何创建事件 (`CustomUIDef`) 每个事件都是一个 `CustomUIDef`。你需要在一个 `Defs` XML文件中定义它。 @@ -34,15 +73,16 @@ **字段说明:** - `defName`: 事件的唯一ID,用于在代码或其他事件中引用它。 -- `label`: 显示在窗口顶部的标题(当前版本未在UI中显示,但建议填写)。 +- `label`: 显示在窗口左上角的标题。 - `portraitPath`: 立绘的纹理路径(相对于`Resources`或`Textures`目录)。 - `characterName`: 显示在名称框中的文本。 +- `backgroundImagePath`: (可选)为此特定事件指定的背景图路径,它会覆盖 `EventUIConfigDef` 中的默认背景。 - `description`: 显示在描述框中的主要文本。 - `options`: 一个 `
  • ` 列表,定义了所有的交互选项。 --- -## 3. 核心概念:选项 (`CustomUIOption`) +## 4. 核心概念:选项 (`CustomUIOption`) 每个选项都在 `` 列表中的一个 `
  • ` 标签内定义。 @@ -54,13 +94,13 @@ --- -## 4. 核心概念:效果 (`Effect`) +## 5. 核心概念:效果 (`Effect`) 效果定义了“做什么”。每个效果都在 `effects` 列表中的一个 `
  • ` 标签内定义,并且必须有一个 `Class` 属性。 ### 已实现的 `Effect` 列表 -#### 4.1 `Effect_OpenCustomUI` +#### 5.1 `Effect_OpenCustomUI` - **功能**: 打开另一个自定义UI事件窗口。 - **Class**: `WulaFallenEmpire.Effect_OpenCustomUI` - **字段**: @@ -72,7 +112,7 @@
  • ``` -#### 4.2 `Effect_CloseDialog` +#### 5.2 `Effect_CloseDialog` - **功能**: 关闭当前的事件窗口。 - **Class**: `WulaFallenEmpire.Effect_CloseDialog` - **字段**: 无 @@ -81,7 +121,7 @@
  • ``` -#### 4.3 `Effect_ShowMessage` +#### 5.3 `Effect_ShowMessage` - **功能**: 在屏幕左上角显示一条游戏消息。 - **Class**: `WulaFallenEmpire.Effect_ShowMessage` - **字段**: @@ -95,7 +135,7 @@
  • ``` -#### 4.4 `Effect_FireIncident` +#### 5.4 `Effect_FireIncident` - **功能**: 触发一个原版或Mod添加的游戏内事件。 - **Class**: `WulaFallenEmpire.Effect_FireIncident` - **字段**: @@ -107,7 +147,7 @@ ``` -#### 4.5 `Effect_ChangeFactionRelation` +#### 5.5 `Effect_ChangeFactionRelation` - **功能**: 改变与指定派系的好感度。 - **Class**: `WulaFallenEmpire.Effect_ChangeFactionRelation` - **字段**: @@ -121,7 +161,7 @@ ``` -#### 4.6 `Effect_SetVariable` +#### 5.6 `Effect_SetVariable` - **功能**: 在 `EventContext` 中设置或修改一个变量的值。 - **Class**: `WulaFallenEmpire.Effect_SetVariable` - **字段**: @@ -135,15 +175,50 @@ ``` +#### 5.7 `Effect_GiveThing` +- **功能**: 给予玩家一个或多个物品。 +- **Class**: `WulaFallenEmpire.Effect_GiveThing` +- **字段**: + - `thingDef`: (必须) 要给予物品的 `ThingDef` 的 `defName`。 + - `count`: (可选) 给予的数量,默认为 1。 +- **示例**: + ```xml +
  • + Silver + 100 +
  • + ``` + +#### 5.8 `Effect_SpawnPawn` +- **功能**: 在地图上生成一个或多个Pawn,并可选地发送一封信件通知玩家。 +- **Class**: `WulaFallenEmpire.Effect_SpawnPawn` +- **字段**: + - `kindDef`: (必须) 要生成Pawn的 `PawnKindDef` 的 `defName`。 + - `count`: (可选) 生成的数量,默认为 1。 + - `joinPlayerFaction`: (可选) Pawn是否加入玩家派系,默认为 `true`。 + - `letterLabel`: (可选) 通知信件的标题。 + - `letterText`: (可选) 通知信件的内容。 + - `letterDef`: (可选) 通知信件的类型 (例如 `PositiveEvent`, `NegativeEvent`)。默认为 `PositiveEvent`。 +- **示例**: + ```xml +
  • + Colonist + 1 + true + A New Colonist + {PAWN_nameDef} has decided to join your colony. +
  • + ``` + --- -## 5. 核心概念:条件 (`Condition`) +## 6. 核心概念:条件 (`Condition`) 条件定义了选项是否可选的“前提”。每个条件都在 `conditions` 列表中的一个 `
  • ` 标签内定义,并且必须有一个 `Class` 属性。 ### 已实现的 `Condition` 列表 -#### 5.1 `Condition_VariableEquals` +#### 6.1 `Condition_VariableEquals` - **功能**: 检查一个变量是否等于指定的值。 - **Class**: `WulaFallenEmpire.Condition_VariableEquals` - **字段**: @@ -157,7 +232,7 @@
  • ``` -#### 5.2 `Condition_VariableGreaterThan` +#### 6.2 `Condition_VariableGreaterThan` - **功能**: 检查一个变量是否大于指定的值。 - **Class**: `WulaFallenEmpire.Condition_VariableGreaterThan` - **字段**: @@ -173,7 +248,7 @@ --- -## 6. 核心概念:变量系统 (`EventContext`) +## 7. 核心概念:变量系统 (`EventContext`) `EventContext` 是一个全局的静态字典,用于在事件链的不同部分之间传递信息。 @@ -185,7 +260,7 @@ --- -## 7. 完整示例 +## 8. 完整示例 以下是一个演示了事件链、变量和条件的完整示例。 diff --git a/Source/WulaFallenEmpire/.vs/WulaFallenEmpire/v17/.suo b/Source/WulaFallenEmpire/.vs/WulaFallenEmpire/v17/.suo index 653b39b7387008c5de978785048b2e89e3c24f09..9e11ffcd8c8bac388b3f73708d9f9ed07d2b4dc1 100644 GIT binary patch delta 2445 zcmb7_e@xV67{I^J_r3>r#~mF92gnf~goG#IVg8_UihznpB;c4TSq6?0u=Hf`S zL_+Q!@|9xhzGIhDYk04_YmJP|T$(Gj{%GZzHrA3h!@`xC+4G)vMl1g4w$Gkl@AJOT z`+VQ`JsD5b^kwWN+`-!PUDp5cf2n#Wjm`vPD7>Pn+2VT_G z=qpKkgjnjWO2j4lLtdBSlk4@K58Ka*y|1LbS7M2#0POs#90xv~uBC>Ci|S%YRuPFr zv_c`zku8c56-PU=EMiAHl0ECF7nQjoJfduL`S+Je(H$zPOCPOQ?z6W zfxSwv*QJ|WO}g0eaw3KhlW9rb711A!$Yflv-KlLM%Y!!)TlAvv@Fw`yq?f>FEH#P@ zO=L7yS+cp?_yw3iEEt{mwmZH9e1<{&VG0BYj$T`e*Jb7-1~cG@LE%c$AK-J8n52ai zUPOqZL@v4=kC;GM|ay+lTnXwGu1Zp``D9{*04_dt2|FVIMy}CT|(t>=HU7 z4fGM#OY3lMtCbJ8mRn%0=mokO7g+yu5%hLt^6A~D_1M3?L7gq%X{`1!TDOdET=%Ms zuWZfX-Iu=s^;rc21KsG^W=6}w%V<6jk7tf#p|gLE+90F6?PYYnZ$Q_PES`F8IRsoo zvflgUlb6m!zX=vK4dVCLvbpd2c@4AlKpob(pMuT&6Zb!+1mtp(B0Gc~eL%U+(8(BNH2SW+Wo&ae$aLFFp zZ-5gTRvm;gp4|PO7N_l;9#Z4M4Vq=rLwNQpD;vBUiqugBhqjmDp0->*=gngp^|BJ( zDtG>VCN^4LC`*P>6RWpEVaSt2w=rk|P#C1b0(Q^}S>s>bH1HJov%%rt06O+j8C05h;@YyMf{oJ;BOA*?1grA;a$jpq1zMe>jg6!UY;Ea^n)dqQR)ag{s~;b zn9=L3^HUg(4y2W;*-#L6GxI4ZW5u7rQEVLT4AGdGTDE!sX8TWr{6Alu-0@zVf4!qO KQ=oj@*XJ+uqcz(A delta 1495 zcmai!e@s(X6vumRUw;90$d3-CD+MZ3sO<6PPzes96@d|Gg%PG?gMW;e{h|BS!LqK0Lx>|FD@ne30<FkN@p;LX5;USJ!yt+035lS27+xashzcT&c!kI%vI#eFkQgEk z<1a#+t(6piqCFhU#(-%C-5o+C^J|TACZk-eL^S=5aFeIk61 z{lz1S+Xv{&zb$7m*};_3K7gy(Up5k{cJAQ~59`@S$d2inzs6TS`C+WB{?pEHmXWuI zxQ~rTUV~(~CmXN(I%TIIx3EaVzx71?9@XRd(I^KPhE99XlT%=a;}qCP@U*xy--CTQ zt+-&Wz|c7X*0I)AgCfhoJGs>uaEZ8P&f!{aXG-1zm<)ajMbYKW_>4pz&<8D9G~=Bb zM|5Hwtg6fV5TbPn=!{;{$n8Ef$!DQ%7Fj`-nfxk~PqWl4sH_sT#Qy-4Gksuwol-gK zaj^G&nvqi30N7CGg;DH3I3hQ*aE~YV3fBKjy0p)#gu7aD!jREdHVjLr|+wSy=T*H^G{mexl4b@XRz>- z-stRI2;hSnH!k)kS(8s)yx`5i-&Z%)nafRC>SA=+CZA02V8Oy=2p3 z1Ek*rAvQ=1lO82|8CbN|2X4(Bfl{EK#$~L%7L87hgERIqq$MVy$@rh$*jE&Ni!#oD zfOX|v(c}&AYm;-(4Jf^#Xv!?KSfW(>v^G5lU65FU0ni5SL9>AMt|~C#`A1{g=n7Pt jxKID(f7~>6`Rv1^H*8AD{ options; + public string backgroundImagePath; // Override default background } public class CustomUIOption diff --git a/Source/WulaFallenEmpire/Dialog_CustomDisplay.cs b/Source/WulaFallenEmpire/EventSystem/Dialog_CustomDisplay.cs similarity index 64% rename from Source/WulaFallenEmpire/Dialog_CustomDisplay.cs rename to Source/WulaFallenEmpire/EventSystem/Dialog_CustomDisplay.cs index 21207fdc..49d95f75 100644 --- a/Source/WulaFallenEmpire/Dialog_CustomDisplay.cs +++ b/Source/WulaFallenEmpire/EventSystem/Dialog_CustomDisplay.cs @@ -9,6 +9,20 @@ namespace WulaFallenEmpire { private CustomUIDef def; private Texture2D portrait; + private Texture2D background; + + private static EventUIConfigDef config; + public static EventUIConfigDef Config + { + get + { + if (config == null) + { + config = DefDatabase.GetNamed("Wula_EventUIConfig"); + } + return config; + } + } public override Vector2 InitialSize => new Vector2(1000f, 750f); @@ -25,62 +39,77 @@ namespace WulaFallenEmpire base.PreOpen(); if (!def.portraitPath.NullOrEmpty()) { - this.portrait = ContentFinder.Get(def.portraitPath); + portrait = ContentFinder.Get(def.portraitPath); + } + + string bgPath = !def.backgroundImagePath.NullOrEmpty() ? def.backgroundImagePath : Config.defaultBackgroundImagePath; + if (!bgPath.NullOrEmpty()) + { + background = ContentFinder.Get(bgPath); } } public override void DoWindowContents(Rect inRect) { - // Top-left defName and Label + // 1. Draw Background + if (background != null) + { + GUI.DrawTexture(inRect, background, ScaleMode.ScaleToFit); + } + + // 2. Draw Top-left defName and Label Text.Font = GameFont.Tiny; GUI.color = Color.gray; Widgets.Label(new Rect(5, 5, inRect.width - 10, 20f), def.defName); GUI.color = Color.white; - Text.Font = GameFont.Small; + Text.Font = Config.labelFont; Widgets.Label(new Rect(5, 20f, inRect.width - 10, 30f), def.label); + Text.Font = GameFont.Small; // Reset to default + // 3. Calculate Layout based on ConfigDef + float virtualWidth = Config.lihuiSize.x + Config.textSize.x; + float virtualHeight = Config.lihuiSize.y; - // Define virtual total size from the CSS layout - float virtualWidth = 500f + 650f; // lihui + text - float virtualHeight = 800f; // lihui height - - // Calculate scale to fit the window, maintaining aspect ratio float scaleX = inRect.width / virtualWidth; float scaleY = inRect.height / virtualHeight; - float scale = Mathf.Min(scaleX, scaleY) * 0.95f; // Use 95% of space to leave some margin + float scale = Mathf.Min(scaleX, scaleY) * 0.95f; - // Calculate scaled dimensions - float scaledLihuiWidth = 500f * scale; - float scaledLihuiHeight = 800f * scale; - float scaledNameWidth = 260f * scale; - float scaledNameHeight = 130f * scale; - float scaledTextWidth = 650f * scale; - float scaledTextHeight = 250f * scale; - float scaledOptionsWidth = 610f * scale; + float scaledLihuiWidth = Config.lihuiSize.x * scale; + float scaledLihuiHeight = Config.lihuiSize.y * scale; + float scaledNameWidth = Config.nameSize.x * scale; + float scaledNameHeight = Config.nameSize.y * scale; + float scaledTextWidth = Config.textSize.x * scale; + float scaledTextHeight = Config.textSize.y * scale; + float scaledOptionsWidth = Config.optionsWidth * scale; - // Center the whole content block float totalContentWidth = scaledLihuiWidth + scaledTextWidth; float totalContentHeight = scaledLihuiHeight; float startX = (inRect.width - totalContentWidth) / 2; float startY = (inRect.height - totalContentHeight) / 2; + // 4. Draw UI Elements // lihui (Portrait) Rect lihuiRect = new Rect(startX, startY, scaledLihuiWidth, scaledLihuiHeight); if (portrait != null) { GUI.DrawTexture(lihuiRect, portrait, ScaleMode.ScaleToFit); } - GUI.color = Color.white; - Widgets.DrawBox(lihuiRect); - GUI.color = Color.white; // Reset color - + if (Config.drawBorders) + { + GUI.color = Color.white; + Widgets.DrawBox(lihuiRect); + GUI.color = Color.white; + } // name Rect nameRect = new Rect(lihuiRect.xMax, lihuiRect.y, scaledNameWidth, scaledNameHeight); - GUI.color = Color.white; - Widgets.DrawBox(nameRect); - GUI.color = Color.white; // Reset color + if (Config.drawBorders) + { + GUI.color = Color.white; + Widgets.DrawBox(nameRect); + GUI.color = Color.white; + } Text.Anchor = TextAnchor.MiddleCenter; Text.Font = GameFont.Medium; Widgets.Label(nameRect, def.characterName); @@ -88,15 +117,18 @@ namespace WulaFallenEmpire Text.Anchor = TextAnchor.UpperLeft; // text (Description) - Rect textRect = new Rect(nameRect.x, nameRect.yMax + 20f * scale, scaledTextWidth, scaledTextHeight); - GUI.color = Color.white; - Widgets.DrawBox(textRect); - GUI.color = Color.white; // Reset color + Rect textRect = new Rect(nameRect.x, nameRect.yMax + Config.textNameOffset * scale, scaledTextWidth, scaledTextHeight); + if (Config.drawBorders) + { + GUI.color = Color.white; + Widgets.DrawBox(textRect); + GUI.color = Color.white; + } Rect textInnerRect = textRect.ContractedBy(10f * scale); Widgets.Label(textInnerRect, def.description); // option (Buttons) - Rect optionRect = new Rect(nameRect.x, textRect.yMax + 20f * scale, scaledOptionsWidth, lihuiRect.height - nameRect.height - textRect.height - 40f * scale); + Rect optionRect = new Rect(nameRect.x, textRect.yMax + Config.optionsTextOffset * scale, scaledOptionsWidth, lihuiRect.height - nameRect.height - textRect.height - (Config.textNameOffset + Config.optionsTextOffset) * scale); // No need to draw a box for the options area, the buttons will be listed inside. Listing_Standard listing = new Listing_Standard(); diff --git a/Source/WulaFallenEmpire/Effect.cs b/Source/WulaFallenEmpire/EventSystem/Effect.cs similarity index 63% rename from Source/WulaFallenEmpire/Effect.cs rename to Source/WulaFallenEmpire/EventSystem/Effect.cs index a078daee..78115c8f 100644 --- a/Source/WulaFallenEmpire/Effect.cs +++ b/Source/WulaFallenEmpire/EventSystem/Effect.cs @@ -186,4 +186,86 @@ namespace WulaFallenEmpire } } } + + public class Effect_GiveThing : Effect + { + public ThingDef thingDef; + public int count = 1; + + public override void Execute(Dialog_CustomDisplay dialog) + { + if (thingDef == null) + { + Log.Error("[WulaFallenEmpire] Effect_GiveThing has a null thingDef."); + return; + } + + Map currentMap = Find.CurrentMap; + if (currentMap == null) + { + Log.Error("[WulaFallenEmpire] Effect_GiveThing cannot execute without a current map."); + return; + } + + Thing thing = ThingMaker.MakeThing(thingDef); + thing.stackCount = count; + + IntVec3 dropCenter = DropCellFinder.TradeDropSpot(currentMap); + DropPodUtility.DropThingsNear(dropCenter, currentMap, new List { thing }, 110, false, false, false, false); + + Messages.Message("LetterLabelCargoPodCrash".Translate(), new TargetInfo(dropCenter, currentMap), MessageTypeDefOf.PositiveEvent); + } + } + + public class Effect_SpawnPawn : Effect + { + public PawnKindDef kindDef; + public int count = 1; + public bool joinPlayerFaction = true; + public string letterLabel; + public string letterText; + public LetterDef letterDef; + + public override void Execute(Dialog_CustomDisplay dialog) + { + if (kindDef == null) + { + Log.Error("[WulaFallenEmpire] Effect_SpawnPawn has a null kindDef."); + return; + } + + Map map = Find.CurrentMap; + if (map == null) + { + Log.Error("[WulaFallenEmpire] Effect_SpawnPawn cannot execute without a current map."); + return; + } + + for (int i = 0; i < count; i++) + { + Faction faction = joinPlayerFaction ? Faction.OfPlayer : null; + PawnGenerationRequest request = new PawnGenerationRequest( + kindDef, faction, PawnGenerationContext.NonPlayer, -1, true, false, false, false, + true, 20f, false, true, false, true, true, false, false, false, false, 0f, 0f, null, 1f, + null, null, null, null, null, null, null, null, null, null, null, null, false + ); + Pawn pawn = PawnGenerator.GeneratePawn(request); + + if (!CellFinder.TryFindRandomEdgeCellWith((IntVec3 c) => map.reachability.CanReachColony(c) && !c.Fogged(map), map, CellFinder.EdgeRoadChance_Neutral, out IntVec3 cell)) + { + cell = DropCellFinder.RandomDropSpot(map); + } + + GenSpawn.Spawn(pawn, cell, map, WipeMode.Vanish); + + if (!string.IsNullOrEmpty(letterLabel) && !string.IsNullOrEmpty(letterText)) + { + TaggedString finalLabel = letterLabel.Formatted(pawn.Named("PAWN")).AdjustedFor(pawn); + TaggedString finalText = letterText.Formatted(pawn.Named("PAWN")).AdjustedFor(pawn); + PawnRelationUtility.TryAppendRelationsWithColonistsInfo(ref finalText, ref finalLabel, pawn); + Find.LetterStack.ReceiveLetter(finalLabel, finalText, letterDef ?? LetterDefOf.PositiveEvent, pawn); + } + } + } + } } diff --git a/Source/WulaFallenEmpire/EventContext.cs b/Source/WulaFallenEmpire/EventSystem/EventContext.cs similarity index 100% rename from Source/WulaFallenEmpire/EventContext.cs rename to Source/WulaFallenEmpire/EventSystem/EventContext.cs diff --git a/Source/WulaFallenEmpire/EventSystem/EventUIConfigDef.cs b/Source/WulaFallenEmpire/EventSystem/EventUIConfigDef.cs new file mode 100644 index 00000000..c14a18de --- /dev/null +++ b/Source/WulaFallenEmpire/EventSystem/EventUIConfigDef.cs @@ -0,0 +1,23 @@ +using UnityEngine; +using Verse; + +namespace WulaFallenEmpire +{ + public class EventUIConfigDef : Def + { + // General Style + public GameFont labelFont = GameFont.Small; + public bool drawBorders = true; + public string defaultBackgroundImagePath; + + // Virtual Layout Dimensions + public Vector2 lihuiSize = new Vector2(500f, 800f); + public Vector2 nameSize = new Vector2(260f, 130f); + public Vector2 textSize = new Vector2(650f, 500f); + public float optionsWidth = 610f; + + // Virtual Layout Offsets + public float textNameOffset = 20f; + public float optionsTextOffset = 20f; + } +} diff --git a/Source/WulaFallenEmpire/WulaFallenEmpire.csproj b/Source/WulaFallenEmpire/WulaFallenEmpire.csproj index 9bb016c8..4e55959b 100644 --- a/Source/WulaFallenEmpire/WulaFallenEmpire.csproj +++ b/Source/WulaFallenEmpire/WulaFallenEmpire.csproj @@ -102,12 +102,13 @@ - - - - - + + + + + +