作者laechan (小太保)
看板mud_sanc
标题[档案] spell_practice1.c
时间Wed Jun 9 15:27:57 2010
// spell_practice1.c
// Laechan@Sanc add in 2009/10/24
// 基本原则是以练习室的心跳函数来控制所有在这个房间的人
// 它们的练习, 这样可一次处理多人的练习
inherit ROOM;
mapping practice=([]);
// practice = ([
// "gravity":数值, // 重力数值
//
// "on_2" :代表启动上面
//
// 以上为练习飘浮术之用(它会抓身上有无飘浮术)
//
// "lv" : 数值, // 攻击级数
// "hit" : 数值, // 攻击连击数
// "time" : 数值, // 几秒後启动攻击
//
// "on_1" : 代表启动上面
//
// 以上为练习护盾法术之用(它会抓身上的护盾)
//
// "on_3" : 代表启动的防壁护罩
//
// 以上为自行练习攻击法术之用
//
// ]),
void create()
{
::create();
seteuid(getuid(this_object()));
set("light",1);
set("short","法术练习室");
set("long",@LONG
四周是一望无际的巨大空间。在这里你可以使用
两个指令:tune 及 spells。
LONG
);
// 禁止不正常脱离
set("no_recall",1);
set("no_return",30);
set("exits/out",__DIR__+"spell_practice");
set("pre_exit_func/out","hi");
set_heart_beat(1);
}
int hi()
{
// 特殊情况下无法 out
// 也可能以出口开启状态无法启动任何东西为设定
return 1;
}
// spell_practice = 练习室申请处
int env_remove(mixed obs)
{
if(obs)
obs->move(__DIR__+"spell_practice");
this_object()->remove();
return 1;
}
int heart_beat(int i)
{
string names=(string)query("names"); // 练习室的'登记'者
object ppl,env=this_object();
mixed obs; // 房间的所有物件
// 房间没有这个人时就把练习室干掉
if(!ppl=present(names,env))
return env_remove(obs);
obs=all_inventory(env);
if(!userp(ppl))
return env_remove(obs);
// 将 ppl 跟 obs 分开
// obs 会受到的影响是房间的重力等因素
obs-=({ppl});
// ppl 的部份
// obs 的部份
foreach(ppl in obs)
if(ppl && userp(ppl))
gravity_effect(ppl); // 重力影响;
return 1;
}
void init()
{
object ppl=this_player();
if((string)query("names") == (string)ppl->query("name") ||
wizardp(ppl))
{
if((int)practice["gravity"]<1)
practice["gravity"]=1;
add_action("tune_xxx","tune");
add_action("on_xxx","on");
add_action("off_xxx","off");
add_action("spells_xxx","spells");
}
}
int tune_xxx(string str)
{
string a,b;
int a1,a2,n;
if(!str || str=="")
return notify_fail(@LONG
tune 指令说明:
=================================================================
tune 1-1 to [n] 将魔法攻击等级设定为 n, 最小 1 最大 5
tune 1-2 to [n] 将魔法连击次数设定为 n, 最小 10 最大 99
tune 1-3 to [n] 设定魔法攻击的时间在 on 1 之後 n 秒
n 最小 5,最大 20。
tune 2 to n 设定练习室的重力倍数为 n 倍, 最小 1 最大 99
on [n] 启动第 n 项设定
off [n] 关闭第 n 项设定
restart [n] 重覆第 n 项设定 (注:restart 2 无意义)
=================================================================
Laechan@Sanc in 2009/10/24
LONG
);
if((int)practice["cant_tune"]>0)
return notify_fail("tune: 练习室正在执行程式,你现在不能 tune 喔。\n");
if(sscanf(str,"%s to %s",a,b)!=2)
return notify_fail("tune: 你的指令语法不对喔.\n");
if(atoi(a)==2)
a1=2;
else if(sscanf(a,"%d-%d",a1,a2)==2);
else
return notify_fail("tune: 你的指令语法不对喔.\n");
if(a1<1 || a1>2)
return notify_fail("tune: 你的指令语法不对喔.\n");
n=atoi(b);
if(n<1 || n>99)
return notify_fail("tune: 你不能给 "+b+" 这样的值喔.\n");
switch(a1)
{
case 1:
switch(a2)
{
case 1:
if(n<1 || n>5)
return notify_fail("tune: 魔法攻击等级只能设定在 1~5 之间喔.\n");
practice["lv"]=n;
return notify_fail("tune: 你将魔法攻击的等级设定为 ["+n+"] 级了。\n");
break;
case 2:
if(n<10 || n>99)
return notify_fail("tune: 魔法连击次数只能设定在 10~99 之间喔.\n");
practice["hit"]=n;
return notify_fail("tune: 你将魔法连击的次数设定为 ["+n+"] 连击了。\n");
break;
case 3:
if(n<5 || n>20)
return notify_fail("tune: 魔法连击时间只能设定在 5~20 秒後喔.\n");
practice["time"]=n;
return notify_fail("tune: 你将魔法攻击的时间设定在 ["+n+"] 秒後了。\n");
break;
default:
return notify_fail("tune: 没有 "+a1+"-"+a2+" 这个设定项喔。\n");
break;
}
break;
case 2:
a2=(int)practice["gravity"];
if(n==a2)
return notify_fail("tune: 练习室现在的重力倍数已经是 "+n+" 了喔.\n");
practice["gravity"]=n;
return notify_fail("tune: 你将练习室的重力倍数调整为 "+n+" 了。\n");
break;
default:
return notify_fail("tune: 没有第 "+a1+" 设定项喔。\n");
break;
}
}
int on_xxx(string str)
{
int n;
object ppl=this_player();
if((string)query("names")!=(string)ppl->query("name"))
return 0;
if(!str || str=="")
return notify_fail("语法:on [n],如 on 1、on 2 等。\n");
n=atoi(str);
if(n<1 || n>2)
return notify_fail("目前你只能下 on 1 跟 on 2 喔。\n");
if(practice["on_"+n])
return notify_fail("on: 第 "+n+" 项已经启动了喔。\n"+
" 关闭的指令是 off,重启动的指令是 restart。\n");
if(n==1)
{
if(!practice["lv"])
return notify_fail("在 on 1 之前你要先 tune 1-1 to [级数] 喔.\n");
if(!practice["hit"])
return notify_fail("在 on 1 之前你要先 tune 1-2 to [连击数] 喔.\n");
if(!practice["time"])
return notify_fail("在 on 1 之前你要先 tune 1-3 to [时间] 喔.\n");
practice["on_"+n]=1;
n=practice["time"];
practice["when_start"]=n+time();
set_heart_beat(1);
return notify_fail("on: 你启动了[能量盾]的练习设定.\n"+
"┌──────────────┐\n"+
sprintf("│魔法攻击级数 :%d │\n",
practice["lv"])+
sprintf("│魔法攻击连击数 :%2d │\n",
practice["hit"])+
sprintf("│魔法攻击执行时间:%2d 秒後 │\n",
practice["time"])+
"└──────────────┘\n"+
(ppl->query_temp("shield2") ? "你已做好冲击准备。\n" :
HIR"你尚未施展护盾,请尽快施展!"NOR"\n");
}
int spells_xxx(string str)
{
if(!str || str=="")
return notify_fail(@LONG
spells(法术练习室专用指令)说明:
==================================================
spells [数量] [法术名称]
1.数量的多寡与 mag 属性有关
2.剩余的 sp 值也会影响可击发的数量
3.不需加级数(会自动施展最大级数)
4.部份技能作用在自己身上的效果,可提高击发数量
// 底下是相关的设定备忘录
比方你按 2,它会显示它已经在天空张设了结界,请你对天空发
出「任意数量的攻击法术」,指令以底下为例...
spells 99 fire
就是对天空发出 99 发的火系法术,它会根据你的「能力」来决
定你发完後「是否没力了」,只要处於没力状态,就必须等回复
了才能再练习。
所以选择的诀窍,就是摸索出依自己目前的「能力」能击出的最
多数量,使自己不会没力、「休息一会儿」即可再练习。
1. 数量越大,熟练度平方影响
2. 数量超越极限的话只能发出最大的 n 发, 然後需休息的时
间较久
(不管 sp 有没有回满)
--
※ 发信站: 批踢踢实业坊(ptt.cc)
※ 编辑: laechan 来自: 61.225.162.212 (06/09 15:47)
1F:推 justinj :.....要不要多设一个no_quit......avert 06/09 17:15
无论任何地方都可 quit,这是目前会确保的。
2F:推 justinj :....return可以将团员从里面call出来..进去时强制 06/09 17:55
3F:→ justinj :p leave.... 06/09 17:55
4F:推 justinj :还是说这是单人的...那就没此问题..beat_heart有判断 06/09 17:57
5F:推 justinj :漂浮术---->重力试链,解毒术-->各种状态毒素试链 06/09 18:14
6F:→ justinj :远见法术--->比较像巫师之眼(定期观察)...... 06/09 18:16
7F:→ justinj :这个是要控制及持续....那维持魔力输出的试链了.. 06/09 18:18
限制 return 不能进去,是因为那是一个特别的空间,
因此也无法 recall。
在规划上允许申请人可让玩家进入该空间看该玩家练习
,并且还能帮申请人 cast。(采允许制)
而且你要在里面组队、聊天、或干嘛也随你。
因为我有看到有人在牧师练习室 pr 时「不安於室」,
我不太想做机车的限制,但限制是一定要的,所以这个
练习室会跟牧师的不同,只要法师一离开,练习室就会
重置,而且短时间内该玩家无法再申请练习室。
(未来也倾向让申请练习室需要付出代价,钱是一种)
目前辅助技能的部份也只规划漂浮术跟护盾。我有考虑
让主法副牧也能在里面练圣光盾。
※ 编辑: laechan 来自: 122.117.3.82 (06/09 19:43)
8F:推 justinj :牧师不安於室是因为学点不足..而且pr到满要很久,所以 06/09 20:10
9F:→ justinj :写成跑机状态.... 06/09 20:11
10F:推 justinj :...也就是主人一定要在..其它人可以走进走出..... 06/09 20:14
11F:→ laechan :那个我不会做什麽限制,不要太离谱我都当没看到 06/09 20:19
12F:推 justinj :...pr圣光盾..2种盾的性质太过接近了..... 06/09 20:29
13F:推 hmml :牧师bless到後面间隔150以上,没办法像法师一样在里 06/09 20:58
14F:→ hmml :面发呆.... 06/09 20:59
※ 编辑: laechan 来自: 122.117.3.82 (06/14 20:16)
※ 编辑: laechan 来自: 61.225.162.241 (06/17 10:36)
※ 编辑: laechan 来自: 61.225.162.241 (06/17 14:20)
※ 编辑: laechan 来自: 61.225.160.229 (06/18 09:24)