import Engine, {
BoardAction,
Booster,
Federation,
Player,
PlayerEnum,
Resource,
Reward,
ScoringTile,
} from "@gaia-project/engine";
import { federationRewards } from "@gaia-project/engine/src/tiles/federations";
import { boardActionData } from "../../data/actions";
import { boosterData } from "../../data/boosters";
import { factionName } from "../../data/factions";
import { federationData } from "../../data/federations";
import { roundScoringData } from "../../data/round-scorings";
import { playerColor } from "../../graphics/colors";
import { richTextRewards } from "../../graphics/rich-text";
import { Cell, defaultBackground, emptyCell, GeneralTable } from "./types";
export function playerCell(p: Player | null, bold = false): Cell {
if (p == null) {
return {
shortcut: "-",
title: "Available",
color: defaultBackground,
};
}
function b(s: string): string {
return bold ? `${s}` : s;
}
const f = p.faction;
return {
shortcut: f ? b(f.substring(0, 1)) : "",
title: f ? factionName(f) : "",
color: f ? playerColor(p, true) : null,
};
}
export function boosterCell(b: Booster): Cell {
return {
shortcut: boosterData[b].shortcut,
title: boosterData[b].name,
color: boosterData[b].color,
};
}
function federationResource(fed: Federation): Resource {
return federationRewards(fed).find((r) => r.type != Resource.VictoryPoint)?.type ?? Resource.VictoryPoint;
}
export function generalTables(engine: Engine): GeneralTable[] {
return [
{
caption: "Board Actions",
columns: BoardAction.values(engine.expansions).map((a) => ({
header: {
shortcut: boardActionData[a].shortcut,
title: boardActionData[a].name,
color: boardActionData[a].color,
},
row: playerCell(
engine.boardActions[a] != null && engine.boardActions[a] !== PlayerEnum.Player5
? engine.player(engine.boardActions[a])
: null
),
})),
},
{
caption: "Round",
columns: [null as ScoringTile].concat(...engine.tiles.scorings.round).map((r, round) => ({
header: {
shortcut: String(round),
title: `Round ${round}`,
color: engine.round == round && !engine.ended ? "--current-round" : null,
},
row:
round == 0
? emptyCell
: {
shortcut: `${roundScoringData[r].shortcut}`,
title: roundScoringData[r].name,
color: roundScoringData[r].color,
},
})),
},
{
caption: "Boosters",
columns: Booster.values(engine.expansions)
.filter((b) => engine.tiles.boosters[b] != null)
.map((b) => ({
header: boosterCell(b),
row: playerCell(engine.players.find((p) => p.data.tiles.booster == b)),
})),
},
{
caption: "Federations",
columns: Object.entries(engine.tiles.federations).map(([fed, count]) => ({
header: {
shortcut: federationData[fed].shortcut,
title: federationRewards(fed as Federation).join(","),
color: federationData[fed].color,
},
row: {
shortcut: [richTextRewards([new Reward(count, federationResource(fed as Federation))])],
title: "Number of federations left",
color: federationData[fed].color,
},
})),
},
];
}