Skip to content

Commit

Permalink
Merge pull request #540 from Longwelwind/v1.5-branch
Browse files Browse the repository at this point in the history
V1.5 branch
  • Loading branch information
Longwelwind committed Apr 24, 2020
2 parents d887713 + a9f358d commit 1a606fc
Show file tree
Hide file tree
Showing 26 changed files with 268 additions and 173 deletions.
124 changes: 72 additions & 52 deletions agot-bg-game-server/src/client/GameLogListComponent.tsx

Large diffs are not rendered by default.

2 changes: 2 additions & 0 deletions agot-bg-game-server/src/client/GameSettingsComponent.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ export default class GameSettingsComponent extends Component<GameSettingsCompone
<Col xs="auto">
<select id="setups" name="setups"
value={this.gameSettings.setupId}
disabled={!this.canChangeGameSettings}
onChange={e => this.onSetupChange(e.target.value)}>
{this.createSetupItems()}
</select>
Expand All @@ -47,6 +48,7 @@ export default class GameSettingsComponent extends Component<GameSettingsCompone
<Col xs="auto">
<select id="player-count" name="playerCount"
value={this.gameSettings.playerCount}
disabled={!this.canChangeGameSettings}
onChange={e => this.onPlayerCountChange(e.target.value)}>
{this.createPlayerCountItems()}
</select>
Expand Down
35 changes: 27 additions & 8 deletions agot-bg-game-server/src/client/IngameComponent.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -289,13 +289,19 @@ export default class IngameComponent extends Component<IngameComponentProps> {
</Col>
<Col xs="auto" className="d-flex align-items-center">
<div style={{fontSize: "18px"}}>{p.house.powerTokens}</div>
<div
className="house-power-token hover-weak-outline"
style={{
backgroundImage: `url(${housePowerTokensImages.get(p.house.id)})`,
marginLeft: "10px"
}}
/>
<OverlayTrigger
overlay={this.renderPowerTooltip(p.house)}
delay={{show: 750, hide: 100}}
placement="auto"
>
<div
className="house-power-token hover-weak-outline"
style={{
backgroundImage: `url(${housePowerTokensImages.get(p.house.id)})`,
marginLeft: "10px"
}}
/>
</OverlayTrigger>
</Col>
</Row>
<Row className="justify-content-center">
Expand Down Expand Up @@ -427,7 +433,7 @@ export default class IngameComponent extends Component<IngameComponentProps> {
currentlyViewed={this.currentOpenedTab == "chat"}/>
</Tab.Pane>
<Tab.Pane eventKey="game-logs" className="h-100">
<ScrollToBottom className="h-100">
<ScrollToBottom className="h-100" scrollViewClassName="overflow-x-hidden">
<GameLogListComponent ingameGameState={this.props.gameState} />
</ScrollToBottom>
</Tab.Pane>
Expand Down Expand Up @@ -468,6 +474,19 @@ export default class IngameComponent extends Component<IngameComponentProps> {
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 <Tooltip id={house.id + "-power-tooltip"}>
<b>{house.name}</b><br/>
<small>Available: </small><b>{availablePower}</b><br/>
<small>On the board: </small><b>{powerTokensOnBoard}</b><br/>
<small>Power Pool: </small><b>{powerInPool}</b>
</Tooltip>;
}

onNewPrivateChatRoomClick(p: Player): void {
const users = _.sortBy([this.props.gameClient.authenticatedUser as User, p.user], u => u.id);

Expand Down
4 changes: 4 additions & 0 deletions agot-bg-game-server/src/client/style/custom.scss
Original file line number Diff line number Diff line change
Expand Up @@ -327,3 +327,7 @@ hr {
.tooltip-inner {
text-align: left;
}

.overflow-x-hidden {
overflow-x: hidden;
}
8 changes: 0 additions & 8 deletions agot-bg-game-server/src/common/GameState.ts
Original file line number Diff line number Diff line change
Expand Up @@ -49,14 +49,6 @@ export default class GameState<ParentGameState extends AnyGameState, ChildGameSt
: false;
}

getPhaseName(): string {
if (this.childGameState) {
return this.childGameState.getPhaseName();
} else {
throw new Error("getPhaseName should be overriden for leaf ingame state");
}
}

getWaitedUsers(): User[] {
if (this.childGameState) {
return this.childGameState.getWaitedUsers();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -96,10 +96,6 @@ export default class ChooseHouseCardGameState extends GameState<CombatGameState>
});
}

getPhaseName(): string {
return "Choose a general";
}

serializeToClient(admin: boolean, player: Player | null): SerializedChooseHouseCardGameState {
return {
type: "choose-house-card",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,10 +32,6 @@ export default class DeclareSupportGameState extends GameState<CombatGameState>
this.house = house;
}

getPhaseName(): string {
return "Declare support";
}

onPlayerMessage(player: Player, message: ClientMessage): void {
if (message.type == "declare-support") {
if (player.house != this.house) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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)
}
);

Expand Down Expand Up @@ -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)
}
);

