界面(.gui)入门

.gui 文件结构、常用元素、定位规则,修改原版界面的限制,以及 effectbuttonType 和事件 custom_gui

能改什么、不能改什么

群星的界面由 interface/*.gui 描述布局,interface/*.gfx 描述用到的图片(见 GFX、Sprite 与字体)。界面背后的逻辑是写死在引擎里的:

  • 可以改原版元素的位置、尺寸、图片、字体,或把不要的元素藏起来;
  • 不能凭空给原版窗口添加有功能的普通按钮——按钮的功能由引擎按元素 name 绑定;
  • 想要“点一下执行脚本”的按钮,用 effectbuttonType(下文);
  • 想要一个自定义样式的窗口,用事件的 custom_gui(下文)。

注意 引擎按 name 找元素。删除原版元素、改名、或调整容器的嵌套结构,轻则功能失效,重则崩溃。不想要的元素请把尺寸设为 0 或移到屏幕外,保留它的名字和位置层级。

文件结构

一个 .gui 文件包在 guiTypes = { } 里,下面是一层层嵌套的元素。原版 interface/pop_confirmation_dialog.gui(节选):

Clausewitz 脚本
guiTypes = {

	containerWindowType = {
		name = "pop_confirmation_dialog"
		position = { x = -200 y = -116 }
		size = { width = 300 height = 200 }
		moveable = yes
		orientation = center

		background = {
			name = "background"
			quadTextureSprite ="gfx_message_bg"
		}

		instantTextBoxType = {
			name = "title"
			font = "cg_16b"
			position = { x = 10 y = 15 }
			maxWidth = 280
			maxHeight = 30
			fixedSize = yes
			format = center
		}

		buttonType = {
			name = "AgreeButton"
			quadTextureSprite = "GFX_button_animated_265_34"
			position = { x = 5 y = 30 }
			Orientation = "UPPER_LEFT"
			buttonFont = "cg_16b"
			shortcut = "RETURN"
			clicksound = "confirm_click"
		}
	}
}

原版里 orientation 和 Orientation 两种写法都有,看起来字段名不区分大小写;拿不准时照抄原版的写法。

常用元素

按原版 .gui 中的出现次数排列:

元素用途常用字段
containerWindowType容器、窗口position、size、moveable、clipping、background
instantTextBoxType文字font、text、maxWidth、maxHeight、fixedSize、format
iconType图片spriteType、frame、scale、centerPosition
buttonType按钮(功能由引擎绑定)quadTextureSprite 或 spriteType、buttonText、buttonFont、shortcut、clicksound
gridBoxType网格排列子项slotsize、max_slots_horizontal、format
smoothListboxType / listboxType可滚动列表spacing、scrollbartype
scrollbarType、checkboxType、editBoxType、dropDownBoxType、spinnerType其他控件
effectbuttonType执行脚本效果的按钮effect,见下文

提示文字用 pdx_tooltip = "<本地化键>"(原版大量使用)或 tooltipText。

定位

  • position = { x = … y = … }:相对父元素的偏移,整数,可为负。
  • orientation:元素锚定在父元素的哪个点。原版用得最多的是 upper_left、upper_right、center、lower_left、center_up、lower_right、center_down。
  • origo:元素自身以哪个点对齐到上面的锚点,取值相同。例如 orientation = lower_right 加 origo = lower_right 再配负的 position,就能贴着父元素右下角放置。
  • size:可以写固定值,也可以写百分比,原版有 size = { width = 100% height = 100% }。

原版还会在文件顶部用 @名字 = 数值 定义本文件内的常量,并用 if_resolution / if_scaled_resolution 针对不同分辨率换布局。

修改原版界面

.gui 的覆盖单位是整个文件:模组里放一个与原版同路径的文件,就会替换原版那份(见加载顺序与覆盖规则)。因此:

  1. 只复制你要改的那一个 .gui 文件,不要整个 interface/ 文件夹;
  2. 改动尽量小,方便游戏更新后与新版原版文件对比;
  3. 两个模组改同一个 .gui 必然冲突,只能二选一或做兼容补丁。

effectbuttonType:执行脚本的按钮

原版 common/button_effects/example.txt 说明了这个机制。界面里放一个 effectbuttonType,effect 指向 common/button_effects/ 里的定义:

Clausewitz 脚本
example_button_effect = {
	potential = {
		always = no
	}
	allow = {
		always = no
	}

	effect = {
		add_monthly_resource_mult = {
			resource = minerals
			value = 5
			min = 5
			max = 500
		}
	}
}
  • potential 决定按钮是否显示,allow 决定能否点击,effect 是点击后执行的效果;
  • 作用域:this 是当前选中的对象(行星、舰船、舰队、星系、巨型建筑、联邦、考古遗址等)或玩家国家,from 是玩家国家;
  • 示例文件建议在 allow 里用 is_scope_type = planet 之类先确认作用域,因为同时打开多个界面时可能弄混。

原版舰队界面里的“成长”按钮就是这样做的(interface/fleet_view.gui):

Clausewitz 脚本
effectbuttonType = {
	name = "grow_button_effect"
	position = { x = 79 y = 28 }
	size = { x = 120 y = 20 }
	quadTextureSprite = GFX_tiling_button_standard

	font = "cg_16b"
	buttonText = "GROW_UP"

	tooltipText = "GROWTH_BUTTON_DESC"
	delayedTooltipText = "GROWTH_BUTTON_DESC_DELAYED"

	effect = grow_up_button_effect
	clicksound = "ui_kaiju_grow_up"
}

注意这仍然需要把按钮放进某个原版窗口的 .gui 里,也就是要覆盖那个文件。

事件的自定义窗口

外交类事件可以换用自定义窗口。原版 events/anomaly_events_4.txt:

Clausewitz 脚本
country_event = {
	id = anomaly.6815
	title = anomaly.6815.name
	desc = anomaly.6815.desc
	is_triggered_only = yes
	diplomatic = yes
	custom_gui = "enclave_curator_window"
	# ……
}

custom_gui 的值是某个 .gui 里窗口的 name,原版这个窗口定义在 interface/diplomacy_curator_event_view.gui。做法是复制一个原版外交事件窗口,改名后调整外观;其中的子元素名字要与原版窗口保持一致,因为事件标题、正文、选项按钮是按名字填进去的。

调试

控制台命令作用
reload_gui重新加载所有 GUI 文件并尝试重新打开当前界面
guibounds开关 GUI 边界显示,用来看清元素的范围
debugtooltip调试提示,见调试
gui_extra_height设置界面允许纵向扩展的像素数

改坏的 .gui 常常不会在 error.log 里留下清楚的报错,而是窗口错位或直接崩溃。每改一处就进游戏看一次,比一次改很多处更省时间。

部分内容改编自 Stellaris Wiki: Interface modding,按 CC BY-SA 3.0 授权。