铁血丹心

 找回密码
 我要成为铁血侠客
搜索
查看: 5910|回复: 12

[通用] 一种在苍龙LUA版中实现战斗回放的简单方法(以及等待命令bug的修复方法)

  [复制链接]
发表于 2011-10-15 05:32 | 显示全部楼层 |阅读模式
本帖最后由 majorc 于 2012-4-15 00:07 编辑

导言
战斗回放就是把玩家操纵的一整场战斗记录下来,并以不停顿的方式播放一遍。战斗回放的主要好处有两个:其一,战斗回放过程中并没有任何玩家输入,不会因为等待用户输入而暂停,因此整个战斗节奏流畅,看起来就像战斗双方都是”自动战斗“一样。试想与东方不败大战三百回合之后,通过战斗回放来重新回味一下刚刚的一场血战,岂不痛快。其二,如果能够进一步把战斗记录转存到文件中,玩家之间就可以共享传看这些战斗。这在苍龙系列对战斗技巧的要求逐渐变高的今天,可以方便玩家之间的经验交流和学习。

很显然,直接截屏是不可行的,因为它无法去掉玩家操作的部分,而且对于一场比较长的战斗会生成很大的视频文件。这里介绍一种实现战斗回放的简单方法,它的基本原理是记录战斗一开始时的全部系统状态以及整个战斗过程中玩家的所有键盘输入。我在我的机器上基于苍龙逐日的LUA原版代码(从论坛下载直接的)实现了这个功能,并且初步测试了几场战斗,都可以做到100%的还原。整个功能实现对原来代码的改动非常小,我把经过修改的jymain.lua文件附在后面附件中,所有有改动的地方都有"--hbj"的注释以供快速搜索。大家可以对照着自行对自己手中的版本修改即可。

使用方法
在开始一场战斗之前存盘,然后在战斗结束之后立即读取进度(中间不能退出游戏),然后重新开始刚才的战斗。注意参战人物必须和刚才一样。战斗开始之前系统会询问玩家是否进入战斗回放模式。此时按Y键开始看战斗录像,按其他任意键则直接开始普通战斗。

实现方法
首先是记录战斗开始时的全部系统状态,这包括游戏数据和随机数两部分。其中游戏数据的记录可以直接复用现有的游戏存档功能,只要在一场战斗开始之前存档,所有人物属性(内力值,中毒情况,武功离升级还要打多少下)和即将发生的战斗场景就都保存下来了。

随机数的保存需要修改代码。原代码是在游戏开始时一次性用当前时间设置随机种子,这样不容易控制一场具体战斗的随机数生成。我的方法是在每场战斗开始时重新设置一次随机种子,并且把最近一次战斗的种子记录在一个全局变量里。这样只需要在一场战斗之后立即读取进度(中间不能退出游戏),然后用最近一次战斗的种子作为新战斗的种子,这样就完全复现了上一次战斗开始时的所有系统状态。当然,为了使战斗保持原有的随机性,战斗初始时的随机种子不能是常数,用当前系统时间或者直接random出一个数来做种子都可以。

最后就剩下记录键盘输入了。非常幸运的是,貌似LUA原版代码中所有等待键盘输入的地方都通过WaitKey这个函数实现的。这样解决方法就很简单了,只要在WaitKey中把所有收到的键盘输入全部存在一个全局表里,然后在战斗回放时按顺序读出即可。

当然,为了获得更好的效果,还需要在边边角角的地方处理一下。比如在进入每一场战斗时询问玩家是否进入战斗回放模式;在回放时关闭delay延迟;在回放时始终显示人物头像和状态。