Expand Down Expand Up @@ -188,7 +188,6 @@ export default class PostCombatGameState extends GameState<
// is not needed. The army left can be exterminated.
this.onChooseCasualtiesGameStateEnd(locationLoserArmy, loserArmyLeft);
}

return;
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -74,10 +74,6 @@ export default class ChooseCasualtiesGameState extends GameState<PostCombatGameS

}

getPhaseName(): string {
return "Choose casualties";
}

static deserializeFromServer(postCombatGameState: PostCombatGameState, data: SerializedChooseCasualtiesGameState): ChooseCasualtiesGameState {
const chooseCasualtiesGameState = new ChooseCasualtiesGameState(postCombatGameState);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -107,15 +107,15 @@ 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({
type: "retreat-casualties-suffered",
house: affectedHouse.name,
units: unitsToKill.map(u => u.type.name)
house: affectedHouse.id,
units: unitsToKill.map(u => u.type.id)
});
}

Expand All @@ -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
Expand Down Expand Up @@ -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)
});
});

Expand Down Expand Up @@ -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) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -61,10 +61,6 @@ export default class UseValyrianSteelBladeGameState extends GameState<CombatGame
return [this.ingame.getControllerOfHouse(this.house).user];
}

getPhaseName(): string {
return "Use Valyrian Steel Blade";
}

choose(use: boolean): void {
this.entireGame.sendMessageToServer({
type: "use-valyrian-steel-blade",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -253,9 +253,9 @@ export default class ResolveSingleMarchOrderGameState extends GameState<ResolveM

this.parentGameState.ingameGameState.log({
type: "ships-destroyed-by-empty-castle",
castle: startingRegion.name,
house: this.house.name,
port: portOfStartingRegion.name,
castle: startingRegion.id,
house: this.house.id,
port: portOfStartingRegion.id,
shipCount: destroyedShipCount
});
}
Expand Down Expand Up @@ -403,10 +403,6 @@ export default class ResolveSingleMarchOrderGameState extends GameState<ResolveM
};
}

getPhaseName(): string {
return "Resolve a March Order";
}

canLeavePowerToken(startingRegion: Region, moves: BetterMap<Region, Unit[]>): {success: boolean; reason: string} {
if (startingRegion.superControlPowerToken == this.house) {
return {success: false, reason: "already-capital"};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -89,10 +89,10 @@ export default class TakeControlOfEnemyPortGameState extends GameState<ResolveMa

this.ingame.log({
type: "enemy-port-taken",
oldController: oldController.name,
newController: this.newController.name,
oldController: oldController.id,
newController: this.newController.id,
shipCount: shipsToAdd.length,
port: this.port.name
port: this.port.id
});
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,10 +50,6 @@ export default class ChooseRavenActionGameState extends GameState<UseRavenGameSt
onServerMessage(_message: ServerMessage): void {
}

getPhaseName(): string {
return "Choose raven action";
}

serializeToClient(_admin: boolean, _player: Player | null): SerializedChooseRavenActionGameState {
return {
type: "choose-raven-action"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -115,10 +115,6 @@ export default class ReplaceOrderGameState extends GameState<UseRavenGameState>
}
}

getPhaseName(): string {
return "Replace order";
}

serializeToClient(_admin: boolean, _player: Player | null): SerializedReplaceOrderGameState {
return {
type: "replace-order"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -74,10 +74,6 @@ export default class SeeTopWildlingCardGameState extends GameState<UseRavenGameS
return [this.parentGameState.ingameGameState.getControllerOfHouse(this.ravenHolder).user];
}

getPhaseName(): string {
return "See top wildling card";
}

serializeToClient(admin: boolean, player: Player | null): SerializedSeeTopWildlingCardGameState {
return {
type: "see-top-wildling-card",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand All @@ -36,6 +35,7 @@ export default class Game {
skipRavenPhase: boolean;
structuresCountNeededToWin: number;
maxTurns: number;
maxPowerTokens: number;

get ironThroneHolder(): House {
return this.getTokenHolder(this.ironThroneTrack);
Expand Down Expand Up @@ -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
};
}

Expand All @@ -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;
}
Expand All @@ -368,4 +370,5 @@ export interface SerializedGame {
skipRavenPhase: boolean;
structuresCountNeededToWin: number;
maxTurns: number;
maxPowerTokens: number;
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -76,6 +78,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) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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<string, OrderType>([
[marchMinusOne.id, marchMinusOne],
Expand Down
Loading

0 comments on commit 1a606fc

Please sign in to comment.