[wizs] 接取臨時任務(殺怪/尋物)的設定方式
首先是任務房的部份:
參考標的: /d/map/lodoos/room/que_room.c
inherit /std/shop/que_room.c (QUEROOM)
房間設定: set("shop_name","Lodoos"); // 所屬區域,建立LIST專用,必設。
/std/shop/que_room.c
===================================================
#define MAX_QUEST 15 // 最大任務數量
#define MAX_NUM 3 // 每人可接取的最大任務量
#define LAST_POSITION 66 // 定位元
#define QUEST_PATH "/open/norr_data/quest/"
#include <daemons.h>
#include <config.h>
inherit "/std/shop/quest_base_room.c";
/std/shop/quest_base_room.c
===================================================
// a為殺怪類、b為尋物類。
static mapping KILL_QUESTS=([
// -------------------殺---怪---類---型-------------------
"a001":([ "name":"斬殺在飛禽谷中的鳥獸",
"type":"殺怪",
"reward":(["record_data/newbie_money":100000,
"ethic" :500,
"up" :800,
"exp" :250000,]),
"mob":(["/d/ppl/word/bird/mob/bird01":35,
"/d/ppl/word/bird/mob/bird02":20,]),
]),
.
.
// -------------------尋---物---類---型-------------------
"b001":([ "name":"尋找遺失的小鏡子",
"type":"尋物",
"reward":(["record_data/newbie_money":100000,
"up" :1500,
"exp" :350000,]),
"obj":(["/d/ppl/ina/moon/obj/mirror":1,]),
]),
.
.
我預設全 sanc 的任務房都是同一繼承樣本,同一設定方式,即
不管是羅德斯的任務房還是菲里德的任務房,所能觀看、接取的
任務都是一樣的,全部都長一樣。
而其任務的增減則一律透過修改 /std/shop/quest_base_room.c
的資料檔來完成,這個我最近會完成修改,讓其 mapping 宣告的
型式改成 save/restore 的資料存取方式,方便後面的人對其做
增刪改的動作。
==== 分隔線 ====
那因為任務房可以接 打怪 及 尋物 兩種任務,依照我不靠譜的
印象,我確實有對 a 及 b 開頭做過分類。因接取任務指令是寫
在 /std/shop/que_room.c 因此看這個即可
quest_num = sizeof( ppl->query_temp("obj_record") )+
sizeof( ppl->query_temp("mob_record") );
以上為 ppl 使用的 temp 欄位。
100% 100% 100% > receive a005
你成功地接取了這項任務,請加油!
100% 100% 100% > receive b001
你成功地接取了這項任務,請加油!
> quest demo
─╪☆ 任 務 狀 況 表 ☆╪─
----------------------------------------------------------------------
殺怪任務:
『斬殺在獅子山深處的獅子王(a005)』 一對白獅 ( 0 / 5 )
『斬殺在獅子山深處的獅子王(a005)』 獅子王-辛巴 ( 0 / 1 )
尋物任務:
『尋找遺失的小鏡子(b001)』 真實之鏡 ( 0 / 1 )
----------------------------------------------------------------------
玩家身上的 temp_data 資料如下
mob_record :
([
"a005" : ([
"/d/ppl/fmf/lion/mob/white" : "##一對白獅##0/5",
"/d/ppl/fmf/lion/mob/king" : "##獅子王-辛巴##0/1",
"#name" : "斬殺在獅子山深處的獅子王"
])
])
跟 a005 資料的對照
"a005":([ "name":"斬殺在獅子山深處的獅子王",
"type":"殺怪",
"reward":(["record_data/newbie_money":100000,
"ethic" :1200,
"up" :800,
"exp" :250000,]),
"mob":(["/d/ppl/fmf/lion/mob/white":5,
"/d/ppl/fmf/lion/mob/king" :1,]),
]),
所以 #name 取自 a005 資料,type 決定 mob_record 或 obj_record,
要殺的怪物的資料取自 mob,名字取自 mob->query("chi_name")。
obj_record :
([
"b001" : ([
"/d/ppl/ina/moon/obj/mirror" : "##真實之鏡##0/1",
"#name" : "尋找遺失的小鏡子"
])
])
與 b001 資料的對照
"b001":([ "name":"尋找遺失的小鏡子",
"type":"尋物",
"reward":(["record_data/newbie_money":100000,
"up" :1500,
"exp" :350000,]),
"obj":(["/d/ppl/ina/moon/obj/mirror":1,]),
]),
與上面類似,type 決定類型,以及讀取的標的。
switch(types) // 依照任務類型去分類
{
case "殺怪": types="mob_record"; types2="mob"; break;
case "尋物": types="obj_record"; types2="obj"; break;
}
所以 types 不是 mob_record 就是 obj_record
if(questing(types,"check",str,({ppl})) > 0)
return notify_fail(HIR"你已經接取這項任務了唷!\n"NOR);
即 questing 已寫好底下兩個東西:
questing("mob_record",要做啥,任務標記,({參數群}))
questing("obj_record",要做啥,任務標記,({參數群}))
接 check 的情況,參數群[0] 即欲 check 的玩家,>0 就是已接取
了這項任務,即
if(!undefinedp(ppl->query_temp("mob_record/任務標記")))
if(!undefinedp(ppl->query_temp("obj_record/任務標記")))
設定的情況:
tmps=({ppl,quests[str]["name"]});
tmp_keys=keys(quests[str][types2]); // 讀出所有要殺的mob。
foreach(tmp in tmp_keys)
tmps+=({tmp,quests[str][types2][tmp]});
questing(types,"set",str,tmps);
接 set 的情況,參數群tmps=({要設定的玩家,要設定的任務名字,
要殺的怪物檔名1,隻數1,
要殺的怪物檔名2,隻數2,
.
. });
或是 ({要設定的玩家,要設定的任務名字,
要取得的物品檔名1,數量1,
要取得的物品檔名2,數量2,
.
. });
這樣就可以在一般任務中增加臨時的 殺怪 or 尋物 任務。
判斷 殺怪 or 尋物 任務是否已完成:
if(questing(types,"check",str,({ppl})) < 1)
return notify_fail(HIR"你還尚未接取這項任務唷!\n"NOR);
else if(questing(types,"finish",str,({ppl,1})) < 1)
return notify_fail(HIR"你任務尚未完成唷!\n"NOR);
questing(types,"delete",str,({ppl})); // 完成就刪除標記
在 check 的情況,>0 就是接取了任務,<1 就是未接取。
這裡需規定臨時任務不可使用 a 與 b 開頭(即任務店專用開頭)。
判斷是否完成任務(完成的話會同時執行因為給了 1)
1 代表實際執行(但會先確定是完成)
if(questing(types,"finish",str,({ppl,1})) < 1)
finish 的情況,參數群內的 1 意義為何不明,我剛查了一下,
在 mob_record 的判斷上應該沒有給 1 的必要,obj_record 才
會用到:
if(sizeof(vars)>1 && vars[1]==1)
{
n=sizeof(qq2);
for(m=0;m<n;m++)
{
if(stringp(qq2[m]))
{
x=strsrch(qq2[m],"==");
ob->vobjs("add",qq2[m][0..x-1],-atoi(qq2[m][x+2..strlen(qq2[m])-1]));
}
else
{
tmp_ob=qq2[m];
tmp_ob->remove();
}
}
}
return 1;
}
return 0;
break;
從上面可知,物品搜集任務也支援「虛擬物品」。那我知道給 1 的
原因了,它的回報分為兩部份,第二部份實際扣除物品數量的部份,
唯有給 1 才會真正執行扣除。
這部份要多測試幾次才行。
刪除任務的部份
questing(types,"delete",str,({ppl})); // 完成就刪除標記
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 59.126.145.135 (臺灣)
※ 文章網址: https://www.ptt.cc/bbs/mud_sanc/M.1666063411.A.46F.html
※ 編輯: laechan (59.126.145.135 臺灣), 10/18/2022 17:20:21
→
10/18 17:22,
2年前
, 1F
10/18 17:22, 1F
→
10/18 17:22,
2年前
, 2F
10/18 17:22, 2F
→
10/18 17:23,
2年前
, 3F
10/18 17:23, 3F
→
10/18 17:23,
2年前
, 4F
10/18 17:23, 4F
mud_sanc 近期熱門文章
PTT遊戲區 即時熱門文章