mirror of
https://github.com/openfrontio/OpenFrontIO.git
synced 2026-06-21 15:40:43 +00:00
86e51ab790
## Description: As far as I can remember, in v28 the spawn immunity applied to both humans and nations. With the configurable spawn immunity (added for v29) the spawn immunity no longer applies to nations... Because its called PVP immunity now. So right now it's possible to spawnkill nations. This is a big problem for the 5M gold modifier games... And you can "cheat" in singleplayer. This PR changes two things: - Nations always have 5 seconds spawn immunity now, no matter whats configured for the PVP immunity - Nations attack TerraNullius earlier (Otherwise the easy nations would sometimes do their first attack after the 5 seconds are over, spawnkills would still be possible) ## 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: FloPinguin --------- Co-authored-by: Ryan <7389646+ryanbarlow97@users.noreply.github.com>
202 lines
6.0 KiB
TypeScript
202 lines
6.0 KiB
TypeScript
import { Colord } from "colord";
|
|
import { JWK } from "jose";
|
|
import {
|
|
Game,
|
|
Gold,
|
|
Player,
|
|
PlayerInfo,
|
|
Team,
|
|
TerraNullius,
|
|
Tick,
|
|
UnitInfo,
|
|
UnitType,
|
|
} from "../game/Game";
|
|
import { GameMap, TileRef } from "../game/GameMap";
|
|
import { PlayerView } from "../game/GameView";
|
|
import { UserSettings } from "../game/UserSettings";
|
|
import { GameConfig, GameID, TeamCountConfig } from "../Schemas";
|
|
import { NukeType } from "../StatsSchemas";
|
|
|
|
export enum GameEnv {
|
|
Dev,
|
|
Preprod,
|
|
Prod,
|
|
}
|
|
|
|
export interface ServerConfig {
|
|
turnstileSiteKey(): string;
|
|
turnstileSecretKey(): string;
|
|
turnIntervalMs(): number;
|
|
gameCreationRate(): number;
|
|
numWorkers(): number;
|
|
workerIndex(gameID: GameID): number;
|
|
workerPath(gameID: GameID): string;
|
|
workerPort(gameID: GameID): number;
|
|
workerPortByIndex(workerID: number): number;
|
|
env(): GameEnv;
|
|
adminToken(): string;
|
|
adminHeader(): string;
|
|
// Only available on the server
|
|
gitCommit(): string;
|
|
apiKey(): string;
|
|
otelEndpoint(): string;
|
|
otelAuthHeader(): string;
|
|
otelEnabled(): boolean;
|
|
jwtAudience(): string;
|
|
jwtIssuer(): string;
|
|
jwkPublicKey(): Promise<JWK>;
|
|
domain(): string;
|
|
subdomain(): string;
|
|
stripePublishableKey(): string;
|
|
allowedFlares(): string[] | undefined;
|
|
}
|
|
|
|
export interface NukeMagnitude {
|
|
inner: number;
|
|
outer: number;
|
|
}
|
|
|
|
export interface Config {
|
|
spawnImmunityDuration(): Tick;
|
|
nationSpawnImmunityDuration(): Tick;
|
|
hasExtendedSpawnImmunity(): boolean;
|
|
serverConfig(): ServerConfig;
|
|
gameConfig(): GameConfig;
|
|
theme(): Theme;
|
|
percentageTilesOwnedToWin(): number;
|
|
numBots(): number;
|
|
spawnNations(): boolean;
|
|
isUnitDisabled(unitType: UnitType): boolean;
|
|
bots(): number;
|
|
infiniteGold(): boolean;
|
|
donateGold(): boolean;
|
|
infiniteTroops(): boolean;
|
|
donateTroops(): boolean;
|
|
instantBuild(): boolean;
|
|
disableNavMesh(): boolean;
|
|
isRandomSpawn(): boolean;
|
|
numSpawnPhaseTurns(): number;
|
|
userSettings(): UserSettings;
|
|
playerTeams(): TeamCountConfig;
|
|
goldMultiplier(): number;
|
|
startingGold(playerInfo: PlayerInfo): Gold;
|
|
|
|
startManpower(playerInfo: PlayerInfo): number;
|
|
troopIncreaseRate(player: Player | PlayerView): number;
|
|
goldAdditionRate(player: Player | PlayerView): Gold;
|
|
attackTilesPerTick(
|
|
attckTroops: number,
|
|
attacker: Player,
|
|
defender: Player | TerraNullius,
|
|
numAdjacentTilesWithEnemy: number,
|
|
): number;
|
|
attackLogic(
|
|
gm: Game,
|
|
attackTroops: number,
|
|
attacker: Player,
|
|
defender: Player | TerraNullius,
|
|
tileToConquer: TileRef,
|
|
): {
|
|
attackerTroopLoss: number;
|
|
defenderTroopLoss: number;
|
|
tilesPerTickUsed: number;
|
|
};
|
|
attackAmount(attacker: Player, defender: Player | TerraNullius): number;
|
|
radiusPortSpawn(): number;
|
|
// When computing likelihood of trading for any given port, the X closest port
|
|
// are twice more likely to be selected. X is determined below.
|
|
proximityBonusPortsNb(totalPorts: number): number;
|
|
maxTroops(player: Player | PlayerView): number;
|
|
cityTroopIncrease(): number;
|
|
boatAttackAmount(attacker: Player, defender: Player | TerraNullius): number;
|
|
shellLifetime(): number;
|
|
boatMaxNumber(): number;
|
|
allianceDuration(): Tick;
|
|
allianceRequestDuration(): Tick;
|
|
allianceRequestCooldown(): Tick;
|
|
temporaryEmbargoDuration(): Tick;
|
|
targetDuration(): Tick;
|
|
targetCooldown(): Tick;
|
|
emojiMessageCooldown(): Tick;
|
|
emojiMessageDuration(): Tick;
|
|
donateCooldown(): Tick;
|
|
embargoAllCooldown(): Tick;
|
|
deletionMarkDuration(): Tick;
|
|
deleteUnitCooldown(): Tick;
|
|
defaultDonationAmount(sender: Player): number;
|
|
unitInfo(type: UnitType): UnitInfo;
|
|
tradeShipShortRangeDebuff(): number;
|
|
tradeShipGold(dist: number, numPorts: number): Gold;
|
|
tradeShipSpawnRate(
|
|
numTradeShips: number,
|
|
numPlayerPorts: number,
|
|
numPlayerTradeShips: number,
|
|
): number;
|
|
trainGold(rel: "self" | "team" | "ally" | "other"): Gold;
|
|
trainSpawnRate(numPlayerFactories: number): number;
|
|
trainStationMinRange(): number;
|
|
trainStationMaxRange(): number;
|
|
railroadMaxSize(): number;
|
|
safeFromPiratesCooldownMax(): number;
|
|
defensePostRange(): number;
|
|
SAMCooldown(): number;
|
|
SiloCooldown(): number;
|
|
minDistanceBetweenPlayers(): number;
|
|
defensePostDefenseBonus(): number;
|
|
defensePostSpeedBonus(): number;
|
|
falloutDefenseModifier(percentOfFallout: number): number;
|
|
warshipPatrolRange(): number;
|
|
warshipShellAttackRate(): number;
|
|
warshipTargettingRange(): number;
|
|
defensePostShellAttackRate(): number;
|
|
defensePostTargettingRange(): number;
|
|
// 0-1
|
|
traitorDefenseDebuff(): number;
|
|
traitorDuration(): number;
|
|
nukeMagnitudes(unitType: UnitType): NukeMagnitude;
|
|
// Number of tiles destroyed to break an alliance
|
|
nukeAllianceBreakThreshold(): number;
|
|
defaultNukeSpeed(): number;
|
|
defaultNukeTargetableRange(): number;
|
|
defaultSamMissileSpeed(): number;
|
|
defaultSamRange(): number;
|
|
samRange(level: number): number;
|
|
maxSamRange(): number;
|
|
nukeDeathFactor(
|
|
nukeType: NukeType,
|
|
humans: number,
|
|
tilesOwned: number,
|
|
maxTroops: number,
|
|
): number;
|
|
structureMinDist(): number;
|
|
isReplay(): boolean;
|
|
allianceExtensionPromptOffset(): number;
|
|
}
|
|
|
|
export interface Theme {
|
|
teamColor(team: Team): Colord;
|
|
// Don't call directly, use PlayerView
|
|
territoryColor(playerInfo: PlayerView): Colord;
|
|
// Don't call directly, use PlayerView
|
|
structureColors(territoryColor: Colord): { light: Colord; dark: Colord };
|
|
// Don't call directly, use PlayerView
|
|
borderColor(territoryColor: Colord): Colord;
|
|
// Don't call directly, use PlayerView
|
|
defendedBorderColors(territoryColor: Colord): { light: Colord; dark: Colord };
|
|
focusedBorderColor(): Colord;
|
|
terrainColor(gm: GameMap, tile: TileRef): Colord;
|
|
backgroundColor(): Colord;
|
|
falloutColor(): Colord;
|
|
font(): string;
|
|
textColor(playerInfo: PlayerView): string;
|
|
// unit color for alternate view
|
|
selfColor(): Colord;
|
|
allyColor(): Colord;
|
|
neutralColor(): Colord;
|
|
enemyColor(): Colord;
|
|
spawnHighlightColor(): Colord;
|
|
spawnHighlightSelfColor(): Colord;
|
|
spawnHighlightTeamColor(): Colord;
|
|
spawnHighlightEnemyColor(): Colord;
|
|
}
|