新增或增强的逻辑

此页面列出了 Phobos 新增的引擎功能或着重扩展的旧有逻辑。

新类型或游戏内实体

新的 AE 逻辑

  • 类似于 Ares 的 AttachEffect,但是有一些差异和新特性。最大的不同在于这里的 Attach Effect 是一个需要明确定义的新类型。

    • Duration 决定了 AE 的持续时长。它可以被科技类型和弹头上的 DurationOverrides 覆盖。

      • 如果 Duration.ApplyFirepowerMult 设为 true,那么持续时间会乘以调用者的火力加成倍率,前提是倍率非负。即无法通过负值火力加成倍率将持续时间降低至 0 以下。

      • 如果 Duration.ApplyArmorMultOnTarget 设为 true,那么持续时间会除以调用者的装甲加成倍率,前提是倍率非负。即无法通过负值装甲加成倍率将持续时间降至 0 以下。此处计算会考虑目标自身的 ArmorMultiplier 并忽略 ArmorMultiplier.Allow/DisallowWarheads

    • Cumulative 如果设为 true,那么允许在同一对象上多次赋予相同类型的 AE,上限取决于 Cumulative.MaxCount 的值,如果 Cumulative.MaxCount 是一个负数则没有上限。如果目标已经有了 Cumulative.MaxCount 个相同类型的 AE,那么再赋予同类 AE 将会刷新所剩持续时间最短的已有 AE 的剩余持续时间。

    • Powered 控制如果附加的对象罢工(PoweredUnit 或者正处于 EMP 中)或缺少电力支持时 AE 是否同样会进入非活动状态。动画的行为由 Animation.OfflineAction 控制。

    • DiscardOn 是一个控制什么情况下弃用该 AE 的条件列表。默认为 none 表示永远不会弃用。

      • entry:当进入运输工具或建筑等而从地图上消失时弃用。

      • move:当 AE 所附加的对象移动时弃用。如果对象是建筑则忽略。

      • stationary:当 AE 所附加的对象停止移动时弃用。如果对象是建筑则忽略。

      • drain:当对象受到一个带有 DrainWeapon=true 的武器影响时弃用。

      • inrange:当对象处于当前目标的武器射程内则弃用。距离可以通过 DiscardOn.RangeOverride 覆盖。

      • outofrange:当对象处于当前目标的武器射程外则弃用。距离可以通过 DiscardOn.RangeOverride 覆盖。

      • firing:当对象开火时弃用。这包括那些实际上并未开火的特殊武器,例如带有 Spawner=trueDrainWeapon=true 的武器。

    • DiscardOn.MoveBasedOnDestination 决定是否处于运动状态取决于是否拥有目的地。这会将悬浮在空中的 Jumpjet 单位视为移动,而正在转身但没有目的地的单位视为静止。

    • 如果 PenetratesIronCurtain 没有设为 true,AE 不会应用在当前被铁幕保护的对象上。

      • PenetratesForceShield 可以用于为处于力场护盾保护中的对象分离控制,默认为 PenetratesIronCurtain 的值。

    • 如果 AffectTypes 设为非空列表,则 AE 仅对列出的特定单位生效。若未设置或为空则不执行白名单过滤。此项检查具有最高优先级。

    • 如果 IgnoreTypes 设为非空列表,则 AE 不对列出的特定单位生效。若未设置或为空则不执行黑名单过滤。此项检查在 AffectTypes 之后执行。

    • 如果 AffectsTarget 设为非空列表,则 AE 仅可对特定大类目标生效(例如步兵、载具、战机、建筑)。此项检查在两个类型名单过滤之后执行。

    • Animation 定义一个只要 AE 所附加的对象处于活动状态就会一直循环播放的动画。

      • 如果 Animation.ResetOnReapply 设为 true,当 Cumulative=false 时再次赋予 AE 会重设动画。

      • Animation.OfflineAction 决定当 AE 所附加的对象处于非活动状态或电力不足时动画的行为。仅当 Powered=true 时有效。

      • Animation.TemporalAction 决定当 AE 所附加的对象被 Temporal=true 的弹头冻结时动画的行为。

      • Animation.UseInvokerAsOwner 可以设置创建该效果的所属方和科技类型(例如武器的发射者)为 AE 动画的所有者和调用者而不是 AE 所附加的对象。

      • Animation.HideIfAttachedWith 包含一个如果与此 AE 附加到同一个科技类型时会导致此 AE 动画隐藏的 AE 类型列表。

    • CumulativeAnimations 可用于声明一个在 Cumulative=true 类 AE 上替代 Animation 语句使用的动画列表。列表中的动画索引对应叠加的层数,如果层数超过列表中的动画数量则使用最后一个动画。此动画会在 AE 层数变化时更换成另一个对应层数的动画。注意由于 Cumulative.MaxCount 限制了可以叠加的 AE 类型数量,这可能导致某些情况下动画在 AE 过期之前闪现。

      • CumulativeAnimations.RestartOnChange 决定当 AE 层数改变时是否重设动画,如果为 false 则从上个动画相同长度的位置开始播放。例如使用两个图形相同但颜色不同的原版动画 [RING1][PDFXLOC] 那么默认层数变化时另一个动画从起始帧开始播放,而如果该句改为 false 那么视觉上将会表现为动画在层数改变时变成了另一种颜色继续播放。

    • AE 可以在自然结束/被移除/对象死亡时通过设置 ExpireWeapon 发射一个武器。

      • ExpireWeapon.TriggerOn 决定触发发射武器的条件,如果为 expire 则意味着只有当 AE 自然结束时才会触发。

      • ExpireWeapon.CumulativeOnlyOnce 如果设为 true,则 Cumulative=true 的 AE 只会整体触发一次,而不是每层 AE 都触发。在 removeexpire 条件下这会让它们只在最后一层 AE 自然结束或被移除后触发。

      • ExpireWeapon.UseInvokerAsOwner 可以设置创建该效果的所属方和科技类型(例如武器的发射者)为 ExpireWeapon 的所有者和调用者而不是 AE 所附加的对象。

    • Tint.ColorTint.Intensity 可用于设置一个染色效果和染色的光效强度。

      • Tint.VisibleToHouses 可用于控制哪些所属方可见这些染色效果。

    • FirepowerMultiplierArmorMultiplierSpeedMultiplierROFMultiplier 分别修改对象的火力、护甲强度、移动速度和武器装填速度。

      • ArmorMultiplier.AllowWarheadsArmorMultiplier.DisallowWarheads 可用于限制护甲倍率在哪些弹头造成杀伤时生效。

      • 如果 ROFMultiplier.ApplyOnCurrentTimer 设为 true,ROFMultiplier 会在 AE 首次赋予时就对当前正在使用的武器装填计时器生效而不是等到下一次。

    • 如果 Cloakable 设为 true,被附加 AE 的对象在 AE 生效期间获得隐形能力。

    • 如果 ForceDecloak 设为 true,被附加 AE 的对象在 AE 生效期间强制显形。

    • WeaponRange.MultiplierWeaponRange.ExtraRange 可分别用于乘算或加算(以单元格为单位)所附加对象的武器射程。ExtraRange 会在所有 AE 的 Multiplier 值叠加后叠加计算。

      • WeaponRange.AllowWeaponsWeaponRange.DisallowWeapons 分别设定哪些武器可以/不可以获得上述射程加成。

      • 对于拥有 OpenTopped=true 的科技类型,OpenTopped.UseTransportRangeModifiers 可以设为 true 以使载员同步获得运输工具所获得的射程加成。

    • Crit.MultiplierCrit.ExtraChance 可以分别乘算或加算 AE 所附加对象的暴击概率。

      • Crit.AllowWarheadsCrit.DisallowWarheads 可分别列出哪些弹头可以/不可以获得上述暴击概率加成。

    • RevengeWeapon 可用于通过 AE 为被附加对象设置一个临时的 复仇武器

      • RevengeWeapon.AffectsHouse 定义哪些所属方可以触发这个复仇武器。

      • RevengeWeapon.UseInvokerAsOwner 可以设置创建该效果的所属方和科技类型(例如武器的发射者)为 RevengeWeapon 的所有者和调用者而不是 AE 所附加的对象。

    • ReflectDamage 可设为 true 以使 AE 所附加对象所受的任何正值杀伤反弹回攻击者。ReflectDamage.Warhead 决定用于反弹伤害的弹头,默认读取自 [CombatDamage] -> C4Warhead。如果 ReflectDamage.Warhead.Detonate 设为 true 那么弹头可以完整的引爆而不仅仅用于造成杀伤。ReflectDamage.Chance 决定触发反弹的几率,ReflectDamage.Multiplier 是反弹回的伤害值相对于所接收的伤害值的倍率,而 ReflectDamage.Override 则定义反弹回了一个固定大小的伤害量。反弹效果不会被另一个反弹来的伤害所触发。

      • 可以将弹头的 SuppressReflectDamage 设为 true 来避免触发伤害反弹效果。SuppressReflectDamage.Types 可以控制哪些 AE 类型的反弹伤害效果会被抑制。如果留空则代表所有 AE 类型。SuppressReflectDamage.Groups 的作用与此相同,但用于所列分组名下的所有 AE 类型。

      • ReflectDamage.UseInvokerAsOwner 可以设置创建该效果的所属方和科技类型(例如武器的发射者)为 ReflectDamage 的所有者和调用者而不是 AE 所附加的对象。

    • DisableWeapons 可用于禁用 AE 附加对象的所有武器。

      • 在拥有 OpenTopped=true 的科技类型上,OpenTopped.CheckTransportDisableWeapons 可设为 true 以使载员在运输工具受 DisableWeapons 影响期间同步禁言效果。

    • Unkillable 可用于防止科技类型因受到伤害而死亡(最低为 1)。

    • 可以通过在 Groups 中定义字符串来为 AE 类型设置分组。

      • 组别可用于在移除 AE 和武器过滤时替代类型参与计算。

  • AE 可以通过 AttachEffect.AttachTypes 在科技类型上赋予。

    • AttachEffect.DurationOverrides 可用于覆盖 AE 自身所写的默认 Duration。该列表中的值与 AttachTypes 中的 AE 类型一一对应,如果一个 AE 类型没有对应的项目则使用该列表中的最后一个。

    • AttachEffect.Delays 可用于设置 AE 在科技类型上自然结束后重新创建所需的时间间隔。默认为 0(立即),负值表示 AE 不会被重新创建。该列表中的值与 AttachTypes 中的 AE 类型一一对应,如果一个 AE 类型没有对应的项目则使用该列表中的最后一个。

    • AttachEffect.InitialDelays 可用于设置 AE 在科技类型上首次创建所需的初始间隔。默认为 0(立即)。该列表中的值与 AttachTypes 中的 AE 类型一一对应,如果一个 AE 类型没有对应的项目则使用该列表中的最后一个。

    • AttachEffect.RecreationDelays 用于决定如果 AE 被完全移除(例如使用 AttachEffect.RemoveTypes)是否可以重新创建 AE,如果可以则这里设置了重新创建所需的时间间隔。默认为 -1 表示不允许重新创建。该列表中的值与 AttachTypes 中的 AE 类型一一对应,如果一个 AE 类型没有对应的项目则使用该列表中的最后一个。

      • 需要注意的是 InitialDelaysRecreationDelays 在由于 DiscardOn 导致 AE 当前不生效的情况下都不会进行计时。

  • AE 可以通过 AttachEffect.AttachTypes 被弹头上赋予给其他对象。

    • AttachEffect.DurationOverrides 可用于覆盖 AE 自身所写的默认 Duration。该列表中的值与 AttachTypes 中的 AE 类型一一对应,如果一个 AE 类型没有对应的项目则使用该列表中的最后一个。

    • AttachEffect.CumulativeSourceMaxCount 可用于控制来自同一来源的 Cumulative=true 的 AE 可叠加的最大数量,如果 AttachEffect.CumulativeSourceMaxCount 是一个负数则没有上限。独立于 Cumulative.MaxCount 工作。如果目标已经有了 AttachEffect.CumulativeSourceMaxCount 个来自同一来源的、相同类型的 AE,那么再赋予同类 AE 将会刷新所剩持续时间最短的已有 AE 的剩余持续时间。

    • AttachEffect.CumulativeRefreshAll 如果设为 true 将尝试在 Cumulative=true 的 AE 赋予被到一个现有 AE 已达到 Cumulative.MaxCount 的目标时刷新该目标上所有同类 AE 的持续时间而不只是刷新所剩持续时间最短的那个。如果 AttachEffect.CumulativeRefreshAll.OnAttach 也设为 true,那么即使未达到 Cumulative.MaxCount 也使用此刷新效果。

    • AttachEffect.CumulativeRefreshSameSourceOnly 控制是否需要现有 AE 来自同一个发射者的同一个弹头才能达到使用上述刷新效果的条件。

    • AE 可以通过弹头上的 AttachEffect.RemoveTypesAttachEffect.RemoveGroups 移除。

      • AttachEffect.CumulativeRemoveMinCounts 设置了 Cumulative=true 类 AE 被 RemoveTypes/RemoveGroups 每次移除的最小数量。

      • AttachEffect.CumulativeRemoveMaxCounts 设置了 Cumulative=true 类 AE 被 RemoveTypes/RemoveGroups 一次移除的最大数量。

  • 武器可以根据目标上是否附加了特定的 AE 来决定是否(不)可以开火。

    • AttachEffect.RequiredTypes 可用设置一个对象可以作为武器目标所需要拥有的 AE 列表,当所有列出的 AE 类型全部拥有时才允许开火。

    • AttachEffect.DisallowedTypes 可用于设置一个对象作为武器目标所不得拥有的 AE 列表,当表中列出的 AE 任一类型存在时将阻止开火。

    • AttachEffect.Required/DisallowedGroups 与上面两句拥有相同的效果但使用 Groups 列表而不是 AE 类型列表。

    • AttachEffect.(Required|Disallowed)MinCounts & (Required|Disallowed)MaxCounts 可用于设置科技类型上必须存在/禁止存在的 Cumulative=true 类(对其他类型无效) AE 的最小/最大数量。

    • AttachEffect.IgnoreFromSameSource 可设为 true 以忽略由武器开火者及其弹头赋予的 AE 效果。

    • AttachEffect.CheckOnFirer 可设为 true 以将必须存在/禁止存在 AE 的检查对象更改为武器发射者而不是目标。

rulesmd.ini

[General]
DiscardOn.MoveBasedOnDestination=false             ; boolean

[AttachEffectTypes]
0=SOMEATTACHEFFECT

[SOMEATTACHEFFECT]                                 ; AttachEffectType
Duration=0                                         ; integer - game frames or negative value for indefinite duration
Duration.ApplyFirepowerMult=false                  ; boolean
Duration.ApplyArmorMultOnTarget=false              ; boolean
Cumulative=false                                   ; boolean
Cumulative.MaxCount=-1                             ; integer
Powered=false                                      ; boolean
DiscardOn=none                                     ; List of discard condition enumeration (none|entry|move|stationary|drain|inrange|outofrange)
DiscardOn.RangeOverride=                           ; floating point value, distance in cells
DiscardOn.MoveBasedOnDestination=                  ; boolean, default to [General] -> DiscardOn.MoveBasedOnDestination
PenetratesIronCurtain=false                        ; boolean
PenetratesForceShield=                             ; boolean
AffectTypes=                                       ; List of TechnoTypes
IgnoreTypes=                                       ; List of TechnoTypes
AffectsTarget=all                                  ; List of TechnoType Enumeration (none|infantry|units|aircraft|buildings|all)
Animation=                                         ; AnimationType
Animation.ResetOnReapply=false                     ; boolean
Animation.OfflineAction=Hides                      ; AttachedAnimFlag (None, Hides, Temporal, Paused or PausedTemporal)
Animation.TemporalAction=None                      ; AttachedAnimFlag (None, Hides, Temporal, Paused or PausedTemporal)
Animation.UseInvokerAsOwner=false                  ; boolean
Animation.HideIfAttachedWith=                      ; List of AttachEffectTypes
CumulativeAnimations=                              ; List of AnimationTypes
CumulativeAnimations.RestartOnChange=true          ; boolean
ExpireWeapon=                                      ; WeaponType
ExpireWeapon.TriggerOn=expire                      ; List of expire weapon trigger condition enumeration (none|expire|remove|death|discard|all)
ExpireWeapon.CumulativeOnlyOnce=false              ; boolean
ExpireWeapon.UseInvokerAsOwner=false               ; boolean
Tint.Color=                                        ; integer - Red,Green,Blue
Tint.Intensity=                                    ; floating point value
Tint.VisibleToHouses=all                           ; List of Affected House Enumeration (none|owner/self|allies/ally|team|enemies/enemy|all)
FirepowerMultiplier=1.0                            ; floating point value
ArmorMultiplier=1.0                                ; floating point value
ArmorMultiplier.AllowWarheads=                     ; List of WarheadTypes
ArmorMultiplier.DisallowWarheads=                  ; List of WarheadTypes
SpeedMultiplier=1.0                                ; floating point value
ROFMultiplier=1.0                                  ; floating point value
ROFMultiplier.ApplyOnCurrentTimer=true             ; boolean
Cloakable=false                                    ; boolean
ForceDecloak=false                                 ; boolean
WeaponRange.Multiplier=1.0                         ; floating point value
WeaponRange.ExtraRange=0.0                         ; floating point value
WeaponRange.AllowWeapons=                          ; List of WeaponTypes
WeaponRange.DisallowWeapons=                       ; List of WeaponTypes
Crit.Multiplier=1.0                                ; floating point value
Crit.ExtraChance=0.0                               ; floating point value
Crit.AllowWarheads=                                ; List of WarheadTypes
Crit.DisallowWarheads=                             ; List of WarheadTypes
RevengeWeapon=                                     ; WeaponType
RevengeWeapon.AffectsHouse=all                     ; List of Affected House Enumeration (none|owner/self|allies/ally|team|enemies/enemy|all)
RevengeWeapon.UseInvokerAsOwner=false              ; boolean
ReflectDamage=false                                ; boolean
ReflectDamage.Warhead=                             ; WarheadType
ReflectDamage.Warhead.Detonate=false               ; WarheadType
ReflectDamage.Multiplier=1.0                       ; floating point value, percents or absolute
ReflectDamage.AffectsHouse=all                     ; List of Affected House Enumeration (none|owner/self|allies/ally|team|enemies/enemy|all)
ReflectDamage.Chance=1.0                           ; floating point value
ReflectDamage.Override=                            ; integer
ReflectDamage.UseInvokerAsOwner=false              ; boolean
DisableWeapons=false                               ; boolean
Unkillable=false                                   ; boolean
LaserTrail.Type=                                   ; LaserTrailType
Groups=                                            ; comma-separated list of strings (group IDs)

[SOMETECHNO]                                       ; TechnoType
AttachEffect.AttachTypes=                          ; List of AttachEffectTypes
AttachEffect.DurationOverrides=                    ; integer - duration overrides (comma-separated) for AttachTypes in order from first to last.
AttachEffect.Delays=                               ; integer - delays (comma-separated) for AttachTypes in order from first to last.
AttachEffect.InitialDelays=                        ; integer - initial delays (comma-separated) for AttachTypes in order from first to last.
AttachEffect.RecreationDelays=                     ; integer - recreation delays (comma-separated) for AttachTypes in order from first to last.
OpenTopped.UseTransportRangeModifiers=false        ; boolean
OpenTopped.CheckTransportDisableWeapons=false      ; boolean

[SOMEWEAPON]                                       ; WeaponType
AttachEffect.RequiredTypes=                        ; List of AttachEffectTypes
AttachEffect.DisallowedTypes=                      ; List of AttachEffectTypes
AttachEffect.RequiredGroups=                       ; comma-separated list of strings (group IDs)
AttachEffect.DisallowedGroups=                     ; comma-separated list of strings (group IDs)
AttachEffect.RequiredMinCounts=                    ; integer - minimum required instance count (comma-separated) for cumulative types in order from first to last.
AttachEffect.RequiredMaxCounts=                    ; integer - maximum required instance count (comma-separated) for cumulative types in order from first to last.
AttachEffect.DisallowedMinCounts=                  ; integer - minimum disallowed instance count (comma-separated) for cumulative types in order from first to last.
AttachEffect.DisallowedMaxCounts=                  ; integer - maximum disallowed instance count (comma-separated) for cumulative types in order from first to last.
AttachEffect.IgnoreFromSameSource=false            ; boolean
AttachEffect.CheckOnFirer=false                    ; boolean

[SOMEWARHEAD]                                      ; WarheadType
AttachEffect.AttachTypes=                          ; List of AttachEffectTypes
AttachEffect.CumulativeSourceMaxCount=-1           ; integer
AttachEffect.CumulativeRefreshAll=false            ; boolean
AttachEffect.CumulativeRefreshAll.OnAttach=false   ; boolean
AttachEffect.CumulativeRefreshSameSourceOnly=true  ; boolean
AttachEffect.RemoveTypes=                          ; List of AttachEffectTypes
AttachEffect.RemoveGroups=                         ; comma-separated list of strings (group IDs)
AttachEffect.CumulativeRemoveMinCounts=            ; integer - minimum required instance count (comma-separated) for cumulative types in order from first to last.
AttachEffect.CumulativeRemoveMaxCounts=            ; integer - maximum removed instance count (comma-separated) for cumulative types in order from first to last.
AttachEffect.DurationOverrides=                    ; integer - duration overrides (comma-separated) for AttachTypes in order from first to last.
SuppressReflectDamage=false                        ; boolean
SuppressReflectDamage.Types=                       ; List of AttachEffectTypes
SuppressReflectDamage.Groups=                      ; comma-separated list of strings (group IDs)

自定义辐射类型

图像 混合起来的多种辐射类型

  • 现在任何武器都可以拥有自定义的辐射类。有关辐射的更多详细信息请参见 此处

  • 所有辐射类型现在都有几个新的属性可用。

    • RadApplicationDelay.Building 可以设置为大于 0 的值以允许辐射对建筑造成伤害。单个辐射源可以对同一建筑(建筑所占的每个单元格都会受到该单元格上所有辐射源的伤害)造成这种伤害的次数可以通过 RadBuildingDamageMaxCount 来定义,负值表示无限制。

    • RadSiteWarhead.Detonate 可以使得 RadSiteWarhead 在被影响的对象上引爆而不单纯造成直接杀伤。这可以使大多数弹头效果、动画显示等生效。如果 RadSiteWarhead.Detonate.Full 设为 false 那么它只能对所在区域造成杀伤和 Phobos 所提供的弹头效果而不是完全引爆。

    • RadHasOwner 如果设为 true 则辐射造成的伤害会被视为由发射用于创建辐射区域的抛射体其开火者的所属方造成的。这意味着诸如 AffectsAllies 之类的弹头设置将可以使用,并且任何被击杀的单位都将计入该玩家的摧毁数。

    • RadHasInvoker 如果设为 true 则辐射造成的伤害会被视为由发射用于创建辐射区域的抛射体的科技类型(即 “调用者”)造成的。除 RadHasOwner 的效果外这还将使调用者从被辐射击杀的单位中获得经验。注意如果调用者在辐射生命周期中的任何时刻死亡那么它将继续变得如同没有调用者一样。

  • 默认情况下 UseGlobalRadApplicationDelay 被设为 true,这使得游戏始终使用 [Radiation] 中的 RadApplicationDelayRadApplicationDelay.Building 而不是特定辐射类型的。这是个性能优化措施,如果你需要给辐射类型使用不同的间隔那么应当禁用该设置。

rulesmd.ini

[RadiationTypes]
0=SOMERADTYPE

[Radiation]
UseGlobalRadApplicationDelay=true  ; boolean

[SOMEWEAPON]                       ; WeaponType
RadType=Radiation                  ; RadType to use instead of default of [Radiation]

[SOMERADTYPE]                      ; RadType
RadDurationMultiple=1              ; integer
RadApplicationDelay=16             ; integer
RadApplicationDelay.Building=0     ; integer
RadBuildingDamageMaxCount=-1       ; integer
RadLevelMax=500                    ; integer
RadLevelDelay=90                   ; integer
RadLightDelay=90                   ; integer
RadLevelFactor=0.2                 ; floating point value
RadLightFactor=0.1                 ; floating point value
RadTintFactor=1.0                  ; floating point value
RadColor=0,255,0                   ; integer - Red,Green,Blue
RadSiteWarhead=RadSite             ; WarheadType
RadSiteWarhead.Detonate=false      ; boolean
RadSiteWarhead.Detonate.Full=true  ; boolean
RadHasOwner=false                  ; boolean
RadHasInvoker=false                ; boolean

警告

出于性能方面的考虑,除非存在 RadApplicationDelay.Building 高于 0 的辐射类型否则与之相关的所有功能在游戏内都将被完全禁用。这在其最早的可用时机(地图初始场景启动结束或存档加载后)就会进行判定,并且 不会 随着后续场景的改变或存档的加载而更新。

激光尾焰

激光尾焰 东方崛起 中的激光尾焰应用实例

  • 科技类型、抛射体和 Voxel 碎片现在都可以拥有不同透明度、宽度和颜色的彩色尾焰,这些尾焰是通过激光绘制代码完成的。

  • 科技类型、抛射体和 Voxel 碎片可以拥有多个尾焰。对于科技类型的每个激光尾焰都可以自定义其相对于炮塔或车体的 FLH 偏移值。

  • 激光尾焰现在同样可以使用 EBolt 或 辐射波 特效。

artmd.ini

[LaserTrailTypes]
0=SOMETRAIL

[SOMETRAIL]                      ; LaserTrailType
DrawType=laser                   ; laser trail type (laser | ebolt | radbeam)
FadeDuration=                    ; integer, default to 64 for laser, 17 for ebolt, 15 for radbeam
SegmentLength=128                ; integer, minimal length of each trail segment
IgnoreVertical=false             ; boolean, whether the trail won't be drawn on vertical movement
CloakVisible=false               ; boolean, whether the laser is visible when the attached unit is cloaked
CloakVisible.DetectedOnly=false  ; boolean, whether CloakVisible=true laser is visible only to those who can detect the attached unit
; laser
Color=255,0,0                    ; integer - Red,Green,Blue
IsHouseColor=false               ; boolean
Thickness=4                      ; integer
IsIntense=false                  ; boolean, whether the laser is "supported" (AKA prism forwarding)
; ebolt
IsAlternateColor=false           ; boolean
Bolt.Color1=                     ; integer - Red,Green,Blue
Bolt.Disable1=false              ; boolean
Bolt.Color2=                     ; integer - Red,Green,Blue
Bolt.Disable2=false              ; boolean
Bolt.Color3=                     ; integer - Red,Green,Blue
Bolt.Disable3=false              ; boolean
Bolt.Arcs=8                      ; integer
Bolt.ZAdjust=0                   ; integer
; radbeam
Beam.Color=                      ; integer - Red,Green,Blue
Beam.Amplitude=40.0              ; floating point value

[SOMEPROJECTILE]                 ; Projectile Image
LaserTrail.Types=SOMETRAIL       ; List of LaserTrailTypes

[SOMETECHNO]                     ; TechnoType Image
LaserTrailN.Type=SOMETRAIL       ; LaserTrailType
LaserTrailN.FLH=0,0,0            ; integer - Forward,Lateral,Height
LaserTrailN.IsOnTurret=false     ; boolean, whether the trail origin is turret
; where N = 0, 1, 2, ...

rulesmd.ini

[SOMEVOXELANIM]                  ; VoxelAnim
LaserTrail.Types=SOMETRAIL       ; List of LaserTrailTypes

警告

激光尾焰非常占用资源!由于游戏不使用 GPU,大量尾焰即便在高性能设备上也会迅速降低 FPS。想要减少这种影响:

  • 不要在单位和抛射体上使用过多的激光尾焰;

  • 在确保在尾焰不会过于锯齿状的前提下使用尽量高的 SegmentLength 值;

  • 使用长度尽量短的激光尾焰,即设置一个较小的 FadeDuration 值。

护盾

图像 幻想奇遇 中拥有护盾的建筑、步兵和载具

