Steam Deck云存档创意工坊可仅用鼠标

--

+关注

--

热度

Planet S is a real-time strategy game where your goal is to colonize multiple planets in a solar system to advance your civilization, build a city and supply it to grow your
游戏圈
共8条帖子
牛角面包
2026-04-07 04:00:18 · 发布在 「Planet S」
全面游戏指南
首先是选择星球。选择资源丰富的星球固然不错,但你首先需要的是制砖用的黏土。所以我喜欢草地星球。 接下来,你需要建造太空站、市中心、房屋以及教程中展示的其他建筑。当你有了足够的住房和电力,一切似乎都步入正轨时,你可能会注意到自己的 credits 在减少。不要惊慌。你所要做的就是将住房升级到下一级……你会想要优先吸引【开发者】,游戏中用【</>】符号表示。要做到这一点,你需要确保你的市中心朝向左侧或【科技】侧,并升级教程中展示过的房屋(需要足够的棉花、衣物、蔬菜,以及房屋旁有酒馆)。当你拥有约300名【开发者】时,就可以继续前进并解锁更多建筑了。 现在你可能会注意到,你的星球上没有继续发展所需的资源……没关系。只需找到一个拥有你所需资源的星球,通过左键点击系统将你的飞船停靠在空间站上方,点击你的飞船,然后点击右下角的图标将物品装载到飞船中。你需要准备大量砖块,最好再准备一些钢梁,以便在你选择的星球上建造另一个空间站、另一个市中心、房屋,以及你需要的任何采矿建筑和能源设施。然后,你可以在你的两个殖民地或星球之间建立贸易路线,并根据需要转移资源。具体操作是选择你的两个殖民地、一艘用于运输物品的飞船,以及你想要交易的资源。在资源选项下,你还需要选择飞船是在该地点装载还是卸载资源。 完成这些后,你需要回到你的主殖民地(至少我是这么做的),并建造另一个市中心和住房开发区。这次,当你按照步骤将房屋升级到二级后,将市中心定位设置为【军事】以吸引技工。完成此操作后,你将解锁更多建筑,然后建造这些新解锁的建筑,就能在游戏中达到当前进度的极限了。 获取开发者交易吸引机制
爱心小蛋糕
2026-04-01 19:00:34 · 发布在 「Planet S」
为《Planet S》创建模组
本指南将介绍如何为《Planet S》创建模组。 技术概述 首先我们来讨论技术背景,以便了解模组制作时游戏后台的运行机制。 资源文件夹 游戏会追踪所谓的“资源文件夹”,这些文件夹是游戏所有资源的存放位置。因此,资源本质上就是资源文件夹内的文件。这些资源可以是纹理、模型、声音或lua脚本。启动游戏时,它会扫描当前目录以查找资源文件夹。若查看游戏安装目录下的“assets.aexassets”文件或“customFlagPresets”文件夹,你可以看到相关示例。资源文件经过打包处理以加快加载速度,因此我们将转而查看“customFlagIcons”文件夹。 一个资源文件夹需要一个“assets.”在根目录下有一个“json”文件。该文件会告知游戏此文件夹为资源文件夹,并包含优先级等信息。当某个文件存在于多个资源文件夹中时,优先级就变得至关重要。这种情况下,游戏会从优先级较高的资源文件夹加载资源。 是的,你可以利用此功能来替换资源。但请注意,这样做可能会导致难以调试的异常情况。因此,我们**不正式支持此功能**。你可以尝试使用它,甚至替换整个菜单,但如果因此产生错误,我们将不提供支持。 回到资源文件夹的话题。每个资源都有一个“唯一”的资源ID。它由资源文件夹内文件的相对路径加上文件名构成。如果文件“fi_research.png”位于“textures/flagIcons”子目录下的“customFlagIcons”资源文件夹中,其资源ID为“textures/flagIcons/fi_research.png”。“唯一”之所以加引号,是因为不同资源文件夹中可能存在资源ID完全相同的资源。但只要你不尝试替换现有资源,并为新资源选择有意义的名称,这一点就无需担心。 模组文件 为什么要介绍资源文件夹?因为从技术层面而言,模组也是以资源文件夹的形式实现的! 我们通过lua脚本注册模组。该脚本可包含不同的函数。“registerMod”函数是必须的,它必须返回标题、描述和优先级。如果此函数运行失败,模组将无法注册。强制模组脚本必须位于其模组目录下的“scripts/mods/”路径中。当你通过编辑器创建新模组时(下一节将详细说明),它会自动保存在该位置。除了模组脚本外,模组引入的所有其他资源也必须放在其资源文件夹中。我们建议的良好做法是创建“textures”“models”“scripts”“sounds”等独立文件夹。 启用终端:为了帮助你在创建模组时调试问题,我们提供了显示游戏终端的功能。你可以通过向游戏传递“-console”作为启动参数来实现。游戏启动时终端会显示。关闭终端将立即终止游戏!编辑器:Planet S-Tools 启动编辑器 编辑器可在基础游戏Planet S之外使用。你可以在通过Steam启动游戏时选择它,或者如果已将基础游戏设为默认启动选项,也可以手动选择Planet S-Tools。 显然,编辑器需要互联网连接才能创建和更新模组。 创建新模组 启动编辑器时会显示一个“欢迎!”弹窗,其中有三个选项,从名称即可了解其用途。要创建新模组,点击“Create a new mod”即可。随后会弹出一个新窗口,要求你输入模组名称、简短描述文本以及优先级。 模组名称将作为游戏内的模组名称,同时也会作为Steam创意工坊中的标题。如果之后想要更改,你需要在模组脚本中编辑游戏内名称,并在Steam中修改创意工坊项目标题。 描述文本仅在游戏内使用。优先级将作为模组资源文件夹的优先级,你可以将其保留为默认值0。这两个数值之后都可以在生成的文件中进行编辑。填写文本字段并点击“创建新模组”后,模组将被创建。生成的文件会位于游戏安装目录的mods文件夹中,其中会有一个与你为模组输入的名称相同的子文件夹。在该子文件夹内,你会找到“assets.json”以及模组脚本,如第1章“模组文件”中所述。模组脚本也会以模组名称命名,且是一个“.lua”文件。打开该文件,你会看到预生成的“registerMod”函数。我们使用“Visual Studio Code”来编辑lua文件,该软件可免费获取。 需要注意的是,你可以查看编辑器当前“附加”的是哪个模组。点击顶部的“模组”选项卡,即可显示当前状态。如果设置了模组,你将看到其标题和唯一的创意工坊项目ID。创建(或打开)模组后,界面应如下所示:如果你点击了“仅编辑资源”,或者与Steam后端通信时出现问题,“模组”标签页就会显示成这样。编辑现有模组 要编辑现有模组,首先需确保你拥有模组文件。作为模组的创建者,你的电脑上通常会有这些文件。如果不慎丢失,你需要在Steam创意工坊订阅该模组,并将文件复制到游戏安装目录中它们最初创建的位置。 如果你已拥有文件,启动编辑器并在欢迎弹窗中点击【打开现有模组】。在此步骤中,你需要选择要编辑的模组的模组脚本。在【Steam创意工坊项目】下拉框中,选择正确的工坊项目。该下拉框包含你所有拥有的Planet S创意工坊项目,你可以通过名称或唯一的工坊项目ID来识别它们。你可以将其与相应创意工坊项目的Steam页面网址中的数字进行比较。如果一切顺利,你将能再次在【模组】标签页中查看模组详情! 设置缩略图 要在创意工坊中设置缩略图,你需在模组文件夹内放置一个名为【thumbnail】的PNG文件。更新模组时,该文件将自动上传。更新你的模组 每次修改模组后,你都需要将其上传至Steam。编辑器会通过上传模组目录内的所有文件来帮你完成这一操作。你可以通过之前提到的【模组】选项卡中的【更新模组...】按钮来更新模组。点击该按钮后会打开另一个弹窗。在其中你可以编辑Steam创意工坊中显示的模组标题,并输入更新说明。这里也是你设置模组标签的地方。这些标签与我们为【Planet S】创意工坊配置的分类相对应。理想情况下,它们应能说明你的模组添加了哪些内容类型。 点击【更新模组】会开始向Steam后台上传。上传时间可能需要几秒钟,具体取决于你的网络连接速度。上传完成后,编辑器右下角会显示成功通知。在此之前不要关闭编辑器,以防止出现问题! 编辑资源 除了创建和更新创意工坊项目外,编辑器的主要用途是创建和编辑【Planet S】的资源。虽然纹理、模型和声音需要在其他地方创建,但编辑器是用于创建【Planet S】资源的工具。这些资源包括: 环境物体(星球装饰) 资源(如黏土或铁矿等资源矿床) 建筑 宇宙飞船 粒子类型 纹理包 你可以同时打开多个不同的资源。要创建资源,请点击“文件...”,然后点击“新建...”。此时会弹出“新建资源”窗口。在其中你可以选择名称和类型。资源位置将自动确定。点击“创建”会生成一个空的资源文件并打开你的新资源,以便你开始编辑。 你也可以编辑现有资源。为此,你需要点击“打开...”并选择资源文件。 注意:要能够选择任何类型的文件,请在文件对话框右下角的组合框中选择“所有文件”。 测试你的模组 为避免每次修改后都要将模组更新到Steam创意工坊,你可以让基础游戏将你的模组作为本地模组加载。 为此,你需要将模组复制到游戏安装目录下的“mods”文件夹中。要找到游戏安装目录,你可以在Steam库中右键点击【Planet S】,然后依次选择“管理”→“本地文件”。在那里你会找到【editor】和【mods】文件夹。 在【editor】文件夹中也有一个mods文件夹,里面包含你通过Planet S Tools创建的模组。你只需将模组文件夹(例如名为【Cryptoworld】或【你的模组名称】)复制到【editor】文件夹旁边的mods文件夹中。游戏在启动时会扫描该文件夹并加载你的模组。 如果你对模组进行了修改,请确保重新复制模组。Planet S Tools会从【editor/mods】文件夹上传你的模组文件。 提醒:通过Steam为游戏添加启动选项【-console】以打开游戏控制台。这能帮助你更轻松地发现问题! 在模组脚本中注册内容 在新创建的模组脚本中,你会看到一些预生成的函数。名称 类型 效果 1 ID 字符串 唯一环境物体标识符 2 环境物体资源ID 字符串 环境物体资源文件(.pao)的资源ID 注册资源 ContentRegistry.registerResource(<字符串>, <表格>) 序号 名称 类型 效果 1 ID 字符串 唯一环境物体标识符 2 参数 表格 包含其余参数的Lua表格 表格参数: 名称 类型 效果 resourceTypeID 字符串 资源资产文件(.prs") 语言键 字符串 显示名称 图标纹理ID 字符串 图标纹理文件的资源ID。 快速建造建筑ID 字符串 升级资源矿床("U"键)时要建造的建筑的buildingID 每单位补充价格 数字 用于可补充资源玩法 最小数量 数字 用于可补充资源玩法时的最小数量 最大数量 数字 用于可补充资源玩法时的最大数量 注册星球类型 ContentRegistry.registerPlanetType(<字符串>, <表格>) 编号名称 类型 效果 1 ID 字符串 独特的星球类型标识符 2 参数 表格 包含其余参数的Lua表格 表格参数: 名称 类型 效果 iconID 字符串 地图上使用的星球图标的资源ID farmProductivity 数字 农场的基础生产力(1.0=100%) enableWater 布尔值 星球是否有水。默认值:true enableClouds 布尔值 星球是否有云。默认值:true enableAtmosphere 布尔值 星球是否有大气层。默认值:true大气散射系数 向量3f 影响大气颜色。默认值:(0.1066222407, 0.3244415644, 0.6830134553) 大气散射强度 数值 以不同方式影响大气。默认值:0.8 大气透明度系数 数值 大气的透明程度。默认值:0.48 表层水颜色 向量3f 默认值:(0.1, 0.5427927, 0.45935) 深层水颜色 向量3f 默认值:(0.0, 0.1862, 0.3362) 水波强度 数值 默认值:0.8 水面反射率 数值 默认值:0.8 水面高光强度 数值 默认值:1.5 水速 数字 默认值:2.5 不透明水体 布尔值 默认值:false 自发光水体 布尔值 默认值:false 噪波尖刺度 数字 默认值:1.35 噪波高度差 数字 默认值:0.58 噪波丘陵度 数字 默认值:4.4 噪波扭曲强度 数字 默认值:0.035 噪波锐度 数字 默认值:0.075 噪波频率 数字 默认值:0.005 气态行星 布尔值 该行星类型是否为气态行星。默认值:false。强制将启用水体和启用云层设为false。太空港ID 字符串 对应的太空港建筑ID,默认值为“b_spaceport” 仓库ID 字符串 对应的仓库建筑ID,默认值为“b_warehouse” 沙地颜色 三维向量 沙地颜色的RGB值 山脉纹理ID 字符串 山脉纹理资源的资源ID 高度过渡 二维向量 保持默认值即可,默认值:(-0.15, 0.15) 解锁条件 表格 用于定义能够殖民该类型星球的条件的Lua表格。详见示例。 它们对环境物体和资源的生成至关重要 环境物体 表格 Lua表格,用于定义环境物体的生成。详见示例。 资源 表格 Lua表格,用于定义资源的生成。详见示例。 种植模式 表格 Lua表格,列出该星球上可能的种植模式。详见示例。 确定地块种植模式回调 函数 Lua函数,用于自定义地块种植模式。若为nil,则使用标准生成方式。详见示例。 注册火箭 ContentRegistry.registerRocket(字符串, 表格) 编号名称 类型 效果 1 ID 字符串 独特的火箭标识符 2 参数 表格 包含剩余参数的Lua表格 表格参数: 名称 类型 效果 iconID 字符串 纹理资源文件的资源ID langKey 字符串 显示名称 constructionTime 数字 建造时间(秒) constructionCostMoney 数字 建造费用(信用点) constructionCostItems 表格 建造火箭所需物品的Lua表格。参见示例。速度 数字 火箭的飞行速度 加速时间 数字 加速所需的时间(秒) 爆炸持续时间 数字 撞击的持续时长 爆炸半径 数字 伤害区域的半径。伤害区域在撞击期间(即“爆炸持续时间”内)会逐渐扩大至爆炸半径 每秒伤害 数字 伤害区域内每游戏刻(每秒20次)造成的伤害 震中半径 数字 震中的半径。震中是一个额外的伤害区域,用于在撞击点周围造成更高伤害震中伤害倍率 数字 应用于震中伤害区域内建筑的倍率 注册炮塔 ContentRegistry.registerTurrets(<字符串>,<表格>) 编号 名称 类型 效果 1 ID 字符串 唯一火箭标识符 2 参数 表格 包含其余参数的Lua表格 炮塔可以有TURRET_TYPE_PROJECTILE(抛射物型炮塔)或TURRET_TYPE_LASER(激光型炮塔)类型。由于它们的参数存在根本差异,我们将在单独的表格中展示。如果模组处于激活状态,游戏会在特定节点调用这些函数来获取模组注册的内容。通常情况下,你无需修改“registerMod”函数,保持其生成时的状态即可。其他函数如果不需要,可以将其删除,因为它们是可选的。这些函数是否存在不会影响Steam创意工坊中的模组标签。 游戏会按特定顺序注册内容,具体如下: 世界类型 物品 地块种植模式 人口类型 资源 环境物体 星球类型 火箭 炮塔 建筑 建筑菜单条目 宇宙飞船 科技 注册函数不必按此顺序排列。按顺序排列只是有助于理解不同内容类型之间的一些依赖关系。类型=TURRET_TYPE_PROJECTILE: 名称 类型 效果 类型 枚举 TURRET_TYPE_PROJECTILE 齐射数量 数字 一次齐射包含的独立射击次数 齐射速度 数字 射击间隔时间(秒) 齐射冷却 数字 齐射之间的间隔时间(秒) projectileSpeed 数字 炮弹速度 spaceships伤害 数字 对飞船的每发炮弹伤害 buildings伤害 数字 对建筑的每发炮弹伤害 散射半径 数字 范围伤害半径 类型=TURRET_TYPE_LASER: 名称 类型 效果 类型 枚举 TURRET_TYPE_LASER 充能时间 数字 达到最大伤害所需时间(秒) 最小伤害 数字 每段时间最小伤害 最大伤害 数字 每段时间最大伤害 激光颜色 三维向量 激光束颜色 建筑注册 ContentRegistry.registerBuilding(<字符串>, <表格>) Nr名称 类型 作用 1 ID("buildingID") 字符串 唯一建筑标识符 2 参数 表格 包含其余参数的Lua表格 表格参数: 名称 类型 作用 langKey 字符串 显示名称 buildingTypeID 字符串 建筑资源文件的资源ID("."placingMode 字符串 此建筑可放置的种植模式ID resourceID 字符串 此建筑必须放置的资源ID iconID 字符串 图标纹理文件的资源ID upkeep 数字 每分钟维护费用 constructionCostMoney 数字 以信用点计算的建造费用 constructionCostItems 表格 建造该建筑所需物品的Lua表格。参见示例。 productionTime 数字 用于生产或消耗物品时。持续时间(秒)。powerConsumption 数字 激活状态下的功耗 powerProduction 数字 激活状态下的发电量 numOfFields 数字 最大场地数量(例如农场或太阳能发电厂) rotateToParent 布尔值 用于场地与农场的关联(例如太阳能收集器)。默认值为“false”。 generatesMoney 布尔值 该建筑是否产生金钱而非消耗金钱。默认值为“false”。 residentsCount 数字 该建筑生成的居民数量。仅为视觉效果。等级 数字 生产物品ID 字符串 生产物品的ID 最大生命值 数字 最大生命值上限 军事分数 数字 拥有该建筑获得的军事分数 抑制粒子效果 布尔值 允许粒子效果,即使玩家不在同一星球(例如火箭发射井) 模块 表格 Lua表格,定义建筑的模块。模块赋予建筑功能。 建筑模块1 存在多种类型的建筑模块。有些可以相互组合,有些则不能。一般来说,不能/不应组合会生成用户界面的建筑模块。 模块ID 是否生成用户界面?描述 【库存】否:为建筑配备库存,使其能够存储物品。 【物流】仅适用于仓库、太空港或 depot:该建筑会被纳入星球物流系统。 【耗电】(pwr_consuming 的缩写)否:建筑消耗星球的电力。 【发电】是:产生电力,发电方式可能有所不同。 【农业】是:拥有田地时会生产某种物品,会考虑星球的肥力。 【开采】是:与农业类似,但忽略星球肥力,且每隔几个周期会额外消耗一种物品。采矿 是 生产物品。通常放置在资源矿床上。 装配 是 通过消耗最多三种物品来生产一种物品类型。 建造 是 具备建造宇宙飞船的能力。 居住 是 可容纳居民,可作为城市中心或公共建筑。 军事 是 经过一定时间后可向敌方宇宙飞船开火。同时也是星球防御的一部分。 护盾投射器 是 向附近建筑投射护盾,为它们提供护盾值。 激光 是 可以是星际激光主体或升级建筑。火箭发射井 是 具备建造和发射火箭的能力。 地形改造 是 具备放置地形改造站点以改变地块种植模式的能力。不支持模组化种植模式。 每种模块类型需要不同的参数。下表对其进行说明: 模块ID【inventory】: 参数名称 参数类型 描述 物品 表格 Lua表格,列出建筑库存中可能存储的物品类型。 模块ID【logistic】: 参数名称 参数类型 描述 仓库 布尔值 建筑是否作为无人机仓库。默认值为“false”。太空港 布尔值 该建筑是否作为宇宙飞船的太空港。默认值为“false”。 仓库 布尔值 该建筑是否算作仓库,以增加星球的库存容量。默认值为“false”。 囤积物品 表格 Lua表格,列出后勤系统应运送至该建筑的物品类型。该建筑应为每种物品类型配备一个库存槽位。 模块类型“pwr_consuming”无任何参数。 模块ID“pwr_producing”: 参数名称 参数类型 描述 消耗物品类型 字符串 用于发电的消耗物品类型ID,例如“i_coal”。模块类型ID 字符串 作为“类似场地”建筑的建筑ID,例如“b_solarCollector”。 消耗物品类型2 字符串 每隔几个生产周期消耗的物品ID。参见参数“cyclerPerInput”。 输入周期数 数字 每隔多少个周期消耗“消耗物品类型2”中指定的物品。 产出物品类型 字符串 每隔几个生产周期产出的物品ID。参见参数“cyclerPerOutput”。 输出周期数 字符串 每隔多少个周期产出“产出物品类型”中指定的物品。假设你正尝试注册一种新的资源类型,并在自定义星球类型中提及它。现在出现了问题,你的资源类型无法正确注册并被丢弃。当游戏注册你的星球类型时,它找不到你的资源类型,因此也会将其从星球类型中丢弃。最终注册的星球将不包含你的资源。 我们为你介绍:内容注册表!它的作用是注册和管理所有类型的游戏内容。每种类型都有一个需要特定参数的函数。 下面我们将描述所有注册函数及其参数。建议你从Steam创意工坊下载我们的示例模组【Cryptoworld】。在模组脚本中,你可以看到所有函数的示例,它是一个很有帮助的参考。模块ID【farming】: 参数名称 参数类型 描述 fieldTypeID String 作为田地的建筑ID。 itemTypeProduced String 生产的物品ID。 模块ID【extracting】: 参数名称 参数类型 描述 fieldTypeID String 作为田地的建筑ID。 itemTypeProduced String 生产的物品ID。 itemTypeConsumed String 每隔几个生产周期消耗的物品ID。参见参数【cyclerPerInput】。 cyclerPerInput Number 消耗由【itemTypeConsumed】指定的物品的周期数。模块ID【mining】: 参数名称 参数类型 描述 itemTypeProduced 字符串 产出物品的ID 模块ID【assembling】: 参数名称 参数类型 描述 inputs 表格 列出消耗物品类型的Lua表格 outputs 表格 列出产出物品类型的Lua表格 模块类型【constructing】无任何参数。 模块ID【residential】: 参数名称 参数类型 描述 type 数字 指定住宅建筑的类型。0=住宅,1=市中心,2=公共建筑。人口类型ID 字符串 此住宅中居住人口的ID。 城市中心等级 数字 城市中心建筑的等级,从1开始。 显示人口类型ID 表格 Lua表格,列出要显示的人口数量。 建筑模块2 模块ID【military】: 参数名称 参数类型 描述 准备时间 数字 建筑可射击前的秒数。 炮塔ID 字符串 该建筑使用的炮塔类型ID。 模块ID【shieldProjector】: 参数名称 参数类型 描述 准备时间 数字 建筑可射击前的秒数。模块ID【laser】: 参数名称 参数类型 描述 type 数字 0=主建筑,1=冷却单元,2=冷凝器,3=变压器 shieldpointsProjected 数字 为范围内附近建筑提供的护盾值数量 cooldown 数字 冷却持续时间(秒) chargeCapacity 数字 射击前所需的能量点数fireDuration 数字 开火时间(秒)。 damageBuildings 数字 每次攻击对建筑物造成的伤害。 damageSpaceships 数字 每次攻击对宇宙飞船造成的伤害。 impactRadius 数字 冲击伤害区域半径。 laserIndex 数字 用作激光的建筑部件索引。 bonus 数字 取决于“type”参数的值。若为1=冷却时间减少,2=开火持续时间增加,3=伤害增加。 模块ID“rocketSilo”: Parameter name 参数类型 描述 rocketIDsConstructable 表格 Lua表格,列出此发射井可建造的火箭类型。最多三种。launchTime 数字 发射序列持续时间(秒)。 doorIndex1 数字 用作第一道门的建筑部件索引。 doorIndex2 数字 用作第二道门的建筑部件索引。 doorOpenTime 数字 门打开所需时间(秒)。 doorCloseTime 数字 发射序列接近结束时门关闭所需时间(秒)。 maxDoorRotation 数字 角度(度)。 rocketSpawnDepth 数字 从建筑中心向行星中心的偏移量。提示值【9.0】。模块ID“terraforming”: 参数名称 参数类型 描述 isModule 布尔值 此建筑是否为地形改造尺寸而非主地形改造建筑。 moduleBuildingID 字符串 用作地形改造场所的建筑ID。 注册建筑菜单条目 这里实际上有两个需要了解的函数。你可以创建一个新的文明标签页,或者将建筑菜单项添加到现有标签页中。建筑菜单中的“科学”标签页就是文明标签页的一个示例,它包含“开发者”“研究员”和“空想家”子标签页。要创建新标签页,请使用以下函数: ContentRegistry.registerBuildingMenuCivilizationTab(<字符串>, <表格>) 编号 名称 类型 效果 1 ID 字符串 独特的文明标签标识符 2 参数 表格 包含其余参数的Lua表格 表格参数: 名称 类型 效果 langKey 字符串 显示名称 iconStyleUnchecked 表格 定义未悬停和未选中时的图标样式。参见示例。 iconStyleChecked 表格 定义悬停或选中时的图标样式。参见示例。 unlockCondition 表格 定义解锁条件以使其可见。参见示例。层级 表格 Lua 表,用于定义该文明标签页的子标签。详见示例。 接下来,我们希望将建筑菜单条目添加到文明子标签页中。这可以通过以下函数实现: ContentRegistry.registerBuildingMenuEntry(<字符串>, <字符串>, <表格>) 编号名称 类型 作用 1 文明标签ID 字符串 建筑菜单条目应位于的唯一文明标签标识符 2 子标签ID 字符串 建筑菜单条目应位于的唯一子标签标识符 3 参数 表格 包含剩余参数的Lua表格 表格参数: 名称 类型 作用 entries 表格 定义实际条目的Lua表格。参见示例。注册物品 注册物品 为了让大家轻松理解,我们先从物品类型而非世界类型开始介绍。下面来看一个注册物品的示例: ContentRegistry.registerItem("i_coins", "i_coins.png", 100, ITEM_CATEGORY_CONSUMABLES, 1, 5, false, "Coins") 因此,该函数的格式如下: ContentRegistry.registerItem(<字符串>, <字符串>, <数字>, <枚举>, <数字>, <数字>, <布尔值>, <字符串>) 编号注册宇宙飞船 ContentRegistry.registerSpaceship(<字符串>, <表格>) 序号 名称 类型 作用 1 ID 字符串 宇宙飞船的唯一标识符 2 参数 表格 包含其余参数的Lua表格 表格参数: 名称 类型 作用 spaceshipTypeID 字符串 宇宙飞船资源文件的资源ID("."langKey 字符串 显示名称 iconID 字符串 图标纹理资源的资源ID speed 数字 飞船速度 accellerationTime 数字 加速至最高速度所需的时间(秒) rotationSpeed 数字 旋转速度 itemSlots 数字 物品槽数量 upkeep 数字 每分钟维护费用 spaceshipYard 字符串 能够建造此飞船的飞船建造厂的buildingID constructionTime 数字 建造时间(秒) constructionCostMoney 数字 建造费用(信用点) constructionCostItems 表格 建造飞船所需物品的Lua表格。参见示例。 possibleUnlockConditions 表格 解锁条件的Lua表格。满足其中一项即可解锁飞船。参见示例。maxHitpoints 数字 最大生命值 baseShieldpoints 数字 最大护盾值 militaryScore 数字 拥有该飞船可获得的军事评分 turretID 字符串 所使用的炮塔类型ID maxTurretsActive 数字 激活炮塔数量上限 estimatedTurretsBuildings 数字 预估同时攻击目标建筑的炮塔数量,用于DPS计算 estimatedTurretsSpaceships 数字 预估同时攻击目标飞船的炮塔数量,用于DPS计算 usedByPirates 布尔值 海盗是否可选择生成该类型飞船默认值为“false”。 disguiseEnabled 布尔值 此飞船是否能在同阵营飞船附近伪装 disguiseRange 数字 飞船可进行伪装的范围 disguiseCap 数字 可伪装飞船的最大数量 revealRange 数字 敌方飞船可揭露所有伪装飞船的范围 victorySpaceship 布尔值 此飞船是否作为胜利飞船。会阻止其正常使用。默认值为“false”。 注册科技 ContentRegistry.registerTechnology(<字符串>, <枚举>, <表格>) 编号名称 类型 效果 1 ID 字符串 独特的科技标识符 2 研究方向 枚举 研究方向_科学或研究方向_军事 3 参数 表格 包含其余参数的Lua表格 表格参数: 名称 类型 效果 requiredPoints 数字 完成该科技所需的研究点数 linkID 字符串 允许科技与另一科技关联的标识符(例如:在科学树中研究仓库,会自动在军事树中研究该仓库) groupID 字符串 用于对多个科技进行分组的标识符在同一组中,只能研究一项科技。 解锁条件 表格 Lua 表格,用于定义解锁条件。详见示例。 所需科技 表格 Lua 表格,列出解锁本科技所需的前置科技。只需研究给定科技中的一项即可。若已定义解锁条件,则以此为准。 解锁建筑 表格 Lua 表格,列出解锁的建筑。 解锁飞船 表格 Lua 表格,列出解锁的飞船。 解锁火箭 表格 Lua 表格,列出解锁的火箭。 效果 表格 Lua 表格,定义研究该科技后的效果。详见示例。注意:要研究一项科技,必须满足其解锁条件,并且如果定义了所需科技,则其中一项必须已被研究。 共有三种不同的效果类型: 效果类型 描述 模块效果类型 影响特定的建筑模块。效果表需要一个名为“moduleTypes”的表格,列出受影响的模块类型。详见“注册建筑”章节中的建筑模块列表。 建筑效果类型 影响特定的建筑类型。效果表需要一个名为“buildingIDs”的表格,列出受影响的建筑类型。 飞船效果类型 影响特定的飞船类型。效果表需要一个名为【spaceshipIDs】的表格,用于列出受影响的飞船类型。 根据所选效果类型的不同,效果表中需要提供不同的值: 字段名称 | 适用效果类型 | 描述 ---|---|--- moduleTypes | MODULE_EFFECT_TYPE | planetTypeIDs | MODULE_EFFECT_TYPE | 星球ID populationEffect | MODULE_EFFECT_TYPE | buildingIDs | BUILDING_EFFECT_TYPE | 受影响建筑 spaceshipIDs | SPACESHIP_EFFECT_TYPE | 受影响飞船 productivityBonus | MODULE_EFFECT_TYPE | 生产速度提升(1.0 = 100%) itemLimitBonus【模块效果类型】每个仓库额外提供的存储容量 upkeepBonus【建筑效果类型】维护费用降低 energyConsumptionBonus【建筑效果类型】电力消耗降低 energyProductionBonus【建筑效果类型】电力产量提升 speedBonus【飞船效果类型】速度提升 hitpointsBonus【建筑效果类型】和【飞船效果类型】最大生命值提升 damageBonus【建筑效果类型】和【飞船效果类型】伤害提升 readySpeedBonus【建筑效果类型】军事建筑启动所需时间减少 repairSpeedBonus【飞船效果类型】修复速度提升 shieldStrengthBonus【建筑效果类型】和【飞船效果类型】投射护盾点数提升 shieldRegenerationSpeedBonus建筑效果类型和飞船效果类型 护盾再生率提升 攻击范围加成 飞船效果类型 攻击范围增加 建造速度加成 飞船效果类型 建造时间减少 护盾投射器激活 飞船效果类型 激活此飞船的护盾投射(例如名称 类型 效果 1 ID 字符串 物品唯一标识符 2 图标纹理ID 字符串 物品纹理的资源ID,以“textures/items/”开头 3 GUI序号 数字 物品在用户界面中的排序索引 4 类别 枚举 选项:物品类别_建筑材料、物品类别_消耗品、物品类别_中间品、物品类别_原材料、物品类别_农产品 5 等级 数字 物品首次使用时的人口等级 6 参考价格 数字 创建交易条目时使用 7 建筑材料组件 布尔值 物品是否用于生产建筑材料。机器人需要此属性 8 语言键 字符串 物品的显示名称 注册世界类型 内容注册表保护器与守护者) shieldProjectorRange 飞船效果类型 护盾投射范围 shieldProjectorPoints 飞船效果类型 投射护盾点数 disguiseCapPlus 飞船效果类型 伪装上限提升 cooldownBonus 建筑效果类型 火箭发射井冷却时间减少 覆盖内容 要覆盖或扩展现有内容对象,只需再次调用“register<X>”函数(例如“registerPlanetType”)。调用中包含的每个元素都将替换先前的元素,例如建筑中的“modules”。仅有少数例外情况: - 世界类型中的行星环只能添加,不能替换 - 生成的资源和环境物体只能添加(因此,可以通过传入新的最小/最大数值来间接覆盖生成资源的数量) - 【overrideItem】可用于覆盖特定元素,无需再次传入所有参数 - 文明标签中的等级只能添加,不能替换 结语 我们希望本指南能帮助你了解《Planet S》的模组制作方式。如前所述,查看示例模组【Cryptoworld】的文件会对你有很大帮助,因为本指南的理论性和抽象性较强。 如果你对本指南有任何补充建议,欢迎在评论区告诉我们。我们也想向你推荐我们的Discord服务器,你可以在那里与我们和其他玩家讨论模组相关内容。registerWorldType(<字符串>, <表格>) 序号 名称 类型 效果 1 ID 字符串 唯一的世界类型标识符 2 参数 表格 包含其余参数的Lua表格 第二个参数,即Lua表格,难以描述。最好参考示例。不过我们还是在此说明可能的参数及其效果: 名称 类型 效果 startSpaceshipID 字符串 玩家初始获得的飞船类型ID startItems 表格 描述初始飞船中物品的表格。详见示例。tinyPlanets 布尔值 生成的是普通大小行星还是微型行星 sunSoundID 字符串 太阳音效的资源ID planetRings 表格 描述生成行星环的表格。详见示例。 注意:lua表格内的参数名称区分大小写! 注册人口类型 ContentRegistry.registerPopulationType(<字符串>, <表格>) 序号 名称 类型 作用 1 ID 字符串 唯一的人口类型标识符 2 Parameters 表格 包含其余参数的Lua表格 表格参数: 名称 类型 作用 tier 数字 等级示例:工人为1级,开发者为2级。 civilizationType:枚举类型 选项: iconID:字符串,图标纹理的资源ID langKey:字符串,显示名称 minResidents:数字,居住在住宅中的最低居民数量 maxResidents:数字,居住在住宅中的最高居民数量 economicScore:数字,每位居民带来的经济分数 needs:表格,定义此类人口需求的Lua表格。详见示例。 subsequentBuildingIDs:表格,列出可升级建筑的buildingID的Lua表格。大多数情况下仅一个。详见示例。注册地块种植模式 ContentRegistry.registerCultivationMode(<字符串>, <表格>) 编号 名称 类型 作用 1 ID 字符串 地块种植模式的唯一标识符 2 参数 表格 包含其余参数的Lua表格 表格参数: 名称 类型 作用 langKey 字符串 显示名称 iconStyle 表格 定义地块种植模式图标的Lua表格。详见示例。 注册环境物体 注册环境物体 ContentRegistry.registerAmbientObjects(<字符串>, <字符串>) 编号
2026-03-26 22:00:11 · 发布在 「Planet S」
场景模组
### 场景模组制作指南介绍 欢迎阅读场景模组制作指南!本指南将涵盖创建自定义场景的所有内容,包括如何设置基础场景、如何创建任务与对话以及事件、参数和特定于自定义场景的游戏玩法调整。 本指南不涉及资源创建(纹理/模型/声音)、建筑物或宇宙飞船等自定义内容(请参考我们更通用的模组制作指南:《Planet S》模组创建),也不包含通过编辑器设置创意工坊模组的流程(同样请参考上述通用指南)。 ### 设置 在继续之前,请确保已使用编辑器创建好一个模组!首先,我们需要创建一个场景脚本。场景脚本必须放置在scripts/scenarios文件夹中。完整路径为【PlanetS安装文件夹】/editor/mods/【你的模组名称】/scripts/scenarios。我们还建议你创建一个与模组同名的子文件夹以避免冲突(例如:【PlanetS安装文件夹】/editor/mods/【你的模组名称】/scripts/scenarios/testMod/)。在该文件夹或任何子文件夹中,你需要创建一个lua文件,例如testScenario.lua。此脚本文件将包含你的场景相关的所有内容。场景脚本:每个场景脚本都以registerScenario函数开始: registerScenario = function() return { name = "测试场景", description = "用于测试的场景", } end 游戏启动时会自动调用此函数,该函数需要一个包含场景信息和结构的lua表。在本指南中,我们将此表称为【场景表】。在这个基础示例中,我们定义了两个必填字段:"name"(名称)和"description"(描述)。这些字段将用于场景菜单以及场景识别。这已经足够让你的场景完成注册,但游戏暂时不会将其视为可玩场景,这也意味着它暂时不会出现在场景菜单中。不过,如果你创建一个新的创意模式游戏,它就会显示出来。但在你去查看之前,你首先需要将当前的模组上传到创意工坊并订阅它(不用担心,除非你将其设为公开,否则其他人看不到),或者你可以将模组文件夹从编辑器的mods文件夹复制到游戏的mods文件夹(【Planet S】安装文件夹/mods),但要确保不要修改这些文件,因为只有编辑器mods文件夹中的文件才会被上传。完成这些步骤后,启动游戏。在创建菜单(仅创意模式)的“游戏选项”下,有一个场景组合框。你的场景现在应该会显示在该组合框中。在继续下一步之前,请确保它已显示! 这就引出了我们的下一步。要让一个场景可玩,你还必须指定一个存档以及至少一个章节。该存档不能是任意存档,而必须是专门为你的场景创建的。要创建这样的存档,你可以在创建世界时选择该场景,然后使用创意模式进行创建。当你加载进入游戏后,创建一个存档并从存档文件夹中复制,直接放在你的场景脚本文件旁边。 之后,我们可以在脚本中这样指定存档: registerScenario = function() return { name = "Test Scenario", description = "用于测试目的的场景", savefileName = "TestScenario.pss", } end 你可以随意重命名存档,但确保它以.pss结尾! 接下来我们需要指定一个章节。我们将在下一节深入探讨章节,所以现在你只需复制粘贴这个最小设置: registerScenario = function() return { name = "Test Scenario", description = "用于测试目的的场景", savefileName = "TestScenario.pss", chapters = { { chapterName = "第一章", parameters = { }, }, }, } end现在你的第一个场景应该已经可以正常运行,游戏也会将其视为可玩内容。启动游戏来进行检查(不要忘记复制任何已更改的文件/重新上传),然后进入场景菜单。你的场景现在应该会列在那里! 章节与场景参数 《Planet S》中的每个场景都分为一个或多个章节。章节基本上是场景的一个部分,拥有自己的任务、对话和参数集。正如你之前可能注意到的,章节也是在场景表格中定义的。 一个章节必须有一个名称和一组参数。第一章也将是场景开始的章节。我们将在本指南的【回调与逻辑】部分介绍如何跳转到某个章节。 以下是一个包含4个章节的场景示例: registerScenario = function() return { name = "测试场景", description = "用于测试的场景", savefileName = "TestScenario.pss", chapters = { { chapterName = "第一章", parameters = { ScenarioParameter.DISABLE_TRADER, ScenarioParameter.DISABLE_PIRATES, }, }, { chapterName = "第二章", parameters = {每个章节都有其独特的参数设置,这就引出了下一个主题:场景参数! 场景参数 场景参数是一种用于配置游戏特定部分或更改现有游戏组件行为的方式。在上述示例中,有两个不同的场景参数:【禁用商人】和【禁用海盗】。两者的作用基本与你预期的一致:【DISABLE_TRADER】在启用时会阻止中立商人生成(在此情况下,商人不会在第1章和第2章出现),而【DISABLE_PIRATES】则会阻止海盗攻击(第1章和第3章)。请注意,你需要在世界创建时启用海盗,否则此参数将不会产生任何影响。所有可用参数的完整列表可在本指南的“参考:场景参数”部分找到。 任务 任务是在每个章节中定义玩家目标的主要方式。每个章节都可以有自己的任务列表。在《Planet S》中,一个任务由ID、名称、描述以及至少一个任务目标组成。ID为必填项,名称和描述也可以是语言密钥,以便将你的场景翻译成不同语言,但本指南不涉及此内容。任务是玩家必须完成的特定行动或目标,且一个任务的所有子任务都完成后才能达成该任务。 以下是第一章中包含两个任务的场景示例: registerScenario = function() return { name = "测试场景", description = "用于测试的场景", savefileName = "TestScenario.pss", chapters = { { chapterName = "第一章", parameters = { ScenarioParameter.DISABLE_TRADER, ScenarioParameter.DISABLE_PIRATES, }, quests = { { id = "chapter_1_quest_1_build_city", name = "建造城市", description = "建造第一座小型城市以吸引新居民。"{ tasks = { { type = "建筑放置任务", buildingTypeID = "b_residenceWorkers", count = 10, }, { type = "建筑放置任务", buildingTypeID = "b_cityCenter_0", count = 1, } }, }, { id = "chapter_1_quest_2_build_wind_park", name = "建造风电场", description = "建造风电场以产生能源。", tasks = { { type = "建筑放置任务", buildingTypeID = "b_windPark", count = 3, earlyCompletePossible = true, }, }, }, }这是前两个任务,但第二个任务有一个关键区别:earlyCompletePossible = true。此设置的作用是让任务在实际开始前就能完成。它解决的问题是,玩家可能会选择先建造风力发电场,然后再建造城市来完成第一个任务。如果没有这个进度标志,玩家就必须再额外建造3个风力发电场。有了这个标志,第二个任务会在玩家已建造3个风力发电场的情况下自动完成,或者在玩家已建造1个或2个风力发电场时正确追踪进度。 注意:这仅对当前章节的任务有效。其他任何章节的任务将不会追踪任何进度。任务描述 目前我们的任务描述有些枯燥,因为它们只包含简单的预定义文本。我们希望能在任务描述中显示任务进度。例如:任务 = { { 类型 = "建筑放置任务", 建筑类型ID = "b_residenceWorkers", 数量 = 10, }, { 类型 = "建筑放置任务", 建筑类型ID = "b_cityCenter_0", 数量 = 1, } }, { id = "chapter_1_quest_2_build_wind_park", 名称 = "建造风电场", 描述 = "建造风电场以产生能源。"下面为你详细解析其运作方式: 第一个任务要求玩家在其拥有的任意星球上总共建造10个工人住宅和1个市中心。 第二个任务要求玩家在其拥有的任意星球上总共建造3个风力发电站。这两个任务均使用【建筑放置任务】类型,该类型仅追踪建筑的放置情况。 参数【建筑类型ID】用于指定需要放置的建筑类型,参数【数量】则用于指定需要放置的建筑数量。即使省略这些参数,任务仍可正常运行,此时默认任务为放置任意类型的建筑1个。 其他未在此处指定的参数也是如此。例如,对于此任务,还有用于指定【派系ID】(派系的数字索引,从0开始,默认值也为0)、【星球ID】(星球的数字索引,从1开始,默认值为未定义)、【星球类型ID】(星球类型的字符串ID,默认值为未定义)和【地块ID】(星球上地块的数字索引,默认值为未定义)的参数。这些参数可让你指定例如某物应放置在哪个星球、哪种类型的星球上,由哪个派系放置,甚至具体放置在哪个地格上。 游戏中有大量不同的任务类型,你可以使用或组合它们来创建不同类型的任务。有关所有任务类型的更多详情和列表,请查看【参考:任务】。 开始此场景时,你可能会注意到任务并未实际开始或出现。我们将在下一节中介绍这一点以及其他进度相关内容。 【任务进度】 本节将涵盖几个不同的进度相关主题: 1. 开始任务 2. 自动或手动推进到下一个任务 3. 跟踪非活跃任务的进度 让我们从如何开始任务讲起。默认情况下,游戏不会启动当前章节中的任何任务,并且一次只能有一个活跃任务。要在开始场景后显示我们的第一个任务,我们需要明确告知游戏执行此操作。为此,我们可以使用一个回调函数,该函数会在场景开始时由游戏自动调用:onScenarioStart: --此处为注册场景的代码 --... onScenarioStart = function(scenarioState, world) ScenarioManager.startQuest("chapter_1_quest_1_build_city") end 在此回调中,我们调用场景管理器(ScenarioManager)并指示其启动具有指定ID的任务。随后游戏将启动并显示该任务。 注意:startQuest不会取消当前活跃的任务,而是会启动失败。还有一个完成任务的函数:ScenarioManager.completeQuest(任务ID),以及一个取消当前激活任务的函数:ScenarioManager.cancelActiveQuest()。 此外,你可能还需要创建与游戏玩法相关的任务,这可以通过ScenarioManager.createAndStartQuest(任务表格)来实现。在这种情况下,任务表格指的是一个lua表格,其结构与章节任务部分中的任何任务相同。 还有各种其他回调可用于在不同情况下(不仅仅是场景开始时)启动或取消任务,我们将在回调与逻辑部分详细介绍。 接下来是推进到下一个任务。默认情况下,游戏会自动推进到章节任务表格中的下一个任务。此行为可被覆盖: --注册场景及章节设置 --... 任务 = { { id = "quest_0", --... }, { id = "quest_1", 自动推进 = false, --... }, { id = "quest_2", 下一个任务ID = "quest_4", --... }, { id = "quest_3", --... }, { id = "quest_4", --... }, }, --...在这种情况下,第一个任务(quest_0)完成后会自动推进到quest_1,而quest_1则不会。quest_1之后将没有激活的任务,因此你必须使用startQuest或createAndStartQuest手动触发下一个任务。任务2也会自动推进并开启下一个任务,但在这种情况下,开启的不是列表中的下一个任务,而是任务4。 最后一个与进度相关的主题是追踪非活跃任务的进度。为什么需要或何时需要这样做呢?让我们回顾第一个任务示例: 任务 = { { id = "chapter_1_quest_1_build_city", 名称 = "建造城市", 描述 = "建造第一个小型城市以吸引新居民。"这可以通过描述元素来实现。 以下是示例图片中任务的定义: { id = "chapter_1_quest_1_build_city", name = "建造城市", description = "建造第一座小型城市以吸引新居民。n - 建造工人住宅 %0 n - 建造城市中心 %1", descriptionElements = { "task0.progress", "task1."在任务描述中,我们可以使用/n来插入换行符/使文本多行显示,还可以使用%加上0到9之间的任意数字来将任务特定的动态元素插入到描述中。这些标记将被任务定义中“descriptionElements”里定义的内容替换。在这种情况下,我们用第一个任务的进度替换%0,用第二个任务的进度替换%1。我们已经使用过一些函数,例如startQuest、createAndStartQuest或finishedQuest,这些函数均通过场景管理器(ScenarioManager)调用。该管理器还有不少其他可用于执行不同操作的函数,完整列表可在【参考:场景管理器】中找到。 以下是另外两个使用场景管理器的示例: onQuestCompleted = function(scenarioState, questID, canceled) if questID == "defeat_bot_colony_quest" then local playerMainPlanetID = ScenarioManager.scenarioGetInterestingPlanetID(0, "pt_normal") --此函数用于获取玩家的主星球 ScenarioManager.scenarioAddItems(playerMainPlanetID, "i_guns", 50) --为主星球添加50把枪作为奖励 ScenarioManager.scenarioAddCredits(0, 100000) --给予玩家100000信用点作为奖励 end end在此示例中,我们要检查之前示例中的任务是否已完成。然后,我们使用ScenarioManager.scenarioGetInterestingPlanetID来获取玩家的主星球。此函数会返回符合给定条件的最“有趣”星球的ID。最“有趣”的星球指的是经济评分最高的星球。我们要找的是派系0(玩家)拥有的“pt_normal”类型星球。如果玩家没有该类型的星球,函数会退而求其次选择任何类型的星球;如果玩家根本没有星球,则会选择任何派系的星球。 利用这些信息,我们通过ScenarioManager.scenarioGiveItemsToPlanet函数给予该星球50门枪炮作为奖励。此外,我们还通过ScenarioManager.scenarioAddCredits为玩家势力赠送100k credits。 以下是另一个更复杂的示例: onQuestEvent = function(scenarioState, eventID, event) if eventID == ColonyEstablishedQuestEvent.ID then local eventData = ColonyEstablishedQuestEvent.cast(event) if eventData.factionID == 0 then ScenarioManager.scenarioTriggerPiratesManuallyFaction(0, { { spaceshipTypeID = "s_battleCruiser", count = 3, }, }) end elseif eventID == PiratesRetreatedQuestEvent.ID then local eventData = PiratesRetreatedQuestEvent.cast(event) if eventData.defeated then local spaceshipID = ScenarioManager.此处我们通过事件系统等待玩家势力建立任意殖民地。一旦殖民地建立,我们就会使用ScenarioManager.scenarioTriggerPiratesManuallyFaction手动触发海盗事件,生成一支由3艘战列巡洋舰组成的自定义敌对舰队,该舰队会专门针对玩家势力。之后,我们等待PiratesRetreatedQuestEvent事件,并判断海盗是被击败,还是在成功完成突袭后自行离开。如果他们被击败,我们会通过ScenarioManager.scenarioCreateShipSpace给玩家一艘战列巡洋舰,这艘船会生成在地图之外。然后我们会通过ScenarioManager.scenarioShipSetTargetPlanet命令它飞往玩家的主星球。 保存进度 由于你可以在场景中进行很多不同的自定义操作,你可能还希望将一些数据或自定义进度存储在存档文件中,因为场景脚本中的全局或局部变量在游戏重启后不会保留,甚至可能会泄露到其他场景运行中。 正如之前在任务描述中提到的,有一种叫做变量集的东西,它附加在场景状态对象上,该对象作为参数传递到所有回调函数中。此变量集将被存储到存档文件中并从中加载,因此可以安全地将其用作存储进度的方式。 由于我们必须在游戏的C++端处理此问题,因此它在可存储内容方面有一定限制。例如,它无法存储lua表、数组、映射或字符串,只能存储数字和布尔值。它的工作方式基本上类似于带有键值对的映射或字典。 以下是再次举例: onQuestEvent = function(scenarioState, eventID, event) if eventID == TechnologyUnlockedQuestEvent.ID then local eventData = TechnologyUnlockedQuestEvent.cast(event) if eventData.factionID == 0 then if not scenarioState.variableSet:doesVariableExist("technologiesUnlocked") then scenarioState.此处用于统计玩家已解锁的科技数量,每当玩家解锁5项科技时,便给予其50000 credits作为奖励。具体逻辑如下:当满足条件时,若“technologiesUnlocked”变量不存在,则将其初始化为1;若已存在,则在当前值基础上加1。当该变量的值达到5时,向玩家发放50000 credits,并移除“technologiesUnlocked”变量。我们将进度存储在名为【technologiesUnlocked】的变量中,数据类型为无符号整数。 如你所见,你可以使用【doesVariableExist】查询变量是否存在,使用【addUInt32_t】(或【addInt32_t】、【addFloat】、【addBool】)添加变量,使用【setUint32_t】(其他三种类型操作类似)设置变量,使用【removeVarible】删除变量。你还可以使用【clear】清除整个集合。 游戏会像处理任务、任务和对话进度一样,负责实际的保存和加载工作。 此外,如前所述,你还可以在任务描述中使用描述元素显示变量集的值。它们需要按以下格式指定:【variableSet.type.variableName】,因此对于我们的示例,格式如下:【variableSet.uint32_t.】已解锁科技。 胜利与失败 接下来我们将介绍如何设置逻辑,使场景能够分出胜负,并包含特定的胜利与失败条件/任务。 作为场景创建者,你可以决定场景何时判定胜利以及玩家何时可能失败。要触发这两种结果,你需要调用场景管理器。 以下是示例: onQuestEvent = function(scenarioState, eventID, event) if eventID == 太空船建造任务事件.ID then local eventData = 太空船建造任务事件.cast(event) if eventData.factionID == 0 and eventData.spaceshipTypeID == "s_exoSpaceship" then 场景管理器.完成场景胜利("你已成功建造外星太空船!恭喜!"在这种情况下,当该派系建造出一艘外空飞船时,玩家将触发场景胜利。当玩家派系的任何勘探者飞船被摧毁时,将触发场景失败。 两种结局触发时的情况如下: 胜利:你可以使用各种不同的描述元素。每个任务都有进度和完成元素(“taskX.progress”“taskX.completed”),但有些任务还有其特有的元素。请查看参考资料:特定任务可用的任务说明。除了任务元素外,还有任务进度(“quest.progress”)以及变量设置元素,但这些我们将在“保存进度”部分稍后介绍。 回调与逻辑 #1 本节将介绍场景系统提供的更多类型的回调,以及如何实现你自己的场景逻辑和如何利用事件系统。以下是可添加到场景脚本中的回调函数列表: onScenarioStart = function(scenarioState, world) 在玩家开始场景时立即调用。(加载场景的存档时不会调用,仅在开始时调用一次) onUpdate = function(scenarioState, world, passedTime) 每帧调用一次。第三个参数可获取在此期间经过的游戏滴答时间,请注意该值可能为0。 onQuestEvent = function(scenarioState, eventID, event) 当触发任务事件时调用。有关此函数的更多信息将在本节后续内容中介绍。onQuestStarted = function(scenarioState, questID):当任务通过startQuest/createAndStartQuest被启动,或任务自动进入下一阶段时调用。 onQuestCompleted = function(scenarioState, questID):当玩家完成任务或通过completeQuest完成任务时调用。取消任务不会触发此回调。 onTaskCompleted = function(scenarioState, questID, taskID):当任务中的某个子任务完成时调用。taskID可在任何子任务定义中设置,默认值为空字符串。 onVictoryConditionCompleted = function(scenarioState, questID):当胜利条件达成时调用。关于胜利与失败的更多内容 onDefeatConditionCompleted = function(scenarioState, questID) 当失败条件达成时调用。关于胜利与失败的更多内容 onChapterChanged = function(scenarioState, chapterIndex) 当章节发生变更时调用。在激活第一章时,也会在onScenarioStart之前触发。 onDialogFinished = function(scenarioState, dialogID, canceled) 当对话结束或被取消时调用。关于对话的更多内容 onQuestEvent回调是一个特殊且功能强大的回调,它允许你或你的场景根据【Planet S】中可能发生的各种不同事件做出反应。在游戏运行过程中会触发大量不同的事件,这些事件都附带了各类信息。完整的事件列表可在【参考:事件】中查看。 所有事件都拥有一个数字ID,通过该ID能轻松识别刚刚触发的是哪个事件。你可以将传入的eventID参数与你要查找的事件类型ID进行比较。要访问每种事件类型的ID,只需在类型后添加.ID,例如:BuildingPlacedQuestEvent.ID。 若要访问事件所携带的任何数据,你首先需要使用cast函数将传入的事件数据转换为特定事件,示例如下:BuildingPlacedQuestEvent.cast(event)。让我们来看一些你可能如何使用此系统的示例: onQuestEvent = function(scenarioState, eventID, event) if eventID == PiratesSpawnedQuestEvent.ID then ScenarioManager.startQuest("defeat_incoming_pirates_quest") end end 这相当简单且易于理解。我们通过检查传入的eventID参数是否为PiratesSpawnedQuestEvent.ID,来等待海盗生成任务事件,该事件会在海盗生成时触发。然后,当事件触发时,我们启动一个任务,要求玩家击败这些海盗。很简单,对吧? 现在让我们看一个更复杂的示例,其中我们可能需要使用事件数据: onQuestEvent = function(scenarioState, eventID, event) if eventID == ColonyEstablishedQuestEvent.ID then local colonyEventData = ColonyEstablishedQuestEvent.cast(event) --检查机器人派系,假设1是机器人派系 if colonyEventData.factionID == 1 then if colonyEventData.planetTypeID == "pt_normal" then --这很可能是机器人的第一个或主要殖民地 ScenarioManager.createAndStartQuest({ id = "defeat_bot_colony_quest", name = "击败机器人殖民地", description = "消灭已建立的机器人殖民地。", tasks = { { type = "ColonyTakeoverTask", planetID = colonyEventData.planetID, newFactionID = 0, -- 假设0代表玩家阵营 }, }, }) end end end end在这个示例中,我们正在查找【ColonyEstablishedQuestEvent】,该事件会在某个阵营殖民一颗此前未被殖民的星球时触发。然后我们利用事件数据筛选出机器人阵营以及星球类型为普通/草地星球的情况。接着触发一个动态任务,要求玩家从机器人手中夺取这颗特定的殖民地。我们通过使用事件数据中包含的planetID来指定该星球。 回调与逻辑 #2 游戏提供了多种获取反馈的方式,但我们还能通过哪些方式来对玩家行为或其他事件做出反应呢夹贼简而言之:你可以在任何时候通过ScenarioManager.finishScenarioWin或ScenarioManager.finishScenarioLoss触发胜利或失败。这两个函数的参数相同,具体作用如下:第一个参数是将在胜利/失败界面显示的消息;第二个参数决定玩家在胜利/失败界面后是否可以继续游戏;第三和第四个参数通常应始终设为false。第三个参数用于定义游戏是否不显示胜利或失败界面而直接返回主菜单;第四个参数仅用于战役场景,在其他场景中无影响。为玩家提供显示这些信息的选项也会很不错,这样玩家就能轻松了解如何获胜或失败。这正是胜利条件和失败条件的作用。它们都类似于任务,但可以同时激活多个。这样做的好处是,可以使用内置的任务目标和描述系统来检查这些条件。它们在任务界面中也会用特殊图标标记。这些胜利和失败条件可以通过ScenarioManager.addVictoryCondition(questTable)、ScenarioManager.addDefeatCondition(questTable)、ScenarioManager.removeVictoryCondition(id)和ScenarioManager.removeDefeatCondition(id)进行添加或移除。 注意:当这些条件完成时,不会自动触发胜利或失败,也不会触发常规的onQuestCompleted,而是会触发onVictoryConditionCompleted或onDefeatConditionCompleted。 这两种条件类型也可以像任务一样按章节指定,但需放在专门的victoryConditions和defeatConditions表格中。以下是根据上述内容转化的胜利与失败条件示例: 注册场景 = 函数() 返回 { 名称 = "测试场景", 描述 = "用于测试目的的场景", 保存文件名 = "TestScenario.pss", 章节 = { { 章节名称 = "第一章", 参数 = { 场景参数.禁用商人, 场景参数.禁用海盗, }, 任务 = { --.... }禁用海盗, }, 对话 = { { id = "简单对话", 页面 = { { 文本ID = "嗨,爸爸!你好吗?", 角色 = hazel_neutral, }, { 文本ID = "我很好,谢谢你的关心!", 角色 = theo_neutral, }, { 文本ID = "听到这个消息真是太好了!"你可以在《参考:角色》中找到预定义角色表情设置的完整列表。 现在我们可以使用ScenarioManager.showDialog(dialogID, cancelActive)来显示/开始对话。你也可以使用ScenarioManager.hideDialog隐藏/取消任何活动对话。 场景特定内容 在你的场景中,你可能还想添加自定义建筑、宇宙飞船,甚至行星或完全自定义的世界类型。所有这些都可以通过模组实现。幸运的是,场景脚本与模组脚本拥有相同的功能,因此你也可以使用注册太空船、注册建筑或注册世界类型(或模组脚本中可用的所有其他注册函数)。你还可以使用自定义世界类型为你的场景创建存档。只需在场景脚本文件中完成所有设置,在创意创建菜单中选择你的场景,然后就可以从场景脚本中选择任何世界类型了。 简单示例: registerSpaceships = function() ContentRegistry.registerSpaceship("s_interceptor", { spaceshipYard = "", }) end 这将在场景中从小型太空船坞中移除拦截机。有关更多信息,请参考我们的其他模组制作指南。机器人配置文件 场景中机器人的行为也可以通过机器人配置文件进行修改。机器人配置文件可按章节为每个机器人单独设置。共有三种不同的机器人配置文件:【标准】(默认行为)、【无发展】(机器人将保持当前状态,但不会建造飞船、升级或扩张城市,也不会攻击任何目标)和【无进攻】(机器人不会建造军事单位来攻击其他机器人或玩家)。 以下是设置机器人配置文件的示例: registerScenario = function() return { name = "Test Scenario", description = "A Scenario for testing purposes", savefileName = "TestScenario.pss", chapters = { { chapterName = "Chapter 1", parameters = { ScenarioParameter.禁用商人, 场景参数.禁用海盗, }, 机器人配置文件 = { { 阵营ID = 1, 配置文件名 = "NO_PROGRESS", }, }, 对话 = { --... }, 任务 = { --... }, }, }, } 结束 提示与技巧 本节包含一些可能对你有帮助的技巧: 如果你已经发布了你的场景并计划修复或更改某些内容,请记住:更改任务结构/任务或章节可能会破坏现有的场景存档。在这种情况下,复制粘贴现有的场景脚本并对该脚本文件进行这些基础修改会更合理。不要忘记在场景ID以及可能的名称中添加类似版本后缀的内容。回调中的逻辑变更通常是可行的,但这取决于你所做的具体修改。 在开发过程中修改任务、描述元素或章节时,请记住这些修改可能不会在你的场景测试存档中显示(不是你在创意模式下创建的存档,而是实际开始场景进行测试后的任何存档)。因此,如果你没有在预期位置看到修改效果,请考虑通过场景菜单从头重新开始场景。由于每次重启都需要重新游玩场景的所有部分可能会很繁琐,你可以添加一个跳过任务的技巧,或者根据键盘输入创建自己的作弊功能。请记住,在上传场景之前要删除此测试代码,否则玩家可能会意外遇到问题或在非自愿的情况下进行作弊。以下是一个根据按键输入(此处为按F8键)跳过当前任务的示例: AEX:loadLibraries({ "AEX_Platform" }) --应放在脚本文件顶部,第一行 --.... onUpdate = function(scenarioState, world, passedTime) if AEX_InputHandler:wasKeyPressed(InputHandler.KEY_F8) then ScenarioManager.scenarioSkipQuest() end end 当前任务将自动完成,并触发该任务的onQuestCompleted事件。请注意,这可能会干扰你在逻辑中进行的操作,因为玩家并未实际完成任务。 参考:场景参数 参数(用法:ScenarioParameter.XXX) 描述 DISABLE_VICTORY_CONDITIONS 禁用游戏中所有现有的胜利条件,包括科技胜利和军事胜利。 DISABLE_TRADER 阻止中立商人生成。 DISABLE_PIRATES 阻止海盗生成。请注意,只有在世界选项中启用了海盗,此参数才会生效。 DISABLE_FAKE_TRADER 阻止海盗使用伪装商人的飞船。【禁止建造】:阻止玩家建造、修复或升级任何建筑。 【禁用研究】:完全禁用研究功能。 【禁止玩家科技建筑】:阻止玩家选择或升级为科技建筑。 【禁止玩家军事建筑】:阻止玩家选择或升级为军事建筑。 【禁止AI科技建筑】:阻止AI选择或升级为科技建筑。 【禁止AI军事建筑】:阻止AI选择或升级为军事建筑。 【禁用军事建筑】:不允许建造、升级或修复军事评分大于0的建筑。DISABLE_MILITARY_SPACESHIPS - 禁用建造军事评分>0的飞船。 AT_LEAST_ONE_TRADE_ENTRY - 阻止玩家移除太空港中的所有贸易条目。 DISABLE_DIPLOMACY - 禁用外交菜单。 BOTS_NO_WARP_GATES_CAP - 禁用机器人的 warp gate( warp 门)容量限制。 DISABLE_PLAYER_AUTO_ATTACKS - 禁用玩家飞船的自动攻击(飞船不会自动攻击附近的敌人)。 TAKEOVER_PRESERVE_BUILDINGS - 殖民地接管后不会摧毁或损坏所有建筑,而是保持一切完好。 TRADER_PLAYER_TIER_4 - 商人预算将调整到与玩家达到4级时相同的水平。胜利条件: 1. 建造外空飞船 描述:建造一艘外空飞船以逃离太阳系。【禁用建筑武器】:带有武器的建筑将不会射击任何目标。 【高外空探险难度】:通过减小任何潜在出口路线的锥角来增加外空飞船探险难度(平均出口路线长度增加)。 【阻止场景失败】:阻止或跳过任何场景失败触发条件。 【阻止研究进度】:阻止任何研究进度的进行。 【禁用自动保存】:关闭自动保存系统。 【机器人闲置】:使所有机器人进入闲置模式,闲置的机器人不会执行任何操作。BOT_UNLIMITED_CREDITS:为机器人提供无限 credits。 BOT_DONT_ATTACK_FIRST:阻止机器人首先发起攻击。它们只会在受到攻击后才会攻击玩家的殖民地。 BOT_NO_DIPLOMACY:阻止机器人使用外交系统。 BOT_DONT_FIX_OVERPRODUCTION:阻止机器人处理物品生产过剩问题(暂停或摧毁建筑以减少生产)。 BOT_NO_RESEARCH:阻止机器人使用研究系统。 BOT_FOCUS_GAS_PLANETS:机器人将只专注于占领气态行星。 BOT_NO_AUTO_ATTACKS:机器人不会自动攻击玩家的飞船或殖民地。BOT_FOCUS_PIRATES:机器人将专注于攻击目标。 BOT_DISABLE_TRADE_ROUTES:机器人不会更新其贸易路线。 BOT_DISABLE_TRADE_ROUTES_ESCORTS:机器人不会为其贸易路线更新任何护航舰队。 BOT_PERMANENT_PLANET_ATTACKS:机器人将持续专注攻击目标行星,直至将其占领。此功能仅在机器人被指令攻击一个或多个行星时生效。 BOT_ALLOW_MULTIPLE_OVERTAKES:允许机器人同时攻击多个行星。 BOT_UNLOCK_SPACESHIPS_SCIENCE:自动为机器人解锁所有科研飞船。 BOT_UNLOCK_SPACESHIPS_MILITARY:自动为机器人解锁所有军事飞船。【BOT_USE_ACTUAL_PRODUCTION_RATE】将改变机器人从星球出口物品的方式。通常它们会使用自定义的启发式算法来决定从星球出口什么,但启用此选项后,它们将使用星球的实际生产速率。参考:任务 #1 建筑放置任务 参数 类型 默认值 建筑类型ID 字符串 未定义 派系ID 数字 0 星球ID 数字 未定义 星球类型ID 字符串 未定义 地块ID 数字 未定义 数量 数字 1 描述元素:建筑类型ID、派系ID、星球ID、星球类型ID、数量、最大数量 建筑升级任务 参数 类型 默认值 新建筑类型ID 字符串 未定义 旧建筑类型ID 字符串 未定义 派系ID 数字 0 星球ID 数字 未定义 星球类型ID 字符串 未定义 地块ID 数字 未定义 数量 数字 1 描述元素:新建筑类型ID、旧建筑类型ID、派系ID、星球ID、星球类型ID、数量、最大数量 建筑摧毁任务 参数 类型 默认值 建筑类型ID 字符串 未定义 派系ID 数字 0 星球ID 数字 未定义 星球类型ID 字符串 未定义 地块ID 数字 未定义数量 1 描述元素:建筑类型ID 派系ID 星球ID 星球类型ID 数量 最大数量 建筑摧毁任务 参数 类型 默认值 建筑类型ID 字符串 未定义 派系ID 数字 0 星球ID 数字 未定义 星球类型ID 字符串 未定义 地块ID 数字 未定义 数量 1 描述元素:建筑类型ID 派系ID 星球ID 星球类型ID 数量 最大数量 飞船建造任务 参数 类型 默认值 飞船类型ID 字符串 未定义 飞船ID 数字 未定义 派系ID 数字 0 数量 1 描述元素:飞船类型ID 派系ID 飞船ID 数量 最大数量 飞船摧毁任务 参数 类型 默认值 飞船类型ID 字符串 未定义 飞船ID 数字 未定义 派系ID 数字 0 数量 1 描述元素:飞船类型ID 派系ID 飞船ID 数量最大数量 胜利 太空船逃脱任务 参数 类型 默认值 太空船ID 数字 未定义 派系ID 数字 0 描述元素:派系ID 太空船ID 殖民地建立任务 参数 类型 默认值 派系ID 数字 0 星球ID 数字 未定义 星球类型ID 字符串 未定义 描述元素:派系ID 星球ID 星球类型ID 参考:任务 #2 殖民地摧毁任务 参数 类型 默认值 派系ID 数字 0 星球ID 数字 未定义 星球类型ID 字符串 未定义 描述元素:派系ID 星球ID 星球类型ID 殖民地接管任务 参数 类型 默认值 新派系ID 数字 派系ID_无 旧派系ID 数字 派系ID_无 星球ID 数字 未定义 星球类型ID 字符串 未定义 描述元素:新派系ID 旧派系ID 星球ID 星球类型ID 派系被击败任务 参数 类型 默认值派系ID 数字 0 描述元素:派系ID 科技解锁任务 参数类型 默认值 科技ID 字符串 未定义 派系ID 数字 0 描述元素:科技ID 派系ID 贸易路线建立任务 参数类型 默认值 派系ID 数字 0 源星球ID 数字 未定义 目标星球ID 数字 未定义 物品类型ID 字符串 未定义 描述元素:派系ID 源星球ID 目标星球ID 物品ID 海盗被击败任务 参数类型 默认值 允许常规撤退 布尔值 否 商人到达任务 参数类型 默认值 商人离开任务 参数类型 默认值 戴森探针发射任务 参数类型 默认值 派系ID 数字 0 活跃数量 数字 1 描述元素:派系ID 活跃数量 计数 贸易条目创建任务 参数类型 默认值 派系ID 数字 0 星球ID未定义编号 项目类型ID 字符串 未定义 购买 布尔值 否 描述 元素:阵营ID 星球ID 项目ID 交易条目移除任务 参数 类型 默认值 阵营ID 数字 0 星球ID 数字 未定义 项目类型ID 字符串 未定义 描述 元素:阵营ID 星球ID 项目ID 人口任务 参数 类型 默认值 阵营ID 数字 0 星球ID 数字 未定义 星球类型ID 字符串 未定义 人口ID 数字 未定义 人口数量 数字 1 描述 元素:阵营ID 星球ID 星球类型ID 人口ID 人口数量 项目任务 参数 类型 默认值 阵营ID 数字 0 星球ID 数字 未定义 星球类型ID 字符串 未定义 项目类型ID 字符串 未定义 项目数量 数字 1 描述 元素:阵营ID 星球ID 星球类型ID 项目ID 项目数量 参考:任务 #3 金钱任务 参数 类型默认派系ID 数字 0 金钱数量 数字 0.0 描述元素:派系ID 金钱数量 维护任务 参数 类型 默认值 派系ID 数字 0 维护金额 数字 0任务 = { { 类型 = "太空船建造任务", 太空船类型ID = "s_exoSpaceship", }, }, 失败条件 = { { id = "explorer_destroyed", 名称 = "探索者被毁", 描述 = "你的探索者已被摧毁。"0 描述元素: 派系ID 维护费用 能量任务 参数 类型 默认值 派系ID 数字 0 星球ID 数字 未定义 星球类型ID 字符串 未定义 能量值 数字 0 描述元素: 派系ID 星球ID 星球类型ID 能量值 创建值(0.0, 0.0) 距离公差 数字 250 描述元素: 阵营ID 飞船ID 星球ID 星球类型ID 计时器 最大计时器 计时器格式化秒数 计时器格式化分钟数 参考:任务 #4 交付物品任务 参数 类型 默认值 阵营ID 数字 0 飞船ID 数字 未定义 星球ID 数字 未定义 星球类型ID 字符串 未定义 地块ID 数字 未定义 位置 二维向量 二维向量.创建值(0.0, 0.0) 距离容差 数字 250 物品类型ID 字符串 未定义 物品数量 数字 1 仅拾取 布尔值 否 描述元素: 阵营ID 飞船ID 星球ID 星球类型ID 物品ID 物品数量 定时任务 参数 类型 默认值 持续时间 数字 0.0 描述元素: 持续时间 时间 剩余时间 格式化秒数时间 格式化分钟时间 飞船生命值任务 参数 类型 默认值 阵营ID 数字 0 飞船ID 数字 未定义 生命值百分比 数字 0.5 下方 布尔值 是 描述元素: 阵营ID 飞船ID 生命值百分比 当前生命值百分比 生命值百分比目标 飞船世界边界任务 参数 类型 默认值 阵营ID 数字 0 飞船ID 数字 未定义 距离容差 数字 250 殖民地保持任务 参数 类型 默认值 派系ID 数字 0 星球ID 数字表格 未定义 描述元素:派系ID、星球ID、剩余星球ID 触发任务 参数 类型 默认值 剩余触发次数 字符串表格 未定义 地形改造任务 参数 类型 默认值 派系ID 数字 0 星球ID 数字 未定义 地块ID 数字 未定义 数量 数字 1 描述元素:派系ID、星球ID、数量、最大数量 打开统计菜单任务 参数 类型 默认值 打开研究菜单任务 参数 类型 默认值 打开贸易路线菜单任务 参数 类型 默认值 打开外交菜单任务 参数 类型 默认值 开始研究任务 参数 类型 默认值 派系ID 数字 0 科技类型ID 字符串 未定义 描述元素:派系ID、科技类型ID 外交状态任务 参数 类型 默认值 派系ID0 数字0 派系ID1 数字 0 新状态 外交状态(可以是外交状态_战争、外交状态_和平、外交状态_贸易、外交状态_联盟)未定义 描述元素:派系ID0 派系ID1 参考:任务 #5 殖民地份额购买任务 参数 类型 默认值 派系来源ID 数字 0 派系目标ID 数字 0 星球ID 数字 未定义 星球类型ID 字符串 未定义 描述元素:派系来源ID 派系目标ID 星球ID 星球类型ID 贸易任务 参数 类型 默认值 发起方派系ID 数字 0 目标派系ID 数字 0 飞船ID 数字 未定义 星球ID 数字 未定义 星球类型ID 字符串 未定义 交易金额 数字 00 描述元素:发起方派系ID 目标派系ID spaceshipID 星球ID 星球类型ID 交易金额 太空船运输任务 参数类型 默认值 派系ID 数字 0 spaceshipID 数字 未定义 运输目标太空船ID 数字 未定义 描述元素:派系ID spaceshipID 运输目标太空船ID 参考:事件 #1 建筑放置任务事件 参数类型 建筑类型ID 字符串 派系ID 数字 星球ID 数字 星球类型ID 字符串 地块ID 数字 建筑升级任务事件 参数类型 新建筑类型ID 字符串 旧建筑类型ID 字符串 派系ID 数字 星球ID 数字 星球类型ID 字符串 地块ID 数字 建筑修复任务事件 参数类型 建筑类型ID 字符串 派系ID 数字 星球ID 数字 星球类型ID 字符串 地块ID 数字 建筑损毁任务事件 参数类型建筑类型ID 字符串 派系ID 数字 星球ID 数字 星球类型ID 字符串 地块ID 数字 建筑被摧毁任务事件 参数类型 建筑类型ID 字符串 派系ID 数字 星球ID 数字 星球类型ID 字符串 地块ID 数字 飞船建造任务事件 参数类型 飞船类型ID 字符串 飞船ID 数字 派系ID 数字 飞船被摧毁任务事件 参数类型 飞船类型ID 字符串 飞船ID 数字 派系ID 数字 胜利飞船逃脱任务事件 参数类型 飞船ID 数字 派系ID 数字 殖民地建立任务事件 参数类型 派系ID 数字 星球ID 数字 星球类型ID 字符串 殖民地被摧毁任务事件 参数类型 派系ID 数字 星球ID 数字 星球类型ID 字符串 殖民地接管任务事件 参数类型 新派系ID 数字 旧派系ID 数字 星球ID 数字任务 = { { 类型 = "太空船摧毁任务", 太空船类型ID = "s_explorer", }, } 对话 在你的场景中,你可能希望通过讲述故事来将各个元素联系起来。这可以通过对话来实现。《Planet S》中的对话相当简单,因为没有玩家输入或决策,只有角色和文本行。例如: 对话由页面组成,每个页面包含一个角色状态和一行文本。对话与任务、胜利条件和失败条件一样,是按章节定义的。星球类型ID 字符串 派系被击败任务事件 参数类型 派系ID 数字 科技解锁任务事件 参数类型 科技ID 字符串 派系ID 数字 参考:事件 #2 贸易路线更新任务事件 参数类型 贸易路线ID 数字 贸易项更新任务事件 参数类型 派系ID 数字 星球ID 数字 是否为买入项 布尔值 已创建 布尔值 已更新 布尔值 已移除 布尔值 贸易交易任务事件 参数类型 发起方派系ID 数字 目标派系ID 数字 飞船ID 数字 星球ID 数字 星球类型ID 字符串 交易金额 数字 交易资源 字符串表 交易资源数量 数字表 商人到达任务事件 参数类型 商人离开任务事件 参数类型 海盗生成任务事件 参数类型 飞船ID列表 数字表海盗撤退任务事件 参数类型 已击败 布尔值 戴森探测器发射任务事件 参数类型 派系ID 数字 旧派系探测器数量 数字 新派系探测器数量 数字 旧活跃探测器数量 数字 新活跃探测器数量 数字 资源枯竭任务事件 参数类型 派系ID 数字 星球ID 数字 地块ID 数字 资源ID 字符串 建筑类型ID 字符串 人口里程碑任务事件 参数类型 派系ID 数字 人口类型ID 字符串 里程碑 数字 人口数量 数字 派系破产任务事件 参数类型 派系ID 数字 海盗撤退中任务事件 参数类型 触发任务事件 参数类型 触发ID 字符串 飞船跃迁任务事件 参数类型 飞船ID 数字 地形改造任务事件 参数类型 派系ID 数字 星球ID 数字 地块ID 数字统计菜单打开任务事件 参数类型 研究菜单打开任务事件 参数类型 贸易路线菜单打开任务事件 参数类型 外交菜单打开任务事件 参数类型 研究开始任务事件 参数类型 派系ID 数字 科技类型ID 字符串 外交状态变更任务事件 参数类型 派系ID0 数字 派系ID1 数字 旧状态 DIP_STATUS(可能为DIP_STATUS_WAR、DIP_STATUS_PEACE、DIP_STATUS_TRADE、DIP_STATUS_ALLIANCE) 新状态 DIP_STATUS(可能为DIP_STATUS_WAR、DIP_STATUS_PEACE、DIP_STATUS_TRADE、DIP_STATUS_ALLIANCE) 殖民地股份购买任务事件 参数类型 来源派系ID 数字 目标派系ID 数字 星球ID 数字 星球类型ID 字符串 股份价格 数字 外交提案创建任务事件 参数类型 提案ID 数字 来源派系ID 数字派系ID转数字 外交提议已回应任务事件 参数类型 提议ID 数字 派系ID来源 数字 派系ID目标 数字 接受 布尔值 太空船护航队任务事件 参数类型 派系ID 数字 太空船ID 数字 护航队目标太空船ID 数字 参考:角色 黑兹尔 动画名称/角色设置 黑兹尔_中立 黑兹尔_得意 黑兹尔_震惊 黑兹尔_严肃 黑兹尔_哭泣 黑兹尔_流泪 黑兹尔_绝望 西奥 动画名称/角色设置 西奥_中立 西奥_疲惫 西奥_压力大 文森特 动画名称/角色设置 文森特_中立 文森特_恍惚 文森特_沉思 文森特_不开心 克罗格 动画名称/角色设置 克罗格_中立 克罗格_咧嘴笑 克罗格_沉思 迈拉 动画名称/角色设置 迈拉_被俘 迈拉_中立 迈拉_开心 迈拉_沉思 迈拉_愤怒 米克 动画名称/角色设置角色设置 mik_中立 mik_悲伤 mik_自信 卢卡斯动画名称/角色设置 lucas_中立 lucas_羞愧 lucas_担忧 德雷舍动画名称/角色设置 dresher_中立 dresher_咧嘴笑 士兵动画名称/角色设置 soldier_中立 科学家动画名称/角色设置 scientist_中立 雇佣兵动画名称/角色设置 mercenary_中立 商人动画名称/角色设置 trader_中立 参考: 场景管理器 #1 startQuest 参数类型:questID(字符串) 返回类型:无 描述:开始任务 createAndStartQuest 参数类型:questTable(表格) 返回类型:无 描述:创建动态任务并开始 getCurrentQuestID 参数类型:无 返回类型:字符串 描述:返回当前激活任务的ID isQuestActive参数类型 返回类型 布尔值 描述:返回是否有任何任务当前处于激活状态 完成任务 参数类型 任务ID 字符串 返回类型 无 返回值 描述:立即完成指定任务 取消激活任务 参数类型 无 返回类型 无 返回值 描述:取消当前激活的任务 跳转到章节 参数类型 新章节索引 数字 返回类型 布尔值 描述:立即跳转到指定索引的章节 添加胜利条件 参数类型 任务表 表格 返回类型 无 返回值 描述:添加指定的胜利条件 胜利条件是否激活 参数类型 ID 字符串 返回类型 布尔值 描述:返回指定胜利条件是否激活 移除胜利条件 参数类型 ID 字符串 返回类型 无 返回值 描述:移除指定的胜利条件 添加失败条件 参数类型:任务表格(questTable) 返回类型:无(void) 描述:添加指定的失败条件 是否激活失败条件 参数类型:标识(id) 返回类型:布尔值(Boolean) 描述:返回指定失败条件是否处于激活状态 移除失败条件 参数类型:标识(id) 返回类型:无(void) 描述:移除指定的失败条件 显示对话框 参数类型:对话框标识(dialogID)、取消现有对话框(cancelExisting) 返回类型:无(void) 描述:显示指定的对话框 隐藏对话框 参数类型:无 返回类型:无(void) 描述:隐藏当前对话框 是否有对话框激活 参数类型:无 返回类型:布尔值(Boolean) 描述:返回是否有任何对话框处于激活状态 获取当前对话框标识 参数类型:无 返回类型:字符串(String) 描述:返回当前对话框的标识 激活场景参数激活场景参数 参数类型:parameterName(字符串) 返回类型:布尔值 描述:激活指定的场景参数(参见:参考:场景参数) 停用场景参数 参数类型:parameterName(字符串) 返回类型:布尔值 描述:停用指定的场景参数(参见:参考:场景参数) 检查场景参数是否激活 参数类型:parameterName(字符串) 返回类型:布尔值 描述:检查指定的场景参数是否处于激活状态 参考:场景管理器 #2 完成场景胜利 参数类型:message(字符串)、allowContinue(布尔值)、exit(布尔值)、campaign(布尔值) 返回类型:无 描述:触发场景胜利,并附带指定消息和参数。(注:参数campaign可忽略) finishScenarioLoss 参数 类型 reason String allowContinue Boolean exit Boolean campaign Boolean 返回类型 void 描述:根据给定消息和参数触发场景失败。(注:参数campaign可忽略) setScenarioMessage 参数 类型 message String duration Number 返回类型 void 描述:在屏幕顶部区域显示带有给定消息的消息横幅,持续给定时长。(同一时间仅能执行一个) scenarioCreateShipSpace 参数 类型 spaceshipID 字符串 factionID 数字 spawnPosition 二维向量 executeDirectly 布尔值 返回类型 数字 描述:在太空中生成一艘飞船。如果希望在创建飞船后直接访问某些飞船属性,参数'executeDirectly'可能相关,因为当此标志设为false时,飞船需要一个游戏滴答时间才能创建完成。返回所创建飞船的ID。注册场景 = 函数() 返回 { 名称 = "测试场景", 描述 = "用于测试的场景", 保存文件名 = "TestScenario.pss", 章节 = { { 章节名称 = "第一章", 参数 = { 场景参数.禁用商人, 场景参数.禁用海盗, }, 对话 = { { 标识 = "simple_dialog", 页面 = { { 文本标识 = "嗨,爸爸!你好吗?"场景创建飞船星球 参数 类型 spaceshipID 字符串 factionID 数字 planetID 数字 tileID 数字 executeDirectly 布尔值 返回类型 数字 描述:在太空中生成一艘飞船。如果希望在创建飞船后直接访问某些飞船属性,参数【executeDirectly】可能相关,因为当此标志设为【false】时,飞船需要一个游戏滴答才能创建完成。返回所创建飞船的ID。scenarioAddCredits 参数 类型 factionID 数字 credits 数字 返回类型 无 描述:向指定派系的银行添加指定数量的信用点。(允许负值) scenarioAddItems 参数 类型 planetID 数字 itemTypeID 字符串 amount 数字 返回类型 无 描述:向指定星球ID的星球添加指定物品。 scenarioShipSetHidden 参数 类型 shipID 数字 hidden 布尔值 返回类型 布尔值 描述:隐藏或显示指定飞船。scenarioDisallowItemTrades 参数 类型 itemTypeID 字符串 返回类型 无 描述:通过阻止创建该物品类型的交易条目,来防止指定物品被交易。 scenarioAllowItemTrades 参数 类型 itemTypeID 字符串 返回类型 无 描述:重新允许指定物品进行交易。参考:场景管理器 #3 scenarioGetPlanetItemAmount 参数类型 planetID 数字 itemTypeID 字符串 返回类型 数字 描述:返回指定星球上指定类型物品的数量 scenarioPurgeItemsOfTypeForFaction 参数类型 itemTypeID 字符串 factionID 数字 返回类型 空 描述:从指定星球上移除指定派系的所有指定类型物品 scenarioAddTradeEntry 参数类型 planetID 数字 itemTypeID 字符串 pricePerUnit 数字 itemLimit 数字 sell 布尔值 返回类型 空 描述:向指定星球添加指定的贸易条目 scenarioRemoveTradeEntry 参数类型 planetID 数字 itemTypeID 字符串 sell 布尔值 返回类型 空 描述:从指定星球移除指定(匹配的)贸易条目 scenarioTeleportShipToPlanet 参数类型shipID 数字 planetID 数字 tileID 数字 cancelRoute 布尔值 返回类型 空 描述:将指定飞船传送到指定星球上的指定地块 scenarioTeleportShipToPosition 参数类型 shipID 数字 position 二维向量 cancelRoute 布尔值 返回类型 空 描述:将指定飞船传送到指定位置 scenarioShipSetTargetTile 参数类型 shipID 数字 planetID 数字 tileID 数字 返回类型 空 描述:将指定飞船的目标设置为指定星球地块 scenarioShipSetTargetPlanet 参数类型 shipID 数字 planetID 数字 返回类型 空 描述:将指定飞船的目标设置为指定星球 scenarioShipSetTargetWorld 参数类型 shipID 数字 worldPosition 二维向量 返回类型 空 描述:将指定飞船的目标设置为scenarioShipSetMinHitpoints 参数类型 shipID 数字 minHitpoints 数字 返回类型 空 描述:将指定飞船的最小生命值设置为给定数值 scenarioShipSetItems 参数类型 shipID 数字 slot 数字 itemTypeID 字符串 amount 数字 返回类型 空 描述:设置指定飞船指定槽位中的物品 scenarioShipAddItems 参数类型 shipID 数字 itemTypeID 字符串 amount 数字 返回类型 数字 描述:向指定飞船的库存中添加指定数量的物品 参考:场景管理器 #4 scenarioShipDrawItems 参数类型 shipID 数字 itemTypeID 字符串 amount 数字 返回类型 数字 描述:尝试从飞船中移除指定数量的物品返回实际抽取的数量(<= 数量) scenarioDestroySpaceship 参数 类型 shipID 数字 返回类型 void 描述:摧毁指定的飞船 scenarioDiplomacySet 参数 类型 factionIDA 数字 factionIDB 数字 status 外交状态(可以是外交状态_战争、外交状态_和平、外交状态_贸易、外交状态_联盟) 返回类型 void 描述:设置两个派系之间的外交状态。doesPositionCollideWithPlanet 参数 类型 position Vector3f 返回类型 布尔值 描述:检查给定位置是否与行星发生碰撞。(不检查太阳) scenarioTriggerTraderManually 参数 类型 planetID 数字 返回类型 布尔值 描述:强制触发中立商人(仅在未激活禁用商人的场景参数时有效) scenarioTriggerPiratesManually 参数 类型 targetShipID 数字 spawnPosition Vector2f targetStrength 数字 返回类型 void 描述:使用给定参数强制触发即时海盗攻击。(仅在未激活禁用海盗的场景参数且存档中启用海盗时生效) scenarioTriggerPiratesManuallyFleet 参数 类型 targetShipID 数字 spawnPosition 二维向量 fleetTable 表格 返回类型 无 返回值 描述:使用给定参数强制立即触发海盗攻击。(仅在未激活禁用海盗的场景参数且存档中启用海盗时生效)。【fleetTable】是包含要生成的太空船类型ID及其数量的列表。", character = { characterID = "c_hazel", characterIdleAnimationID = "Idle", characterTalkAnimationID = "Talk", characterIdleExpressionID = "idle", characterTalkExpressionID = "talk", }, }, { textID = "我很好,谢谢你的关心!"{ { spaceshipTypeID = "s_fighter", count = 4, }, { spaceshipTypeID = "s_falcon", count = 1, }, }scenarioTriggerPiratesManuallyFaction 参数 类型 targetFactionID 数字 fleetTable 表格 返回类型 无 描述:使用给定参数强制立即触发一次海盗攻击。(仅在未激活禁用海盗的场景参数且存档中启用海盗时有效)。“fleetTable”是包含要生成的飞船类型ID及其数量的列表。{ { spaceshipTypeID = "s_fighter", count = 4, }, { spaceshipTypeID = "s_falcon", count = 1, }, }scenarioRemoveShipFromPirateFleet 参数 类型 shipID 数字 返回类型 空 描述:从任何活跃的海盗舰队中移除指定舰船。这将导致该舰船不再从海盗控制器接收任何新任务。 scenarioSetShipControllable 参数 类型 shipID 数字 controllable 布尔值 返回类型 布尔值 描述:更改舰船是否可由玩家或任何AI派系控制。scenarioSetShipInvincible 参数 类型 shipID 数字 invincible 布尔值 返回类型 布尔值 描述:更改飞船是否无敌 scenarioSetColonyControllable 参数 类型 planetID 数字 controllable 布尔值 返回类型 布尔值 描述:更改殖民地是否可由玩家或任何机器人派系控制 scenarioSetColonyInvincible 参数 类型 planetID 数字 invincible 布尔值 返回类型 布尔值 描述:更改殖民地是否无敌无敌殖民地等同于手动将所有建筑设为无敌。参考:场景管理器 #5 scenarioRemoveInvincibilityFromMilitaryBuildings 参数类型:planetID(数字) 返回类型:void 描述:移除指定星球上军事建筑的无敌状态 scenarioSetBuildingInvincible 参数类型:planetID(数字)、tileID(数字)、invincible(布尔值) 返回类型:Boolean 描述:设置指定建筑的无敌状态 scenarioDetermineSpaceshipYardTileID 参数类型:planetID(数字) 返回类型:Number 描述:返回指定星球上(首个)太空船坞的地块ID(如有) scenarioSetDysonProbesOfFaction 参数类型:factionID(数字)、amount(数字) 返回类型:void 描述:设置指定派系的戴森探针数量 scenarioGetDysonProbesOfFaction 参数类型:factionID(数字) 返回类型 编号 描述:返回指定派系的戴森探针数量 scenarioGrantPlanetToFaction 参数类型 派系ID 数字 星球类型ID 字符串 返回类型 数字 描述:立即将星球所有权转移给指定派系,若星球已被殖民则执行接管,否则放置太空港进行殖民 scenarioTriggerTrade 参数类型 飞船ID 数字 星球ID 数字 预算 数字 返回类型 无 描述:立即执行指定中立贸易飞船与指定星球之间的交易 scenarioShipSetName 参数类型 飞船ID 数字 名称 字符串 返回类型 无 描述:设置指定飞船的名称 scenarioShipSetSpecialMark 参数类型 飞船ID 数字 特殊标记 布尔值 返回类型 无 描述:设置指定飞船的特殊标记状态描述:设置是否在小地图上为指定舰船显示特殊标记(感叹号) scenarioShipSuppressAutoAttacks 参数类型 舰船ID 数字 禁止自动攻击 布尔值 返回类型 空 描述:设置指定舰船是否停止自动攻击敌方舰船和建筑 scenarioShipClearAttackTarget 参数类型 舰船ID 数字 返回类型 空 描述:重置指定舰船的攻击目标 scenarioOwnsPlanetType 参数类型 派系ID 数字 星球类型ID 字符串 返回类型 布尔值 描述:返回指定派系是否拥有指定类型的星球 scenarioGetInterestingPlanetID 参数类型 派系ID 数字 星球类型ID 字符串 返回类型 数字 描述:返回经济评分最高的星球,搜索可通过传入派系ID或特定星球类型场景进行筛选。获取太空港地块ID 参数类型 星球ID 数字 返回类型 数字 描述:返回指定星球上太空港的地块ID(如有) 参考:场景管理器 #6 场景获取带建筑的地块ID 参数类型 星球ID 数字 建筑ID 字符串 返回类型 数字 描述:在指定星球上查找指定类型的建筑并返回其地块ID。scenarioGetNearestPlanet 参数 类型 planetID 数字 返回类型 数字 描述:返回与指定行星最接近的行星ID scenarioIsBuildingOnPlanet 参数 类型 planetID 数字 buildingTypeID 字符串 返回类型 布尔值 描述:检查指定行星是否包含指定类型的建筑 scenarioPlaceBuildingOnPlanet 参数 类型 factionID 数字 planetID 数字 buildingTypeID 字符串 返回类型 无 描述:在行星上放置指定类型的建筑scenarioPlaceBuildingOnTile 参数 类型 factionID 数字 planetID 数字 buildingTypeID 字符串 tileID 数字 返回类型 void 描述:在指定ID的地块上放置指定类型的建筑。 scenarioDestroyBuildingOnTile 参数 类型 planetID 数字 tileID 数字 返回类型 void 描述:摧毁指定地块上的建筑。", character = { characterID = "c_theo", characterIdleAnimationID = "Idle", characterTalkAnimationID = "Talk", characterIdleExpressionID = "idle", characterTalkExpressionID = "talk", } }, { textID = "听到这个消息真是太好了!scenarioSetPlanetOwner 参数 类型 planetID 数字 factionID 数字 返回类型 无 描述:将星球的所有权转移给另一个派系。这将触发接管,包括其已配置的影响。 scenarioIsTraderActive 参数 类型 返回类型 布尔值 描述:返回中立商人当前是否处于活跃状态。场景:提升防御 参数 类型 星球ID 数字 目标军事评分 数字 最高等级 数字 忽略进度 布尔值 返回类型 布尔值 描述:在指定星球自动建造防御建筑。 场景:获取伪装贸易船ID 参数 类型 返回类型 数字 描述:返回任何活跃的伪装贸易船的舰船ID。 场景:海盗活跃状态 参数 类型 返回类型 布尔值 描述:返回海盗当前是否处于活跃状态。scenarioHideFactionInDysonMenu 参数 类型 factionID 数字 hidden 布尔值 返回类型 空 描述:更改戴森球菜单中指定派系的可见性。 scenarioShipBlockPush 参数 类型 shipID 数字 blockPush 布尔值 返回类型 空 描述:更改指定飞船的推动行为(禁用后不会被其他飞船推挤) scenarioApplyResearchBoost 参数 类型 factionID 数字 boost 数字 返回类型 空 描述:为指定派系应用研究增益。这会为当前正在研究的科技直接增加研究进度。参考:场景管理器 #7 场景:研究技术 参数类型:派系ID(数字) 返回类型:布尔值 描述:返回指定派系当前是否正在研究某项技术 场景:建筑损毁 参数类型:星球ID(数字)、地块ID(数字) 返回类型:无 描述:立即将指定建筑设置为损毁状态 场景:调整军事建筑无敌状态 参数类型:星球ID(数字)、无敌(布尔值) 返回类型:无 描述:设置指定星球上的军事建筑是否无敌 场景:重置殖民地战争计时器 参数类型:星球ID(数字) 返回类型:无 描述:将指定星球的殖民地战争计时器重置为最大值(30秒) 场景:触发机器人集结 参数类型:派系ID(数字)、目标等级(数字) 返回类型:void 描述:为指定派系触发机器人集结,该机器人会快速(且不重新计算建造费用)升级至指定目标等级 scenarioBotDestroyGoalsForAllPirateShips 参数类型:factionID 数字 返回类型:void 描述:使具有指定派系ID的机器人想要摧毁所有当前存在的海盗船 scenarioBotSetParamMilitaryFleetFactor 参数类型:factionID 数字 militaryFleetFactor 数字 返回类型:void 描述:为指定派系设置机器人参数【militaryFleetFactor】,该参数影响机器人想要拥有的舰船数量(乘数,最小值为1)scenarioBotSetParamColonyOvertakeFleetMultiplier 参数类型 factionID 数字 colonyOvertageFleetMultiplier 数字 返回类型 空 描述:为指定派系设置机器人参数【colonyOvertakeFleetMultiplier】,该参数会影响机器人在敢于攻击敌方星球前所需的舰船数量 scenarioShipSetBotClass 参数类型 shipID 数字 botClass 数字 返回类型 空 描述:设置指定舰船的【机器人等级】,决定拥有该舰船的机器人是否将其用于攻击 scenarioBotResetShipBotClasses 参数类型 返回类型 空 描述:重置世界中所有舰船的【机器人等级】 scenarioSetBotName 参数类型 factionID 数字 name 字符串 返回类型 空 描述:为具有指定派系ID的机器人设置名称scenarioBotTriggerEscort 参数类型 factionID 数字 shipID 数字 返回类型 无 描述:使具有指定阵营ID的AI操控单位护送指定飞船 scenarioBotAbortEscort 参数类型 factionID 数字 shipID 数字 返回类型 无 描述:使具有指定阵营ID的AI操控单位停止护送指定飞船 scenarioBotTriggerAttackShip 参数类型 factionID 数字 shipID 数字 neverBackOff 布尔值 allIn 布尔值 返回类型 无 描述:使具有指定阵营ID的AI操控单位攻击指定飞船,"allIn"参数会让AI操控单位动用其所有可用飞船 参考:场景管理器 #8 scenarioBotAbortAttack 参数类型 factionID 数字 shipID 数字 返回类型 无 描述:中止AI操控单位当前计划对指定目标发起的任何攻击舰船场景机器人触发攻击星球 参数类型 阵营ID 数字 星球ID 数字 立即执行 布尔值 返回类型 空 描述:安排指定星球被机器人攻击。参数“instant”将强制触发即时攻击(高优先级)场景 BotAnswerProposal 参数类型 factionIDBot 数字 factionIDOther 数字 accept 布尔值 返回类型 void 描述:回应机器人与指定其他派系之间的任何活跃提议 scenarioTriggerNotification 参数类型 iconID 数字 notificationColor 通知颜色枚举(可为DEFAULT_NOTIFICATION_COLOR_PLANS、RED_NOTIFICATION_COLOR_PLANS、GREEN_NOTIFICATION_COLOR_PLANS、ORANGE_NOTIFICATION_COLOR_PLANS) title 字符串 content 字符串 dismissable 布尔值 返回类型 void 描述:创建通知 scenarioTriggerNotificationShip 参数类型 iconID 数字 notificationColor 通知颜色枚举(可为DEFAULT_NOTIFICATION_COLOR_PLANS、RED_NOTIFICATION_COLOR_PLANS这是来自战役中黑兹尔与西奥的一段简单对话。这段对话由三页内容组成。GREEN_NOTIFICATION_COLOR_PLANS,ORANGE_NOTIFICATION_COLOR_PLANS) 标题 字符串 内容 字符串 可关闭 布尔值 飞船ID 数字 返回类型 空 描述:创建以飞船为目标的通知(点击通知会将玩家带到该飞船) scenarioTriggerNotificationPlanet 参数类型 图标ID 数字 通知颜色 枚举通知颜色(可以是DEFAULT_NOTIFICATION_COLOR_PLANS、RED_NOTIFICATION_COLOR_PLANS、GREEN_NOTIFICATION_COLOR_PLANS、ORANGE_NOTIFICATION_COLOR_PLANS中的任意一种) 标题 字符串 内容 字符串 可关闭 布尔值 星球ID 数字 返回类型 空 描述:创建以星球为目标的通知(点击通知会将玩家带到该星球) scenarioTriggerNotificationBuilding 参数类型 图标ID 数字notificationColor 枚举类型(可选值为DEFAULT_NOTIFICATION_COLOR_PLANS、RED_NOTIFICATION_COLOR_PLANS、GREEN_NOTIFICATION_COLOR_PLANS、ORANGE_NOTIFICATION_COLOR_PLANS) title 字符串 content 字符串 dismissable 布尔值 planetID 数字 tileID 数字 返回类型 无 描述:创建一个以建筑/地块为目标的通知(点击通知会将玩家引导至该地块) scenarioTriggerColonyWar 参数类型 planetID 数字 tileID 数字 attackerFactionID 数字 返回类型 无 描述:通过对指定地块发起攻击,强制指定殖民地进入战争模式 trigger 参数类型 triggerID 字符串 返回类型 无 描述:执行具有指定ID的触发动作触发器可与触发任务事件或触发任务配合使用,以追踪自定义操作。参考:场景管理器 #9 triggerQuickSave 参数类型 返回类型:void 描述:触发快速保存 setBotAttackClass 参数类型:attackClass(数字) 返回类型:void 描述:设置用于攻击或其他舰船行动的活跃机器人类型 getBotAttackClass 参数类型 返回类型:数字 描述:返回机器人当前的攻击类型 scenarioAddCustomTileMarker 参数类型:planetID(数字)、tileID(数字)、markerType(标记类型枚举,可选值为【白色格子标记】、【红色格子标记】、【绿色格子标记】、【蓝色格子标记】) 返回类型:void 描述:在指定格子上生成自定义格子标记 scenarioRemoveCustomTileMarker 参数类型:planetID(数字)、tileID(数字) 返回类型:void 描述:移除指定格子上的所有自定义格子标记scenarioClearCustomTileMarkers 参数类型:planetID(数字) 返回类型:无 描述:清除指定星球上的所有自定义地块标记 scenarioClearAllCustomTileMarkers 参数类型:无 返回类型:无 描述:清除所有自定义地块标记 createDipStatusImproveProposal 参数类型:factionIDFrom(数字)、factionIDTo(数字) 返回类型:无 描述:创建一个提升指定两个派系间外交状态的外交提案 scenarioShipIsTraveling 参数类型:shipID(数字) 返回类型:布尔值 描述:返回指定飞船当前是否正在航行 scenarioShipGetHitpoints 参数类型:shipID(数字) 返回类型:数字 描述:返回指定飞船的当前生命值 scenarioShipGetMaxHitpoints 参数类型:shipID(数字) 返回类型:数字类型 数字 描述:返回指定飞船的最大生命值 scenarioShipGetShieldpoints 参数类型 飞船ID 数字 返回类型 数字 描述:返回指定飞船的当前护盾值 scenarioShipGetMaxShieldpoints 参数类型 飞船ID 数字 返回类型 数字 描述:返回指定飞船的最大护盾值 scenarioGetPlanetPosition 参数类型 星球ID 数字 返回类型 二维向量 描述:返回指定星球的位置 scenarioGetPlanetTypeID 参数类型 星球ID 数字 返回类型 字符串 描述:返回指定星球的类型ID scenarioShipIsInWorldBounds 参数类型 飞船ID 数字 返回类型 布尔值 描述:返回指定飞船是否在世界边界内角色表情的定义有些繁琐,这里有个小技巧:角色表情设置都预定义在“scripts/scenarioDialogs/character_animations.lua”中,你可以在场景脚本中使用require来包含该文件,并使用其中预定义的表格。 以下是调整后的脚本设置: require "scripts/scenarioDialogs/character_animations.lua" registerScenario = function() return { name = "测试场景", description = "用于测试目的的场景", savefileName = "TestScenario.pss", chapters = { { chapterName = "第一章", parameters = { ScenarioParameter.DISABLE_TRADER, ScenarioParameter.

下载233乐园APP

专心推荐好游戏

关于我们 · 联系我们 · 隐私政策 · 营业执照

侵权投诉 · 开发者中心 · 用户协议 · 免责声明

不良信息举报中心

纠纷处理及不良内容举报电话:

4006600910 (工作时间: 9:00-12:30,14:00-18:00)

北京市朝阳区启阳路4号院2号楼15层1803室

本公司产品适合10周岁以上玩家使用 未成年人家长监护

首页 / Planet S

抵制不良游戏 拒绝盗版游戏

注意自我保护 谨防受骗上当

适度游戏益脑 沉迷游戏伤身

合理安排时间 享受健康生活

京ICP备18003564号-3

经营许可证编号:京B2-20181741

京公网安备:11010502052873

Copyright © 2026 233leyuan.com All Rights Reserved

北京龙威互动科技有限公司版权所有

热门游戏: 我的世界 | 三角洲行动 | 原神 | 王者荣耀 | 超自然行动组 | 蛋仔派对 | 和平精英 | 火影忍者 | 二重螺旋 | 英雄联盟 | 梦幻西游 | 明日方舟 | 斗罗大陆 | 光遇 | 鸣潮 | 无畏契约 | 模拟山羊3 | 樱花校园模拟器