正好我也有一个未完成的ARPG工程,可以拿来参考。
针对这个问题,首先是设置一个全局变量process,用来记录主线剧情的进度,比如0是初始,5000是结束,而中间的过程就是介于二者之间了。而且这个值不需要连续,比如100之后就跟着150,这样方便以后插入剧情。
除了主线剧情的进度,还有一个数组来表示支线进度。支线进度和主线是无关的。在这里,我用了64个支线进度,实际中可能用得更少。
GM可以设置在进入房间时执行的命令,这个时候就可以根据进度值来决定改变NPC的位置、删除NPC了。
对话命令写在scripts中。每一个脚本的底层是一个switch语句,根据输入的编号来执行不同的命令。脚本中可以设置任何方法,包括显示对话框、改变进程、创建怪物、传送等。
使用不同脚本的原因是房间、NPC很多,如果全写一起的话这个脚本会过于庞大,也不便于编号分配。通常一个房间用一个脚本,但也可以几个小的房间共用一个。此外对于一些特殊对话(比如存档人、商店),可以设置一个专用的脚本。
对话则是在各个NPC上设置的,包括两个属性talk_script和talk_index。前者表示对话命令的脚本,后者表示脚本中的对话编号。NPC可以是碰撞触发,也可以是接近后按下对话键触发。
而根据当前对话框的状态,也可以用和开始对话相似的方法设置一句话结束后接续的命令。——即如果当前没有对话框,则进入第一句对话,否则进入当前对话编号对应的下一句。这种方式也可以用于做出选择时,不同选项的结果。
对于杀怪行为,我们在创建了boss的生命条后,也会为其设置talk_script和talk_index,可以在对应敌人的生命值耗完后触发命令。
顺带一提、我这里的对话文本都是写在ini里面的,通过编号进行调用。而这些数据在游戏开始时读取一次,然后保存在了list数据中,这样就不会在存档时连文本也存进去了。