rulesmd.ini

[CombatDamage]
ShieldApplyArmorMult=false                  ; boolean

[AudioVisual]
Shield.ConditionYellow=                     ; floating point value, percents or absolute
Shield.ConditionRed=                        ; floating point value, percents or absolute
Pips.Shield=-1,-1,-1                        ; integer, frames of pips.shp (zero-based) for Green, Yellow, Red
Pips.Shield.Building=-1,-1,-1               ; integer, frames of pips.shp (zero-based) for Green, Yellow, Red
Pips.Shield.Background=PIPBRD.SHP           ; filename - including the .shp/.pcx extension
Pips.Shield.Building.Empty=0                ; integer, frame of pips.shp (zero-based) for empty building pip

[ShieldTypes]
0=SOMESHIELDTYPE

[SOMESHIELDTYPE]                            ; ShieldType
Strength=0                                  ; integer
InitialStrength=0                           ; integer
ConditionYellow=                            ; floating point value, percents or absolute
ConditionRed=                               ; floating point value, percents or absolute
Armor=none                                  ; ArmorType
InheritArmorFromTechno=false                ; boolean
InheritArmor.Allowed=                       ; List of TechnoTypes
InheritArmor.Disallowed=                    ; List of TechnoTypes
ApplyArmorMult=                             ; boolean, default to [CombatDamage] -> ShieldApplyArmorMult
Powered=false                               ; boolean
AbsorbOverDamage=false                      ; boolean
SelfHealing=0.0                             ; floating point value, percents or absolute
SelfHealing.Rate=0.0                        ; floating point value, ingame minutes
SelfHealing.RestartInCombat=true            ; boolean
SelfHealing.RestartInCombatDelay=0          ; integer, game frames
SelfHealing.EnabledBy=                      ; List of BuildingTypes
Respawn=0.0                                 ; floating point value, percents or absolute
Respawn.Rate=0.0                            ; floating point value, ingame minutes
Respawn.RestartInCombat=true                ; boolean
Respawn.RestartInCombatDelay=0              ; integer, game frames
Respawn.Anim=                               ; List of AnimationTypes
Respawn.Weapon=                             ; WeaponType
BracketDelta=0                              ; integer - pixels
Pips=-1,-1,-1                               ; integer, frames of pips.shp (zero-based) for Green, Yellow, Red
Pips.Building=-1,-1,-1                      ; integer, frames of pips.shp (zero-based) for Green, Yellow, Red
Pips.Background=                            ; filename - including the .shp/.pcx extension
Pips.Building.Empty=                        ; integer, frame of pips.shp (zero-based) for empty building pip
Pips.HideIfNoStrength=false                 ; boolean
IdleAnim=                                   ; AnimationType
IdleAnim.ConditionYellow=                   ; AnimationType
IdleAnim.ConditionRed=                      ; AnimationType
IdleAnimDamaged=                            ; AnimationType
IdleAnimDamaged.ConditionYellow=            ; AnimationType
IdleAnimDamaged.ConditionRed=               ; AnimationType
IdleAnim.OfflineAction=Hides                ; AttachedAnimFlag (None, Hides, Temporal, Paused or PausedTemporal)
IdleAnim.TemporalAction=Hides               ; AttachedAnimFlag (None, Hides, Temporal, Paused or PausedTemporal)
BreakAnim=                                  ; List of AnimationTypes
HitAnim=                                    ; List of AnimationTypes
HitFlash=false                              ; boolean
HitFlash.FixedSize=                         ; integer
HitFlash.Red=true                           ; boolean
HitFlash.Green=true                         ; boolean
HitFlash.Blue=true                          ; boolean
HitFlash.Black=false                        ; boolean
BreakWeapon=                                ; WeaponType
AbsorbPercent=1.0                           ; floating point value
PassPercent=0.0                             ; floating point value
ReceivedDamage.Minimum=-2147483648          ; integer
ReceivedDamage.Maximum=2147483647           ; integer
AllowTransfer=                              ; boolean
ImmuneToBerserk=no                          ; boolean
ImmuneToCrit=no                             ; boolean
Tint.Color=                                 ; integer - Red,Green,Blue
Tint.Intensity=0.0                          ; floating point value
Tint.VisibleToHouses=all                    ; List of Affected House Enumeration (none|owner/self|allies/ally|team|enemies/enemy|all)

[SOMETECHNO]                                ; TechnoType
ShieldType=SOMESHIELDTYPE                   ; ShieldType; none by default

[SOMEWARHEAD]                               ; WarheadType
Shield.Penetrate=false                      ; boolean
Shield.Break=false                          ; boolean
Shield.BreakAnim=                           ; List of AnimationTypes
Shield.HitAnim=                             ; List of AnimationTypes
Shield.SkipHitAnim=false                    ; boolean
Shield.HitFlash=true                        ; boolean
Shield.BreakWeapon=                         ; WeaponType
Shield.AbsorbPercent=                       ; floating point value
Shield.PassPercent=                         ; floating point value
Shield.ReceivedDamage.Minimum=              ; integer
Shield.ReceivedDamage.Maximum=              ; integer
Shield.ReceivedDamage.MinMultiplier=1.0     ; floating point value
Shield.ReceivedDamage.MaxMultiplier=1.0     ; floating point value
Shield.Respawn.Duration=0                   ; integer, game frames
Shield.Respawn.Amount=0.0                   ; floating point value, percents or absolute
Shield.Respawn.Rate=-1.0                    ; floating point value, ingame minutes
Shield.Respawn.RestartInCombat=             ; boolean
Shield.Respawn.RestartInCombatDelay=-1      ; integer, game frames
Shield.Respawn.RestartTimer=false           ; boolean
Shield.Respawn.Anim=                        ; List of AnimationTypes
Shield.Respawn.Weapon=                      ; WeaponType
Shield.SelfHealing.Duration=0               ; integer, game frames
Shield.SelfHealing.Amount=0.0               ; floating point value, percents or absolute
Shield.SelfHealing.Rate=-1.0                ; floating point value, ingame minutes
Shield.SelfHealing.RestartInCombat=         ; boolean
Shield.SelfHealing.RestartInCombatDelay=-1  ; integer, game frames
Shield.SelfHealing.RestartTimer=false       ; boolean
Shield.AffectTypes=                         ; List of ShieldTypes
Shield.Penetrate.Types=                     ; List of ShieldTypes
Shield.Break.Types=                         ; List of ShieldTypes
Shield.Respawn.Types=                       ; List of ShieldTypes
Shield.SelfHealing.Types=                   ; List of ShieldTypes
Shield.AttachTypes=                         ; List of ShieldTypes
Shield.RemoveTypes=                         ; List of ShieldTypes
Shield.RemoveAll=false                      ; boolean
Shield.ReplaceOnly=false                    ; boolean
Shield.ReplaceNonRespawning=false           ; boolean
Shield.MinimumReplaceDelay=0                ; integer, game frames
Shield.InheritStateOnReplace=false          ; boolean
  • 现在你可以给予任何科技类型护盾。它作为一个独立的第二血条拥有独立的 ArmorStrength 设定。

    • 如果科技类型处于 Temporal 弹头的效果中、处于铁幕/力场护盾保护中、拥有 Immune=true 或者拥有 TypeImmune=true 并且伤害来自相同所属的同种科技类型,那么护盾将不会受到伤害。

    • 负值伤害将会恢复护盾,除非护盾已被击碎。在护盾回满前所有负值伤害都将被护盾吸收。

      • 负值伤害武器会将一个拥有激活状态且不满血的护盾的目标视为需要治疗/维修,除非弹头具有 Shield.Penetrate=true,这种情况下只会考虑对象的血量。

    • 当一个科技类型拥有未被击碎的护盾时,[ShieldType] -> Armor 将替代 [TechnoType] -> Armor 用于参与索敌和杀伤计算。

      • InheritArmorFromTechno 可设为 true 以覆盖这一行为即即便护盾处于激活状态也使用 [TechnoType] -> Armor 而忽略 [ShieldType] -> Armor

      • InheritArmor.Allowed 列出了其护甲可以被覆盖的科技类型。如果为空,则相当于任何不在 InheritArmor.Disallowed 列表的对象。

      • InheritArmor.Disallowed 列出了其护甲不可被覆盖的科技类型。如果为空,则相当于任何科技类型都可以被覆盖,只要 InheritArmor.Allowed 为空或者这些科技类型列在该列表中。

      • ApplyArmorMult 可设为 true 以允许护盾享受护甲倍率。

    • InitialStrength 可用于设置一个不同于最大值的初始护盾值。

    • ConditionYellowConditionRed 可被用于设置护盾损伤状态的阈值,默认分别为 [AudioVisual] -> Shield.ConditionYellow & Shield.ConditionRed 而它们又默认为 ConditionYellow & ConditionRed

  • 当执行 DeploysIntoUndeploysInto 时,如果两个科技类型都拥有护盾,转换后的单位/建筑将保持相对(百分比)的护盾值,类似 Strength。如果其中一个科技类型没有护盾,其护盾状态会被保留直到转换回来。

    • 这同样适用于 Ares 的 Convert.*

  • Powered 控制当前单位电力不足或受 EMP 影响时护盾是否依然工作。

    • 注意,如果科技类型自身不受制于 Powered,那么护盾在电力不足时也不会罢工。

  • AbsorbOverDamage 控制护盾是否在被击碎时吸收本次所受的所有伤害。

  • SelfHealingRespawn 遵循以下设置:0.0 禁用该功能,1%-100% 按百分比恢复/重生护盾值,其他数字直接恢复/重生指定护盾值。特别的一点是 SelfHealing 为负数代表扣除护盾值。

    • 如果你想让护盾每次恢复/重生 1 点 HP,目前你需要将标签值设为 1 到 2 之间的任意数字,比如 1.1

    • 如果设置了 SelfHealing.RestartInCombat 当护盾受到伤害时其恢复计时器将被暂停直至 SelfHealing.RestartInCombatDelay 指定的帧数后。

    • 如果设置了 Respawn.RestartInCombat 当科技类型的护盾处于重生过程中时其重生计时器将被暂停直至 Respawn.RestartInCombatDelay 指定的帧数后。

  • SelfHealing.RateRespawn.Rate 遵循以下设置:0.0 立即恢复护盾,其他值表示护盾恢复/重生间隔(单位:分)。

  • Respawn.Anim 如果设置则会在护盾重生时播放。如果列出了多个动画,则将随机选择一个。

  • Respawn.Weapon 如果设置则将在护盾重生时向科技类型发射一次。

  • SelfHealing.EnabledBy 可用于控制护盾自愈和重生行为。只有拥有此列表中的建筑时才可以自愈或重生。

  • IdleAnim 如果设置则会在护盾完好时播放。该动画会自动设置为无限循环播放。

    • IdleAnim.ConditionYellowIdleAnim.ConditionRed 可用于设置当护盾值达到 [AudioVisual] -> ConditionYellow/ConditionRed 的百分比时使用的不同动画。如果未设置 IdleAnim.ConditionRed 则会回退到 IdleAnim.ConditionYellow,而后者则会回退到 IdleAnim

    • IdleAnimDamagedIdleAnimDamaged.ConditionYellowIdleAnimDamaged.ConditionRed 的使用方式相同,但仅当护盾附着的对象血量处于或低于 [AudioVisual] -> ConditionYellow 的百分比时使用。遵守与常规 IdleAnim 相同的回退序列,如果未设置则回退到伤残状态的上一个闲置动画变体或者直至回退到常规的 IdleAnim

    • Bouncer=trueIsMeteor=true 的动画在用作 IdleAnim 时会出现不合理的行为,应避免使用。

  • IdleAnim.OfflineAction 指定处于低电量状态时护盾动画的行为。

  • IdleAnim.TemporalAction 指定被时空武器冻结时护盾动画的行为。

  • BreakAnim 如果设置则会在护盾被击碎时播放。如果列出了多个动画,则将随机选择一个。

  • HitAnim 如果设置则会在护盾受到攻击时播放,类似于 WeaponNullifyAnim 用于铁幕。如果列出了多个动画,则将随机选择一个。

  • HitFlash 如果设为 true 则当护盾受到一个弹头攻击时将产生一个闪光除非其拥有 Shield.HitFlash=false。闪光的大小由受到的伤害决定,除非设置了 HitFlash.FixedSize 为某个数值,此时将使用该值(想要产生可见的该效果该句有效值范围为 81 到 252,高于或低于该范围的值将没有该效果)。颜色可以通过 HitFlash.Red/Green/Blue 进行自定义。如果设置了 HitFlash.Black 为 true,那么无论其他颜色设置如何,产生的闪光都是黑色的。

  • BreakWeapon 如果设置则将在护盾被击碎时向科技类型发射一次。

  • AbsorbPercent 控制该护盾吸收伤害的百分比。默认为 1.0,表示完全吸收伤害。

  • PassPercent 控制该护盾所 能吸收(穿透了)伤害的百分比,即使护盾处于激活状态也会直接被施加到单位上。默认为 0.0 - 无穿透。

  • ReceivedDamage.MinimumReceivedDamage.Maximum 控制单次攻击中对护盾造成的最小和最大伤害量。这在应用护甲类型和 AbsorbPercent 百分比之后生效。如果 AbsorbOverDamage=false,则对科技类型造成的剩余伤害仍基于原始伤害受此范围调整前的值。

  • AllowTransfer 控制如果科技类型发生变化(例如 (Un)DeploysInto 或 Ares 的单位转换)时护盾能否转移。如果未设置,通过 Shield.AttachTypes 被赋予来的护盾默认为 true 其他默认为 false。

  • ImmuneToBerserk 给予对 Psychedelic=yes 弹头的免疫能力。否则混乱默认可以穿过护盾。注意这不应阻止单位对护盾所保护对象进行索敌。在这种情况下 Versus.shieldArmor=0% 仍然是必需的。

  • 通过设置 Tint.ColorTint Intensity 可以为拥有护盾的科技类型使用类似于铁幕/力场护盾或 Psychedelic=true 弹头的染色效果。

    • Tint.Intensity 是增加/减少的光照,1.0 是默认的对象光照。

    • Tint.VisibleToHouses 可用于自定义哪些所属方可见这些染色效果。

  • 拥有护盾的科技类型将显示其护盾值。若护盾可以重生则会在被击碎后留下一个空的护盾条。对于护盾条的 pip 有多种自定义选项可选。

    • 默认情况下建筑使用 pips.shp 的第 6 帧来显示护盾值,其他则使用第 17 帧。

    • Pips.Shield 可用于指定使用哪个 pip 帧作为护盾值。如果仅设为 1 位数字则始终显示该帧;如果设置 3 位数字,则它们会根据护盾值达到 ConditionYellowConditionRed 与否分别使用。Pips.Shield.Building 用于 BuildingTypes。-1 作为值将使用默认帧,无论是否回退到第一个值或上述硬编码的默认值。

    • Pips.Shield.Background 可用于指定非建筑 pip 的背景或 “边框”。默认为 pipbrd.shp。第 4 帧用于显示步兵的护盾值,其他单位使用第 3 帧,如果可用帧不足则分别使用第 2 帧和第 1 帧。

    • Pips.Shield.Building.Empty 可用于设置建筑空护盾值显示的 pip 帧,默认为 pips.shp 的第 1 帧。

    • Pips.HideIfNoStrength 可用于在 Strength 归 0 时隐藏护盾条而不是留下一个空框。

    • 以上配置支持基于每个护盾类型单独设置,例如使用 [ShieldType] -> Pips 替代全局的 [AudioVisual] -> Pips.Shield。护盾类型上的设置优先于全局设置,未单独设置时回退至全局默认值。

    • BracketDelta 可用于添加护盾条在竖直方向的偏移量(负数为向上)。类似于 PixelSelectionBracketDelta,对建筑无效。

  • 弹头拥有与护盾交互的新选项。注意,所有这些本身并不需要能够对护盾进行目标选择(例如像 Shield.Break 或移除/附加护盾这样的修改)的选项仍然需要弹头的 Verses 才能影响目标,除非在弹头上将 EffectsRequireVerses 设置为 false。

    • Shield.Penetrate 允许弹头无视这些护盾始终对科技类型本体造成全额伤害。并允许忽略护盾直接锁定科技类型。

    • Shield.Break 允许弹头总是会击碎科技类型上的这些护盾。此效果在结算伤害前生效。

    • Shield.BreakAnim 用于设置弹头击中护盾时替代护盾 BreakAnim 播放的动画。如果列出了多个动画,则将随机选择一个。

    • Shield.HitAnim 用于设置弹头击中护盾时替代护盾 HitAnim 播放的动画。如果列出了多个动画,则将随机选择一个。

    • 如果 Shield.SkipHitAnim 设为 true,当弹头对护盾造成伤害时将不会播放任何击中动画。

    • Shield.BreakWeapon 用于设置弹头击碎护盾时替代护盾 BreakWeapon 发射的武器,无论是伤害饱和还是 Shield.Break 所造成的击碎。

    • Shield.AbsorbPercent 覆盖被杀伤护盾类型的 AbsorbPercent 值。

    • Shield.PassPercent 覆盖被杀伤护盾类型的 PassPercent 值。

    • Shield.ReceivedDamage.MinimumShield.ReceivedDamage.Maximum 覆盖被杀伤护盾类型上的同类设置。

      • Shield.ReceivedDamage.MinMultiplierShield.ReceivedDamage.MinMultiplier 分别为上面Shield.ReceivedDamage.MinimumShield.ReceivedDamage.Maximum 用于被杀伤护盾计算弹头所造成伤害的倍率。

    • Shield.Respawn.RateShield.Respawn.AmountShield.Respawn.AnimShield.Respawn.Weapon 会在 Shield.Respawn.Duration 的帧数内覆盖护盾的 Respawn.RateRespawn.AmountRespawn.AnimRespawn.Weapon。负值和 0 会默认使用护盾类型自身的值。如果设置了 Shield.Respawn.RestartTimer 当前正在使用的护盾重生计时器将被重置否则计时器将被根据新的 Shield.Respawn.Rate 按比例进行调整(例如计时器在前后保持相同百分比的进度)而不会重置。如果效果在重生计时器运作状态中失效,剩余时间也同样会按比例调整为护盾自身的Respawn.Rate。重新应用效果会将持续时间重置为 Shield.Respawn.Duration

      • 此外 Shield.Respawn.RestartInCombatShield.Respawn.RestartInCombatDelay 可用于覆盖护盾类型上的同类设置。

    • Shield.SelfHealing.RateShield.SelfHealing.Amount 会在 Shield.Respawn.Duration 的帧数内覆盖护盾的 SelfHealing.RateSelfHealing.Amount。负值和 0 会默认使用护盾类型自身的值。如果设置了 Shield.SelfHealing.RestartTimer 当前正在使用的恢复计时器将被重置否则计时器将被根据新的 Shield.SelfHealing.Rate 按比例进行调整(例如计时器在前后保持相同百分比的进度)而不会重置。如果效果在恢复计时器运作状态中失效,剩余时间也同样会按比例调整为护盾自身的 SelfHealing.Rate。重新应用效果会将持续时间重置为 Shield.SelfHealing.Duration

      • 此外 Shield.SelfHealing.RestartInCombatShield.SelfHealing.RestartInCombatDelay 可用于覆盖护盾类型上的同类设置。

    • Shield.AffectTypes 允许列出哪些护盾类型受上述效果的影响。如果未列出则代表所有护盾类型。

      • Shield.AffectTypes 可以通过使用标签 Shield.Penetrate.TypesShield.Break.TypesShield.Respawn.TypesShield.SelfHealing.Types 分别为特定的护盾分离覆盖的参数类型。

    • Shield.AttachTypesShield.RemoveTypes 允许分别列出从被弹头影响(正 Verses 值)的任何目标上附加或移除的护盾类型。通常只使用 Shield.AttachTypes 中列出的第一个。

      • 如果设置 Shield.ReplaceOnlyShield.AttachTypes 中的所有护盾只会应用于同时移除了护盾的目标,并与 Shield.RemoveTypes 列表中的顺序对应。如果 Shield.AttachTypes 中的项少于 Shield.RemoveTypes 则使用前者的最后一项来替换任何剩余的被移除护盾类型。

      • 如果设置 Shield.ReplaceNonRespawningShield.AttachTypes 中的护盾将替换那些已被击碎且无法自行重生的已有护盾。

      • 如果设置 Shield.RemoveAll 则移除所影响目标上的所有护盾,即使这些护盾没有列在 Shield.RemoveTypes 中。如果设置了 Shield.ReplaceOnlyShield.AttachTypes 中的第一项将用于替换那些被移除但未列在 Shield.RemoveTypes 中的护盾类型。

      • Shield.MinimumReplaceDelay 可用于控制护盾被击碎后(以游戏帧为单位)多久才能被替换。如果未经过足够的时间则不会被替换。

      • 如果设置 Shield.InheritStateOnReplace 则通过 Shield.ReplaceOnly 替换的护盾将继承前一个护盾的当前强度(护盾类型的 Strength)以及是否已被击碎的状态。恢复和重生计时器将始终被重置。

战机

战机伤残更换图像

  • 现在当战机伤残(生命值低于 [AudioVisual] -> ConditionYellow 的百分比)时可以通过 Image.ConditionYellow 为战机设置不同的图像。

  • 同样的如果战机生命值低于 [AudioVisual] -> ConditionRed 的百分比那么将会使用 Image.ConditionRed 作为图像。

rulesmd.ini

[SOMEAIRCRAFT]                ; AircraftType
Image.ConditionYellow=        ; AircraftType entry
Image.ConditionRed=           ; AircraftType entry

警告

注意这些被使用的战机必须在 [AircraftTypes] 下注册。

动画

动画生成单位

图像

  • 动画现在可以在结束时通过 CreateUnit 创建任何单位(载具、战机和步兵)。这比专用于生成步兵的 MakeInfantry 提供了更多的可选参数。

    • CreateUnit.Owner 决定创建的单位属于哪个所属方。这仅在动画拥有所有者的情况生效。如果没有所属方或所属方已败北,除非 CreateUnit.RequireOwner 为 true 以禁止生成,否则被创建的单位将归属于第一个平民所属方

      • 载具 摧毁动画、弹头 AnimList/SplashList 的动画以及地图触发结果 41 播放动画在... 将拥有正确的所有者。

      • CreateUnit.RemapAnim 如果设为 true 则动画将使用单位色盘绘制并可重映射所有者的颜色。

    • CreateUnit.Mission 决定所创建单位的初始任务。对于 AI 玩家可使用 CreateUnit.AIMission 来分离设置。

    • CreateUnit.Facing 决定所创建单位的初始朝向。

      • CreateUnit.RandomFacing 如果设为 true 那么初始朝向会随机选取。

      • 仅用于载具:如果动画来自一个被摧毁载具的载具摧毁动画那么 CreateUnit.InheritFacingsCreateUnit.InheritTurretFacings 将分别从被摧毁载具的载具上继承载具主体和炮塔的朝向。由于技术限制,InheritTurretFacings 不适用于 Jumpjet 载具。

    • CreateUnit.AlwaysSpawnOnGround 如果设为 true 那么即使动画在空中单位也会在对应的地面单元格上创建。如果设为 false 则此设置无效。

    • CreateUnit.SpawnParachutedInAir 如果设为 true 那么动画在空中的情况下所创建的单位会拥有降落伞。如果 CreateUnit.AlwaysSpawnOnGround 设为 true 则此设置无效。

    • CreateUnit.ConsiderPathfinding 如果设为 true 则考虑动画所在单元格是否被其他对象占据或对于所要创建的单位而言无法行驶并尝试寻找一个附近未被占用的单元格。否则即便存在障碍物单位也会尽量创建在动画所在的位置。

    • CreateUnit.SpawnAnim 可用于在创建的单位出现后在其位置播放另一个动画。此动画拥有与父动画相同的所有者和调用者。如果列出了多个动画,则将随机选择一个。

    • CreateUnit.SpawnHeight 如果设为正值则决定动画创建单位的高度。如果 CreateUnit.AlwaysSpawnOnGround 设为 true 则此设置无效。

artmd.ini

[SOMEANIM]                             ; AnimationType
CreateUnit=                            ; TechnoType
CreateUnit.Owner=Victim                ; Owner house kind, Invoker/Killer/Victim/Civilian/Special/Neutral/Random
CreateUnit.RequireOwner=false          ; boolean
CreateUnit.RemapAnim=false             ; boolean
CreateUnit.Mission=Guard               ; MissionType
CreateUnit.AIMission=                  ; MissionType
CreateUnit.Facing=0                    ; Direction type (integers from 0-255)
CreateUnit.RandomFacing=true           ; boolean
CreateUnit.InheritFacings=false        ; boolean
CreateUnit.InheritTurretFacings=false  ; boolean
CreateUnit.AlwaysSpawnOnGround=false   ; boolean
CreateUnit.SpawnParachutedInAir=false  ; boolean
CreateUnit.ConsiderPathfinding=false   ; boolean
CreateUnit.SpawnAnim=                  ; List of AnimationTypes
CreateUnit.SpawnHeight=-1              ; integer, height in leptons

备注

由于技术限制,包括 Ares 语句 InfDeathAnim 在内的步兵死亡动画无法正确应用 CreateUnit.Owner。你可以使用 Ares 的 MakeInfantryOwner 作为替代方案,此方案无需设置 MakeInfantry 也能正常工作。

附加粒子系统

  • 现在可以为一个动画附加一个粒子系统。仅支持 BehavesLike=Smoke 的粒子系统。这与 Voxel 碎片中的同名语句等效。

    • 对于有 Next 的动画下一个动画开始播放时粒子系统将被删除且如果 Next 的动画定义了另一个粒子系统那么新的粒子系统将被创建。

artmd.ini

[SOMEANIM]       ; AnimationType
AttachedSystem=  ; ParticleSystemType

Customizable animation transparency settings

  • Translucency.Cloaked can be used to override Translucency on animations attached to currently cloaked TechnoTypes.

  • Both Translucency and Translucency.Cloaked can use the new keyframe system to animate along with the animation. Read more about the keyframe system here.

  • If interpolation is enabled, the keyframe values are clamped to valid transparency values (0,25,50 and 75), e.g a value of 1.5 would become 0 and 56.525 would become 50 and so on.

artmd.ini

[SOMEANIM]             ; AnimationType
Translucency=0         ; integer - only accepted values are 75, 50, 25 and 0.
Translucency.Cloaked=  ; integer - only accepted values are 75, 50, 25 and 0.

自定义动画可见性

  • 现在可以通过 VisibleTo 自定义哪些玩家可以看到动画。

    • VisibleTo.ConsiderInvokerAsOwner 如果设置则动画调用者的所属方将被视为 VisibleTo 的所有者而不是它所附着科技类型或动画的的所属方。大多动画中它们是相同的但部分动画可能不同。

    • 注意这是一个视觉效果,任何附加到动画上的逻辑例如造成伤害仍然会为所有玩家处理。

  • RestrictVisibilityIfCloaked 如果设为 true 则隐形对象上所附着的动画和战机 Trailer 的(由于技术限制导弹子机的尾烟不受此限制)动画仅对观察者和可检测到它们的玩家可见。

  • DetachOnCloak 可设为 false 以覆盖原本游戏从隐形对象上移除所附着动画的行为。

artmd.ini

[SOMEANIM]                              ; AnimationType
VisibleTo=all                           ; List of Affected House Enumeration (none|owner/self|allies/ally|team|enemies/enemy|all)
VisibleTo.ConsiderInvokerAsOwner=false  ; boolean
RestrictVisibilityIfCloaked=false       ; boolean
DetachOnCloak=true                      ; boolean

以独立声音事件播放声音

  • 现在可以通过 DetachedReport 让动画播放一个未附加到音频事件处理器的声音。默认情况下动画的 ReportStartSound 由音频事件处理器播放,这允许它即使在初始创建后发生了变化声音也会循环和在正确的位置播放。这也导致通过 Next 链接不同的动画类型时出现问题,因为动画重新开始时音频事件处理器会重置。

artmd.ini

