ofp吧 关注:17贴子:566
  • 0回复贴,共1

研究OFP内置脚本语言解决一个千古谜题

只看楼主收藏回复

利用了几天空闲时间研究了下OFP内置的的脚本语言,凭着学习过程中的一些领悟,明辨了一个千古谜题或大家曾经争论过的问题
今天这里抛砖引玉,利用OFP内置的脚本语言和我自己的思路剖析问题,希望能为各位学习的闪友有一些启发。
引用任务:《HAWK IN NETS》(黑寡妇)
下载地址:https://user.qzone.qq.com/758048929/blog/1333682083
曾经有闪友为这个任务争论不休,因击杀警卫后掩埋身体,身体消失后还会被警卫发现,有说问题来自游戏引擎本身,也有说仅为任务本身编辑不到位引起BUG,今天我结合代码来解析为什么游戏会出现这种问题。
首先我要说说这个任务里布防和触发警报的机制,比较有意思,这一点设置足以见到作者对OFP引擎的理解和巧妙的利用。作者把每一个守卫设置为两个状态一个是生,一个是死,不理解的可以看下下面这几张截图


每个守卫有自己对应的编号和自己的“死尸”编号,作者把这样的组合放进数组变成“守卫对”;再利用每个“守卫对”去调用一个名为alarm3.sqs的脚本

我们再去看看alarm3.sqs脚本里作者做了什么操作

_straz 代表生的守卫
_mrt 代表死的守卫

作者巧妙地利用了setdir 和 setpos这两条语句,每当玩家杀死一名守卫脚本就会把生的守卫和死的守卫进行了“调包”
与此同时作者为每个生的守卫调用一个alarm2.sqs的脚本

我们继续来看看alarm2.sqs脚本作者做了什么

没错作者就是利用了knowsAbout这条语句去判断守卫们有没发现身体mX的 如果返回的值大于0则表明发现了身体
OK到这里主要的代码就分析完毕了,我捋一遍作者设计的流程与思路
首先玩家只要击杀了守卫A,倒地的守卫A会被作者预先放值好死了的守卫A进行置换,因为没死的守卫都调用了alarm2.sqs这个脚本 所以只要任何守卫遇见死了的守卫身体就会触发“_straz knowsAbout mX”这条语句且语句返回的值只要大于0就会触发警报。
这样问题就已经找到了,我们只要测试下OFP引擎里knowsAbout这条语句的执行机制有没问题就OK了
打开编辑器放置三个士兵单位 一前一后 一个命名为solA 一个solB 一个为玩家


为自己添加一个名为myact菜单执行脚本mysqs.sqs,脚本内容很简单就是执行返回一条 solA knowsAbout solB (solA有没发现solB) 的数值


一开始是4

杀掉目标后依然是4

掩埋时数值开始下降

虽然身体消失但,但OFP引擎对于这样的状况是认定身体还没消失



直到阴影消失身体才被引擎认定为消失solA knowsAbout solB返回的值也等于零(solA没有发现solB)
有意思的是,即使不掩埋身体经过一段比较长的时间身体被发现的值也会为0 但setdammage后的单位数值会下降得更慢不得不佩服原作者的心思
因工作YQ前段时间重新系统地学习了c++ 也适逢接触OFP快20周年又是该死的情怀发作的时候了我次再打开了它
花了两天时间对他的脚本语言研究,才发现这脚本语言从某种程度来讲算是图灵完备的,不得不说作为一款20多年前的老游戏也有够强大的了,配合脚本他还有很多可能性
打算再春节空闲的时间看看有没机会对抵抗力量战役进行一些玩法上的强化,当然这也有可能成为有生之年系列。


IP属地:广东1楼2022-01-14 21:49回复