mirror of
https://github.com/openfrontio/OpenFrontIO.git
synced 2026-06-21 13:40:46 +00:00
ebcb654825
## Description: Added a public game modifier system. It causes that 5% of public games are played on the compact version of the map 10% of public games have "Random Spawn" activated Percentages can easily get changed via `DefaultConfig`. We can also easily add more modifiers. Modifiers can stack, so in rare cases you will play on a compact map with random spawn 😄 More variety! ### "Compact Map" modifier implementation - With the "Compact Map" modifier the lobby max player count gets reduced to 25% and only 25% of the regular bots and only 25% of the regular nations will spawn (because the map has only 25% of its regular size) - In private lobbies and singleplayer the nation reduction happens too (When "Compact Map" is enabled). ### Restrictions - Duos/Trios/Quads team modes do not get Random Spawn (defeats the purpose) - Maps with smallest player count < 50 do not get Compact Map in team games (not enough players after the reduction to 25%). I have calculated all the possible max player counts. ### How it looks like Random Spawn modifier: <img width="528" height="183" alt="Screenshot 2026-01-06 194959" src="https://github.com/user-attachments/assets/2f729da9-80c3-4548-8205-71129da2a76a" /> Very rare case: Two modifiers at the same time and only 10 max players have been chosen from `[GameMapType.FaroeIslands]: [20, 15, 10]`. Because of the 75% reduction in player count only 3 players are allowed (3 is the minimum). I think its funny that you can play a 1v1v1 in rare occasions 😄 <img width="526" height="184" alt="Screenshot 2026-01-06 194938" src="https://github.com/user-attachments/assets/834326eb-df03-41b7-b1db-1efa3f1013b5" /> ### Funny side-effect Team games with random spawn. That will be interesting. No more "Who is better in donating troops to the frontline". Instead you have to heavily coordinate with your teammates. ## 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
92 lines
2.6 KiB
TypeScript
92 lines
2.6 KiB
TypeScript
import { JWK } from "jose";
|
|
import { GameEnv, ServerConfig } from "../../src/core/configuration/Config";
|
|
import { GameMapType, PublicGameModifiers } from "../../src/core/game/Game";
|
|
import { GameID } from "../../src/core/Schemas";
|
|
|
|
export class TestServerConfig implements ServerConfig {
|
|
turnstileSiteKey(): string {
|
|
throw new Error("Method not implemented.");
|
|
}
|
|
turnstileSecretKey(): string {
|
|
throw new Error("Method not implemented.");
|
|
}
|
|
enableMatchmaking(): boolean {
|
|
throw new Error("Method not implemented.");
|
|
}
|
|
apiKey(): string {
|
|
throw new Error("Method not implemented.");
|
|
}
|
|
allowedFlares(): string[] | undefined {
|
|
throw new Error("Method not implemented.");
|
|
}
|
|
stripePublishableKey(): string {
|
|
throw new Error("Method not implemented.");
|
|
}
|
|
domain(): string {
|
|
throw new Error("Method not implemented.");
|
|
}
|
|
subdomain(): string {
|
|
throw new Error("Method not implemented.");
|
|
}
|
|
jwtAudience(): string {
|
|
throw new Error("Method not implemented.");
|
|
}
|
|
jwtIssuer(): string {
|
|
throw new Error("Method not implemented.");
|
|
}
|
|
jwkPublicKey(): Promise<JWK> {
|
|
throw new Error("Method not implemented.");
|
|
}
|
|
otelEnabled(): boolean {
|
|
throw new Error("Method not implemented.");
|
|
}
|
|
otelEndpoint(): string {
|
|
throw new Error("Method not implemented.");
|
|
}
|
|
otelAuthHeader(): string {
|
|
throw new Error("Method not implemented.");
|
|
}
|
|
turnIntervalMs(): number {
|
|
throw new Error("Method not implemented.");
|
|
}
|
|
gameCreationRate(): number {
|
|
throw new Error("Method not implemented.");
|
|
}
|
|
lobbyMaxPlayers(map: GameMapType): number {
|
|
throw new Error("Method not implemented.");
|
|
}
|
|
numWorkers(): number {
|
|
throw new Error("Method not implemented.");
|
|
}
|
|
workerIndex(gameID: GameID): number {
|
|
throw new Error("Method not implemented.");
|
|
}
|
|
workerPath(gameID: GameID): string {
|
|
throw new Error("Method not implemented.");
|
|
}
|
|
workerPort(gameID: GameID): number {
|
|
throw new Error("Method not implemented.");
|
|
}
|
|
workerPortByIndex(workerID: number): number {
|
|
throw new Error("Method not implemented.");
|
|
}
|
|
env(): GameEnv {
|
|
throw new Error("Method not implemented.");
|
|
}
|
|
adminToken(): string {
|
|
throw new Error("Method not implemented.");
|
|
}
|
|
adminHeader(): string {
|
|
throw new Error("Method not implemented.");
|
|
}
|
|
gitCommit(): string {
|
|
throw new Error("Method not implemented.");
|
|
}
|
|
getRandomPublicGameModifiers(): PublicGameModifiers {
|
|
return { isCompact: false, isRandomSpawn: false };
|
|
}
|
|
supportsCompactMapForTeams(map: GameMapType): boolean {
|
|
throw new Error("Method not implemented.");
|
|
}
|
|
}
|