[SOMEANIM]       ; AnimationType
DetachedReport=  ; Sound entry

建筑

自定义建造区域

  • 现在允许自定义一个建筑能为哪些建筑扩展建造范围。

    • Adjacent.Allowed 列出了可以放置在其附近(由 Adjacent 定义的距离内)的建筑类型(白名单)。如果留空则任何未列在 Adjacent.Disallowed 的建筑类型都可以。

    • Adjacent.Disallowed 列出了不得放置在其附近(由 Adjacent 定义的距离内)的建筑类型(黑名单)。如果留空则只看白名单。

      • 上一条的黑名单在默认情景下只是不拓展建造范围,但如果 Adjacent.Disallowed.Prohibit 设为 true,它将真正禁止建筑放置在所规定的范围内,并且优先于白名单。当 Adjacent.Disallowed.ProhibitDistance 设为大于 0 的值时将会覆盖 Adjacent 以实现对禁止放置范围的独立控制。

    • 如果 NoBuildAreaOnBuildup 设为 true 则任何建筑类型都不能当其在播放建造动画时在其附近建造。

rulesmd.ini

[SOMEBUILDING]                          ; BuildingType
Adjacent.Allowed=                       ; List of BuildingTypes
Adjacent.Disallowed=                    ; List of BuildingTypes
Adjacent.Disallowed.Prohibit=false      ; boolean
Adjacent.Disallowed.ProhibitDistance=0  ; integer, cell offset
NoBuildAreaOnBuildup=false              ; boolean

可摧毁的寻路障碍

  • 可以通过将 IsDestroyableBlockage 设为 true 使建筑被视为可摧毁的寻路障碍物。这会使得每个无法飞行或没有适当 MovementZone(允许处理可摧毁障碍物的类别,例如 (Infantry|Amphibious)Destroyer)的单位能够将建筑视为像墙类覆盖物和地形对象那样不可通行且不可逾越的障碍物。

    • 注意如果一个单位拥有适当的 MovementZone 但缺少实际摧毁障碍物的手段(例如一个可以发射并造成伤害的武器)那么它们仍会尝试摧毁并穿越障碍物并导致卡在那里而不是绕过障碍物。

rulesmd.ini

[SOMEBUILDING]               ; BuildingType
IsDestroyableObstacle=false  ; boolean

自定义工程师维修

  • 现在你可以在工程师维修一个建筑时为它们设定最大修复值。0 代表满血。

    • 负值按百分比计算。例如 EngineerRepairAmount=-50 表示每名工程师每次最多修 50%。

    • 如果建筑和工程师都设置了 EngineerRepairAmount 则区其中更小的那个使用。

  • BuildingRepairedSound 现在可以为在每种建筑上单独定义。

rulesmd.ini

[SOMEBUILDING]                     ; BuildingType
EngineerRepairAmount=0             ; integer
BuildingRepairedSound=             ; Sound entry, default to [AudioVisual] -> BuildingRepairedSound

[SOMEINFANTRY]                     ; InfantryType
EngineerRepairAmount=0             ; integer

拓展的建筑加载物

图像 CnC: Final War 中加载到自己的和盟友的发电厂

  • 现在建筑加载物可以放置在己方建筑、友方建筑乃至敌方建筑上。这三种所有者可以通过 PowersUp.Owner 指定。当加载物放置在建筑上时,它将自动更改为与建筑所有者相同的所有者。

  • 现在一个加载物可以应用于由 PowersUp.Buildings 指定的多种不同类型的建筑。

    • Ares 引入的建筑加载物建造限制与这一功能兼容。

rulesmd.ini

[SOMEBUILDING]      ; BuildingType, as an upgrade
PowersUp.Owner=Self ; List of Affected House Enumeration (none|owner/self|allies/ally|team|enemies/enemy|all)
PowersUp.Buildings= ; List of BuildingTypes

备注

由于技术限制,使用 Ares 时通过 PowersUp.Buildings 而不是 PowersUpBuilding 放置的加载物(注意如果前者未设置而后者已设置则程序将 PowersUpBuilding 视为 PowersUp.Buildings 的第一个条目) 不会 满足先决条件。建议的解决方法是通过加载物来提供一个超武武器通过 虚拟投放 的建筑来作为先决条件,当父建筑消失时这些先决条件会被另一个超级武器销毁,以此类推。

电厂增幅器

  • 当它存在时可以增加电厂产生的电量。

    • 当增幅器被出售或摧毁时电量将复原。

    • PowerPlantEnhancer.MaxCount 决定了此类建筑中参与电厂增幅的数量上限。负值代表无上限。

rulesmd.ini

[SOMEBUILDING]                     ; BuildingType
PowerPlantEnhancer.PowerPlants=    ; List of BuildingTypes
PowerPlantEnhancer.Range=0         ; floating point value, distance in cells
PowerPlantEnhancer.Amount=0        ; integer
PowerPlantEnhancer.Factor=1.0      ; floating point value
PowerPlantEnhancer.MaxCount=-1     ; integer

间谍效果

  • 可以通过 SpyEffect.Custom 开启额外的间谍效果。

    • SpyEffect.VictimSuperWeapon 会立即在被渗透建筑的坐标以被渗透方为所属发射一个超级武器。

    • SpyEffect.InfiltratorSuperWeapon 同上但超级武器的所属方来自间谍单位。

rulesmd.ini

[SOMEBUILDING]                     ; BuildingType
SpyEffect.Custom=false             ; boolean
SpyEffect.VictimSuperWeapon=       ; SuperWeaponType
SpyEffect.InfiltratorSuperWeapon=  ; SuperWeaponType

步兵

自定义步兵匍匐或部署状态的 FLH

  • 现在步兵处于匍匐(爪巴)或部署状态的 FLH 可以独立于 PrimaryFireFLHSecondaryFireFLH 进行设置。同样对 Burst 开火坐标 生效。

artmd.ini

[SOMEINFANTRY]             ; InfantryType image
PronePrimaryFireFLH=       ; integer - Forward,Lateral,Height
ProneSecondaryFireFLH=     ; integer - Forward,Lateral,Height
DeployedPrimaryFireFLH=    ; integer - Forward,Lateral,Height
DeployedSecondaryFireFLH=  ; integer - Forward,Lateral,Height

自定义 SlavesFreeSound

  • 现在 SlavesFreeSound 可以单独为每个奴隶类步兵类型微观设置。

rulesmd.ini

[SOMEINFANTRY]        ; InfantryType, with Slaved=yes
SlavesFreeSound=      ; Sound entry, default to [AudioVisual] -> SlavesFreeSound

步兵类型默认伪装

  • 现在可以为每个步兵类型设置其 DefaultDisguise

    • 此标签的优先级高于 Ares 的各阵营 DefaultDisguise

rulesmd.ini

[SOMEINFANTRY]      ; InfantryType
DefaultDisguise=    ; InfantryType

非人步兵随机死亡动画

  • 现在拥有 NotHuman=yes 的步兵可以从 Die1Die5 之间随机播放死亡动画序列而不再是硬编码的 Die1

    • 在启用此功能前请务必调整步兵动画序列否则可能播放不可见的动画序列。

rulesmd.ini

[SOMEINFANTRY]                    ; InfantryType
NotHuman.RandomDeathSequence=yes  ; boolean

奴隶解放演变

  • 现在你可以使用 Slaved.OwnerWhenMasterKilled 来决定奴隶矿场被毁后奴隶移交的所属方或行为:

    • suicide:以身殉主,奴隶矿场死亡则奴隶同步死亡。

    • master :助纣为虐,拿起武器但所属不变。

    • neutral:独善其身,解放后转为平民所属方开摆。

    • killer :揭竿而起,解放后转为奴隶矿场击杀者的所属方。(原版行为)

rulesmd.ini

[SOMEINFANTRY]                       ; InfantryType, with Slaved=yes
Slaved.OwnerWhenMasterKilled=killer  ; enumeration (suicide | master | killer | neutral)

在水中使用陆地序列

  • 设置 OnlyUseLandSequences 为 true 可以使步兵即使在水中也只显示在陆地上使用的常规序列。

artmd.ini

[SOMEINFANTRY]              ; InfantryType image
OnlyUseLandSequences=false  ; boolean

抛射体

攻击地下单位

  • 现在你可以允许抛射体对处于地下的单位发动攻击。

rulesmd.ini

[SOMEPROJECTILE]      ; Projectile
AU=false              ; boolean

备注

仅原版 Inviso=yes 类抛射体或启用了 Trajectory.(Straight/Bombard).SubjectToGround=falsePhobos 直线弹道Phobos 轰击弹道 可穿透地表。除此之外的抛射体在接触地面时将会强制引爆。

为了能够攻击处于地下水平运动的单位,攻击者需要有 SensorsSight 设置。

伞降炸弹

  • 还原自 RA1(也在 Ares 中部分实现但未记载,若共用则 Phobos 版本优先),允许抛射体在被空中单位发射时伞降到地面。

    • 设置 Parachuted 为 true 以启用此行为。注意:若与 ROT > 0 或 Vertical=true 等任何其他抛射体逻辑共用将会导致不理想的效果。

    • 可通过 Parachuted.FallRate 来自定义降落速度,其上限由 Parachuted.MaxFallRate 决定。

    • 可通过 BombParachute 来自定义降落伞动画。该动画将使用 unit 色盘绘制映射为发射者所属的阵营色。

rulesmd.ini

[SOMEPROJECTILE]         ; Projectile
Parachuted=false         ; boolean
Parachuted.FallRate=1    ; integer
Parachuted.MaxFallRate=  ; integer, default to [General] -> ParachuteMaxFallRate
BombParachute=           ; AnimationType, default to [General] -> BombParachute

抛射体拦截

图像 泰伯利亚危机 中的拦截抛射体

  • 现在可以通过在一些抛射体上设置 Interceptable=true 来使它们能够被特定的科技类型拦截。如果该科技类型没有其他目标那么它将扫描范围内的可拦截抛射体并使用它的一个武器进行射击。抛射体可以定义 ArmorStrength。无法对该抛射体护甲类型发起攻击的武器不会尝试拦截。在拦截时如果抛射体设置了 Armor 那么从抛射体的当前血量中扣除一个等于拦截武器 Damage 经弹头 Verses 和科技类型火力加成调整后的数值。无论当前抛射体血量是否被减少若拦截后其血量为 0 或更低那么抛射体将被引爆。

    • Interceptor.Weapon 决定用于拦截抛射体的武器(0 = Primary, 1 = Secondary)。

      • 拦截武器可能需要在其抛射体上将 AA 设为 true 以使其能够根据抛射体相对地面的高度来瞄准。如果你不设置这些那么武器将无法分别瞄准低空或高空飞行的抛射体。

    • Interceptor.TargetingDelay 决定拦截者单位扫描可被拦截抛射体的频率(单位:帧)。间隔越小越能提升拦截者工作效率,但会降低游戏运行效率。该间隔不得设为 0,否则将会自动调整为 1 并在日志中输出开发者警告。

    • Interceptor.CanTargetHouses 控制抛射体(或其发射者)属于哪些所属方时可以被拦截。

    • Interceptor.GuardRange(以及 Interceptor.(Rookie|Veteran|EliteGuardRange))是单位拦截抛射体的最大范围。不过武器的射程仍会限制单位的实际拦截范围。

    • Interceptor.MinimumGuardRange(以及 Interceptor.(Rookie|Veteran|EliteMinimumGuardRange))是单位拦截抛射体的最小范围。任何小于此范围的抛射体都不会被拦截。

    • Interceptor.GuardRange.IsCylindrical 若设为 true 则在距离检查中忽略高度/海拔。

    • Interceptor.ApplyFirepowerMult 决定拦截武器的伤害是否受益于科技类型所拥有的火力加成。

    • Interceptable.DeleteOnIntercept 决定抛射体被拦截时是被简单的移除还是直接引爆。这会被拦截者的 Interceptor.DeleteOnIntercept 设置覆盖。

    • Interceptable.WeaponOverride 可以设置一个武器覆盖替代此抛射体在拦截时的 DamageWarhead 等特性进行引爆。这会被拦截者的 Interceptor.WeaponOverride 设置覆盖。

      • 在拦截者上可以将 Interceptor.WeaponReplaceProjectile 设为 true 以使 Interceptor.WeaponOverride 也使用自己的抛射体类型(包括 Image 和其他抛射体特性)和 Speed 替换被拦截的抛射体。不会替换附着的粒子系统(AttachedSystem 是一个 Ares 功能)。

      • 在拦截者上可以将 Interceptor.WeaponCumulativeDamage 设为 true 以使 Interceptor.WeaponOverride 武器的 Damage 会叠加到抛射体的 Damage 上而不是覆盖它。

    • Interceptor.KeepIntact 可设为 true 以允许被拦截的抛射体继续飞行就像它们没有被拦截一样,不过 Interceptor.WeaponOverride 等效果仍会应用。

rulesmd.ini

[SOMETECHNO]                                ; TechnoType
Interceptor=false                           ; boolean
Interceptor.Weapon=0                        ; integer, weapon slot index (0 or 1)
Interceptor.TargetingDelay=1                ; integer, game frames
Interceptor.CanTargetHouses=enemies         ; Affected House Enumeration (none|owner/self|allies/ally|team|enemies/enemy|all)
Interceptor.GuardRange=0.0                  ; floating point value
Interceptor.VeteranGuardRange=              ; floating point value
Interceptor.EliteGuardRange=                ; floating point value
Interceptor.MinimumGuardRange=0.0           ; floating point value
Interceptor.GuardRange.IsCylindrical=false  ; boolean
Interceptor.VeteranMinimumGuardRange=       ; floating point value
Interceptor.EliteMinimumGuardRange=         ; floating point value
Interceptor.ApplyFirepowerMult=true         ; boolean
Interceptor.DeleteOnIntercept=false         ; boolean
Interceptor.WeaponOverride=                 ; WeaponType
Interceptor.WeaponReplaceProjectile=false   ; boolean
Interceptor.WeaponCumulativeDamage=false    ; boolean
Interceptor.KeepIntact=false                ; boolean

[SOMEPROJECTILE]                            ; Projectile
Interceptable=false                         ; boolean
Interceptable.DeleteOnIntercept=false       ; boolean
Interceptable.WeaponOverride=               ; WeaponType
Strength=0                                  ; integer
Armor=                                      ; ArmorType

备注

目前如果拦截武器的开火者提前死亡那么没有 Inviso=true 的拦截抛射体将无法拦截目标抛射体,这在未来可能会进行更改。

抛射体弹道

  • 抛射体现在可以有自定义的弹道。

    • Trajectory 不应与原游戏的抛射体逻辑(ArcingROTVerticalInviso)结合使用。尝试你这样做将导致其他逻辑被禁用并在日志文件中写入一条警告。

    • 抛射体的速度由 Trajectory.Speed 定义,与 ROT > 0 抛射体不同的是 Trajectory.Speed 定义在抛射体上而不是武器上。

      • 对于 Trajectory=Straight 它指的是抛射体的全程速度并且没有限制。

      • 对于 Trajectory=Bombard 它指的是抛射体的初始速度并且没有限制。

      • 对于 Trajectory=Parabola 它指的是抛射体仅用于模式 0、3 或 5 的水平速度并且没有限制。

rulesmd.ini

[SOMEPROJECTILE]        ; Projectile
Trajectory.Speed=100.0  ; floating point value

直线弹道

直线弹道爆能枪 @brsajo#9745 在其个人 mod 中使用直线弹道制作的爆能枪

  • 不言自明,这是一种直线射击弹道。

    • Trajectory.Straight.DetonationDistance 控制抛射体强制引爆位置相对于目标单元格的距离阈值(每个游戏帧开始时、抛射体移动前检查)。设为 0 以禁用强制引爆(注意这可能导致抛射体飞掠目标)。如果 Trajectory.Straight.ApplyRangeModifiers 设为 true 则任何来自开火者的武器射程加成也将在此处被使用。通过设置 Trajectory.Straight.PassThrough=true 当值大于 0 时它指的是抛射体从自身开始移动的距离,当值小于 0 时它指的是抛射体飞跃目标后移动的距离(使用绝对值)。

    • Trajectory.Straight.TargetSnapDistance 控制抛射体在引爆时与目标的最大距离以使抛射体在引爆时 “瞬移” 到目标。设为 0 将禁用瞬移。

    • Trajectory.Straight.PassThrough 启用特殊的逻辑:抛射体在接触目标时不会引爆而是继续飞行到由 Trajectory.Straight.DetonationDistance 定义的距离。注意抛射体发射角度会受此影响,如果与目标处于同一高度那么直接向前发射。

    • Trajectory.Straight.PassDetonate 启用抛射体在飞行过程中的额外爆炸。(如果你希望抛射体在飞行过程中每隔一定距离/时间引爆一次那么可以使用此功能)。

      • Trajectory.Straight.PassDetonateWarhead 定义由 Trajectory.Straight.PassDetonate 引爆的弹头,Trajectory.Straight.PassDetonateDamage 定义由 Trajectory.Straight.PassDetonateWarhead 引爆的伤害。

      • Trajectory.Straight.PassDetonateDelay 控制 Trajectory.Straight.Warhead 所定义弹头的引爆间隔。

      • Trajectory.Straight.PassDetonateInitialDelay 控制 Trajectory.Straight.PassDetonateWarhead 所定义弹头的初始引爆间隔。

      • Trajectory.Straight.PassDetonateLocal 控制 Trajectory.Straight.PassDetonateWarhead 和武器 Warhead 是否始终在下方地面引爆。它还将不再限制抛射体在使用 Trajectory.Straight.ConfineAtHeight 时的垂直速度。

    • Trajectory.Straight.LeadTimeCalculate 控制抛射体在射击时是否需要计算目标的提前量。注意这不会影响炮塔的朝向。

    • Trajectory.Straight.OffsetCoord 控制锁定目标的偏移量。抛射体将瞄准此位置进行攻击。在此基础上它也支持 Inaccurate=yesTrajectory.Straight.LeadTimeCalculate=true

      • Trajectory.Straight.RotateCoord 控制是否根据武器的 Burst 在以 Trajectory.Straight.OffsetCoord 为角平分线的角度内旋转抛射体的发射方向。设为 0 以禁用此功能。

      • Trajectory.Straight.MirrorCoord 控制 Trajectory.Straight.OffsetCoord 是否需要镜像水平方向值以适应当前的连发索引。同时,Trajectory.Straight.RotateCoord 计算出的旋转方向也将被反转,每侧相邻抛射体之间的旋转角度不会受此改变。

      • Trajectory.Straight.UseDisperseBurst 控制 Trajectory.Straight.RotateCoord 的计算是否基于其上级武器的 Trajectory.Disperse.WeaponBurst 而不是武器的 Burst。此值不合适将导致不理想的视觉效果。

      • Trajectory.Straight.AxisOfRotation 控制计算 Trajectory.Straight.RotateCoord 的转轴。随单位朝向或目标位置到源位置的向量旋转。

    • Trajectory.Straight.ProximityImpact 控制初始的近炸引信次数。当剩余次数足够且抛射体靠近另一个有效目标时它将引爆由 Trajectory.Straight.ProximityWarhead 定义的弹头,如果剩余次数即将用完它将在当前位置引爆。此功能可以通过设为 0 禁用。负值整数表示无限次数。顺带一提,你可以使用带有低 Versus 的武器 Warhead 以瞄准目标,使用 Trajectory.Straight.ProximityWarhead 造成实际伤害。(你可以使用此功能在抛射体飞行期间对遇到的所有单位造成非重复伤害。)

      • Trajectory.Straight.ProximityWarhead 定义由 Trajectory.Straight.ProximityImpact 引爆的弹头,Trajectory.Straight.ProximityDamage 定义由 Trajectory.Straight.ProximityWarhead 引爆的伤害。

      • Trajectory.Straight.ProximityRadius 控制近炸引信的范围。不支持负整数。

      • Trajectory.Straight.ProximityDirect 控制是否直接伤害目标而不是引爆弹头。

      • Trajectory.Straight.ProximityMedial 控制是否在抛射体位置而不是近炸目标位置引爆弹头。如果 Trajectory.Straight.ProximityDirect 设为 true,这只会影响 Trajectory.Straight.EdgeAttenuation 的计算结果。

      • Trajectory.Straight.ProximityAllies 控制友军是否也会触发近炸引信。

      • Trajectory.Straight.ProximityFlight 控制是否考虑空中的单位。

    • Trajectory.Straight.ThroughVehicles 控制抛射体是否不会被地面上的载具或战机阻挡。当它被阻挡时将直接在其位置引爆。如果它的 Trajectory.Straight.ProximityImpact 次数还没耗尽,它也会在障碍物位置引爆一个 Trajectory.Straight.ProximityImpact

    • Trajectory.Straight.ThroughBuilding 控制抛射体是否不会被建筑阻挡。当它被阻挡时将直接在其位置引爆。如果它的 Trajectory.Straight.ProximityImpact 次数还没耗尽,它也会在障碍物位置引爆一个 Trajectory.Straight.ProximityImpact

    • Trajectory.Straight.SubjectToGround 控制抛射体在击中地面时是否爆炸。注意这并不能让 AI 去寻找合适的攻击位置。

    • Trajectory.Straight.ConfineAtHeight 控制抛射体尽可能保持的飞行高度。通过设置 SubjectToCliffs=true 可以使其不得从悬崖上向下移动。可以通过设置为非正整数来取消。如果 Trajectory.Speed 大于 256,它将被强制取消。

    • Trajectory.Straight.EdgeAttenuation 控制抛射体杀伤的边缘衰减比例(包括弹道添加的所有伤害类型),即实际造成的伤害是将此值乘以当前距离与武器射程的比值。不能设为负整数。

    • Trajectory.Straight.CountAttenuation 控制抛射体杀伤的衰减系数(包括弹道添加的所有伤害类型),即每次造成伤害后的下一次伤害会翻多少倍。不能设为负整数。

rulesmd.ini

[SOMEPROJECTILE]                                ; Projectile
Trajectory=Straight                             ; Trajectory type
Trajectory.Straight.ApplyRangeModifiers=false   ; boolean
Trajectory.Straight.DetonationDistance=0.4      ; floating point value
Trajectory.Straight.TargetSnapDistance=0.5      ; floating point value
Trajectory.Straight.PassThrough=false           ; boolean
Trajectory.Straight.PassDetonate=false          ; boolean
Trajectory.Straight.PassDetonateWarhead=        ; WarheadType
Trajectory.Straight.PassDetonateDamage=0        ; integer
Trajectory.Straight.PassDetonateDelay=1         ; integer
Trajectory.Straight.PassDetonateInitialDelay=0  ; integer
Trajectory.Straight.PassDetonateLocal=false     ; boolean
Trajectory.Straight.LeadTimeCalculate=false     ; boolean
Trajectory.Straight.OffsetCoord=0,0,0           ; integer - Forward,Lateral,Height
Trajectory.Straight.RotateCoord=0               ; floating point value
Trajectory.Straight.MirrorCoord=true            ; boolean
Trajectory.Straight.UseDisperseBurst=false      ; boolean
Trajectory.Straight.AxisOfRotation=0,0,1        ; integer - Forward,Lateral,Height
Trajectory.Straight.ProximityImpact=0           ; integer
Trajectory.Straight.ProximityWarhead=           ; WarheadType
Trajectory.Straight.ProximityDamage=0           ; integer
Trajectory.Straight.ProximityRadius=0.7         ; floating point value
Trajectory.Straight.ProximityDirect=false       ; boolean
Trajectory.Straight.ProximityMedial=false       ; boolean
Trajectory.Straight.ProximityAllies=false       ; boolean
Trajectory.Straight.ProximityFlight=false       ; boolean
Trajectory.Straight.ThroughVehicles=true        ; boolean
Trajectory.Straight.ThroughBuilding=true        ; boolean
Trajectory.Straight.SubjectToGround=false       ; boolean
Trajectory.Straight.ConfineAtHeight=0           ; integer
Trajectory.Straight.EdgeAttenuation=1.0         ; floating point value
Trajectory.Straight.CountAttenuation=1.0        ; floating point value

备注

  • 除非实在必要否则请设置较低的 Trajectory.Straight.ProximityRadius 值。

  • 列于 Trajectory.Straight.PassDetonateWarheadTrajectory.Straight.ProximityWarhead 的弹头必须在 [Warheads] 中列出才能生效。

轰击弹道

  • 类似于 Straight 但首先瞄准攻击者和目标间的某个坐标。当抛射体接近该拐点后它才会转向目标并在击中目标或地面时引爆。

    • Trajectory.Bombard.Height 控制拐点的高度。

    • Trajectory.Bombard.FallPercent 通过拐点位置占发射位置与目标位置间总距离的百分比来控制拐点的距离。如果设为 0% 则它将在开火位置的正上方。如果设为 100% 则它将位于目标正上方。

      • 每次发射时拐点位置的百分比值可以随机浮动,该值不大于 Trajectory.Bombard.FallPercentShift。如果设为 0 则随机调整将被禁用。

      • 你还可以使拐点在以 Trajectory.Bombard.FallScatter.Max 为半径的圆内随机散布。如果设为 0 则随机散布将被禁用。Trajectory.Bombard.FallScatter.Min 可用于确定圆的最低半径。如果 Trajectory.Bombard.FallScatter.Linear 设为 true,则随机散布范围将被限制在发射位置与目标位置之间连线的垂面。

    • Trajectory.Bombard.FreeFallOnTarget 控制它将如何击中目标。如果设为 true,则抛射体将在目标上方重新生成并自由落体。如果设为 false,则抛射体将正常从拐点位置飞向目标。

    • Trajectory.Bombard.NoLaunch 控制攻击者是否会自行发射抛射体。如果设为 true,则抛射体将直接从拐点位置下落。

    • Trajectory.Bombard.FallSpeed 控制抛射体经过拐点后的初速度。如果设为 0.0,则它将使用 Trajectory.Speed。当 Trajectory.Bombard.FreeFallOnTarget 设为 true 时将无法工作。

    • Trajectory.Bombard.DetonationDistance 控制强制引爆位置相对于目标单元格的距离阈值(在每次游戏帧开始时检查,抛射体移动之前)。设为 0 可以禁用强制引爆(注意这可能导致抛射体越过目标)。

    • Trajectory.Bombard.DetonationHeight 控制当抛射体处于下降状态且低于发射位置的高度加上此值时将会提前引爆。设置为非负数时生效。如果 Trajectory.Bombard.EarlyDetonation 设为 true,则它将在上升段生效,这表示当抛射体高度高于发射位置加上此值时将引爆。

    • Trajectory.Bombard.TargetSnapDistance 控制抛射体在引爆时与目标的最大距离以使抛射体在引爆时 “瞬移” 到目标。设为 0 将禁用瞬移。

    • Trajectory.Bombard.TurningPointAnims 如果设置将会在抛射体抵达拐点时播放动画。如果 Trajectory.Bombard.FreeFallOnTarget 设为 true,则抛射体将与目标一起在目标上方生成。如果 Trajectory.Bombard.NoLaunch 设为 true,则无论抛射体是否自由落体,它都将在抛射体下落的位置播放动画。如果列出了多个动画,则将随机选择一个。

    • Trajectory.Bombard.LeadTimeCalculate 控制抛射体在射击时是否需要计算目标的提前量。注意这不会影响炮塔的朝向。

    • 以下标签在 Trajectory.Bombard.FreeFallOnTarget 设为 false 时进一步自定义抛射体的下落行为。

      • Trajectory.Bombard.OffsetCoord 控制锁定目标的偏移量。抛射体将瞄准此位置进行攻击。在此基础上它也支持 Inaccurate=yesTrajectory.Bombard.LeadTimeCalculate=true

      • Trajectory.Bombard.RotateCoord 控制是否根据武器的 Burst 在以 Trajectory.Bombard.OffsetCoord 为角平分线的角度内旋转抛射体的发射方向。设为 0 以禁用此功能。

      • Trajectory.Bombard.MirrorCoord 控制 Trajectory.Bombard.OffsetCoord 是否需要镜像水平方向值以适应当前的连发索引。同时,Trajectory.Bombard.RotateCoord 计算出的旋转方向也将被反转,每侧相邻抛射体之间的旋转角度不会受此改变。

      • Trajectory.Bombard.UseDisperseBurst 控制 Trajectory.Bombard.RotateCoord 的计算是否基于其上级武器的 Trajectory.Disperse.WeaponBurst 而不是武器的 Burst。此值不合适将导致不理想的视觉效果。

      • Trajectory.Bombard.AxisOfRotation 控制计算 Trajectory.Bombard.RotateCoord 的转轴。随单位朝向或目标位置到源位置的向量旋转。

    • Trajectory.Bombard.SubjectToGround 控制抛射体在击中地面时是否爆炸。注意这并不能让 AI 去寻找合适的攻击位置。

