最终整理版

This commit is contained in:
2026-06-03 17:04:06 +08:00
commit 959055ce90
1240 changed files with 80570 additions and 0 deletions
+26
View File
@@ -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("五行刻字在你脑海中拼成完整的路线。石缝弹开,你找到一把盗贼钥匙。")
+26
View File
@@ -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("五行刻字在你脑海中拼成完整的路线。石缝弹开,你找到一把盗贼钥匙。")
+26
View File
@@ -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("五行刻字在你脑海中拼成完整的路线。石缝弹开,你找到一把盗贼钥匙。")
+26
View File
@@ -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("五行刻字在你脑海中拼成完整的路线。石缝弹开,你找到一把盗贼钥匙。")
+26
View File
@@ -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("五行刻字在你脑海中拼成完整的路线。石缝弹开,你找到一把盗贼钥匙。")
+64
View File
@@ -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, "水罐装满了,尽快带回毛罗。")