界面修改

在《欧陆风云4》中,界面指的是玩家用来与游戏交互的用户界面。

概述

界面文件的组成部分可以分为两类:容器和元素。例如,windowType 是容器,而 iconType 是元素。

界面文件使用 .gui 文件类型。所有界面文件都位于 /Europa Universalis IV/interface/。

自定义 gui 文件使用 .txt,采用常规的 Paradox 脚本语法。所有自定义 gui 文件都位于 /Europa Universalis IV/common/custom_gui。

本文中提到内部(internal)时,指的是只有 Paradox 才能编辑的源代码。简而言之,这意味着相关对象无法被修改。虽然许多元素是内部的,但它们也可以拥有由脚本控制的 custom_gui 后端。

容器

容器用于将元素归为一组,并将它们与某个内部功能关联起来。

自 1.37 版本起,可以以 windowType 自定义 gui 的形式添加自定义容器。在 1.37 之前,没有办法做到这一点。

例如,countryreligionview.gui 中的 countryreligionview 包含了各个宗教机制所对应的全部专属容器。其内部嵌套的 orthodox_specific_window 是东正教界面的容器。在它之下是 muslim_specific_window,这是虔诚度界面的容器。

因此,如果你为某个宗教同时添加了这两种机制,那么作为玩家,你只会看到东正教界面。

windowType

最常见的容器类型,用于容纳任意一组元素。

以下属性较为常用:

  • name - 容器名称。
  • background - 用作容器背景的 iconType 或 guiButtonType 元素的名称。
  • position - 容器相对于父窗口的屏幕位置。
  • orientation - 设置 position 属性相对于父窗口的定位原点。
  • size - 容器的边界框。
  • moveable - 设置容器是否可以被拖动。需要将一个 guiButtonType 元素设为背景。
  • fullscreen - 设置容器是否被视为遮挡整个屏幕。

以下属性用于带动画的容器:

  • show_position - 容器在显示模式下移动到的屏幕位置。
  • hide_position - 容器在隐藏模式下移动到的屏幕位置。
  • animation_type - 用于移动容器的动画类型(始终为 decelerated)。
  • animation_time - 动画时长(始终为 300)。
  • upsound - 容器移动到显示位置时播放的声音。
  • downsound - 容器移动到隐藏位置时播放的声音。

以下属性很少使用或从不使用:

  • dontRender
  • horizontalBorder
  • verticalBorder


windowType 自定义 gui 元素使用 custom_window,并具有以下属性:

  • name - 必须与 windowType 的名称一致。
  • potential - 决定该窗口是否可见的触发条件。

scrollbarType

scrollbarType 用于定义滚动条由哪些元素组成。

使用以下属性:

  • name - 滚动条名称。
  • slider - 用作滚动条滑块的按钮元素。
  • track - 用作滚动条轨道的按钮元素。
  • leftbutton - 用作滚动条向左递增按钮的按钮元素。
  • rightbutton - 用作滚动条向右递增按钮的按钮元素。
  • position - 滚动条的屏幕位置。
  • size - 滚动条的边界框。
  • priority - 滚动条相对于其他元素的优先级。
  • borderSize - 滚动条边框的边界框。
  • maxValue - 滚动条移动到的最大值(用于控制增量)。
  • minValue - 滚动条移动到的最小值(用于控制增量)。
  • stepSize - 使用递增按钮时的增量大小。
  • startValue - 滚动条滑块起始时的初始大小。
  • horizontal - 设置滚动条是水平(1)还是垂直(0)。

元素

容器内可以使用多种元素类型。所有元素都必须在容器内使用,在容器之外无法生效。

除非为元素本身指定了 orientation,否则元素将继承其所在容器的 orientation。

以下元素不依赖内部代码,可以自由添加:

  • iconType - 用于静态图像。
  • instantTextBoxType - 用于文本。
  • guiButtonType - 用于按钮。

以下元素依赖内部代码。你可以添加新的此类元素,但它们不会被填充数据,因此这类用法非常有限。

  • smoothListboxType - 用于平滑滚动列表。
  • listboxType - 用于可滚动列表。
  • checkboxType - 用于复选框。
  • OverlappingElementsBoxType - 用于重叠多个元素。
  • editBoxType - 用于可编辑的文本框。
  • shieldtype - 用于显示国家旗帜。