rulesmd.ini

[SOMEPROJECTILE]                              ; Projectile
Trajectory=Bombard                            ; Trajectory type
Trajectory.Bombard.Height=0.0                 ; double
Trajectory.Bombard.FallPercent=1.0            ; double
Trajectory.Bombard.FallPercentShift=0.0       ; double
Trajectory.Bombard.FallScatter.Max=0.0        ; floating point value
Trajectory.Bombard.FallScatter.Min=0.0        ; floating point value
Trajectory.Bombard.FallScatter.Linear=false   ; boolean
Trajectory.Bombard.FreeFallOnTarget=true      ; boolean
Trajectory.Bombard.NoLaunch=false             ; boolean
Trajectory.Bombard.FallSpeed=0.0              ; double
Trajectory.Bombard.DetonationDistance=0.4     ; floating point value
Trajectory.Bombard.DetonationHeight=-1        ; integer
Trajectory.Bombard.EarlyDetonation=false      ; boolean
Trajectory.Bombard.TargetSnapDistance=0.5     ; floating point value
Trajectory.Bombard.TurningPointAnims=         ; List of AnimationTypes
Trajectory.Bombard.LeadTimeCalculate=false    ; boolean
Trajectory.Bombard.OffsetCoord=0,0,0          ; integer - Forward,Lateral,Height
Trajectory.Bombard.RotateCoord=0              ; floating point value
Trajectory.Bombard.MirrorCoord=true           ; boolean
Trajectory.Bombard.UseDisperseBurst=false     ; boolean
Trajectory.Bombard.AxisOfRotation=0,0,1       ; integer - Forward,Lateral,Height
Trajectory.Bombard.SubjectToGround=false      ; boolean

抛物线弹道

  • 顾名思义,这是一种完全重置且拥有不同增强功能的类 Arcing 弹道,它支持与 Trajectory=Disperse 的联动。

    • Trajectory.Parabola.DetonationDistance 控制强制引爆位置相对于目标单元格的距离阈值(在每次游戏帧开始时检查,抛射体移动之前)。设为 0 可以禁用强制引爆(注意这可能导致抛射体越过目标)。更具体地说,当它被设为负值时,如果目标可移动,它将改变其目标到目标所在单元格的位置(这是为 DisperseAirburst 而扩展的功能)。

    • Trajectory.Parabola.TargetSnapDistance 控制抛射体在引爆时与目标的最大距离以使抛射体在引爆时 “瞬移” 到目标。设为 0 将禁用瞬移。

    • Trajectory.Parabola.OpenFireMode 控制抛射体应该如何发射,它有如下 6 种模式:

      • Speed - 固定水平速度的自动计算模式,使用 Trajectory.Speed 和目标坐标作为计算条件,即抛射体的飞行时间将永久固定。

      • Height - 固定最大高度的自动计算模式,使用 Trajectory.Parabola.ThrowHeight 和目标坐标作为计算条件,即抛射体的引爆时间将相对固定。

      • Angle - 固定开火角度的自动计算模式,使用 Trajectory.Parabola.LaunchAngle 和目标坐标作为计算条件。在此模式下,性能消耗较高且可能无法解决。不建议在启用 SubjectToCliffs 或启用 AAMinimumRange 较小时使用此模式。

      • SpeedAndHeight - 固定水平速度和最大高度模式,使用 Trajectory.SpeedTrajectory.Parabola.ThrowHeight 作为计算条件,即抛射体将只进行高度变化,高度随目标高度变化。

      • HeightAndAngle - 固定最大高度和开火角度模式,使用 Trajectory.Parabola.ThrowHeightTrajectory.Parabola.LaunchAngle 作为计算条件,即抛射体将随高度变化而水平变化。

      • SpeedAndAngle - 固定水平速度和开火角度模式,使用 Trajectory.SpeedTrajectory.Parabola.LaunchAngle 作为计算条件,即抛射体弹道恒定。

    • Trajectory.Parabola.ThrowHeight 控制抛射体的最大高度,仅用于模式 1、3 或 4。具体高度将由取发射高度和目标高度中的较大值然后增加此值决定。不支持非正数。

    • Trajectory.Parabola.LaunchAngle 控制抛射体的开火角度,仅用于模式 2、4 或 5。在模式 2 或 5 中仅支持 -90.0 ~ 90.0(不能使用边界值),在模式 4 中则是 0.0 ~ 90.0(不能使用边界值)。

    • Trajectory.Parabola.LeadTimeCalculate 控制抛射体在射击时是否需要计算目标的提前量。注意这不会影响炮塔的朝向。

    • Trajectory.Parabola.DetonationAngle 控制当抛射体当前速度方向与水平方向的角度小于此值时,它将提前引爆。当值为 -90.0 ~ 90.0(不能使用边界值)时生效。

    • Trajectory.Parabola.DetonationHeight 控制当抛射体处于下落段且低于发射位置的高度加上此值时会提前引爆。设置为非负数时生效。

    • Trajectory.Parabola.BounceTimes 控制抛射体在击中地面或悬崖时可以弹跳的次数。注意过高的抛射体速度可能导致异常操作。此外,Trajectory.Parabola.DetonationDistance 与此不会冲突,它们将同时生效。因此,如果你想让子弹只在弹跳次数用尽后爆炸,你应该将 Trajectory.Parabola.DetonationDistance 设置为非正数。

      • Trajectory.Parabola.BounceOnWater 控制能否在水面上弹跳。

      • Trajectory.Parabola.BounceDetonate 控制是否在每次弹跳时额外引爆一次弹头。

      • Trajectory.Parabola.BounceAttenuation 控制抛射体弹跳伤害的衰减系数,即每次造成伤害后的下一次伤害会翻多少倍。这也将影响最终引爆的伤害。

      • Trajectory.Parabola.BounceCoefficient 控制抛射体弹跳弹性的衰减系数,即每次弹跳后的速度会翻多少倍。

    • Trajectory.Parabola.OffsetCoord 控制锁定目标的偏移量。抛射体将瞄准此位置进行攻击。在此基础上它也支持 Inaccurate=yesTrajectory.Parabola.LeadTimeCalculate=true

      • Trajectory.Parabola.RotateCoord 控制是否根据武器的 Burst 在以 Trajectory.Parabola.OffsetCoord 为角平分线的角度内旋转抛射体的发射方向。设为 0 以禁用此功能。

      • Trajectory.Parabola.MirrorCoord 控制 Trajectory.Parabola.OffsetCoord 是否需要镜像水平方向值以适应当前的连发索引。同时,Trajectory.Parabola.RotateCoord 计算出的旋转方向也将被反转,每侧相邻抛射体之间的旋转角度不会受此改变。

      • Trajectory.Parabola.UseDisperseBurst 控制 Trajectory.Parabola.RotateCoord 的计算是否基于其上级武器的 Trajectory.Disperse.WeaponBurst 而不是武器的 Burst。此值不合适将导致不理想的视觉效果。

      • Trajectory.Parabola.AxisOfRotation 控制计算 Trajectory.Parabola.RotateCoord 的转轴。随单位朝向或目标位置到源位置的向量旋转。

rulesmd.ini

[SOMEPROJECTILE]                                ; Projectile
Trajectory=Parabola                             ; Trajectory type
Trajectory.Parabola.DetonationDistance=0.4      ; floating point value
Trajectory.Parabola.TargetSnapDistance=0.5      ; floating point value
Trajectory.Parabola.OpenFireMode=Speed          ; ParabolaFireMode value enumeration (Speed|Height|Angle|SpeedAndHeight|HeightAndAngle|SpeedAndAngle)
Trajectory.Parabola.ThrowHeight=600             ; integer
Trajectory.Parabola.LaunchAngle=30              ; floating point value
Trajectory.Parabola.LeadTimeCalculate=no        ; boolean
Trajectory.Parabola.DetonationAngle=-90.0       ; floating point value
Trajectory.Parabola.DetonationHeight=-1         ; integer
Trajectory.Parabola.BounceTimes=0               ; integer
Trajectory.Parabola.BounceOnWater=no            ; boolean
Trajectory.Parabola.BounceDetonate=no           ; boolean
Trajectory.Parabola.BounceAttenuation=0.8       ; floating point value
Trajectory.Parabola.BounceCoefficient=0.8       ; floating point value
Trajectory.Parabola.OffsetCoord=0,0,0           ; integer - Forward,Lateral,Height
Trajectory.Parabola.RotateCoord=0               ; floating point value
Trajectory.Parabola.MirrorCoord=yes             ; boolean
Trajectory.Parabola.UseDisperseBurst=no         ; boolean
Trajectory.Parabola.AxisOfRotation=0,0,1        ; integer - Forward,Lateral,Height

备注

  • 与原有的 Arcing 相比,它还可以用于战机和空爆武器。

  • 当然,Gravity 仍会影响弹道。

使抛射体被陆地或水域阻挡

  • 现在可以通过将 SubjectTo(Land/Water) 分别设为 true 以使抛射体将陆地或水域视为阻挡其路径的障碍物。发射此类抛射体的武器将把这些障碍物阻挡的目标视为超出射程并尝试重新移动自己的位置以便在不受这些障碍阻挡的情况下开火。如果 SubjectTo(Land/Water).Detonate 设置为 true,那么抛射体设法与上述障碍交叠时将会爆炸。

    • 默认情况下 Level=true 的抛射体在非水域的地块上爆炸,但不会将这些地块视为真正的障碍物。通过设置这些标签可以覆盖此行为。

  • SubjectToGround 用于避免抛射体穿地而过,如果将它设为 true 那么开火者会将所在高度低于开火位置下方地面高度的目标视为超出射程并调整自身所在位置以能够开火。由于技术原因,该功能对空军和建筑无效。在 OpenTopped=true 的载具内开火的科技类型也不会受到影响。

rulesmd.ini

[SOMEPROJECTILE]              ; Projectile
SubjectToLand=                ; boolean
SubjectToLand.Detonate=true   ; boolean
SubjectToWater=               ; boolean
SubjectToWater.Detonate=true  ; boolean
SubjectToGround=false         ; boolean

归返武器

  • 现在可以通过设置 ReturnWeapon 使一个已爆炸的抛射体(以类似于 AirburstWeaponShrapnelWeapon 的方式)发射另一个武器和抛射体返回到发射者。如果发射者在初始抛射体引爆前死亡则 ReturnWeapon 不会发射。

    • ReturnWeapon.ApplyFirepowerMult 决定归返武器的伤害是否受益于科技类型所拥有的火力加成。

rulesmd.ini

[SOMEPROJECTILE]                        ; Projectile
ReturnWeapon=                           ; WeaponType
ReturnWeapon.ApplyFirepowerMult=false   ; boolean

超级武器

AI 超级武器发射延迟

  • 默认情况下 AI 所属方只检查它是否拥有能够发射的超级武器并在 106 到 112 个游戏帧的随机间隔内发射它们。这一行为现在可以自定义设置为明确的间隔时间或予以禁用。0 及更小的值会禁用间隔并导致 AI 所属方每帧检查超级武器。

rulesmd.ini

[General]
AISuperWeaponDelay=  ; integer, game frames

超级武器的辅助单位和科技等级限制

  • SW.AuxTechnos 指定了在没有它们时超武无法变得可用的辅助单位。玩家至少拥有这些单位中的一种才能获得该超武的使用权。

  • SW.NegTechnos 指定了在存在它们时超武会变得不可用的否决单位,超武仅在玩家没有这些单位中的任意一种时才能变得可用。

  • SW.TechLevel 指定了所属方为了能用该超武所不能低于的科技等级。超武仅在玩家所属方的科技达到这一等级时才能变得可用。

rulesmd.ini

[SOMESW]        ; SuperWeaponType
SW.AuxTechnos=  ; List of TechnoTypes
SW.NegTechnos=  ; List of TechnoTypes
SW.TechLevel=0  ; integer

备注

SW.TechLevel 并不以 -1 为特殊值。如果你想要限制一个超级武器仅 AI 玩家可用,请使用 SW.AllowPlayerSW.AllowAI

单位转换超武

  • 现在弹头可以将受影响单位的科技类型更改为同大类的其他科技类型(步兵到步兵,车辆到车辆,战机到战机)。

    • ConvertN.From(此处 N 为 0, 1, 2…)指定哪些科技类型可用于转换。此条目可以列出许多类型以一次全部转换。当没有包含任何类型时将影响所有有效目标。

    • ConvertN.To 指定转换后的科技类型。

    • ConvertN.AffectsHouse 指定哪些所属方的单位可以被转换。

    • 若只指定一组转换则 Convert.FromConvert.ToConvert.AffectsHouse(不带序号)相当于 Convert0.FromConvert0.ToConvert0.AffectsHouse的别称。

    • 转换影响被指定的 所有 当前存在的科技类型,包括处于运输工具中的、驻扎在建筑内的、处于 InfantryAbsorb=yesUnitAbsorb=yes 的建筑中的、正在 Bunker=yes 建筑里的。

例如,这个超级武器可以将所有被影响的己方和友方 SOLDIERASOLDIERB 转换为 NEWSOLDIER

[ExampleSW]
Convert.From=SOLDIERA,SOLDIERB
Convert.To=NEWSOLDIER
Convert.AffectsHouse=team

rulesmd.ini

[SOMESW]                        ; SuperWeaponType
ConvertN.From=                  ; List of TechnoTypes
ConvertN.To=                    ; TechnoType
ConvertN.AffectsHouse=owner     ; List of Affected House Enumeration (none|owner/self|allies/ally|team|enemies/enemy|all)
; where N = 0, 1, 2, ...
; or
Convert.From=                   ; List of TechnoTypes
Convert.To=                     ; TechnoType
Convert.AffectsHouse=owner      ; List of Affected House Enumeration (none|owner/self|allies/ally|team|enemies/enemy|all)

警告

此功能与 Ares 的单位转换 存在同样的限制。此功能不支持建筑类型。

警告

此功能需要 3.0 及以上版本的 Ares!如果未检测到 Ares 3.0+,单位的某些属性可能不会被更新。

自定义超级武器所在栏

  • 现在你可以通过 TabIndex 将超级武器的图标分配到侧边栏的任意标签页下。

    • 有效值为:0(建筑栏)、1(防御栏)、2(步兵栏)、3(载具栏)。

rulesmd.ini

[SOMESW]    ; SuperWeaponType
TabIndex=1  ; integer

EMPulse 设置

  • 可以通过设置 EMPulse.WeaponIndex 来自定义具有 EMPulseCannon=true 的建筑在发射其所关联的 Type=EMPulse 类超级武器时(EMPulse.TargetSelf=false 或省略时)所使用的武器。

    • 注意如果在同一个建筑发射第一种武器前发射另一种具有不同武器索引的 Type=EMPulse 超级武器那么较晚者的设置将优先生效。

    • 此外由于技术限制目前除非手动列出了 SW.RangeMinimumSW.RangeMaximum 否则始终默认使用主武器的 Range/MinimumRange 执行瞄准限制。

  • 现在如果发射的超级武器拥有 EMPulse.SuspendOthers=true 那么在第一个建筑发射之前,所有其他可以由同一建筑发射的 Type=EMPulse 超级武器将被暂停直到第一个建筑发射完毕。

rulesmd.ini

[SOMESW]                     ; SuperWeaponType
EMPulse.WeaponIndex=0        ; integer, weapon slot index
EMPulse.SuspendOthers=false  ; boolean

备注

Type=EMPulse 超级武器及其任何关联标签是 Ares 功能

虚拟投放

  • 现在超级武器可以在地图外投放与在场上时表现一致的建筑。

    • LimboDelivery.Types 是超级武器发射时将创建的建筑类型列表。与超级武器的 Type 和坐标无关。

    • LimboDelivery.IDs 是分配给建筑的数字 ID列表。这是虚拟击杀功能所必需的。

  • 创建的建筑不受地图上任何威胁的影响。从游戏中移除它们的唯一方法是使用设置了 LimboKill.IDs 的超级武器。

    • LimboKill.AffectsHouse 设置那个所属方受此效果影响。

    • LimboKill.IDs 是建筑 ID列表,这些建筑将被立即从游戏中移除。

    • LimboKill.Counts 设置每种类型的建筑将被移除的数量。如果一个 LimboKill.IDs 列表中的值在此列表有对应项则使用此处设置的值,否则按无数量限制进行移除。若此列表留空则所有类型均无数量限制。

  • 使用这些标签可以使投放变得随机。游戏将根据每个提供的 “掷骰子” 概率随机选择列表中的一个建筑。

    • LimboDelivery.RollChances 是 “掷骰子” 发生的概率列表。有效值的范围为 0%(从不发生)到 100%(总是发生)。默认为单次必出。

    • LimboDelivery.RandomWeightsN 是每个 “掷骰子” 发生概率的权重列表。有效值为 0(从不发生)到 100%(总是发生)。RandomWeightsRandomWeights0 的有效别名。如果掷骰尝试没有指定权重,则使用最后一个权重。

备注

  • 此功能可能不支持所有建筑标签。以下列出了已确认可正常工作的标签:

    • FactoryPlant

    • OrePurifier

    • SpySat

    • KeepAlive (Ares 3.0)

    • Prerequisite、PrerequisiteOverride、Prerequisite.List# (Ares 0.1)、Prerequisite.Negative (Ares 0.1)、GenericPrerequisites (Ares 0.1)

    • SuperWeapon、SuperWeapon2、SuperWeapons (Ares 0.9)、SW.AuxBuildings (Ares 0.9)、SW.NegBuildings (Ares 0.9)

  • 为使此功能与 AITriggerTypes 条件(“拥有者拥有?” 和 “敌人拥有?”)一起工作,LegalTarget 必须设置为 true。

rulesmd.ini

[SOMESW]                        ; SuperWeaponType
LimboDelivery.Types=            ; List of BuildingTypes
LimboDelivery.IDs=              ; List of numeric IDs, -1 cannot be used
LimboDelivery.RollChances=      ; List of percentages
LimboDelivery.RandomWeightsN=   ; List of integers
LimboKill.AffectsHouse=self     ; Affected House Enumeration (none|owner/self|allies/ally|team|enemies/enemy|all)
LimboKill.IDs=                  ; List of numeric IDs
LimboKill.Counts=               ; List of integers

警告

谨记虚拟投放的建筑并不真实存在于地图上!这意味着它们不应启用需要与游戏战场内交互的机制(例如工厂、克隆、维修厂、停机坪)。它们还 应该设为 KeepAlive=no 或者可以被虚拟击杀 - 否则游戏永远不会结束。

联动超武

  • 超级武器现在可以通过 SW.Link 设置一个联动超武列表,当原超级武器被发射时列表中的联动超武将被授予或强写计时器。

  • SW.Link.Grant 允许像核弹箱子那样为没有该超武的玩家授予一次使用权。

  • SW.Link.Ready 指定是否将被联动超武的计时器强写为就绪状态。

  • SW.Link.Reset 指定是否将被联动超武的计时器强写以进行重置。优先级高于 SW.Link.Ready

    • 对于一个被授予的超武:

      1. 检查 SW.Link.Reset 以确认是否需要被重置。

      2. 若为 false,检查 SW.Link.Ready 以确认是否需要被设为就绪。

      3. 若为 false,则初始状态由被授予超武自身的 SW.InitialReady 决定。

  • Message.LinkedSWAcquired 将在至少有一个联动超武被授予或强写计时器时显示给发射者。

  • EVA.LinkedSWAcquired 将在至少有一个联动超武被授予或强写计时器时播放给发射者。

  • 使用这些标签可以使这些超武变得随机。游戏将根据每个提供的 “掷骰子” 概率随机选择列表中的一个建筑。

    • SW.Link.RollChances 是 “掷骰子” 发生的概率列表。有效值的范围为 0%(从不发生)到 100%(总是发生)。默认为单次必出。

    • SW.Link.RandomWeightsN 是每个 “掷骰子” 发生概率的权重列表。有效值为 0(从不发生)到 100%(总是发生)。RandomWeightsRandomWeights0 的有效别名。如果掷骰尝试没有指定权重,则使用最后一个权重。

rulesmd.ini

[SOMESW]                     ; SuperWeaponType
SW.Link=                     ; List of SuperWeaponTypes
SW.Link.Grant=false          ; boolean
SW.Link.Ready=               ; boolean, default to SW.InitialReady for granted superweapons, false otherwise
SW.Link.Reset=false          ; boolean
SW.Link.RollChances=         ; List of percentages.
SW.Link.RandomWeightsN=      ; List of integers.
Message.LinkedSWAcquired=    ; CSF entry key
EVA.LinkedSWAcquired=        ; EVA entry

Next

图像 虚幻 中通过 SW.Next 将多个 ChronoSphere 与 ChronoWarp 类型的超武组成链式超武系统

  • 现在超级武器可以向同一目标地点发射其他超级武器。发射的类型可以使用与虚拟投放相同的规则进行随机化(见上文)。

    • SW.Next.RealLaunch 控制发射初始超级武器的所有者是否必须拥有所列出的超级武器和足够 Money.Amout 的资金来支持。否则强制发射。

    • SW.Next.IgnoreInhibitors 设置是否忽略每个超级武器的 SW.InhibitorsSW.AnyInhibitor,否则只有未被抑制的超级武器会被发射。

    • SW.Next.IgnoreDesignators 设置是否忽略每个超级武器的 SW.DesignatorsSW.AnyDesignator

  • 使用这些标签可以使这些超武变得随机。游戏将根据每个提供的 “掷骰子” 概率随机选择列表中的一个建筑。

    • SW.Next.RollChances 是 “掷骰子” 发生的概率列表。有效值的范围为 0%(从不发生)到 100%(总是发生)。默认为单次必出。

    • SW.Next.RandomWeightsN 是每个 “掷骰子” 发生概率的权重列表。有效值为 0(从不发生)到 100%(总是发生)。RandomWeightsRandomWeights0 的有效别名。如果掷骰尝试没有指定权重,则使用最后一个权重。

rulesmd.ini

[SOMESW]                        ; SuperWeaponType
SW.Next=                        ; List of SuperWeaponTypes
SW.Next.RealLaunch=true         ; boolean
SW.Next.IgnoreInhibitors=false  ; boolean
SW.Next.IgnoreDesignators=true  ; boolean
SW.Next.RollChances=            ; List of percentages.
SW.Next.RandomWeightsN=         ; List of integers.

在目标单元格处引爆弹头或武器

  • 现在任何超级武器都可以在超级武器的目标单元格处引爆弹头或武器。

    • 如果同时拥有 Detonate.WarheadDetonate.Weapon,那么后者优先。

    • Detonate.Warhead.Full 可用于设置弹头是否在目标上完全引爆(作为虚拟武器的一部分)或者只能对所在区域造成杀伤并应用 Phobos 的弹头效果

    • Detonate.Damage 如果未设置则默认为 Detonate.WeaponDamage,对于 Detonate.Warhead 则是 0。

    • 武器和弹头的行为就像由发射超级武器的建筑所发射的一样。这尊重诸如 SW.RangeMinimum/Maximum 之类的控制语句(在这方面类似于 Ares 的 GenericWarhead 超级武器)。即便找不到发射建筑也仍会使用超级武器所属于的所属方来造成伤害并应用 Phobos 引入的弹头效果。

    • 如果 Detonate.AtFirer 设置为 true,那么武器或弹头将在发射建筑上而不是超级武器的目标单元格处引爆。如果找不到发射建筑则不会引爆。

rulesmd.ini

[SOMESW]                    ; SuperWeaponType
Detonate.Warhead=           ; WarheadType
Detonate.Warhead.Full=true  ; boolean
Detonate.Weapon=            ; WeaponType
Detonate.Damage=            ; integer
Detonate.AtFirer=false      ; boolean

科技类型

侵略性移动攻击命令

  • AttackMove.Aggressive 允许你的单位在执行移动攻击(Ctrl+Shift)任务时主动攻击敌方的无武装建筑。

  • AttackMove.UpdateTarget 允许你的单位在执行移动攻击(Ctrl+Shift)任务时自动切换威胁值更高的目标。

rulesmd.ini

[General]
AttackMove.Aggressive=false    ; boolean
AttackMove.UpdateTarget=false  ; boolean

[SOMETECHNO]                   ; TechnoType
AttackMove.Aggressive=         ; boolean, default to [General] -> AttackMove.Aggressive
AttackMove.UpdateTarget=       ; boolean, default to [General] -> AttackMove.UpdateTarget

移动攻击 - 获取目标时的行为

  • 现在你可以用 AttackMove.StopWhenTargetAcquired 来让移动攻击的单位在发现敌人后停止移动,就像《星际》和《魔兽》中那样。

    • 此功能用于避免单位在执行移动攻击命令时冲锋过猛而暴毙。

  • 你也可以使用 AttackMove.PursuitTarget 来让它们继续追击已锁定的单个目标。

    • 此功能对于基洛夫空艇这样的近战单位很有用。

rulesmd.ini

[General]
AttackMove.StopWhenTargetAcquired=         ; boolean

[SOMETECHNO]                               ; TechnoType
AttackMove.StopWhenTargetAcquired=         ; boolean, default to [General] -> AttackMove.StopWhenTargetAcquired if set, inverse of OpportunityFire otherwise.
AttackMove.PursuitTarget=                  ; boolean

备注

  1. 许多单位在执行移动攻击命令时本就有一个发现敌人后停止移动的行为,这与 AttackMove.StopWhenTargetAcquired 无关。

  2. 一些单位(例如 Jumpjet 类)在原版移动攻击命令下无法正常开火。具体原因不明,但该功能可以解决此问题。

  3. 设置了 AttackMove.StopWhenTargetAcquired=true 的 Jumpjet 单位会立即停止并且不会分散到某个单元格上。这是有意如此设计的。

移动攻击 - 跟随

  • 现在你可以让某些单位在执行移动攻击命令时跟随周围的单位。此跟随行为相当于跟随命令([Ctrl]+[Alt])的效果。

    • 使用 AttackMove.Follow.IncludeAir 来决定是否跟随空中单位。

    • 设置了 AttackMove.Follow.IfMindControlIsFull=true 的心灵控制单位在达到心控数量上限时会进行跟随。

  • 此功能对用于医疗和维修的支援类单位应该很有用。

rulesmd.ini

[SOMETECHNO]                                     ; TechnoType
AttackMove.Follow=false                          ; boolean
AttackMove.Follow.IncludeAir=false               ; boolean
AttackMove.Follow.IfMindControlIsFull=false      ; boolean

移动攻击 - 无武器单位

  • 在原版,没有武器的单位无法执行移动攻击命令。现在你可以通过 AttackMove.IgnoreWeaponCheck=true 来禁用这一硬编码行为。

    • 无武器单位无法真正执行移动攻击行为。此功能是避免你同时选中无武器单位和其他单位的情况下移动攻击指针被禁用的。

rulesmd.ini

[General]
AttackMove.IgnoreWeaponCheck=false    ; boolean

攻击无威胁建筑(单位定义)

  • 现在你可以自由地设置单位能否自动瞄准无威胁的建筑物。

    • AutoTarget.NoThreatBuildings 控制玩家操作的单位,AutoTargetAI.NoThreatBuildings 控制其他(由 AI 操作的)单位。

rulesmd.ini

[General]
AutoTarget.NoThreatBuildings=false      ; boolean
AutoTargetAI.NoThreatBuildings=true     ; boolean

