Re: [閒聊] 戰役系統

作者: laechan (揮淚斬馬雲)   2017-02-10 10:22:43
經過一晚的思考,大致決定採取底下的定義方式(參考區域產生器):
// 菲里德古堡
#define MOBS ({\
({"mob1",81,({"vampire-bite flower","flower"}),RED"吸血"HIM"噬人花"NOR,\
-2000,500,5,({})}),\
({"mob2",83,({"tour-magic cat","cat"}),HIY"巡曳"HIB"魔法貓"NOR,\
-1500,500,5,({})}),\
({"mob3",84,({"nail-bone soldier","soldier"}),RED"釘"NOR"鈀"HIP"骸骨兵"NOR,\
-2500,500,5,({})}),\
({"mob4",135,({"shadow knight","knight"}),HIP"黑"NOR+MAG"影"HIP"騎士"NOR,\
-5500,500,0,({})}),\
})
使用 mixed 宣告可有效縮短每一行的設定值宣告量,然後戰役怪物
至少要有 war_mob 及 war_gmob 兩種型態,write_file mob file
時則應盡量單純:
inherit 戰役怪物繼承檔;
void create()
{
參數設定區;
}
應該要這樣就好,剩下全部都 follow 繼承檔的設定,這樣才能減少
日後得修改已產生的怪物檔的情況,同時又具備較大的擴充彈性。
然後另外再讓戰役系統支援「虛擬怪物的生成」,做法是採取第二種
宣告方式(區別 MOBS_DATA)
#define VIRTUAL_MOBS ({\
({"war_mob",81,({"vampire-bite flower","flower"}),RED"吸血"HIM"噬人花"NOR,\
-2000,500,5,({})}),\
({"war_gmob",83,({"tour-magic cat","cat"}),HIY"巡曳"HIB"魔法貓"NOR,\
-1500,500,5,({})}),\
})
欄位1: 呼叫哪一個 mob sample 物件出來
欄位2: 等級
欄位3: id
欄位4: 中文名
欄位5: 道德值
欄位6: 金錢值
欄位7: 隻數
欄位8: 其它設定值
說到欄位,通常打死戰役怪物應該要給戰功,就會有戰功設定值,
它有兩種做法:
1.設在最後欄位的 ({ }) 內,例如 ({"warexp",10})
2.設在最後欄位之前,例如欄位九
應該會採 2 的做法,因為戰役怪物通常都會有戰功,設在 ({})之
前的那個值就是戰功,這部份也很直覺。
然後 MOBS 與 VIRTUAL_MOBS 在戰功設定上的差異,就在於前者的
戰功設定值是寫進檔案內的,後者則是 clone 出來才設定的。
其它差異部份,因為所有 VIRTUAL_MOBS 都是呼叫自同一個怪物物
件檔案,為了設定上的方便,可能就不會去做 set_verbs 這類的設
定,但 wiz 仍可依需要自行將這些寫在上述的呼叫檔裡。
最後,我通常不會允許戰役怪物可以走動,但是,可以允許被搬移
,這會導引出一個新函數 war_mob_move 的產生,它的語法大概是
varargs int war_mob_move(string 地點1,string 地點2,string 出口方向);
例如說,某戰役是某軍派了四組人馬分別放置在呈直線的ABCD四個
點,然後
第一循環時間: B的怪→A,C的怪→B,D的怪→C D沒怪了
第二循環時間: B的怪→A,C的怪→B, CD沒怪了
第三循環時間: B的怪→A BCD沒怪了
有給出口方向時額外顯示「怪物往哪個出口前進」的相關訊息。
函數實際內容則是對 present("特定id",地點1) 做 loop check,
有找到才做搬移到地點2 的動作(不管是不是在戰鬥中)。
最後,因為 sanc 有地圖砲技能,這些技能是否支援清掉戰役怪物
,做法有幾種:
1.比方城鎮內不能施放地圖砲 -> 然後戰役怪物都是生成於城鎮內
(實務上不可能所有戰役都發生在城鎮內,城鎮範圍也很難界定)
2.地圖砲對戰役怪物無用 -> 戰役怪物都會帶特殊 id 及參數
3.縮減地圖砲對戰役怪物的影響 -> 同上
應該會採取 3 的做法,我的想法是,既然給了玩家地圖砲技能,
就應該讓玩家用(當然不能用的地方還是不行,這一開始就有講,
例如副本內),這部份我承認有受到素晴這部動畫的影響。縮減影
響的部份,目前則只想到「群式怪物就減個幾隻,戰功先給」這種
做法,這部份若以 ragnarok 這技能來看:
if(p>random(100))
{
tell_room(environment(ob),ob->query("short")+HIR"被"+SPELL_DATA[z][1]+
"瞬殺了!!"NOR"\n");
ob->die();
}
else if(ob->query("hp")<s2)
{
tell_room(environment(ob),ob->query("short")+HIR"被"+SPELL_DATA[z][1]+
"瞬殺了!!"NOR"\n");
ob->die();
}
else
ppl->shut(SPELL_DATA[z][1],s2,9999,"dam",ob);
(其實 ragnarok 就已經有做縮減效果判斷)
戰役怪物的縮減效果的判斷應該會寫在第一個 if 之後,也就是
else if(ob 是戰役怪物)
{
跑獨立的判斷式;
}
else if(然後才是原本的其它判斷)
{
.
.
其它像造物者之鑰也會被限制,不能對「戰役怪物所在的房間」
使用,它的前提當然是怪物不能隨便亂走。
設定稿大致在這裡結束。
Laechan

Links booklink

Contact Us: admin [ a t ] ucptt.com