Skip to content

Trajectory projectiles enhancement#1246

Closed
Coronia wants to merge 2 commits intoPhobos-developers:developfrom
Coronia:trajectory-projectile
Closed

Trajectory projectiles enhancement#1246
Coronia wants to merge 2 commits intoPhobos-developers:developfrom
Coronia:trajectory-projectile

Conversation

@Coronia
Copy link
Copy Markdown
Contributor

@Coronia Coronia commented Apr 25, 2024

Some enhancement for trajectory projectiles, especially for Bombard Trajectory. Many thanks to NaotoYuuki who provided trajectory scatter logic and the prototypes of vertical and meteor projectiles, which are used as the base of these additions.

1 - Both Straight Trajectory and Bombard Trajectory now support Inaccurate=true, BallisticScatter.Max and BallisticScatter.Min keys, which allows them to scatter when picking targets.

2 - Bombard Trajectory, instead of simply flying to the top of the target and free fall, is now extended into a series of trajectories which flying to a 'turning point' first, and then turning to the targets or respawning on their top. The behaviors of the projectile and the position of the turning point could be customized by the following tags:

  • Trajectory.Bombard.FallPercent controls the distance of the turning point by its percentage of the total distance between attacker and intended target. If set to 0%, then it'll fly up vertically. If set to 100%, then it'll travel to the top of the intended target.
    • For each launch the turning point percentage could add or minus a random value, which is not greater than Trajectory.Bombard.FallPercentShift. If set to 0%, random shift will be disabled.
    • You can also makes the turning point scatter in a circle with Trajectory.Bombard.FallScatterRange as its radius. If set to 0, random scatter will be disabled.
  • Trajectory.Bombard.FreeFallOnTarget controls how it'll hit the intended target. If set to true, the projectile will be respawned above the intended target and free fall. If set to false, the projectile will travel to the intended target from the turning point.
  • Trajectory.Bombard.NoLaunch controls whether the attacker will fire the projectile by itself. If set to true, projectile will directly fall from the turning point.
  • Trajectory.Bombard.FallSpeed controls the initial speed of the projectile after it turns. If set to 0.0, then it'll use Trajectory.Speed. Can't work together with Trajectory.Bombard.FreeFallOnTarget=true.
  • Trajectory.Bombard.TargetSnapDistance controls the maximum distance in cells from intended target the projectile can be at moment of detonation to make the projectile 'snap' on the intended target. Set to 0 to disable snapping.

In rulesmd.ini:

[SOMEPROJECTILE]                          ; Projectile
Trajectory=Bombard                        ; Trajectory type
Trajectory.Bombard.Height=0.0             ; double
Trajectory.Bombard.FallPercent=1.0        ; double
Trajectory.Bombard.FallPercentShift=0.0   ; double
Trajectory.Bombard.FallScatterRange=0.0   ; floating point value
Trajectory.Bombard.FreeFallOnTarget=true  ; boolean
Trajectory.Bombard.NoLaunch=false         ; boolean
Trajectory.Bombard.FallSpeed=0.0          ; double
Trajectory.Bombard.TargetSnapDistance=0.5 ; floating point value

If all values are set to default, it'll perform as the old Bombard Trajectory, so those who have made use of it don't need to modify their ini if they want it to behave the same.

NOTE: Both the old and new Bombard Trajectory will crash when firing a Voxel=true projectile, which is unresolved yet. Avoid using it for now, and if someone could make it work I'll be really grateful.

Copy link
Copy Markdown
Contributor

@FS-21 FS-21 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The code looks fine

Comment thread src/Ext/Bullet/Trajectories/BombardTrajectory.cpp
@Coronia Coronia closed this May 26, 2024
@Coronia Coronia force-pushed the trajectory-projectile branch from 9dd3a15 to fc877c9 Compare May 26, 2024 16:00
@Coronia Coronia reopened this May 26, 2024
@chaserli chaserli force-pushed the trajectory-projectile branch from cad204a to 5418c88 Compare May 26, 2024 16:23
@github-actions
Copy link
Copy Markdown

github-actions bot commented May 26, 2024

Nightly build for this pull request:

This comment is automatic and is meant to allow guests to get latest nightly builds for this pull request without registering. It is updated on every successful build.

@Coronia Coronia force-pushed the trajectory-projectile branch from 5418c88 to 0f1c2c9 Compare May 30, 2024 18:21
@Coronia
Copy link
Copy Markdown
Contributor Author

Coronia commented May 30, 2024

