[摳頂] spell_practice1.c
// 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)
推
06/09 17:15, , 1F
06/09 17:15, 1F
無論任何地方都可 quit,這是目前會確保的。
推
06/09 17:55, , 2F
06/09 17:55, 2F
→
06/09 17:55, , 3F
06/09 17:55, 3F
推
06/09 17:57, , 4F
06/09 17:57, 4F
推
06/09 18:14, , 5F
06/09 18:14, 5F
→
06/09 18:16, , 6F
06/09 18:16, 6F
→
06/09 18:18, , 7F
06/09 18:18, 7F
限制 return 不能進去,是因為那是一個特別的空間,
因此也無法 recall。
在規劃上允許申請人可讓玩家進入該空間看該玩家練習
,並且還能幫申請人 cast。(採允許制)
而且你要在裡面組隊、聊天、或幹嘛也隨你。
因為我有看到有人在牧師練習室 pr 時「不安於室」,
我不太想做機車的限制,但限制是一定要的,所以這個
練習室會跟牧師的不同,只要法師一離開,練習室就會
重置,而且短時間內該玩家無法再申請練習室。
(未來也傾向讓申請練習室需要付出代價,錢是一種)
目前輔助技能的部份也只規劃漂浮術跟護盾。我有考慮
讓主法副牧也能在裡面練聖光盾。
※ 編輯: laechan 來自: 122.117.3.82 (06/09 19:43)
推
06/09 20:10, , 8F
06/09 20:10, 8F
→
06/09 20:11, , 9F
06/09 20:11, 9F
推
06/09 20:14, , 10F
06/09 20:14, 10F
→
06/09 20:19, , 11F
06/09 20:19, 11F
推
06/09 20:29, , 12F
06/09 20:29, 12F
推
06/09 20:58, , 13F
06/09 20:58, 13F
→
06/09 20:59, , 14F
06/09 20:59, 14F
※ 編輯: 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)
mud_sanc 近期熱門文章
PTT遊戲區 即時熱門文章
10
18