新增或增强的逻辑

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

新类型或游戏内实体

新的 AE 逻辑

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

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

    • 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 的武器。

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

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

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

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

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

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

      • Animation.UseInvokerAsOwner 可以设置赋予 AE 的所属方和科技类型(例如武器的发射者)为 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 自然结束或被移除后触发。

    • 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.AffectsHouses 定义哪些所属方可以触发这个复仇武器。

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

      • 可以将弹头的 SuppressReflectDamage 设为 true 来避免触发伤害反弹效果。SuppressReflectDamage.Types 可以控制哪些 AE 类型的反弹伤害效果会被抑制。如果留空则代表所有 AE 类型。

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

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

    • 可以通过在 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.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

[AttachEffectTypes]
0=SOMEATTACHEFFECT

[SOMEATTACHEFFECT]                                 ; AttachEffectType
Duration=0                                         ; integer - game frames or negative value for indefinite duration
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
PenetratesIronCurtain=false                        ; boolean
PenetratesForceShield=                             ; boolean
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
Tint.Color=                                        ; integer - R,G,B
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.AffectsHouses=all                    ; List of Affected House Enumeration (none|owner/self|allies/ally|team|enemies/enemy|all)
ReflectDamage=false                                ; boolean
ReflectDamage.Warhead=                             ; WarheadType
ReflectDamage.Warhead.Detonate=false               ; WarheadType
ReflectDamage.Multiplier=1.0                       ; floating point value, percents or absolute
ReflectDamage.AffectsHouses=all                    ; List of Affected House Enumeration (none|owner/self|allies/ally|team|enemies/enemy|all)
DisableWeapons=false                               ; boolean
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.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

自定义辐射类型

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

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

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

    • 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 - R,G,B
RadSiteWarhead=RadSite             ; WarheadType
RadSiteWarhead.Detonate=false      ; boolean
RadSiteWarhead.Detonate.Full=true  ; boolean
RadHasOwner=false                  ; boolean
RadHasInvoker=false                ; boolean

警告

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

激光尾焰

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

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

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

artmd.ini

[LaserTrailTypes]
0=SOMETRAIL

[SOMETRAIL]                      ; LaserTrailType name
IsHouseColor=false               ; boolean
Color=255,0,0                    ; integer - R,G,B
FadeDuration=64                  ; integer
Thickness=4                      ; integer
SegmentLength=128                ; integer, minimal length of each trail segment
IgnoreVertical=false             ; boolean, whether the trail won't be drawn on vertical movement
IsIntense=false                  ; boolean, whether the laser is "supported" (AKA prism forwarding)
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