自定义子机发射器

图像 幻想奇遇 中的有限追击范围子机

  • 如果设置 Spawner.LimitRange 则子机将在敌人超出子机发射器武器 Range 设定的最大值范围后停止追击。

    • Spawner.ExtraLimitRange 是追击范围相对于武器射程进行调整的参量。

  • Spawner.DelayFrames 可用于设置每次从子机发射器中生成单位的最小游戏帧数。对于导弹默认是 9 帧,其他默认是 20 帧。

  • 如果 Spawner.AttackImmediately 设为 true,战机子机将在生成后立即执行攻击任务而不是先等待其余战机生成和集结。

  • 若启用 Spawner.UseTurretFacing 则子机发射器单位拥有炮塔时子机生成时的初始方向使用炮塔方向而非车体方向。

  • Spawner.RecycleRange 决定子机在距离母舰多少格以内可以被进行回收。

  • Spawner.RecycleAnim 用于设置回收时在子机位置播放的动画。如果列出了多个动画,则将随机选择一个。

  • Spawner.RecycleCoord 定义了子机将要前往母舰的哪个位置。

    • Spawner.RecycleOnTurret 定义这个位置是否相对于炮塔而非车体。

rulesmd.ini

[SOMETECHNO]                       ; TechnoType
Spawner.LimitRange=false           ; boolean
Spawner.ExtraLimitRange=0          ; integer, range in cells
Spawner.DelayFrames=               ; integer, game frames
Spawner.AttackImmediately=false    ; boolean
Spawner.UseTurretFacing=false      ; boolean
Spawner.RecycleRange=-1            ; floating point value, range in cells
Spawner.RecycleAnim=               ; List of AnimationTypes
Spawner.RecycleCoord=0,0,0         ; integer - Forward,Lateral,Height
Spawner.RecycleOnTurret=false      ; boolean

备注

如果你设置了回收的 FLH,那么最好一并设置一个至少为 0.5 格的回收范围。否则子机发射器可能无法正确回收子机。

基于弹药量的自动变形

  • 单位现在可以根据弹药量转换成另一种单位

  • Ammo.AutoConvertMinimumAmount 决定触发自动变形的最小弹药量。

  • Ammo.AutoConvertMaximumAmount 决定触发自动变形的最大弹药量。

  • Ammo.AutoConvertType 指定变形成哪个新单位。该单位必须与原单位同属一类(载具变载具,步兵变步兵,战机变战机)。

  • 设为负数将会禁用弹药数量检查,当两个检查都被禁用时将不会触发变形。

rulesmd.ini

[SOMETECHNO]                      ; TechnoType, before conversion
Ammo.AutoConvertMinimumAmount=-1  ; integer
Ammo.AutoConvertMaximumAmount=-1  ; integer
Ammo.AutoConvertType=             ; TechnoType, after conversion

警告

此功能与 Ares 的单位转换 存在同样的限制。此功能不支持建筑类型。

警告

此功能需要 3.0 及以上版本的 Ares!如果未检测到 Ares 3.0+,单位的某些属性可能不会被更新。

自动删除乘客

  • 运输工具可以随时间删除乘客。乘客将按照进入运输工具顺序的先后被删除。

    • PassengerDeletion.Rate 决定删除单个乘客所需的游戏帧数。

      • 如果 PassengerDeletion.Rate.SizeMultiply 设为 true 则此时间间隔将乘算乘客的 Size

    • 如果 PassengerDeletion.UseCostAsRate 设为 true 则删除乘客的间隔将基于乘客的 Cost 计算。这不考虑 FactoryPlant 等修正。

      • PassengerDeletion.CostMultiplier 可用于设置基于成本的时间间隔倍率。

      • PassengerDeletion.CostRateCap 可用于设置基于成本计算的时间间隔上限。

    • PassengerDeletion.AllowedHouses 决定了哪些所属方的乘客会被删除。

    • 如果 PassengerDeletion.DontScore 设为 true 则删除的乘客不会被视为被运输工具击杀(没有经验,不会计入所属方击杀数等)。

    • 如果 PassengerDeletion.Soylent 设为 true 则会向运输工具的所有者返还一定数量的资金。具体金额由乘客的 Soylent 决定,若未设置则由 Cost 决定(这里可受到 FactoryPlant 等修正的影响)。

      • PassengerDeletion.SoylentMultiplier 是直接应用于返还资金的倍率。

      • PassengerDeletion.SoylentAllowedHouses 决定了哪些所属方的乘客会造成资金返还。

      • PassengerDeletion.DisplaySoylent 可设为 true 以在运输工具上显示返还的资金金额。PassengerDeletion.DisplaySoylentToHouses 决定了哪些所属方可以看到此消息,PassengerDeletion.DisplaySoylentOffset 可用于调整显示坐标偏移。

    • PassengerDeletion.ReportSoundPassengerDeletion.Anim 可用于分别指定在删除乘客时播放的声音和动画。如果列出了多个动画,则将随机选择一个。

    • 如果 PassengerDeletion.UnderEMP 设为 true 则在运输工具受 EMP 影响或瘫痪时继续执行删除操作。

rulesmd.ini

[SOMETECHNO]                                    ; TechnoType
PassengerDeletion.Rate=0                        ; integer, game frames
PassengerDeletion.Rate.SizeMultiply=true        ; boolean
PassengerDeletion.UseCostAsRate=false           ; boolean
PassengerDeletion.CostMultiplier=1.0            ; floating point value, percents or absolute
PassengerDeletion.CostRateCap=                  ; integer, game frames
PassengerDeletion.AllowedHouses=all             ; Affected House Enumeration (none|owner/self|allies/ally|team|enemies/enemy|all)
PassengerDeletion.DontScore=false               ; boolean
PassengerDeletion.Soylent=false                 ; boolean
PassengerDeletion.SoylentMultiplier=1.0         ; floating point value, percents or absolute
PassengerDeletion.SoylentAllowedHouses=enemies  ; Affected House Enumeration (none|owner/self|allies/ally|team|enemies/enemy|all)
PassengerDeletion.DisplaySoylent=false          ; boolean
PassengerDeletion.DisplaySoylentToHouses=All    ; Affected House Enumeration (none|owner/self|allies/ally|team|enemies/enemy|all)
PassengerDeletion.DisplaySoylentOffset=0,0      ; X,Y, pixels relative to default
PassengerDeletion.ReportSound=                  ; Sound entry
PassengerDeletion.Anim=                         ; List of AnimationTypes
PassengerDeletion.UnderEMP=false                ; boolean

自动同步载员所属方

  • 如果运输工具的 Passengers.SyncOwner 设为 true 则当运输工具的所有者发生改变那么其载员的所有者也将会更改以与运输工具同步。

    • 对于 OpenTopped=true 的运输工具这还将禁用在运输工具暂时被心灵控制时阻止载员对目标进行攻击的检查。

    • 如果 Passengers.SyncOwner.RevertOnExit 设为 true(默认行为),当载员被弹出时,其所属方将恢复为载员进入时所属方。

    • 不适用于通过 Abductor=true 武器(Ares 功能)获取的载员。

rulesmd.ini

[SOMETECHNO]                            ; TechnoType
Passengers.SyncOwner=false              ; boolean
Passengers.SyncOwner.RevertOnExit=true  ; boolean

自动发射武器

  • 现在你可以设置 AutoTargetOwnPosition 使科技类型根据 AutoTargetOwnPosition.Self 选择当前单元格或开火者自身自动发射其武器而无需检索一个合适的目标。

rulesmd.ini

[SOMETECHNO]                            ; TechnoType
AutoTargetOwnPosition=false             ; boolean
AutoTargetOwnPosition.Self=false        ; boolean

备注

为了让该逻辑正常工作,你需要确保单位上没有设置 CanPassiveAquire=false 等阻止索敌的语句。

建造限制组

  • 现在你可以使不同的科技类型在一个组内共享建造限制。

  • BuildLimitGroup.Types 决定了将用于所选科技类型建造条件的其他科技类型。注意该语句并不提供任何限制效果。要实现这点你需要手动位每个科技类型设置建造限制。

  • BuildLimitGroup.Nums 决定了将达到建造限制的数量。如果使用单个整数,则使用组内所有科技类型的数量来计算建造限制。如果使用与 BuildLimitGroup.Types 数量相同的整数列表,则会为每个科技类型计算建造限制,其值的位置与 BuildLimitGroup.Types 中的位置对应。

  • BuildLimitGroup.Factor 决定了每个此类科技类型在计算建造限制时将被视为多少来进行计算(类似一个用于 BuildLimitSize)。

    • 这仅由 BuildLimitGroup 使用。其他地方不会使用它来计算,包括 BuildLimitGroup.ExtraLimit

  • BuildLimitGroup.ContentIfAnyMatch 决定其建造限制的计算规则。如果设置为 true,则当组内任意科技类型的数量达到其 BuildLimitGroup.Nums 值时视为全组达到建造限制。如果设置为 false,则只有当组内所有科技类型的数量达到时建造限制才有效。

  • BuildLimitGroup.NotBuildableIfQueueMatch 决定了禁用科技类型生产的时刻,如果设为 true 则已存在的科技类型与处于生产序列中的科技类型之和满足条件就会停止生产。如果设为 false 则只有地图上实际存在的科技类型满足条件才会停止生产。

  • 你还可以根据其所属方拥有的特定科技类型数量向 BuildLimitGroup.Nums 添加一个额外调整值。

    • BuildLimitGroup.ExtraLimit.Types 决定了将用于额外值计算的科技类型。

    • BuildLimitGroup.ExtraLimit.Nums 决定了其额外值的增量。与 BuildLimitGroup.ExtraLimit.Types 中对应位置的科技类型一一对应。每个列表中的科技类型会使建造限制增加其场上存在的数量 * 该列表中对应值。

    • BuildLimitGroup.ExtraLimit.MaxCount 决定了会被用于计算额外值的科技类型会被计入的最大数量。与 BuildLimitGroup.ExtraLimit.Types 中对应位置的科技类型一一对应。如果未设置或设为小于 1 的值,则视为无最大数量限制。

    • BuildLimitGroup.ExtraLimit.MaxNum 决定了在计算额外值后 BuildLimitGroup.Nums 的最大值。如果未设置或设为小于 1 的值,则视为无最大值。

rulesmd.ini

[SOMETECHNO]                                    ; TechnoType
BuildLimitGroup.Types=                          ; List of TechnoTypes
BuildLimitGroup.Nums=                           ; integer, or a List of integers
BuildLimitGroup.Factor=1                        ; integer
BuildLimitGroup.ContentIfAnyMatch=false         ; boolean
BuildLimitGroup.NotBuildableIfQueueMatch=false  ; boolean
BuildLimitGroup.ExtraLimit.Types=               ; List of TechnoTypes
BuildLimitGroup.ExtraLimit.Nums=                ; List of integers
BuildLimitGroup.ExtraLimit.MaxCount=            ; List of integers
BuildLimitGroup.ExtraLimit.MaxNum=0             ; integer

根据操作者变形

  • 现在你可以在操作者从人类改为 AI 玩家或从 AI 玩家改为人类玩家时执行单位转换。

rulesmd.ini

[SOMETECHNO]                ; TechnoType
Convert.HumanToComputer=    ; TechnoType
Convert.ComputerToHuman=    ; TechnoType

染色

  • 通过设置 Tint.ColorTint.Intensity 可以为拥有护盾的科技类型使用类似于铁幕/力场护盾或 Psychedelic=true 弹头的染色效果。

    • Tint.Intensity 是增加/减少的光照,1.0 是默认的对象光照。

    • Tint.VisibleToHouses 可用于自定义哪些所属方可见这些染色效果。

    • 染色效果也可以通过 Attach Effect护盾 应用。

rulesmd.ini

[SOMETECHNO]              ; TechnoType
Tint.Color=               ; integer - Red,Green,Blue
Tint.Intensity=0.0        ; floating point value
Tint.VisibleToHouses=all  ; List of Affected House Enumeration (none|owner/self|allies/ally|team|enemies/enemy|all)

自定义镭射幽浮吸取

  • 可以单位微观定义吸取逻辑的属性。

    • DrainMoneyDisplayDrainMoneyDisplay.OnTarget 分别决定吸取金额是否会在开火者和目标上显示。

    • DrainMoneyDisplay.Houses 决定哪些所属方可以看到资金显示。

    • DrainMoneyDisplay.Offset 是资金显示中心的额外像素偏移量,默认为 0,0 即开火者的中心。

    • DrainMoneyDisplay.OnTarget.UseDisplayIncome 决定目标单位上的吸取金额是否使用期自身的 DisplayIncome.HousesDisplayIncome.Offset 设置。若设为 false 则遵循开火者的 DisplayIncome.HousesDisplayIncome.Offset 设置

rulesmd.ini

[AudioVisual]
DrainMoneyDisplay=false                             ; boolean
DrainMoneyDisplay.Houses=all                        ; List of Affected House Enumeration (none|owner/self|allies/ally|team|enemies/enemy|all)
DrainMoneyDisplay.OnTarget=false                    ; boolean
DrainMoneyDisplay.OnTarget.UseDisplayIncome=true    ; boolean

[SOMETECHNO]                                        ; TechnoType
DrainMoneyFrameDelay=                               ; integer, default to [CombatDamage] -> DrainMoneyFrameDelay
DrainMoneyAmount=                                   ; integer, default to [CombatDamage] -> DrainMoneyAmount
DrainAnimationType=                                 ; AnimationType, default to [CombatDamage] -> DrainAnimationType
DrainMoneyDisplay=                                  ; boolean, default to [AudioVisual] -> DrainMoneyDisplay
DrainMoneyDisplay.Houses=                           ; List of Affected House Enumeration (none|owner/self|allies/ally|team|enemies/enemy|all), default to [AudioVisual] -> DrainMoneyDisplay.Houses
DrainMoneyDisplay.Offset=0,0                        ; X,Y, pixels relative to default
DrainMoneyDisplay.OnTarget=                         ; boolean, default to [AudioVisual] -> DrainMoneyDisplay.OnTarget
DrainMoneyDisplay.OnTarget.UseDisplayIncome=        ; boolean

自定义 OpenTopped 属性

  • 现在你可以为每个科技类型微观设定全局 OpenTopped 运输工具的属性。

  • OpenTopped.IgnoreRangefinding 可用于禁用 OpenTopped 运输工具在接近超出射程的目标和扫描潜在目标时使用运输工具与所有载员之间的 Range 最小武器的射程这一测距行为。

  • OpenTopped.AllowFiringIfDeactivated 可用于自定义当运输工具被瘫痪(EMP、PoweredUnit 等)时载员是否可以开火。

  • OpenTopped.ShareTransportTarget 控制运输工具的当前目标是否传递给乘客。

  • 你还可以通过 OpenTransport.RangeBonus/DamageMultiplier 为运输工具内的乘客单独定义射程加成与伤害倍率,该设置独立于运输工具的 OpenTopped.RangeBonus/DamageMultiplier 生效。

  • OpenTopped.DecloakToFire 可自定义 OpenTopped 的运输工具是否必须解除隐形才能使其乘客开火。

rulesmd.ini

[General]
OpenTopped.AllowFiringIfAttackedByLocomotor=true  ; boolean
OpenTopped.DecloakToFire=true                     ; boolean

[SOMETECHNO]                                      ; TechnoType, transport with OpenTopped=yes
OpenTopped.RangeBonus=                            ; integer, default to [CombatDamage] -> OpenToppedRangeBonus
OpenTopped.DamageMultiplier=                      ; floating point value, default to [CombatDamage] -> OpenToppedDamageMultiplier
OpenTopped.WarpDistance=                          ; integer, default to [CombatDamage] -> OpenToppedWarpDistance
OpenTopped.IgnoreRangefinding=false               ; boolean
OpenTopped.AllowFiringIfDeactivated=true          ; boolean
OpenTopped.AllowFiringIfAttackedByLocomotor=      ; boolean, defaults to [General] -> OpenTopped.AllowFiringIfAttackedByLocomotor
OpenTopped.ShareTransportTarget=true              ; boolean
OpenTopped.DecloakToFire=                         ; boolean, defaults to [General] -> OpenTopped.DecloakToFire

[SOMETECHNO]                                      ; TechnoType, passenger
OpenTransport.RangeBonus=0                        ; integer
OpenTransport.DamageMultiplier=1.0                ; floating point value

备注

乘客在 OpenTopped 载具中的主动寻敌范围不受这些射程加成值的影响。

自定义子机序列

  • 现在可以通过 Spawns.Queue 从子机发射器生成多种子机。该序列中的子机顺序即为其重新生成顺序。

    • 仍需设置 Spawns 以启用子机逻辑并作为默认子机。

    • 仍需设置 SpawnsNumber 以决定子机数量。

    • 如果队列长度超过子机发射器的 SpawnsNumber,超出部分的子机将被忽略。如果队列长度过短则剩余部分由 Spawns 定义的子机填补。因此建议将它们设为等长。

rulesmd.ini

[SOMETECHNO]        ; TechnoType
Spawns.Queue=       ; List of AircraftTypes, in order

警告

注意队列中的所有子机应当拥有相同的 MissileSpawn 值(均为 true 或均为 false)。混合使用会导致导弹类子机无法命中目标。

自定义 Ares 的雷达干扰逻辑

  • 现在可以自定义 Ares 雷达干扰逻辑的部分属性。

    • RadarJamHouses 决定哪些所属方会受到雷达干扰效果影响。

    • RadarJamDelay 决定干扰间隔,默认同 Ares 为 30。较短的间隔会使干扰生效更及时但会降低性能。

    • RadarJamAffect 决定哪些拥有 Radar=yesSpySat=yes 的建筑会受到干扰。如果为空则所有雷达建筑都会受到干扰。

    • RadarJamIgnore 决定哪些拥有 Radar=yesSpySat=yes 的建筑不受到干扰。

rulesmd.ini

[SOMETECHNO]                      ; TechnoType, with RadarJamRadius=
RadarJamHouses=enemies            ; List of Affected House Enumeration (none|owner/self|allies/ally|team|enemies/enemy|all)
RadarJamDelay=30                  ; integer
RadarJamAffect=                   ; List of BuildingTypes
RadarJamIgnore=                   ; List of BuildingTypes

自定义载具被击杀驾驶员时是否保留或杀死乘客

  • 现在可以自定义载具被 击杀驾驶员 时是否保留或杀死乘客了。

备注

当设置 DriverKilled.KeptPassengers=true 时乘客将总是被保留而无论 DriverKilled.KillPassengers 的设置,如果运输工具还拥有 OpenTopped=true 且未设置 OpenTopped.AllowFiringIfDeactivated=false,那么乘客将继续攻击他们原本正在攻击的目标,无论这个目标是从运输工具继承来的还是他们自己获取的。

rulesmd.ini

[CombatDamage]
DriverKilled.KillPassengers=false   ; boolean

[SOMETECHNO]                        ; TechnoType, transport
DriverKilled.KeptPassengers=false   ; boolean
DriverKilled.KillPassengers=        ; boolean, defaults to [CombatDamage] -> DriverKilled.KillPassengers

警告

如果设置了 DriverKilled.KeptPassengers=true,即便除被击杀的驾驶员外还有其他乘客可以被 Operator 匹配,运输工具也仍会更改所属方为治安并将任务更改为 Harmless,只是并不瘫痪或调整亮度。

  • 如果有新的乘客进入运输工具并且可被 Operator 匹配,那么将会正常更改所属方。

  • 该功能本是为一些特殊 OpenTopped 单位设计的,暂未对设计外的情况进行充分适配。

单位出售音效

  • 当建筑或单位被出售时将向所有者播放出售音效和 EVA 语音。这些设置以允许微观定义。

    • EVA.Sold 用于自定义出售时的 EVA 语音。

    • SellSound 用于自定义出售时的音效。

rulesmd.ini

[SOMETECHNO]    ; BuildingType or VehicleType
EVA.Sold=       ; EVA entry, default to EVA_StructureSold for buildings and EVA_UnitSold for vehicles
SellSound=      ; Sound entry, default to [AudioVisual] -> SellSound

备注

原版游戏中出售载具的 SellSound 是全局的。这已改为与建筑出售的 SellSound 保持一致。

禁用副武器自动推算

  • 现在如果 (Elite)Primary 武器无法对选定目标开火那么可以通过将 NoSecondaryWeaponFallback 设为 true(默认为 false)来禁用其尝试换用 (Elite)Secondary 武器。NoSecondaryWeaponFallback.AllowAA 控制对抛射体拥有 AA 且应对空中目标的情况。这不适用于总是选择 (Elite)Secondary 武器的特殊情况,包括但不限于以下几种:

    • OpenTransportWeapon=1 的单位在一个 OpenTopped=true 的运输工具内开火。

    • NoAmmoWeapon=1 的单位在 Ammo 大于 0 且当前弹药数量小于等于 NoAmmoAmount

    • 拥有 DeployFireWeapon=1IsSimpleDeployer=true 单位处于部署状态。

    • DrainWeapon=true 的武器应对敌方 Drainable=yes 的建筑。

    • 单位使用一个 Warhead 拥有 IsLocomotor=true 设置的 (Elite)Primary 应对建筑。

    • 对所有者或盟友的 Overpowerable=true 建筑使用 Warhead 拥有 ElectricAssault=true 设置的武器。

    • Overpowerable=true 的建筑当前处于过载状态。

    • 任何使用 (Elite)WeaponX 的系统也完全不受影响,例如 Gunner=trueIsGattling=true

  • 现在如果 [CombatDamage] -> AllowWeaponSelectAgainstWalls 设置为 true,假设 Primary 武器的弹头拥有 Wall=false,而 Secondary 武器拥有 Wall=true 且开火者没有将 NoSecondaryWeaponFallback 设为 true 那么 Secondary 将在应对墙时被使用。这可以在单位上微观定义以覆盖全局值。

rulesmd.ini

[CombatDamage]
AllowWeaponSelectAgainstWalls=false      ; boolean

[SOMETECHNO]                             ; TechnoType
NoSecondaryWeaponFallback=false          ; boolean
NoSecondaryWeaponFallback.AllowAA=false  ; boolean
AllowWeaponSelectAgainstWalls=           ; boolean, default to [CombatDamage] -> AllowWeaponSelectAgainstWalls

伪装逻辑增强

  • DisguiseBlinkingVisibility 可用于自定义哪些玩家可以看到单位的伪装闪烁。这不影响目标选择,但会影响军衔的可见性——闪烁的伪装意味着始终可见原单位的军衔而不是伪装单位的。

    • 另一个需要注意的是:在单人任务中,就伪装闪烁而言,任何被玩家所控制的所属方所拥有的伪装单位即便与玩家所属方不是盟友也视为当前玩家所拥有,这意味着玩家始终可以看到它们的伪装闪烁,除非 DisguiseBlinkingVisibility 设置为 noneenemies

  • UseDisguiseMovementSpeed 如果设置则在可行的情况下伪装单位将调整其移动速度以匹配伪装目标的速度。注意即使伪装被识破只要未被解除此设置就依旧生效。

rulesmd.ini

[General]
DisguiseBlinkingVisibility=owner  ; List of Affected House Enumeration (none|owner/self|allies/ally|team|enemies/enemy|all)

[SOMETECHNO]                      ; TechnoType
UseDisguiseMovementSpeed=false    ; boolean

不参与基地中心计算

  • 这可用于将科技类型从基地中心计算中排除(用于特定 AI 脚本和 AI 超武瞄准模式等)通常仅有建筑参与计算,但初始基地中心的确会计入所属方的初始单位,该设置对此也可生效。

rulesmd.ini

[SOMETECHNO]               ; TechnoType
IgnoreForBaseCenter=false  ; boolean

拓展的盖特掉档逻辑

  • 现在你可以自定义 RateDown 的一些效果。

    • RateDown.Delay 控制停火多少帧后才开始使用 RateDown 减少盖特计时器。

    • RateDown.Reset 控制当科技类型失去目标或更换目标时是否立即清空盖特计时器。

    • RateDown.Cover.Value 用于在科技类型的弹药低于 RateDown.Cover.AmmoBelow 时替代 RateDown 使用。

rulesmd.ini

[SOMETECHNO]                  ; TechnoType, with IsGattling=yes
RateDown.Delay=0              ; integer, game frames
RateDown.Reset=false          ; boolean
RateDown.Cover.Value=0        ; integer
RateDown.Cover.AmmoBelow=-2   ; integer

额外威胁

  • 现在你可以通过更多方式调整单位对目标所构成威胁的评估。这将有助于单位进行自动瞄准。

    • 当目标对单位构成威胁时,它将获得由 ExtraThreat.IsThreat 定义的额外威胁值。

      • 一般来说,“构成威胁”意味着目标能够向该单位开火。

      • 使用 AlwaysConsideredThreat 可使目标始终被视为威胁。

    • 当目标处于单位射程之内,它将获得 ExtraThreat.InRange 定义的额外威胁值。

    • 当目标处于单位射程之内,它将获得一个等同于 ExtraThreatCoefficient.InRangeDistance 乘算目标到该单位单元格距离的额外威胁值。

      • 只考虑处于射程之内的情景是因为原版 TargetDistanceCoefficientDefault 只考虑处于射程之外的情况。该语句是对其的补充。

    • 目标将获得一个等同于 ExtraThreatCoefficient.Facing 乘算该单位当前开火朝向到目标相对方向差值的额外威胁值。

      • “开火朝向”是指单位用于检查自己是否“已面向目标且可开火”的朝向。步兵开火不检查朝向,所以这也对步兵无效。

      • 朝向的单位是游戏内部数值比例。一个完整圆周对应 65536。

    • 目标将获得一个等同于 ExtraThreatCoefficient.DistanceToLastTarget 乘算目标与该单位上一个目标间单元格距离的额外威胁值。

      • 每个单位每帧都会将其当前目标记录为“上一个目标”。该记录在目标失效后最多保留 15 帧。

      • 如果单位没有“上一个目标”,则该项将不会生效。

rulesmd.ini

[General]
ExtraThreat.IsThreat=0.0                            ; double
ExtraThreat.InRange=0.0                             ; double
ExtraThreatCoefficient.InRangeDistance=0.0          ; double
ExtraThreatCoefficient.Facing=0.0                   ; double
ExtraThreatCoefficient.DistanceToLastTarget=0.0     ; double

[SOMETECHNO]                                        ; TechnoType
AlwaysConsideredThreat=false                        ; boolean
ExtraThreat.IsThreat=                               ; double, default to the flag in [General] with same name
ExtraThreat.InRange=                                ; double, default to the flag in [General] with same name
ExtraThreatCoefficient.InRangeDistance=             ; double, default to the flag in [General] with same name
ExtraThreatCoefficient.Facing=                      ; double, default to the flag in [General] with same name
ExtraThreatCoefficient.DistanceToLastTarget=        ; double, default to the flag in [General] with same name

Burst 开火坐标

  • 现在你可以通过使用 (Elite)(Prone/Deployed)PrimaryFire|SecondaryFire|WeaponX|FLH.BurstN 标签为拥有 Burst 的武器指定每个连发单独的开火坐标,具体取决于你的科技类型使用哪些武器。BurstN 中的 N 是从 0 开始的连发索引,这些值将按顺序解析,直到没有常规或精英武器的值为止,如果精英武器缺少值则默认使用常规武器的 FLH。如果特定连发索引缺少值,则使用基础标签(例如 PrimaryFireFLH)的值。

  • 特定连发索引使用的是不会根据连发索引而将 L 值镜像的绝对坐标。

artmd.ini

[SOMETECHNO]    ; TechnoType Image
FLHKEY.BurstN=  ; integer - Forward,Lateral,Height. FLHKey refers to weapon-specific FLH key name and N is zero-based burst shot index.

对特定目标使用特定武器

图像 C&C: Reloaded 中使用 ForceWeapon.Naval.Decloaked 的海军对水下目标行为