缺陷和后继工作
现在的方法最大的缺陷就是不能对连续进行的战斗进行回放,比如武林大会。我想解决方法也不是很难,只要允许在战斗之间存读档就可以了(貌似现在的苍炎就是这样的吧)。另外,我没有做战斗记录的文件转存,这只需要把记录随机种子和键盘输入序列的全局变量保存起来就可以了,再加上对应的游戏存档文件一起打包就ok了。最后可能就是怎么在半即时版本中使用这个方法了。原则上我觉得这个方法应该可以100%适用于半即时战斗,而且事实上半即时战斗更灵活多变,我猜回放效果应该比回合制战斗要好。问题只是貌似苍炎这种主流半即时版本都不公开源码而已。

后记
这是我第一次接触LUA,只能边摸索边实现。虽然实际代码量只有几十行而已,却花了好几个小时才搞出来。不过看着徐小侠和周伯通绕着圈子互殴,感觉还挺有意思。说起来当年金庸群侠传我在中学时玩了十多遍,却是直到最近一个月才知道居然有这么一群爱好者多年来一直在持续改进这个古老的游戏。与其说玩家自己制作的mod好玩,还不如说这些制作mod的玩家本身更令人振奋啊。我想,考虑到国内外多如牛毛的游戏公司,游戏mod开发的绝对难度并不算特别大,但可贵之处在于大家仅仅是出于兴趣和有限的时间精力就聚集在这里,最终做出如此多高质量的mod来,还有这个活跃的论坛,实在令人赞叹。

最后提一下,我附件中的lua文件应该可以直接覆盖运行(基于论坛下载的lua版苍龙)。里面除了实现战斗回放的功能以外,还有4个bug的修改。其中”闯王宝藏不能出来“,”田伯光没有狂风刀法“,以及”胡斐练不了胡家刀法“这三个bug是完全按照027之前的帖子http://www.txdx.net/thread-441267-1-1.html改的。

第4个bug是关于战斗时的等待命令的。因为在网上找不到比较好的解决方法,只好自己动手改掉了。我看貌似最近有人也在发帖问怎么解决这个问题,这里就一并提一下。问题有两个,一是一旦等待之后人物行动顺序就不能再变回来了,这个显然是因为原版忘了在每次回合开始时对人物按轻功重排一次序;另一个问题是等待之后人物出招动画就出现错乱,这个经调查是因为,所有参战人物的个人数据都存放在一个叫WAR.Person的数组里,而他们的出招动画却单独存放在另一个数组里。战斗初始化时,同一个人物的个人数据和出招动画都对应到相同的数组下标。当等待发生后,人物个人数据在Person数组中的位置发生了改变,而出招动画数组却并没有随之变动,因此出招动画自然就乱套了。举例说,假设徐小侠和周伯通单挑,一开始时内存状态是这样的
    下标                :         0             ,          1
    Person数组      :    0 (徐小侠)     ,       64(周伯通)
    出招动画数组   : 徐小侠的动画    ,    周伯通的动画
徐小侠执行等待之后,内存状态就变成了下面这样。
    下标               :         0             ,           1
    Person数组     :    64(周伯通)     ,       0 (徐小侠)   
    出招动画数组  : 徐小侠的动画    ,    周伯通的动画
因此,接下来周伯通的回合打出来的出招动画就变成了徐小侠的,反之亦然。明白问题所在之后,修改方法就很简单了。我是选择在Person数组里直接加一个字段记录每个人物的初始下标,之后始终按照这个下标来决定出招动画就可以了。简单测试了一下现在等待命令应该没什么问题了。


2012/4/15 更新:基于上述方法的战斗回放功能已经在苍炎开源版中实现,详见http://www.txdx.net/forum.php?mod=viewthread&tid=543491&fromuid=431088






本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?我要成为铁血侠客

x

评分

参与人数 1声望 +15 收起 理由
jy02785317 + 15 原创精品

查看全部评分

【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2011-10-15 08:15 | 显示全部楼层
有考虑导入导出的功能吗
把战斗id,战场出场的人物属性,随机数种子,按键等,后保存成文件
别人也能读取
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
 楼主| 发表于 2011-10-15 14:02 | 显示全部楼层
回复 jy02785317 的帖子

