
### 场景模组制作指南介绍 欢迎阅读场景模组制作指南!本指南将涵盖创建自定义场景的所有内容,包括如何设置基础场景、如何创建任务与对话以及事件、参数和特定于自定义场景的游戏玩法调整。 本指南不涉及资源创建(纹理/模型/声音)、建筑物或宇宙飞船等自定义内容(请参考我们更通用的模组制作指南:《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.
2026-03-26 22:00:11 发布在
Planet S
说点好听的...
收藏
0
0