图像 C&C: Reloaded 中敌人使用 ForceWeapon.UnderEMP 攻击 EMP 状态目标的行为

  • 可用于覆盖正常的武器选择逻辑,以强制对特定目标使用特定武器。目标满足条件则按所列出规则的顺序使用第一个满足条件的规则。

    • ForceWeapon.Naval.Decloaked 强制指定对未隐形(下潜)状态 Naval=yes 的目标使用的武器。如果你的海军单位有一个武器仅用于水下目标另一个武器用于水面目标那么这个规则会很有用。

    • ForceWeapon.Cloaked 强制指定对隐形(下潜)状态目标使用的武器。

    • ForceWeapon.Disguised 强制指定针对伪装目标所使用的武器。

    • ForceWeapon.UnderEMP 强制指定对与被 EMP 瘫痪了的目标所使用的武器。

    • ForceWeapon.InRange 强制指定了一个当目标进入武器 Range 范围时的可选武器列表。如果 ForceWeapon.InRange.TechnoOnly 设为 true 则仅在目标为单位时才能像其他强制武器效果那样生效,否则在攻击空地时也会生效。该单位会按列表顺序选取首个符合条件的武器。在未设置 ForceAAWeapon.InRange 的情况下这同时用于地面和空中目标。

      • ForceAAWeapon.InRangeForceWeapon.InRange 的对空版本。当两个参数同时存在时 ForceWeapon.InRange 仅用于对地。

      • Force(AA)Weapon.InRange.Overrides 用于覆盖武器 Range 的数值参与武器选取。列表中的数值与 Force(AA)Weapon.InRange 中的武器序号一一对应,如果一个武器的对应的值小于 0 或不存在那么使用武器自身的 Range

      • 如果 Force(AA)Weapon.InRange.ApplyRangeModifiers 设为 true 则任何来自开火者的武器射程加成也将参与射程判定。

    • 一系列根据目标类型强制使用特定武器的标签:

      • ForceWeapon.Naval.Units 强制指定对 Naval=yes 的单位所使用的武器。优先级高于 ForceWeapon.Units

      • ForceWeapon.DefensesForceWeapon.Buildings 针对 BuildCat=Combat 类建筑目标的分离设置,不启用即沿用后者。

      • ForceWeapon.Infantry/Units/Aircraft 在未设置 ForceAAWeapon.Infantry/Units/Aircraft 时同时控制对空对地。

      • ForceAAWeapon.Infantry/Units/AircraftForceWeapon.Infantry/Units/Aircraft 的对空版本。当两个参数同时存在时后者仅用于对地。

rulesmd.ini

[SOMETECHNO]                                    ; TechnoType
ForceWeapon.Naval.Decloaked=-1                  ; integer, -1 to disable
ForceWeapon.Cloaked=-1                          ; integer, -1 to disable
ForceWeapon.Disguised=-1                        ; integer, -1 to disable
ForceWeapon.UnderEMP=-1                         ; integer, -1 to disable
ForceWeapon.InRange=                            ; List of integers
ForceWeapon.InRange.Overrides=                  ; List of floating-point values
ForceWeapon.InRange.ApplyRangeModifiers=false   ; boolean
ForceWeapon.InRange.TechnoOnly=true             ; boolean
ForceAAWeapon.InRange=                          ; List of integers
ForceAAWeapon.InRange.Overrides=                ; List of floating-point values
ForceAAWeapon.InRange.ApplyRangeModifiers=false ; boolean
ForceWeapon.Buildings=-1                        ; integer, -1 to disable
ForceWeapon.Defenses=-1                         ; integer, -1 to disable
ForceWeapon.Infantry=-1                         ; integer, -1 to disable
ForceWeapon.Naval.Units=-1                      ; integer, -1 to disable
ForceWeapon.Units=-1                            ; integer, -1 to disable
ForceWeapon.Aircraft=-1                         ; integer, -1 to disable
ForceAAWeapon.Infantry=-1                       ; integer, -1 to disable
ForceAAWeapon.Units=-1                          ; integer, -1 to disable
ForceAAWeapon.Aircraft=-1                       ; integer, -1 to disable

备注

特别说明,如果某个位置的 Force(AA)Weapon.InRange 设为 -1 而 Force(AA)Weapon.InRange.Overrides 为正值,那么在满足条件时使用默认的武器选取规则。

快速进入载具/建筑

  • 现在你可以让步兵或载具类载员无需排队地快速进入或离开运输载具/建筑。

rulesmd.ini

[General]
NoQueueUpToEnter=false          ; boolean
NoQueueUpToUnload=false         ; boolean
NoQueueUpToEnter.Buildings=     ; boolean, default to NoQueueUpToEnter
NoQueueUpToUnload.Buildings=    ; boolean, default to NoQueueUpToUnload

[SOMEVEHICLE/SOMEBUILDING]      ; VehicleType/BuildingType, transport
NoQueueUpToEnter=               ; boolean, default to [General] -> NoQueueUpToEnter(.Buildings)
NoQueueUpToUnload=              ; boolean, default to [General] -> NoQueueUpToUnload(.Buildings)

备注

注意该逻辑用于 乘客 逻辑,这与 驻军 是两个不同的东西。

初始子机数量

  • 现在可以设置子机发射器的初始子机数量,而不再总是初始满载。如果初始数量大于 SpawnsNumber 则无效。

rulesmd.ini

[SOMETECHNO]              ; TechnoType
InitialSpawnsNumber=      ; integer

科技类型与克隆步兵的初始血量

图像 C&C: Reloaded 中克隆步兵的初始血量示例

  • InitialStrength 可用于设置科技类型的初始血量。

  • InitialStrength.Cloning 可以用于指定克隆步兵由 Cloning=true 建筑创建时的初始血量百分比(单个值或从其中随机选取的一对值)。

rulesmd.ini

[SOMETECHNO]              ; TechnoType
InitialStrength=          ; integer

[SOMEBUILDING]            ; BuildingType
InitialStrength.Cloning=  ; floating point value - single or comma-sep. range (percentages)

备注

InitialStrengthInitialStrength.Cloning 都不会超过单位的 Strength,即使你设置了一个比它更大的值。

自毁

  • 如果满足以下 任何 条件对象将会自毁:

    • OnAmmoDepletion:如果剩余弹药达到 0 则对象死亡。

    • OnOwnerChange:该对象所属方发生变更。

      • OnOwnerChange.HumanToComputer/ComputerToHuman:该对象的所属方从人类玩家转为 AI 玩家或从 AI 玩家转为人类玩家。若未设置则默认同 OnOwnerChange

    • AfterDelay:如果倒计时(以帧为单位)达到 0 则对象死亡。

    • TechnosExistTechnosDontExist:如果科技类型分别存在或不存在则对象死亡。

      • Technos(Dont)Exist.Any 控制需要列出的单个科技类型还是所有科技类型来满足条件。

      • Technos(Dont)Exist.AllowLimboed 控制是否计入虚拟的科技类型(例如在运输工具中的那些)。

      • Technos(Dont)Exist.Houses 控制检查哪些所属方。

  • 自毁行为有以下选择:

    • kill:对象将正常摧毁。

    • vanish:对象将被直接从游戏中静默移除而不是真正击杀。

    • sell:如果对象是拥有建造动画的 建筑,它将被出售而不是被摧毁。

  • 如果未设置此项那么自毁逻辑将不会启用。如果选择 vanish 行为,那么可以使用 AutoDeath.VanishAnimation 设置自毁时播放的动画。如果列出了多个动画,则将随机选择一个。

  • 此逻辑还支持通过 虚拟投放 提供的建筑。不过这种情况下所有 AutoDeath.Behavior 值都将只是使建筑简单地移除。

rulesmd.ini

[SOMETECHNO]                                   ; TechnoType
AutoDeath.Behavior=                            ; enumeration (kill | vanish | sell), default not set
AutoDeath.VanishAnimation=                     ; List of AnimationTypes
AutoDeath.OnAmmoDepletion=false                ; boolean
AutoDeath.OnOwnerChange=false                  ; boolean
AutoDeath.OnOwnerChange.HumanToComputer=       ; boolean, default to AutoDeath.OnOwnerChange
AutoDeath.OnOwnerChange.ComputerToHuman=       ; boolean, default to AutoDeath.OnOwnerChange
AutoDeath.AfterDelay=0                         ; positive integer
AutoDeath.TechnosDontExist=                    ; List of TechnoTypes
AutoDeath.TechnosDontExist.Any=false           ; boolean
AutoDeath.TechnosDontExist.AllowLimboed=false  ; boolean
AutoDeath.TechnosDontExist.Houses=owner        ; Affected House Enumeration (none|owner/self|allies/ally|team|enemies/enemy|all)
AutoDeath.TechnosExist=                        ; List of TechnoTypes
AutoDeath.TechnosExist.Any=true                ; boolean
AutoDeath.TechnosExist.AllowLimboed=false      ; boolean
AutoDeath.TechnosExist.Houses=owner            ; Affected House Enumeration (none|owner/self|allies/ally|team|enemies/enemy|all)

备注

请注意 如果你没有使用 Ares 3.0+ 那么对于携带载员的单位即使使用 kill 行为载员也不会被释放。

低优先级部署

  • 现在你可以为单位在部署行为中设置低优先级,这意味着如果它与其他单位一同被选中那么不会与其他单位一起执行部署指令。这不影响通过光标下达部署指令,这种情况本就不需要事先选中其他对象。

rulesmd.ini

[SOMETECHNO]             ; TechnoType
LowDeployPriority=false  ; boolean
  • 此行为设计为可由用户切换。目前你只能通过客户端或进行手动设置。

RA2MD.INI

[Phobos]
PriorityDeployFiltering=true  ; boolean

心灵控制增强

图像 幻想奇遇 中的心灵控制范围限制 图像 幻想奇遇 中的多重心控单位自动释放第一个受害者

  • 心灵控制者现在可以设置控制距离的上限。标签值大于 0 将激活此功能。

  • 心灵控制的单位可以拥有被心控尺寸,就像乘客相对运输工具的那种。

  • 心灵控制者现在可以设置哪些所属方可以看到它与被心灵控制单位之间的连线。

  • 多重心控单位现在可以达到控制上限而又要控制一个新目标时释放第一个被控制的单位。

rulesmd.ini

[SOMETECHNO]                          ; TechnoType, as Mind controllers
MindControlRangeLimit=-1.0            ; floating point value
MindControl.IgnoreSize=true           ; boolean
MindControlLink.VisibleToHouse=all    ; Affected House Enumeration (none|owner/self|allies/ally|team|enemies/enemy|all)
MultiMindControl.ReleaseVictim=false  ; boolean

[SOMETECHNO]                          ; TechnoType, as Mind controlled targets
MindControlSize=1                     ; integer

多武器

图像 @暴风硫零点界限 中使用多武器逻辑来实现对不同目标使用不同武器

  • 现在你可以使用 WeaponX 来为一个单位启用 2 种以上的武器而无需原先硬编码的 Gunner=yesIsGattling=yesIsChargeTurret=yes 这些启用语句。

    • 设置 MultiWeapon=yes 来启用此功能,注意别忘了设置 WeaponCount

    • MultiWeapon.IsSecondary 指定在选择武器或触发步兵 SecondaryFire 时哪些武器被视为 Secondary,若不设置则使用 Weapon1

    • MultiWeapon.SelectCount 决定默认武器选用逻辑下可以被考虑使用的武器数量。设置过高会导致性能问题。

      • 如果该值小于武器数量那么将会优先选择索引序号更小的武器。

      • 其他武器仍可通过 对特定目标使用特定武器 等指定武器索引序号的逻辑来使用。

rulesmd.ini

[SOMETECHNO]                    ; TechnoType
MultiWeapon=false               ; boolean
MultiWeapon.IsSecondary=        ; List of integers
MultiWeapon.SelectCount=2       ; integer

多武器的攻击指令音效

  • 单位可以在使用更多武器时自定义各武器下达攻击指令时的音效。

    • 如果你需要为 Weapon1 分配攻击音效那么直接设置 VoiceWeapon1Attack 即可。其他武器同理。

    • 也可使用 VoiceEliteWeaponNAttack 指定用于 EliteWeaponN 的音效。默认使用 VoiceWeaponNAttack

rulesmd.ini

[SOMETECHNO]                ; TechnoType
VoiceWeaponNAttack=         ; Sound entry
VoiceEliteWeaponNAttack=    ; Sound entry

禁止手动移动

  • 现在你可以指定一个科技类型是否无法接收移动指令。

  • 在一个拥有 UndeploysInto 的建筑上将此设为 true 可以阻止其在设置集结点时反部署。

rulesmd.ini

[SOMETECHNO]        ; TechnoType
NoManualMove=false  ; boolean

备注

注意你仍可使用一个 BuildingUndeploy=true 的弹头或设置集结点后出售建筑来解除部署。

EMP 或超时空停止 CD

  • 现在你可以让科技类型在 EMP 或被超时空武器冻结时武器 ROF 与弹药 Reload 也同步停止。默认值取自 [General]。这对机场战机的重新装填无效。

rulesmd.ini

[General]
NoRearm.UnderEMP=false   ; boolean
NoRearm.Temporal=false   ; boolean
NoReload.UnderEMP=false  ; boolean
NoReload.Temporal=false  ; boolean

[SOMETECHNO]             ; TechnoType
NoRearm.UnderEMP=        ; boolean
NoRearm.Temporal=        ; boolean
NoReload.UnderEMP=       ; boolean
NoReload.Temporal=       ; boolean

自定义脑车过载

  • 现在可以为一个使用 InfiniteMindControl=yes 武器的单位自定义其过载相关特性。

rulesmd.ini

[SOMETECHNO]                  ; TechnoType
Overload.Count=               ; List of integers, default to [CombatDamage] -> OverloadCount
Overload.Damage=              ; List of integers, default to [CombatDamage] -> OverloadDamage
Overload.Frames=              ; List of integers, default to [CombatDamage] -> OverloadFrames
Overload.DeathSound=          ; Sound entry, default to [AudioVisual] -> MasterMindOverloadDeathSound
Overload.ParticleSys=         ; ParticleSystemType, default to [CombatDamage] -> DefaultSparkSystem
Overload.ParticleSysCount=5   ; integer

升级动画

  • 现在你可以在单位或建筑升级时播放指定动画。

    • Promote.VeteranAnimation 用于单位或建筑升级为老兵时。若为单位设置本句则覆盖全局 [AudioVisual] 中的设置。如果列出了多个动画,则将随机选择一个。

    • Promote.EliteAnimation 用于单位或建筑升级为精英时。若为单位设置本句则覆盖全局 [AudioVisual] 中的设置。如果列出了多个动画,则将随机选择一个。

    • 如果未定义 Promote.EliteAnimation 则使用 Promote.VeteranAnimation

rulesmd.ini

[AudioVisual]
Promote.VeteranAnimation=         ; List of AnimationTypes
Promote.EliteAnimation=           ; List of AnimationTypes

[SOMETECHNO]                      ; TechnoType
Promote.VeteranAnimation=         ; List of AnimationTypes, default to Promote.VeteranAnimation in [AudioVisual]
Promote.EliteAnimation=           ; List of AnimationTypes, default to Promote.EliteAnimation in [AudioVisual]

单位受伤警报

  • 在原版,非建筑科技类型在收到攻击时不会生成雷达事件或 EVA 播报,因此它们很难在被摧毁前被玩家注意到。现在当你的单位受到攻击时可以收到雷达事件(以及可选的声音效果),以便及时应战。

  • [AudioVisual] -> CombatAlert 是一个全局开关,将其设置为 true 以启用整个逻辑。

  • 这些标签控制什么时候触发战斗警报。

    • 你可以通过将 [TechnoType] -> CombatAlert 设置为 false 来为特定科技类型禁用此逻辑,默认为 [AudioVisual] -> CombatAlert.Default。如果 CombatAlert.Default 也为空,则默认为对 Insignificant=yesSpawned=yes 的科技类型禁用。

    • [AudioVisual] -> CombatAlert.IgnoreBuilding 将在建筑上关闭此逻辑,你可以通过设置 [TechnoType] -> CombatAlert.NotBuildingtrue 来为特定建筑覆盖设置。你可能希望将其用于载具性质的建筑。

    • [AudioVisual] -> CombatAlert.SuppressIfInScreen 决定是否为当前屏幕中的单位禁用此逻辑。

    • [AudioVisual] -> CombatAlert.Interval 决定警报之间的间隔(以帧为单位),以防止警报过于频繁。默认为 150 帧。

    • [AudioVisual] -> CombatAlert.SuppressIfAllyDamage 决定是否为盟友造成的伤害禁用此逻辑。

    • 科技类型被拥有 [WarheadType] -> CombatAlert.Suppress 设置为 true 的弹头击中将不会触发雷达事件或 EVA。此标签默认为 Ares 标签 [WarheadType] -> Malicious 的相反值和 [WarheadType] -> Nonprovocative 的值。

  • 以下标签控制战斗警报的效果。

    • [AudioVisual] -> CombatAlert.MakeAVoice 决定是否与战斗警报一起播放一些音效。将其设为 true 以启用以下标签,否则它们将被忽略。

    • [TechnoType] -> CombatAlert.UseFeedbackVoice 决定是否使用 VoiceFeedback 定义的声音。默认为 [AudioVisual] -> CombatAlert.UseFeedbackVoice

    • [TechnoType] -> CombatAlert.UseAttackVoice 决定是否使用 VoiceAttack 定义的声音。默认为 [AudioVisual] -> CombatAlert.UseAttackVoice

    • [TechnoType] -> CombatAlert.UseEVA 决定是否使用 EVA。默认为 [AudioVisual] -> CombatAlert.UseEVA。所用的 EVA 默认为 EVA_UnitsInCombat,可以通过 [TechnoType] -> CombatAlert.EVA 指定。

    • 声音效果 依次 被使用,首先是反馈,然后是攻击,最后是 EVA。在 [AudioVisual] 中的标签控制是否全局检查,可以为每个科技类型单独指定。

    • 一个示例:你设置了 CombatAlert.UseFeedbackVoiceCombatAlert.UseEVAtrueCombatAlert.UseAttackVoicefalse。拥有 VoiceFeedbackVoiceAttackCombatAlert.EVA 的单位将播放 VoiceFeedback。拥有 VoiceAttack 的单位将播放 EVA_UnitsInCombat

rulesmd.ini

[AudioVisual]
CombatAlert=false                      ; boolean
CombatAlert.Default=                   ; boolean
CombatAlert.IgnoreBuilding=true        ; boolean
CombatAlert.SuppressIfInScreen=true    ; boolean
CombatAlert.Interval=150               ; integer, game frames
CombatAlert.SuppressIfAllyDamage=true  ; boolean
CombatAlert.MakeAVoice=true            ; boolean
CombatAlert.UseFeedbackVoice=true      ; boolean
CombatAlert.UseAttackVoice=true        ; boolean
CombatAlert.UseEVA=true                ; boolean

[SOMETECHNO]                           ; TechnoType
CombatAlert=                           ; boolean
CombatAlert.NotBuilding=false          ; boolean
CombatAlert.UseFeedbackVoice=true      ; boolean
CombatAlert.UseAttackVoice=true        ; boolean
CombatAlert.UseEVA=true                ; boolean
CombatAlert.EVA=EVA_UnitsInCombat      ; EVA entry

[SOMEWARHEAD]                          ; WarheadType
CombatAlert.Suppress=                  ; boolean

重置连发索引

  • 现在你可以让单位在更换了开火武器或一段时间(取上一次发射武器的 ROF 与 30 帧之间的较大值)内没有目标的情况下重置当前的连发索引。

rulesmd.ini

[General]
RecountBurst=false  ; boolean

[SOMETECHNO]        ; TechnoType
RecountBurst=       ; boolean, default to [General] -> RecountBurst

变形后重置心控效果

  • 单位变形完毕后其心控效果可被重置。

    • 如果变形后的单位所有弹头都没有 MindControl=yes,那么 Convert.ResetMindControl=yes 将释放所有被心控的单位。

    • 如果变形后的单位任意弹头拥有 MindControl=yes,那么 Convert.ResetMindControl=yes 将重置最大控制数量上限。

    • 如果变形后的单位所有武器都没有 InfiniteMindControl=yes,那么 Convert.ResetMindControl=yes 将释放超出上限的被心控单位。

rulesmd.ini

[SOMETECHNO]                            ; TechnoType, before conversion
Convert.ResetMindControl=false          ; boolean

复仇武器

图像 RA2: Reboot 中的复仇武器

  • 类似于 DeathWeapon,它在科技类型被击杀后发射,但不同的是它将发射给造成伤害并杀死科技类型的人。如果科技类型不是由于其他科技类型造成的直接伤害而死亡,那么 RevengeWeapon 将不会被发射。

    • RevengeWeapon.AffectsHouse 可用于筛选可以对哪些所属方的击杀者发射武器。

    • 也可以通过 Attach Effect 来授予复仇武器。

    • 如果弹头 SuppressRevengeWeapons 设为 true 则不会触发复仇武器。SuppressRevengeWeapons.Types 可用于列出受影响的武器类型,如果没有列出,则所有武器类型都受影响。

rulesmd.ini

[SOMETECHNO]                    ; TechnoType
RevengeWeapon=                  ; WeaponType
RevengeWeapon.AffectsHouse=all  ; List of Affected House Enumeration (none|owner/self|allies/ally|team|enemies/enemy|all)

[SOMEWARHEAD]                   ; WarheadType
SuppressRevengeWeapons=false    ; boolean
SuppressRevengeWeapons.Types=   ; List of WeaponTypes

共享弹药

  • 拥有 OpenTopped=yesAmmo.Shared=yes 的运输工具将像拥有 Ammo.Shared=yes 的载员共享弹药。此外如果载员拥有与运输工具相同的 Ammo.Shared.Group=<integer> 值则运输工具可以筛选谁将接收弹药而忽略不拥有同组值的其他载员。

  • 拥有 Ammo.Shared.Group=-1 的运输工具将像任何拥有 Ammo.Shared=yes 的载员共享弹药。

  • 运输工具必须拥有弹药并应当能够自行重装弹药。

rulesmd.ini

[SOMETECHNO1]         ; TechnoType, transport with OpenTopped=yes
Ammo.Shared=no        ; boolean
Ammo.Shared.Group=-1  ; integer

[SOMETECHNO2]         ; TechnoType, passenger
Ammo.Shared=no        ; boolean
Ammo.Shared.Group=-1  ; integer

单位创建时音效

  • 当一个单位被创建时将为单位所有者播放 VoiceCreated 指定的音效。

  • 如果 IsVoiceCreatedGlobal 设为 true 则将全局播放 VoiceCreated 而不是 EVA_UnitReady

rulesmd.ini

[AudioVisual]
IsVoiceCreatedGlobal=false   ; boolean

[SOMETECHNO]                 ; TechnoType
VoiceCreated=                ; Sound entry

狂暴单位索敌限制

  • 现在你可以设定狂暴单位可以对哪些所属方的目标索敌和开火。

rulesmd.ini

[General]
BerzerkTargeting=all  ; Affected House Enumeration (none|owner/self|allies/ally|team|enemies/enemy|all)

马夫逻辑

  • 可以让单位实时将自身脚下的矿石直接转化为资金,就像《凯恩之怒》中 GDI 的 MARV 那样。

  • TiberiumEater.TransDelay 指定了两次吃矿之间间隔的帧数,0 代表逐帧。负值禁用。

  • TiberiumEater.CellN 用于设定吃矿位置以单元格为单位的偏移列表,N 为 0 始序号,数值表示相对于单位所在单元格的偏移坐标。如果不设置则只吃脚下的。

  • TiberiumEater.AmountPerCell 控制单次吃矿对与每个单元格而言可吃进去的矿石量上限。负值喂不饱。

  • 默认通过此方式采集的矿石价值与常规采矿相同。这可以通过 TiberiumEater.CashMultiplier 加以调整。

  • TiberiumEater.Display 设为 true 则每次吃矿时都会飘起一个代表所得总资金量的数字。

    • TiberiumEater.Display.Houses 决定了哪些所属方能看见。

  • 每次吃矿时都会在被吃的单元格播放动画。若 TiberiumEater.Anims 包含 8 个条目则根据单位当前朝向选择动画,否则随机选取。

    • 若设置了 TiberiumEater.Anims.TiberiumN 则在吃进去对应类型(N = [0,3])的矿石时使用对应序列的 TiberiumEater.Anims

    • TiberiumEater.AnimMove 设为 true 则动画会跟随单位移动。

rulesmd.ini

[SOMETECHNO]                      ; InfantryType, VehicleType or AircraftType
TiberiumEater.TransDelay=-1       ; integer
TiberiumEater.CellN=              ; X,Y - cell offset
TiberiumEater.CashMultiplier=1.0  ; floating point value
TiberiumEater.AmountPerCell=0     ; integer
TiberiumEater.Display=true        ; boolean
TiberiumEater.Display.Houses=all  ; List of Affected House Enumeration (none|owner/self|allies/ally|team|enemies/enemy|all)
TiberiumEater.Anims=              ; List of AnimationTypes
TiberiumEater.Anims.Tiberium0=    ; List of AnimationTypes
TiberiumEater.Anims.Tiberium1=    ; List of AnimationTypes
TiberiumEater.Anims.Tiberium2=    ; List of AnimationTypes
TiberiumEater.Anims.Tiberium3=    ; List of AnimationTypes
TiberiumEater.AnimMove=true       ; boolean

武器在传送时开火

  • 现在可以在科技类型传送来/去时发射武器。它们会与相应的 (WarpInWarpOut) 动画一起显示。

    • WarpInMinRangeWeapon 将在传送距离(以 leptons 为单位)小于 ChronoRangeMinimum 时使用,无论是否设置了 ChronoTrigger。如果未设置 WarpInMinRangeWeapon,则默认为 WarpInWeapon

    • 如果设置了 WarpInWeapon.UseDistanceAsDamageWarpIn(MinRange)WeaponDamage 将被覆盖为传送所跨越的完整单元格数。

rulesmd.ini

[SOMETECHNO]                            ; TechnoType
WarpInWeapon=                           ; WeaponType
WarpInMinRangeWeapon=                   ; WeaponType
WarpInWeapon.UseDistanceAsDamage=false  ; boolean
WarpOutWeapon=                          ; WeaponType

地形对象

摧毁动画与音效

  • 现在你可以指定当地形对象被摧毁时播放播放的摧毁动画与音效。如果列出了多个动画,则将随机选择一个。

    • 如果 DestroyAnim 中列出了多个动画,则将随机选择一个。

rulesmd.ini

[SOMETERRAINTYPE]  ; TerrainType
DestroyAnim=       ; List of AnimationTypes
DestroySound=      ; Sound entry

载具类型

两栖载具装载拓展

  • 现在两栖步兵或载具可以在水中进入或离开两栖运输工具。

rulesmd.ini

[General]
AmphibiousEnter=false    ; boolean
AmphibiousUnload=false   ; boolean

[SOMEVEHICLE]            ; VehicleType, transport
AmphibiousEnter=         ; boolean, default to [General] -> AmphibiousEnter
AmphibiousUnload=        ; boolean, default to [General] -> AmphibiousUnload

基于弹药量的自动部署与禁用部署

  • 现可为可部署(DeploysIntoDeployFireIsSimpleDeployer 以及那些有乘客的)载具设定根据当前弹药量自动部署或禁用部署

    • Ammo.AutoDeployMinimumAmount & Ammo.AutoDeployMaximumAmount 分别设定载具自动部署所需的最低与最高弹药量阈值,负值表示禁用检查。

    • Ammo.DeployUnlockMinimumAmount & Ammo.DeployUnlockMaximumAmount 分别设定载具启用部署功能所需的最低与最高弹药量阈值,负值表示禁用检查。

rulesmd.ini

[SOMEVEHICLE]                      ; VehicleType
Ammo.AutoDeployMinimumAmount=-1    ; integer
Ammo.AutoDeployMaximumAmount=-1    ; integer
Ammo.DeployUnlockMinimumAmount=-1  ; integer
Ammo.DeployUnlockMaximumAmount=-1  ; integer

自定义悬浮载具溺死

  • HoverDrownable 允许自定义悬浮载具在水域上失灵时是否会溺死。

