最终整理版
This commit is contained in:
@@ -0,0 +1,26 @@
|
||||
extends NpcScript
|
||||
|
||||
const questID : int = ProgressCommons.Quest.SNAKE_PIT_THIEF
|
||||
const bitIndex : int = 0
|
||||
var thiefsKeyID : int = DB.GetCellHash("Thief's Key")
|
||||
|
||||
#
|
||||
func OnStart():
|
||||
var state : int = GetQuest(questID)
|
||||
if state >= ProgressCommons.SNAKE_PIT_THIEF.RIDDLE_SOLVED:
|
||||
return
|
||||
|
||||
Mes("墙上刻着第一行字:我从图利姆沙偷走的不是金子,而是一条能让我活下去的路。")
|
||||
Mes("字迹旁画着一只蛇,蛇头朝北。")
|
||||
|
||||
var newState : int = state | (1 << bitIndex)
|
||||
if newState != state:
|
||||
SetQuest(questID, newState)
|
||||
|
||||
if newState == ProgressCommons.SNAKE_PIT_THIEF.ALL_CLUES_FOUND:
|
||||
OnAllCluesFound()
|
||||
|
||||
func OnAllCluesFound():
|
||||
SetQuest(questID, ProgressCommons.SNAKE_PIT_THIEF.RIDDLE_SOLVED)
|
||||
AddItem(thiefsKeyID, 1)
|
||||
Mes("五行刻字在你脑海中拼成完整的路线。石缝弹开,你找到一把盗贼钥匙。")
|
||||
@@ -0,0 +1,26 @@
|
||||
extends NpcScript
|
||||
|
||||
const questID : int = ProgressCommons.Quest.SNAKE_PIT_THIEF
|
||||
const bitIndex : int = 1
|
||||
var thiefsKeyID : int = DB.GetCellHash("Thief's Key")
|
||||
|
||||
#
|
||||
func OnStart():
|
||||
var state : int = GetQuest(questID)
|
||||
if state >= ProgressCommons.SNAKE_PIT_THIEF.RIDDLE_SOLVED:
|
||||
return
|
||||
|
||||
Mes("墙上刻着第二行字:沙会吞掉脚印,水会记住脚步。")
|
||||
Mes("字迹下方有几道短线,像是在提醒你数清岔路。")
|
||||
|
||||
var newState : int = state | (1 << bitIndex)
|
||||
if newState != state:
|
||||
SetQuest(questID, newState)
|
||||
|
||||
if newState == ProgressCommons.SNAKE_PIT_THIEF.ALL_CLUES_FOUND:
|
||||
OnAllCluesFound()
|
||||
|
||||
func OnAllCluesFound():
|
||||
SetQuest(questID, ProgressCommons.SNAKE_PIT_THIEF.RIDDLE_SOLVED)
|
||||
AddItem(thiefsKeyID, 1)
|
||||
Mes("五行刻字在你脑海中拼成完整的路线。石缝弹开,你找到一把盗贼钥匙。")
|
||||
@@ -0,0 +1,26 @@
|
||||
extends NpcScript
|
||||
|
||||
const questID : int = ProgressCommons.Quest.SNAKE_PIT_THIEF
|
||||
const bitIndex : int = 2
|
||||
var thiefsKeyID : int = DB.GetCellHash("Thief's Key")
|
||||
|
||||
#
|
||||
func OnStart():
|
||||
var state : int = GetQuest(questID)
|
||||
if state >= ProgressCommons.SNAKE_PIT_THIEF.RIDDLE_SOLVED:
|
||||
return
|
||||
|
||||
Mes("墙上刻着第三行字:若听见鳞片摩擦石头,就别拔刀;停下,等它先走。")
|
||||
Mes("刻字边缘被蛇鳞磨得发亮,像是很多年都没有真正安静过。")
|
||||
|
||||
var newState : int = state | (1 << bitIndex)
|
||||
if newState != state:
|
||||
SetQuest(questID, newState)
|
||||
|
||||
if newState == ProgressCommons.SNAKE_PIT_THIEF.ALL_CLUES_FOUND:
|
||||
OnAllCluesFound()
|
||||
|
||||
func OnAllCluesFound():
|
||||
SetQuest(questID, ProgressCommons.SNAKE_PIT_THIEF.RIDDLE_SOLVED)
|
||||
AddItem(thiefsKeyID, 1)
|
||||
Mes("五行刻字在你脑海中拼成完整的路线。石缝弹开,你找到一把盗贼钥匙。")
|
||||
@@ -0,0 +1,26 @@
|
||||
extends NpcScript
|
||||
|
||||
const questID : int = ProgressCommons.Quest.SNAKE_PIT_THIEF
|
||||
const bitIndex : int = 3
|
||||
var thiefsKeyID : int = DB.GetCellHash("Thief's Key")
|
||||
|
||||
#
|
||||
func OnStart():
|
||||
var state : int = GetQuest(questID)
|
||||
if state >= ProgressCommons.SNAKE_PIT_THIEF.RIDDLE_SOLVED:
|
||||
return
|
||||
|
||||
Mes("墙上刻着第四行字:我把宝箱留给能读懂害怕的人。贪心的人只会听见锁声。")
|
||||
Mes("这里的沙子很新,似乎有人不久前才翻动过。")
|
||||
|
||||
var newState : int = state | (1 << bitIndex)
|
||||
if newState != state:
|
||||
SetQuest(questID, newState)
|
||||
|
||||
if newState == ProgressCommons.SNAKE_PIT_THIEF.ALL_CLUES_FOUND:
|
||||
OnAllCluesFound()
|
||||
|
||||
func OnAllCluesFound():
|
||||
SetQuest(questID, ProgressCommons.SNAKE_PIT_THIEF.RIDDLE_SOLVED)
|
||||
AddItem(thiefsKeyID, 1)
|
||||
Mes("五行刻字在你脑海中拼成完整的路线。石缝弹开,你找到一把盗贼钥匙。")
|
||||
@@ -0,0 +1,26 @@
|
||||
extends NpcScript
|
||||
|
||||
const questID : int = ProgressCommons.Quest.SNAKE_PIT_THIEF
|
||||
const bitIndex : int = 4
|
||||
var thiefsKeyID : int = DB.GetCellHash("Thief's Key")
|
||||
|
||||
#
|
||||
func OnStart():
|
||||
var state : int = GetQuest(questID)
|
||||
if state >= ProgressCommons.SNAKE_PIT_THIEF.RIDDLE_SOLVED:
|
||||
return
|
||||
|
||||
Mes("墙上刻着最后一行字:北、东、静候、回头,再向没有风的地方走。")
|
||||
Mes("最后一个字下面压着一块松动的石片。")
|
||||
|
||||
var newState : int = state | (1 << bitIndex)
|
||||
if newState != state:
|
||||
SetQuest(questID, newState)
|
||||
|
||||
if newState == ProgressCommons.SNAKE_PIT_THIEF.ALL_CLUES_FOUND:
|
||||
OnAllCluesFound()
|
||||
|
||||
func OnAllCluesFound():
|
||||
SetQuest(questID, ProgressCommons.SNAKE_PIT_THIEF.RIDDLE_SOLVED)
|
||||
AddItem(thiefsKeyID, 1)
|
||||
Mes("五行刻字在你脑海中拼成完整的路线。石缝弹开,你找到一把盗贼钥匙。")
|
||||
@@ -0,0 +1,64 @@
|
||||
extends NpcScript
|
||||
|
||||
#
|
||||
func OnStart():
|
||||
match GetQuest(WaterPondGlobal.QUEST_ID):
|
||||
ProgressCommons.SNAKE_PIT_BITING_THIRST.INACTIVE:
|
||||
OnInactive()
|
||||
ProgressCommons.SNAKE_PIT_BITING_THIRST.STARTED:
|
||||
OnCheckProgress()
|
||||
ProgressCommons.SNAKE_PIT_BITING_THIRST.REWARDS_WITHDREW:
|
||||
OnComplete()
|
||||
_:
|
||||
OnInProgress()
|
||||
|
||||
# Quest states
|
||||
func OnInactive():
|
||||
Mes("我的水全洒了。没有水,我回不到图利姆沙。")
|
||||
Mes("几天前我以为自己能征服这片沙地,就进了这座洞。里面有一处很干净的地下水池,以前旅人会来这里补水。")
|
||||
Mes("后来蛇越来越多。它们毒性不强,但咬得很凶,我每次装好水,走不到一半就被咬到手抖,把水全洒掉。")
|
||||
Mes("你能替我试一次吗?只要把水罐装满带回来,我就能回城。")
|
||||
Mes("洞里还有些旧刻字,像是某个盗贼留下的路线。你如果看见,最好记下来,蛇坑里没有无用的线索。")
|
||||
Choice("我去试试。", OnAccept)
|
||||
Choice("今天不行。", OnDecline)
|
||||
|
||||
func OnCheckProgress():
|
||||
var rid : int = own.get_rid().get_id()
|
||||
if WaterPondGlobal.biteCounters.get(rid, 0) == 0:
|
||||
OnInProgress()
|
||||
else:
|
||||
OnDeliverWater()
|
||||
|
||||
func OnInProgress():
|
||||
Mes("清水池在洞穴深处,不是每一处水都能喝,脏水只会害你白跑。")
|
||||
Mes("找到清水池后别乱动,等水罐装满,再尽快带回来。")
|
||||
Mes("路上被蛇咬会漏水。漏光了就回水池重新装,别拿空罐子回来安慰我。")
|
||||
|
||||
func OnDeliverWater():
|
||||
WaterPondGlobal.StopJugTransport(own)
|
||||
ClearTracker()
|
||||
Mes("你回来了!水还在,太好了。")
|
||||
Mes("拿着这些,这是我剩下的东西。比不上你救我一命,但至少能让你少受点苦。")
|
||||
SetQuest(WaterPondGlobal.QUEST_ID, ProgressCommons.SNAKE_PIT_BITING_THIRST.REWARDS_WITHDREW)
|
||||
AddItem(DB.GetCellHash("Cactus Drink"), 10)
|
||||
AddExp(50)
|
||||
AddGP(1000)
|
||||
AddKarma(1)
|
||||
Mes("我现在就回图利姆沙。这里太危险了。")
|
||||
Mes("以后我会乖乖用城里的井水。蛇坑里的水,就留给蛇和胆子太大的人吧。")
|
||||
|
||||
func OnComplete():
|
||||
Mes("谢谢你帮我取回那罐水。现在我可以慢慢走回城,不用每一步都想着自己会不会倒下。")
|
||||
Mes("沙漠很美,但我已经受够了它的待客方式。")
|
||||
|
||||
func OnDecline():
|
||||
Mes("我明白。要是你改变主意,我还会在这里,希望不会太久。")
|
||||
|
||||
# Transitions
|
||||
func OnAccept():
|
||||
SetQuest(WaterPondGlobal.QUEST_ID, ProgressCommons.SNAKE_PIT_BITING_THIRST.STARTED)
|
||||
Mes("拿着这个水罐。清水池在洞穴深处。")
|
||||
Mes("我只记得一开始往北,之后转向东边。再后面也许是向南,也许是追着没有风的地方走。")
|
||||
Mes("说实话,我记得最清楚的是蛇咬上来的声音。")
|
||||
Mes("如果你在墙上看到旧盗贼的刻字,就照着记。那些字也许比我的脑袋可靠。")
|
||||
Mes("最好带上可靠的宠物伙伴。蛇很多,单靠胆量装不满水。")
|
||||
@@ -0,0 +1,40 @@
|
||||
extends NpcScript
|
||||
|
||||
# Quest ID
|
||||
const questID : int = ProgressCommons.Quest.SNAKE_PIT_THIEF
|
||||
|
||||
# Reward items
|
||||
var scimitarID : int = DB.GetCellHash("Scimitar")
|
||||
|
||||
# Required items
|
||||
var thiefsKeyID : int = DB.GetCellHash("Thief's Key")
|
||||
|
||||
#
|
||||
func OnStart():
|
||||
match GetQuest(questID):
|
||||
ProgressCommons.SNAKE_PIT_THIEF.RIDDLE_SOLVED: OnTryOpen()
|
||||
ProgressCommons.SNAKE_PIT_THIEF.REWARDS_WITHDREW: OnEmpty()
|
||||
_: OnLocked()
|
||||
|
||||
func OnTryOpen():
|
||||
if not HasItem(thiefsKeyID):
|
||||
OnLocked()
|
||||
return
|
||||
|
||||
if not IsTriggering():
|
||||
Trigger()
|
||||
|
||||
Mes("五条刻字指向的锁孔终于转动。箱盖掀开时,一股干冷的旧沙味涌了出来。")
|
||||
SetQuest(questID, ProgressCommons.SNAKE_PIT_THIEF.REWARDS_WITHDREW)
|
||||
|
||||
RemoveItem(thiefsKeyID, 1)
|
||||
AddGP(200)
|
||||
AddItem(scimitarID, 1)
|
||||
AddExp(50)
|
||||
AddKarma(2)
|
||||
|
||||
func OnEmpty():
|
||||
Chat("盗贼宝箱已经空了,只剩几道被蛇鳞刮出的细痕。")
|
||||
|
||||
func OnLocked():
|
||||
Chat("箱锁上刻着蛇形纹路。没有盗贼钥匙,打不开它。")
|
||||
@@ -0,0 +1,13 @@
|
||||
extends NpcScript
|
||||
|
||||
#
|
||||
func OnStart():
|
||||
match GetQuest(WaterPondGlobal.QUEST_ID):
|
||||
ProgressCommons.SNAKE_PIT_BITING_THIRST.STARTED:
|
||||
OnFill()
|
||||
|
||||
func OnFill():
|
||||
var rid : int = own.get_rid().get_id()
|
||||
if not WaterPondGlobal.biteCounters.has(rid) and npc.get_node_or_null(own.nick) == null:
|
||||
(npc.ownScript as WaterPondGlobal).OnFillTick(own, own.position, 0)
|
||||
Mes("你把水罐浸入清水池。先别动,等水慢慢装满。")
|
||||
@@ -0,0 +1,6 @@
|
||||
extends NpcScript
|
||||
|
||||
func OnStart():
|
||||
match GetQuest(WaterPondGlobal.QUEST_ID):
|
||||
ProgressCommons.SNAKE_PIT_BITING_THIRST.STARTED:
|
||||
Mes("这池水混着泥和蛇蜕,绝不是毛罗说的清水池。")
|
||||
@@ -0,0 +1,67 @@
|
||||
extends NpcScript
|
||||
class_name WaterPondGlobal
|
||||
|
||||
#
|
||||
const QUEST_ID : int = ProgressCommons.Quest.SNAKE_PIT_BITING_THIRST
|
||||
const MAX_BITES : int = 5
|
||||
const FILL_TIME : float = 5.0
|
||||
const FILL_TICKS : int = 10
|
||||
const FILL_TICK_TIME : float = FILL_TIME / FILL_TICKS
|
||||
const MOVE_TOLERANCE_SQUARED : float = 8.0 * 8.0
|
||||
|
||||
# Per-player bite counters [PlayerRID, BiteCount]
|
||||
static var biteCounters : Dictionary[int, int] = {}
|
||||
|
||||
# Signal handling
|
||||
static func StartJugTransport(player : PlayerAgent):
|
||||
var rid : int = player.get_rid().get_id()
|
||||
biteCounters[rid] = MAX_BITES
|
||||
if not player.agent_damaged.is_connected(OnBite):
|
||||
player.agent_damaged.connect(OnBite)
|
||||
|
||||
static func StopJugTransport(player : PlayerAgent):
|
||||
var rid : int = player.get_rid().get_id()
|
||||
biteCounters.erase(rid)
|
||||
if player.agent_damaged.is_connected(OnBite):
|
||||
player.agent_damaged.disconnect(OnBite)
|
||||
|
||||
# Biting handling
|
||||
static func OnBite(player : PlayerAgent, value : int):
|
||||
if value == 0 or player.progress.GetQuest(QUEST_ID) != ProgressCommons.SNAKE_PIT_BITING_THIRST.STARTED:
|
||||
return
|
||||
|
||||
var rid : int = player.get_rid().get_id()
|
||||
if not biteCounters.has(rid):
|
||||
return
|
||||
|
||||
var remaining : int = biteCounters[rid] - 1
|
||||
biteCounters[rid] = remaining
|
||||
NpcCommons.PushTracker(player, "水罐完整度", remaining, MAX_BITES, "%")
|
||||
if remaining <= 0:
|
||||
Spill(player)
|
||||
|
||||
static func Spill(player : PlayerAgent):
|
||||
StopJugTransport(player)
|
||||
NpcCommons.SetQuest(player, QUEST_ID, ProgressCommons.SNAKE_PIT_BITING_THIRST.STARTED)
|
||||
NpcCommons.ClearTracker(player)
|
||||
NpcCommons.PushNotification(player, "你被蛇咬得太多,水罐漏空了。回清水池重新装水。")
|
||||
|
||||
# Jug filling handling
|
||||
func OnFillTick(player : PlayerAgent, startPos : Vector2, tick : int):
|
||||
if player.position.distance_squared_to(startPos) > MOVE_TOLERANCE_SQUARED:
|
||||
NpcCommons.ClearTracker(player)
|
||||
NpcCommons.PushNotification(player, "你动得太早,水还没装满。")
|
||||
else:
|
||||
if tick >= FILL_TICKS:
|
||||
CompleteFill(player)
|
||||
else:
|
||||
NpcCommons.PushTracker(player, "正在装水", tick, FILL_TICKS, "%")
|
||||
ScheduleTick(player, startPos, tick)
|
||||
|
||||
func ScheduleTick(player : PlayerAgent, startPos : Vector2, tick : int):
|
||||
AddTimer(own, FILL_TICK_TIME, OnFillTick.bind(player, startPos, tick + 1), player.nick)
|
||||
|
||||
func CompleteFill(player : PlayerAgent):
|
||||
StartJugTransport(player)
|
||||
NpcCommons.PushTracker(player, "水罐完整度", MAX_BITES, MAX_BITES, "%")
|
||||
NpcCommons.PushNotification(player, "水罐装满了,尽快带回毛罗。")
|
||||
Reference in New Issue
Block a user