extends NpcScript const PEYOTE_REQUIRED : int = 5 const MAGGOT_REQUIRED : int = 5 const FIELD_POSITION : Vector2 = Vector2(2912, 1312) # func OnStart(): var questState : int = GetQuest(ProgressCommons.Quest.TUTORIAL) if questState < ProgressCommons.TUTORIAL.ELANORE_DONE: OnInitialRecovery() elif questState == ProgressCommons.TUTORIAL.ELANORE_DONE: OnFirstMeeting() elif questState == ProgressCommons.TUTORIAL.KAEL_MET: OnCheckProgress() elif questState == ProgressCommons.TUTORIAL.KAEL_DONE: OnSendToEkinu() elif questState == ProgressCommons.TUTORIAL.EKINU_DONE: OnComplete() # Opening recovery and starter choice func OnInitialRecovery(): var waterBottleID : int = DB.GetCellHash("Water Bottle") var cactusSourCandyID : int = DB.GetCellHash("Cactus Sour Candy") Mes("站稳。先让我看一下你的脸色。") Mes("巡逻队在城外沙地边缘发现你时,你已经脱水到说不出话。埃拉诺把你从最危险的状态里拉了回来,现在轮到我确认你还能不能上路。") Mes("抬手,握拳,深呼吸。很好。你还虚,但不是那种一阵风就能吹倒的虚。") Mes("先拿着水和仙人掌酸糖。图利姆沙欢迎活人,不欢迎逞强的人。") AddItem(waterBottleID) AddItem(cactusSourCandyID) OnOpeningBackstory() func OnOpeningBackstory(): Mes("你是被沙漠送到城门口的陌生人。身上没有能说明身份的东西,脚印却从风暴方向断断续续延过来。") Mes("最近 托诺里 不安稳。卡奥雷 的波动让野外宠物变得暴躁,东边还有一群把 卡奥雷 当信仰的疯子在袭击旅人。") Mes("所以我不会让你空手出城,也不会让你在城里闲逛到下一场麻烦砸过来。") OnStarterPetIntro() func OnStarterPetIntro(): Mes("先选一只初始宠物。不是装饰,也不是玩伴。它会替你挡住第一口毒牙,陪你学会怎么在这里活下去。") Mes("三只都经过巡逻队训练,性格和战斗方式不一样。") Mes("露莉娅属水,耐久和恢复节奏稳定,适合稳扎稳打。") Mes("啾啾鸟属风,动作快,适合先手和灵活周旋。") Mes("绒绒兽是普通系,脾气稳,招式直接,适合不想把战斗想得太复杂的人。") Mes("想清楚就选。没有绝对正确的答案,只有你愿意一起走下去的伙伴。") # Initial encounter func OnFirstMeeting(): Mes("选好伙伴了?好。能照顾宠物的人,至少比只会照顾自己的人可靠一点。") Mes("现在说正事。我这边正缺人手。") Mes("沙虫最近把仙人掌田啃得一塌糊涂。它们个头大,嘴却灵活,能绕开刺直接钻进茎里。") Mes("一旦钻进去,整株仙人掌就会从里面被吃空。农户看到那种景象,脸色比沙暴天还难看。") Choice("这些沙虫为什么这么大?", OnKaoreExplanation) Choice("听起来很麻烦。", OnWildFauna) Choice("我可以帮忙清理。", OnWildFauna) func OnKaoreExplanation(): Mes("据说它们很久以前没这么夸张。可那是 卡奥雷时代 之前的事,已经没人亲眼记得。") Mes("卡奥雷 让很多生物变得异常:有的变大,有的暴躁,有的像死了又没完全死。") Mes("沙虫算是我们每天都能看见的麻烦版本。更糟的东西通常藏在城外。") if GetQuest(ProgressCommons.Quest.TUTORIAL) >= ProgressCommons.TUTORIAL.KAEL_DONE: MainChoices() else: Mes("闲话到此为止。我要你进田里把麻烦清掉。") Choice("好,我开始。", OnFieldCleanUp) Choice("城外到底发生了什么?", OnDesertExplanation) func OnWildFauna(): Mes("不管原因是什么,它们都得被清理。") Mes("城外的 卡奥雷 波动已经影响到城内田地,沙虫不是唯一的问题。") Mes("有些仙人掌怪也被侵蚀了,会跳来跳去,往旁边作物上甩水,像在故意嘲笑农户。") Choice("我去清理它们。", OnFieldCleanUp) Choice("城外到底发生了什么?", OnDesertExplanation) func OnDesertExplanation(): Mes("卡奥雷 正在影响各种生物。") Mes("它会把活物扭成更糟的样子:更凶、更饿、更难控制。") Mes("被侵蚀得太深时,它们甚至会像死物一样行动。那不是普通疾病,是一种很难洗掉的诅咒。") if GetQuest(ProgressCommons.Quest.TUTORIAL) >= ProgressCommons.TUTORIAL.KAEL_DONE: MainChoices() else: Mes("西边塔里的 玛纳伊尔 法师已经发出警告:托诺里 多处 卡奥雷 正在异常聚集。") Choice("明白了,先处理田地。", OnFieldCleanUp) Choice("玛纳伊尔 是谁?", OnManayir) func OnManayir(): Mes("玛纳伊尔 是研究 玛纳 的古老组织,就在城西那座塔里。") Mes("他们会监测 玛纳 和 卡奥雷 的流向,像预报天气一样发布警告。") Mes("二十七年前,也是他们宣布 卡奥雷时代 结束。可结束不代表消失,只是没以前那么压得人喘不过气。") Choice("先处理田地。", OnFieldCleanUp) Choice("卡奥雷时代 是什么?", OnAgeOfKaore) func OnAgeOfKaore(): Mes("我没亲眼经历过,但父辈都记得。那几百年里,卡奥雷 比 玛纳 更常见,变异生物和不死怪物到处都是。") Mes("我们现在抱怨沙虫和仙人掌怪,其实已经比那时候幸运多了。") Choice("先处理眼前的麻烦。", OnFieldCleanUp) # Task assignment func OnFieldCleanUp(): OnFightTutorial() Mes("先从北边田里的仙人掌怪开始。") LookAtPosition(FIELD_POSITION) Mes("它们是被 卡奥雷 侵蚀的仙人掌,对人不算致命,但已经没法种植。") Mes("它们会乱跳、甩水、惊扰宠物,还会把旁边作物弄坏。") ResetCamera() Mes("清理 5 只仙人掌怪和 5 只沙虫,今天的田地就能暂时安全。") HighlightUI(UICommons.UITarget.PROGRESS) Narrate("任务进度会记录你正在进行的委托和战斗目标。") HighlightUI(UICommons.UITarget.NONE) Narrate("图鉴和任务界面会帮助你确认已击败或遇见的宠物与怪物。") SetQuest(ProgressCommons.Quest.TUTORIAL, ProgressCommons.TUTORIAL.KAEL_MET) # Progress check func OnCheckProgress(): var peyoteKills : int = GetBestiary("Peyote".hash()) var maggotKills : int = GetBestiary("Maggot".hash()) if peyoteKills >= PEYOTE_REQUIRED and maggotKills >= MAGGOT_REQUIRED: OnTaskComplete() elif peyoteKills < PEYOTE_REQUIRED: Mes("还没完成。田里还需要再清理 %d 只仙人掌怪。" % (PEYOTE_REQUIRED - peyoteKills)) else: Mes("仙人掌怪处理得不错,但还差 %d 只沙虫。" % (MAGGOT_REQUIRED - maggotKills)) # Task completion func OnTaskComplete(): Mes("干得漂亮。") Mes("你处理得比我预想的快,也比很多正式巡逻员稳。") Mes("去向看守艾基努汇报吧。告诉他,我认可你今天的表现。") Mes("我们很快要组织一支小队去沙漠侦察,你可能正适合帮忙。") SetQuest(ProgressCommons.Quest.TUTORIAL, ProgressCommons.TUTORIAL.KAEL_DONE) AddExp(50) # func OnSendToEkinu(): Mes("准备好后去找看守艾基努。") Mes("他会告诉你下一步怎么做。") MainChoices() # func OnComplete(): Mes("很高兴又见到你。你看,沙虫还是不肯给我放假。") MainChoices() # func MainChoices(): Choice("这些沙虫为什么这么异常?", OnKaoreExplanation) Choice("我该怎么战斗?", OnFightTutorial) Choice("城外到底发生了什么?", OnDesertExplanation) Choice("我先走了。", Farewell) func Farewell(): Chat("出城后别只看前面,背后也可能有东西靠近。") func OnFightTutorial(): Mes("这不是让你亲手去砍仙人掌怪。让你的宠物上。") Mes("靠近野外宠物会进入宠物对战。进入战斗后,用战斗指令释放技能,用宠物指令切换队伍成员。") Mes("把对手削弱后,可以用捕捉符尝试收服。别一上来就丢,满体力的野外宠物通常不会乖乖进符。") DisplayActions(["gp_interact", "gp_target"]) Narrate("接触野外宠物会进入对战。战斗菜单中可以使用技能、捕捉符、切换宠物或逃跑。")