mirror of
https://github.com/openfrontio/OpenFrontIO.git
synced 2026-07-09 18:38:05 +00:00
Extend SAM Range to cover Hydros when stacked (#2351)
## Description: Implements SAM range extension for stacked SAMs to cover hydros as requested in #2347 and many times from users in discord. This implementation is as simple as possible: At level 5 and higher, SAMs extend their range to the range of a hydrogen bomb + 10 for a small safety margin. Levels 2-4 are interpolated between. Screenshot to show the sizes compared to a hydro: <img width="400" alt="image" src="https://github.com/user-attachments/assets/a857d66c-e3d4-467f-855f-3539cc90b719" /> Everything works together with the new range UI, although I might need to unify with / rebase on #2350. Not yet tested with #2348, but shouldn't be an issue. ## Input needed: - Should I add tests for this? - This is in effect a massive buff to SAMs, might be too strong. Popular ideas / suggestions from Discord to balance things: - Cap the SAM upgrade level at the maximum range (easy to do) - Alternative, instead of capping the level, decrease the range when missiles are reloading - Increase the cost scaling for SAMs per stack, and scale way higher (e.g. 1.5M > 3M > 4.5M > 6M or something like that) (UI integration unclear, breaks with existing cost logic) - Decrease SAM hit probability for Hydros I'm happy to implement any of these paths, or just roll with the simple way it's set up now, just let me know. ## Please complete the following: - [x] I have added screenshots for all UI updates - [x] I process any text displayed to the user through translateText() and I've added it to the en.json file - [x] I have added relevant tests to the test directory - [x] I confirm I have thoroughly tested these changes and take full responsibility for any bugs introduced ## Please put your Discord username so you can be contacted if a bug or regression is found: newyearnewphil --------- Co-authored-by: Evan <evanpelle@gmail.com>
This commit is contained in:
@@ -171,6 +171,8 @@ export interface Config {
|
||||
defaultNukeTargetableRange(): number;
|
||||
defaultSamMissileSpeed(): number;
|
||||
defaultSamRange(): number;
|
||||
samRange(level: number): number;
|
||||
maxSamRange(): number;
|
||||
nukeDeathFactor(
|
||||
nukeType: NukeType,
|
||||
humans: number,
|
||||
|
||||
@@ -920,6 +920,15 @@ export class DefaultConfig implements Config {
|
||||
return 70;
|
||||
}
|
||||
|
||||
samRange(level: number): number {
|
||||
// rational growth function (level 1 = 70, level 5 just above hydro range, asymptotically approaches 150)
|
||||
return this.maxSamRange() - 480 / (level + 5);
|
||||
}
|
||||
|
||||
maxSamRange(): number {
|
||||
return 150;
|
||||
}
|
||||
|
||||
defaultSamMissileSpeed(): number {
|
||||
return 12;
|
||||
}
|
||||
|
||||
@@ -50,7 +50,7 @@ class SAMTargetingSystem {
|
||||
|
||||
private isInRange(tile: TileRef) {
|
||||
const samTile = this.sam.tile();
|
||||
const range = this.mg.config().defaultSamRange();
|
||||
const range = this.mg.config().samRange(this.sam.level());
|
||||
const rangeSquared = range * range;
|
||||
return this.mg.euclideanDistSquared(samTile, tile) <= rangeSquared;
|
||||
}
|
||||
@@ -82,7 +82,7 @@ class SAMTargetingSystem {
|
||||
|
||||
public getSingleTarget(ticks: number): Target | null {
|
||||
// Look beyond the SAM range so it can preshot nukes
|
||||
const detectionRange = this.mg.config().defaultSamRange() * 2;
|
||||
const detectionRange = this.mg.config().maxSamRange() * 2;
|
||||
const nukes = this.mg.nearbyUnits(
|
||||
this.sam.tile(),
|
||||
detectionRange,
|
||||
|
||||
Reference in New Issue
Block a user