[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

[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 name
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
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
Respawn=0.0                                 ; floating point value, percents or absolute
Respawn.Rate=0.0                            ; floating point value, ingame minutes
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
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=                                  ; AnimationType
HitAnim=                                    ; AnimationType
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 - R,G,B
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=                           ; AnimationType
Shield.HitAnim=                             ; AnimationType
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.RestartTimer=false           ; boolean
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

    • 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 指定的帧数后。

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

  • 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 帧。

    • 以上配置支持基于每个护盾类型单独设置,例如使用 [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.Amount 会在 Shield.Respawn.Duration 的帧数内覆盖护盾的 Respawn.RateRespawn.Amount。负值和 0 会默认使用护盾类型自身的值。如果设置了 Shield.Respawn.RestartTimer 当前正在使用的护盾重生计时器将被重置否则计时器将被根据新的 Shield.Respawn.Rate 按比例进行调整(例如计时器在前后保持相同百分比的进度)而不会重置。如果效果在重生计时器运作状态中失效,剩余时间也同样会按比例调整为护盾自身的Respawn.Rate。重新应用效果会将持续时间重置为 Shield.Respawn.Duration

    • 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)以及是否已被击碎的状态。恢复和重生计时器将始终被重置。

动画

动画生成单位

图像

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

    • CreateUnit.Owner 决定创建的单位属于哪个所属方。这仅在动画拥有所有者的情况生效。

      • 载具摧毁动画、弹头 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.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=                  ; AnimationType
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

自定义动画可见性

  • 现在可以通过 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 定义的距离内)的建筑类型。如果留空则任何建筑类型都可以。

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

rulesmd.ini

[SOMEBUILDING]              ; BuildingType
Adjacent.Allowed=           ; List of BuildingTypes
Adjacent.Disallowed=        ; List of BuildingTypes
NoBuildAreaOnBuildup=false  ; boolean

可摧毁的寻路障碍

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

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

rulesmd.ini

[SOMEBUILDING]               ; BuildingType
IsDestroyableObstacle=false  ; boolean

拓展的建筑加载物

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

备注

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

  • 现在建筑加载物可以放置在己方建筑、友方建筑乃至敌方建筑上。这三种所有者可以通过 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

电厂增幅器

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

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

rulesmd.ini

[SOMEBUILDING]                     ; BuildingType
PowerPlantEnhancer.PowerPlants=    ; List of BuildingTypes
PowerPlantEnhancer.Amount=0        ; integer
PowerPlantEnhancer.Factor=1.0      ; floating point value

间谍效果

  • 可以通过 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 已从 [AudioVisual] 中解码并可以单独为每个奴隶类步兵类型微观设置。

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

抛射体

抛射体拦截

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

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

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

      • The interceptor weapon may need AA set to true on its projectile to be able to target projectiles depending on their elevation from ground. If you don’t set those then the weapon won’t be able to target high-flying projectiles respectively.

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

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

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

    • 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.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.VeteranMinimumGuardRange=      ; floating point value
Interceptor.EliteMinimumGuardRange=        ; floating point value
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 定义在抛射体上而不是武器上。

rulesmd.ini

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

直线弹道

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

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

    • Trajectory.Straight.DetonationDistance 控制抛射体强制引爆位置相对于目标单元格的距离阈值(每个游戏帧开始时、抛射体移动前检查)。设为 0 以禁用强制引爆(注意这可能导致抛射体飞掠目标)。如果 Trajectory.Straight.ApplyRangeModifiers 设为 true 则发射者的任何适用于武器射程的修正也将在此处被使用。

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

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

rulesmd.ini

[SOMEPROJECTILE]                               ; Projectile
Trajectory=Straight                            ; Trajectory type
Trajectory.Straight.DetonationDistance=0.4     ; floating point value
Trajectory.Straight.ApplyRangeModifiers=false  ; boolean
Trajectory.Straight.TargetSnapDistance=0.5     ; floating point value
Trajectory.Straight.PassThrough=false          ; boolean

轰击弹道

  • 类似于 Straight 但瞄准目标上方的某个坐标(高度由 Trajectory.Bombard.Height 决定)。当抛射体接近该坐标后它将自由落体并在击中目标或地面时引爆。

rulesmd.ini

[SOMEPROJECTILE]               ; Projectile
Trajectory=Bombard             ; Trajectory type
Trajectory.Bombard.Height=0.0  ; double

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

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

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

rulesmd.ini

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

归返武器

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

rulesmd.ini

[SOMEPROJECTILE]  ; Projectile
ReturnWeapon=     ; WeaponType

超级武器

AI 超级武器发射延迟

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

rulesmd.ini

[General]
AISuperWeaponDelay=  ; integer, game frames

单位转换超武

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

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

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

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

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

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

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

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

rulesmd.ini

[SOMESW]                        ; SuperWeaponType
ConvertN.From=                  ; List of TechnoTypes
ConvertN.To=                    ; TechnoType
ConvertN.AffectedHouses=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.AffectedHouses=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 否则始终默认使用主武器的 RangeMinimumRange 执行瞄准限制。

  • 现在如果发射的超级武器拥有 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.Affected 设置那个所属方受此效果影响。

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

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

    • 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.Affected=self         ; Affected House Enumeration (none|owner/self|allies/ally|team|enemies/enemy|all)
LimboKill.IDs=                  ; List of numeric IDs.

警告

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

Next

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

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

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

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

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

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

科技类型

子机发射器自定义

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

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

    • Spawner.ExtraLimitRange 是基于武器射程对追击范围的额外调整量。

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

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

rulesmd.ini

[SOMETECHNO]                       ; TechnoType
Spawner.LimitRange=false           ; boolean
Spawner.ExtraLimitRange=0          ; integer, range in cells
Spawner.DelayFrames=               ; integer, game frames
Spawner.AttackImmediately=false    ; boolean

自动删除乘客

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

    • 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         ; float, 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=                         ; AnimationType
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

自动发射武器

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

rulesmd.ini

[SOMETECHNO]               ; TechnoType
AutoFire=false             ; boolean
AutoFire.TargetSelf=false  ; boolean

建造限制组

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

  • 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 - R,G,B
Tint.Intensity=0.0        ; floating point value
Tint.VisibleToHouses=all  ; List of Affected House Enumeration (none|owner/self|allies/ally|team|enemies/enemy|all)

自定义 OpenTopped 属性

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

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

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

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

[SOMETECHNO]                              ; TechnoType
OpenTopped.RangeBonus=                    ; integer, override of the global default
OpenTopped.DamageMultiplier=              ; floating point value, override of the global default
OpenTopped.WarpDistance=                  ; integer, override of the global default
OpenTopped.IgnoreRangefinding=false       ; boolean
OpenTopped.AllowFiringIfDeactivated=true  ; boolean
OpenTopped.ShareTransportTarget=true      ; boolean

单位出售音效

  • 当建筑或单位被出售时将向所有者播放出售音效和 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

伪装逻辑增强

  • 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

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 的海军对水下目标行为

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

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

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

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

rulesmd.ini

[SOMETECHNO]                    ; TechnoType
ForceWeapon.Naval.Decloaked=-1  ; integer. 0 for primary weapon, 1 for secondary weapon, -1 to disable
ForceWeapon.Cloaked=-1          ; integer. 0 for primary weapon, 1 for secondary weapon, -1 to disable
ForceWeapon.Disguised=-1        ; integer. 0 for primary weapon, 1 for secondary weapon, -1 to disable

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

图像 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 则对象死亡。

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

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

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

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

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

  • 自毁行为有以下选择:

    • kill:对象将正常摧毁。

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

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

如果未设置此项那么自毁逻辑将不会启用。如果选择 vanish 行为,那么可以使用 AutoDeath.VanishAnimation 设置自毁时播放的动画。

备注

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

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

rulesmd.ini

[SOMETECHNO]                                   ; TechnoType
AutoDeath.Behavior=                            ; enumeration (kill | vanish | sell), default not set
AutoDeath.VanishAnimation=                     ; AnimationType
AutoDeath.OnAmmoDepletion=no                   ; boolean
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)

