From a462d7837267fb136c239a5fb3275373a40a39b8 Mon Sep 17 00:00:00 2001 From: norielbit Date: Sun, 12 Apr 2020 20:11:45 +0300 Subject: [PATCH 01/15] Add power token tooltip --- .../src/client/IngameComponent.tsx | 33 +++++++++++++++---- .../ingame-game-state/IngameGameState.ts | 4 +-- .../game-data-structure/Game.ts | 7 ++-- .../game-data-structure/createGame.ts | 3 ++ .../src/server/serializedGameMigrations.ts | 10 ++++++ 5 files changed, 45 insertions(+), 12 deletions(-) diff --git a/agot-bg-game-server/src/client/IngameComponent.tsx b/agot-bg-game-server/src/client/IngameComponent.tsx index 485c48b3e..bbdac0d3f 100644 --- a/agot-bg-game-server/src/client/IngameComponent.tsx +++ b/agot-bg-game-server/src/client/IngameComponent.tsx @@ -288,13 +288,19 @@ export default class IngameComponent extends Component {
{p.house.powerTokens}
-
+ +
+ @@ -467,6 +473,19 @@ export default class IngameComponent extends Component { return this.props.gameClient.chatClient.channels.get(this.props.gameState.entireGame.publicChatRoomId); } + private renderPowerTooltip(house: House): ReactNode { + const availablePower = house.powerTokens; + const powerTokensOnBoard = this.game.countPowerTokensOnBoard(house); + const powerInPool = this.game.maxPowerTokens - availablePower - powerTokensOnBoard; + + return + {house.name}
+ Available: {availablePower}
+ On the board: {powerTokensOnBoard}
+ Power Pool: {powerInPool} +
; + } + onNewPrivateChatRoomClick(p: Player): void { const users = _.sortBy([this.props.gameClient.authenticatedUser as User, p.user], u => u.id); diff --git a/agot-bg-game-server/src/common/ingame-game-state/IngameGameState.ts b/agot-bg-game-server/src/common/ingame-game-state/IngameGameState.ts index 4722c9f96..1b472489d 100644 --- a/agot-bg-game-server/src/common/ingame-game-state/IngameGameState.ts +++ b/agot-bg-game-server/src/common/ingame-game-state/IngameGameState.ts @@ -21,8 +21,6 @@ import {GameLogData} from "./game-data-structure/GameLog"; import GameEndedGameState, {SerializedGameEndedGameState} from "./game-ended-game-state/GameEndedGameState"; import UnitType from "./game-data-structure/UnitType"; -const MAX_POWER_TOKENS = 20; - export default class IngameGameState extends GameState< EntireGame, WesterosGameState | PlanningGameState | ActionGameState | GameEndedGameState @@ -134,7 +132,7 @@ export default class IngameGameState extends GameState< const originalValue = house.powerTokens; const powerTokensOnBoardCount = this.game.countPowerTokensOnBoard(house); - const maxPowerTokenCount = MAX_POWER_TOKENS - powerTokensOnBoardCount; + const maxPowerTokenCount = this.game.maxPowerTokens - powerTokensOnBoardCount; house.powerTokens += delta; house.powerTokens = Math.max(0, Math.min(house.powerTokens, maxPowerTokenCount)); diff --git a/agot-bg-game-server/src/common/ingame-game-state/game-data-structure/Game.ts b/agot-bg-game-server/src/common/ingame-game-state/game-data-structure/Game.ts index d874fd9f3..cb230a837 100644 --- a/agot-bg-game-server/src/common/ingame-game-state/game-data-structure/Game.ts +++ b/agot-bg-game-server/src/common/ingame-game-state/game-data-structure/Game.ts @@ -14,7 +14,6 @@ import BetterMap from "../../../utils/BetterMap"; import HouseCard from "./house-card/HouseCard"; import {land, port} from "./regionTypes"; import PlanningRestriction from "./westeros-card/planning-restriction/PlanningRestriction"; -import EntireGame from "../../EntireGame"; export const MAX_WILDLING_STRENGTH = 12; @@ -36,6 +35,7 @@ export default class Game { skipRavenPhase: boolean; structuresCountNeededToWin: number; maxTurns: number; + maxPowerTokens: number; get ironThroneHolder(): House { return this.getTokenHolder(this.ironThroneTrack); @@ -323,7 +323,8 @@ export default class Game { starredOrderRestrictions: this.starredOrderRestrictions, skipRavenPhase: this.skipRavenPhase, structuresCountNeededToWin: this.structuresCountNeededToWin, - maxTurns: this.maxTurns + maxTurns: this.maxTurns, + maxPowerTokens: this.maxPowerTokens }; } @@ -346,6 +347,7 @@ export default class Game { game.skipRavenPhase = data.skipRavenPhase; game.structuresCountNeededToWin = data.structuresCountNeededToWin; game.maxTurns = data.maxTurns; + game.maxPowerTokens = data.maxPowerTokens; return game; } @@ -368,4 +370,5 @@ export interface SerializedGame { skipRavenPhase: boolean; structuresCountNeededToWin: number; maxTurns: number; + maxPowerTokens: number; } diff --git a/agot-bg-game-server/src/common/ingame-game-state/game-data-structure/createGame.ts b/agot-bg-game-server/src/common/ingame-game-state/game-data-structure/createGame.ts index 70ef9f589..d3aed52c6 100644 --- a/agot-bg-game-server/src/common/ingame-game-state/game-data-structure/createGame.ts +++ b/agot-bg-game-server/src/common/ingame-game-state/game-data-structure/createGame.ts @@ -18,6 +18,8 @@ import * as _ from "lodash"; import houseCardAbilities from "./house-card/houseCardAbilities"; import EntireGame from "../../EntireGame"; +const MAX_POWER_TOKENS = 20; + interface TiledSquareObject { name: string; x: number; @@ -125,6 +127,7 @@ export default function createGame(entireGame: EntireGame, housesToCreate: strin game.maxTurns = baseGameData.maxTurns; game.structuresCountNeededToWin = baseGameData.structuresCountNeededToWin; game.supplyRestrictions = baseGameData.supplyRestrictions; + game.maxPowerTokens = MAX_POWER_TOKENS; // Load tracks starting positions if (gameSetup.tracks && gameSetup.tracks.ironThrone) { diff --git a/agot-bg-game-server/src/server/serializedGameMigrations.ts b/agot-bg-game-server/src/server/serializedGameMigrations.ts index 114891b3c..bf01c83a1 100644 --- a/agot-bg-game-server/src/server/serializedGameMigrations.ts +++ b/agot-bg-game-server/src/server/serializedGameMigrations.ts @@ -108,6 +108,16 @@ const serializedGameMigrations: {version: string; migrate: (serializeGamed: any) return serializedGame; } + }, + { + version: "4", + migrate: (serializedGame: any) => { + // Migration for #532 + if (serializedGame.childGameState.type == "ingame") { + // Set max power tokens to the default max of 20 + serializedGame.childGameState.game.maxPowerTokens = 20; + } + } } ]; From 7d7a290ff136fb3e88d1f7bae8fbfb9b2a099fd2 Mon Sep 17 00:00:00 2001 From: Longwelwind Date: Tue, 14 Apr 2020 17:27:18 +0200 Subject: [PATCH 02/15] Prevent game logs container from having a x scroll bar --- agot-bg-game-server/src/client/IngameComponent.tsx | 2 +- agot-bg-game-server/src/client/style/custom.scss | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/agot-bg-game-server/src/client/IngameComponent.tsx b/agot-bg-game-server/src/client/IngameComponent.tsx index bbdac0d3f..2135bd325 100644 --- a/agot-bg-game-server/src/client/IngameComponent.tsx +++ b/agot-bg-game-server/src/client/IngameComponent.tsx @@ -432,7 +432,7 @@ export default class IngameComponent extends Component { currentlyViewed={this.currentOpenedTab == "chat"}/> - + diff --git a/agot-bg-game-server/src/client/style/custom.scss b/agot-bg-game-server/src/client/style/custom.scss index 29a155f1e..43bbeed0e 100644 --- a/agot-bg-game-server/src/client/style/custom.scss +++ b/agot-bg-game-server/src/client/style/custom.scss @@ -327,3 +327,7 @@ hr { .tooltip-inner { text-align: left; } + +.overflow-x-hidden { + overflow-x: hidden; +} \ No newline at end of file From 44b2e01fed535711662b74926ed02e723cf48d70 Mon Sep 17 00:00:00 2001 From: gereon77 Date: Thu, 16 Apr 2020 15:22:17 +0200 Subject: [PATCH 03/15] Change order of immediatly-killed-after-combat logs so wounded appears before cannot-retreat --- agot-bg-game-server/src/client/GameLogListComponent.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/agot-bg-game-server/src/client/GameLogListComponent.tsx b/agot-bg-game-server/src/client/GameLogListComponent.tsx index 9022613fb..25635e0f5 100644 --- a/agot-bg-game-server/src/client/GameLogListComponent.tsx +++ b/agot-bg-game-server/src/client/GameLogListComponent.tsx @@ -895,8 +895,8 @@ export default class GameLogListComponent extends Component; case "immediatly-killed-after-combat": return <> - {data.killedBecauseCantRetreat.length > 0 && (<>{data.house} suffered battle casualties because this units can't retreat: <>{joinReactNodes(data.killedBecauseCantRetreat.map((unitType, i) => {unitType}), ', ')}.)} {data.killedBecauseWounded.length > 0 && (<>{data.house} suffered battle casualties because this units were wounded: <>{joinReactNodes(data.killedBecauseWounded.map((unitType, i) => {unitType}), ', ')}.)} + {data.killedBecauseCantRetreat.length > 0 && (<>{data.house} suffered battle casualties because this units can't retreat: <>{joinReactNodes(data.killedBecauseCantRetreat.map((unitType, i) => {unitType}), ', ')}.)} ; case "killed-after-combat": From ee63f34c733bedafb4681df2d86c123e4d000189 Mon Sep 17 00:00:00 2001 From: gereon77 Date: Thu, 16 Apr 2020 15:46:38 +0200 Subject: [PATCH 04/15] Fix "immediatly-killed-after-combat" --- .../src/client/GameLogListComponent.tsx | 11 ++++++---- .../PostCombatGameState.ts | 7 +++---- .../src/server/serializedGameMigrations.ts | 20 +++++++++++++++++++ 3 files changed, 30 insertions(+), 8 deletions(-) diff --git a/agot-bg-game-server/src/client/GameLogListComponent.tsx b/agot-bg-game-server/src/client/GameLogListComponent.tsx index 25635e0f5..d9e805e0c 100644 --- a/agot-bg-game-server/src/client/GameLogListComponent.tsx +++ b/agot-bg-game-server/src/client/GameLogListComponent.tsx @@ -893,12 +893,15 @@ export default class GameLogListComponent extends Component ; - case "immediatly-killed-after-combat": + case "immediatly-killed-after-combat": { + const house = this.game.houses.get(data.house); + const killedBecauseWounded = data.killedBecauseWounded.map(utid => unitTypes.get(utid).name); + const killedBecauseCantRetreat = data.killedBecauseCantRetreat.map(utid => unitTypes.get(utid).name); return <> - {data.killedBecauseWounded.length > 0 && (<>{data.house} suffered battle casualties because this units were wounded: <>{joinReactNodes(data.killedBecauseWounded.map((unitType, i) => {unitType}), ', ')}.)} - {data.killedBecauseCantRetreat.length > 0 && (<>{data.house} suffered battle casualties because this units can't retreat: <>{joinReactNodes(data.killedBecauseCantRetreat.map((unitType, i) => {unitType}), ', ')}.)} + {killedBecauseWounded.length > 0 && (<>{house.name} suffered battle casualties because this units were wounded: <>{joinReactNodes(killedBecauseWounded.map((unitType, i) => {unitType}), ', ')}.)} + {killedBecauseCantRetreat.length > 0 && (<>{house.name} suffered battle casualties because this units can't retreat: <>{joinReactNodes(killedBecauseCantRetreat.map((unitType, i) => {unitType}), ', ')}.)} ; - + } case "killed-after-combat": return <> {data.house} suffered battle casualties and chose this units to be killed: <>{joinReactNodes(data.killed.map((unitType, i) => {unitType}), ', ')}. diff --git a/agot-bg-game-server/src/common/ingame-game-state/action-game-state/resolve-march-order-game-state/combat-game-state/post-combat-game-state/PostCombatGameState.ts b/agot-bg-game-server/src/common/ingame-game-state/action-game-state/resolve-march-order-game-state/combat-game-state/post-combat-game-state/PostCombatGameState.ts index 7f540afc8..d17246638 100644 --- a/agot-bg-game-server/src/common/ingame-game-state/action-game-state/resolve-march-order-game-state/combat-game-state/post-combat-game-state/PostCombatGameState.ts +++ b/agot-bg-game-server/src/common/ingame-game-state/action-game-state/resolve-march-order-game-state/combat-game-state/post-combat-game-state/PostCombatGameState.ts @@ -150,9 +150,9 @@ export default class PostCombatGameState extends GameState< this.combat.ingameGameState.log( { type: "immediatly-killed-after-combat", - house: this.loser.name, - killedBecauseWounded: immediatelyKilledLoserUnits.filter(u => u.wounded).map(u => u.type.name), - killedBecauseCantRetreat: immediatelyKilledLoserUnits.filter(u => !u.type.canRetreat).map(u => u.type.name) + house: this.loser.id, + killedBecauseWounded: immediatelyKilledLoserUnits.filter(u => u.wounded).map(u => u.type.id), + killedBecauseCantRetreat: immediatelyKilledLoserUnits.filter(u => !u.type.canRetreat).map(u => u.type.id) } ); @@ -188,7 +188,6 @@ export default class PostCombatGameState extends GameState< // is not needed. The army left can be exterminated. this.onChooseCasualtiesGameStateEnd(locationLoserArmy, loserArmyLeft); } - return; } } diff --git a/agot-bg-game-server/src/server/serializedGameMigrations.ts b/agot-bg-game-server/src/server/serializedGameMigrations.ts index bf01c83a1..d7a2e5cb4 100644 --- a/agot-bg-game-server/src/server/serializedGameMigrations.ts +++ b/agot-bg-game-server/src/server/serializedGameMigrations.ts @@ -1,4 +1,5 @@ import BetterMap from "../utils/BetterMap"; +import unitTypes from "../common/ingame-game-state/game-data-structure/unitTypes"; const serializedGameMigrations: {version: string; migrate: (serializeGamed: any) => any}[] = [ { @@ -117,6 +118,25 @@ const serializedGameMigrations: {version: string; migrate: (serializeGamed: any) // Set max power tokens to the default max of 20 serializedGame.childGameState.game.maxPowerTokens = 20; } + + // Migration for #550 + if (serializedGame.childGameState.type == "ingame") { + const ingame = serializedGame.childGameState; + + const unitTypeNameToIdMappings = new BetterMap(unitTypes.entries.map(([utid, ut]) => [ut.name, utid])); + const houseNameToIdMappings = new BetterMap(ingame.game.houses.map((h: any) => [h.name, h.id])); + + ingame.gameLogManager.logs + .filter((log: any) => log.data.type == "immediatly-killed-after-combat") + .forEach((log: any) => { + const woundedNames: string[] = log.data.killedBecauseWounded; + const cannotRetreatNames: string[] = log.data.killedBecauseCantRetreat; + const houseName = log.data.house; + log.data.house = houseNameToIdMappings.get(houseName); + log.data.killedBecauseWounded = woundedNames.map(name => unitTypeNameToIdMappings.get(name)); + log.data.killedBecauseCantRetreat = cannotRetreatNames.map(name => unitTypeNameToIdMappings.get(name)); + }); + } } } ]; From 8b861f3c45933c121512542019892855158e84e6 Mon Sep 17 00:00:00 2001 From: gereon77 Date: Thu, 16 Apr 2020 16:57:40 +0200 Subject: [PATCH 05/15] Fix "killed-after-combat" --- agot-bg-game-server/src/client/GameLogListComponent.tsx | 8 +++++--- .../post-combat-game-state/PostCombatGameState.ts | 4 ++-- .../src/server/serializedGameMigrations.ts | 9 +++++++++ 3 files changed, 16 insertions(+), 5 deletions(-) diff --git a/agot-bg-game-server/src/client/GameLogListComponent.tsx b/agot-bg-game-server/src/client/GameLogListComponent.tsx index d9e805e0c..fa0192b7a 100644 --- a/agot-bg-game-server/src/client/GameLogListComponent.tsx +++ b/agot-bg-game-server/src/client/GameLogListComponent.tsx @@ -902,11 +902,13 @@ export default class GameLogListComponent extends Component 0 && (<>{house.name} suffered battle casualties because this units can't retreat: <>{joinReactNodes(killedBecauseCantRetreat.map((unitType, i) => {unitType}), ', ')}.)} ; } - case "killed-after-combat": + case "killed-after-combat": { + const house = this.game.houses.get(data.house); + const killed = data.killed.map(utid => unitTypes.get(utid).name); return <> - {data.house} suffered battle casualties and chose this units to be killed: <>{joinReactNodes(data.killed.map((unitType, i) => {unitType}), ', ')}. + {house.name} suffered battle casualties and chose this units to be killed: <>{joinReactNodes(killed.map((unitType, i) => {unitType}), ', ')}. ; - + } case "supply-adjusted": const supplies: [House, number][] = data.supplies.map(([hid, supply]) => [this.game.houses.get(hid), supply]); diff --git a/agot-bg-game-server/src/common/ingame-game-state/action-game-state/resolve-march-order-game-state/combat-game-state/post-combat-game-state/PostCombatGameState.ts b/agot-bg-game-server/src/common/ingame-game-state/action-game-state/resolve-march-order-game-state/combat-game-state/post-combat-game-state/PostCombatGameState.ts index d17246638..9bf6a92d1 100644 --- a/agot-bg-game-server/src/common/ingame-game-state/action-game-state/resolve-march-order-game-state/combat-game-state/post-combat-game-state/PostCombatGameState.ts +++ b/agot-bg-game-server/src/common/ingame-game-state/action-game-state/resolve-march-order-game-state/combat-game-state/post-combat-game-state/PostCombatGameState.ts @@ -94,8 +94,8 @@ export default class PostCombatGameState extends GameState< this.combat.ingameGameState.log( { type: "killed-after-combat", - house: this.loser.name, - killed: selectedCasualties.map(u => u.type.name) + house: this.loser.id, + killed: selectedCasualties.map(u => u.type.id) } ); diff --git a/agot-bg-game-server/src/server/serializedGameMigrations.ts b/agot-bg-game-server/src/server/serializedGameMigrations.ts index d7a2e5cb4..ad397803c 100644 --- a/agot-bg-game-server/src/server/serializedGameMigrations.ts +++ b/agot-bg-game-server/src/server/serializedGameMigrations.ts @@ -136,6 +136,15 @@ const serializedGameMigrations: {version: string; migrate: (serializeGamed: any) log.data.killedBecauseWounded = woundedNames.map(name => unitTypeNameToIdMappings.get(name)); log.data.killedBecauseCantRetreat = cannotRetreatNames.map(name => unitTypeNameToIdMappings.get(name)); }); + + ingame.gameLogManager.logs + .filter((log: any) => log.data.type == "killed-after-combat") + .forEach((log: any) => { + const killedNames: string[] = log.data.killed; + const houseName = log.data.house; + log.data.house = houseNameToIdMappings.get(houseName); + log.data.killed = killedNames.map(name => unitTypeNameToIdMappings.get(name)); + }); } } } From 60d27c98a8a3d1ccc1b929118069a3970734a1de Mon Sep 17 00:00:00 2001 From: gereon77 Date: Thu, 16 Apr 2020 17:08:22 +0200 Subject: [PATCH 06/15] Fix "ships-destroyed-by-empty-castle" --- .../src/client/GameLogListComponent.tsx | 9 ++++++--- .../ResolveSingleMarchOrderGameState.ts | 6 +++--- .../ingame-game-state/port-helper/PortHelper.ts | 6 +++--- .../src/server/serializedGameMigrations.ts | 13 +++++++++++++ 4 files changed, 25 insertions(+), 9 deletions(-) diff --git a/agot-bg-game-server/src/client/GameLogListComponent.tsx b/agot-bg-game-server/src/client/GameLogListComponent.tsx index fa0192b7a..96f2160bd 100644 --- a/agot-bg-game-server/src/client/GameLogListComponent.tsx +++ b/agot-bg-game-server/src/client/GameLogListComponent.tsx @@ -674,11 +674,14 @@ export default class GameLogListComponent extends Component{data.newController} has destroyed all {data.oldController} ships in {data.port}.} ; - case "ships-destroyed-by-empty-castle": + case "ships-destroyed-by-empty-castle": { + const house = this.game.houses.get(data.house); + const port = this.game.world.regions.get(data.port); + const castle = this.game.world.regions.get(data.castle); return <> - <>{data.house} lost {data.shipCount} ship{data.shipCount>1?"s":""} in {data.port} because {data.castle} is empty now. + <>{house.name} lost {data.shipCount} ship{data.shipCount>1?"s":""} in {port.name} because {castle.name} is empty now. ; - + } case "silence-at-the-wall-executed": return <>Silence at the Wall: Nothing happened.; diff --git a/agot-bg-game-server/src/common/ingame-game-state/action-game-state/resolve-march-order-game-state/resolve-single-march-order-game-state/ResolveSingleMarchOrderGameState.ts b/agot-bg-game-server/src/common/ingame-game-state/action-game-state/resolve-march-order-game-state/resolve-single-march-order-game-state/ResolveSingleMarchOrderGameState.ts index afea5769c..5b86726ee 100644 --- a/agot-bg-game-server/src/common/ingame-game-state/action-game-state/resolve-march-order-game-state/resolve-single-march-order-game-state/ResolveSingleMarchOrderGameState.ts +++ b/agot-bg-game-server/src/common/ingame-game-state/action-game-state/resolve-march-order-game-state/resolve-single-march-order-game-state/ResolveSingleMarchOrderGameState.ts @@ -253,9 +253,9 @@ export default class ResolveSingleMarchOrderGameState extends GameState any}[] = [ { @@ -125,6 +126,7 @@ const serializedGameMigrations: {version: string; migrate: (serializeGamed: any) const unitTypeNameToIdMappings = new BetterMap(unitTypes.entries.map(([utid, ut]) => [ut.name, utid])); const houseNameToIdMappings = new BetterMap(ingame.game.houses.map((h: any) => [h.name, h.id])); + const regionNameToIdMappings = new BetterMap(staticWorld.staticRegions.entries.map(([rid, r]) => [r.name, rid])); ingame.gameLogManager.logs .filter((log: any) => log.data.type == "immediatly-killed-after-combat") @@ -145,6 +147,17 @@ const serializedGameMigrations: {version: string; migrate: (serializeGamed: any) log.data.house = houseNameToIdMappings.get(houseName); log.data.killed = killedNames.map(name => unitTypeNameToIdMappings.get(name)); }); + + ingame.gameLogManager.logs + .filter((log: any) => log.data.type == "ships-destroyed-by-empty-castle") + .forEach((log: any) => { + const houseName = log.data.house; + const portName = log.data.port; + const castleName = log.data.castle; + log.data.house = houseNameToIdMappings.get(houseName); + log.data.port = regionNameToIdMappings.get(portName); + log.data.castle = regionNameToIdMappings.get(castleName); + }); } } } From 7c4967cfbb0b6971aab9092e1580f6e0d6ab7e6f Mon Sep 17 00:00:00 2001 From: gereon77 Date: Fri, 17 Apr 2020 10:06:14 +0200 Subject: [PATCH 07/15] Fix "enemy-port-taken" --- .../src/client/GameLogListComponent.tsx | 11 +++++++---- .../TakeControlOfEnemyPortGameState.ts | 6 +++--- .../src/server/serializedGameMigrations.ts | 11 +++++++++++ 3 files changed, 21 insertions(+), 7 deletions(-) diff --git a/agot-bg-game-server/src/client/GameLogListComponent.tsx b/agot-bg-game-server/src/client/GameLogListComponent.tsx index 96f2160bd..f66526253 100644 --- a/agot-bg-game-server/src/client/GameLogListComponent.tsx +++ b/agot-bg-game-server/src/client/GameLogListComponent.tsx @@ -667,13 +667,16 @@ export default class GameLogListComponent extends Component{data.house} suffered casualties from the retreat: <>{joinReactNodes(data.units.map((unitType, i) => {unitType}), ', ')}.

; - case "enemy-port-taken": + case "enemy-port-taken": { + const newController = this.game.houses.get(data.newController); + const oldController = this.game.houses.get(data.oldController); + const port = this.world.regions.get(data.oldController); return <> {data.shipCount > 0 - ? <>{data.newController} has converted {data.shipCount} ship{data.shipCount == 1 ? "" : "s"} from {data.oldController} in {data.port}. - : <>{data.newController} has destroyed all {data.oldController} ships in {data.port}.} + ? <>{newController.name} has converted {data.shipCount} ship{data.shipCount == 1 ? "" : "s"} from {oldController.name} in {port.name}. + : <>{newController.name} has destroyed all {oldController.name} ships in {port.name}.} ; - + } case "ships-destroyed-by-empty-castle": { const house = this.game.houses.get(data.house); const port = this.game.world.regions.get(data.port); diff --git a/agot-bg-game-server/src/common/ingame-game-state/action-game-state/resolve-march-order-game-state/take-control-of-enemy-port-game-state/TakeControlOfEnemyPortGameState.ts b/agot-bg-game-server/src/common/ingame-game-state/action-game-state/resolve-march-order-game-state/take-control-of-enemy-port-game-state/TakeControlOfEnemyPortGameState.ts index 68c3554ad..9aaf10ba6 100644 --- a/agot-bg-game-server/src/common/ingame-game-state/action-game-state/resolve-march-order-game-state/take-control-of-enemy-port-game-state/TakeControlOfEnemyPortGameState.ts +++ b/agot-bg-game-server/src/common/ingame-game-state/action-game-state/resolve-march-order-game-state/take-control-of-enemy-port-game-state/TakeControlOfEnemyPortGameState.ts @@ -89,10 +89,10 @@ export default class TakeControlOfEnemyPortGameState extends GameState log.data.type == "enemy-port-taken") + .forEach((log: any) => { + const oldControllerName = log.data.oldController; + const newControllerName = log.data.newController; + const portName = log.data.port; + log.data.oldController = houseNameToIdMappings.get(oldControllerName); + log.data.newController = houseNameToIdMappings.get(newControllerName); + log.data.port = regionNameToIdMappings.get(portName); + }); } } } From 6eb79e926752e3ebda68e4fbaba048d665c459b3 Mon Sep 17 00:00:00 2001 From: gereon77 Date: Fri, 17 Apr 2020 10:13:30 +0200 Subject: [PATCH 08/15] Fix "retreat-region-chosen" --- .../src/client/GameLogListComponent.tsx | 11 +++++++---- .../ResolveRetreatGameState.ts | 10 +++++----- .../src/server/serializedGameMigrations.ts | 11 +++++++++++ 3 files changed, 23 insertions(+), 9 deletions(-) diff --git a/agot-bg-game-server/src/client/GameLogListComponent.tsx b/agot-bg-game-server/src/client/GameLogListComponent.tsx index f66526253..5cf19ad77 100644 --- a/agot-bg-game-server/src/client/GameLogListComponent.tsx +++ b/agot-bg-game-server/src/client/GameLogListComponent.tsx @@ -649,12 +649,15 @@ export default class GameLogListComponent extends Component{affectedHouse.name}. ; - case "retreat-region-chosen": + case "retreat-region-chosen": { + const house = this.game.houses.get(data.house); + const regionFrom = this.game.world.regions.get(data.regionFrom); + const regionTo = this.game.world.regions.get(data.regionTo); return <> - {data.house} retreats from - {data.regionFrom} to {data.regionTo}. + {house.name} retreats from + {regionFrom.name} to {regionTo.name}. ; - + } case "retreat-failed": return <>{ data.isAttacker ? diff --git a/agot-bg-game-server/src/common/ingame-game-state/action-game-state/resolve-march-order-game-state/combat-game-state/post-combat-game-state/resolve-retreat-game-state/ResolveRetreatGameState.ts b/agot-bg-game-server/src/common/ingame-game-state/action-game-state/resolve-march-order-game-state/combat-game-state/post-combat-game-state/resolve-retreat-game-state/ResolveRetreatGameState.ts index 14650a274..92755df55 100644 --- a/agot-bg-game-server/src/common/ingame-game-state/action-game-state/resolve-march-order-game-state/combat-game-state/post-combat-game-state/resolve-retreat-game-state/ResolveRetreatGameState.ts +++ b/agot-bg-game-server/src/common/ingame-game-state/action-game-state/resolve-march-order-game-state/combat-game-state/post-combat-game-state/resolve-retreat-game-state/ResolveRetreatGameState.ts @@ -126,9 +126,9 @@ export default class ResolveRetreatGameState extends GameState< this.ingame.log({ type: "retreat-region-chosen", - house: this.postCombat.loser.name, - regionFrom: this.combat.defendingRegion.name, - regionTo: retreatRegion.name + house: this.postCombat.loser.id, + regionFrom: this.combat.defendingRegion.id, + regionTo: retreatRegion.id }); // Check if this retreat region require casualties @@ -281,11 +281,11 @@ export default class ResolveRetreatGameState extends GameState< // If retreatRegion is attackingRegion the attacker lost the battle // and retreats back from where he came from. In that case we don't need // to calculate casualties as retreating back to attackingRegion will always be - // supply compliant at that point (if it is blocked for retreat + // supply compliant at that point (if it is blocked for retreat // has been checked earlier). // Furthermore we have to do this extra processing for the time being // because the attacking units are still present in attackingRegion - // and therefore hasTooMuchArmies with addedUnits overload will double + // and therefore hasTooMuchArmies with addedUnits overload will double // the army size for the attackingRegion which could result // in an invalid supply violation. if (retreatRegion == this.postCombat.combat.attackingRegion) { diff --git a/agot-bg-game-server/src/server/serializedGameMigrations.ts b/agot-bg-game-server/src/server/serializedGameMigrations.ts index 3ada9a6b7..d2e4f1e05 100644 --- a/agot-bg-game-server/src/server/serializedGameMigrations.ts +++ b/agot-bg-game-server/src/server/serializedGameMigrations.ts @@ -169,6 +169,17 @@ const serializedGameMigrations: {version: string; migrate: (serializeGamed: any) log.data.newController = houseNameToIdMappings.get(newControllerName); log.data.port = regionNameToIdMappings.get(portName); }); + + ingame.gameLogManager.logs + .filter((log: any) => log.data.type == "retreat-region-chosen") + .forEach((log: any) => { + const houseName = log.data.house; + const regionFromName = log.data.regionFrom; + const regionToName = log.data.regionTo; + log.data.house = houseNameToIdMappings.get(houseName); + log.data.regionFrom = regionNameToIdMappings.get(regionFromName); + log.data.regionTo = regionNameToIdMappings.get(regionToName); + }); } } } From 084b1c1eaae1cb7d100dd6fd0f4a133115834542 Mon Sep 17 00:00:00 2001 From: gereon77 Date: Fri, 17 Apr 2020 10:46:29 +0200 Subject: [PATCH 09/15] Fix "retreat-casualties-suffered" --- agot-bg-game-server/src/client/GameLogListComponent.tsx | 8 +++++--- .../ResolveRetreatGameState.ts | 8 ++++---- .../src/server/serializedGameMigrations.ts | 9 +++++++++ 3 files changed, 18 insertions(+), 7 deletions(-) diff --git a/agot-bg-game-server/src/client/GameLogListComponent.tsx b/agot-bg-game-server/src/client/GameLogListComponent.tsx index 5cf19ad77..a939d8021 100644 --- a/agot-bg-game-server/src/client/GameLogListComponent.tsx +++ b/agot-bg-game-server/src/client/GameLogListComponent.tsx @@ -665,11 +665,13 @@ export default class GameLogListComponent extends Component{data.house} was not able to retreat from {data.region}. }; - case "retreat-casualties-suffered": + case "retreat-casualties-suffered": { + const house = this.game.houses.get(data.house); + const units = data.units.map(ut => unitTypes.get(ut).name); return <> -

{data.house} suffered casualties from the retreat: <>{joinReactNodes(data.units.map((unitType, i) => {unitType}), ', ')}.

+

{house.name} suffered casualties from the retreat: <>{joinReactNodes(units.map((unitType, i) => {unitType}), ', ')}.

; - + } case "enemy-port-taken": { const newController = this.game.houses.get(data.newController); const oldController = this.game.houses.get(data.oldController); diff --git a/agot-bg-game-server/src/common/ingame-game-state/action-game-state/resolve-march-order-game-state/combat-game-state/post-combat-game-state/resolve-retreat-game-state/ResolveRetreatGameState.ts b/agot-bg-game-server/src/common/ingame-game-state/action-game-state/resolve-march-order-game-state/combat-game-state/post-combat-game-state/resolve-retreat-game-state/ResolveRetreatGameState.ts index 92755df55..4a5f2ae02 100644 --- a/agot-bg-game-server/src/common/ingame-game-state/action-game-state/resolve-march-order-game-state/combat-game-state/post-combat-game-state/resolve-retreat-game-state/ResolveRetreatGameState.ts +++ b/agot-bg-game-server/src/common/ingame-game-state/action-game-state/resolve-march-order-game-state/combat-game-state/post-combat-game-state/resolve-retreat-game-state/ResolveRetreatGameState.ts @@ -114,8 +114,8 @@ export default class ResolveRetreatGameState extends GameState< this.ingame.log({ type: "retreat-casualties-suffered", - house: affectedHouse.name, - units: unitsToKill.map(u => u.type.name) + house: affectedHouse.id, + units: unitsToKill.map(u => u.type.id) }); } @@ -170,8 +170,8 @@ export default class ResolveRetreatGameState extends GameState< this.ingame.log({ type: "retreat-casualties-suffered", - house: this.postCombat.loser.name, - units: units.map(u => u.type.name) + house: this.postCombat.loser.id, + units: units.map(u => u.type.id) }); }); diff --git a/agot-bg-game-server/src/server/serializedGameMigrations.ts b/agot-bg-game-server/src/server/serializedGameMigrations.ts index d2e4f1e05..501ce81b7 100644 --- a/agot-bg-game-server/src/server/serializedGameMigrations.ts +++ b/agot-bg-game-server/src/server/serializedGameMigrations.ts @@ -180,6 +180,15 @@ const serializedGameMigrations: {version: string; migrate: (serializeGamed: any) log.data.regionFrom = regionNameToIdMappings.get(regionFromName); log.data.regionTo = regionNameToIdMappings.get(regionToName); }); + + ingame.gameLogManager.logs + .filter((log: any) => log.data.type == "retreat-casualties-suffered") + .forEach((log: any) => { + const houseName = log.data.house; + const unitNames: string[] = log.data.units; + log.data.house = houseNameToIdMappings.get(houseName); + log.data.units = unitNames.map(name => unitTypeNameToIdMappings.get(name)); + }); } } } From 123341c4286e98889f5be536d13ff85a28f4443c Mon Sep 17 00:00:00 2001 From: gereon77 Date: Fri, 17 Apr 2020 10:51:51 +0200 Subject: [PATCH 10/15] Fix "retreat-failed" --- .../src/client/GameLogListComponent.tsx | 11 +++++++---- .../ResolveRetreatGameState.ts | 4 ++-- .../src/server/serializedGameMigrations.ts | 9 +++++++++ 3 files changed, 18 insertions(+), 6 deletions(-) diff --git a/agot-bg-game-server/src/client/GameLogListComponent.tsx b/agot-bg-game-server/src/client/GameLogListComponent.tsx index a939d8021..9d4af9fac 100644 --- a/agot-bg-game-server/src/client/GameLogListComponent.tsx +++ b/agot-bg-game-server/src/client/GameLogListComponent.tsx @@ -658,13 +658,16 @@ export default class GameLogListComponent extends Component to {regionTo.name}. ; } - case "retreat-failed": + case "retreat-failed": { + const house = this.game.houses.get(data.house); + const region = this.world.regions.get(data.region); + return <>{ data.isAttacker ? - <>{data.house} was not able to retreat to {data.region}. : - <>{data.house} was not able to retreat from {data.region}. + <>{house.name} was not able to retreat to {region.name}. : + <>{house.name} was not able to retreat from {region.name}. }; - + } case "retreat-casualties-suffered": { const house = this.game.houses.get(data.house); const units = data.units.map(ut => unitTypes.get(ut).name); diff --git a/agot-bg-game-server/src/common/ingame-game-state/action-game-state/resolve-march-order-game-state/combat-game-state/post-combat-game-state/resolve-retreat-game-state/ResolveRetreatGameState.ts b/agot-bg-game-server/src/common/ingame-game-state/action-game-state/resolve-march-order-game-state/combat-game-state/post-combat-game-state/resolve-retreat-game-state/ResolveRetreatGameState.ts index 4a5f2ae02..c79b506b2 100644 --- a/agot-bg-game-server/src/common/ingame-game-state/action-game-state/resolve-march-order-game-state/combat-game-state/post-combat-game-state/resolve-retreat-game-state/ResolveRetreatGameState.ts +++ b/agot-bg-game-server/src/common/ingame-game-state/action-game-state/resolve-march-order-game-state/combat-game-state/post-combat-game-state/resolve-retreat-game-state/ResolveRetreatGameState.ts @@ -107,9 +107,9 @@ export default class ResolveRetreatGameState extends GameState< this.ingame.log({ type: "retreat-failed", - house: affectedHouse.name, + house: affectedHouse.id, isAttacker: affectedHouse == this.combat.attacker, - region: region.name + region: region.id }); this.ingame.log({ diff --git a/agot-bg-game-server/src/server/serializedGameMigrations.ts b/agot-bg-game-server/src/server/serializedGameMigrations.ts index 501ce81b7..31aec1ed0 100644 --- a/agot-bg-game-server/src/server/serializedGameMigrations.ts +++ b/agot-bg-game-server/src/server/serializedGameMigrations.ts @@ -189,6 +189,15 @@ const serializedGameMigrations: {version: string; migrate: (serializeGamed: any) log.data.house = houseNameToIdMappings.get(houseName); log.data.units = unitNames.map(name => unitTypeNameToIdMappings.get(name)); }); + + ingame.gameLogManager.logs + .filter((log: any) => log.data.type == "retreat-failed") + .forEach((log: any) => { + const houseName = log.data.house; + const regionName = log.data.region; + log.data.house = houseNameToIdMappings.get(houseName); + log.data.region = regionNameToIdMappings.get(regionName); + }); } } } From 9d82e1140a3e2f7a4225f1c97f0f706291c8c192 Mon Sep 17 00:00:00 2001 From: Longwelwind Date: Sat, 18 Apr 2020 08:50:44 +0200 Subject: [PATCH 11/15] fix MAX_POWER_TOKENS not being present in createGame --- .../common/ingame-game-state/game-data-structure/createGame.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/agot-bg-game-server/src/common/ingame-game-state/game-data-structure/createGame.ts b/agot-bg-game-server/src/common/ingame-game-state/game-data-structure/createGame.ts index e55ac6671..43cb82e99 100644 --- a/agot-bg-game-server/src/common/ingame-game-state/game-data-structure/createGame.ts +++ b/agot-bg-game-server/src/common/ingame-game-state/game-data-structure/createGame.ts @@ -15,6 +15,8 @@ import houseCardAbilities from "./house-card/houseCardAbilities"; import EntireGame from "../../EntireGame"; import staticWorld from "./static-data-structure/globalStaticWorld"; +const MAX_POWER_TOKENS = 20; + interface HouseCardData { name: string; combatStrength?: number; From 4bbed9165917b39ef811188011561965c389477d Mon Sep 17 00:00:00 2001 From: Longwelwind Date: Sat, 18 Apr 2020 10:09:59 +0200 Subject: [PATCH 12/15] Disallow settings from being changed by non-owner --- agot-bg-game-server/src/client/GameSettingsComponent.tsx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/agot-bg-game-server/src/client/GameSettingsComponent.tsx b/agot-bg-game-server/src/client/GameSettingsComponent.tsx index 176a8bb33..5761c9e00 100644 --- a/agot-bg-game-server/src/client/GameSettingsComponent.tsx +++ b/agot-bg-game-server/src/client/GameSettingsComponent.tsx @@ -38,6 +38,7 @@ export default class GameSettingsComponent extends Component @@ -47,6 +48,7 @@ export default class GameSettingsComponent extends Component From 5ada26cd9efd362aa9c4c494d6a43c5bc8c03fe4 Mon Sep 17 00:00:00 2001 From: norielbit Date: Sat, 18 Apr 2020 14:39:49 +0300 Subject: [PATCH 13/15] Improve Game Log consistency with the game rules writing style and some grammar fixes Changelist: * Wildling/Wildlings, Order, Phase and unit names are always capitalized * Using they/their instead of he/it when referring to House/Player * Wilding strength => Wildling Threat * Raven token => Messenger Raven token * Valyrian Sword => Valyrian Steel Blade * Starred => Special * this units => these units * `enemy-port-taken`: Port name correctly bolded --- .../src/client/GameLogListComponent.tsx | 69 ++++++++++--------- .../order-types/orderTypes.ts | 4 +- 2 files changed, 37 insertions(+), 36 deletions(-) diff --git a/agot-bg-game-server/src/client/GameLogListComponent.tsx b/agot-bg-game-server/src/client/GameLogListComponent.tsx index 9d4af9fac..f5a7367d1 100644 --- a/agot-bg-game-server/src/client/GameLogListComponent.tsx +++ b/agot-bg-game-server/src/client/GameLogListComponent.tsx @@ -136,7 +136,7 @@ export default class GameLogListComponent extends Component {data.addedWildlingStrength > 0 && ( -

Wildling strength increased by {data.addedWildlingStrength}

+

Wildling Threat increased by {data.addedWildlingStrength}

)} ); @@ -179,7 +179,7 @@ export default class GameLogListComponent extends Component - Wildling bidding results for wildling strength {data.wildlingStrength}: + Wildling bidding results for Wildling Threat {data.wildlingStrength}: {results.map(([bid, houses]) => houses.map(h => ( @@ -247,7 +247,7 @@ export default class GameLogListComponent extends ComponentGame ended + <>Game ended. ); case "raven-holder-wildling-card-put-bottom": @@ -255,8 +255,8 @@ export default class GameLogListComponent extends Component - {house.name}, holder of the Raven token, chose to see the card at the top - of the wildling card deck and to move it at the bottom of the deck. + {house.name}, holder of the Messenger Raven token, chose to see the card at the top + of the Wildling card deck and to move it at the bottom of the deck.

); @@ -265,8 +265,8 @@ export default class GameLogListComponent extends Component - {house.name}, holder of the Raven token, chose to see the card at the top - of the wildling card deck and to leave it at the top of the deck. + {house.name}, holder of the Messenger Raven token, chose to see the card at the top + of the Wildling card deck and to leave it at the top of the deck.

); @@ -278,7 +278,7 @@ export default class GameLogListComponent extends Component - {house.name}, holder of the Raven token, chose to replace + {house.name}, holder of the Messenger Raven token, chose to replace a {originalOrder.type.name} Order with a {newOrder.type.name} Order in {orderRegion.name}.

@@ -296,7 +296,7 @@ export default class GameLogListComponent extends Component

- {raider.name} raided {raidee.name}'s {orderRaided.type.name} + {raider.name} raided {raidee.name}'s {orderRaided.type.name} Order in {raidedRegion.name} from {raiderRegion.name}.

{data.raiderGainedPowerToken && @@ -336,7 +336,7 @@ export default class GameLogListComponent extends Component - {house.name}, holder of the Raven token, chose to + {house.name}, holder of the Messenger Raven token, chose to {data.choice == 0 ? ( <> trigger a Clash of Kings. ) : data.choice == 1 ? ( @@ -354,11 +354,11 @@ export default class GameLogListComponent extends Component {house.name}, holder of the Valyrian Steel Blade token, chose to {data.choice == 0 ? ( - <> forbid March +1 orders from being played during this Planning phase. + <> forbid March +1 Orders from being played during this Planning Phase. ) : data.choice == 1 ? ( - <> forbid Defense orders from being played during this Planning phase. + <> forbid Defense Orders from being played during this Planning Phase. ) : ( - <> trigger nothing. + <> forbid nothing. )}

); @@ -367,7 +367,7 @@ export default class GameLogListComponent extends Component - Winter is coming: The Westeros deck {data.deckIndex + 1} was shuffled and the new Westeros card drawn + Winter is Coming: The Westeros deck {data.deckIndex + 1} was shuffled and the new Westeros card drawn is {drawnCardType.name}. ; @@ -395,7 +395,7 @@ export default class GameLogListComponent extends Component{house.name} used the Valyrian Sword.; + return <>{house.name} used the Valyrian Steel Blade.; case "combat-house-card-chosen": const houseCards = data.houseCards.map(([hid, hcid]) => { @@ -438,15 +438,16 @@ export default class GameLogListComponent extends Component - Wildling strength reached {data.wildlingStrength}, triggering a Wildlings attack + Wildling Threat reached {data.wildlingStrength}, triggering a Wildling Attack ; + case "march-order-removed": house = this.game.houses.get(data.house); let region = this.game.world.regions.get(data.region); return <>

- {house.name} removed his march order in {region.name}. + {house.name} removed their March Order in {region.name}.

; @@ -456,7 +457,7 @@ export default class GameLogListComponent extends Component - {house.name} resolved a {data.starred && "Starred "}Consolidate Power Order + {house.name} resolved a {data.starred && "Special "}Consolidate Power Order in {region.name} to gain {countPowerToken} Power token{countPowerToken > 1 && "s"}. ; @@ -544,7 +545,7 @@ export default class GameLogListComponent extends Component - Loras Tyrell: The {order.type.name} order was moved + Loras Tyrell: The {order.type.name} Order was moved to {embattledRegion.name}. ; @@ -553,7 +554,7 @@ export default class GameLogListComponent extends Component - Queen of Thorns: {affectedHouse.name} had no adjacent order tokens. + Queen of Thorns: {affectedHouse.name} had no adjacent Order tokens. ; case "queen-of-thorns-order-removed": @@ -564,7 +565,7 @@ export default class GameLogListComponent extends Component Queen of Thorns: {house.name} removed - a {removedOrder.type.name} of {affectedHouse.name} in {region.name}. + a {removedOrder.type.name} Order of {affectedHouse.name} in {region.name}. ; case "tywin-lannister-power-tokens-gained": @@ -580,7 +581,7 @@ export default class GameLogListComponent extends Component - Renly Baratheon: {house.name} had no available knight to upgrade + Renly Baratheon: {house.name} had no available Knight to upgrade to. ; @@ -588,7 +589,7 @@ export default class GameLogListComponent extends Component - Renly Baratheon: {house.name} had no available footman to upgrade. + Renly Baratheon: {house.name} had no available Footman to upgrade. ; case "renly-baratheon-footman-upgraded-to-knight": @@ -596,7 +597,7 @@ export default class GameLogListComponent extends Component - Renly Baratheon: {house.name} upgraded a footman to a knight in + Renly Baratheon: {house.name} upgraded a Footman to a Knight in {region.name}. ; @@ -611,7 +612,7 @@ export default class GameLogListComponent extends Component - Mace Tyrell: No enemy footman were available to be killed. + Mace Tyrell: No enemy Footman was available to be killed. ; case "mace-tyrell-footman-killed": @@ -619,13 +620,13 @@ export default class GameLogListComponent extends Component - Mace Tyrell: {house.name} killed an enemy footman + Mace Tyrell: {house.name} killed an enemy Footman in {region.name}. ; case "cersei-lannister-no-order-available": return <> - Cersei Lannister: There were no order to be removed. + Cersei Lannister: There were no Order tokens to be removed. ; case "cersei-lannister-order-removed": @@ -636,7 +637,7 @@ export default class GameLogListComponent extends Component Cersei Lannister: {house.name} removed - a {removedOrder.type.name} order + a {removedOrder.type.name} Order of {affectedHouse.name} in {region.name}. ; @@ -681,8 +682,8 @@ export default class GameLogListComponent extends Component {data.shipCount > 0 - ? <>{newController.name} has converted {data.shipCount} ship{data.shipCount == 1 ? "" : "s"} from {oldController.name} in {port.name}. - : <>{newController.name} has destroyed all {oldController.name} ships in {port.name}.} + ? <>{newController.name} has converted {data.shipCount} Ship{data.shipCount == 1 ? "" : "s"} from {oldController.name} in {port.name}. + : <>{newController.name} has destroyed all {oldController.name} Ships in {port.name}.} ; } case "ships-destroyed-by-empty-castle": { @@ -690,7 +691,7 @@ export default class GameLogListComponent extends Component - <>{house.name} lost {data.shipCount} ship{data.shipCount>1?"s":""} in {port.name} because {castle.name} is empty now. + <>{house.name} lost {data.shipCount} Ship{data.shipCount>1?"s":""} in {port.name} because {castle.name} is empty now. ; } case "silence-at-the-wall-executed": @@ -912,15 +913,15 @@ export default class GameLogListComponent extends Component unitTypes.get(utid).name); const killedBecauseCantRetreat = data.killedBecauseCantRetreat.map(utid => unitTypes.get(utid).name); return <> - {killedBecauseWounded.length > 0 && (<>{house.name} suffered battle casualties because this units were wounded: <>{joinReactNodes(killedBecauseWounded.map((unitType, i) => {unitType}), ', ')}.)} - {killedBecauseCantRetreat.length > 0 && (<>{house.name} suffered battle casualties because this units can't retreat: <>{joinReactNodes(killedBecauseCantRetreat.map((unitType, i) => {unitType}), ', ')}.)} + {killedBecauseWounded.length > 0 && (<>{house.name} suffered battle casualties because these units were wounded: <>{joinReactNodes(killedBecauseWounded.map((unitType, i) => {unitType}), ', ')}.)} + {killedBecauseCantRetreat.length > 0 && (<>{house.name} suffered battle casualties because these units can't retreat: <>{joinReactNodes(killedBecauseCantRetreat.map((unitType, i) => {unitType}), ', ')}.)} ; } case "killed-after-combat": { const house = this.game.houses.get(data.house); const killed = data.killed.map(utid => unitTypes.get(utid).name); return <> - {house.name} suffered battle casualties and chose this units to be killed: <>{joinReactNodes(killed.map((unitType, i) => {unitType}), ', ')}. + {house.name} suffered battle casualties and chose these units to be killed: <>{joinReactNodes(killed.map((unitType, i) => {unitType}), ', ')}. ; } case "supply-adjusted": diff --git a/agot-bg-game-server/src/common/ingame-game-state/game-data-structure/order-types/orderTypes.ts b/agot-bg-game-server/src/common/ingame-game-state/game-data-structure/order-types/orderTypes.ts index fd91c98db..4a0f15c2b 100644 --- a/agot-bg-game-server/src/common/ingame-game-state/game-data-structure/order-types/orderTypes.ts +++ b/agot-bg-game-server/src/common/ingame-game-state/game-data-structure/order-types/orderTypes.ts @@ -17,10 +17,10 @@ export const support = new SupportOrderType("support", "Support", false); export const supportPlusOne = new SupportOrderType("support-plus-one", "Support +1", true, 1); export const consolidatePower = new ConsolidatePowerOrderType("consolidate-power", "Consolidate Power", false); -export const specialConsolidatePower = new ConsolidatePowerOrderType("special-consolidate-power", "Starred Consolidate Power", true); +export const specialConsolidatePower = new ConsolidatePowerOrderType("special-consolidate-power", "Special Consolidate Power", true); export const raid = new RaidOrderType("raid", "Raid", false); -export const specialRaid = new RaidOrderType("special-raid", "Starred Raid", true); +export const specialRaid = new RaidOrderType("special-raid", "Special Raid", true); const orderTypes = new BetterMap([ [marchMinusOne.id, marchMinusOne], From b2de42ae4bb5685431bf52f44222ae7fc921415b Mon Sep 17 00:00:00 2001 From: gereon77 Date: Wed, 22 Apr 2020 09:40:50 +0200 Subject: [PATCH 14/15] Automatically set ready for players who don't have units left --- .../planning-game-state/PlanningGameState.ts | 59 +++++++++++-------- 1 file changed, 35 insertions(+), 24 deletions(-) diff --git a/agot-bg-game-server/src/common/ingame-game-state/planning-game-state/PlanningGameState.ts b/agot-bg-game-server/src/common/ingame-game-state/planning-game-state/PlanningGameState.ts index 0ca6fe704..928f09169 100644 --- a/agot-bg-game-server/src/common/ingame-game-state/planning-game-state/PlanningGameState.ts +++ b/agot-bg-game-server/src/common/ingame-game-state/planning-game-state/PlanningGameState.ts @@ -51,10 +51,13 @@ export default class PlanningGameState extends GameState { }); this.planningRestrictions = planningRestrictions; - } - isOrderAvailable(house: House, order: Order): boolean { - return this.getAvailableOrders(house).includes(order); + // Automatically set ready for houses which don't have units left + this.game.houses.forEach(h => { + if (this.getPossibleRegionsForOrders(h).length == 0) { + this.setReady(this.ingameGameState.getControllerOfHouse(h)); + } + }); } onPlayerMessage(player: Player, message: ClientMessage): void { @@ -99,30 +102,30 @@ export default class PlanningGameState extends GameState { }) } } else if (message.type == "ready") { - if (this.readyPlayers.includes(player)) { - return; - } - - if (!this.canReady(player.house).status) { - return; - } + this.setReady(player); + } + } - this.readyPlayers.push(player); + private setReady(player: Player): void { + if (this.readyPlayers.includes(player)) { + return; + } - // Check if all player are ready to go the action entireGame state - if (this.readyPlayers.length == this.ingameGameState.players.values.length) { - this.ingameGameState.proceedToActionGameState(this.placedOrders as BetterMap, this.planningRestrictions); - } else { - this.entireGame.broadcastToClients({ - type: "player-ready", - userId: player.user.id - }); - } + if (!this.canReady(player.house).status) { + return; } - } - getPossibleRegionsForOrders(house: House): Region[] { - return this.game.world.getControlledRegions(house).filter(r => r.units.size > 0); + this.readyPlayers.push(player); + + // Check if all player are ready to go the action entireGame state + if (this.readyPlayers.length == this.ingameGameState.players.values.length) { + this.ingameGameState.proceedToActionGameState(this.placedOrders as BetterMap, this.planningRestrictions); + } else { + this.entireGame.broadcastToClients({ + type: "player-ready", + userId: player.user.id + }); + } } serializeToClient(admin: boolean, player: Player | null): SerializedPlanningGameState { @@ -147,7 +150,15 @@ export default class PlanningGameState extends GameState { * Common */ - canReady(house: House): {status: boolean; reason: string} { + getPossibleRegionsForOrders(house: House): Region[] { + return this.game.world.getControlledRegions(house).filter(r => r.units.size > 0); + } + + isOrderAvailable(house: House, order: Order): boolean { + return this.getAvailableOrders(house).includes(order); + } + + canReady(house: House): {status: boolean; reason: string} { const possibleRegions = this.getPossibleRegionsForOrders(house); if (possibleRegions.every(r => this.placedOrders.has(r))) From 3cdb13cf63d0731ea8afc597888a4cd544f98864 Mon Sep 17 00:00:00 2001 From: gereon77 Date: Wed, 22 Apr 2020 09:59:33 +0200 Subject: [PATCH 15/15] Remove all occurrences of getPhaseName --- agot-bg-game-server/src/common/GameState.ts | 8 -------- .../ChooseHouseCardGameState.ts | 4 ---- .../declare-support-game-state/DeclareSupportGameState.ts | 4 ---- .../ChooseCasualtiesGameState.ts | 4 ---- .../UseValyrianSteelBladeGameState.ts | 4 ---- .../ResolveSingleMarchOrderGameState.ts | 4 ---- .../ChooseRavenActionGameState.ts | 4 ---- .../replace-order-game-state/ReplaceOrderGameState.ts | 4 ---- .../SeeTopWildlingCardGameState.ts | 4 ---- .../planning-game-state/PlanningGameState.ts | 4 ---- .../simple-choice-game-state/SimpleChoiceGameState.ts | 4 ---- .../bidding-game-state/BiddingGameState.ts | 4 ---- .../src/common/lobby-game-state/LobbyGameState.ts | 4 ---- 13 files changed, 56 deletions(-) diff --git a/agot-bg-game-server/src/common/GameState.ts b/agot-bg-game-server/src/common/GameState.ts index d755b1ac4..9a1b9df7b 100644 --- a/agot-bg-game-server/src/common/GameState.ts +++ b/agot-bg-game-server/src/common/GameState.ts @@ -49,14 +49,6 @@ export default class GameState }); } - getPhaseName(): string { - return "Choose a general"; - } - serializeToClient(admin: boolean, player: Player | null): SerializedChooseHouseCardGameState { return { type: "choose-house-card", diff --git a/agot-bg-game-server/src/common/ingame-game-state/action-game-state/resolve-march-order-game-state/combat-game-state/declare-support-game-state/DeclareSupportGameState.ts b/agot-bg-game-server/src/common/ingame-game-state/action-game-state/resolve-march-order-game-state/combat-game-state/declare-support-game-state/DeclareSupportGameState.ts index 1392cdda5..5d3bee994 100644 --- a/agot-bg-game-server/src/common/ingame-game-state/action-game-state/resolve-march-order-game-state/combat-game-state/declare-support-game-state/DeclareSupportGameState.ts +++ b/agot-bg-game-server/src/common/ingame-game-state/action-game-state/resolve-march-order-game-state/combat-game-state/declare-support-game-state/DeclareSupportGameState.ts @@ -32,10 +32,6 @@ export default class DeclareSupportGameState extends GameState this.house = house; } - getPhaseName(): string { - return "Declare support"; - } - onPlayerMessage(player: Player, message: ClientMessage): void { if (message.type == "declare-support") { if (player.house != this.house) { diff --git a/agot-bg-game-server/src/common/ingame-game-state/action-game-state/resolve-march-order-game-state/combat-game-state/post-combat-game-state/choose-casualties-game-state/ChooseCasualtiesGameState.ts b/agot-bg-game-server/src/common/ingame-game-state/action-game-state/resolve-march-order-game-state/combat-game-state/post-combat-game-state/choose-casualties-game-state/ChooseCasualtiesGameState.ts index 52dd12107..737ed9423 100644 --- a/agot-bg-game-server/src/common/ingame-game-state/action-game-state/resolve-march-order-game-state/combat-game-state/post-combat-game-state/choose-casualties-game-state/ChooseCasualtiesGameState.ts +++ b/agot-bg-game-server/src/common/ingame-game-state/action-game-state/resolve-march-order-game-state/combat-game-state/post-combat-game-state/choose-casualties-game-state/ChooseCasualtiesGameState.ts @@ -74,10 +74,6 @@ export default class ChooseCasualtiesGameState extends GameState): {success: boolean; reason: string} { if (startingRegion.superControlPowerToken == this.house) { return {success: false, reason: "already-capital"}; diff --git a/agot-bg-game-server/src/common/ingame-game-state/action-game-state/use-raven-game-state/choose-raven-action-game-state/ChooseRavenActionGameState.ts b/agot-bg-game-server/src/common/ingame-game-state/action-game-state/use-raven-game-state/choose-raven-action-game-state/ChooseRavenActionGameState.ts index ece4dff8b..38108342e 100644 --- a/agot-bg-game-server/src/common/ingame-game-state/action-game-state/use-raven-game-state/choose-raven-action-game-state/ChooseRavenActionGameState.ts +++ b/agot-bg-game-server/src/common/ingame-game-state/action-game-state/use-raven-game-state/choose-raven-action-game-state/ChooseRavenActionGameState.ts @@ -50,10 +50,6 @@ export default class ChooseRavenActionGameState extends GameState } } - getPhaseName(): string { - return "Replace order"; - } - serializeToClient(_admin: boolean, _player: Player | null): SerializedReplaceOrderGameState { return { type: "replace-order" diff --git a/agot-bg-game-server/src/common/ingame-game-state/action-game-state/use-raven-game-state/see-top-wildling-card-game-state/SeeTopWildlingCardGameState.ts b/agot-bg-game-server/src/common/ingame-game-state/action-game-state/use-raven-game-state/see-top-wildling-card-game-state/SeeTopWildlingCardGameState.ts index b4793bfba..ba368b47c 100644 --- a/agot-bg-game-server/src/common/ingame-game-state/action-game-state/use-raven-game-state/see-top-wildling-card-game-state/SeeTopWildlingCardGameState.ts +++ b/agot-bg-game-server/src/common/ingame-game-state/action-game-state/use-raven-game-state/see-top-wildling-card-game-state/SeeTopWildlingCardGameState.ts @@ -74,10 +74,6 @@ export default class SeeTopWildlingCardGameState extends GameState { } } - getPhaseName(): string { - return "Planning"; - } - /** * Queries */ diff --git a/agot-bg-game-server/src/common/ingame-game-state/simple-choice-game-state/SimpleChoiceGameState.ts b/agot-bg-game-server/src/common/ingame-game-state/simple-choice-game-state/SimpleChoiceGameState.ts index 8e94fc392..69ab5ae3b 100644 --- a/agot-bg-game-server/src/common/ingame-game-state/simple-choice-game-state/SimpleChoiceGameState.ts +++ b/agot-bg-game-server/src/common/ingame-game-state/simple-choice-game-state/SimpleChoiceGameState.ts @@ -63,10 +63,6 @@ export default class SimpleChoiceGameState extends GameState { return [this.parentGameState.ingame.getControllerOfHouse(this.house).user]; } - getPhaseName(): string { - return "Choice"; - } - onServerMessage(_message: ServerMessage): void { } diff --git a/agot-bg-game-server/src/common/ingame-game-state/westeros-game-state/bidding-game-state/BiddingGameState.ts b/agot-bg-game-server/src/common/ingame-game-state/westeros-game-state/bidding-game-state/BiddingGameState.ts index e7c05dba3..8e240ad2d 100644 --- a/agot-bg-game-server/src/common/ingame-game-state/westeros-game-state/bidding-game-state/BiddingGameState.ts +++ b/agot-bg-game-server/src/common/ingame-game-state/westeros-game-state/bidding-game-state/BiddingGameState.ts @@ -100,10 +100,6 @@ export default class BiddingGameState { return []; } - getPhaseName(): string { - return "Lobby"; - } - serializeToClient(_user: User | null): SerializedLobbyGameState { return { type: "lobby",