楼主:
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