心灵控制增强

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

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

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

rulesmd.ini

[SOMETECHNO]                          ; TechnoType
MindControlRangeLimit=-1.0            ; floating point value
MultiMindControl.ReleaseVictim=false  ; boolean

禁止手动移动

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

rulesmd.ini

[SOMETECHNO]        ; TechnoType
NoManualMove=false  ; boolean

升级动画

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

    • Promote.VeteranAnimation 用于单位或建筑升级为老兵时。

    • Promote.EliteAnimation 用于单位或建筑升级为精英时。

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

rulesmd.ini

[AudioVisual]
Promote.VeteranAnimation=         ; AnimationType
Promote.EliteAnimation=           ; AnimationType

复仇武器

图像 RA2: Reboot 中的复仇武器

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

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

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

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

rulesmd.ini

[SOMETECHNO]                    ; TechnoType
RevengeWeapon=                  ; WeaponType
RevengeWeapon.AffectsHouses=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

武器在传送时开火

  • 现在可以在科技类型传送来/去时发射武器。它们会与相应的 (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

变形后重置心控效果

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

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

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

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

rulesmd.ini

[SOMETECHNO]                            ; TechnoType
Convert.ResetMindControl=               ; boolean, default to false

地形对象

摧毁动画与音效

  • 现在你可以指定当地形对象被摧毁时播放播放的摧毁动画与音效。

rulesmd.ini

[SOMETERRAINTYPE]  ; TerrainType
DestroyAnim=       ; AnimationType
DestroySound=      ; Sound entry

弹头

提示

所有新增的弹头效果

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

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

  • 在适用的情况下除非 EffectsRequireVerses 设为 false 否则尊重 Verses。如果目标拥有一个激活的护盾,那么它的护甲类型将被使用,除非弹头可以穿透护盾。

解除心控

图像 RA2: Reboot 中的心控解除弹头

  • 弹头现在可以解除心灵控制(不适用于永久心控的对象)。

rulesmd.ini

[SOMEWARHEAD]            ; WarheadType
RemoveMindControl=false  ; boolean

暴击

  • 现在弹头可以基于概率额外造成暴击伤害或弹头爆炸,可以自定义暴击的概率、伤害、影响目标、受影响目标生命值阈值和暴击动画。

    • Crit.Chance 决定暴击发生的概率。默认情况下这在弹头爆炸时检查一次,每个受影响的目标都可能受到暴击。如果设置了 Crit.ApplyChancePerTarget,那么每个目标是否成功进行暴击的概率将单独计算。

    • Crit.ExtraDamage 决定暴击造成的额外伤害,如果设置了 Crit.Warhead,那么伤害将用于在每个受影响的目标上引爆指定的弹头,否则伤害将基于当前弹头的 Verses 设置直接造成伤害。

    • Crit.Warhead 可用于设置一个替代当前弹头引爆的弹头。

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

    • Crit.Affects 可用于自定义此弹头可暴击的目标类型。暴击不能影响空置单元格或仅包含地形对象和覆盖物等的单元格。

    • Crit.AffectsHouses 可用于自定义此弹头可暴击的目标所属。

    • Crit.AffectBelowPercent 可用于设置暴击允许的目标其剩余血量相对最大 Strength 的百分比下限。

    • 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.Warhead=                               ; WarheadType
Crit.Warhead.FullDetonation=true            ; boolean
Crit.Affects=all                            ; List of Affected Target Enumeration (none|land|water|infantry|units|buildings|all)
Crit.AffectsHouses=all                      ; List of Affected House Enumeration (none|owner/self|allies/ally|team|enemies/enemy|all)
Crit.AffectBelowPercent=1.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.AffectedHouses 指定哪些所属方的单位可以被转换。

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

例如这个弹头可以将所有被影响的己方和友方 SOLDIERASOLDIERB 转换为 NEWSOLDIER

[ExampleWH]
Convert.From=SOLDIERA,SOLDIERB
Convert.To=NEWSOLDIER
Convert.AffectedHouses=team

rulesmd.ini

[SOMEWARHEAD]                   ; WarheadType
ConvertN.From=                  ; List of TechnoTypes
ConvertN.To=                    ; TechnoType
ConvertN.AffectedHouses=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.AffectedHouses=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=<none>            ; List of AnimationTypes
SplashList.PickRandom=false  ; boolean

全图弹头

  • 设置 DetonateOnAllMapObjects 为 true 允许由抛射体引爆的弹头(例如这不包括动画 Warhead 和 Ares 的通用弹头超武,但包括 Crit.Warhead 和动画 Weapon)以及随之在后的任何 Airburst/ShrapnelWeapon,无论其实际目标如何,都可以对当前地图上所有存在且没死的对象进行引爆,并可以对目标进行筛选。注意,这是在弹头引爆之前的瞬间完成的,因此 PreImpactAnim(Ares 功能)可以显示。

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

    • DetonateOnAllMapObjects.AffectTargets 用于在非 none 时筛选哪些类型的目标(科技类型)可被视为有效。仅 noneallaircraftbuildingsinfantryunits 是有效值。默认为 none,因为包含所有对象类型可能会影响性能。

    • DetonateOnAllMapObjects.AffectHouses 用于在非 none 时筛选哪些所属方的目标可以被视为有效。仅适用于发射弹头的所属方已知的情况。默认为 none,因为包含所有所属方可能会影响性能。

    • DetonateOnAllMapObjects.AffectTypes 可用于列出特定的科技类型作为有效目标。如果列出了任何有效科技类型,则只有匹配的对象才会被作为目标。注意 DetonateOnAllMapObjects.AffectTargetsDetonateOnAllMapObjects.AffectHouses 的优先级高于此设置。

    • DetonateOnAllMapObjects.IgnoreTypes 可用于列出特定的科技类型不得作为目标。

    • DetonateOnAllMapObjects.RequireVerses 如果设为 true 则只考虑弹头对其护甲类型具有非零 Verses 值的目标为有效。对于具有激活状态护盾的目标除非弹头拥有 Shield.Penetrate=true,否则使用护盾的护甲类型。在所有上述筛选之后进行检查。

rulesmd.ini

[SOMEWARHEAD]                                ; WarheadType
DetonateOnAllMapObjects=false                ; boolean
DetonateOnAllMapObjects.Full=true            ; boolean
DetonateOnAllMapObjects.AffectTargets=none   ; List of Affected Target Enumeration (none|aircraft|buildings|infantry|units|all)
DetonateOnAllMapObjects.AffectHouses=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 谨慎使用并通过筛选语句进行限制。

撒币枪(弹)

图像 东方崛起 中的 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 前计算)任何寄生单位都会被移除和删除。现在可以自定义此行为以禁用负伤害的移除效果或为任意弹头启用它。

