teammode: bots can attack each other now to prevent them from ganging up on players

This commit is contained in:
evan
2025-05-06 09:52:13 -07:00
parent 8805367db7
commit d49272e17e
4 changed files with 63 additions and 4 deletions
-1
View File
@@ -124,7 +124,6 @@ export class GameImpl implements Game {
this._nations.forEach((n) => this.addPlayer(n.playerInfo));
return;
}
const isDuos = this.config().gameConfig().playerTeams === Duos;
const allPlayers = [
...this._humans,
...this._nations.map((n) => n.playerInfo),
+4
View File
@@ -20,6 +20,7 @@ import {
Attack,
BuildableUnit,
Cell,
ColoredTeams,
EmojiMessage,
Gold,
MessageType,
@@ -606,6 +607,9 @@ export class PlayerImpl implements Player {
if (this.team() == null || other.team() == null) {
return false;
}
if (this.team() == ColoredTeams.Bot || other.team() == ColoredTeams.Bot) {
return false;
}
return this._team == other.team();
}
+42
View File
@@ -0,0 +1,42 @@
import {
ColoredTeams,
Game,
GameMode,
PlayerType,
} from "../src/core/game/Game";
import { playerInfo, setup } from "./util/Setup";
let game: Game;
describe("Teams", () => {
test("bots are on the same team, but can attack each other", async () => {
game = await setup("Plains", { gameMode: GameMode.Team, playerTeams: 2 });
const bot1 = game.addPlayer(playerInfo("bot1", PlayerType.Bot));
const bot2 = game.addPlayer(playerInfo("bot2", PlayerType.Bot));
// Both bots should be on the same team
expect(bot1.team()).toBe(ColoredTeams.Bot);
expect(bot2.team()).toBe(ColoredTeams.Bot);
// But they should be allowed to attack each other.
expect(bot1.isOnSameTeam(bot2)).toBe(false);
});
test("humans spawn on different teams", async () => {
game = await setup(
"Plains",
{
gameMode: GameMode.Team,
playerTeams: 2,
},
[
playerInfo("human1", PlayerType.Human),
playerInfo("human2", PlayerType.Human),
],
);
expect(game.player("human1").isOnSameTeam(game.player("human2"))).toBe(
false,
);
});
});
+17 -3
View File
@@ -1,6 +1,12 @@
import fs from "fs/promises";
import path from "path";
import { Difficulty, GameType } from "../../src/core/game/Game";
import {
Difficulty,
Game,
GameType,
PlayerInfo,
PlayerType,
} from "../../src/core/game/Game";
import { createGame } from "../../src/core/game/GameImpl";
import { genTerrainFromBin } from "../../src/core/game/TerrainMapLoader";
import { UserSettings } from "../../src/core/game/UserSettings";
@@ -9,7 +15,11 @@ import { generateMap } from "../../src/scripts/TerrainMapGenerator";
import { TestConfig } from "./TestConfig";
import { TestServerConfig } from "./TestServerConfig";
export async function setup(mapName: string, _gameConfig: GameConfig = {}) {
export async function setup(
mapName: string,
_gameConfig: GameConfig = {},
humans: PlayerInfo[] = [],
): Promise<Game> {
// Load the specified map
const mapPath = path.join(__dirname, "..", "testdata", `${mapName}.png`);
const imageBuffer = await fs.readFile(mapPath);
@@ -35,5 +45,9 @@ export async function setup(mapName: string, _gameConfig: GameConfig = {}) {
const config = new TestConfig(serverConfig, gameConfig, new UserSettings());
// Create and return the game
return createGame([], [], gameMap, miniGameMap, config);
return createGame(humans, [], gameMap, miniGameMap, config);
}
export function playerInfo(name: string, type: PlayerType): PlayerInfo {
return new PlayerInfo("fr", name, type, null, name);
}