rulesmd.ini

[SOMEVEHICLE]           ; VehicleType
HoverDrownable=true     ; boolean

载具伤残更换图像

  • 现在当载具伤残(生命值低于 [AudioVisual] -> ConditionYellow 的百分比)时可以通过 Image.ConditionYellow 为载具设置不同的图像。

  • 同样的如果载具生命值低于 [AudioVisual] -> ConditionRed 的百分比那么将会使用 Image.ConditionRed 作为图像。

  • 类似于 Ares 的 WaterImage,可以通过设置 WaterImage.ConditionYellowWaterImage.ConditionRed 的载具类型来在水上应用这一效果。

rulesmd.ini

[SOMEVEHICLE]                         ; VehicleType
Image.ConditionYellow=                ; VehicleType entry
Image.ConditionRed=                   ; VehicleType entry
WaterImage.ConditionYellow=           ; VehicleType entry
WaterImage.ConditionRed=              ; VehicleType entry

警告

注意这些被使用的载具必须在 [VehicleTypes] 下注册并且在常规/伤残状态下使用相同的图像类型(Shape/Voxel)。

载具类型默认幻影伪装

  • 现在可以单独为每个载具类型设置其 DefaultMirageDisguises

rulesmd.ini

[SOMEVEHICLE]              ; VehicleType
DefaultMirageDisguises=    ; List of TerrainTypes

独立的 Shape 载具炮塔文件

  • Shape 有炮塔载具支持使用 *tur.shp 文件。。

    • 若 Shape 载具在绘制炮塔时存在名为 *tur.shp 的 Shape 文件,则炮塔从该文件的第 0 帧开始;否则它仍然开始自 Shape 载具本体图像的第 WalkFrames * Facings 帧(0 始序列)。

    • 如果你想要将现有 Shape 文件拆分成两部分,那么只需要从原文件中分离作为炮塔图像的 32 帧及其对应的 32 帧影子图像,再将其合并成一个新的 Shape 文件即可。

    • 当需要更改载具所使用的炮塔时,将其分为两个文件有助于简化操作。

Jumpjet 在移动时倾斜

图像 冲击计划:征服 中的 Jumpjet 前倾

  • 现在你可以通过将 JumpjetTilt 设为 true 来使 Jumpjet 单位在向前移动时前倾以及在转向时侧倾。

  • 最大倾斜角度不会超过 90 度。

    • 向前倾斜的幅度与当前速度和加速度相关。它们会相加,这里给出两个用于细节调整的系数。

    • 侧向倾斜的幅度与当前速度和旋转角度相关。它们会相乘,同样给出两个用于细节调整的系数。

rulesmd.ini

[SOMEVEHICLE]                           ; VehicleType, with Locomotor=Jumpjet
JumpjetTilt=false                       ; boolean
JumpjetTilt.ForwardAccelFactor=1.0      ; floating point value
JumpjetTilt.ForwardSpeedFactor=1.0      ; floating point value
JumpjetTilt.SidewaysRotationFactor=1.0  ; floating point value
JumpjetTilt.SidewaysSpeedFactor=1.0     ; floating point value

炮塔响应

  • 你可以自定义当载具丢失目标时炮塔方向是否回正(与车身对齐)

    • Speed=0 或单位由于 MovementRestrictedTo 导致无法移动,则默认 no;否则默认 yes。

rulesmd.ini

[SOMEVEHICLE]       ; VehicleType
TurretResponse=     ; boolean

无炮塔 Shape 载具开火前摇

图像 @暴风硫零点界限 中为 Shape 载具类型的机甲单位使用开火前摇效果

  • 现在 Voxel=no 的无炮塔载具已经支持 FireUp

  • FireUp.ResetInRetarget 决定当前载具目标改变时其前摇是否重置。失去目标强制重置。

artmd.ini

[SOMEVEHICLE]                   ; VehicleType
FireUp=                         ; integer
FireUp.ResetInRetarget=true     ; boolean

弹头

提示

所有新增的弹头效果

  • 可在适用的情况下与 CellSpread 和 Ares 的通用弹头超级武器一起使用。

  • 不能与 Ares 的 MindControl.Permanent=yes 共同使用。

  • 在适用的情况下除非 EffectsRequireVerses 设为 false 否则尊重 Verses

  • 如果目标拥有一个激活的 护盾,那么它的护甲类型将被使用,除非弹头可以穿透护盾。

允许将建筑所受的 AOE 伤害合而为一

  • 弹头现在可以在 MergeBuildingDamage 设为 true 时通过合并 AOE 伤害来仅对建筑造成单次杀伤,其默认同 [CombatDamage] -> MergeBuildingDamage

rulesmd.ini

[CombatDamage]
MergeBuildingDamage=false    ; boolean

[SOMEWARHEAD]                ; WarheadType
MergeBuildingDamage=         ; boolean

备注

  • 这是与 CellSpread.MaxAffect 不同的机制。

  • 由于原本的部分杀伤被取整消去,开启本功能后所造成的杀伤可能略有增大。

Allow warhead to only affect invoker

  • In the past, modders used many methods such as Dropping and extremely small CellSpread to prevent a weapon fired by a unit from affecting others, thereby achieving complex combination logic. However, existing methods merely reduced the range of affected objects through various means. Now, you can directly use the following flag to check whether the victim is the unit itself:

    • AffectsInvokerOnly can be used to make the affected object only the unit itself.

    • AffectsInvokerOnly.Reverse can be used to exclude the unit from the affected objects.

    • AffectsInvokerOnly.IgnoreInvokerState can be used to determine whether to consistently avoid affecting other objects regardless of the unit’s state.

[CombatDamage]
AffectsInvokerOnly.IgnoreInvokerState=true  ; boolean

[SOMEWARHEAD]                               ; WarheadType
AffectsInvokerOnly=false                    ; boolean
AffectsInvokerOnly.Reverse=false            ; boolean
AffectsInvokerOnly.IgnoreInvokerState=      ; boolean, default to [CombatDamage] -> AffectsInvokerOnly.IgnoreInvokerState

提示

If you have enabled ApplyPerTargetEffectsOnDetonate to make affects handling completely follow damage propagation, then most of the time you can just use DamageSelf and AllowDamageOnSelf without needing AffectsInvokerOnly.Reverse.

解除心控

图像 RA2: Reboot 中的心控解除弹头

  • 弹头现在可以解除心灵控制(不适用于永久心控的对象)。

  • RemoveMindControlMindControl.Permanent 都会移除目标原本的常规心灵控制效果并播放 MindClearedSound 音效。现在这可以通过 RemoveMindControl.Silent 进行定义,对于移除常规心控的情况默认为 [AudioVisual] -> RemoveMindControl.Silent,对于使用永久心灵控制取代常规心灵控制的情况则默认为 [AudioVisual] -> MindControl.Permanent.ReplaceSilent

提示

你可以单纯用这个语句来减少一些噪音,也可以在屏蔽原音效的同一时机播放另一个音效……

rulesmd.ini

[AudioVisual]
RemoveMindControl.Silent=false             ; boolean
MindControl.Permanent.ReplaceSilent=false  ; boolean

[SOMEWARHEAD]                              ; WarheadType
RemoveMindControl=false                    ; boolean
RemoveMindControl.Silent=                  ; boolean, normal removal defaults to [AudioVisual] -> RemoveMindControl.Silent, permanent replacement defaults to [AudioVisual] -> MindControl.Permanent.ReplaceSilent

弹头范围增强

  • 在原版中,范围伤害的杀伤区域是一个球形。某些例如你希望制作一个给目标区域上 Buff 的弹头超武的时候空中单位的受益范围总是比地面单位更小。现在你可以使用新语句 CellSpread.Cylinder 来解决这一问题。

  • AffectsAir 允许你制作一个仅可杀伤 208 高度以上单位的弹头。

  • AffectsGround 允许你制作一个仅可杀伤 208 高度以下单位的弹头。

rulesmd.ini

[SOMEWARHEAD]              ; WarheadType
CellSpread.Cylinder=false  ; boolean
AffectsAir=true            ; boolean
AffectsGround=true         ; boolean

备注

  • 这些功能不会覆盖 Ares 语句 DamageAirThreshold 的效果:除非同时设置 DamageAirThreshold=-1,否则一个在地面引爆的弹头即使拥有 CellSpread.Cylinder 也无法作用于空中单位。

  • 这些功能同样作用于相关的 Phobos 弹头效果。由于技术限制,这不包括 EMP 和 铁幕等 Ares 弹头效果

暴击

  • 现在弹头可以基于概率额外造成暴击伤害或弹头爆炸,可以自定义暴击的概率、伤害、影响目标、受影响目标生命值阈值和暴击动画。

    • Crit.Chance 决定暴击发生的概率。默认情况下这在弹头爆炸时检查一次,每个受影响的目标都可能受到暴击。如果设置了 Crit.ApplyChancePerTarget,那么每个目标是否成功进行暴击的概率将单独计算。

    • Crit.ExtraDamage 决定暴击造成的额外伤害,如果设置了 Crit.Warhead,那么伤害将用于在每个受影响的目标上引爆指定的弹头,否则伤害将基于当前弹头的 Verses 设置直接造成伤害。

    • Crit.ExtraDamage.ApplyFirepowerMult 决定暴击造成的额外伤害是否受益于科技类型所拥有的火力加成。

    • Crit.Warhead 可用于设置一个替代当前弹头引爆的弹头。

    • Crit.Warhead.FullDetonation 控制弹头是否在目标上完全引爆(作为虚拟武器的一部分)或者只能对所在区域造成杀伤并应用 Phobos 的弹头效果。

    • Crit.AffectsTarget 可用于自定义此弹头可暴击的目标类型。暴击不能影响空置单元格或仅包含地形对象和覆盖物等的单元格。

    • Crit.AffectsHouse 可用于自定义此弹头可暴击的目标所属。

    • Crit.AffectsBelowPercentCrit.AffectsAbovePercent 用于设置可被暴击影响的单位其当前血量所占百分比必须高于和/或低于/等于的限制。若目标血量为 0 则跳过该检查。

    • Crit.AnimList 可用于设置一个当弹头对至少一个目标造成暴击时替代弹头 AnimList 使用的动画列表。如果设置了 Crit.AnimList.PickRandom(默认为 AnimList.PickRandom),则从列表中随机选择一个动画。如果设置了 Crit.AnimList.CreateAll(默认为 AnimList.CreateAll),则创建列表中的所有动画。

      • Crit.AnimOnAffectedTargets 如果设置则使 Crit.AnimList 中的动画在每个受影响的目标上播放,此外 还会正常播放弹头 AnimList 而不是覆盖之。注意因为这些动画与 AnimList 独立所以,Crit.AnimList.PickRandomCrit.AnimList.CreateAll 将不会默认为 AnimList 对应项的值,需要手动设置。

    • Crit.ActiveChanceAnims 可用于设置当前弹头有几率造成暴击时始终显示在弹头爆炸坐标处的动画。列出多个动画则随机选择其一。

    • Crit.SuppressWhenIntercepted 如果设置则禁用弹头在被抛射体拦截而引爆时造成暴击。

    • ImmuneToCrit 可以设置在科技类型和护盾类型上以使它们免疫暴击。

rulesmd.ini

[SOMEWARHEAD]                              ; WarheadType
Crit.Chance=0.0                            ; floating point value, percents or absolute (0.0-1.0)
Crit.ApplyChancePerTarget=false            ; boolean
Crit.ExtraDamage=0                         ; integer
Crit.ExtraDamage.ApplyFirepowerMult=false  ; boolean
Crit.Warhead=                              ; WarheadType
Crit.Warhead.FullDetonation=true           ; boolean
Crit.AffectsTarget=all                     ; List of Affected Target Enumeration (none|land|water|infantry|units|buildings|all)
Crit.AffectsHouse=all                      ; List of Affected House Enumeration (none|owner/self|allies/ally|team|enemies/enemy|all)
Crit.AffectsBelowPercent=1.0               ; floating point value, percents or absolute (0.0-1.0)
Crit.AffectsAbovePercent=0.0               ; floating point value, percents or absolute (0.0-1.0)
Crit.AnimList=                             ; List of AnimationTypes
Crit.AnimList.PickRandom=                  ; boolean
Crit.AnimList.CreateAll=                   ; boolean
Crit.ActiveChanceAnims=                    ; List of AnimationTypes
Crit.AnimOnAffectedTargets=false           ; boolean
Crit.SuppressWhenIntercepted=false         ; boolean

[SOMETECHNO]                               ; TechnoType
ImmuneToCrit=false                         ; boolean

警告

如果你将 Crit.Warhead 设为定义暴击的弹头或者创建一个最终回到第一个弹头的循环那么游戏可能会陷入循环并随后卡死或崩溃。

单位转换弹头

图像 NanodaSupercalifragilisticexpialidocious 中的载具版基因突变

  • 现在弹头可以将受影响单位的科技类型更改为同大类的其他科技类型(步兵到步兵,车辆到车辆,战机到战机)。

    • ConvertN.From(此处 N 为 0, 1, 2…)指定哪些科技类型可用于转换。此条目可以列出许多类型以一次全部转换。当没有包含任何类型时将影响所有有效目标。

    • ConvertN.To 指定转换后的科技类型。

    • ConvertN.AffectsHouse 指定哪些所属方的单位可以被转换。

    • 若只指定一组转换则 Convert.FromConvert.ToConvert.AffectsHouse(不带序号)相当于 Convert0.FromConvert0.ToConvert0.AffectsHouse的别称。

例如这个弹头可以将所有被影响的己方和友方 SOLDIERASOLDIERB 转换为 NEWSOLDIER

[ExampleWH]
Convert.From=SOLDIERA,SOLDIERB
Convert.To=NEWSOLDIER
Convert.AffectsHouse=team

rulesmd.ini

[SOMEWARHEAD]                   ; WarheadType
ConvertN.From=                  ; List of TechnoTypes
ConvertN.To=                    ; TechnoType
ConvertN.AffectsHouse=all       ; List of Affected House Enumeration (none|owner/self|allies/ally|team|enemies/enemy|all)
; where N = 0, 1, 2, ...
; or
Convert.From=                   ; List of TechnoTypes
Convert.To=                     ; TechnoType
Convert.AffectsHouse=all        ; List of Affected House Enumeration (none|owner/self|allies/ally|team|enemies/enemy|all)

警告

此功能与 Ares 的单位转换 存在同样的限制。此功能不支持建筑类型。

警告

此功能需要 3.0 及以上版本的 Ares!如果未检测到 Ares 3.0+,单位的某些属性可能不会被更新。

自定义心灵控制动画

  • 允许弹头播放自定义的 MindControl.Anim

rulesmd.ini

[SOMEWARHEAD]                         ; WarheadType
MindControl.Anim=                     ; Animation, defaults to [CombatDamage] -> ControlledAnimationType

自定义弹头水花

图像

  • 允许弹头自定义其水花动画,在此参阅原版的 Conventional 系统。SplashList.PickRandom 可设置为 true 以从列表中随机选择一个动画。

rulesmd.ini

[SOMEWARHEAD]                ; WarheadType
SplashList=                  ; List of AnimationTypes, default to [CombatDamage] -> SplashList
SplashList.PickRandom=false  ; boolean

伤害修正比

  • 现在弹头可以定义对己方所属、友方所属、敌方所属的额外伤害倍率。

    • DamageOwnerMultiplier.NotAffectsEnemiesDamageAlliesMultiplier.NotAffectsEnemies 用于设定弹头 AffectsEnemies=false 时的默认值。

    • DamageOwnerMultiplier.BerzerkDamageAlliesMultiplier.BerzerkDamageEnemiesMultiplier.Berzerk 在单位处于狂暴状态时被使用。

  • 一个基于开火者或目标剩余血量的额外伤害倍率将被纳入总倍率计算。具体而言:伤害倍率将先增加 (开火者剩余血量比 * DamageSourceHealthMultiplier),再增加 (目标剩余血量比 * DamageTargetHealthMultiplier)

  • 这些修正不会影响无视防御的伤害,例如 Suicide 等。

rulesmd.ini

[CombatDamage]
DamageOwnerMultiplier=1.0                                  ; floating point value
DamageAlliesMultiplier=1.0                                 ; floating point value
DamageEnemiesMultiplier=1.0                                ; floating point value
DamageOwnerMultiplier.NotAffectsEnemies=                   ; floating point value, default to [CombatDamage] -> DamageOwnerMultiplier
DamageAlliesMultiplier.NotAffectsEnemies=                  ; floating point value, default to [CombatDamage] -> DamageAlliesMultiplier
DamageOwnerMultiplier.Berzerk=                             ; floating point value, default to [CombatDamage] -> DamageOwnerMultiplier
DamageAlliesMultiplier.Berzerk=                            ; floating point value, default to [CombatDamage] -> DamageAlliesMultiplier
DamageEnemiesMultiplier.Berzerk=                           ; floating point value, default to [CombatDamage] -> DamageEnemiesMultiplier

[SOMEWARHEAD]                                              ; WarheadType
DamageOwnerMultiplier=                                     ; floating point value, default to [CombatDamage] -> DamageOwnerMultiplier or [CombatDamage] -> DamageOwnerMultiplier.NotAffectsEnemies, depending on AffectsEnemies
DamageAlliesMultiplier=                                    ; floating point value, default to [CombatDamage] -> DamageAlliesMultiplier or [CombatDamage] -> DamageAlliesMultiplier.NotAffectsEnemies, depending on AffectsEnemies
DamageEnemiesMultiplier=                                   ; floating point value, default to [CombatDamage] -> DamageEnemiesMultiplier
DamageOwnerMultiplier.Berzerk=                             ; floating point value, default to [CombatDamage] -> DamageOwnerMultiplier.Berzerk
DamageAlliesMultiplier.Berzerk=                            ; floating point value, default to [CombatDamage] -> DamageAlliesMultiplier.Berzerk
DamageEnemiesMultiplier.Berzerk=                           ; floating point value, default to [CombatDamage] -> DamageEnemiesMultiplier.Berzerk
DamageSourceHealthMultiplier=0.0                           ; floating point value
DamageTargetHealthMultiplier=0.0                           ; floating point value

备注

DamageAlliesMultiplier 不会像旧有的 AffectsAllies 那样作用于友方单位的同时还带上己方单位。

杀伤地下单位

  • 现在你可以让弹头对处于地下的单位造成伤害!

    • 若需允许武器瞄准地下单位,你需要在抛射体上将 AU 设为 yes

  • 注意如果弹头在地下引爆其动画效果可能显示异常。

    • 你可以使用 [WarheadType] -> PlayAnimUnderground=false 来阻止弹头在地下引爆时播放动画。

    • 你也可以使用 [WarheadType] -> PlayAnimAboveSurface=true 来使弹头在地下引爆时在其正上方地表处播放弹头动画。

rulesmd.ini

[SOMEWARHEAD]                         ; WarheadType
AffectsUnderground=false              ; boolean
PlayAnimUnderground=true              ; boolean
PlayAnimAboveSurface=false            ; boolean

全图弹头

  • 设置 DetonateOnAllMapObjects 为 true 允许由抛射体引爆的弹头(例如这不包括动画直接挂 Warhead 和 Ares 通用弹头超武所引爆的弹头,但包括 Crit.Warhead 和动画 Weapon(最好带有 Damage.DealtByInvoker=true 以避免部分特殊情况)所引爆的弹头)以及随之在后的任何 AirburstWeapon/ShrapnelWeapon,无论其实际目标如何,都可以对当前地图上所有存在且没死的对象进行引爆,并可以对目标进行筛选。注意,这是在弹头引爆之前的瞬间完成的,因此 PreImpactAnim(Ares 功能)可以显示。

    • DetonateOnAllMapObjects.Full 自定义弹头是否在目标上完全引爆(作为虚拟武器的一部分)或者只能对所在区域造成杀伤并应用 Phobos 的弹头效果。

    • DetonateOnAllMapObjects.AffectsTarget 用于在非 none 时筛选哪些类型的目标(科技类型)可被视为有效。仅 noneallaircraftbuildingsinfantryunits 是有效值。默认为 none,因为包含所有对象类型可能会影响性能。

    • DetonateOnAllMapObjects.AffectsHouse 用于在非 none 时筛选哪些所属方的目标可以被视为有效。仅适用于发射弹头的所属方已知的情况。默认为 none,因为包含所有所属方可能会影响性能。

    • DetonateOnAllMapObjects.AffectTypes 可用于列出特定的科技类型作为有效目标。如果列出了任何有效科技类型,则只有匹配的对象才会被作为目标。注意 DetonateOnAllMapObjects.AffectsTargetDetonateOnAllMapObjects.AffectsHouse 的优先级高于此设置。

    • DetonateOnAllMapObjects.IgnoreTypes 可用于列出特定的科技类型不得作为目标。

    • DetonateOnAllMapObjects.RequireVerses 如果设为 true 则只考虑弹头对其护甲类型具有非零 Verses 值的目标为有效。对于具有激活状态护盾的目标除非弹头拥有 Shield.Penetrate=true,否则使用护盾的护甲类型。在所有上述筛选之后进行检查。

rulesmd.ini

[SOMEWARHEAD]                                ; WarheadType
DetonateOnAllMapObjects=false                ; boolean
DetonateOnAllMapObjects.Full=true            ; boolean
DetonateOnAllMapObjects.AffectsTarget=none   ; List of Affected Target Enumeration (none|aircraft|buildings|infantry|units|all)
DetonateOnAllMapObjects.AffectsHouse=none    ; List of Affected House Enumeration (none|owner/self|allies/ally|team|enemies/enemy|all)
DetonateOnAllMapObjects.AffectTypes=         ; List of TechnoTypes
DetonateOnAllMapObjects.IgnoreTypes=         ; List of TechnoTypes
DetonateOnAllMapObjects.RequireVerses=false  ; boolean

警告

虽然此功能比巨大的 CellSpread 值性能上好得多但它仍然可能减慢游戏速度。特别是与动画、AlphaImage 等共同使用时。建议 modder 谨慎使用并通过筛选语句进行限制。

击杀武器

  • 被此弹头击杀时目标单位会爆出 KillWeapon 指定的武器。

  • 如果可以追溯到弹头来自哪个单位,那么 KillWeapon.OnFirer 可以让武器发射在开火者的位置。如果追溯不到来源那么将不会发射。

  • KillWeapon.AffectsHouseKillWeapon.OnFirer.AffectsHouseKillWeapon.OnFirer.AffectsTargetKillWeapon.OnFirer.AffectsTarget 分别用于筛选哪些所属方和哪些类型的目标可以触发 KillWeaponKillWeapon.OnFirer

    • 如果这个弹头的来源不是另一个单位,发射 KillWeapon 将不受目标所属方或类型的限制。

  • 如果单位 SuppressKillWeapons 设为 true 则其被击杀时不会触发 KillWeaponKillWeapon.OnFirerSuppressKillWeapons.Types 可用于列出受影响的武器类型,如果没有列出,则所有武器类型都受影响。

rulesmd.ini

[SOMEWARHEAD]                         ; WarheadType
KillWeapon=                           ; WeaponType
KillWeapon.OnFirer=                   ; WeaponType
KillWeapon.AffectsHouse=all           ; List of Affected House Enumeration (none|owner/self|allies/ally|team|enemies/enemy|all)
KillWeapon.OnFirer.AffectsHouse=all   ; List of Affected House Enumeration (none|owner/self|allies/ally|team|enemies/enemy|all)
KillWeapon.AffectsTarget=all          ; List of Affected Target Enumeration (none|aircraft|buildings|infantry|units|all)
KillWeapon.OnFirer.AffectsTarget=all  ; List of Affected Target Enumeration (none|aircraft|buildings|infantry|units|all)

[SOMETECHNO]                          ; TechnoType
SuppressKillWeapons=false             ; boolean
SuppressKillWeapons.Types=            ; List of WeaponTypes

撒币枪(弹)

图像 东方崛起 中的 TransactMoney 应用

  • 现在弹头可以在爆炸时向其所有者撒币。

    • TransactMoney.Display 可以设置是否显示给予或扣除的资金金额。给予时数字显示为绿色,扣除时显示为红色,并在出现后向上飘起。

      • TransactMoney.Display.AtFirer 如果设置则使资金出现在开火者处而非目标处。如果设置但开火者未知则无论如何都显示在目标处。

      • TransactMoney.Display.Houses 决定哪些所属方可以看到资金显示。

      • TransactMoney.Display.Offset 是资金显示中心的额外像素偏移量,默认为 0,0 即目标/开火者的中心。

rulesmd.ini

[SOMEWARHEAD]                        ; WarheadType
TransactMoney=0                      ; integer - credits added or subtracted
TransactMoney.Display=false          ; boolean
TransactMoney.Display.AtFirer=false  ; boolean
TransactMoney.Display.Houses=all     ; Affected House Enumeration (none|owner/self|allies/ally|team|enemies/enemy|all)
TransactMoney.Display.Offset=0,0     ; X,Y, pixels relative to default

铁幕与力场护盾的伤害穿透

  • 现在可以让弹头对被铁幕和力场护盾保护的对象造成伤害。PenetratesForceShield 默认为 PenetratesIronCurtain 的值。

    • 注意这不会影响关联伤害类效果(例如 Psychedelic)之外的弹头功能以及类似碎片生成和 AirburstWeapon 的引爆这类通常在攻击被抵消时本就不发生的效果。

rulesmd.ini

[SOMEWARHEAD]                ; WarheadType
PenetratesIronCurtain=false  ; boolean
PenetratesForceShield=       ; boolean

发射超武

  • 现在弹头可以在引爆时发射超级武器

    • LaunchSW 指定当弹头引爆时要发射的超级武器。如果超级武器的 Money.Amount 为负则发射的所属方还需要拥有足够的资金。

    • LaunchSW.RealLaunch 控制弹头的所有者是否需要拥有所有列出的超级武器。否则它们将无从发射。

    • LaunchSW.IgnoreInhibitors 设置是否忽略每个超级武器的 SW.InhibitorsSW.AnyInhibitor,否则只有未被抑制的超级武器会被发射。

    • LaunchSW.IgnoreDesignators 设置是否忽略每个超级武器的 SW.DesignatorsSW.AnyDesignator

    • LaunchSW.DisplayMoney 可以设置是否显示所发射超武 Money.Amount 而给予或扣除的资金金额。给予时数字显示为绿色,扣除时显示为红色,并在出现后向上飘起。

      • LaunchSW.DisplayMoney.Houses 决定哪些所属方可以看到资金显示。

      • LaunchSW.DisplayMoney.Offset 是资金显示中心的额外像素偏移量,默认为 0,0 即超级武器目标单元格处。

备注

  • 为使动画弹头/武器上的此逻辑生效必须设置 Damage.DealtByInvoker

  • 超级武器在弹头引爆的 单元格 上发射而不是通过点击发射。

rulesmd.ini

[SOMEWARHEAD]                     ; WarheadType
LaunchSW=                         ; List of SuperWeaponTypes
LaunchSW.RealLaunch=true          ; boolean
LaunchSW.IgnoreInhibitors=false   ; boolean
LaunchSW.IgnoreDesignators=true   ; boolean
LaunchSW.DisplayMoney=false       ; boolean
LaunchSW.DisplayMoney.Houses=all  ; Affected House Enumeration (none|owner/self|allies/ally|team|enemies/enemy|all)
LaunchSW.DisplayMoney.Offset=0,0  ; X,Y, pixels relative to default

警告

由于某些超级武器类型的特性并非所有超级武器都适合发射。请慎用!

移除寄生

  • 默认情况下如果单位从弹头收到负伤害(在 Verses 前计算)任何寄生单位都会被移除和删除。现在可以自定义此行为以禁用负伤害的移除效果或为任意弹头启用它。

  • RemoveParasite.Allow 定义哪些寄生者可以被移除。

  • RemoveParasite.Disallow 定义哪些寄生者不能被移除。

rulesmd.ini

[SOMEWARHEAD]             ; WarheadType
RemoveParasite=           ; boolean
RemoveParasite.Allow=     ; List of TechnoTypes
RemoveParasite.Disallow=  ; List of TechnoTypes

