Fw: [闲聊] 战争/战役系统

楼主: laechan (挥泪斩马云)   2015-12-21 10:22:29
※ [本文转录自 mud 看板 #1MTs8EMm ]
作者: laechan (小太保) 看板: mud
标题: [闲聊] 战争/战役系统
时间: Mon Dec 21 10:20:58 2015
战争系统有几个关键元素
1.战争脚本档及脚本物件
脚本档应包含怪物/npc的召唤及命名,尽可能把战争所需的一切设定
都写在脚本内,让一个脚本=一场战争,这样类似的战争以后就仅需
复制脚本档来改即可。
另外,脚本档的架构也应单纯,易懂,好理解。这样即便是玩家,看
 过脚本档后也可以有能力提供战争脚本。
然后再透过写好的工具,将脚本档→脚本物件,则一场战争基本上就
 是读取脚本物件的资料来进行。
2.战争管理指令
例如假设指令为 war,则比方 war read 脚本档,就是读取脚本档的
 资料,转成物件档来储存;war half 脚本名,则可以暂时中断某一场
战争的进行;war stop 脚本名,则可以中止一场战争;war test 脚
本名,则可以进行一场战争脚本的相关测试等;....
对 wiz 来说,撰写这些语法就能对战争做各种管理;对玩家来说,例
 如 war check 语法,可让玩家查询正在进行中的战争;war list,可
让玩家查询 mud 内目前共有哪些战争可以玩、各战争的基本资讯为何
 等等。
3.怪物/npc 继承档
战争中召唤出的怪物或 npc 与一般的怪物/npc是不一样的,因此需有
 自订的继承档让这些怪物或 npc 来继承。
其中,最为关键的就是“召唤出的怪物/npc 在脚本档内的定义方式”。
例如以直觉的想法来说,脚本档内的怪物定义区可以这样子定:
等级 种族 怪物名 ....
mobs=
mob1:90,beast,魔兽战队,...
mob2:92,dragon,魔龙战队,...
.
.
##
然后,我在 sanc 撰写任务系统时,在脚本内导入了 macro,在 macro
字段内的东西会原封不动变成脚本物件内的 #define 区,例如
// 这一区可由玩家提供资料,由 wiz 来进行设定
macro=
#define MOBS ([\
"mob1":({90,"beast","魔兽战队",...}),\
"mob2":({92,"dragon","魔龙战队",...}),\
])
#define ROOMS ([\
"church":"/area/town/church",\
])##
上面的东西在 xxx.c 脚本物件内就会放在档头的 #define 区。
这样一来,例如战争的第 n 步骤,是召唤魔兽战队跟魔龙战队进攻城镇
内的教堂:
war_n=
魔王军进攻了城镇内的教堂!!
clone_mob("mob1",5,"church")
clone_mob("mob2",5,"church")##
接着,假设玩家必须清掉 church 内的所有怪物,战争才会往下一步骤
进行时,就必然会有一个 check 机制:
war_check_n=
war_check("check_mob","WAR_MONSTER","church")##
上面的意思是说,war_check 是一个写在脚本物件继承档内的函数,各脚
本都可以使用的,而在 war_check 这个函数内则定义了各种的 check 判
断,例如 "check_mob","WAR_MONSTER","church" 这一组资料就是用来判
断 "church" 这个房间的 WAR_MONSTER 怪物死光了没:
int war_check(string kind,string mob_name,string room_name)
{
switch(kind)
{
case "check_mob":
// 抓不到房间资料就当做怪物已打死
if(!room=find_object(ROOMS[room_name])) return 1;
// 在 room 里面找不到 id 为 mob_name 的怪物就当作怪物已死光
if(!present(mob_name,room)) return 1;
return 0;
break;
.
.
}
}
这样当战争管理系统对 war_n 做定期判断时,只要 war_check_n 回传的
值不等于 1,战争就永远停留在第 n 步骤,直到怪物被打死或消失。
以这种型式所写成的战争系统,依个人经验,它也可以支援“攻城战”,
例如一座在 mud 内早已存在的城,有城门及城内区域等,假设攻城战必须
由 wiz 开启(例如每个礼拜六晚上),则第一步骤就是召唤出“城门 mob”
,例如它是一只打不还手的 mob,血量有一亿,而线上最强的玩家每秒可
以给予该城门 mob 的伤害值最多就是 1 万时:
那如果只有一名玩家攻城,他要打 10000 秒才能把城门打破
反之,如果有 30 名玩家参与攻城,可能就只需几百秒就能把城门打破
war_check_1=
war_check("check_mob","WAR_MONSTER","castle_door")##
这样当城门被攻破(打死)时,war_check_1 找不到城门怪了,战争管理系
统就会开始呼叫 war_2 进行下一步骤。
上面有提到一个“战争管理系统”,这东西其实可以跟“战争管理指令”
写在一起,例如指令档的本身也兼管理档,或是指令档、管理档分开写亦
可。
它主要是做进行中的战争的流程控管、战争的自动开启与否、以及下次战
争需要再等多久才能开启等等,它亦可做“战争成就历史资料统计与查询
”,例如说:
1.某一场战争最快被结束的时间
2.单一玩家在某一场战争中最多的杀怪数
3.单一队伍在某一场战争中最多的杀怪数
4.战争中的最终阶段BOSS被KO的最短时间
.
.
以上,一点分享。我正在 sanc 撰写这样的系统。
Laechan@Sanc

Links booklink

Contact Us: admin [ a t ] ucptt.com