mirror of
https://github.com/openfrontio/OpenFrontIO.git
synced 2026-06-21 15:20:43 +00:00
5dde4cc16d
## 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>
111 lines
2.2 KiB
TypeScript
111 lines
2.2 KiB
TypeScript
import { NukeMagnitude } from "../../src/core/configuration/Config";
|
|
import { DefaultConfig } from "../../src/core/configuration/DefaultConfig";
|
|
import {
|
|
Game,
|
|
Player,
|
|
TerraNullius,
|
|
Tick,
|
|
UnitType,
|
|
} from "../../src/core/game/Game";
|
|
import { TileRef } from "../../src/core/game/GameMap";
|
|
|
|
export class TestConfig extends DefaultConfig {
|
|
private _proximityBonusPortsNb: number = 0;
|
|
private _defaultNukeSpeed: number = 4;
|
|
|
|
samHittingChance(): number {
|
|
return 1;
|
|
}
|
|
|
|
radiusPortSpawn(): number {
|
|
return 1;
|
|
}
|
|
|
|
proximityBonusPortsNb(totalPorts: number): number {
|
|
return this._proximityBonusPortsNb;
|
|
}
|
|
|
|
// Specific to TestConfig
|
|
setProximityBonusPortsNb(nb: number): void {
|
|
this._proximityBonusPortsNb = nb;
|
|
}
|
|
|
|
nukeMagnitudes(_: UnitType): NukeMagnitude {
|
|
return { inner: 1, outer: 1 };
|
|
}
|
|
|
|
setDefaultNukeSpeed(speed: number): void {
|
|
this._defaultNukeSpeed = speed;
|
|
}
|
|
|
|
defaultNukeSpeed(): number {
|
|
return this._defaultNukeSpeed;
|
|
}
|
|
|
|
defaultNukeTargetableRange(): number {
|
|
return 20;
|
|
}
|
|
|
|
deletionMarkDuration(): number {
|
|
return 5;
|
|
}
|
|
|
|
defaultSamRange(): number {
|
|
return 20;
|
|
}
|
|
|
|
samRange(level: number): number {
|
|
return 20;
|
|
}
|
|
|
|
spawnImmunityDuration(): Tick {
|
|
return 0;
|
|
}
|
|
|
|
attackLogic(
|
|
gm: Game,
|
|
attackTroops: number,
|
|
attacker: Player,
|
|
defender: Player | TerraNullius,
|
|
tileToConquer: TileRef,
|
|
): {
|
|
attackerTroopLoss: number;
|
|
defenderTroopLoss: number;
|
|
tilesPerTickUsed: number;
|
|
} {
|
|
return { attackerTroopLoss: 1, defenderTroopLoss: 1, tilesPerTickUsed: 1 };
|
|
}
|
|
|
|
attackTilesPerTick(
|
|
attackTroops: number,
|
|
attacker: Player,
|
|
defender: Player | TerraNullius,
|
|
numAdjacentTilesWithEnemy: number,
|
|
): number {
|
|
return 1;
|
|
}
|
|
}
|
|
export class UseRealAttackLogic extends TestConfig {
|
|
// Override to use DefaultConfig's real attackLogic
|
|
attackLogic(
|
|
gm: Game,
|
|
attackTroops: number,
|
|
attacker: Player,
|
|
defender: Player | TerraNullius,
|
|
tileToConquer: TileRef,
|
|
): {
|
|
attackerTroopLoss: number;
|
|
defenderTroopLoss: number;
|
|
tilesPerTickUsed: number;
|
|
} {
|
|
return DefaultConfig.prototype.attackLogic.call(
|
|
this,
|
|
gm,
|
|
attackTroops,
|
|
attacker,
|
|
defender,
|
|
tileToConquer,
|
|
);
|
|
}
|
|
}
|