作者laechan (挥泪斩马云)
看板mud_sanc
标题[wizs] 任务房的设定方式
时间Tue Oct 18 11:23:29 2022
首先是任务房的部份:
参考标的: /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://webptt.com/cn.aspx?n=bbs/mud_sanc/M.1666063411.A.46F.html
※ 编辑: laechan (59.126.145.135 台湾), 10/18/2022 17:20:21
1F:→ laechan : 任务房因为会随机跑出任务,我应该会设定一两个可以 10/18 17:22
2F:→ laechan : 拿到挪布币或挪布币兑现券的任务,随机跑出时就能接 10/18 17:22
3F:→ laechan : 任务会导向我做的新区域(因为我自己熟这些区域) 10/18 17:23
4F:→ laechan : 挪布币任务的杀怪不只两种怪,寻物不只一种物品 10/18 17:23