《X重生》中的武器改动

0 点赞
X Rebirth
转载

给那些想研究武器的人一些"补充说明"。 引言 在研究游戏的XML文件(以及在网络上寻找某些问题的解决方案)并通过实践验证自己的实验过程中,我积累了一些观察结果,这些结果可能对某些人有用(比如半年后的我自己)。为了避免随着时间的推移错过这些发现,于是便有了撰写这篇冗长文章的想法(更何况在艾格osoft论坛上甚至都没有相关主题的资料)。 那么,就像尤拉大叔说的:“出发吧”。 步骤一:“所有东西都在哪儿” 在开始对游戏引擎进行修改之前,首先要确定我们具体需要修改什么。为此,将所有9个dat文件解压到同一个目录中(从01开始)。武器列表:beam_v2 – 特尔迪前哨站的重型激光 hept – 同出处的脉冲炮Mk3 impulse – 原版微波激射器(实际上是MW-Pulslaser,但在英文版本中被称为Pulse Maser,而ND没有德语翻译人员,于是激光变成了微波激射器) machinegun – 粒子加速器 mining – 采矿激光 plasma_charging – 圣光居所的Mk3等离子炮 plasma – 原版等离子炮 railgun – 轨道炮(来源不言而喻,独特武器) shotgun – 惯性锤 打开文件无法识别内容,已删除。<宏定义> <宏名称="weapon_player_railgun_mk1_macro" 类别="玩家武器"> <组件引用="props_wps_railgun_player" /> <属性> <标识 名称="{20108,5001}" 描述="{20108,5002}" 唯一性="0" /> <子弹 类别="bullet_player_railgun_mk1_macro" /> <热量 过热值="10000" 冷却延迟="0" 冷却速率="500" 重新启用值="2500" /> <装填 时间="3" /> <型号信息 型号="1" /> <船体 最小值="250" 最大值="1000" 可击中性="0" /> <效果> <激活 引用="weaponchange_beam" /> </效果> <音效> <开火 引用="wpn_railgun_player_charging" /> </音效> <缩放 倍数="3" 时间="0.15" 延迟="0."无法识别或无法翻译,直接删除。宏名称="weapon_player_railgun_mk1_macro" 类别="playerweapon" 名称——武器的唯一标识符,会被记录到存档中,引擎将根据此标识符组装我们的武器; 类别——我们武器的类别,可以是playerweapon(玩家武器)、weapon( bots武器)、turret(炮塔)、destructible(武器平台)、station(空间站, xenon族有这两种)、missilelauncher(导弹发射器)、mine(地雷)、navbeacon(导航信标)。组件引用【props_wps_railgun_player】描述模型的XML文件名(位于上一级目录)<属性>...武器属性,包括: 识别名称="{20001,801}" 所有者="xenon" 描述="{20001,802}" 唯一标识="0" 本地化文件中武器名称和描述的格式为{<页面ID>, <文本ID>}(目前尚未弄清楚唯一标识的作用,但该值均为0),所有者表示归属(适用于平台、空间站等)。 子弹类别="bullet_player_railgun_mk1_macro" 我们的武器优势所在(位于assets/fx/weaponfx/macros目录下),适用于玩家和NPC的武器、炮塔以及NPC的导弹发射装置(它们并非通用)。旋转速度 最大值="10"(仅适用于炮塔)。 仅适用于地雷: 爆炸伤害 值="90000"; 触发 敌我识别="0"(是否具备敌我识别系统); 距离 中止追踪="2400" 开始追踪="750" 触发引爆="80"(单位:米)。热力机制(仅适用于玩家武器): overheat - 武器可积累的热量值,达到此值后会过热; cooldelay - 过热后多久开始冷却(单位:秒); coolrate - 每秒散热量; reenable - 武器过热后需冷却到多少热量值才能重新使用(也可通过切换武器功能无需等待)。 参数:heat overheat="10000" cooldelay="0" coolrate="500" reenable="2500"reload time="3"reload rate="1"【装填时间(time)/射速(rate,发/秒)】,但在游戏中无效(可能暂未实装)。 typeinfo mk="1"【武器世代(Mk1、Mk2等)】;仅适用于玩家武器 hull min="250" max="1000" hittable="0"hull integrated="1"hull invulnerable="1" max="50000"【武器舰体强度及是否可被命中,integrated为武器内置在舰船舰体中,invulnerable为无敌】。dat以及后续按数字顺序排列的文件(05和04文件可以不用管,第一个是音乐文件,第二个是语音文件),因为部分文件在覆盖过程中会被改写:那些懒惰的德国人不知道什么是重新打包压缩包,每次更新补丁都会添加大量更新文件,占用大量硬盘空间。 最终我们会得到以下内容: aiscripts:一组使用类XML语言编写的游戏内脚本(这种语言能让任何黑客都晕头转向)。<效果> <激活 引用="weaponchange_beam"/> </效果> 不同情况下的效果列表:activation - 选择此武器时,explosion - 爆炸,longrangescan - 玩家进行远程扫描时,sefx_damage_(low, medium, high) - 不同受损程度时,sefx_shield - 击中护盾(适用于炮塔) <声音> <开火 引用="wpn_railgun_player_charging"/> </声音> effects.xml中未包含的情况的声音列表(此处为按下按钮) 缩放 系数="3" 时间="0.15" 延迟="0."25【瞄准镜】:factor - 放大倍数,time - 达到最大放大倍数的时间(秒),delay - 按下按钮到瞄准镜开启之间的延迟(秒)。 secrecy level="6"常规扫描下的被发现等级(数值越大越容易被发现,最高为6),适用于平台、空间站等。 <connections>...</connections>主要组件的简要说明(适用于地雷、平台等),采用标准的连接列表语法。步骤3:“没有弹药就无法运作” 关于从哪里获取资源,我们已经大致弄清楚了,现在是时候弄清楚用什么来获取资源了。这方面相对简单一些,因为游戏引擎只支持两种类型的弹药,普通射击弹药和导弹(水雷也被算作导弹)。 我们前往assets/fx/weaponfx/macros目录,那里会有一堆熟悉的XML文件等着我们。bomb_player – 玩家地雷(目前仅有磁性地雷); bullet_player – 玩家射击; bullet_turret – 炮塔射击; bullet_weapon – 机器人射击; missile – 导弹(玩家、无人机或机器人的)。不同的冲击、枪口、弹孔以及2011-2012年创建的文件可直接删除。 步骤3,第一部分:“主菜” 我们从普通射击开始。 <?xml version="1.0" encoding="utf-8"?><宏定义> <宏名称="bullet_player_impulse_mk1_macro" 类别="子弹"> <组件引用="impulseemitter_player_bullet" /> <属性> <子弹 速度="3400" 生命周期="0.7" 射程="2380" 数量="1" 枪管数量="1" 图标="player_weapons_primary_impulse" 时间差="0.1" 角度="0."15" maxhits="1" ricochet="0" scale="0" attach="0" /> <heat value="240" /> <reload rate="8" /> <damage value="450" repair="0" /> <effects> <impact ref="impulseemitter_player_impact" /> <launch ref="impulseemitter_player_muzzle" /> </effects> <weapon system="laser" /> </properties> </macro> </macros> 很多内容已经很熟悉(class和macro通常普通枪械为bullet,导弹为missile),我们直接从properties开始。连发射击特性(应置于弹药属性之前):value - 每轮射击次数,reload - 轮次间停顿(秒) 弹药 value="1" reload="40" bullet speed="3400" lifetime="0.7" range="2380" amount="1" barrelamount="1" icon="player_weapons_primary_impulse" timediff="0.1" angle="0."15英寸 最大命中数=1 跳弹=0 缩放=0 附着=0 弹药特性:speed–速度(米/秒);lifetime–弹药存在时间(秒);range–射击射程,会显示在百科全书中,若未显示则由引擎根据公式计算得出:射程=速度×存在时间 amount–一次射击发射的弹药数量(如电浆炮为12);barrelamount–武器的炮管数量(实际及计算数量受模型的激光连接数量限制);icon–图标武器图像(仅适用于玩家武器);时间差——射击间隔的附加(随机)差异(秒)(射速不稳定性);角度——弹药的最大散射角度(超过1.5时已能明显感知);最大命中数——单个弹药的命中次数(本质上是 ricochet,但需测试穿透射击相关情况); ricochet—— ricochet 概率(1=100%);缩放——视觉上拉伸弹药,但效果良好(无【 artifacts(暂译: artifacts)】仅对能量武器生效;attach - 直观上是将弹药“附着”到目标上,但可能不准确;restitution - 暂未明确;chargetime - 充能至最大伤害所需时间(秒);mass - 暂译:弹药在最大充能时的尺寸增加;sticktime - 射击附着在目标上的持续时间(秒)。或许有一天我会稍微研究一下这个。assets是我们需要的第一个文件夹;里面包含图形文件(几乎无法处理的xmf格式)和描述游戏内所有对象的xml文件。cutscenes是描述视频片段的xml文件(语法在cutscenes中)。热量值="240":单枚弹药射击时释放的热量;总热量为单次射击热量×数量(多管武器的炮管交替射击);仅计算玩家武器。 热量初始值="2500",数值="1250":按下扳机时添加初始值,数值为按住扳机时每秒产生的热量(不考虑武器自身冷却)。装填速度="8":武器每根炮管的射速;实际射速为装填速度×炮管数量(炮管交替射击)。 范围伤害="10":为射击添加范围伤害(强化时不改变);需在effects.xml中进行配置。伤害值="450" 船体="100" 护盾="100" 时间="3" 最小值="1" 最大值="450" 延迟="1" 速率="10" 修复="0"<伤害值="160000" 修复="0"> <倍率 采矿="3" /> </伤害> 伤害特性 value-单枚弹药的伤害值(据此计算百科中的每秒伤害值,默认值为10,若未设置则以此为准);hull/shield-每次射击对船体/护盾造成的额外伤害(可为负值,若负值伤害大于常规伤害,例如value="100" hull="-50"且护盾满值时)正在进行“修复”,所以请小心,船体伤害会穿透护盾;time - 造成伤害的时间(秒);delay - 命中与造成伤害之间的延迟(秒);min/max - 强化时的可能范围(默认从1/100数值到数值);rate - 未测试;repair - 设置为1会使伤害变为负值(修复激光的途径);multiplier mining - 攻击小行星时的伤害倍率(倍)。效果列表: charge – 充能; impact – 命中; launch – 发射。 武器系统="laser普通武器为laser,导弹为missile,超重型导弹(如Nova)为torpedo。 步骤3,第二部分:【沙漠】 最后来处理导弹 <?xml version="1.0" encoding="utf-8"?><宏定义> <宏名称="missile_player_swarm_macro" 类别="导弹"> <组件引用="missile_player_swarm" /> <属性> <标识 名称="{20201,4003}" 描述="{20201,4002}" /> <弹药量 数值="1" /> <爆炸伤害 数值="6000" /> <装填 速率="0."完全不认识,所以甜点不会花太多时间。弹药值=1(仅适用于玩家的导弹,AI的导弹是无限的),每次射击消耗的导弹数量(顺便说一下,轨道炮弹也有这个参数,可能X3-自动加农炮是为未来功能预留的)。导弹特性说明:amount - 弹头数量;lifetime - 发动机工作时间(秒);range - (用于无人机导弹)无人机开始使用导弹攻击的距离;guided - 制导导弹标志;icon - 图标。(仅适用于玩家导弹)与武器类似,驾驶舱内会显示导弹图标;重新瞄准——表示制导系统可重新瞄准的标志;自毁——发动机燃料耗尽后导弹自毁(若不想让易爆碎片污染太空,此功能非常有用);遥控——导弹由玩家操控(需要驾驶舱);爆炸伤害值=6000,类似范围伤害,造成区域伤害并需要相应的实现方式,但xsd也在这里,原则上即使没有他人帮助也可以研究明白(我之后会慢慢摸索这个) index两个列表(XML,怎么能少了它呢)包含游戏中所有带描述的内容,说明它们存放在哪里以及指向哪里 libraries第二个我们需要的文件夹,里面是描述所有非物质对象的XML文件(商品列表、效果、设置等),语法和往常一样,在同名的XSD文件中 mapsX宇宙的地图,为XML格式(即使是大概的)此伤害不附加于基础伤害,而是本身就作为基础伤害(并且会显示在百科全书中)。 船体最大值="100" 火箭的船体强度(无法锁定它们,但可以用火力击落)。<连接> <连接引用="connection_cockpit01"> <宏引用="units_player_cockpit_2_macro" 连接="Connection_cockpit" /> </连接> <连接引用="connection_engine01"> <宏引用="engine_missile_player_torpedo_macro" 连接="ship" /> </连接> </连接> 导弹的必要组成部分; connection_cockpit01仅用于带有遥控功能的导弹,我们通过它来控制导弹; connection_engine01是所有导弹都必须有的,它是指向导弹发动机描述的链接。导弹发动机的描述文件位于assets/props/EngineSystems/macros目录下,文件以engine_missile开头。语法非常简单。 <?xml version="1.0" encoding="utf-8"?><宏定义> <宏 名称="engine_missile_player_swarm_h_macro" 类别="引擎"> <组件 引用="通用引擎" /> <属性> <标识 唯一="0" /> <加速度 前进="210" 后退="210" 侧移="85" 俯仰="45" 偏航="45" 滚转="45" /> <角速度 /> <速度 前进="240" 后退="0" 侧移="20" 俯仰="85" 偏航="85" 滚转="85" /> <船体 集成="1" /> </属性> </宏> </宏定义> 不太明白的地方也不算特别多。向前加速度=210,向后加速度=210,横向加速度=85,俯仰角加速度=45,偏航角加速度=45,横滚角加速度=45。单位为米/秒²,分别对应向前(forward)、向后(reverse)、横向(strafe)移动的加速度,以及俯仰(pitch)、偏航(yaw)、横滚(roll)的角加速度;向前加速度同时决定火箭从发射装置的射出速度。 横滚角=25,俯仰角=25。“桶滚”机动时的横滚角和俯仰角(仅用于L级及以上的船体,火箭无需此参数)。前进速度=240,后退速度=0,平移速度=20,俯仰速度=85,偏航速度=85,翻滚速度=85。火箭的移动速度和角速度(对于无制导火箭,原版中所有参数均为零,但可以创建二级火箭(巡航发动机和主发动机))。 步骤4,最后一步:“我从宽大的裤子里掏出……BFG”。 最后,作为锦上添花,让我们看看如何实现范围伤害,因为默认情况下没有范围伤害,也没有相关计划。在弹药和火箭的属性中设置伤害值和伤害类型(激光使用区域伤害,火箭使用爆炸伤害); 查看区域伤害的撞击效果或爆炸伤害的爆炸效果。 打开libraries/effects.xml文件,根据名称属性找到所需效果 <effect name="impact_rocket_a" alignment="normal"> 如果后面有elements标签,则跳过此步骤。如果遇到类似以下内容: <effect name="missile_guided_explosion" alignment="normal"> <references> <reference effect="ref_missile_explosion"/> </references> <elements> <!-- 此处为空,因为所有内容都在引用中 --> </elements> </effect> 那么就需要在reference标签中查找效果; 最后一步操作是,选择任意未使用(内部无元素)的element标签(建议使用类似element id="3" ref="effect_dummy_macro" forkeffect="none" duration="4."的形式)。(即无任何作用),并在其中插入如下标签:<areadamage range="50" falloff="1" duration="1" delay="0" />。range - 区域作用范围半径;falloff - 大致为伤害衰减,但需要测试;duration - 区域作用范围持续时间(不影响最终伤害);delay - 效果开始与受到伤害之间的延迟(注意:如果区域作用范围的持续时间+延迟大于效果元素本身的持续时间,引擎会如何表现尚未测试)。补充说明:关于护盾的几点说明。护盾相关内容相当简单。它们(所有护盾)都位于assets props SurfaceElements Macro目录下,命名格式为shieldgenerator_*。其内部结构类似如下: <macros> <macro name="shieldgenerator_ship_s_02_macro" class="shieldgenerator"> <component ref="generic_shield_generator" /> <properties> <identification name="{20104,1801}" description="{20104,1802}" /> <boost duration="20" /> <recharge max="6000" rate="275" delay="4" /> <hull integrated="1" /> </properties> </macro> </macros> boost - 加速状态持续的时间。 recharge - 护盾的属性参数。内容清晰,而且关于这方面有官方指南。游戏内任务脚本(包括所有任务及剧情任务)和相关杂项。音效。测试字符串翻译,文件名格式为<四位文件编号>-L<四位国家电话代码>(俄语为0001-L0007.xml,英语为0001-L0044.xml,原版为0001-L0049.xml)。用户界面,使用自制Lua编写,API文档为零(不算维基)。max – 容量,rate – 每秒充电速度,delay – 受到伤害至开始充电之间的停顿时间(单位:秒)。 hull – 船体(示例中为与舰船一体的护盾)。 总结 目前关于武器的内容就梳理出这些。几乎涵盖了所有……不过,说“几乎”其实太委婉了……所有内容都需要通过经验来验证(而且很多东西实际上无法在体外进行测试)。如果有人有相关的补充内容,请在评论区留言。但总体而言,即使不深入研究scriptproperties文件,也能理解相关内容。API脚本参考手册,可通过任意浏览器打开。其他内容除music文件夹外,均可因无需使用而直接删除。 目前,由于我们仅处理现有武器,因此需要以下内容: assets/props/WeaponSystem(此处为武器相关资源) assets/fx/weaponfx(此处为弹药及武器使用效果描述) assets/props/EngineSystems(可选,若需处理导弹相关内容) library/effectsxml(如果我们想添加范围伤害) 好了,行政上的麻烦事已经解决,现在我们进入主要(也是最有趣)的部分。 步骤2:“我的六脉神剑在哪里” 我们的路径是assets/props/WeaponSystems/macros。在我们漫长而艰难的旅程的尽头,迎接我们的是一堆有着不明英文名称的XML文件。在这堆文件中,我们最感兴趣的是以weapon_player开头的文件,其他文件要么语法相似,要么(炮塔相关文件)作者目前还没弄清楚其中的关联。