Added checkboxes to disable Bots and NPCs for single player and private lobbies

This commit is contained in:
NewHappyRabbit
2025-02-11 03:29:56 +02:00
parent a0b88f543c
commit 684b0bb2e0
12 changed files with 92 additions and 5 deletions
+2 -1
View File
@@ -5,4 +5,5 @@ TODO.txt
resources/images/.DS_Store
resources/.DS_Store
.env
.prettierrc
.prettierrc
.prettierignore
+4
View File
@@ -56,6 +56,8 @@ export interface LobbyConfig {
gameID: GameID;
map: GameMapType | null;
difficulty: Difficulty | null;
disableBots: boolean | null;
disableNPCs: boolean | null;
}
export function joinLobby(
@@ -77,6 +79,8 @@ export function joinLobby(
gameType: GameType.Singleplayer,
gameMap: lobbyConfig.map,
difficulty: lobbyConfig.difficulty,
disableBots: lobbyConfig.disableBots,
disableNPCs: lobbyConfig.disableNPCs,
};
}
+34
View File
@@ -9,6 +9,8 @@ export class HostLobbyModal extends LitElement {
@state() private isModalOpen = false;
@state() private selectedMap: GameMapType = GameMapType.World;
@state() private selectedDiffculty: Difficulty = Difficulty.Medium;
@state() private disableNPCs = false;
@state() private disableBots = false;
@state() private lobbyId = "";
@state() private copySuccess = false;
@state() private players: string[] = [];
@@ -165,6 +167,22 @@ export class HostLobbyModal extends LitElement {
)}
</select>
</div>
<div>
<input
type="checkbox"
id="disable-bots"
@change=${this.handleDisableBotsChange}
/>
<label for="disable-bots">Disable Bots</label>
</div>
<div>
<input
type="checkbox"
id="disable-npcs"
@change=${this.handleDisableNPCsChange}
/>
<label for="disable-npcs">Disable NPCs</label>
</div>
<button @click=${this.startGame}>Start Game</button>
<div>
<p>Players: ${this.players.join(", ")}</p>
@@ -191,6 +209,8 @@ export class HostLobbyModal extends LitElement {
},
map: this.selectedMap,
difficulty: this.selectedDiffculty,
disableBots: this.disableBots,
disableNPCs: this.disableNPCs,
},
bubbles: true,
composed: true,
@@ -226,6 +246,18 @@ export class HostLobbyModal extends LitElement {
this.putGameConfig();
}
private async handleDisableBotsChange(e: Event) {
this.disableBots = Boolean((e.target as HTMLInputElement).checked);
consolex.log(`updating disable bots to ${this.disableBots}`);
this.putGameConfig();
}
private async handleDisableNPCsChange(e: Event) {
this.disableNPCs = Boolean((e.target as HTMLInputElement).checked);
consolex.log(`updating disable npcs to ${this.disableNPCs}`);
this.putGameConfig();
}
private async putGameConfig() {
const response = await fetch(`/private_lobby/${this.lobbyId}`, {
method: "PUT",
@@ -235,6 +267,8 @@ export class HostLobbyModal extends LitElement {
body: JSON.stringify({
gameMap: this.selectedMap,
difficulty: this.selectedDiffculty,
disableBots: this.disableBots,
disableNPCs: this.disableNPCs,
}),
});
}
+2
View File
@@ -95,6 +95,8 @@ class Client {
clientID: generateID(),
map: event.detail.map,
difficulty: event.detail.difficulty,
disableBots: event.detail.disableBots,
disableNPCs: event.detail.disableNPCs,
},
() => this.joinModal.close()
);
+26
View File
@@ -9,6 +9,8 @@ export class SinglePlayerModal extends LitElement {
@state() private isModalOpen = false;
@state() private selectedMap: GameMapType = GameMapType.World;
@state() private selectedDifficulty: Difficulty = Difficulty.Medium;
@state() private disableNPCs = false;
@state() private disableBots = false;
static styles = css`
.modal-overlay {
@@ -115,6 +117,22 @@ export class SinglePlayerModal extends LitElement {
)}
</select>
</div>
<div>
<input
type="checkbox"
id="disable-bots"
@change=${this.handleDisableBotsChange}
/>
<label for="disable-bots">Disable Bots</label>
</div>
<div>
<input
type="checkbox"
id="disable-npcs"
@change=${this.handleDisableNPCsChange}
/>
<label for="disable-npcs">Disable NPCs</label>
</div>
<button @click=${this.startGame}>Start Game</button>
</div>
@@ -140,6 +158,12 @@ export class SinglePlayerModal extends LitElement {
(e.target as HTMLSelectElement).value,
) as Difficulty;
}
private handleDisableBotsChange(e: Event) {
this.disableBots = Boolean((e.target as HTMLInputElement).checked);
}
private handleDisableNPCsChange(e: Event) {
this.disableNPCs = Boolean((e.target as HTMLInputElement).checked);
}
private startGame() {
consolex.log(
`Starting single player game with map: ${GameMapType[this.selectedMap]}`,
@@ -153,6 +177,8 @@ export class SinglePlayerModal extends LitElement {
},
map: this.selectedMap,
difficulty: this.selectedDifficulty,
disableBots: this.disableBots,
disableNPCs: this.disableNPCs,
},
bubbles: true,
composed: true,
+5 -3
View File
@@ -58,9 +58,11 @@ export class GameRunner {
) {}
init() {
this.game.addExecution(
...this.execManager.spawnBots(this.game.config().numBots())
);
if (this.game.config().spawnBots()) {
this.game.addExecution(
...this.execManager.spawnBots(this.game.config().numBots())
);
}
if (this.game.config().spawnNPCs()) {
this.game.addExecution(...this.execManager.fakeHumanExecutions());
}
+2
View File
@@ -92,6 +92,8 @@ const GameConfigSchema = z.object({
gameMap: z.nativeEnum(GameMapType),
difficulty: z.nativeEnum(Difficulty),
gameType: z.nativeEnum(GameType),
disableBots: z.boolean(),
disableNPCs: z.boolean(),
});
const SafeString = z
+1
View File
@@ -70,6 +70,7 @@ export interface Config {
percentageTilesOwnedToWin(): number;
numBots(): number;
spawnNPCs(): boolean;
spawnBots(): boolean;
numSpawnPhaseTurns(): number;
startManpower(playerInfo: PlayerInfo): number;
+4 -1
View File
@@ -76,7 +76,10 @@ export class DefaultConfig implements Config {
return 5;
}
spawnNPCs(): boolean {
return true;
return !this._gameConfig.disableNPCs;
}
spawnBots(): boolean {
return !this._gameConfig.disableBots;
}
tradeShipGold(dist: number): Gold {
return 10000 + 100 * Math.pow(dist, 1.1);
+4
View File
@@ -49,6 +49,8 @@ export class GameManager {
gameMap: GameMapType.World,
gameType: GameType.Private,
difficulty: Difficulty.Medium,
disableBots: false,
disableNPCs: false,
})
);
return id;
@@ -87,6 +89,8 @@ export class GameManager {
gameMap: this.random.randElement(Object.values(GameMapType)),
gameType: GameType.Public,
difficulty: Difficulty.Medium,
disableBots: false,
disableNPCs: false,
})
);
}
+6
View File
@@ -57,6 +57,12 @@ export class GameServer {
if (gameConfig.difficulty != null) {
this.gameConfig.difficulty = gameConfig.difficulty;
}
if (gameConfig.disableBots != null) {
this.gameConfig.disableBots = gameConfig.disableBots;
}
if (gameConfig.disableNPCs != null) {
this.gameConfig.disableNPCs = gameConfig.disableNPCs;
}
}
public addClient(client: Client, lastTurn: number) {
+2
View File
@@ -94,6 +94,8 @@ app.put("/private_lobby/:id", (req, res) => {
gm.updateGameConfig(lobbyID, {
gameMap: req.body.gameMap,
difficulty: req.body.difficulty,
disableBots: req.body.disableBots,
disableNPCs: req.body.disableNPCs,
});
});