导入导出在“缺陷和后继工作”这节里提到了:
“我没有做战斗记录的文件转存,这只需要把记录随机种子和键盘输入序列的全局变量保存起来就可以了,再加上对应的游戏存档文件一起打包就ok了。”

没做的原因有两个。

一是我对LUA不太懂,文件I/O之类的操作就都没碰。但是原理上只需要保存随机种子和键盘输入序列就可以了。战斗id和人物属性等等诸多繁杂数据都是天然就保存在游戏存档里的,不需要额外保存。

二是我手里的苍龙版本很老(就是从论坛直接下载的lua原版),而我本意是希望把回放功能做到更新更火的版本上的,(我猜想半即时战斗的录像效果比回合制的要更好)。无奈新版本的lua都是加密的,没法修改,因此只好随便在老版本上试试,验证一下想法而已... (另外,不知道027大人能不能促进lua开源进程,愚以为对整个金群mod界功德无量啊,呵呵

补充计算一下导出文件之后大小:
现有的键盘输入会deley20毫秒,因此一秒钟最多产生50个键盘输入。这么算来,即使是在一场战斗中持续疯狂敲打键盘30分钟,输入的键盘输入也不会超过1,000,000个。按一个键盘输入1字节计算,整个战斗记录不会超过1MB,再加上游戏存档本身,大概不会超过10MB。但是,因为这两个文件内信息冗余其实很大,实际压缩之后的zip包会远小于10MB。比如我手里的s1.grp文件5MB,压缩之后之后只有147KB,而且可以想见键盘输入序列中的冗余度只会更大。

点评

现在天赋称号的lua开不开源影响不大了吧,毕竟通用性不强。  发表于 2011-10-21 09:36
苍半源码已发。OL开发中,以后再说。  发表于 2011-10-15 14:16

评分

参与人数 1声望 +15 收起 理由
jy02785317 + 15 补充1楼加分

查看全部评分

【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2011-10-15 14:12 | 显示全部楼层
我的想法是直接记录什么人,什么属性,做了什么动作,造成什么效果
直接保存动作和结果,回放时不要再运算了
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
 楼主| 发表于 2011-10-15 14:17 | 显示全部楼层
那样实现起来很麻烦吧,怎么记录先不说,还得另做一套回放机制。直接利用现有系统做数据保存和回放引擎,这样有什么缺点吗?
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2011-10-15 18:00 | 显示全部楼层
行动,结果都记录到数组,然后导出到文件,需要时再读取就好了吧~
嫌文件太大,再加个压缩文件的脚本好了
读档?
什么东西?

点评

“存读档”就是“存档和读档”的意思...  发表于 2011-11-18 02:43
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2011-10-15 19:00 | 显示全部楼层

很不错的东西!

类似星际1刚做录像的情况。。如果有回放功能,确实是MOD的一个大突破啊。。

实现应该是没问题的,把按键之类的及对战的人物当时的状况记录下,只要按原来的设定和状况进入战斗感觉就行了。。
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2011-10-15 23:20 | 显示全部楼层
方法不错,用这种方法,在delphi 上实现这种功能回放,代码量也不大。
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2011-10-20 20:54 | 显示全部楼层
这个我本来就有提过,如果真能做到,我会很感动的。
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2011-10-20 22:00 | 显示全部楼层
贴图,坐标x,y,播放动画,损伤性质,损伤数值
貌似这个数组不大吧。。
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
 楼主| 发表于 2011-10-20 23:20 | 显示全部楼层
回复 iamjames 的帖子

你是说回放功能吗?附件里有实现好的.lua,下下来试试啊
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2011-11-18 10:37 | 显示全部楼层
想法不错啊,越来越完善了
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2012-4-5 14:18 | 显示全部楼层
终于找到修改这bua的帖子了,谢谢!!!
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。

本版积分规则

小黑屋|手机版|铁血丹心

GMT+8, 2024-11-15 11:48

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表