added a tag to display anim when the projectile is 'turning'

  • Trajectory.Bombard.TurningPointAnim, if set, will play an anim when the projectile reaches the turning point. If Trajectory.Bombard.FreeFallOnTarget is set to true, it'll be spawned above the target with the projectile together. If Trajectory.Bombard.NoLaunch is set to true, it'll be played at where the projectile falls, no matter if it's free fall or not.

In rulesmd.ini:

[SOMEPROJECTILE]                          ; Projectile
Trajectory.Bombard.TurningPointAnim=      ; Animation

also, both #1261 and this PR has implemented Inaccurace for trajectory, with different approach however. The other method considered about distance between the target and the firer, which seems to be how it's worked in vanilla. Please check these 2 implementations to see which is better and should be kept.

@Coronia Coronia force-pushed the trajectory-projectile branch 2 times, most recently from 36b2ca1 to c67b439 Compare June 1, 2024 18:07
@Coronia Coronia force-pushed the trajectory-projectile branch 2 times, most recently from c67b439 to 99fd3cd Compare July 1, 2024 03:16
@chaserli chaserli force-pushed the trajectory-projectile branch from 14ce3ba to 7f93233 Compare July 6, 2024 09:54
@Coronia Coronia force-pushed the trajectory-projectile branch from 093123f to e577bdb Compare August 15, 2024 06:47
@Coronia
Copy link
Copy Markdown
Contributor Author

Coronia commented Sep 4, 2024

Close it for now since some logic is conflicted with the one made by CrimRecya, and the pattern of tags need to be uniformed. Will reopen or start a new pull request after some other trajectory pull requests are merged

