作者laechan (小太保)
看板mud_sanc
标题[抠顶] 大釜室
时间Thu Feb 28 10:14:40 2013
// cauldron_room.c
// Laechan@Sanc add in 2013/02/28
// cp from urd's alchemy_room.c
// 哈利波特的大釜, 炼魔药用
#define MED_COLOR ([\
"迷迭香":"白色","鼠尾草":"绿色","鸢尾根":"黄色","玫瑰瓣":"红色",\
"忍冬花":"咖啡色","蜈蚣藤":"褐色","赤桔梗":"血红色","魔罗果":"黑色",\
])
#define IGNITE_MENU ([\
])
// 药粉 迷迭香(m991) 丢掷用,一般对自己
// 药瓶 鼠尾草(m992) 丢掷用,可对敌,具特殊效果
// 药丸 鸢尾根(m993) 自己食用,加 buff,持效型
// 药水 玫瑰瓣(m994) 自己食用,瞬效,无持续效果
#define BREW_MENU ([\
"m991":({\
}),\
"m992":({
({"酸蚀瓶", 1, "炙蚁酸液", 3,"蛇精之血", 1}),\
}),\
"m993":({\
}),\
"m994":({\
}),\
])
#define CAULDRON_IGNITE_COST 10000
#defnie CAULDRON_IGNITE_TIME 1200
#define CAULDRON_IGNITE_MED0 99
#define CAULDRON_IGNITE_MED1 99
#define CAULDRON_IGNITE_MED2 99
inherit ROOM;
static mapping cauldron=([]);
static object vobjs_d;
void create()
{
::create();
seteuid(getuid(this_object()));
if(file_exists("/open/cmds/cauldron.o"))
restore_object("/open/cmds/cauldron");
else
{
set("light",1);
set("short","法师公会大釜室");
set("long",@LONG
在这里,你可以下三个指令:
manual 大釜使用指南
ignite 点火加热煮锅底
brew 炼药
LONG
);
set("exits/out","/d/nmap/klon/room/mage-guild");
}
}
int save_room()
{
save_object("/open/cmds/cauldron");
return 1;
}
void init()
{
add_action("manual_xxx","manual");
add_action("ignite_xxx","ignite");
add_action("brew_xxx","brew");
}
int manual_xxx(string str)
{
return notify_fail(@LONG
炼药时所需的五大药引为..
而在炼药中添进附加药引,可以增加炼药效果..
蜈蚣藤 加快速度
赤桔梗 增加产量
魔罗果 增加成功率
LONG
);
}
int ignite_xxx(string str)
{
object ppl;
string names,tmp,m0,m1,m2;
mixed tmps=({}),objs=({});
int t,added;
if(!str || str=="")
return notify_fail(@LONG
语法: ignite -药引名[,药引名2]
例子: ignite -迷迭香 以迷迭香做为主要药引
ignite -迷迭香,魔罗果 以迷迭香佐以魔罗果做为药引
ignite status 观看大釜状态
药引: 主要药引─迷迭香、鼠尾草、鸢尾根、玫瑰瓣
附加药引─蜈蚣藤、赤桔梗、魔罗果
共通药引─忍冬花(炼药时会自动添加进去)
炼药时若添加附加药引,可增加炼药效果
收费: 大釜点火费每次 10000 影特币,可炼药 20 分钟
ppl=this_player();
// 以後再考虑开放一般玩家调配 3p 药水
if(!wizardp(ppl) && (string)ppl->query("adv_guild")!="alchemist")
return notify_fail("ignite: 只有炼金术士才可以使用大釜喔.\n");
names=ppl->query("name");
t=time();
if(!vobjs_d)
if(!vobjs_d=find_object_or_load("/open/cmds/vobjs_d"))
return notify_fail("ignite: 目前虚拟物品系统有点问题喔.\n");
if(str=="status")
{
if(!cauldron[names])
return notify_fail("ignite: 你的大釜现在是熄火状态.\n");
if(cauldron[names]["times"]<t)
return notify_fail("ignite: 你的大釜需要重新点火添加药引喔.\n");
}
if(sscanf(str,"-%s",tmp)==1)
{
if(cauldron[names])
return notify_fail("ignite: 你的大釜已经有点火了喔.\n"+
" 你可以使用 ignite -status 观看大釜状态.\n");
objs=vobjs_d->vobjs_data("query_array","忍冬花");
m0=objs[0];
if(ppl->query_vobjs(m0)<CAULDRON_IGNITE_MED0)
return notify_fail("ignite: 你身上的忍冬花不足 "+CAULDRON_IGNITE_MED0+
" "+objs[2]+" 了.\n"+
" 忍冬花是炼药必备的共通药引喔!\n");
tmps=explode(tmp,",");
if(tmps[0]!="迷迭香" && tmps[0]!="鼠尾草" &&
tmps[0]!="鸢尾根" && tmps[0]!="玫瑰瓣")
return notify_fail("ignite: 你不能放非药引类的东西进去当主要药引喔.\n");
objs=vobjs_d->vobjs_data("query_array",tmps[0]);
m1=objs[0];
if(ppl->query_vobjs(m1)<CAULDRON_IGNITE_MED1)
return notify_fail("ignite: 你身上的"+tmps[0]+"不足 "+CAULDRON_IGNITE_MED1+
" "+objs[2]+" 了.\n");
if(sizeof(tmps)>1)
{
if(tmps[1]!="蜈蚣藤" && tmps[1]!="赤桔梗" && tmps[1]!="魔罗果")
return notify_fail("ignite: 你不能放非药引类的东西进去当附加药引喔.\n");
objs=vobjs_d->vobjs_data("query_array",tmps[1]);
m2=objs[0];
if(ppl->query_vobjs(m2)<CAULDRON_IGNITE_MED1)
return notify_fail("ignite: 你身上的"+tmps[1]+"不足 "+CAULDRON_IGNITE_MED2+
" "+objs[2]+" 了.\n");
added=1;
}
if(ppl->query("balance")<CAULDRON_IGNITE_COST)
return notify_fail("ignite: 你的银行存款不足点火费 "+
CAULDRON_IGNITE_COST+" 影特币喔.\n");
ppl->add("balance",-CAULDRON_IGNITE_COST);
ppl->vobjs("del",m0);
ppl->vobjs("del",m1);
if(added>0)
ppl->vobjs("del",m2);
cauldron[names]=([]);
cauldron[names]["times"]=t+CAULDRON_IGNITE_TIME;
cauldron["med1"]=m1;
if(added>0)
cauldron["med2"]=m2;
cauldron[names]["brewing"]=([]);
save_room();
str="你不是很熟练地打开了瓦斯炉,点火加热大釜。\n"+
"\"Amazing!麻瓜的东西真是又快又方便!\"\n";
if(added>0)
str+="你接着在大釜里放入了适量的"+tmps[0]+"及"+tmps[1]+",\n"+
"只见一缕"+MED_COLOR[tmps[0]]+"及"+MED_COLOR[tmps[1]]+
"的轻烟缓缓自大釜里升起...\n";
else
str+="你接着在大釜里放入了适量的"+tmps[0]+",\n"+
"只见一缕"+MED_COLOR[tmps[0]]+"的轻烟缓缓自大釜里升起...\n";
return str;
}
return notify_fail("ignite: 没有这个语法喔.\n");
}
int brew_xxx(string str)
{
string names,tmp,tmp1,tmp2,tmp3;
mixed tmps=({});
int t,i,j;
object ppl;
/*
名字未定 缩短再变身时间, 每吃一单位缩短剩余时间的一半
名字未定 一定时间内增强 hp 药水的服用效果或 hp 最大值
└药材跟「陆」类怪物有关
名字未定 一定时间内增强 sp 药水的服用效果或 sp 最大值
└药材跟「海」类怪物有关
名字未定 一定时间内增强 pp 药水的服用效果或 pp 最大值
└药材跟「空」类怪物有关
名字未定 增加en连击数的药
└药材跟一些动作很灵敏、攻击很快的怪物有关
名字未定 增加特攻连击数的药
└同上
名字未定 解各种异常状态
大力丸 吃了全种类攻击伤害增加(=经验值提高)
└药材跟一些力量很大或打人很痛的怪物有关
├可能会做个海滩放蟹
└可能会做个丛林放猩猩
一点灵 用了全种类攻击命中增加(=熟练度提高)
└药材跟一些眼睛很好的怪物有关,如蜥蜴、眼镜猴、猫科动物等
名字未定 adv -属性需要的药
*/
if(!str || str=="")
return notify_fail(@LONG
语法: brew 药名 from 药材1[,药材2,药材3,..]
例如: brew 酸蚀药瓶 from 炙蚁酸液,蛇精之血
LONG
);
ppl=this_player();
names=ppl->query("name");
t=time();
if(sscanf(str,"%s from %s",tmp1,tmp2)==2)
{
if(!cauldron[names])
return notify_fail("brew: 你要先 ignite 你的大釜喔.\n");
// 有上面代表有 times, brewing
if(sizeof(keys(cauldron[names]["brewing"]))>0)
return notify_fail("brew: 你的大釜里面有药正在炼制中喔.\n");
// 没有药在炼制、但是 times 过期
if(cauldron[names]["times"]<t)
{
map_delete(cauldron,names);
save_room();
return notify_fail("brew: 你的大釜已经过了租用时间罗.\n"+
" 你可以使用 ignite 指令重新租用它.\n");
}
if(!vobjs_d)
if(!vobjs_d=find_object_or_load("/open/cmds/vobjs_d"))
return notify_fail("brew: 虚拟物品系统现在有点问题喔.\n");
tmp=vobjs_d->vobjs_data("get_mark",tmp1);
if(tmp=="")
return notify_fail("brew: 没有这种药物可以炼制喔.\n");
tmps=keys(BREW_DATA[cauldron[names]["med1"]]);
j=sizeof(tmps);
for(i=0;i<j;i++)
if(tmps[i][0]==tmp1)
break;
if(ppl->query("sp")<((int)ppl->query("sp_src")*(int)tmps[i][1])/100)
return notify_fail("brew: 你的 sp 不足 "+tmps[i][1]+"% 了喔.\n");
tmps=tmps[i][2];
j=sizeof(tmps);
for(i=0;i<j;i=i+2)
{
tmp3=vobjs_d->vobjs_data("get_mark",tmps[i]);
if(ppl->query_vobjs(tmp3)<tmps[i+1])
return notify_fail("brew: 要炼制"+tmp1+",你需要 "+implode(tmps)+" 喔!\n");
}
for(i=0;i<j;i=i+2)
{
tmp3=vobjs_d->vobjs_data("get_mark",tmps[i]);
ppl->vobjs("add",tmp3,-tmps[i+1]);
}
return notify_fail("brew: 没有这个语法喔.\n");
}
--
※ 发信站: 批踢踢实业坊(ptt.cc)
※ 编辑: laechan 来自: 1.165.182.181 (02/28 20:24)
1F:→ laechan :真难搞 02/28 20:24
2F:→ laechan :今天写不完哩,明天继续 02/28 22:05
3F:→ laechan :今天继续 coding 03/01 09:28
4F:→ laechan :剩下最终的判断 03/01 10:21