Jump to content
模组网
icedream

【Creation Kit 学习指南 20】任务收场

Recommended Posts

概述

本章将讲述收尾工作。在此之后,我们将看到有关Bendu Olo和他的护身符的宏大剧情。

学习最后一章时不需要手动做太多事情,并在完成先前任务学习教程的基础上进行。如果你需要了解相关内容,请先在先前章节中找到你所需要的。

你将学到:

  • 找到错误
  • 修复错误
问题

我们在运行任务时可能遇到一系列问题。

  • 我们能在接受任务后杀死Bendu,这将会导致无法完成任务。
  • 当Bendu告诉我们目的地时地图上没有添加标记。
  • 玩家可能通过扒窃获取护身符,这能提高任务的真实性,但是留下未完成的目标。
  • 玩家可能在接受任务前杀死盗贼,这能使任务提前完成,但是会使玩家产生困惑。
  • 在任务最后阶段Bendu可能事实上未拿到护身符。
  • 玩家可能丢弃护身符,但默认获得。且会导致我们很难找到它。
  • 如果玩家选择不帮助Bendu,他可能不会意识到曾经见过玩家,并导致一点儿冲突。
  • Bendu只会hello和goodbye,而不会针对特定的状况。
我们将在接下来的学习中学习这些内容--包括多种方法。

杀死Bendu

我们有处理Bendu死亡有2种方法:终止任务或使Bendu不死。2种方法都有特点--如果Bendu在任务完成后仍然有用,我们可以使他不死。

终止任务

我们已经展示如何在正确的阶段完成任务。当这个阶段被设定,任务移进已完成区域,"COMPLETED: <Quest Name>"将弹出。如果任务失败,玩家将看到“失败”。

建立一个新的任务阶段,序号200。用以下内容创建日志条目:

I failed to return Bendu Olo's amulet to him.

检查下方的“任务失败”对话框。

第二步,我们必须设定Bendu死亡的阶段。对他写一个脚本(和给盗贼写的那个相似)并命名为GSQBenduOloScript。在开头的脚本名称一行的下方,输入:

Quest Property GSQ01 auto
 
Event OnDeath(Actor akKiller)
    if (!GSQ01.IsCompleted())
        GSQ01.SetStage(200)
    endif
EndEvent
注意:我们检查任务确保它没有被完成,因为我们不希望玩家在完成任务后失败。

我们也可以自动填写属性GSQ01。

不死的Bendu

另一种方法是让Bendu不可杀死--如果玩家攻击他,他将倒下,但是在战斗结束后又将站起来。

明显这种方法更容易完成。打开GSQBenduOlo的角色窗口,并点击名称区域下方的"必要"选项框。("保护"是相似的状态,但是只允许玩家杀死该角色)

地图制作器

当我们告诉玩家目的地时,游戏将会添加一个地图标记使我们更容易找到目标。指引玩家进入ReachwindEyrieExterior01房间。(你可以双击ReachwindEyrie01内的黄色标记门)你将看到一个蓝绿色矩形和一个大M。

gallery_1_72_1118457.png

进入任务的20阶段,并对脚本添加一个ObjectReference属性,并命名为"DungeonMarker"。选择地图制作器。

现在,编辑阶段20的脚本:

SetObjectiveCompleted(10)
SetObjectiveDisplayed(20)
 
DungeonMarker.AddToMap()
扒窃

以下脚本通过增加任务线来使获得护身符的方法多样化:

Quest Property GSQ01 Auto
 
Event OnContainerChanged(ObjectReference newContainer, ObjectReference oldContainer)
    if (newContainer == Game.GetPlayer())
        GSQ01.SetStage(30)
    endif
EndEvent
这意味着当主角拿到护身符时,任务一定进入30阶段。如果之前没有杀死盗贼,那么20阶段不会发生,此时会跳过20阶段的文本并显示30阶段的(to return the amulet to Bendu) 。

