From 5a48f01b8f3adebdac97e85767b220f8b68bb0b0 Mon Sep 17 00:00:00 2001 From: Kenneth Allen Date: Wed, 20 Oct 2021 19:44:13 +1100 Subject: [PATCH] Show player structures --- .../wonders-client/src/components/App/App.tsx | 12 ++-- .../wonders-client/src/components/Civ/Civ.css | 4 ++ .../wonders-client/src/components/Civ/Civ.tsx | 57 ++++++++++++++----- .../src/components/Game/Game.tsx | 9 ++- 4 files changed, 56 insertions(+), 26 deletions(-) diff --git a/packages/wonders-client/src/components/App/App.tsx b/packages/wonders-client/src/components/App/App.tsx index ece6acc..349cdff 100644 --- a/packages/wonders-client/src/components/App/App.tsx +++ b/packages/wonders-client/src/components/App/App.tsx @@ -1,11 +1,11 @@ -import { useState } from 'react'; +import { useState } from 'react' import useKetchup from 'ketchup-react' import { addPlayerAction, loadSampleAction, reducer, removePlayerAction, resetAction } from 'wonders-common' -import './App.css'; -import Game from '../Game/Game'; -import UserSelector from '../UserSelector/UserSelector'; -import 'bootstrap/dist/css/bootstrap.min.css'; -import Container from 'react-bootstrap/Container'; +import './App.css' +import Game from '../Game/Game' +import UserSelector from '../UserSelector/UserSelector' +import 'bootstrap/dist/css/bootstrap.min.css' +import Container from 'react-bootstrap/Container' import Row from 'react-bootstrap/Row' import Col from 'react-bootstrap/Col' diff --git a/packages/wonders-client/src/components/Civ/Civ.css b/packages/wonders-client/src/components/Civ/Civ.css index cf8f505..104197a 100644 --- a/packages/wonders-client/src/components/Civ/Civ.css +++ b/packages/wonders-client/src/components/Civ/Civ.css @@ -4,6 +4,10 @@ border: black solid; } +.wonder-civ-outer ol { + list-style-type: none; +} + .wonder-civ-struct { font-weight: bold; } diff --git a/packages/wonders-client/src/components/Civ/Civ.tsx b/packages/wonders-client/src/components/Civ/Civ.tsx index 34d3894..9b64788 100644 --- a/packages/wonders-client/src/components/Civ/Civ.tsx +++ b/packages/wonders-client/src/components/Civ/Civ.tsx @@ -1,7 +1,10 @@ -import { useMemo } from 'react'; -import { Player, playerStats, Resource, Science, sumMaps } from 'wonders-common'; +import { useMemo } from 'react' +import { Player, playerStats, Resource, Science, Structure, structureTypes } from 'wonders-common' import fill from 'lodash/fill' import './Civ.css' +import Container from 'react-bootstrap/Container' +import Row from 'react-bootstrap/Row' +import Col from 'react-bootstrap/Col' const resEmojis = new Map([ ['brick', '🧱'], @@ -19,23 +22,47 @@ const sciEmojis = new Map([ ]) const wonderBgExts = ['jpg', 'webp'] -export default function Civ({ player, style }: { player: Player, style: 'player' | 'neighbor' | 'compact' }) { +function structurePeek(struct: Structure): string { + switch (struct.type) { + case 'science': + return [...(struct.sciences ?? [])].map(sci => sciEmojis.get(sci)!).join('/') + case 'advanced industry': + case 'basic industry': + return [...(struct.resources?.entries() ?? [])] + .map(([res, num]) => fill(Array(num), resEmojis.get(res)!).join('')) + .join('/') + case 'military': + return fill(Array(struct.shields ?? 0), '🛡️').join('') + case 'culture': + return `${struct.points}⭐` + default: + return '' + } +} + +export default function Civ({ player, civStyle }: { player: Player, civStyle: 'player' | 'neighbor' | 'compact' }) { const pStats = useMemo(() => playerStats(player), [player]) const outerStyle: React.CSSProperties = player.wonder === undefined ? {} : { backgroundImage: ['linear-gradient(to left, rgba(255, 255, 255, 0.25), rgba(255, 255, 255, 0.75))', ...wonderBgExts.map(ext => `url("/assets/wonders/${player.wonder}.${ext}")`)].join(', '), } - return
-
{player.name}{player.wonder && ` • ${player.wonder}`}
-
{[...pStats.resources].flatMap(([res, n]) => fill(Array(n), resEmojis.get(res)!)).join('')}
-
{pStats.shields}🛡️
-
${player.gold}
-
{pStats.sciences.map(s => [...s].map(sci => sciEmojis.get(sci)!)).map(s => - s.length === 1 ? s[0] : `(${s.join('/')})` - )}
-
{[...sumMaps(pStats.structObjs.map(s => new Map([[s.type, 1]])))].map(([type, n]) => - {n} - )}
-
+ return + + {player.name}{player.wonder && ` • ${player.wonder}`} + + + {structureTypes.map(type => + +
    + {pStats.structObjs.filter(o => o.type === type).map((s, i) => +
  1. + {s.name} {structurePeek(s)} +
  2. + )} +
+ + )} +
+
} diff --git a/packages/wonders-client/src/components/Game/Game.tsx b/packages/wonders-client/src/components/Game/Game.tsx index 7c5ee79..15f8d4c 100644 --- a/packages/wonders-client/src/components/Game/Game.tsx +++ b/packages/wonders-client/src/components/Game/Game.tsx @@ -1,4 +1,3 @@ -/* eslint-disable react/style-prop-object */ import { Dispatch } from 'ketchup-react' import { Action, chooseWonderAction, maxPlayers, minPlayers, Player, startGameAction, State, structures, wonders } from 'wonders-common' import Civ from '../Civ/Civ' @@ -18,7 +17,7 @@ function getDistant(arr: T[], idx: number) { function DistantCivs({ players }: { players: Player[] }) { return {players.map(p => - + )} } @@ -42,15 +41,15 @@ export default function Game({ state, playerName, dispatch }: { state: State, pl return <> - +
{state.age === undefined ? '' : `Age ${state.age + 1} ${state.age % 2 === 0 ? '🔃' : '🔄'}`}
- +
- + {player.hand?.map(s => structures.get(s)!)?.map(s =>