mirror of
https://github.com/openfrontio/OpenFrontIO.git
synced 2026-06-21 19:06:48 +00:00
9b125c8cfe
## Description: In commit https://github.com/openfrontio/OpenFrontIO/commit/bbf72bd14f7f31146c687523aea8fc0aff31bbe1#diff-ee2fcbca50d87cc09d2c7d2667210defe2e3e111239820c89c40283be5385b64 it was added that startManpower in DefaultConfig used playerInfo.nation.strength to set the starting troops for a Nation. In ExecutionManager, param nation of PlayerInfo was set during the instantiation of a new FakeHumanExecution. However in commit https://github.com/openfrontio/OpenFrontIO/commit/d6a412aa50dd86d474d80c216fd9ba36e7426ef9#diff-2d0a5d8b171d8b504f934891025e42742e142ef0964d6e17712bfdcd30bf050c the changes made it so that **param nation of PlayerInfo was never set**. While startManpower in DefaultConfig still checked for playerinfo.nation.strength. Since it was always undefined, it would use a multiplier of 1 instead of the actual nation strength. This PR fixes it by passing the nation strength to param nationStrength in PlayerInfo. Removing param strength from class Nation. Strength isn't used anywhere else so this isn't a problem and it also consolidates human player info and nation player info even more. We could have also used the Nation.strength directly, but that would have required more code in addPlayers and addPlayer in GameImpl, especially for Teams games. So this PR has the simplest solution. - I did add a config setting useNationStrengthForStartManpower with a comment that explains its reason for being. Namely that in the months that startManpower didn't get to use nation strength because of the bug, FakeHumans have become much harder to fight. Re-enabling higher starting troops from this fix would make them even harder to fight, and i think rebalancing is needed before that. - Or we could decide to scrap Nation strength altogether, as it is only ever used to set starting troops anyway. This would make map making a little easier as a bycatch. ## 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: tryout33
167 lines
5.6 KiB
TypeScript
167 lines
5.6 KiB
TypeScript
import { ColoredTeams, PlayerInfo, PlayerType } from "../src/core/game/Game";
|
|
import { assignTeams } from "../src/core/game/TeamAssignment";
|
|
|
|
const teams = [ColoredTeams.Red, ColoredTeams.Blue];
|
|
|
|
describe("assignTeams", () => {
|
|
const createPlayer = (id: string, clan?: string): PlayerInfo => {
|
|
const name = clan ? `[${clan}]Player ${id}` : `Player ${id}`;
|
|
return new PlayerInfo(
|
|
name,
|
|
PlayerType.Human,
|
|
null, // clientID (null for testing)
|
|
id,
|
|
);
|
|
};
|
|
|
|
it("should assign players to teams when no clans are present", () => {
|
|
const players = [
|
|
createPlayer("1"),
|
|
createPlayer("2"),
|
|
createPlayer("3"),
|
|
createPlayer("4"),
|
|
];
|
|
|
|
const result = assignTeams(players, teams);
|
|
|
|
// Check that players are assigned alternately
|
|
expect(result.get(players[0])).toEqual(ColoredTeams.Red);
|
|
expect(result.get(players[1])).toEqual(ColoredTeams.Blue);
|
|
expect(result.get(players[2])).toEqual(ColoredTeams.Red);
|
|
expect(result.get(players[3])).toEqual(ColoredTeams.Blue);
|
|
});
|
|
|
|
it("should keep clan members together on the same team", () => {
|
|
const players = [
|
|
createPlayer("1", "CLANA"),
|
|
createPlayer("2", "CLANA"),
|
|
createPlayer("3", "CLANB"),
|
|
createPlayer("4", "CLANB"),
|
|
];
|
|
|
|
const result = assignTeams(players, teams);
|
|
|
|
// Check that clan members are on the same team
|
|
expect(result.get(players[0])).toEqual(ColoredTeams.Red);
|
|
expect(result.get(players[1])).toEqual(ColoredTeams.Red);
|
|
expect(result.get(players[2])).toEqual(ColoredTeams.Blue);
|
|
expect(result.get(players[3])).toEqual(ColoredTeams.Blue);
|
|
});
|
|
|
|
it("should handle mixed clan and non-clan players", () => {
|
|
const players = [
|
|
createPlayer("1", "CLANA"),
|
|
createPlayer("2", "CLANA"),
|
|
createPlayer("3"),
|
|
createPlayer("4"),
|
|
];
|
|
|
|
const result = assignTeams(players, teams);
|
|
|
|
// Check that clan members are together and non-clan players balance teams
|
|
expect(result.get(players[0])).toEqual(ColoredTeams.Red);
|
|
expect(result.get(players[1])).toEqual(ColoredTeams.Red);
|
|
expect(result.get(players[2])).toEqual(ColoredTeams.Blue);
|
|
expect(result.get(players[3])).toEqual(ColoredTeams.Blue);
|
|
});
|
|
|
|
it("should kick players when teams are full", () => {
|
|
const players = [
|
|
createPlayer("1", "CLANA"),
|
|
createPlayer("2", "CLANA"),
|
|
createPlayer("3", "CLANA"),
|
|
createPlayer("4", "CLANA"),
|
|
createPlayer("5", "CLANB"),
|
|
createPlayer("6", "CLANB"),
|
|
];
|
|
|
|
const result = assignTeams(players, teams);
|
|
|
|
// Check that players are kicked when teams are full
|
|
expect(result.get(players[0])).toEqual(ColoredTeams.Red);
|
|
expect(result.get(players[1])).toEqual(ColoredTeams.Red);
|
|
expect(result.get(players[2])).toEqual(ColoredTeams.Red);
|
|
|
|
expect(result.get(players[3])).toEqual("kicked");
|
|
|
|
expect(result.get(players[4])).toEqual(ColoredTeams.Blue);
|
|
expect(result.get(players[5])).toEqual(ColoredTeams.Blue);
|
|
});
|
|
|
|
it("should handle empty player list", () => {
|
|
const result = assignTeams([], teams);
|
|
expect(result.size).toBe(0);
|
|
});
|
|
|
|
it("should handle single player", () => {
|
|
const players = [createPlayer("1")];
|
|
const result = assignTeams(players, teams);
|
|
expect(result.get(players[0])).toEqual(ColoredTeams.Red);
|
|
});
|
|
|
|
it("should handle multiple clans with different sizes", () => {
|
|
const players = [
|
|
createPlayer("1", "CLANA"),
|
|
createPlayer("2", "CLANA"),
|
|
createPlayer("3", "CLANA"),
|
|
createPlayer("4", "CLANB"),
|
|
createPlayer("5", "CLANB"),
|
|
createPlayer("6", "CLANC"),
|
|
];
|
|
|
|
const result = assignTeams(players, teams);
|
|
|
|
// Check that larger clans are assigned first
|
|
expect(result.get(players[0])).toEqual(ColoredTeams.Red);
|
|
expect(result.get(players[1])).toEqual(ColoredTeams.Red);
|
|
expect(result.get(players[2])).toEqual(ColoredTeams.Red);
|
|
expect(result.get(players[3])).toEqual(ColoredTeams.Blue);
|
|
expect(result.get(players[4])).toEqual(ColoredTeams.Blue);
|
|
expect(result.get(players[5])).toEqual(ColoredTeams.Blue);
|
|
});
|
|
|
|
it("should distribute players among a larger number of teams", () => {
|
|
const players = [
|
|
createPlayer("1", "CLANA"),
|
|
createPlayer("2", "CLANA"),
|
|
createPlayer("3", "CLANA"),
|
|
createPlayer("4", "CLANB"),
|
|
createPlayer("5", "CLANB"),
|
|
createPlayer("6", "CLANC"),
|
|
createPlayer("7"),
|
|
createPlayer("8"),
|
|
createPlayer("9"),
|
|
createPlayer("10"),
|
|
createPlayer("11"),
|
|
createPlayer("12"),
|
|
createPlayer("13"),
|
|
createPlayer("14"),
|
|
];
|
|
|
|
const result = assignTeams(players, [
|
|
ColoredTeams.Red,
|
|
ColoredTeams.Blue,
|
|
ColoredTeams.Yellow,
|
|
ColoredTeams.Green,
|
|
ColoredTeams.Purple,
|
|
ColoredTeams.Orange,
|
|
ColoredTeams.Teal,
|
|
]);
|
|
|
|
expect(result.get(players[0])).toEqual(ColoredTeams.Red);
|
|
expect(result.get(players[1])).toEqual(ColoredTeams.Red);
|
|
expect(result.get(players[2])).toEqual("kicked");
|
|
expect(result.get(players[3])).toEqual(ColoredTeams.Blue);
|
|
expect(result.get(players[4])).toEqual(ColoredTeams.Blue);
|
|
expect(result.get(players[5])).toEqual(ColoredTeams.Yellow);
|
|
expect(result.get(players[6])).toEqual(ColoredTeams.Green);
|
|
expect(result.get(players[7])).toEqual(ColoredTeams.Purple);
|
|
expect(result.get(players[8])).toEqual(ColoredTeams.Orange);
|
|
expect(result.get(players[9])).toEqual(ColoredTeams.Teal);
|
|
expect(result.get(players[10])).toEqual(ColoredTeams.Yellow);
|
|
expect(result.get(players[11])).toEqual(ColoredTeams.Green);
|
|
expect(result.get(players[12])).toEqual(ColoredTeams.Purple);
|
|
expect(result.get(players[13])).toEqual(ColoredTeams.Orange);
|
|
});
|
|
});
|