最好的方法是判断20阶段是否运行并以此给30阶段出现合适的文本,先前的脚本应如下所示:

SetObjectiveCompleted(20)
SetObjectiveDisplayed(30)
更改后将如下所示:

if (!GetStageDone(20))
    SetObjectiveDisplayed(10, False)
endif
 
SetObjectiveCompleted(20)
SetObjectiveDisplayed(30)
第二行代码设定目标不要出现,因此它将消失在玩家的旅程中。

(当然,我们可以不设定“杀死盗贼”这个目标,只告诉玩家取回护身符。此方法优于其它方法,但是这不会鼓励玩家用特殊方法完成任务。)

不按照顺序

当然,最大的问题是玩家在会见Bendu之前清理瑞驰之风堡垒.这将会提前完成20阶段的目标(并不会显示)并显示30阶段的目标。这时玩家可能会困惑。在完成任务之前不会更新新剧情,并产生一系列莫名其妙的事件。

我们有一些建议:

  • 不要在盗贼的物品清单中创建护身符,应在游戏世界中创建(例如在一个不可触及的箱子中)。在玩家接受这个任务后在把其移入盗贼的物品清单中。
  • 设定护身符为盗贼的死亡物品(一个只有当角色死亡时才布置进其物品清单中的目标,而且不能被扒窃)。然后在玩家接受任务时复活这个盗贼。
    • (护身符将被设定为一个条件死亡物品,因此只会在适当的任务阶段中出现)
  • 允许玩家早期杀死盗贼,但是替换对话为"You mean... THIS amulet?!"(你是说这个护身符?!)然后完成任务。
  • 所有事物保持原样,但是盗贼在玩家接受此任务之前不出场,因此玩家不可能提前杀死盗贼。
在此剧情中,我们最后要选择最简单和不违背剧情的方法。但是另外两种放法用不同的思路解决问题,我们在以后还将用到。

要想禁用盗贼,只需简单地双击位于ReachwindEyrie01中的引用,并打开引用窗口。

gallery_1_72_21503.png

单击“默认初始屏蔽”选项框,点击确定,在你开始任务之前该盗贼将不会出现!

然后打开我们给盗贼设置的别名(在GSQ01的任务别名标签)。点击选项框右上方的“允许禁用”选项。将会允许别名指向被禁用的引用。

gallery_1_72_7447.png

用“特殊引用”填写别名的技巧时,你可以不必检查对话框。但是这样做无助于提高你的熟练度并养成良好的习惯。

现在我们必须在适当的时间让此盗贼出现。我们对任务阶段10编写如下脚本。

SetObjectiveDisplayed(10)
 
Alias_Thief.GetReference().Enable()
第一行已存在,但是第二行需要解释。
  • Alias_Thief -- 这是编辑器创建并填写的属性。每当你建立一个别名,游戏会在任务脚本中创建一个名为Alias_<AliasName>的属性。
  • GetReference() -- 也许我们对此感到困惑,这个别名并非指向的那个。这个别名只有任务知道,无论指向哪一个角色。我们通过调用这个函数可以知道别名指向哪个事物。
    • (如果你依旧感到困惑,先放下。我们将在以后更为深入的了解别名,你只需复制粘贴以上代码即可。)
  • Enable() -- 实际中启用这个引用。
现在当我们开始游戏时,此盗贼在玩家接受任务前不会出现。

交还任务物品

现在玩家可能在完成任务时没有交还护身符或获得赏金。这两种错误很容易修复。

再次打开阶段标签,进入40阶段。现在这个脚本不包括SetObjectiveCompleted(30)。我们将添加它。

第一行如下:

Alias_Bendu.GetReference().AddItem(Alias_Amulet.GetReference())
注意AddItem,你可以给它一个基本目标(是新建的而非已存在于物品清单中的)或一个引用(从它所在的地方移动)。然后这一行脚本将把护身符从玩家的物品清单中移至Bendu的物品清单。

