This commit is contained in:
2025-08-11 22:45:25 +08:00
parent 2f90aa1917
commit ffc0241f43
4 changed files with 119 additions and 50 deletions

View File

@@ -3,10 +3,10 @@
<WulaFallenEmpire.EventDef>
<defName>Wula_TestEvent_HideWhenDisabled</defName>
<label>测试事件:隐藏禁用选项</label>
<characterName>测试者</characterName>
<label><![CDATA[<color=cyan>测试事件</color><i><color=yellow>富文本</color></i>]]></label>
<characterName><![CDATA[<color=#ff8c00><b>测试者</b></color>]]></characterName>
<descriptions>
<li>这是一个用于演示新功能的测试事件。它包含多个选项,展示了不同的条件和可见性行为。当前机械族好感度: {MechanoidGoodwill}</li>
<li><![CDATA[这是一个用于演示<b>富文本</b>功能的测试事件。你可以看到<color=red>红色</color>、<color=green>绿色</color>和<color=blue>蓝色</color>的文本,以及<i>斜体</i>和<b>粗体</b>样式。当前机械族好感度: {MechanoidGoodwill}]]></li>
</descriptions>
<conditionalDescriptions>
@@ -17,14 +17,14 @@
<value>1</value>
</li>
</conditions>
<text>变量 TestVar 的值现在是 1所以你看到了这段额外的描述。</text>
<text><![CDATA[\n\n<color=magenta><b>变量 TestVar 的值现在是 1</b></color>,所以你看到了这段<color=yellow><i>额外</i></color>的描述。]]></text>
</li>
</conditionalDescriptions>
<options>
<!-- 选项 1: 设置 TestVar=1 并重新打开事件 -->
<li>
<label>选项一 (设置 TestVar = 1)</label>
<label><![CDATA[选项一 (<color=green>设置 TestVar = 1</color>)]]></label>
<optionEffects>
<li Class="WulaFallenEmpire.ConditionalEffects">
<effects>
@@ -32,8 +32,8 @@
<name>TestVar</name>
<value>1</value>
</li>
<li Class="WulaFallenEmpire.Effect_OpenDialog">
<def>Wula_TestEvent_HideWhenDisabled</def>
<li Class="WulaFallenEmpire.Effect_OpenCustomUI">
<defName>Wula_TestEvent_HideWhenDisabled</defName>
</li>
</effects>
</li>
@@ -42,7 +42,7 @@
<!-- 选项 2: 条件不满足时,显示为灰色禁用按钮 -->
<li>
<label>选项二 (需要 TestVar = 1, 禁用但可见)</label>
<label><![CDATA[选项二 (需要 <color=orange>TestVar = 1</color>, 禁用但可见)]]></label>
<conditions>
<li Class="WulaFallenEmpire.Condition_VariableEquals">
<name>TestVar</name>
@@ -60,7 +60,7 @@
<!-- 选项 3: 条件不满足时,完全隐藏 -->
<li>
<label>选项三 (需要 TestVar = 1, 禁用时隐藏)</label>
<label><![CDATA[选项三 (需要 <color=orange>TestVar = 1</color>, 禁用时隐藏)]]></label>
<hideWhenDisabled>true</hideWhenDisabled>
<conditions>
<li Class="WulaFallenEmpire.Condition_VariableEquals">
@@ -76,18 +76,18 @@
</li>
</optionEffects>
</li>
<!-- 选项 4: 移除 TestVar 并重新打开事件 -->
<li>
<label>选项四 (移除 TestVar)</label>
<label><![CDATA[选项四 (<color=red>移除 TestVar</color>)]]></label>
<optionEffects>
<li Class="WulaFallenEmpire.ConditionalEffects">
<effects>
<li Class="WulaFallenEmpire.Effect_RemoveVariable">
<li Class="WulaFallenEmpire.Effect_ClearVariable">
<name>TestVar</name>
</li>
<li Class="WulaFallenEmpire.Effect_OpenDialog">
<def>Wula_TestEvent_HideWhenDisabled</def>
<li Class="WulaFallenEmpire.Effect_OpenCustomUI">
<defName>Wula_TestEvent_HideWhenDisabled</defName>
</li>
</effects>
</li>
@@ -96,7 +96,7 @@
<!-- 选项 5: 检查机械族好感度 -->
<li>
<label>选项五 (检查机械族好感度)</label>
<label><![CDATA[选项五 (检查<color=#add8e6>机械族</color>好感度)]]></label>
<optionEffects>
<li Class="WulaFallenEmpire.ConditionalEffects">
<effects>
@@ -104,8 +104,8 @@
<factionDef>Mechanoid</factionDef>
<variableName>MechanoidGoodwill</variableName>
</li>
<li Class="WulaFallenEmpire.Effect_OpenDialog">
<def>Wula_TestEvent_HideWhenDisabled</def>
<li Class="WulaFallenEmpire.Effect_OpenCustomUI">
<defName>Wula_TestEvent_HideWhenDisabled</defName>
</li>
</effects>
</li>

View File

@@ -71,17 +71,53 @@
### `EventDef` 参数
- **defName**: (string) Def的唯一标识符。
- **label**: (string) 窗口的标题。
- **characterName**: (string) 显示在肖像下方的角色名称。
- **portraitPath**: (string) 角色肖像的纹理路径。
- **descriptions**: (List<string>) 一个描述文本列表。可以通过 `descriptionMode` 控制是随机选择一个还是按顺序显示。
- **options**: (List<EventOption>) 对话框中显示的选项列表。
- **immediateEffects**: (List<ConditionalEffects>) 当对话框打开时立即执行的效果列表。
- **dismissEffects**: (List<ConditionalEffects>) 当对话框关闭时(通过关闭按钮或`Effect_CloseDialog`)执行的效果列表。
- **characterName**: (string) (可选) 显示在肖像下方的角色名称。
- **portraitPath**: (string) (可选) 角色肖像的纹理路径。
- **backgroundImagePath**: (string) (可选) 对话框的背景图片路径。
- **windowSize**: (Vector2) (可选) 自定义窗口大小
- **descriptions**: (List<string>) 一个描述文本列表
- **descriptionMode**: (enum) (可选) 决定如何从 `descriptions` 列表中选择文本。可以是 `Random` (默认) 或 `Sequential`
- **conditionalDescriptions**: (List<ConditionalDescription>) (可选) 一个条件描述列表,允许你根据特定条件在主描述后附加额外的文本块。
- **options**: (List<EventOption>) 对话框中显示的选项列表。
- **immediateEffects**: (List<ConditionalEffects>) (可选) 当对话框打开时立即执行的效果列表。
- **dismissEffects**: (List<ConditionalEffects>) (可选) 当对话框关闭时(通过关闭按钮或`Effect_CloseDialog`)执行的效果列表。
- **windowSize**: (Vector2) (可选) 自定义窗口大小。默认为 `(0, 0)`,表示使用默认大小。
- **hiddenWindow**: (bool) (可选) 如果为 `true`,则不会显示窗口。在这种模式下,`immediateEffects` 的内容会在加载时自动合并到 `dismissEffects` 中,然后在事件触发时作为单个效果链统一执行。这对于创建纯粹的后台“效果链”事件非常有用。默认为 `false`
### `EventOption` 参数
每个选项 (`<li>` in `<options>`) 包含以下字段:
- **label**: (string) 选项按钮上显示的文本。
- **optionEffects**: (List<ConditionalEffects>) 点击该选项时执行的效果列表。
- **conditions**: (List<Condition>) (可选) 决定该选项是否可用的条件列表。如果条件不满足,选项会变灰。
- **disabledReason**: (string) (可选) 当选项因不满足 `conditions` 而变灰时,鼠标悬停时显示的提示信息。
- **hideWhenDisabled**: (bool) (可选) 如果为 `true`,当 `conditions` 不满足时,该选项将完全隐藏而不是变灰。默认为 `false`
### `ConditionalDescription` 参数
每个条件描述 (`<li>` in `<conditionalDescriptions>`) 包含以下字段:
- **conditions**: (List<Condition>) 决定此额外描述是否显示的条件列表。
- **text**: (string) 当条件满足时,要附加到主描述文本末尾的字符串。
### 关于富文本 (Rich Text) 的使用
在所有面向玩家的文本字段中(如 `label`, `descriptions`, `characterName`, `disabledReason`你都可以使用Unity的富文本标签例如 `<color=red>`, `<b>`, `<i>`
**重要提示**: 由于 `<``>` 是XML的特殊字符你必须将所有包含富文本标签的字符串包裹在 `<![CDATA[...]]>` 块中以避免XML解析错误。
**正确示例:**
```xml
<label><![CDATA[这是一个<color=cyan>彩色</color>的<b>标签</b>]]></label>
```
**错误示例 (会导致XML解析失败):**
```xml
<label>这是一个<color=cyan>彩色</color><b>标签</b></label>
```
### `EventDef` 示例
```xml
@@ -391,26 +427,37 @@
```
### `Effect_SetVariable`
设置一个 `EventContext` 变量的值。
**仅在变量尚不存在时**设置一个 `EventContext` 变量的值。这使得它非常适合用于安全地初始化变量,而不用担心覆盖现有值。
- **name**: (string) 变量名。
- **value**: (string) 变量的值。系统会自动尝试将其解析为 `int``float`,如果失败则作为 `string` 存储。
- **value**: (string) 变量的初始值。系统会自动尝试将其解析为 `int``float`,如果失败则作为 `string` 存储。
```xml
<li Class="WulaFallenEmpire.Effect_SetVariable">
<name>PlayerChoice</name>
<value>AcceptedOffer</value>
<name>MetTheEnvoy</name>
<value>true</value>
</li>
```
### `Effect_ModifyVariable`
对一个数字变量进行加、减、乘、除操作。
对一个数字变量进行数学运算或直接赋值。如果变量不存在会先将其初始化为0然后再执行操作。
- **name**: (string) 变量名。
- **value**: (float) 用于操作的数值。
- **operation**: (VariableOperation) 操作类型,可以是 `Add`, `Subtract`, `Multiply`, `Divide`
- **operation**: (VariableOperation) 操作类型,可以是 `Add`, `Subtract`, `Multiply`, `Divide`, `Set`
- `Set`: 直接将变量的值设置为 `value`,会覆盖任何现有值。
**加法示例:**
```xml
<li Class="WulaFallenEmpire.Effect_ModifyVariable">
<name>ResourceCount</name>
<value>-10</value>
<operation>Add</operation> <!-- This will subtract 10 -->
<operation>Add</operation> <!-- 这会从ResourceCount中减去10 -->
</li>
```
**直接设置值示例:**
```xml
<li Class="WulaFallenEmpire.Effect_ModifyVariable">
<name>ResourceCount</name>
<value>100</value>
<operation>Set</operation> <!-- 这会将ResourceCount的值直接设为100 -->
</li>
```
@@ -423,6 +470,16 @@
</li>
```
### `Effect_CheckFactionGoodwill`
检查玩家与某个派系的好感度,并将其存储在一个变量中。
- **factionDef**: (FactionDef) 要检查的派系的 `defName`
- **variableName**: (string) 用于存储好感度数值的变量名。
```xml
<li Class="WulaFallenEmpire.Effect_CheckFactionGoodwill">
<factionDef>Mechanoid</factionDef>
<variableName>MechanoidGoodwill</variableName>
</li>
```
---
## 4. 可用的条件 (`Condition`)
@@ -505,3 +562,13 @@
</li>
```
---
---
### `Condition_FactionExists`
检查一个派系当前是否存在于游戏中。
- **factionDef**: (FactionDef) 要检查的派系的 `defName`
```xml
<li Class="WulaFallenEmpire.Condition_FactionExists">
<factionDef>Pirate</factionDef>
</li>
```

View File

@@ -175,23 +175,21 @@ namespace WulaFallenEmpire
public override void Execute(Dialog_CustomDisplay dialog = null)
{
// Only set the variable if it doesn't already exist.
if (EventContext.HasVariable(name))
if (!EventContext.HasVariable(name))
{
return;
}
// Try to parse as int, then float, otherwise keep as string
if (int.TryParse(value, out int intValue))
{
EventContext.SetVariable(name, intValue);
}
else if (float.TryParse(value, out float floatValue))
{
EventContext.SetVariable(name, floatValue);
}
else
{
EventContext.SetVariable(name, value);
// Try to parse as int, then float, otherwise keep as string
if (int.TryParse(value, out int intValue))
{
EventContext.SetVariable(name, intValue);
}
else if (float.TryParse(value, out float floatValue))
{
EventContext.SetVariable(name, floatValue);
}
else
{
EventContext.SetVariable(name, value);
}
}
}
}
@@ -347,7 +345,8 @@ namespace WulaFallenEmpire
Add,
Subtract,
Multiply,
Divide
Divide,
Set
}
public class Effect_ModifyVariable : Effect
@@ -392,9 +391,12 @@ namespace WulaFallenEmpire
Log.Error($"[WulaFallenEmpire] Effect_ModifyVariable tried to divide by zero for variable '{name}'.");
}
break;
}
case VariableOperation.Set:
currentValue = value;
break;
}
EventContext.SetVariable(name, currentValue);
EventContext.SetVariable(name, currentValue);
}
}