对运输工具的穿透伤害

  • 现在弹头引爆时可以杀伤乘客。

    • 如果弹头的 PenetratesTransport.Level 高于目标及其乘客的 PenetratesTransport.Level,则它会对乘客启用穿透伤害逻辑。

    • PenetratesTransport.PassThrough 为穿透的概率,实际概率还要乘上目标的 PenetratesTransport.PassThroughMultiplier

    • PenetratesTransport.FatalRate 为对乘客一击必杀的概率,实际概率还要乘上目标的 PenetratesTransport.FatalRateMultiplier

    • PenetratesTransport.DamageAll 控制伤害作用于运输工具的所有乘客还是随机选取其一。

    • PenetratesTransport.DamageMultiplier 是对乘客所造成伤害的倍率。

    • PenetratesTransport.CleanSound 会在乘客全部被击杀后播放。

rulesmd.ini

[CombatDamage]
PenetratesTransport.Level=10                    ; integer, default value of [TechnoType] -> PenetratesTransport.Level

[SOMEWARHEAD]                                   ; WarheadType
PenetratesTransport.Level=0                     ; integer
PenetratesTransport.PassThrough=1.0             ; double
PenetratesTransport.FatalRate=0.0               ; double
PenetratesTransport.DamageMultiplier=1.0        ; double
PenetratesTransport.DamageAll=false             ; boolean
PenetratesTransport.CleanSound=                 ; sound entry

[SOMETECHNO]                                    ; TechnoType
PenetratesTransport.Level=                      ; integer, default to [CombatDamage] -> PenetratesTransport.Level
PenetratesTransport.PassThroughMultiplier=1.0   ; double
PenetratesTransport.FatalRateMultiplier=1.0     ; double
PenetratesTransport.DamageMultiplier=1.0        ; double

移除伪装弹头

  • 弹头现在可以移除间谍或幻影坦克的伪装。即使伪装是通过 PermaDisguise 默认获得来的。

rulesmd.ini

[SOMEWARHEAD]         ; WarheadType
RemoveDisguise=false  ; boolean

归返弹头

  • 对于每个受该弹头影响的单位都会有一个在该弹头的所有者处引爆且属于自己的弹头。

    • ReturnWarhead 决定从目标“归返”回原弹头所有者的弹头类型。

    • ReturnWarhead.Damage 决定归返弹头造成的伤害。

    • ReturnWarhead.Chance 决定归返弹头发生的概率。默认情况下这在弹头爆炸时检查一次,每个受影响的目标都可能触发归返弹头。如果设置了 ReturnWarhead.ApplyChancePerTarget,那么每个目标是否成功触发归返的概率将单独计算。

    • ReturnWarhead.FullDetonation 控制弹头是否在目标上完全引爆(作为虚拟武器的一部分)或者只能对所在区域造成杀伤并应用 Phobos 的弹头效果。

    • ReturnWarhead.AffectsTarget 可用于自定义此弹头可触发归返的目标类型。归返弹头不能影响空置单元格或仅包含地形对象和覆盖物等的单元格。

    • ReturnWarhead.AffectsHouse 可用于自定义此弹头可触发归返的目标所属。

rulesmd.ini

[SOMEWARHEAD]                               ; WarheadType
ReturnWarhead=                              ; WarheadType
ReturnWarhead.Damage=0                      ; integer
ReturnWarhead.Chance=0.0                    ; floating point value, percents or absolute (0.0-1.0)
ReturnWarhead.ApplyChancePerTarget=false    ; boolean
ReturnWarhead.FullDetonation=true           ; boolean
ReturnWarhead.AffectsTarget=all             ; List of Affected Target Enumeration (none|land|water|infantry|units|buildings|all)
ReturnWarhead.AffectsHouse=all              ; List of Affected House Enumeration (none|owner/self|allies/ally|team|enemies/enemy|all)

警告

如果你将 ReturnWarhead 设为定义暴击的弹头或者创建一个最终回到第一个弹头的循环那么游戏可能会陷入循环并随后卡死或崩溃。

揭示弹

  • 现在弹头可以在引爆时揭示部分区域或整个地图的黑幕。

    • 仅适用于弹头所有者。

rulesmd.ini

[SOMEWARHEAD]  ; WarheadType
Reveal=0       ; integer, range in cells

备注

负值意味着揭示整张地图。

逆向工程弹头

  • 现在弹头可以使用逆向工程逻辑(Ares 功能),被命中的单位将会被逆向工程。

rulesmd.ini

[SOMEWARHEAD]          ; WarheadType
ReverseEngineer=false  ; boolean

警告

此功能需要 3.0 及以上版本的 Ares 才能运作!

将建筑出售或反部署

  • 现在拥有 BuildingSell 的弹头可以出售拥有拔起动画的建筑。它的优先级高于 BuildingUndeploy

    • BuildingSell.IgnoreUnsellable 控制是否忽略除了缺失拔起动画之外所有可能禁止建筑出售的情况。

  • 现在拥有 BuildingUndeploy 的弹头可以令目标建筑反部署为 UndeploysInto 的对象。

    • BuildingUndeploy.Leave 控制是否需要让它们移动到附近较低威胁的位置。这里的威胁程度使用科技类型的价格计算。如果附近的科技类型没有主武器或属于友方所属,那么不被计入。

rulesmd.ini

[SOMEWARHEAD]                        ; WarheadType
BuildingSell=false                   ; boolean
BuildingSell.IgnoreUnsellable=false  ; boolean
BuildingUndeploy=false               ; boolean
BuildingUndeploy.Leave=false         ; boolean

黑幕弹

  • 现在弹头可以在引爆时填充部分区域或整个地图的黑幕

    • 仅适用于敌对所属方。

rulesmd.ini

[SOMEWARHEAD]  ; WarheadType
CreateGap=0    ; integer, range in cells

备注

负值意味着遮蔽整张地图。

生成工具箱

  • 现在弹头可以在其引爆的单元格上创建指定类型的升级工具箱(如果空置,若被非工具箱的对象占据则生成到附近的单元格)类似于地图触发动作 108 创建工具箱...

    • SpawnsCrateN 中的 N 是从 0 开始的数字,游戏会解析到最后一个为止。用于定义每个生成的升级工具箱类型。

    • SpawnsCrateN.Weight 是一个用于确定生成对应升级工具箱类型与其他列出的类型相比的相对权重(0 表示没门,越高代表概率越高)如果未定义则默认为 1。

    • 如果未设置 SpawnsCrate0.Type/WeightSpawnsCrate.Type/Weight 是其别名。

rulesmd.ini

[SOMEWARHEAD]            ; WarheadType
SpawnsCrate(N).Type=     ; Powerup crate type enum (money|unit|healbase|cloak|explosion|napalm|squad|reveal|armor|speed|firepower|icbm|invulnerability|veteran|ionstorm|gas|tiberium|pod)
SpawnsCrate(N).Weight=1  ; integer

嘲讽弹头

  • 现在你可以使用以下标签使弹头“嘲讽”目标,这会覆盖其当前任务并强制其攻击伤害的来源。

    • 被嘲讽的目标将表现为进行反击的形式。

    • 如果是无源伤害,那么嘲讽将不会生效。

rulesmd.ini

[SOMEWARHEAD]    ; WarheadType
Taunt=false      ; boolean

设置按目标生效的弹头效果应用时机

  • 现在你可以通过将下列语句设为 false 来使 Phobos 弹头效果在每个目标受伤时而不只是在抛射体引爆时生效。

    • 这将允许此类效果通过包括但不限于来自粒子、原版辐射以及 Ares 的 Type=GenericWarhead 类超武造成的无抛射体杀伤效果生效。

    • 这也将导致这些弹头效果同样会被包括但不限于 DamageSelfDamageAirThresholdAffectsAlliesAffectsAir 的杀伤阻断效果阻断。

    • 如果你使用带有 CellSpread 的弹头对一个建筑造成多次杀伤,那么这些效果将被多次应用。若不希望如此则可使用 MergeBuildingDamage 来避免。

    • 适用的效果包括:

rulesmd.ini

[CombatDamage]                        ; WarheadType
ApplyPerTargetEffectsOnDetonate=true  ; boolean

[SOMEWARHEAD]                         ; WarheadType
ApplyPerTargetEffectsOnDetonate=      ; boolean, default to [CombatDamage] -> ApplyPerTargetEffectsOnDetonate

备注

  • Ares 弹头效果例如 EMP 或铁幕弹头将不受影响。

  • Ares 弹头效果控制器例如 EffectsRequireDamage 仅影响 Ares 效果。所以它们与此功能无关。

指定非人步兵死亡序列

  • 现在弹头可以使用相应的标签触发特定的 NotHuman=yes 步兵 Death 动画序列。其值代表从 Die1Die5

rulesmd.ini

[SOMEWARHEAD]            ; WarheadType
NotHuman.DeathSequence=  ; integer (1 to 5)

弹头击杀限制

  • 现在可以让一个弹头可以杀伤敌人但无法击杀它们(至少保留 1 滴血)。

rulesmd.ini

[SOMEWARHEAD]  ; WarheadType
CanKill=true   ; boolean

去虚拟化弹头

去虚拟化弹头 @八棱彩恐慌之矛的召唤 中使用的去虚拟化弹头

  • UnlimboDetonate 允许发射了拥有 LimboLaunch=yes 的武器的单位在弹头引爆后重新刷出(退出 Limbo 状态)。

    • UnlimboDetonate.ForceLocation 允许单位强制出现在抛射体爆炸的位置,否则它们会检索其他可用的单元格。

    • UnlimboDetonate.KeepTarget 允许单位进出 Limbo 状态前后保留原先的目标。

    • UnlimboDetonate.KeepSelected 允许单位进出 Limbo 状态前保留原先选中状态。

rulesmd.ini

[SOMEWARHEAD]                          ; WarheadType
UnlimboDetonate=false                  ; boolean
UnlimboDetonate.ForceLocation=false    ; boolean
UnlimboDetonate.KeepTarget=true        ; boolean
UnlimboDetonate.KeepSelected=true      ; boolean

警告

UnlimboDetonate 不能与 Parasite 共用。

武器

自定义 AreaFire 目标

  • 现在你可以指定 AreaFire 武器如何选择目标。默认情况下它会瞄准开火者当前所处的单元格,现在可以通过将 AreaFire.Target 设为 selfrandom 分别改为瞄准发开火者自身或武器 Range 范围内的随机单元格。

  • AreaFire.Target=self 遵守对开火者自身的正常目标筛选规则(弹头 Verses 等)。

  • AreaFire.Target=random 会忽略由武器 CanTargetCanTargetHouses 值设为不可作为目标的单元格或存在不可作为目标的对象的单元格。

rulesmd.ini

[SOMEWEAPON]         ; WeaponType
AreaFire.Target=base ; AreaFire Target Enumeration (base|self|random)

攻击无威胁建筑(武器定义)

  • AttackNoThreatBuildings 允许单位(主动)攻击无威胁建筑。这会覆盖其他设置。

rulesmd.ini

[SOMEWEAPON]                ; WeaponType
AttackNoThreatBuildings=    ; boolean

自定义 BurstDelay

  • Burst.Delays 允许为特定武器指定其连发间隔。优先于载具类型中就有的 BurstDelayX 逻辑,且适用于步兵和建筑类型的武器(由于战机类型武器的发射系统完全不同因此暂不支持),并允许独立设置每一发 Burst 之间的间隔而不仅限于第 1 发到第 4 发。

    • 如果未未某一发设定间隔那么它会使用上一发所定义的间隔(例如 Burst=3Burst.Delays=10 将使用 10 作为所有连发的间隔)。

    • 使用 -1 作为间隔会使该发使用旧逻辑(如果有则使用载具类型的 BurstDelay0-3 否则使用 3-5 之间的随机值)。

  • Burst.FireWithinSequence 仅在步兵或 Voxel=no 的无炮塔载具发射武器时使用,将其设为 true 以允许步兵/载具在同一射击序列内射出多发 Burst

    • 第一发始终在由步兵类型图像的射击帧(如 FireUp 等)确定的帧序列决定。

    • 后续的连发发射间隔由 Burst.Delays 决定(最小间隔为 1 帧)或未定义情况下使用随机 3 到 5 帧。注意如果下一发的发射帧超出了射击序列长度则连发计数器将被重置且武器会重新开始装填。

    • 如果在至少一发后停止射击则连发计数器不会立即重置,但每个连发的发射帧不会受此影响(换而言之,如果之后重新开始射击而武器没有重新装填,那么射击序列会重新开始,但不会发射任何直到下一发应该被发射的帧)。

rulesmd.ini

[SOMEWEAPON]                    ; WeaponType
Burst.Delays=-1                 ; integer - burst delays (comma-separated) for shots in order from first to last.
Burst.FireWithinSequence=false  ; boolean

无间隔连发

  • 原版中即便武器的 ROF 或载具的 BurstDelay 设为 0 也最快每帧发射一次。现在可以通过将 Burst.NoDelay 设为 true 强制单位在一帧内全部发射。

rulesmd.ini

[SOMEWEAPON]          ; WeaponType
Burst.NoDelay=false   ; boolean

备注

  • 此功能对建筑和战机无效。

  • 这会无视 Burst.Delays 设置。

自定义武器能否瞄准被铁幕作用中的对象

  • 在原版中,AI 玩家总是不会攻击被铁幕作用中的单位。现在你可以自定义这点。

    • CanTarget.IronCurtained 控制人类玩家,CanTargetAI.IronCurtained 控制 AI 玩家。

    • AutoTarget.IronCurtained 决定玩家控制的单位能否主动攻击铁幕保护中的目标。AI 只遵循 CanTarget.IronCurtained 而无视此设置。

rulesmd.ini

[CombatDamage]
CanTarget.IronCurtained=true        ; boolean
CanTargetAI.IronCurtained=false     ; boolean
AutoTarget.IronCurtained=true       ; boolean

[SOMEWEAPON]                        ; WeaponType
CanTarget.IronCurtained=            ; boolean, default to [CombatDamage] -> CanTarget.IronCurtained for human player and CanTargetAI.IronCurtained for computer
AutoTarget.IronCurtained=           ; boolean, default to [CombatDamage] -> AutoTarget.IronCurtained

延迟开火

  • 通过为武器设置 DelayedFire.Duration 可使其延迟开火 - 它支持单个整数或用逗号隔开的两个整数作为随机取值区间。

    • DelayedFire.SkipInTransport 设为 true 且开火者在运输工具中则这种情况下跳过延迟。

    • DelayedFire.Animation 可用于定义延时计时器启动时创建的动画。可用 DelayedFire.OpenToppedAnimation 单独定义开火者在运输工具中开火时创建的。

      • DelayedFire.AnimIsAttached 设为 true 则该动画将附着于开火的单位上。若 DelayedFire.RemoveAnimOnNoDelay 也设为 true,则在持续时间结束或开火被中断时无论是否播放完毕都立即移除动画。

      • DelayedFire.AnimOffset 可用于覆盖开火坐标来设置动画的位置。

      • DelayedFire.AnimOnTurret 决定在单位有炮塔的情况下该动画的位置是相对于开火单位的本体还是炮塔。

      • 若设置了 DelayedFire.CenterAnimOnFirer 则动画会创建于开火单位的中心而非开火坐标处。

    • 若该武器由一个步兵发射且 DelayedFire.PauseFiringSequence 为 true 则当步兵的动画序列达到其在 artmd.ini 中由 FireUp/ProneSecondaryFire/Prone 定义的开火帧时其开火序列动画将会暂停直至延时计时器结束。

    • 若武器 Burst > 1 且 DelayedFire.OnlyOnInitialBurst 为 true 则延迟仅在首次发射前生效。注意若使用了 Ares 则开火被中断或开火者失去目标时 Burst 索引不会重置,这意味着它可以无需等待延迟时间即可开火。

rulesmd.ini

[SOMEWEAPON]                           ; WeaponType
DelayedFire.Duration=                  ; integer - single or comma-sep. range (game frames)
DelayedFire.SkipInTransport=false      ; boolean
DelayedFire.Animation=                 ; Animation
DelayedFire.OpenToppedAnimation=       ; Animation
DelayedFire.AnimIsAttached=true        ; boolean
DelayedFire.AnimOffset=                ; integer - Forward,Lateral,Height
DelayedFire.AnimOnTurret=true          ; boolean
DelayedFire.CenterAnimOnFirer=false    ; boolean
DelayedFire.RemoveAnimOnNoDelay=false  ; boolean
DelayedFire.PauseFiringSequence=false  ; boolean
DelayedFire.OnlyOnInitialBurst=false   ; boolean

备注

战机类单位由于其独特的攻击模式并不会等待延迟结束后才尝试开火而是延迟过长时会不开火直接继续飞。

额外射程

  • 现在你可以在开火者或目标处于特定状态时调整武器的射程。此功能仅在攻击过程中有效且不影响例如寻路等其他行为。

  • ExtraRange.TargetMoving目标 正在移动时提供的额外射程。

    • ExtraRange.TargetMoving.CloseRangeOnly 用于全局默认值是否仅适用于拥有 CloseRange=yes 的单位。

  • ExtraRange.FirerMoving开火者 正在移动时提供的额外射程。

  • ExtraRange.Prefiring 当开火者处于预开火状态时提供的额外射程,该状态包括:

    • 拥有 FiringSyncFrame%d 等标签的载具。

    • 正在开火的飞行器。

    • 拥有 IsAnimDelayedFire 等标签的建筑。

    • 拥有 FireUp 等标签的步兵。

    • 任何拥有 DelayedFire 的单位。

    • ExtraRange.Prefiring.IncludeBurst 用于决定连发过程是否被视为预开火状态。

rulesmd.ini

[General]
ExtraRange.TargetMoving=0.0                     ; floating point value, range in cells
ExtraRange.TargetMoving.CloseRangeOnly=false    ; boolean
ExtraRange.FirerMoving=0.0                      ; floating point value, range in cells
ExtraRange.Prefiring=0.0                        ; floating point value, range in cells
ExtraRange.Prefiring.IncludeBurst=true          ; boolean

[SOMEWEAPON]                                    ; WeaponType
ExtraRange.TargetMoving=                        ; floating point value, range in cells, the default values refer to the descriptions above
ExtraRange.FirerMoving=                         ; floating point value, range in cells, default to [General] -> ExtraRange.FirerMoving
ExtraRange.Prefiring=                           ; floating point value, range in cells, default to [General] -> ExtraRange.Prefiring
ExtraRange.Prefiring.IncludeBurst=              ; boolean, default to [General] -> ExtraRange.Prefiring.IncludeBurst

备注

  • 在原版中,近战单位即便追得上正在逃离的敌人也难以对其发起攻击。这是因为游戏的寻路算法以单元格为单位寻找开火位置,这会对近战单位产生不可接受的误差,导致目标总是在其足够靠近前逃出攻击范围。

  • 具有各类预开火行为的单位也存在类似的问题。目标可能在单位开火前移出射程。

  • 此功能可解决上述问题。

额外弹头

  • 现在可以通过列出 ExtraWarheads 来让同一武器在命中时引爆多个弹头。这些弹头会在主弹头爆炸后按列出的顺序在同一位置引爆。这仅适用于由武器发射且引爆时仍保留其信息的抛射体(由于目前存在的技术限制,这不包括 AirburstWeapon)。

    • ExtraWarheads.DamageOverrides 可用于额外弹头引爆时覆盖武器的 Damage 属性。如果找到 ExtraWarheads 中与之对应的值则使用,否则使用最后列出的值。如果列表为空则使用武器的 Damage 属性。

    • ExtraWarheads.DetonationChances 可用于自定义每个额外弹头爆炸的概率。如果找到 ExtraWarheads 中与之对应的值则使用,否则使用最后列出的值。如果列表为空则每个额外弹头都必然引爆。

    • ExtraWarheads.FullDetonation 可用于设置每个额外弹头是否在目标上完全引爆(作为虚拟武器的一部分)或者只能对所在区域造成杀伤并应用 Phobos 的弹头效果。如果找到 ExtraWarheads 中与之对应的值则使用,否则使用最后列出的值。如果列表为空则默认为 true。

    • 注意列出的弹头必须在 [Warheads] 中列出才能生效。

  • 使用这些标签可以使这些弹头变得随机。游戏将根据每个提供的 “掷骰子” 概率随机选择列表中的一个建筑。

    • ExtraWarheads.RollChances 是 “掷骰子” 发生的概率列表。有效值的范围为 0%(从不发生)到 100%(总是发生)。默认为单次必出。

    • ExtraWarheads.RandomWeightsN 是每个 “掷骰子” 发生概率的权重列表。有效值为 0(从不发生)到 100%(总是发生)。RandomWeightsRandomWeights0 的有效别名。如果掷骰尝试没有指定权重,则使用最后一个权重。

rulesmd.ini

[SOMEWEAPON]                      ; WeaponType
ExtraWarheads=                    ; List of WarheadTypes
ExtraWarheads.DamageOverrides=    ; List of integers
ExtraWarheads.DetonationChances=  ; List of floating-point values (percentage or absolute)
ExtraWarheads.FullDetonation=     ; List of booleans
ExtraWarheads.RollChances=        ; List of percentages
ExtraWarheads.RandomWeightsN=     ; List of integers

反馈武器

图像 幽灵计划 中使用反馈武器在发射武器时对目标施加治疗光环

  • 现在你可以指定一个辅助武器在发射武器时对开火者自身发射。

    • 当原始武器于运输工具内的载员使用时反馈武器会根据自身的 FireInTransport 决定能否发射。如果反馈武器被发射那么它将命中运输工具。注:OpenToppedDamageMultiplier 不适用于反馈武器。

rulesmd.ini

[SOMEWEAPON]     ; WeaponType
FeedbackWeapon=  ; WeaponType

开火后保持距离

  • 如果 KeepRange 没有设为 0 那么科技类型可以在开火后与目标保持适当的距离。

    • KeepRange 的绝对值控制科技类型 ROF 期间要保持的距离。对于正值会让科技类型保持在该距离之外,就像它有一个开火后的 MinimumRange。对于负值则科技类型会尽可能保持在该距离附近,就像它有一个开火后的特殊 Range。此外如果有效射程区间太小单位将被视为无法开火。最好有一个 1.0 长度的有效射程,对步兵而言为 2.0。

      • KeepRange.AllowAI 控制此功能是否对 AI 玩家生效。

      • KeepRange.AllowPlayer 控制此功能是否对人类玩家生效。

      • 如果单位开火剩余 CD 短于 KeepRange.EarlyStopFrame 的时间则该功能不会生效。

备注

也就是说执行 KeepRange 效果的总时长 = 武器 ROF 的值 - KeepRange.EarlyStopFrame 的值。

rulesmd.ini

[SOMEWEAPON]                  ; WeaponType
KeepRange=0                   ; floating point value
KeepRange.AllowAI=false       ; boolean
KeepRange.AllowPlayer=false   ; boolean
KeepRange.EarlyStopFrame=0    ; integer

OmniFire=yes 下转向

  • 即便使用 OmniFire=yes 的武器开火单位也会尝试将车体转向目标。

    • 建议 Jumpjet 的 ROTJumpjetTurnRate 相同。

rulesmd.ini

[SOMEWEAPON]              ; WeaponType, with OmniFire=yes
OmniFire.TurnToTarget=no  ; boolean

辐射增强

  • 除了允许自定义辐射类型外还有对于默认辐射类型 [Radiation] 的增强,例如可以设置所有者与开火者或对建筑造成伤害。详见自定义辐射类型

圆柱形射程

  • 在原版中,处于空中的单位在检查目标是否处于射程内时会忽略 Z 轴的距离。现在你可以用下面的语句使单位总是这样进行射程计算。

  • [General] -> CylinderRangefinding 进行全局控制,也可在每个武器上自定义。

  • 注意将语句设为 false 意味着「使用默认规则」而不是「禁用」。空中单位无论此值如何始终使用圆柱形射程。

rulesmd.ini

[General]
CylinderRangefinding=false        ; boolean

[SOMEWEAPON]                      ; WeaponType
CylinderRangefinding=             ; boolean

自定义战机扫射

图像 幽灵计划 中的自定义战机扫射武器

  • 现在可以自定义战机扫射武器的一些行为。

    • Strafing 控制战机在目标射击时是否可以扫射。如果抛射体 ROT < 2 且 Inviso=false 并且没有 Trajectory 则默认为 true 其他情况为 false

    • Strafing.Shots 控制在单次扫射过程中武器发射的次数,如果未设置则默认为 5。Ammo 只会在扫射结束后扣除一次,无论实际多少次。

    • Strafing.SimulateBurst 控制在扫射过程中发射的武器是否模拟 Burst 的行为,即允许交替开火坐标。仅当武器 Burst 设置为 1 或未定义时才有效。

    • Strafing.UseAmmoPerShot 如果设为 true 将在每次开火后都扣除弹药而不是通常的仅在扫射结束后才扣除弹药。

    • Strafing.TargetCell 控制战机是否会在第一发后将目标切换为地板以确保与 Strafing.Shots 设定的次数一致。也就是扫射不再会由于目标被摧毁而中断。

    • Strafing.EndDelay 可用于覆盖战机在扫射过程中射出最后一发后进行另一轮扫射或返航前的时间间隔。默认为 ([WeaponType] -> Range * 256 + 1024) / [AircraftType] -> Speed。注意对于弹药量足够进行多次扫射的战机而言过短的间隔可能导致并不理想的行为例如四处游走或朝向怪异的方向,具体取决于 [WeaponType] -> ROF[AircraftType] -> Speed 等其他因素。

  • 对于 Type=SpyPlane 超级武器生成的战机在 SpyPlane ApproachSpyPlane Overfly 任务中的情况 Strafing.Shots 只有在其主武器上手动设置才会生效并决定地图揭示效果的最大次数而无视其他因素。

rulesmd.ini

[SOMEWEAPON]                   ; WeaponType
Strafing=                      ; boolean
Strafing.Shots=                ; integer
Strafing.SimulateBurst=false   ; boolean
Strafing.UseAmmoPerShot=false  ; boolean
Strafing.TargetCell=false      ; boolean
Strafing.EndDelay=             ; integer, game frames

视觉效果散布

  • 现在你可以在 VisualScatter 设为 true 时为视觉效果(IsLaser=trueIsElectricBolt=trueIsRadBeam=true)添加一个随机偏移。

rulesmd.ini

[AudioVisual]
VisualScatter.Min=0.03  ; floating point value, distance in cells
VisualScatter.Max=0.13  ; floating point value, distance in cells

[SOMEWEAPON]            ; WeaponType
VisualScatter=false     ; boolean

备注

此功能仅叠加到视觉效果原本的散布上,也就是说它独立于 BallisticScatter.(Min/Max) 且可共同使用,不会影响抛射体实际爆点的散布。

武器瞄准筛选

图像 幽灵计划 中的武器瞄准筛选 - 就像分别对单位和建筑使用那样对敌军和友军使用不同武器

  • 现在你可以指定武器可以开火的目标或所属方。这还会影响武器选择,除了某些特殊情况下的固定选择。

    • CanTarget.MaxHealthCanTarget.MinHealth 用于设置可被攻击的(仅单位)目标所需的血量阈值,分别要求目标血量必须高于和/或低于/等于的限制。若目标血量为 0 则跳过检查。

rulesmd.ini

[SOMEWEAPON]                ; WeaponType
CanTarget=all               ; List of Affected Target Enumeration (none|land|water|empty|infantry|units|buildings|all)
CanTargetHouses=all         ; List of Affected House Enumeration (none|owner/self|allies/ally|team|enemies/enemy|all)
CanTarget.MaxHealth=1.0     ; floating point value, percents or absolute
CanTarget.MinHealth=0.0     ; floating point value, percents or absolute
CanTargetVeterancy=all      ; List of Affected Veterancy Enumeration (none|rookie|veteran|elite|all)

备注

CanTarget 要求明确列出 allempty 才能对不包含任何科技类型的单元格开火。