作者:
laechan (揮淚斬馬雲)
2025-02-08 04:45:52再來講任務的隨機性部份,因為這篇可能有點長就跟前一篇切開。
(前一篇也可能還有啥要補充的)
任務受限於我在撰寫時的架構,使得它之後要弄一些東西時變得礙
手礙腳(比方 nonseq 就是一例)。後面我也想了很多方法要來突破
這些架構上的障礙,最近才想到怎麼做。
首先是任務進行中的 input_to 做法,這個我在
/open/cmds/quest/l/l002 有實驗過是可行的,然後鍊金術士轉職
任務 l011 也有這樣的應用:
write("請十秒內回答將空格應輸入的符號列出:\n"+datas[0]);
input_to("cala_over",0,ppl,datas[1],0,str);
因為任務的隨機性裡頭很常遇到「讓玩家先做出某種選擇,然後才
依玩家的選擇產生不同的路線或結果」這樣的情況,所以這部份先
提(包括範例在哪)。
那簡單的說,假設我們希望任務第 n 步驟有隨機性,這裡提供一個
超級簡單的做法,就是「自訂第 n 步驟」即可,就是土法煉鋼去模
擬第 n 步驟的進行。
以 quest 指令進行第 n 步驟的流程是
1. stepn_check
2. 通過 stepn_check 後的對話演示
3. stepn_end
玩家會獲得完成第 n 步驟的任務標記
那所謂 土法煉鋼去模擬第 n 步驟的進行 的意思就是
1. stepn_check
這裡就直接呼叫所在房間的某函數
2. 讓某函數利用 call_out 去跑任務對話
然後在某函數裡面 wiz 就想做什麼變化都可以
3. stepn_end
玩家會獲得完成第 n 步驟的任務標記
然後把 選擇 跟 土法煉鋼寫函數 切開,弄成兩個步驟,比方先在
前一步驟讓玩家選擇,然後才進行下一步驟跑自定函數,並在自定
函數中依玩家在前一步驟的選擇,跑不同的流程或結果。
然後不管如何玩家都會獲得完成任務第 n 步驟的標記,因此若想讓
玩家在前一步驟依選擇的不同,可能某些選擇是無法完成該任務步
驟時,那就應該在前一個流程的選擇那邊,就直接擋掉。
比方玩家選 1 或選 2 是錯的,那就要在選擇後就直接擋掉,或是
亦可在選擇後的次一步驟的 stepn_check 時擋掉。
(畢竟 stepn_check 函數也可以自訂)
接著是模擬對話,語速通常兩秒跑一次,因此先把一串對話打好
mixed chats=({
"對話1",
"對話2",
.
.
.
});
i=0;
foreach(tmp in chats)
call_out("show_talk",i++2,tmp);
void show_talk(string tmp)
{
write(tmp);
}
以上是最基本的土法煉鋼對話模擬,那建議參考
/open/cmds/quest/quest_data/quest_data.c
的 heart_beat 函數中關於 msg_buf 的部份:
msgs=msg_buf[tmps[i]];
jj=sizeof(msgs);
for(ii=0;ii<jj;ii++)
{
if(msgs[ii][0] && msgs[ii][1] &&
environment(msgs[ii][0])==msgs[ii][1])
tell_object(msgs[ii][0],""+msgs[ii][2]+"\n");
也就是玩家若提早離開房間,是否仍持續顯示,wiz 可自行
決定,預設的 msg_buf 是玩家若提早離開房間就不會再繼續
看到對話。
然後隨機性指的就是,比方第 n 步驟,透過土法鍊鋼,就能
告知玩家,任務指定要的東西或是需達成的條件,擁有兩種以
上可能的情況,這時玩家若不完整看完對話,就可能有不知道
到底要達成的是哪一種的情況,但沒關係,可以在 n+1 步驟
的 check 告知
第 n+1 步驟: stepX_check,這裡先判斷第 n 步驟 npc 要玩
家滿足的條件或是要取得的東西是什麼,然後就
在這裡告訴玩家即可。
這樣玩家就算跳過對話(第 n 步驟已完成),也可以透過 quest
指令得知剛剛那個步驟,它要滿足的條件或取得的東西是什麼。
雖然麻煩了些,但土法鍊鋼應用在這部份上面好處多多,可突
破 quest 既有架構的先天限制,並且可讓 wiz 隨心所欲。
我最近就會將這東西應用在 /open/cmds/quest/l/l013 絕頂改
裝上頭:
.
.
$N讀完 Page.49 後,將書本闔上後放回原位。
$N: 以蘋果做成的美味甜點嗎......##
step6_npc=/u/l/laechan/special/mob/zero##
step6_msg=
$M: 你來啦? 吾輩一直在等你哪
$N: 是的,魔女大人,這就是以蘋果做成的美味甜點。
$M: 喔喔,這...這是!! (≧▽≦)b
$M雙眼發亮,很快地收下了你準備的蘋果派
.
.
目前零固定要求玩家獻上蘋果派,但若自寫函數來模擬第 5 步
驟,就可以要求玩家獻上不同的東西,然後
step6_check()
{
先讀取 step5 裡頭它隨機要求的東西是什麼;
再判斷玩家是否滿足條件:
若不滿足就告知玩家需滿足什麼條件;
}
以零那格的寫法因為零不是 NPC 因此自訂函數我寫在零上面,
或是零所在的那格都可以。
這東西因為與鍊金術士有關,若寫好我也會回鍊金術士討論串
那篇文,來說明絕頂改裝任務改版後的流程說明。
到時就有範例,然後 wiz 也可以先自行實驗,雖說目前僅止於
理論,但應該是可行的,就任務標記要自行追加,以及要用一
些欄位來紀錄隨機這部份,比方魔女要求蘋果派時,如何讓這
個要求被記住:
1. 建議仍是用 record_data
2. 或是 myhome 的 my_data
3. 或是撰寫玩家可重新回到隨機前狀態或是重接任務的機制
說到這個,讓玩家重接任務或是倒回第 n 步驟,建議可使用
void init()
的指令宣告方式,看要寫在哪,提示玩家可透過去哪裡下什麼
指令來重新接取這個任務、或是倒回第 n 步驟。若以這東西
的存在為前提時,則比方蘋果派的任務就能設定在 temp_data
區,玩家知道三種要求的東西裡面,蘋果派最難,他希望能放
棄重選時,玩家只要去某地方下某指令即可。
(當然前提是玩家必須知道去哪裡、下什麼指令)
Laechan