rulesmd.ini

[SOMEWARHEAD]     ; WarheadType
RemoveParasite=   ; boolean

移除伪装

  • 弹头现在可以移除间谍或幻影坦克的伪装。即使伪装是通过 PermaDisguise 默认获得来的。

rulesmd.ini

[SOMEWARHEAD]         ; WarheadType
RemoveDisguise=false  ; boolean

揭示弹

  • 现在弹头可以在引爆时揭示整个地图的黑幕。

    • 仅适用于弹头所有者。

rulesmd.ini

[SOMEWARHEAD]  ; WarheadType
SpySat=false   ; boolean

黑幕弹

  • 现在弹头可以在引爆时填充整个地图的黑幕

    • 仅适用于敌对所属方。

rulesmd.ini

[SOMEWARHEAD]  ; WarheadType
BigGap=false   ; boolean

生成工具箱

  • 现在弹头可以在其引爆的单元格上创建指定类型的升级工具箱(如果空置,若被非工具箱的对象占据则生成到附近的单元格)类似于地图触发动作 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

指定非人步兵死亡序列

  • 现在弹头可以使用相应的标签触发特定的 NotHuman=yes 步兵 Death 动画序列。其值代表从 Die1Die5

rulesmd.ini

[SOMEWARHEAD]            ; WarheadType
NotHuman.DeathSequence=  ; integer (1 to 5)