现在注意有关赏金的问题。我们按照添加物品的方法添加金币。但是这意味着我们必须在脚本中添加一个有关金币的属性。点击“属性”按钮,然后将会自动在列表中创建一个别名。添加一个新的"MiscObject"类型属性并命名为"Gold001"--它已被自动填写,我们直接进入下一步。

以前,我们对各种名目使用的金币使用不同的基本目标,因此给这些金币添加特定的标记"001"。

现在我们已设置属性,我们再添加以下内容:

Game.GetPlayer().AddItem(Gold001, 500)
(如果没有给AddItem赋值,它将默认只添加一个。)

现在,Bendu对玩家承诺双倍的赏金,然后交给玩家500个金币。然而,我们可以以各种原因更改护身符的值。此时我们就要更改赏金数目。

Game.GetPlayer().AddItem(Gold001, Alias_Amulet.GetReference().GetGoldValue() * 2)
现在赏金是2个护身符的价值,我们也可以给玩家更多的金币。

注意我们从狭间空间中获取金币,而非从Bendu的物品清单中。虽然略微破坏游戏的现实性,但是能避免玩家通过扒窃、谋杀等方法获取金币。

丢弃任务物品

上古卷轴的玩家中不乏搜刮党的身影,他们会搜刮掉一切看见的物品直至负载过重,此时他们就会丢弃一些看起来不重要的物品,或者把这个护身符拿去装饰房间,或者拿它吸引巨人的注意力(对掠夺者无效)。有许多原因迫使玩家作出丢弃它的决定,但是这将会导致玩家完成任务后不知道此物品在哪里!

我们有很多方法解决这个问题(给丢弃的物品加上标记使之更易查找,加入发光反应使他人看到后给你,等等)。 你最好使用第一个,并逐步使用更多的工具。

但是最简单的方法是将护身符设置为任务物品。这意味着玩家在完成任务前不能丢弃或卖掉它,除非通过脚本移除。

我们对别名设置一个标记,因此将护身符的别名设置得很长,并点击“任务对象”选项。

gallery_1_72_11248.png

现在玩家将保留这个物品直到完成任务(幸运的是,任务物品不会增加负重,因此不会造成负担)

在辐射3和早期上古卷轴系列,“任务对象”存在于基本对象中。

错过任务关键

当我们拒绝任务再返回时Bendu可能已经对玩家没有印象了。例如,这只是一个单独的任务线,因此不会太糟糕。但是如果这是一系列线性问题,那么玩家将不会再次穿越回来。因此,我们必须解决说“不”的玩家回心转意时却无法接受任务的问题。

首先我们要添加一个新的任务阶段,5阶段。我们不添加任何旅程条目或任务逻辑--这是通用的习惯。

然后,如果玩家在对话时选择“不”,添加一行脚本设定进入阶段5。(选择“是”将进入10阶段)

现在进入有趣的阶段。打开初始话题(不是消息)GSQ01MeetingBenduBranchTopic。如下图所示:

gallery_1_72_19668.png

右击高亮消息并选择“复制”,如果存在一个脚本那么将完全复制父文件的消息,新的消息有它自己的脚本,包括父文件的代码(因此你能在不影响其它内容的情况下进行改变);如果父文件已经链接,那么新的文件将用相同的链接;如果父文件是Goodbye,那么这个也是。

如果对话系统产生一个话题(换言之,当玩家从话题列表选择"Do you need help with anything?"),那么它将从上往下完成消息,观察一个含有有效条件的。将会对相同的话题产生不同的反应(通过使用不同的GetIsID条件),在这种情况下,角色将在任务不同的阶段产生不同的回答。

打开顶部消息,并把GetStage条件从"< 10"改为"== 5"。现在当玩家第一次选择这个话题时,游戏将检查首个消息,看到它处于无效状态(因为任务阶段是0),然后进入下一个有效的话题。

