Fixed / Improved Logics

This page describes all ingame logics that are fixed or improved in Phobos without adding anything significant.

Bugfixes and miscellaneous

  • Fixed the bug when reading a map which puts Preview(Pack) after Map lead to the game fail to draw the preview

  • Fixed the bug when retinting map lighting with a map action corrupted light sources.

  • Fixed the bug when deploying mindcontrolled vehicle into a building permanently transferred the control to the house which mindcontrolled it.

  • Fixed the bug when units are already dead but still in map (for sinking, crashing, dying animation, etc.), they could die again.

  • Fixed the bug when cloaked Desolator was unable to fire his deploy weapon.

  • Fixed the bug that temporaryed unit cannot be erased correctly and no longer raise an error.

  • Fixed DebrisMaximums (spawned debris type amounts cannot go beyond specified maximums anymore). Only applied when DebrisMaximums values amount is more than 1 for compatibility reasons.

  • Fixed building and defense tab hotkeys not enabling the placement mode after Cannot build here. triggered and the placement mode cancelled.

  • Fixed buildings with UndeployInto playing EVA_NewRallypointEstablished on undeploying.

  • Fixed buildings with Naval=yes ignoring WaterBound=no to be forced to place onto water.

  • Fixed AI Aircraft docks bug when Ares tag [GlobalControls] > AllowParallelAIQueues=no is set.

  • Fixed laser drawing code to allow for thicker lasers in house color draw mode.

  • Fixed DeathWeapon not detonating properly.

    • Some settings are still ignored like PreImpactAnim (Ares feature), this might change in future.

  • Fixed the bug when occupied building’s MuzzleFlashX is drawn on the center of the building when X goes past 10.

  • Fixed jumpjet units that are Crashable not crashing to ground properly if destroyed while being pulled by a Locomotor warhead.

  • Fixed jumpjet units being unable to turn to the target when firing from a different direction.

  • Fixed interaction of UnitAbsorb & InfantryAbsorb with Grinding buildings. The keys will now make the building only accept appropriate types of objects.

  • Fixed missing ‘no enter’ cursor for VehicleTypes being unable to enter a Grinding building.

  • Fixed Engineers being able to enter Grinding buildings even when they shouldn’t (such as ally building at full HP).

  • SHP debris shadows now respect the Shadow tag.

  • Allowed usage of TileSet of 255 and above without making NE-SW broken bridges unrepairable.

  • Adds a “Load Game” button to the retry dialog on mission failure.

image Side offset voxel turret in Breaking Blue project

  • TurretOffset tag for voxel turreted TechnoTypes now accepts FLH (forward, lateral, height) values like TurretOffset=F,L or TurretOffset=F,L,H, which means turret location can be adjusted in all three axes.

  • InfiniteMindControl with Damage=1 can now control more than 1 unit.

  • Aircraft with Fighter set to false or those using strafing pattern (weapon projectile ROT is below 2) now take weapon’s Burst into accord for all shots instead of just the first one.

  • EMEffect used for random AnimList pick is now replaced by a new tag AnimList.PickRandom with no side effect. (EMEffect=yes on AA inviso projectile deals no damage to units in movement)

  • Vehicles using DeployFire will now explicitly use weapon specified by DeployFireWeapon for firing the deploy weapon and respect FireOnce setting on weapon and any stop commands issued during firing.

  • Infantry with DeployFireWeapon=-1 can now fire both weapons (decided by its target), regardless of deployed or not.

image Nod arty keeping target on attack order in C&C: Reloaded

  • Vehicle to building deployers now keep their target when deploying with DeployToFire.

  • Effects like lasers are no longer drawn from wrong firing offset on weapons that use Burst.

  • Animations can now be offset on the X axis with XDrawOffset.

  • IsSimpleDeployer units now only play DeploySound and UndeploySound once, when done with (un)deploying instead of repeating it over duration of turning and/or DeployingAnim.

  • AITrigger can now recognize Building Upgrades as legal condition.

  • EWGates and NSGates now will link walls like xxGateOne and xxGateTwo do.

  • Fixed the bug when occupied building’s MuzzleFlashX is drawn on the center of the building when X goes past 10.

  • Fixed jumpjet units that are Crashable not crashing to ground properly if destroyed while being pulled by a Locomotor warhead.

  • Fixed interaction of UnitAbsorb & InfantryAbsorb with Grinding buildings. The keys will now make the building only accept appropriate types of objects.

  • Fixed missing ‘no enter’ cursor for VehicleTypes being unable to enter a Grinding building.

  • Fixed Engineers being able to enter Grinding buildings even when they shouldn’t (such as ally building at full HP).

  • Aircraft & jumpjet units are now affected by speed modifiers such as SpeedAircraft/Infantry/UnitsMult on Countries, VeteranSpeed and Crates / AttachEffect (Ares feature).

  • Both voxel and SHP vehicle units should now correctly respect custom palette set through Palette.

  • Weapons fired by EMPulse superweapons without EMPulse.TargetSelf=true (Ares feature) can now create radiation.

  • Setting RadarInvisible to true on TerrainTypes now hides them from minimap display.

  • Mind control indicator animations will now correctly restore on mind controlled objects when uncloaked.

  • Animations from Warhead AnimList & SplashList etc. as well as animations created through map trigger 41 Play Anim At now have the appropriate house set as owner of the animation by default.

  • Nuke carrier & payload weapons now respect Bright setting on the weapons always when appropriate (previously only payload did and only if Superweapon had Nuke.SiloLaunch=false (Ares feature)).

  • Self-healing pips from InfantryGainSelfHeal & UnitsGainSelfHeal now respect unit’s PixelSelectionBracketDelta like health bar pips do.

  • Buildings using SelfHealing will now correctly revert to undamaged graphics if their health is restored back by self-healing.

  • Anim owner is now set for warhead AnimList/SplashList anims and Play Anim at Waypoint trigger animations.

  • Allow use of Foundation=0x0 on TerrainTypes without crashing for similar results as for buildings.

  • Projectiles now remember the house of the firer even if the firer is destroyed before the projectile detonates. Does not currently apply to some Ares-introduced Warhead effects like EMP.

  • OpenTopped transports now take OpenTransportWeapon setting of passengers into consideration when determining weapon range used for threat scanning and approaching targets.

  • Trailer animations now inherit the owner of the object (animation, projectile or aircraft) they are attached to.

  • Buildings now correctly use laser parameters set for Secondary weapons instead of reading them from Primary weapon.

  • Fixed an issue that caused vehicles killed by damage dealt by a known house but without a known source TechnoType (f.ex animation warhead damage) to not be recorded as killed correctly and thus not spring map trigger events etc.

  • IsAnimated, AnimationRate and AnimationProbability now work on TerrainTypes without SpawnsTiberium set to true.

  • Fixed transports recursively put into each other not having a correct killer set after second transport when being killed by something.

image Example gradient SHP drawing with 75% translucency, before and after

  • Translucent RLE SHPs will now be drawn using a more precise and performant algorithm that has no green tint and banding. Can be disabled with rulesmd.ini->[General]->FixTransparencyBlitters=no.

    • Only applies to Z-aware drawing mode for now.


Animation weapon and damage settings

  • Weapon can be set to a WeaponType, to create a projectile and immediately detonate it instead of simply dealing Damage by Warhead. This allows weapon effects to be applied.

  • Damage.Delay determines delay between two applications of Damage. Requires Damage to be set to 1.0 or above. Value of 0 disables the delay. Keep in mind that this is measured in animation frames, not game frames. Depending on Rate, animation may or may not advance animation frames on every game frame.

  • Damage.DealtByInvoker, if set to true, makes any Damage dealt to be considered as coming from the animation’s invoker (f.ex, firer of the weapon if it is Warhead AnimList/SplashList animation, the destroyed vehicle if it is DestroyAnim animation or the object the animation is attached to). Does not affect which house the Damage dealt by Warhead is dealt by.

  • Damage.ApplyOncePerLoop, if set to true, makes Damage be dealt only once per animation loop (on single loop animations, only once, period) instead of on every frame or intervals defined by Damage.Delay. The frame on which it is dealt is determined by Damage.Delay, defaulting to after the first animation frame.

In artmd.ini:

[SOMEANIM]                     ; AnimationType
Weapon=                        ; WeaponType
Damage.Delay=0                 ; integer, animation frames
Damage.DealtByInvoker=false    ; boolean
Damage.ApplyOncePerLoop=false  ; boolean


Weapon and Damage.Delay, beyond the other additions, should function similarly to the equivalent features introduced by Ares and take precedence over them if Phobos is used together with Ares.

Attached animation position customization

  • You can now customize whether or not animations attached to objects are centered at the object’s actual center rather than the bottom of their top-leftmost cell (cell #0).

In artmd.ini:

[SOMEANIM]                       ; AnimationType
UseCenterCoordsIfAttached=false  ; boolean

Layer on animations attached to objects

  • You can now customize whether or not animations attached to objects follow the object’s layer or respect their own Layer setting. If this is unset, attached animations use ground layer.

In artmd.ini:

[SOMEANIM]             ; AnimationType
Layer.UseObjectLayer=  ; boolean

Ore stage threshold for HideIfNoOre

  • You can now customize which growth stage should an ore/tiberium cell have to have animation with HideIfNoOre displayed. Cells with growth stage less than specified value won’t allow the anim to display.

In artmd.ini:

[SOMEANIM]               ; AnimationType
HideIfNoOre.Threshold=0  ; integer, minimal ore growth stage


Customizable & new grinder properties

image Using ally grinder, restricting to vehicles only and refund display (Project Phantom)

  • You can now customize which types of objects a building with Grinding set can grind as well as the grinding sound.

    • Grinding.AllowAllies changes whether or not to allow units to enter allies’ buildings.

    • Grinding.AllowOwner changes whether or not to allow units to enter your own buildings.

    • Grinding.AllowTypes can be used to define InfantryTypes and VehicleTypes that can be grinded by the building. Listing any will disable grinding for all types except those listed.

    • Grinding.DisallowTypes can be used to exclude InfantryTypes or VehicleTypes from being able to enter the grinder building.

    • Grinding.Sound is a sound played by when object is grinded by the building. If not set, defaults to [AudioVisual]->EnterGrinderSound.

    • Grinding.Weapon is a weapon fired at the building & by the building when it grinds an object. Will only be fired if at least weapon’s ROF amount of frames have passed since it was last fired.

    • Grinding.DisplayRefund can be set to display the amount of credits acquired upon grinding on the building. Multiple refunded objects within a short period of time have their refund amounts coalesced into single display.

      • Grinding.DisplayRefund.Houses determines which houses can see the credits display.

      • Grinding.DisplayRefund.Offset is additional pixel offset for the center of the credits display, by default (0,0) at building’s center.

In rulesmd.ini:

[SOMEBUILDING]                     ; BuildingType
Grinding.AllowAllies=false         ; boolean
Grinding.AllowOwner=true           ; boolean
Grinding.AllowTypes=               ; List of InfantryTypes / VehicleTypes
Grinding.DisallowTypes=            ; List of InfantryTypes / VehicleTypes
Grinding.Sound=                    ; Sound
Grinding.Weapon=                   ; WeaponType
Grinding.DisplayRefund=false       ; boolean
Grinding.DisplayRefund.Houses=All  ; Affected House Enumeration (none|owner/self|allies/ally|team|enemies/enemy|all)
Grinding.DisplayRefund.Offset=0,0  ; X,Y, pixels relative to default


Customizable projectile gravity

  • You can now specify individual projectile gravity.

    • Setting Gravity=0 is not recommended as it will cause the projectile to fly backwards and be unable to hit the target which is not at the same height. We suggest to use Straight Trajectory instead. See here.

In rulesmd.ini:

[SOMEPROJECTILE]        ; Projectile
Gravity=6.0             ; floating point value


Building-provided self-healing customization

  • It is now possible to set a global cap for the effects of InfantryGainSelfHeal and UnitsGainSelfHeal by setting InfantryGainSelfHealCap & UnitsGainSelfHealCap under [General], respectively.

  • It is also possible to change the pip frames displayed from pips.shp individually for infantry, units and buildings by setting the frames for infantry & unit self-healing on Pips.SelfHeal.Infantry/Units/Buildings under [AudioVisual], respectively.

    • Pips.SelfHeal.Infantry/Units/Buildings.Offset can be used to customize the pixel offsets for the displayed pips, individually for infantry, units and buildings.

  • Whether or not a TechnoType benefits from effects of InfantryGainSelfHeal or UnitsGainSelfHeal buildings or neither can now be controlled by setting SelfHealGainType.

    • If SelfHealGainType is not set, InfantryTypes and VehicleTypes with Organic set to true gain self-healing from InfantryGainSelfHeal, other VehicleTypes from UnitsGainSelfHeal and AircraftTypes & BuildingTypes never gain self-healing.

In rulesmd.ini:

InfantryGainSelfHealCap=               ; integer, maximum amount of InfantryGainSelfHeal that can be in effect at once, must be 1 or higher
UnitsGainSelfHealCap=                  ; integer, maximum amount of UnitsGainSelfHeal that can be in effect at once, must be 1 or higher

Pips.SelfHeal.Infantry=13,20           ; integer, frames of pips.shp for infantry & unit-self healing pips, respectively
Pips.SelfHeal.Units=13,20              ; integer, frames of pips.shp for infantry & unit-self healing pips, respectively
Pips.SelfHeal.Buildings=13,20          ; integer, frames of pips.shp for infantry & unit-self healing pips, respectively
Pips.SelfHeal.Infantry.Offset=25,-35   ; X,Y, pixels relative to default
Pips.SelfHeal.Units.Offset=33,-32      ; X,Y, pixels relative to default
Pips.SelfHeal.Buildings.Offset=15,10   ; X,Y, pixels relative to default

[SOMETECHNO]                           ; TechnoType
SelfHealGainType=                      ; Self-Heal Gain Type Enumeration (none|infantry|units)

Customizable harvester ore gathering animation

image Custom ore gathering anims in Project Phantom

  • You can now specify which anim should be drawn when a harvester of specified type is gathering specified type of ore.

In rulesmd.ini:

[SOMETECHNO]                     ; TechnoType
OreGathering.Anims=              ; list of animations
OreGathering.FramesPerDir=15     ; list of integers
OreGathering.Tiberiums=0         ; list of Tiberium IDs

Customizable Teleport/Chrono Locomotor settings per TechnoType

image Chrono Legionnaire and Ronco (hero) from YR:New War

  • You can now specify Teleport/Chrono Locomotor settings per TechnoType to override default rules values. Unfilled values default to values in [General].

  • Only applicable to Techno that have Teleport/Chrono Locomotor attached.

In rulesmd.ini:

[SOMETECHNO]            ; TechnoType
WarpOut=                ; Anim (played when Techno warping out)
WarpIn=                 ; Anim (played when Techno warping in)
WarpAway=               ; Anim (played when Techno chronowarped by chronosphere)
ChronoTrigger=          ; boolean, if yes then delay varies by distance, if no it is a constant
ChronoDistanceFactor=   ; integer, amount to divide the distance to destination by to get the warped out delay
ChronoMinimumDelay=     ; integer, the minimum delay for teleporting, no matter how short the distance
ChronoRangeMinimum=     ; integer, can be used to set a small range within which the delay is constant
ChronoDelay=            ; integer, delay after teleport for chronosphere

Customizable unit image in art

  • Image tag in art INI is no longer limited to AnimationTypes and BuildingTypes, and can be applied to all TechnoTypes (InfantryTypes, VehicleTypes, AircraftTypes, BuildingTypes).

  • The tag specifies only the file name (without extension) of the asset that replaces TechnoType’s graphics. If the name in Image is also an entry in the art INI, no tags will be read from it.

  • By default this feature is disabled to remain compatible with YR. To use this feature, enable it in rules with ArtImageSwap=true.

  • This feature supports SHP images for InfantryTypes, SHP and VXL images for VehicleTypes and VXL images for AircraftTypes.

In rulesmd.ini:

ArtImageSwap=false  ; disabled by default

In artmd.ini:

Image=              ; name of the file that will be used as image, without extension

Customize resource storage

  • Now Ares Storage feature can set which Tiberium type from [Tiberiums] list should be used for storing resources in structures with Refinery.UseStorage=yes and Storage > 0.

  • This tag can not be used without Ares.

In rulesmd.ini:

Storage.TiberiumIndex=-1  ; integer, [Tiberiums] list index

Jumpjet unit layer deviation customization

  • Allows turning on or off jumpjet unit behaviour where they fluctuate between air and top layers based on whether or not their current altitude is equal / below or above JumpjetHeight or [JumpjetControls] -> CruiseHeight if former is not set on TechnoType. If disabled, airborne jumpjet units exist only in air layer. JumpjetAllowLayerDeviation defaults to value of [JumpjetControls] -> AllowLayerDeviation if not specified.

In rulesmd.ini:

AllowLayerDeviation=true         ; boolean

[SOMETECHNO]                     ; TechnoType
JumpjetAllowLayerDeviation=true  ; boolean

Jumpjet turning to target

image Jumpjet turning to target applied in Robot Storm X

  • Allows jumpjet units to face towards the target when firing from different directions. Set [JumpjetControls] -> TurnToTarget=yes to enable it for all jumpjet locomotor units. This behavior can be overriden by setting [UnitType] -> JumpjetTurnToTarget for specific units.

  • This behavior does not apply to TurretSpins=yes units for obvious reasons.

In rulesmd.ini:

TurnToTarget=false     ; boolean

[SOMEUNITTYPE]         ; UnitType with jumpjet locomotor
JumpjetTurnToTarget=   ; boolean, override the tag in JumpjetControls

Kill spawns on low power

  • Powered=yes structures that spawns aircraft like Aircrafts Carriers will stop targeting the enemy if low power.

  • Spawned aircrafts self-destruct if they are flying.

In rulesmd.ini:

[SOMESTRUCTURE]          ; BuildingType
Powered.KillSpawns=false ; boolean

Re-enable obsolete [JumpjetControls]

  • Re-enable obsolete [JumpjetControls], the keys in it will be as the default value of jumpjet units.

    • Moreover, added two tags for missing ones.

In rulesmd.ini:

Crash=5.0        ; floating point value
NoWobbles=false  ; boolean


CruiseHeight is for JumpjetHeight, WobblesPerSecond is for JumpjetWobbles, WobbleDeviation is for JumpjetDeviation, and Acceleration is for JumpjetAccel. All other corresponding keys just simply have no Jumpjet prefix.

Forbid parallel AI queues

  • You can now set if specific types of factories do not have AI production cloning issue instead of Ares’ indiscriminate behavior of AllowParallelAIQueues=no.

    • If AllowParallelAIQueues=no (Ares feature) is set, the tags have no effect.

In rulesmd.ini

AllowParallelAIQueues=yes           ; must be set yes/true unless you don't use Ares
ForbidParallelAIQueues.Infantry=no  ; boolean
ForbidParallelAIQueues.Vehicle=no   ; boolean
ForbidParallelAIQueues.Navy=no      ; boolean
ForbidParallelAIQueues.Aircraft=no  ; boolean
ForbidParallelAIQueues.Building=no  ; boolean


Customizable ore spawners

image Different ore spawners in Rise of the East mod

  • You can now specify which type of ore certain TerrainType would generate.

  • It’s also now possible to specify a range value for an ore generation area different compared to standard 3x3 rectangle. Ore will be uniformly distributed across all affected cells in a spread range.

  • You can specify which ore growth stage will be spawned and how much cells will be filled with ore per ore generation animation. Corresponding tags accept either a single integer value or two comma-separated values to allow randomized growth stages from the range (inclusive).

In rulesmd.ini:

[SOMETERRAINTYPE]             ; TerrainType
SpawnsTiberium.Type=0         ; tiberium/ore type index
SpawnsTiberium.Range=1        ; integer, radius in cells
SpawnsTiberium.GrowthStage=3  ; single int / comma-sep. range
SpawnsTiberium.CellsPerAnim=1 ; single int / comma-sep. range

Minimap color customization

  • TerrainTypes can now be made to display on minimap with different colors by setting MinimapColor.

In rulesmd.ini:

MinimapColor=      ; integer - Red,Green,Blue

Passable & buildable-upon TerrainTypes

  • TerrainTypes can now be made passable or buildable upon by setting IsPassable or CanBeBuiltOn, respectively.

    • Movement cursor is displayed on IsPassable TerrainTypes unless force-firing.

    • CanBeBuiltOn=true terrain objects are removed when building is placed on them.

In rulesmd.ini:

IsPassable=false    ; boolean
CanBeBuiltOn=false  ; boolean

Tiberiums (ores)

Minimap color customization

  • Ore can now be made to display on minimap with different colors by setting MinimapColor on Tiberiums.

In rulesmd.ini:

[SOMEORE]      ; Tiberium
MinimapColor=  ; integer - Red,Green,Blue


IsSimpleDeployer vehicle deploy animation / direction customization

  • DeployingAnim.AllowAnyDirection if set, disables any direction constraints for deployers with DeployingAnim set. Only works for ground units.

  • DeployingAnim.KeepUnitVisible determines if the unit is hidden while the animation is playing.

  • DeployingAnim.ReverseForUndeploy controls whether or not the animation is played in reverse for undeploying.

  • DeployingAnim.UseUnitDrawer controls whether or not the animation is displayed in the unit’s palette and team colours or regular animation palette, including a potential custom palette.

In rulesmd.ini:

[SOMEVEHICLE]                          ; VehicleType
DeployingAnim.AllowAnyDirection=false  ; boolean
DeployingAnim.KeepUnitVisible=false    ; boolean
DeployingAnim.ReverseForUndeploy=true  ; boolean
DeployingAnim.UseUnitDrawer=true       ; boolean

Stationary vehicles

  • Setting VehicleType Speed to 0 now makes game treat them as stationary, behaving in very similar manner to deployed vehicles with IsSimpleDeployer set to true. Should not be used on buildable vehicles, as they won’t be able to exit factories.

Preserve Iron Curtain status on type conversion

image Bugfix in action

  • Iron Curtain status is now preserved by default when converting between TechnoTypes via DeploysInto/UndeploysInto.

    • This behavior can be turned off per-TechnoType and global basis.

    • IronCurtain.Modifier is re-applied upon type conversion.

In rulesmd.ini:

IronCurtain.KeptOnDeploy=yes ; boolean

[SOMETECHNO]                 ; VehicleType with DeploysInto or BuildingType with UndeploysInto
IronCurtain.KeptOnDeploy=    ; boolean, default to [CombatDamage]->IronCurtain.KeptOnDeploy


Allowing damage dealt to firer

  • You can now allow warhead to deal damage (and apply damage-adjacent effects such as KillDriver and DisableWeapons/Sonar/Flash.Duration (Ares features)) on the object that is considered as the firer of the Warhead even if it does not have DamageSelf=true.

    • Note that effect of Psychedelic=true, despite being tied to damage will still fail to apply on the firer as it does not affect any objects belonging to same house as the firer, including itself.

In rulesmd.ini:

[SOMEWARHEAD]            ; WarheadType
AllowDamageOnSelf=false  ; boolean

Customizing decloak on damaging targets

  • You can now specify whether or not the warhead decloaks objects that are damaged by the warhead.

In rulesmd.ini:

[SOMEWARHEAD]               ; WarheadType
DecloakDamagedTargets=true  ; boolean

Restricting screen shaking to current view

  • You can now specify whether or not the warhead can only shake screen (ShakeX/Ylo/hi) if it is detonated while visible on current screen view.

In rulesmd.ini:

[SOMEWARHEAD]       ; WarheadType
ShakeIsLocal=false  ; boolean


Customizable disk laser radius


  • You can now set disk laser animation radius using a new tag.

In rulesmd.ini:

[SOMEWEAPON]          ; WeaponType
DiskLaser.Radius=38.2 ; floating point value
                      ; 38.2 is roughly the default saucer disk radius

Single-color lasers

image Comparison of IsSingleColor=yes lasers with higher thickness to regular ones (RA2: Reboot)

  • You can now set laser to draw using only LaserInnerColor by setting IsSingleColor, in same manner as IsHouseColor lasers do using player’s team color. These lasers respect laser thickness. Note that this is not available on prism support weapons.

In rulesmd.ini:

[SOMEWEAPON]         ; WeaponType
IsSingleColor=false  ; boolean

Toggle-able ElectricBolt visuals

image EBolt customization utilized for different Tesla bolt weapon usage (RA2: Reboot)

  • You can now specify individual ElectricBolt bolts you want to disable. Note that this is only a visual change.

In rulesmd.ini:

[SOMEWEAPONTYPE]       ; WeaponType
IsElectricBolt=true    ; an ElectricBolt Weapon, vanilla tag
Bolt.Disable1=false    ; boolean
Bolt.Disable2=false    ; boolean
Bolt.Disable3=false    ; boolean