武器

自定义 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)

自定义 BurstDelay

  • Burst.Delays 允许为特定武器指定其连发间隔。优先于载具类型中就有的 BurstDelayX 逻辑,且适用于步兵和建筑类型的武器(由于战机类型武器的发射系统完全不同因此暂不支持),并允许独立设置每一发 Burst 之间的间隔而不仅限于第 1 发到第 4 发。

    • 如果未未某一发设定间隔那么它会使用上一发所定义的间隔(例如 Burst=3Burst.Delays=10 将使用 10 作为所有连发的间隔)。

    • 使用 -1 作为间隔会使该发使用旧逻辑(如果有则使用载具类型的 BurstDelay0-3 否则使用 3-5 之间的随机值)。

  • Burst.FireWithinSequence 仅在步兵发射武器时使用,将其设为 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

额外弹头

  • 现在可以通过列出 ExtraWarheads 来让同一武器在命中时引爆多个弹头。这些弹头会在主弹头爆炸后按列出的顺序在同一位置引爆。这仅适用于由武器发射且引爆时仍保留其信息的抛射体(由于目前存在的技术限制,这不包括 AirburstWeapon)。

    • ExtraWarheads.DamageOverrides 可用于额外弹头引爆时覆盖武器的 Damage 属性。如果找到 ExtraWarheads 中与之对应的值则使用,否则使用最后列出的值。如果列表为空则使用武器的 Damage 属性。

    • ExtraWarheads.DetonationChances 可用于自定义每个额外弹头爆炸的概率。如果找到 ExtraWarheads 中与之对应的值则使用,否则使用最后列出的值。如果列表为空则每个额外弹头都必然引爆。

    • ExtraWarheads.FullDetonation 可用于设置每个额外弹头是否在目标上完全引爆(作为虚拟武器的一部分)或者只能对所在区域造成杀伤并应用 Phobos 的弹头效果。如果找到 ExtraWarheads 中与之对应的值则使用,否则使用最后列出的值。如果列表为空则默认为 true。

    • 注意列出的弹头必须在 [Warheads] 中列出才能生效。

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