以下元素属于遗留类型:

  • textBoxType - 与 instantTextBoxType 相同。
  • eu3dialogtype - 与 windowType 相同。
  • shieldtype - 仅在 eu3dialogtype 中使用。较新的文件中使用其他元素来显示旗帜。

iconType

iconType 元素用于向界面中添加图像。它的用途与 guiButtonType 有所重叠,后者与之类似,但可作为按钮使用。

使用以下属性:

  • name - 图标名称。
  • position - 容器相对于父窗口的屏幕位置。
  • orientation - 设置 position 属性相对于父窗口的定位原点。
  • spriteType - 用于该图标的图像。指向一个 spriteType 定义。
  • quadTextureSprite - 用于该图标的图像。指向动态的 spriteType 定义(例如旗帜)或多帧 spriteType 定义。
  • frame - 使用多帧图像时,图标所使用的帧。
  • alwaystransparent - 强制图标允许点击穿透,即点击位于其他元素后方的元素。
  • hint_tag - 设置图标在鼠标悬停时用于显示提示工具提示的提示键。
  • scale - 将图像尺寸乘以该小数值。
  • rotation - 将图像旋转该小数值,单位为弧度。90° 即 1.5708 弧度。
  • scripted - 设为“yes”以使其识别自定义 gui 文件。


iconType 自定义 gui 元素使用 custom_icon,并具有以下属性:

  • name - 必须与 iconType 的名称一致。
  • potential - 如果该触发条件为真,则显示图标。
  • tooltip - 悬停时工具提示的本地化键。可以是可自定义本地化。
  • frame - 决定所使用的图像帧;按从前到后的顺序判定,使用第一个判定为真的帧。可根据需要使用任意多个。包含两个子句:
    • number - 在 icon_religions.dds 之类的多帧 .dds 文件中使用哪一帧
    • trigger - 若判定为真,则使用该帧。
  • frame_variable - 可以用变量代替 trigger 子句。使用变量名的字符串。这始终检查 ROOT 作用域。

instantTextBoxType

instantTextBoxType 元素用于向界面中添加文本。在某些情况下,该元素的文本由内部生成(例如 regiment_count)。这种情况下,除非文本通过本地化字符串暴露出来,否则你无法编辑它。

使用以下属性:

  • name - 文本框名称。
  • position - 容器相对于父窗口的屏幕位置。
  • orientation - 设置 position 属性相对于父窗口的定位原点。
  • text - 文本框显示的文本。
  • font - 文本使用的字体。此项为必填,否则会报错。
  • maxWidth - 文本框允许的最大宽度。
  • maxHeight - 文本框允许的最大高度。
  • fixedsize - 文本框是否应截断超出其限制的文本。
  • truncate - 效果未知。设为 yes 或 no。
  • format - 文本的对齐方式。
  • vertical_alignment - 文本的垂直对齐方式。可以是 top、centre、bottom。
  • borderSize - 文本框边框的边界框。
  • alwaystransparent - 强制文本框忽略光标,即点击位于其他元素后方的元素。如果文本框带有滚动条,它还会忽略鼠标滚轮。
  • text_color_code - 将颜色代码覆盖为指定的颜色。颜色在 core.gfx 中定义。
  • scripted - 设为“yes”以使其识别自定义 gui 文件。

以下属性很少使用或从不使用:

  • textureFile - 遗留属性,仅适用于无法被脚本控制的 TextBoxType 元素。

有效的 format 值:

  • left
  • centre
  • right

instantTextBoxType 自定义 gui 元素使用 custom_text_box,并具有以下属性:

  • name - 必须与 instantTextBoxType 的名称一致。
  • potential - 如果该触发条件为真,则显示文本框。
  • tooltip - 悬停时工具提示的本地化键。可以是可自定义本地化。

按钮显示的文本是与自定义 gui 元素的 name 属性相对应的本地化键。例如,这个文本框,

custom_text_box = {
    name = my_amazing_text
    potential = { always = yes }
    tooltip = my_amazing_text_tooltip
}

以及这段本地化,

l_english:
 my_amazing_text:0 "[ROOT.GetName]"
 my_amazing_text_tooltip:0 "[Root.GetName] is amazing!"

会使文本框中的文字为国家名称,而工具提示则为国家名称加上“is amazing!”。

guiButtonType

guiButtonType 元素用于向界面中添加按钮。按钮由图像和文本组成,因此其运作方式与 iconType 和 instantTextBoxType 类似。