将回答文本改为适当的内容--玩家接受任务。例如:"I already told you about my amulet. Are you going to help me or not?"(我已经告诉你有关护身符的消息,你打算帮我么?)

我们也可以填写窗口顶部的“提示”区域。如果我们填写,提示将优先于话题文本。通过利用提示的优先权,你能在编写对话时进退自如。

填写提示"Didn't you need something?"(你需要什么吗?)

最后的调整在这里--在天际中,玩家可以在对话时随意终止对话,而跳过对话必要的选项。对于某些对话,终止对话意味着默认选择一个选项,而且NPC会有对应的反应。(例如当你和一个试图逮捕你的守卫对话时,强行终止对话意味着拒捕。)

在这种情况下,当玩家强行终止和Bendu的对话时意味着选择“不”。

在此话题中打开另一个话题,选择不需要建立新提示的那个。在最右边,你将看到这个链接到的那个话题列表。

gallery_1_72_10184.png

当你将某物链接到对话框视图,在这里显示(如果你是先前工具的使用者,你会本能的在此设置一个链接)。在底部,点击"Walk Away:"选项框并选择GSQ01MeetingBenduNo链接。

此时如果你忘记设置Bendu所说的话的对话框,他的反应将如同你选择"Sorry, not right now."(对不起,现在不行)的一样。

我们能通过重新设定初始线的计时器来解决这个问题,或者通过用任务变量代替阶段。

问候语/告别语

现在当你会见Bendu,他将从此说起:

  • "Yes, sera?"
  • "And what might you need? Hmmm?"
  • "Yes?"
  • "Hmm?"
  • "Need something?"
这里一般的用MaleDarkElf声音类型写出的对话,并在对话前作为适当的介绍。但是以上内容很平淡。另外,如果你打算录制声音,那么这个声音将和其它对话的声音不一样。(除非你用Keith Szarabajka的声音)

因此我们可以编写一些特殊的对话并引用任务中已完成的。

打开GSQ任务窗口,并点击杂项标签。

gallery_1_72_15430.png

右击中间的话题标签,并选择“新建”。将会打开一个关于特殊情况的特殊事例话题列表。双击"Hello"建立一个新类别。填写名称为"GSQ01Hellos"。

这会激活右边的区域,这和我们给对话建立的消息列表功能相近。只有在玩家激活他们时才会说这个消息。但是这可能导致世界中的每个人用新的问候语,因此必须谨慎。

右击并建立一个新消息。例如"Oh, are you here to help?"并设定条件为:

  • GetIsID GSQBenduOlo == 1
  • GetStage GSQ01 < 10
(如果你愿意,你可以给5阶段创建不同的问候语,但是前提是你能熟练运用对话编辑器)

创建至少两个:

  • "Have you got my amulet yet?"
    • GetIsID GSQBenduOlo == 1
    • GetStage GSQ01 >= 10
    • GetStage GSQ01 < 40
  • "I can't thank you enough for helping me."
    • GetIsID GSQBenduOlo == 1
    • GetQuestCompleted GSQ01 == 1
事实上第2行的不是一个很好的案例,因为它提问一个没有提示的问题,从而让玩家回答。

你也可以创建一个告别话题,它将在玩家结束谈话时使用。

注意:编写的问候语和告别语将完全优先于一般的对话,而且是Bendu使用的惟一问候语和告别语。我们将在高级教程中修复这个问题。

自由结局

我们可以给任务中的每个部分设定多重结局。例如,我们可以对任务添加多种可能和结局,从而增加可玩性。

顺便说一句,你也能使任务一帆风顺并增加更多乐趣。

下章预告

这是任务设计基础系列的完结篇。此教程中还包含更多诸如发散剧情之类的高级话题。如果你想更深入地学习任务设计,请从[[bethesda_Tutorial_Packages|包]开始。

祝你在接下来的学习中一帆风顺!

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...