反馈武器

图像 幽灵计划 中使用反馈武器在发射武器时对目标施加治疗光环

  • 现在你可以指定一个辅助武器在发射武器时对开火者自身发射。

    • FireInTransport 设置当原始武器从内部 OpenTopped=true 的运输工具中开火时是否可以发射反馈武器。如果反馈武器被发射,它会在运输工具上发射。OpenToppedDamageMultiplier 不适用于反馈武器。

rulesmd.ini

[SOMEWEAPON]     ; WeaponType
FeedbackWeapon=  ; WeaponType

OmniFire=yes 下转向

  • 即便使用 OmniFire=yes 的武器开火单位也会尝试将车体转向目标。

    • 建议 Jumpjet 的 ROTJumpjetTurnRate 相同。

rulesmd.ini

[SOMEWEAPON]              ; WeaponType, with OmniFire=yes
OmniFire.TurnToTarget=no  ; boolean

辐射增强

  • 除了允许自定义辐射类型外还有对于默认辐射类型 [Radiation] 的增强,例如可以设置所有者与开火者或对建筑造成伤害。详见自定义辐射类型

自定义战机扫射

图像 幽灵计划 中的自定义战机扫射武器

  • 现在可以自定义战机扫射武器的一些行为。

    • Strafing 控制战机在目标射击时是否可以扫射。如果抛射体 ROT < 2 且 Inviso=false 并且没有 Trajectory 则默认为 true 其他情况为 false

    • Strafing.Shots 控制在单词扫射过程中武器发射的次数,如果未设置则默认为 5。Ammo 只会在扫射结束后扣除一次,无论实际多少次。

    • Strafing.SimulateBurst 控制在扫射过程中发射的武器是否模拟 Burst 的行为,即允许交替开火坐标。仅当武器 Burst 设置为 1 或未定义时才有效。

    • Strafing.UseAmmoPerShot 如果设为 true 将在每次开火后都扣除弹药而不是通常的仅在扫射结束后才扣除弹药。

    • 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.EndDelay=             ; integer, game frames

武器瞄准筛选

图像 幽灵计划 中的武器瞄准筛选 - 就像分别对单位和建筑使用那样对敌军和友军使用不同武器

  • 现在你可以指定武器可以开火的目标或所属方。这还会影响武器选择,除了某些特殊情况下的固定选择。

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 要求明确列出 allempty 才能对不包含任何科技类型的单元格开火。