使用以下属性:

  • name - 按钮名称。
  • position - 容器相对于父窗口的屏幕位置。
  • orientation - 设置 position 属性相对于父窗口的定位原点。
  • spriteType - 用于该按钮的图像。指向一个 spriteType 定义。
  • quadTextureSprite - 用于该按钮的图像。指向动态的 spriteType 定义(例如旗帜)或多帧 spriteType 定义。
  • frame - 使用多帧图像时,按钮所使用的帧。
  • alwaystransparent - 强制按钮允许点击穿透,即点击位于其他元素后方的元素。
  • buttonText / text - 按钮显示的文本。
  • buttonFont / font - 显示按钮文本所用的字体。
  • format - 文本的对齐方式。
  • vertical_alignment - 文本的垂直对齐方式。可以是 top、centre、bottom。
  • shortcut - 为该按钮添加的快捷键。警告:如果你之后更改了某个按钮的快捷键,用户可能需要重置自己的快捷键。
  • extra_shortcut - 该按钮使用的第二个快捷键。警告:如果你之后更改了某个按钮的快捷键,用户可能需要重置自己的快捷键。
  • clicksound - 鼠标点击释放时使用的声音。
  • upsound - 鼠标停止悬停在按钮上时使用的声音。
  • downsound - 刚按下但尚未释放时使用的声音。
  • oversound - 悬停时使用的声音。点击释放时也会播放。
  • no_clicksound - no_clicksound = yes 会禁用默认的点击音效
  • hint_tag - 设置图标在鼠标悬停时用于显示提示工具提示的提示键。
  • pdx_tooltip - 设置该按钮使用的简短工具提示。
  • pdx_tooltip_delayed - 设置该按钮使用的完整工具提示。
  • scale - 将图像尺寸乘以该小数值。
  • rotation - 将图像旋转该小数值,单位为弧度。90° 即 1.5708 弧度。
  • scripted - 设为“yes”以使其识别自定义 gui 文件。

以下属性很少使用或从不使用:

  • tooltip - 从不使用。
  • tooltipText - 从不使用。
  • delayedTooltipText - 从不使用。

guiButtonType 自定义 gui 元素使用 custom_button,并具有以下属性:

  • name - 必须与 guiButtonType 的名称一致。
  • potential - 如果该触发条件为真,则显示按钮。
  • trigger - 为真时按钮可被点击。警告: 如果为假,按钮可以被点击穿透,即使被覆盖,位于其下方的按钮也可以被点击。
  • effect - 点击时运行的效果。(建议制作为可自定义效果,但这不是必需的。)可与 custom_tooltip 搭配使用以显示额外的本地化文本。
  • tooltip - 悬停时工具提示的本地化键。可以是可自定义本地化。
  • frame - 决定所使用的图像;使用第一个判定为真的帧。包含两个子句:
    • number - 在 icon_religions.dds 之类的多帧 .dds 文件中使用哪一帧
    • trigger - 若判定为真,则使用该帧

除了用作按钮外,guiButtonType 还可作为盾徽(即旗帜)的 gui 元素。它们使用 custom_shield,并具有以下属性:

  • name - 必须与 guiButtonType 的名称一致。
  • potential - 如果该触发条件为真,则显示图标。
  • trigger - 为真时按钮可被点击。
  • effect - 点击时运行的效果。(建议制作为可自定义效果,但这不是必需的。)
  • tooltip - 悬停时工具提示的本地化键。可以是可自定义本地化。
  • global_event_target - 从哪个国家获取旗帜。必须是一个全局事件目标。
  • open_country - 设为“yes”,则点击时会向玩家打开该目标国家的外交菜单。

smoothListboxType

smoothListboxType 元素用于定义列表框,即由条目填充的可滚动列表。通常,这类元素在内部与另一个容器关联,由该容器构成列表框中实际使用的条目。

使用以下属性:

  • name - 列表框名称。
  • position - 列表框的屏幕位置。
  • orientation - 设置 position 属性的定位原点。
  • size - 列表框的边界框。
  • spacing - 列表框条目之间使用的间距。
  • horizontal - 列表框是水平(1)还是垂直(0)。
  • scrollbartype - 列表框使用的滚动条。
  • bordersize - 列表框边框的边界框。
  • alwaystransparent - 强制列表框允许点击穿透,即点击位于其他元素后方的元素。

