-Ships now take into consideration the shots that are incoming against a target when they fire at it, so that they stop firing at a target that is already on its way to death (this prevents the issue of overkill that could previously occur, especially with cruisers.It does seem to be doing differently though my 100 cruisers tend to still spread out their shots versus a small cluster of cruisers when I think they could probably have taken at least one down each salvo by focus firing. Of course, the real solution was for me to send in my 80 fighters and they shredded the cruisers without a second thought (let alone salvo).
-A time-left-to-build count is now shown on the current item being built in every queue, in addition to the little progress bar. This is particularly useful with Starship Constructors and Missile Silos.Yep, this works well, thanks ;)
-Attack ranges are now drawn as un-filled circles unless your mouse cursor is over the ship. This makes it much easier to see the ranges in effect when there are large numbers of selected ships.I hadn't thought of that solution, but I had noticed the problem, works very nicely :)
-Holding Z+X now shows all the enemy ranges in addition to the local player's ranges.Hadn't thought of that, but it's very helpful.
-Sniper ranges are never shown any more since they cause slowdown on older graphics cards and they always just hit everything, anyway.Good idea.
-There is now an option in the game settings that allows the music to keep playing while the game is paused.Works like a charm, thanks.
-Flares now have a border on the minimap, and so are much easier to see when in the middle of a bunch of other like-colored minimap blips.Yep, works.
Sweet, thanks for the input, hopefully its compatible with my current save, and I will see immediately what changes has happened ;)
No time tonight tho, I'm beat, but tomrorow there will be galactic bloodshed.
I saw the EMP thing, however, 30 seconds will only be enough if the wormhole is close to the shield, in most cases , it will take me a lot longer than 30 secs to get closee, however I think the 'build your own shield' thing, may work for me :)
I had about 300 cruisers chewing down the shields, and it still took 20 mins in some cases, for mark II or mark III shield.
Wow, now that's service ;)
-Ships now take into consideration the shots that are incoming against a target when they fire at it, so that they stop firing at a target that is already on its way to death (this prevents the issue of overkill that could previously occur, especially with cruisers.It does seem to be doing differently though my 100 cruisers tend to still spread out their shots versus a small cluster of cruisers when I think they could probably have taken at least one down each salvo by focus firing. Of course, the real solution was for me to send in my 80 fighters and they shredded the cruisers without a second thought (let alone salvo).
Yea, I think the autotargetting is working well on average.
What do you think of having some way curious folks like me could see a debug dump of targetting decisions? I don't mind it being really slow and generating some awfully huge txt file. Basically if you think it'd be helpful to get more specific feedback on what targetting decisions I'm puzzled by, it could help.
Thanks,
Keith
int myRange = this.UnitData.AttackRange;
int myCenterX = this.LocationCenter.X;
int myCenterY = this.LocationCenter.Y;
//precision targeting when there aren't too many enemy units
bool areWeAIPlayer = this.Player.Type == PlayerType.AI;
this.SetObjectToKill( null, false, false, true );
thereAreSomeViableTargets = false;
foreach ( ForegroundObject enemyUnit in enemyUnits )
{
//enemyUnit.IsViableTarget = false;
if ( enemyUnit.Health <= 0 || enemyUnit.ToBeRemoved ||
enemyUnit.HealthAfterShots <= 0 ||
enemyUnit.UnitData.IsInvincible ||
( enemyUnit.CloakingLevel == CloakingLevel.Full &&
!this.UnitData.InstaKillsCloakedShips ) )
continue; //skip targets that are already dead or cloaked
if ( enemyUnit.UnitData.AbsorbsLazers && this.UnitData.ShotIsLazer )
continue; //don't fire lazers at enemies that absorb it
if ( enemyUnit.UnitData.Bulletproof && this.UnitData.ShotIsShell )
continue; //don't fire shells at enemies that repel it
if ( enemyUnit.UnitData.AbsorbsNegativeEnergy && this.UnitData.ShotIsNegativeEnergy )
continue; //don't fire negative energy at enemies that absorb it
if ( enemyUnit.UnitData.IsImmuneToMissiles && this.UnitData.ShotIsMissile )
continue; //don't fire missiles at enemies that are missile-proof
if ( enemyUnit.UnitData.IsImmuneToSnipers && this.UnitData.ShotIsSniper )
continue; //don't fire sniper shots at enemies that are sniper-proof
if ( this.UnitData.InstaKillsLowerShips )
{
if ( enemyUnit.UnitData.ShipLevel >= this.UnitData.ShipLevel ||
enemyUnit.UnitData.ImmuneToBeingInstaKilled ||
enemyUnit.IsInstaKillComing )
continue;
}
if ( this.UnitData.InstaKillsCloakedShips )
{
if ( !enemyUnit.UnitData.HasCloaking ||
enemyUnit.UnitData.ImmuneToBeingInstaKilled ||
enemyUnit.IsInstaKillComing )
continue;
}
enemyUnit.WorkingRange = Mat.ApproxDistanceBetweenPoints(
enemyUnit.LocationCenter, this.LocationCenter );
if ( enemyUnit.WorkingRange > this.UnitData.AttackRangeOuter &&
!this.IsFreeRoaming )
continue;
//enemyUnit.IsViableTarget = true;
thereAreSomeViableTargets = true;
if ( !isExportingRelative )
{
if ( !this.UnitData.AutoTargetsClosest && !this.IsFreeRoaming )
{
if ( Math.Abs( enemyUnit.LocationCenter.X - myCenterX ) > myRange )
continue;
if ( Math.Abs( enemyUnit.LocationCenter.Y - myCenterY ) > myRange )
continue;
}
if ( !areWeAIPlayer && enemyUnit.UnitData.PlayerAutoTargetLevel != PlayerAutoTargetLevel.Normal )
continue;
if ( enemyUnit.UnitData.VeryLowPriorityTarget ) //no one auto-targets these
continue;
}
else
{
if ( this.ObjectToKill == null )
this.SetObjectToKill( enemyUnit, false, false, true );
}
if ( this.UnitData.AutoTargetsClosest )
{
enemyUnit.WorkingHitPercent = -enemyUnit.WorkingRange;
if ( !isExportingRelative )
{
//if out of target seek range, and not an AI player
if ( !areWeAIPlayer && !this.IsFreeRoaming &&
this.UnitData.TargetSeekRange > 0 && this.UnitData.TargetSeekRange <
-enemyUnit.WorkingHitPercent )
continue;
}
}
else
{
if ( this.IsAttackMoving || this.IsFreeRoaming )
enemyUnit.WorkingHitPercent = 100;
else
{
enemyUnit.WorkingHitPercent = enemyUnit.GetHitPercent( this );
if ( enemyUnit.WorkingHitPercent == 0 )
continue;
}
}
enemyUnit.WorkingDamage = enemyUnit.UnitData.GetAttackPowerAgainstThis( this.UnitData );
//skip shooting at ships that we can't hurt
if ( enemyUnit.WorkingDamage == 0 )
continue;
if ( this.ObjectToKill == null )
this.SetObjectToKill( enemyUnit, false, false, true );
else
{
if ( enemyUnit.WorkingDamage > this.ObjectToKill.WorkingDamage &&
( enemyUnit.WorkingHitPercent >= this.ObjectToKill.WorkingHitPercent - 10 ||
enemyUnit.WorkingDamage > this.ObjectToKill.WorkingDamage * 2 ) )
this.SetObjectToKill( enemyUnit, false, false, true );
else if ( enemyUnit.WorkingHitPercent > this.ObjectToKill.WorkingHitPercent )
this.SetObjectToKill( enemyUnit, false, false, true );
else if ( enemyUnit.WorkingHitPercent == this.ObjectToKill.WorkingHitPercent &&
enemyUnit.TargetedBy < this.ObjectToKill.TargetedBy )
this.SetObjectToKill( enemyUnit, false, false, true );
}
}
if ( isExportingRelative )
this.ObjectToKillSetByPlayer = true;
}
1. Using shortcut keys on galaxy map doesn't change the "Current mode" tooltip, it still displays whichever mode you last clicked, even though the mode switch worked.
2. Last Scouted mode doesn't seem to work.
3. Why do I only see a used resource count for my planets? As I can already see ownership why not show me a count based on last scouted for every territory?
4. I don't understand attack move, ships often move straight past the enemy in this mode only stopping once they get shot. If I reissue an attack move they go from stopping and fighting to moving again, yet surely they should remain where they are if already fighting?
5. I have a widescreen and I'd like the score screen to use it.
6. Option to show the Selected Units tooltip permanently.
7. The % and x numbers don't fit well into the Select Units button, there needs to be a tidier way.
For the x number, it's meant to be a little thing up in the upper left of the button. For the %, I'm curious as to what you mean, it seems to be fine for me. Maybe an artifact of your resolution or something, or maybe just something I have not noticed. I'll look at it, but if you have a screenshot or something of what you are seeing that looks off, that would be awesome.
Thanks for another great batch! :)
1. Consider allowing free-roaming to target mine remains once all other targets destroyed.
2. Same for attack move.
3. If a unit is heading for a free-roaming rally point and an enemy enters and is destroyed the unit stops moving. This can leave them stuck a mile away by the factory.
4. Key to "build this unit immediately" as a means to put something at the start of a build queue and to exclude it from any existing loop. This is to save the need to trash and rebuild your queue if you suddenly have a need for scouts or something.
Last Scouted:
Tutorial campaign, I choose Last Scouted mode and nothing happens.
Currently Selected Tooltip:
Setting in options is good.
Currently Selected Cramped:
x# doesn't fit inside the hex, this was all.
Possible bug:
Shift adds a location to waypoints, but (and this may be intentional) enemy ships are treated as waypoints not targets, so you cannot queue attacks and movement this way as your ships move to the target and then continue on to the next point even if the target is still alive.
if ( enemyUnit.Health <= 0 || enemyUnit.ToBeRemoved ||Prevents overkill
enemyUnit.HealthAfterShots <= 0 ||
enemyUnit.UnitData.IsInvincible ||
( enemyUnit.CloakingLevel == CloakingLevel.Full &&
!this.UnitData.InstaKillsCloakedShips ) )
continue; //skip targets that are already dead or cloaked
if ( enemyUnit.WorkingDamage > this.ObjectToKill.WorkingDamage &&Picks one from the group of viable targets where this ship will do the most damage (not necessarily max damage, but pretty good) and spreads the shots out among that group.
( enemyUnit.WorkingHitPercent >= this.ObjectToKill.WorkingHitPercent - 10 ||
enemyUnit.WorkingDamage > this.ObjectToKill.WorkingDamage * 2 ) )
this.SetObjectToKill( enemyUnit, false, false, true );
else if ( enemyUnit.WorkingHitPercent > this.ObjectToKill.WorkingHitPercent )
this.SetObjectToKill( enemyUnit, false, false, true );
else if ( enemyUnit.WorkingHitPercent == this.ObjectToKill.WorkingHitPercent &&
enemyUnit.TargetedBy < this.ObjectToKill.TargetedBy )
this.SetObjectToKill( enemyUnit, false, false, true );
Ability to set rally points in remote star systems?
The beach-head mechanic is definitely cool, I'd rather have that than cross-system rally points. One possibility is only allowing cross-system rally points to systems you own but I don't know that there's really much gain from that.
And I tend to really dislike the RTS tendency to have two massive fleets meeting only to have them each focus-fire on a string of enemy ships one at a time... but unless you introduce some mechanic to make focus-fire non-optimal (like a hit reduces the next hit within 1 sec by 10% or something) there would always be the fact that a player micro-managing focus fire could cut down received damage by 30-60% or so in a lot of cases. I really don't like having to micro just for that (microing to kill specific ship types or strategic targets is fine), and that would also be a human advantage over the AI if the AI had no focus fire behavior.
And I tend to really dislike the RTS tendency to have two massive fleets meeting only to have them each focus-fire on a string of enemy ships one at a time... but unless you introduce some mechanic to make focus-fire non-optimal (like a hit reduces the next hit within 1 sec by 10% or something) there would always be the fact that a player micro-managing focus fire could cut down received damage by 30-60% or so in a lot of cases. I really don't like having to micro just for that (microing to kill specific ship types or strategic targets is fine), and that would also be a human advantage over the AI if the AI had no focus fire behavior.
Okay, so that's another good point in favor of doing concentrated fire. By the way, the AI target selection process (the "thinking AI" if you will) is a bit different than the auto-targeting logic that I posted here. The LINQ code for a lot of that is in the second article in my AI series. As you might infer from that, it tends to do more concentration of fire like a human player would. So this would just kind of bring the auto-firing up to that standard, I suppose.
Arguably, overkill is the penalty for concentrating fire fire-hose style. Computer simulation entities have a very easy time to figure out if enough shots were fired at a target to kill it, but would "real" space ships have that capability?