@Coronia Coronia closed this Sep 4, 2024
CrimRecya added a commit that referenced this pull request Feb 9, 2025
This is a sequel of
#1246, which makes use
of logic and tag standard from the other trajectory pull requests
(#1293,
#1294,
#1295 and
#1374), and also
utilizes the generic random anim function from
(#1380). Many thanks to
@CrimRecya for making these projectiles as well as helping with
improvement of enhanced Bombard trajectory. Also thanks **NaotoYuuki**
for providing the prototypes of vertical and meteor projectiles, which
are used as the base of these additions.

1 - Bombard Trajectory now support `Inaccurate=true,
BallisticScatter.Max and BallisticScatter.Min` keys, which allows them
to scatter when picking targets.

2 - Bombard Trajectory, instead of simply flying to the top of the
target and free fall, is now extended into a series of trajectories
which flying to a 'turning point' first, and then turning to the targets
or respawning on their top. The behaviors of the projectile and the
position of the turning point could be customized by the following tags:

- `Trajectory.Bombard.Height` controls the height of the turning point.
- `Trajectory.Bombard.FallPercent` controls the distance of the turning
point by its percentage of the total distance between attacker and
intended target. If set to 0%, then it'll fly up vertically. If set to
100%, then it'll travel to the top of the intended target.
- For each launch the turning point percentage could add or minus a
random value, which is not greater than
`Trajectory.Bombard.FallPercentShift`. If set to 0%, random shift will
be disabled.
- You can also makes the turning point scatter randomly in a circle with
`Trajectory.Bombard.FallScatter.Max` as its radius. If set to 0, random
scatter will be disabled. `Trajectory.Bombard.FallScatter.Min` can be
used to determine the minimum radius of the circle. If
`Trajectory.Bombard.FallScatter.Linear` set to true, the random scatter
will be limited to the line that is vertical to the original direction
of the projectile.
- `Trajectory.Bombard.FreeFallOnTarget` controls how it'll hit the
intended target. If set to true, the projectile will be respawned above
the intended target and free fall. If set to false, the projectile will
travel to the intended target from the turning point.
- `Trajectory.Bombard.NoLaunch` controls whether the attacker will fire
the projectile by itself. If set to true, projectile will directly fall
from the turning point.
- `Trajectory.Bombard.FallSpeed` controls the initial speed of the
projectile after it turns. If set to 0.0, then it'll use
`Trajectory.Speed`. Can't work when
`Trajectory.Bombard.FreeFallOnTarget` set to true.
- `Trajectory.Bombard.DetonationDistance` controls the maximum distance
in cells from intended target (checked at start of each game frame,
before the projectile moves) at which the projectile will be forced to
detonate. Set to 0 to disable forced detonation (note that this can
cause the projectile to overshoot the target).
- `Trajectory.Bombard.DetonationHeight` controls when the projectile is
in a descending state and below the height of the launch position plus
this value, it will detonate prematurely. Taking effect when it is set
to non negative value. If `Trajectory.Bombard.EarlyDetonation` is set to
true, it'll take effect during the ascending stage instead, which makes
it detonate when its height is above the launch position plus this
value.
- `Trajectory.Bombard.TargetSnapDistance` controls the maximum distance
in cells from intended target the projectile can be at moment of
detonation to make the projectile 'snap' on the intended target. Set to
0 to disable snapping.
- `Trajectory.Bombard.TurningPointAnims`, if set, will play an anim when
the projectile reaches the turning point. If
`Trajectory.Bombard.FreeFallOnTarget` is set to true, it'll be spawned
above the target with the projectile together. If
`Trajectory.Bombard.NoLaunch` is set to true, it'll be played at where
the projectile falls, no matter if it's free fall or not. If more than
one animation is listed, a random one is selected.
- `Trajectory.Bombard.LeadTimeCalculate` controls whether the projectile
need to calculate the lead time of the target when firing. Note that
this will not affect the facing of the turret.
- The following tags further customize the projectile's descending
behaviors when `Trajectory.Bombard.FreeFallOnTarget` set to false.
- `Trajectory.Bombard.OffsetCoord` controls the offsets of the target.
Projectile will aim at this position to attack. It also supports
`Inaccurate=yes` and `Trajectory.Bombard.LeadTimeCalculate=true` on this
basis.
- `Trajectory.Bombard.RotateCoord` controls whether to rotate the
projectile's firing direction within the angle bisector of
`Trajectory.Bombard.OffsetCoord` according to the weapon's `Burst`. Set
to 0 to disable this function.
- `Trajectory.Bombard.MirrorCoord` controls whether
`Trajectory.Bombard.OffsetCoord` need to mirror the lateral value to
adapt to the current burst index. At the same time, the rotation
direction calculated by `Trajectory.Bombard.RotateCoord` will also be
reversed, and the rotation angle between each adjacent projectile on
each side will not change as a result.
- `Trajectory.Bombard.UseDisperseBurst` controls whether the calculation
of `Trajectory.Bombard.RotateCoord` is based on its superior's
`Trajectory.Disperse.WeaponBurst` of the dispersed trajectory, rather
than `Burst` of the weapon. If this value is not appropriate, it will
result in unsatisfactory visual displays.
- `Trajectory.Bombard.AxisOfRotation` controls the rotation axis when
calculating `Trajectory.Bombard.RotateCoord`. The axis will rotates with
the unit orientation or the vector that from target position to the
source position.
- `Trajectory.Bombard.SubjectToGround` controls whether the projectile
should explode when it hits the ground. Note that this will not make AI
search for suitable attack locations.

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

If all values are set to default, it'll perform as the old Bombard
Trajectory.

**NOTE:** Both the old and new Bombard trajectories might trigger a
fatal error when firing a Voxel=true projectile (EIP: 007564B4), which
is unresolved yet. Avoid using it for now, and if someone could make it
work I'll be really grateful.

---------

Co-authored-by: CrimRecya <335958461@qq.com>
FS-21 pushed a commit to FS-21/Phobos that referenced this pull request Feb 18, 2025
This is a sequel of
Phobos-developers#1246, which makes use
of logic and tag standard from the other trajectory pull requests
(Phobos-developers#1293,
Phobos-developers#1294,
Phobos-developers#1295 and
Phobos-developers#1374), and also
utilizes the generic random anim function from
(Phobos-developers#1380). Many thanks to
@CrimRecya for making these projectiles as well as helping with
improvement of enhanced Bombard trajectory. Also thanks **NaotoYuuki**
for providing the prototypes of vertical and meteor projectiles, which
are used as the base of these additions.

1 - Bombard Trajectory now support `Inaccurate=true,
BallisticScatter.Max and BallisticScatter.Min` keys, which allows them
to scatter when picking targets.

2 - Bombard Trajectory, instead of simply flying to the top of the
target and free fall, is now extended into a series of trajectories
which flying to a 'turning point' first, and then turning to the targets
or respawning on their top. The behaviors of the projectile and the
position of the turning point could be customized by the following tags:

- `Trajectory.Bombard.Height` controls the height of the turning point.
- `Trajectory.Bombard.FallPercent` controls the distance of the turning
point by its percentage of the total distance between attacker and
intended target. If set to 0%, then it'll fly up vertically. If set to
100%, then it'll travel to the top of the intended target.
- For each launch the turning point percentage could add or minus a
random value, which is not greater than
`Trajectory.Bombard.FallPercentShift`. If set to 0%, random shift will
be disabled.
- You can also makes the turning point scatter randomly in a circle with
`Trajectory.Bombard.FallScatter.Max` as its radius. If set to 0, random
scatter will be disabled. `Trajectory.Bombard.FallScatter.Min` can be
used to determine the minimum radius of the circle. If
`Trajectory.Bombard.FallScatter.Linear` set to true, the random scatter
will be limited to the line that is vertical to the original direction
of the projectile.
- `Trajectory.Bombard.FreeFallOnTarget` controls how it'll hit the
intended target. If set to true, the projectile will be respawned above
the intended target and free fall. If set to false, the projectile will
travel to the intended target from the turning point.
- `Trajectory.Bombard.NoLaunch` controls whether the attacker will fire
the projectile by itself. If set to true, projectile will directly fall
from the turning point.
- `Trajectory.Bombard.FallSpeed` controls the initial speed of the
projectile after it turns. If set to 0.0, then it'll use
`Trajectory.Speed`. Can't work when
`Trajectory.Bombard.FreeFallOnTarget` set to true.
- `Trajectory.Bombard.DetonationDistance` controls the maximum distance
in cells from intended target (checked at start of each game frame,
before the projectile moves) at which the projectile will be forced to
detonate. Set to 0 to disable forced detonation (note that this can
cause the projectile to overshoot the target).
- `Trajectory.Bombard.DetonationHeight` controls when the projectile is
in a descending state and below the height of the launch position plus
this value, it will detonate prematurely. Taking effect when it is set
to non negative value. If `Trajectory.Bombard.EarlyDetonation` is set to
true, it'll take effect during the ascending stage instead, which makes
it detonate when its height is above the launch position plus this
value.
- `Trajectory.Bombard.TargetSnapDistance` controls the maximum distance
in cells from intended target the projectile can be at moment of
detonation to make the projectile 'snap' on the intended target. Set to
0 to disable snapping.
- `Trajectory.Bombard.TurningPointAnims`, if set, will play an anim when
the projectile reaches the turning point. If
`Trajectory.Bombard.FreeFallOnTarget` is set to true, it'll be spawned
above the target with the projectile together. If
`Trajectory.Bombard.NoLaunch` is set to true, it'll be played at where
the projectile falls, no matter if it's free fall or not. If more than
one animation is listed, a random one is selected.
- `Trajectory.Bombard.LeadTimeCalculate` controls whether the projectile
need to calculate the lead time of the target when firing. Note that
this will not affect the facing of the turret.
- The following tags further customize the projectile's descending
behaviors when `Trajectory.Bombard.FreeFallOnTarget` set to false.
- `Trajectory.Bombard.OffsetCoord` controls the offsets of the target.
Projectile will aim at this position to attack. It also supports
`Inaccurate=yes` and `Trajectory.Bombard.LeadTimeCalculate=true` on this
basis.
- `Trajectory.Bombard.RotateCoord` controls whether to rotate the
projectile's firing direction within the angle bisector of
`Trajectory.Bombard.OffsetCoord` according to the weapon's `Burst`. Set
to 0 to disable this function.
- `Trajectory.Bombard.MirrorCoord` controls whether
`Trajectory.Bombard.OffsetCoord` need to mirror the lateral value to
adapt to the current burst index. At the same time, the rotation
direction calculated by `Trajectory.Bombard.RotateCoord` will also be
reversed, and the rotation angle between each adjacent projectile on
each side will not change as a result.
- `Trajectory.Bombard.UseDisperseBurst` controls whether the calculation
of `Trajectory.Bombard.RotateCoord` is based on its superior's
`Trajectory.Disperse.WeaponBurst` of the dispersed trajectory, rather
than `Burst` of the weapon. If this value is not appropriate, it will
result in unsatisfactory visual displays.
- `Trajectory.Bombard.AxisOfRotation` controls the rotation axis when
calculating `Trajectory.Bombard.RotateCoord`. The axis will rotates with
the unit orientation or the vector that from target position to the
source position.
- `Trajectory.Bombard.SubjectToGround` controls whether the projectile
should explode when it hits the ground. Note that this will not make AI
search for suitable attack locations.

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

If all values are set to default, it'll perform as the old Bombard
Trajectory.

**NOTE:** Both the old and new Bombard trajectories might trigger a
fatal error when firing a Voxel=true projectile (EIP: 007564B4), which
is unresolved yet. Avoid using it for now, and if someone could make it
work I'll be really grateful.

---------

Co-authored-by: CrimRecya <335958461@qq.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants