任務房的設定方式 - 聖殿英雄傳說 MUD

Edwina avatar
By Edwina
at 2022-10-18T11:23

Table of Contents

首先是任務房的部份:

參考標的: /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})); // 完成就刪除標記




--
Tags: 線上

All Comments

Damian avatar
By Damian
at 2022-10-21T05:34
任務房因為會隨機跑出任務,我應該會設定一兩個可以
拿到挪布幣或挪布幣兌現券的任務,隨機跑出時就能接
Todd Johnson avatar
By Todd Johnson
at 2022-10-23T23:44
任務會導向我做的新區域(因為我自己熟這些區域)
挪布幣任務的殺怪不只兩種怪,尋物不只一種物品

20221018修改事項

Catherine avatar
By Catherine
at 2022-10-18T09:15
一、法術技能鎗擊術(gun)實裝 新增 /d/spell/gun.c 我先以最簡單的方式實裝,這是以底下為前提 1. 承認 gun 技能的存在 2. 允許 gun 技能上限值至少 900 andgt; spell gun 使用鎗擊術之前,你必須先 hea ...

萬聖節活動PvE模式、造型曝光

Skylar Davis avatar
By Skylar Davis
at 2022-10-18T08:19
萬聖節活動PvE模式、造型曝光 魔女霧子不用忍術改用巫術? 一年一度的萬聖節即將到來,《鬥陣特攻2》照慣例也會舉行對應的特殊活動。消息指出 ,本次活動定於 10 月 25 日開始(台灣時間應為 26 日),帶來全新期間限定 4 人合 作 PvE 模式,以及索潔恩、垃圾鎮女王、霧子的活動造型。 根據前韓國 ...

一代vs二代商店

Quintina avatar
By Quintina
at 2022-10-17T21:03
整理一下價格跟一些注意事項 一代的經典鬥陣幣 只能買經典裝飾品(包括新英雄) 也就是永遠不會下架的那些 其他現實販賣的 像商店特定(有S標誌的) 或活動限定的都只能用新鬥陣幣買 (目前萬聖節活動還沒開始 所以還沒確定) 另外全面漲價 包括一代/OWL的東西 (有些傳奇的表情動作 因為我已經有了所以不知道 ...

有整理二代英雄數據的文章嗎

Zora avatar
By Zora
at 2022-10-17T19:58
之前一代在巴哈有篇文 整理各英雄傷害、補量、射速等等 但2020年就停更了 請問二代還有國內外網友整理這些數據嗎 不知道要用什麼關鍵字搜尋 - ...

請教好用的練習自訂

Tracy avatar
By Tracy
at 2022-10-17T19:06
平常都用FD4PW練跟槍 每日任務就是用76先殺個路西歐十次才開始玩快速 main索傑恩但是平均命中才28% 充能命中43% 想請教各位有沒有其他也很好用的自訂可以分享 希望自己練準一點可以打RK才不會被噴 感謝各位大師宗師人體自瞄 ----- Sent from JPTT on my iPhone ...