用户:Kengxxiao/游戏数据基础:修订间差异

来自PRTS
跳到导航 跳到搜索
无编辑摘要
无编辑摘要
第1行: 第1行:
==属性==
<!--==行为节点==
游戏战斗内的所有'''实体'''单位都拥有属性。<br>
行为节点(Action Node)是游戏战斗系统的核心机制。<br>
部分'''属性'''与'''基本公式'''相关测试见[https://nga.178.com/read.php?tid=21829497 NGA:从源头解析单位数值运算方式与运算公式]。
它最终被用来完成与战斗实体相关的所有操作。<br>
===属性定义===
截至本条目最后一次修改,游戏内共有'''111'''种行为节点。
====基本属性====
===执行条件===
*指单位某个属性的基本属性,一般指由数据文件直接定义的属性的基本数值。
执行条件(Execute Condition)是用来判断当前将要执行的节点是否可以执行,分为三种情况:
====基础数值====
*指经过'''属性计算器'''和'''符文'''运算后获得的数值。关于这两项的具体实现,见下方对应小节。
====属性修饰器====
*从源实体获得基本属性(fetchBaseValueFromSourceEntity)
**一种特殊的属性修饰方式,使用该种修饰方式时,对应的属性修饰器将被重写。
**有使用该种方式的实体:[[空]]
{|class="wikitable" style="width:600px; display:table; text-align:center; white-space:normal;"
{|class="wikitable" style="width:600px; display:table; text-align:center; white-space:normal;"
!原计算方式
!代码
!重写后计算方式
!解释
!重写后数值
!数值
|-
|-
|直接加算/最终加算||不变||源实体的对应属性数值 + 修饰器数值
|ALWAYS||总是||0
|-
|-
|直接乘算||直接加算||源实体的对应属性数值 * 修饰器数值
|PREVIOUS_SUCCEED||上一个节点执行成功时||1
|-
|-
|最终乘算||最终加算||源实体的对应属性数值 * 修正<ref group="解释">见下方'''最终乘算'''部分解释2。</ref>后修饰器数值
|PREVIOUS_FAILED||上一个节点执行失败时||2
|}
|}
<references group="解释" />
===源头===
 
每个行为节点都只允许被指定的源头(Source Type)来触发自身,预定义的源头共有3个类型和一个集合类型。
===属性基本公式===
{|class="wikitable" style="width:600px; display:table; text-align:center; white-space:normal;"
*属性变化共有四种计算方式:
!代码
**直接加算:直接对基础数值进行加算。
!解释
**直接乘算:对'''直接加算'''完成后对结果进行乘算。
!数值
**最终加算:对'''直接加算'''和'''直接乘算'''完成后的结果进行加算。
**最终乘算:对其余三种计算方式完成后的结果进行乘算。
*属性变化叠加:除'''最终乘算'''为变化数值之间相乘外,其余均为相加。因此,属性变化叠加结果的计算公式为:
**直接加算结果 = 直接加算A + 直接加算B + ...
**直接乘算结果 = 直接乘算A + 直接乘算B + ...<ref group="解释">当结果小于0时,自动补正为0。</ref>
**最终加算结果 = 最终加算A + 最终加算B + ...
**最终乘算结果 = 最终乘算A * 最终乘算B * ...<ref group="解释">当组成结果的任意一项小于0时,自动将其补正为原数值+1。</ref>
*最终属性结果:指经过'''[[游戏数据基础#数值范围]]'''限制得到的属性结果。<ref group="解释">当结果小于其对应的数值范围下限时,取下限,反之亦同。</ref>
**最终属性结果 = ((基础数值 + 直接加算结果) * (1 + 直接乘算结果) + 最终加算结果) * 最终乘算结果
<references group="解释" />
 
===属性计算器===
*属性计算器用来进行第一阶段的基础数值运算。<br>
*属性计算器只涉及干员的属性,其他非干员单位将不会进行此阶段运算。<br>
*影响属性计算器运算结果的因素有:'''精英化阶段、等级、潜能等级和信赖值'''。<br>
属性计算器的具体运算步骤为:
:1.根据'''精英化阶段'''和'''等级'''两个属性计算出第二步运算所需的的属性数值。<br>
:2.通过[[游戏数据基础#干员信赖|信赖表格]]获得信赖值所对应的信赖等级,按照该干员定义的信赖加成数值和上一步运算的结果,计算出第三步运算所需的属性数值。<br>
:3.将第二步运算的结果作为属性数值代入'''属性基本公式''',附加上潜能给予的属性(通常为直接加算),得到干员的基础属性(即干员资料页中显示的属性数值)。
 
===符文===
符文是一类特殊加成的统称,通常使用于地图额外数据中,如突袭BUFF和危机合约。<br>
符文运算基于预先定义的值来修改游戏数据,可以用于修改地图设置、地图属性、干员属性、敌人属性以及游戏内地图上的方格。<br>
 
符文属性运算使用的基础值来自于'''属性计算器'''的运算结果(干员)或基本属性(干员以外的其他单位),下文公式中的'''基础值'''均指该数值。<br>
因为符文本身并不只是用来计算属性,所以不适用'''属性基本公式'''。<br>
 
符文属性运算过程中有加算与乘算两种计算方法,并且加算的优先级高于乘算,具体运算方法如下:<br>
*当多种同计算方式数值叠加时,叠加结果为:
**符文加算结果 = 加算A + 加算B + ...
**符文乘算结果 = 乘算A * 乘算B * ...
*所以符文属性运算的最终结果为:<br>
**基础数值 = ('''基础值''' + 符文加算结果) * 符文乘算结果
 
===例子===
{{:游戏数据基础/属性计算例子}}
 
==伤害类型==
游戏中共有'''4'''种伤害类型。
===基本伤害类型===
*物理伤害:指伤害类型为'''PHYSICAL'''的伤害。
*法术伤害:指伤害类型为'''MAGICAL'''的伤害。
*真实伤害:指伤害类型为'''PURE'''的伤害。
*治疗:一种可以治疗目标的特殊的“伤害”,指伤害类型为'''HEAL'''的伤害。
===伤害类型掩码===
游戏中目前已经使用的共有'''7'''种伤害类型掩码。<br>
目前被用于该计算的伤害类型的最大位长度为5,已确定的位数为4位,剩余位置尚未确定用途<ref group="什么是位?">指在二进制中,每个二进制数0或1都是一个位。</ref>。
*第一位:未知
*第二位:物理伤害
*第三位:法术伤害
*第四位:真实伤害
*第五位:治疗
<references group="什么是位?" />
====已知的掩码====
*物理伤害(PHYSICAL),内部数值为00010=2。
*法术伤害(MAGICAL),内部数值为00100=4。
*真实伤害(PURE),内部数值为01000=8。
*治疗(HEAL),内部数值为10000=16。
*任意攻击(ANY_ATTACK),内部数值为01110=14。
*任意治疗(ANY_HEAL),内部数值为10000=16。
*除真实伤害外的任意伤害(ANY_ATTACK_EXCEPT_PURE),内部数值为00110=6<ref group="解释">由此可见,该掩码的同时对应了'''物理伤害'''(00010&00110=1)和'''法术伤害'''(00100&00110=1),因此同时对两种伤害生效但不对'''真实伤害'''(01000&00110=0)生效。该解释中的&为按位与符号。</ref>。
<references group="解释" />
====用途====
伤害类型掩码被用于确定某操作所针对的伤害类型。<br>
以下内容可能涉及客户端内部实现的讲解,如不需查询该部分可以直接跳过此节。<br>
以下内容中提到的内容均以简体中文版客户端'''0.9.01'''版本为基础,'''仅供参考,可能会与现在版本的客户端有出入'''。
{{Hide|标题=用途分析|内容=<nowiki/>
*'''闪避''':闪避由Nodes.Evade类型的Node处理。游戏中共预设了'''5'''种闪避BUFF模板,分别为evade, evade_magic, evade_physical, evade_physical_melee, evade_ranged。<br>其中evade的伤害类型掩码为ANY_ATTACK_EXCEPT_PURE,代表该闪避只能闪避除真实伤害以外的伤害。<br>'''[[红]]'''的技能1使用了该模板,因此她可以同时闪避物理和法术伤害,但不能闪避真实伤害。
*'''反伤''':反伤由Nodes.InverseDamage类型的Node处理。游戏中只有'''2'''种反伤BUFF模板。分别为inverse_damage, inverse_damage[magic]。<br>其中inverse_damage的伤害类型为PHYSICAL,代表其反弹伤害为物理伤害。<br>'''[[星熊]]'''的技能2使用了该模板,因此她的反弹伤害本质上是一次对攻击者的'''攻击力倍率'''为反伤倍率的物理伤害。<br>Nodes.InverseDamage可以在携带者被任意类型伤害攻击时触发,但反伤的对象被设置了阵营掩码以确定是否继续进行反伤计算。<br>inverse_damage中的阵营掩码为ENEMY,因此'''[[星熊]]'''的技能2不会对队友生效。
*'''抵挡''':抵挡由Nodes.BlockDamage类型的Node处理。游戏中共有'''2'''种抵挡BUFF模板。分别为damage_block, damage_block_once。<br>其中damage_block的filterDamageType被设置为false,表示其关闭了伤害类型过滤器,不限制伤害类型。<br>'''[[星熊]]'''的天赋使用了该模板,因此她可以抵挡所有伤害。}}
 
==基本公式==
*所有的伤害和增减益数值计算都应归结为属性间计算。
*基本公式指以'''属性'''为核心直接运算出结果的公式。
*以下所有公式中涉及到的'''属性'''均被加粗且应使用[[游戏数据基础#属性]]中完成计算后得到的数值。
*'''MAX'''为取最大值函数<ref group="Mathf.Max">见[https://github.com/Unity-Technologies/UnityCsReference/blob/master/Runtime/Export/Math/Mathf.cs#L90 MAX函数实现]</ref>;'''CLAMP'''为区间限定函数<ref group="Mathf.Clamp">见[https://github.com/Unity-Technologies/UnityCsReference/blob/master/Runtime/Export/Math/Mathf.cs#L180 CLAMP函数实现]</ref>。
 
<references group="Mathf.Max"/>
<references group="Mathf.Clamp"/>
===倍率===
倍率是一个可能被技能等外部因素影响的变量,初始值为1.0。
====攻击力倍率====
注意:'''攻击力倍率'''本身不是'''属性'''。
{{单等级技能|技能名=碎颅击|技能类型1=自动回复|技能类型2=手动触发|描述=攻击间隔{{color|#FF6237|增大(+1.0)}},攻击时攻击力提高至{{color|#0098DC|380%}}<ref group="解释">此时的'''攻击力倍率'''为380%。</ref>,并且有{{color|#0098DC|40%}}的概率击晕目标{{color|#0098DC|1.5}}秒|初始=25|消耗=30|持续=25}}
<references group="解释" />
 
====伤害倍率====
大多数的易伤BUFF都属于该类型。<br>
伤害倍率只能对其对应的伤害类型生效。<br>
注意:'''伤害倍率'''本身不是'''属性'''。<br>
{{单等级技能|技能名=钙质化|技能类型1=自动回复|技能类型2=手动触发|描述=附近所有友军每秒回复相当于塞雷娅攻击力{{color|#0098DC|35%}}的生命<br/>附近所有敌军受到的法术伤害{{color|#0098DC|+55%}}<ref group="解释">此时的'''法术伤害倍率'''为155%。此处官方使用了一个无用的假值来显示55%的数值,实际上为155%。</ref>,移动速度{{color|#0098DC|-60%}}|初始=70|消耗=80|持续=30}}
<references group="解释" />
 
====治疗倍率====
注意:'''治疗倍率'''本身不是'''属性'''。<br>
{{单等级技能|技能名=治愈之翼|技能类型1=自动回复|技能类型2=手动触发|描述=停止攻击,持续时间内回复总共{{color|#0098DC|16}}点部署费用,并每秒治疗周围一名友方单位相当于桃金娘攻击力{{color|#0098DC|50%}}<ref group="解释">此时的'''治疗倍率'''为50%。</ref>的生命|初始=10|消耗=24|持续=16}}
<references group="解释" />
<br>
当多个影响同种'''倍率'''的数值同时生效时,结果为:
*最终倍率 = 倍率1 * 倍率2 * ...
 
===伤害公式===
====物理伤害====
基本物理伤害 = MAX(0.05 * '''攻击力''' * 攻击力倍率, '''攻击力''' * 攻击力倍率 - (1- '''百分比无视防御''') * MAX(0, 目标的'''防御力结果''' - '''数值无视防御'''))
====法术伤害====
基本法术伤害 = MAX(0.05 * '''攻击力''' * 攻击力倍率, 0.01 * '''攻击力''' * 攻击力倍率 * (100 - (1- '''百分比无视法抗''') * 目标的'''法术抗性结果'''))<br>
====真实伤害====
基本真实伤害 = '''攻击力''' * 攻击力倍率
*最终伤害 = 基本伤害 * 该类型伤害对应的伤害倍率
====治疗====
治疗量 = '''攻击力''' * 治疗倍率<br>
※治疗量不受伤害倍率加成
 
===攻速公式===
'''实际攻击间隔''' = '''理论攻击间隔'''/(CLAMP( '''攻击速度''',10<ref group="解释">虽然基本下限为10,但'''攻击速度'''属性被限制了下限为20。见[[游戏数据基础#数值范围]]</ref>, 600)/100) <ref group="解释">CLAMP函数在此处表示若攻击速度在10-600之间,则输出攻击速度 ,否则输出两端的极值,小于10则输出10,大于600则输出600。</ref> <br>
每秒攻击次数 = 1/'''实际攻击间隔'''
<references group="解释" />
同时,如果不确定干员的'''理论攻击间隔''',除了查询数据外,还可根据干员页面的攻速显示来确定攻击间隔区间。
{|class="wikitable" style="width:400px; display:table; text-align:center; white-space:normal;"
!描述
!区间
|-
|-
|非常快||<0.8s
|FROM_BUFF||来自状态||1
|-
|-
|||0.8s-1.0s
|FROM_ABILITY||来自能力||2
|-
|-
|中等||1.0s-1.2s
|FROM_PROJECTILE||来自(?)||4
|-
|-
|较慢||1.2s-1.6s
|ALL||全部||7<ref group="解释">ALL = FROM_BUFF | FROM_ABILITY | FROM_PROJECTILE</ref>
|-
|||≥1.6s
|}
|}
<references group="解释" />
==状态==
在游戏里,所有实体都拥有一个'''状态容器'''(BuffContainer),用于存储其获得的状态。<br>
在状态容器中,已有的状态可以因为持续时间等多种因素被移除;同时,新的状态也会因为带有状态的天赋、技能等被触发而添加进来。
===状态模板===
状态模板(Buff Template)为游戏预定义的'''行为节点'''触发器。<br>
每个状态模板中都有若干组'''事件'''与'''行为节点集合'''对应的触发流程,在指定事件触发时,对应的行为节点按顺序执行,直到节点被依次执行完成或执行条件不符合时跳出。<br>
===重载===
调查中……
==能力==
TODO
==PROJECTILE==
调查中……
-->

2020年7月14日 (二) 03:17的版本