以下属性很少使用或从不使用:

  • background - 从不使用。

listboxType

listboxType 元素用于定义列表框,即由条目填充的可滚动列表。通常,这类元素在内部与另一个容器关联,由该容器构成列表框中实际使用的条目。

使用以下属性:

  • name - 列表框名称。
  • position - 列表框的屏幕位置。
  • orientation - 设置 position 属性的定位原点。
  • size - 列表框的边界框。
  • spacing - 列表框条目之间使用的间距。
  • horizontal - 列表框是水平(1)还是垂直(0)。
  • scrollbartype - 列表框使用的滚动条。
  • bordersize - 列表框边框的边界框。
  • alwaystransparent - 强制列表框允许点击穿透,即点击位于其他元素后方的元素。

以下属性很少使用或从不使用:

  • background - 从不使用。

checkboxType

checkboxType 元素用于向界面中添加复选框。复选框的实际效果在内部定义。

使用以下属性:

  • name - 复选框名称。
  • position - 复选框的屏幕位置。
  • orientation - 设置 position 属性的定位原点。
  • spriteType - 用于该复选框的图像。指向一个 spriteType 定义。
  • quadTextureSprite - 用于该复选框的图像。指向动态的 spriteType 定义(例如旗帜)或多帧 spriteType 定义。
  • frame - 使用多帧图像时,复选框所使用的帧。
  • alwaystransparent - 强制复选框允许点击穿透,即点击位于其他元素后方的元素。
  • buttonText - 复选框显示的文本。
  • buttonFont - 显示复选框文本所用的字体。
  • shortcut - 为该复选框添加的快捷键。
  • clicksound - 点击时使用的声音。
  • hint_tag - 设置复选框在鼠标悬停时用于显示提示工具提示的提示键。
  • pdx_tooltip - 设置该复选框使用的简短工具提示。
  • pdx_tooltip_delayed - 设置该复选框使用的完整工具提示。
  • scale - 缩放复选框的尺寸。

以下属性很少使用或从不使用:

  • tooltip - 从不使用。
  • tooltipText - 从不使用。
  • delayedTooltipText - 从不使用。

editBoxType

editBoxType 元素用于向界面中添加可编辑的文本框。

使用以下属性:

  • name - 文本框名称。
  • position - 文本框的屏幕位置。
  • orientation - 设置 position 属性的定位原点。
  • text - 文本框显示的文本。
  • font - 文本使用的字体。
  • maxWidth - 显示文本的总宽度(像素)。
  • maxHeight - 显示文本的总高度(像素)。
  • format - 文本的对齐方式。
  • fixedsize - 文本框是否应截断超出其限制的文本。
  • borderSize - 文本框边框的边界框。
  • alwaystransparent - 强制文本允许点击穿透,即点击位于其他元素后方的元素。
  • ignore_tab_navigation - 使该元素忽略 Tab 键导航。

OverlappingElementsBoxType

OverlappingElementsBoxType 元素用于定义一种特殊的列表框,它会在自身内部动态地重叠其子元素。

使用以下属性:

  • name - 列表框名称。
  • position - 列表框的屏幕位置。
  • orientation - 设置 position 属性的定位原点。
  • size - 列表框的边界框。
  • spacing - 列表框条目之间使用的间距。
  • horizontal - 列表框是水平(1)还是垂直(0)。
  • bordersize - 列表框边框的边界框。
  • alwaystransparent - 强制列表框允许点击穿透,即点击位于其他元素后方的元素。

以下属性很少使用或从不使用:

  • textureFile - 从未用于任何用途。

有效的 format 值:

  • left
  • centre
  • right

位置与方向

理解位置坐标的工作方式,对于正确地编辑界面十分重要。

元素(或容器)所使用的 orientation 属性告诉你该元素的锚点相对于父元素位于何处。例如,UPPER_LEFT 表示 ( 0, 0 ) 位置在父窗口的左上角,而 LOWER_RIGHT 则是右下角。

随后 position 属性以该原点位置为基准。因此,如果你想让某个元素位于屏幕的另一侧,应当首先更改 orientation。

之所以采用这套系统,是因为它能让界面适应不同的分辨率。由于所有位置都与一个根据玩家屏幕分辨率动态计算的特定原点绑定,容器和元素的位置能保持一致。

所以,如果你想确保自己对界面的修改保持一致,就必须正确使用 orientation 属性。

