-
+
+
+
@@ -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 ComponentQueen 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 ComponentCersei 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",