Files
2026-06-03 17:04:06 +08:00

161 lines
7.9 KiB
GDScript

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("接触野外宠物会进入对战。战斗菜单中可以使用技能、捕捉符、切换宠物或逃跑。")