一个错误做法是只编辑 position,例如 position = { x = 1800 y = 200 }。对于屏幕宽度大于 1800 像素的人(即 1900 x 1200 及以上)来说,这样看起来没问题,但对于屏幕较小的人来说,该元素会跑到屏幕之外。

有效的 orientation 值:

  • CENTER
  • UPPER_LEFT
  • LOWER_LEFT
  • UPPER_RIGHT
  • LOWER_RIGHT

分辨率检查

通过在容器和元素内部使用 if_resolution 作用域,你可以根据屏幕的宽度和高度改变它们的显示方式。

你也可以使用 if_resolution 将整个容器和元素包裹起来。

当 orientation 无法满足需求时,这十分有用,例如因背景随分辨率而变化而需要移动按钮时。

下面是移动按钮的示例:

guiButtonType = {
    name ="close_button"
    if_resolution = {
        max_height = 867
        position = { x = 560 y = -48 }
        quadTextureSprite = "GFX_button_close"
        buttonText = ""
    }
    if_resolution = {
        min_height = 868
        quadTextureSprite ="button_type_1"
        position = { x= 214 y = 664 }
        buttonText = "CLOSE"
    }
    buttonFont = "vic_18"
    shortcut = "ESCAPE"
}

下面是更换背景图像的示例:

iconType =
{
    name ="religionpanel_bg_bottom"
    if_resolution = {
        max_height = 899
        spriteType = "GFX_country_religion_view_bg_bottom_standard"
    }
    if_resolution = {
        max_height = 1079
        min_height = 900
        spriteType = "GFX_country_religion_view_bg_bottom_large"
    }
    if_resolution = {
        min_height = 1080
        spriteType = "GFX_country_religion_view_bg_bottom_huge"
    }
    position = { x= -7 y = -10 }
    Orientation = "UPPER_LEFT"
}

自定义 GUI 作用域

自定义 gui 对象的作用域取决于它们被放置在哪些窗口中。自 1.37 起,不在此表中的窗口会从父窗口继承 ROOT。

FROM 始终是打开该 gui 窗口的国家。

窗口 ROOT 备注
province_window 被点击的省份
buildings_window 被点击的省份
state_window 被点击的省份
countrycourtview FROM
countrygovernmentview FROM
countrydiplomacyview 所选国家
countryeconomyview FROM
countrytradeview FROM
countrytechnologyview FROM
countryideasview FROM
countrymissionsview 所选国家 正在查看其任务的国家
countrydecisionsview FROM
countrystabilityview FROM
countryreligionview FROM
countrymilitaryview FROM
countrysubjectview FROM
countryestatesview FROM
ages_view FROM
TradeNodeInterface 贸易节点的贸易首都
hre_window FROM
papacy_window FROM
所有派系窗口 FROM
celestial_window FROM
natives_window FROM
reforms_window FROM
parliament_window FROM 目前存在 bug,GUI 会出现,但无法正确检查触发条件或 potential(截至 1.36,不确定是否仍然如此。)
topbar FROM 目前存在 bug,可能会使错误日志被刷屏。
siege 省份
colonisationpanel 省份
文档 效果 • 触发条件 • 修正列表 • 作用域 • 变量 • 本地化 • 可自定义本地化 • 运行文件 • 事件图片列表
脚本 脚本函数 • 顾问 • 时代 • 开局设定 • 建筑 • 宣战理由 • 殖民区域 • 国家创建 • 文化 • 决议 • Defines • 外交行动 • 灾难 • 中华帝国 • 阶层 • 事件 • 派系 • 政府 • 政府互动 • 伟大工程 • 历史 • 神圣罗马帝国 • 理念组 • 思潮 • 佣兵 • 任务树 • 修正 • On Actions • 议会 • 和约 • 君主性格 • 政策 • 叛军类型 • 宗教 • 附属国类型 • 科技 • 贸易公司 • 商品 • 单位
地图 地图 • 地图修改速查 • 随机新世界 • 贸易节点
图形 模型 • 界面 • 贴图库 • 字体 • 单位模型
音频 音乐 • 音效
其他 控制台命令 • 校验和 • 模组结构 • 故障排查 • 运行文件
工具 克劳塞维茨开局编辑器 • EU4模组编辑工具 • JoroDox模组制作工具 • The Validator
指南 省份 • 地图修改速查 • 存档编辑 • 脚本教程