diff --git a/assets/gfx/borders-1.6.jpg b/assets/gfx/borders-1.6.jpg new file mode 100644 index 0000000..b57e043 Binary files /dev/null and b/assets/gfx/borders-1.6.jpg differ diff --git a/assets/gfx/borders-1.6.png b/assets/gfx/borders-1.6.png new file mode 100644 index 0000000..bdd2c19 Binary files /dev/null and b/assets/gfx/borders-1.6.png differ diff --git a/assets/gfx/borders-2.1.jpg b/assets/gfx/borders-2.1.jpg new file mode 100644 index 0000000..5611bff Binary files /dev/null and b/assets/gfx/borders-2.1.jpg differ diff --git a/assets/gfx/borders-2.1.png b/assets/gfx/borders-2.1.png new file mode 100644 index 0000000..082ebf2 Binary files /dev/null and b/assets/gfx/borders-2.1.png differ diff --git a/assets/gfx/borders-3.2.jpg b/assets/gfx/borders-3.2.jpg new file mode 100644 index 0000000..35bdba3 Binary files /dev/null and b/assets/gfx/borders-3.2.jpg differ diff --git a/assets/gfx/borders-3.2.png b/assets/gfx/borders-3.2.png new file mode 100644 index 0000000..8964319 Binary files /dev/null and b/assets/gfx/borders-3.2.png differ diff --git a/assets/gfx/borders-4.3.jpg b/assets/gfx/borders-4.3.jpg new file mode 100644 index 0000000..c58bde3 Binary files /dev/null and b/assets/gfx/borders-4.3.jpg differ diff --git a/assets/gfx/borders-4.3.png b/assets/gfx/borders-4.3.png new file mode 100644 index 0000000..eb173ea Binary files /dev/null and b/assets/gfx/borders-4.3.png differ diff --git a/assets/gfx/borders-5.4.jpg b/assets/gfx/borders-5.4.jpg new file mode 100644 index 0000000..96d9b58 Binary files /dev/null and b/assets/gfx/borders-5.4.jpg differ diff --git a/assets/gfx/borders-5.4.png b/assets/gfx/borders-5.4.png new file mode 100644 index 0000000..473ebd8 Binary files /dev/null and b/assets/gfx/borders-5.4.png differ diff --git a/assets/gfx/borders-6.5.jpg b/assets/gfx/borders-6.5.jpg new file mode 100644 index 0000000..8691f4e Binary files /dev/null and b/assets/gfx/borders-6.5.jpg differ diff --git a/assets/gfx/borders-6.5.png b/assets/gfx/borders-6.5.png new file mode 100644 index 0000000..0ccc95d Binary files /dev/null and b/assets/gfx/borders-6.5.png differ diff --git a/assets/gfx/card-army-1.png b/assets/gfx/card-army-1.png new file mode 100644 index 0000000..dd0b238 Binary files /dev/null and b/assets/gfx/card-army-1.png differ diff --git a/assets/gfx/card-army-10.png b/assets/gfx/card-army-10.png new file mode 100644 index 0000000..aaaa93f Binary files /dev/null and b/assets/gfx/card-army-10.png differ diff --git a/assets/gfx/card-army-11.png b/assets/gfx/card-army-11.png new file mode 100644 index 0000000..b398be1 Binary files /dev/null and b/assets/gfx/card-army-11.png differ diff --git a/assets/gfx/card-army-12.png b/assets/gfx/card-army-12.png new file mode 100644 index 0000000..badc54b Binary files /dev/null and b/assets/gfx/card-army-12.png differ diff --git a/assets/gfx/card-army-13.png b/assets/gfx/card-army-13.png new file mode 100644 index 0000000..5606b37 Binary files /dev/null and b/assets/gfx/card-army-13.png differ diff --git a/assets/gfx/card-army-14.png b/assets/gfx/card-army-14.png new file mode 100644 index 0000000..a998d09 Binary files /dev/null and b/assets/gfx/card-army-14.png differ diff --git a/assets/gfx/card-army-2.png b/assets/gfx/card-army-2.png new file mode 100644 index 0000000..b8ec43c Binary files /dev/null and b/assets/gfx/card-army-2.png differ diff --git a/assets/gfx/card-army-3.png b/assets/gfx/card-army-3.png new file mode 100644 index 0000000..b203cb8 Binary files /dev/null and b/assets/gfx/card-army-3.png differ diff --git a/assets/gfx/card-army-4.png b/assets/gfx/card-army-4.png new file mode 100644 index 0000000..75394ea Binary files /dev/null and b/assets/gfx/card-army-4.png differ diff --git a/assets/gfx/card-army-5.png b/assets/gfx/card-army-5.png new file mode 100644 index 0000000..61bbfc2 Binary files /dev/null and b/assets/gfx/card-army-5.png differ diff --git a/assets/gfx/card-army-6.png b/assets/gfx/card-army-6.png new file mode 100644 index 0000000..8ef1525 Binary files /dev/null and b/assets/gfx/card-army-6.png differ diff --git a/assets/gfx/card-army-7.png b/assets/gfx/card-army-7.png new file mode 100644 index 0000000..1456318 Binary files /dev/null and b/assets/gfx/card-army-7.png differ diff --git a/assets/gfx/card-army-8.png b/assets/gfx/card-army-8.png new file mode 100644 index 0000000..f3e8c5d Binary files /dev/null and b/assets/gfx/card-army-8.png differ diff --git a/assets/gfx/card-army-9.png b/assets/gfx/card-army-9.png new file mode 100644 index 0000000..3cad2a6 Binary files /dev/null and b/assets/gfx/card-army-9.png differ diff --git a/assets/gfx/card-brick.png b/assets/gfx/card-brick.png new file mode 100644 index 0000000..5c9d9b6 Binary files /dev/null and b/assets/gfx/card-brick.png differ diff --git a/assets/gfx/card-monopoly.png b/assets/gfx/card-monopoly.png new file mode 100644 index 0000000..dd21708 Binary files /dev/null and b/assets/gfx/card-monopoly.png differ diff --git a/assets/gfx/card-road-1.png b/assets/gfx/card-road-1.png new file mode 100644 index 0000000..f3c87a3 Binary files /dev/null and b/assets/gfx/card-road-1.png differ diff --git a/assets/gfx/card-road-2.png b/assets/gfx/card-road-2.png new file mode 100644 index 0000000..792334d Binary files /dev/null and b/assets/gfx/card-road-2.png differ diff --git a/assets/gfx/card-sheep.png b/assets/gfx/card-sheep.png new file mode 100644 index 0000000..51d545c Binary files /dev/null and b/assets/gfx/card-sheep.png differ diff --git a/assets/gfx/card-stone.png b/assets/gfx/card-stone.png new file mode 100644 index 0000000..c5a2ad3 Binary files /dev/null and b/assets/gfx/card-stone.png differ diff --git a/assets/gfx/card-vp-library.png b/assets/gfx/card-vp-library.png new file mode 100644 index 0000000..90f1413 Binary files /dev/null and b/assets/gfx/card-vp-library.png differ diff --git a/assets/gfx/card-vp-market.png b/assets/gfx/card-vp-market.png new file mode 100644 index 0000000..a549d31 Binary files /dev/null and b/assets/gfx/card-vp-market.png differ diff --git a/assets/gfx/card-vp-palace.png b/assets/gfx/card-vp-palace.png new file mode 100644 index 0000000..3d04cf8 Binary files /dev/null and b/assets/gfx/card-vp-palace.png differ diff --git a/assets/gfx/card-vp-university.png b/assets/gfx/card-vp-university.png new file mode 100644 index 0000000..a5dafae Binary files /dev/null and b/assets/gfx/card-vp-university.png differ diff --git a/assets/gfx/card-wheat.png b/assets/gfx/card-wheat.png new file mode 100644 index 0000000..ebcc63c Binary files /dev/null and b/assets/gfx/card-wheat.png differ diff --git a/assets/gfx/card-wood.png b/assets/gfx/card-wood.png new file mode 100644 index 0000000..d6129ba Binary files /dev/null and b/assets/gfx/card-wood.png differ diff --git a/assets/gfx/pieces-blue.jpg b/assets/gfx/pieces-blue.jpg new file mode 100644 index 0000000..ff27d85 Binary files /dev/null and b/assets/gfx/pieces-blue.jpg differ diff --git a/assets/gfx/pieces-orange.jpg b/assets/gfx/pieces-orange.jpg new file mode 100644 index 0000000..50447c8 Binary files /dev/null and b/assets/gfx/pieces-orange.jpg differ diff --git a/assets/gfx/pieces-red.jpg b/assets/gfx/pieces-red.jpg new file mode 100644 index 0000000..34082ad Binary files /dev/null and b/assets/gfx/pieces-red.jpg differ diff --git a/assets/gfx/pieces-white.jpg b/assets/gfx/pieces-white.jpg new file mode 100644 index 0000000..0a836ad Binary files /dev/null and b/assets/gfx/pieces-white.jpg differ diff --git a/assets/gfx/pieces.jpg b/assets/gfx/pieces.jpg new file mode 100644 index 0000000..bdef886 Binary files /dev/null and b/assets/gfx/pieces.jpg differ diff --git a/assets/gfx/pip-numbers.png b/assets/gfx/pip-numbers.png new file mode 100644 index 0000000..4109bde Binary files /dev/null and b/assets/gfx/pip-numbers.png differ diff --git a/assets/gfx/pip-ships.png b/assets/gfx/pip-ships.png new file mode 100644 index 0000000..44ec8e2 Binary files /dev/null and b/assets/gfx/pip-ships.png differ diff --git a/assets/gfx/placard-blue.png b/assets/gfx/placard-blue.png new file mode 100644 index 0000000..4143a83 Binary files /dev/null and b/assets/gfx/placard-blue.png differ diff --git a/assets/gfx/placard-largest-army.png b/assets/gfx/placard-largest-army.png new file mode 100644 index 0000000..2f3be5f Binary files /dev/null and b/assets/gfx/placard-largest-army.png differ diff --git a/assets/gfx/placard-longest-road.png b/assets/gfx/placard-longest-road.png new file mode 100644 index 0000000..2c3f783 Binary files /dev/null and b/assets/gfx/placard-longest-road.png differ diff --git a/assets/gfx/placard-orange.png b/assets/gfx/placard-orange.png new file mode 100644 index 0000000..47427c2 Binary files /dev/null and b/assets/gfx/placard-orange.png differ diff --git a/assets/gfx/placard-red.png b/assets/gfx/placard-red.png new file mode 100644 index 0000000..256832a Binary files /dev/null and b/assets/gfx/placard-red.png differ diff --git a/assets/gfx/placard-white.png b/assets/gfx/placard-white.png new file mode 100644 index 0000000..dd051ec Binary files /dev/null and b/assets/gfx/placard-white.png differ diff --git a/assets/gfx/table.png b/assets/gfx/table.png new file mode 100644 index 0000000..bdf89eb Binary files /dev/null and b/assets/gfx/table.png differ diff --git a/assets/gfx/tiles-brick.png b/assets/gfx/tiles-brick.png new file mode 100644 index 0000000..0e6c1dd Binary files /dev/null and b/assets/gfx/tiles-brick.png differ diff --git a/assets/gfx/tiles-robber.png b/assets/gfx/tiles-robber.png new file mode 100644 index 0000000..f0f3204 Binary files /dev/null and b/assets/gfx/tiles-robber.png differ diff --git a/assets/gfx/tiles-sheep.png b/assets/gfx/tiles-sheep.png new file mode 100644 index 0000000..62864df Binary files /dev/null and b/assets/gfx/tiles-sheep.png differ diff --git a/assets/gfx/tiles-stone.png b/assets/gfx/tiles-stone.png new file mode 100644 index 0000000..d951b2a Binary files /dev/null and b/assets/gfx/tiles-stone.png differ diff --git a/assets/gfx/tiles-wheat.png b/assets/gfx/tiles-wheat.png new file mode 100644 index 0000000..1568797 Binary files /dev/null and b/assets/gfx/tiles-wheat.png differ diff --git a/assets/gfx/tiles-wood.png b/assets/gfx/tiles-wood.png new file mode 100644 index 0000000..2956be9 Binary files /dev/null and b/assets/gfx/tiles-wood.png differ diff --git a/src/App.css b/src/App.css index d027a56..4c865e7 100755 --- a/src/App.css +++ b/src/App.css @@ -36,6 +36,10 @@ body { margin-left: -4.5em; } +.Hand { + min-height: calc(7.2em + 0.5em); +} + .Hand:hover .Stack:hover > *:not(:first-child) { margin-left: -2em; } diff --git a/src/Board.js b/src/Board.js index f01b313..dce664c 100755 --- a/src/Board.js +++ b/src/Board.js @@ -4,7 +4,18 @@ const hexagonRatio = 1.1547005, tileHeight = 0.16, tileWidth = tileHeight * hexagonRatio, roadSize = tileHeight * 0.5 * (5. / 8.), - settlementSize = tileHeight * 0.5 - roadSize; + settlementSize = tileHeight * 0.5 - roadSize, + diceSize = 0.05, + diceMargin = diceSize * 0.5 * Math.sqrt(2), + dice = [ { + pips: 0, + jitter: 0, + angle: 0 + }, { + pips: 0, + jitter: 0, + angle: 0 + } ]; const Tiles = (board) => { const tiles = [ { @@ -65,7 +76,7 @@ const Tiles = (board) => { image.addEventListener("error", (event) => { alert(`Error loading ${file}`); }); - image.src = `assets/original/${file}`; + image.src = `assets/gfx/${file}`; }); return tiles; @@ -104,7 +115,7 @@ const Pips = (board) => { image.addEventListener("error", (event) => { alert(`Error loading ${file}`); }); - image.src = `assets/original/${file}`; + image.src = `assets/gfx/${file}`; return { image: image, @@ -122,7 +133,7 @@ const Border = (board, border) => { image.addEventListener("error", (event) => { alert(`Error loading ${file}`); }); - image.src = `assets/original/${file}`; + image.src = `assets/gfx/${file}`; return border; }; @@ -135,7 +146,7 @@ const Table = (board) => { image.addEventListener("error", (event) => { alert(`Error loading ${file}`); }); - image.src = `assets/original/${file}`; + image.src = `assets/gfx/${file}`; return image; }; @@ -165,7 +176,7 @@ class Placard extends React.Component { render() { return (
+ style={{backgroundImage:`url(assets/gfx/placard-${this.props.type}.png)`}}>
); } @@ -179,7 +190,7 @@ class Development extends React.Component { const array = []; for (let i = 0; i < this.props.count; i++) { if (this.props.type.match(/-$/)) { - array.push(Math.ceil(Math.random() * this.props.max)); + array.push(i + 1);//Math.ceil(Math.random() * this.props.max)); } else { array.push(""); } @@ -188,7 +199,7 @@ class Development extends React.Component {
{ React.Children.map(array, i => (
+ style={{backgroundImage:`url(assets/gfx/card-${this.props.type}${i}.png)`}}>
)) }
@@ -201,15 +212,19 @@ class Resource extends React.Component { super(props); } render() { - const array = new Array(Number(this.props.count)); + const array = new Array(Number(this.props.count ? this.props.count : 0)); return ( -
+ <> + { array.length > 0 && +
{ React.Children.map(array, i => (
+ style={{backgroundImage:`url(assets/gfx/card-${this.props.type}.png)`}}>
)) }
+ } + ); } }; @@ -217,13 +232,24 @@ class Resource extends React.Component { class Board extends React.Component { constructor(props) { super(props); + this.state = { + total: 0, + wood: 0, + sheep: 0, + brick: 0, + stone: 0, + wheat: 0 + }; this.componentDidMount = this.componentDidMount.bind(this); this.updateDimensions = this.updateDimensions.bind(this); this.drawFrame = this.drawFrame.bind(this); this.drawBorders = this.drawBorders.bind(this); this.drawPips = this.drawPips.bind(this); + this.drawDie = this.drawDie.bind(this); + this.keyUp = this.keyUp.bind(this); this.mouseMove = this.mouseMove.bind(this); this.randomize = this.randomize.bind(this); + this.throwDice = this.throwDice.bind(this); this.mouse = { x: 0, y: 0 }; this.radius = 0.317; @@ -271,6 +297,64 @@ class Board extends React.Component { window.requestAnimationFrame(this.drawFrame); } + keyUp(event) { + if (event.keyCode == 78) { /* n */ + this.randomize(); + return; + } + + if (event.keyCode == 32) { /* space */ + this.throwDice(); + return; + } + } + + throwDice() { + for (let i = 0; i < 2; i++) { + dice[i] = { + pips: Math.ceil(Math.random() * 6), + angle: Math.random() * Math.PI * 2, + jitter: (Math.random() - 0.5) * diceSize * 0.125 + } + } + window.requestAnimationFrame(this.drawFrame); + + const sum = dice[0].pips + dice[1].pips; + if (sum == 7) { /* Robber! */ + if (this.state.total > 7) { + let half = Math.ceil(this.state.total * 0.5); + this.state.total -= half; + while (half) { + switch (Math.floor(Math.random() * 5)) { + case 0: if (this.state.wood) { this.state.wood--; half--; } break; + case 1: if (this.state.sheep) { this.state.sheep--; half--; } break; + case 2: if (this.state.stone) { this.state.stone--; half--; } break; + case 3: if (this.state.brick) { this.state.brick--; half--; } break; + case 4: if (this.state.wheat) { this.state.wheat--; half--; } break; + } + } + } + } else { + this.tiles.forEach((tile) => { + if (tile.pip.roll != sum) { + return; + } + this.state[tile.type]++; + this.state.total++; + }); + } + + this.setState({ + total: this.state.total, + wood: this.state.wood, + sheep: this.state.sheep, + stone: this.state.stone, + brick: this.state.brick, + wheat: this.state.wheat + }); + } + + mouseMove(event) { const rect = this.canvas.parentElement.getBoundingClientRect(); let x, y; @@ -371,6 +455,9 @@ class Board extends React.Component { * * If the view is wider than taller, then */ + const tableLeft = 32 * this.table.width / 1080, + tableRight = 1010 * this.table.width / 1080, + tableLeaf = 978 * this.table.width / 1080; /* If view is taller than wide, tile the table vertically */ ctx.save(); @@ -399,17 +486,17 @@ class Board extends React.Component { const tableWidth = this.canvas.height * this.table.width / this.table.height; ctx.drawImage(this.table, 0, 0, - 1010, this.table.height, + tableRight, this.table.height, 0, 0, - this.canvas.height * 1010 / this.table.height, this.canvas.height); - let left = this.canvas.height * 1010 / this.table.height; + this.canvas.height * tableRight / this.table.height, this.canvas.height); + let left = this.canvas.height * tableRight / this.table.height; while (left < this.canvas.width) { ctx.drawImage(this.table, - 32, 0, - 978, this.table.height, + tableLeft, 0, + tableLeaf, this.table.height, left, 0, - this.canvas.height * 978 / this.table.height, this.canvas.height); - left += this.canvas.height * 978 / this.table.height; + this.canvas.height * tableLeaf / this.table.height, this.canvas.height); + left += this.canvas.height * tableLeaf / this.table.height; } } ctx.restore(); @@ -491,6 +578,101 @@ class Board extends React.Component { ctx.fill(); } + ctx.save(); + { + ctx.translate(tileWidth * -2.5, -tileWidth * 2); + ctx.rotate(Math.PI * -0.25) + + if (dice[0].pips) { + ctx.translate(-0.5 * (diceSize + diceMargin), 0); + this.drawDie(ctx, dice[0]); + } + + if (dice[1].pips) { + ctx.translate(diceSize + diceMargin, 0); + this.drawDie(ctx, dice[1]); + } + } + ctx.restore(); + + ctx.restore(); + } + + drawDie(ctx, die) { + const radius = diceSize * 0.125, + offset = diceSize * 0.5 - radius, + pips = die.pips; + + ctx.save(); + ctx.rotate(die.angle); + ctx.translate(die.jitter, 0); + + ctx.strokeStyle = "#666"; + ctx.fillStyle = "#444"; + + ctx.beginPath(); + ctx.arc(-offset, -offset, radius, Math.PI, Math.PI * 1.5); + ctx.arc(+offset, -offset, radius, Math.PI * 1.5, 0); + ctx.arc(+offset, +offset, radius, 0, Math.PI * 0.5); + ctx.arc(-offset, +offset, radius, Math.PI * 0.5, Math.PI); + ctx.closePath(); + ctx.fill(); + ctx.stroke(); + + ctx.strokeStyle = "#bbb"; + ctx.fillStyle = "#ddd"; + /* center pip */ + if (pips == 1 || pips == 3 || pips == 5) { + ctx.beginPath(); + ctx.arc(0, 0, diceSize * 0.0625, 0, Math.PI * 2); + ctx.fill(); + ctx.stroke(); + } + + /* upper left pip */ + if (pips == 2 || pips == 3 || pips == 4 || pips == 5 || pips == 6) { + ctx.beginPath(); + ctx.arc(-diceSize * 0.250, -diceSize * 0.250, diceSize * 0.0625, 0, Math.PI * 2); + ctx.fill(); + ctx.stroke(); + } + + /* upper right pip */ + if (pips == 4 || pips == 5 || pips == 6) { + ctx.beginPath(); + ctx.arc(+diceSize * 0.250, -diceSize * 0.250, diceSize * 0.0625, 0, Math.PI * 2); + ctx.fill(); + ctx.stroke(); + } + + /* lower right pip */ + if (pips == 2 || pips == 3 || pips == 4 || pips == 5 || pips == 6) { + ctx.beginPath(); + ctx.arc(+diceSize * 0.250, +diceSize * 0.250, diceSize * 0.0625, 0, Math.PI * 2); + ctx.fill(); + ctx.stroke(); + } + + /* lower left pip */ + if (pips == 4 || pips == 5 || pips == 6) { + ctx.beginPath(); + ctx.arc(-diceSize * 0.250, +diceSize * 0.250, diceSize * 0.0625, 0, Math.PI * 2); + ctx.fill(); + ctx.stroke(); + } + + /* middle left and right pip */ + if (pips == 6) { + ctx.beginPath(); + ctx.arc(-diceSize * 0.250, 0, diceSize * 0.0625, 0, Math.PI * 2); + ctx.fill(); + ctx.stroke(); + ctx.beginPath(); + ctx.arc(+diceSize * 0.250, 0, diceSize * 0.0625, 0, Math.PI * 2); + ctx.fill(); + ctx.stroke(); + } + ctx.restore(); } @@ -533,7 +715,7 @@ class Board extends React.Component { let angle, radius = this.radius, - index = 1, pip; + index = 1, pip, roll = dice[0].pips + dice[1].pips; /* Outer row */ angle = 0; @@ -544,8 +726,15 @@ class Board extends React.Component { } else { pip = this.pips.pips[index++]; } + this.tiles[i].pip = pip; drawTile(this.tiles[i], angle, radius - (i % 2) * 0.04); + if (roll == pip.roll) { + ctx.scale(1.25, 1.25); + } drawPip(pip, angle, radius - (i % 2) * 0.04, this.tiles[i].jitter); + if (roll == pip.roll) { + ctx.scale(0.8, 0.8); + } } /* Middle row */ @@ -558,8 +747,15 @@ class Board extends React.Component { } else { pip = this.pips.pips[index++]; } + this.tiles[i].pip = pip; drawTile(this.tiles[i], angle, radius); + if (roll == pip.roll) { + ctx.scale(1.25, 1.25); + } drawPip(pip, angle, radius, this.tiles[i].jitter); + if (roll == pip.roll) { + ctx.scale(0.8, 0.8); + } } /* Center */ @@ -569,8 +765,15 @@ class Board extends React.Component { } else { pip = this.pips.pips[index++]; } + this.tiles[i].pip = pip; drawTile(this.tiles[i], 0, 0); + if (roll == pip.roll) { + ctx.scale(1.25, 1.25); + } drawPip(pip, 0, 0, this.tiles[i].jitter); + if (roll == pip.roll) { + ctx.scale(0.8, 0.8); + } } drawBorders(ctx) { @@ -594,7 +797,7 @@ class Board extends React.Component { componentDidMount() { this.start = new Date(); - window.addEventListener("mousedown", this.randomize); + document.addEventListener("keyup", this.keyUp); window.addEventListener("touchmove", this.mouseMove); window.addEventListener("mousemove", this.mouseMove); window.addEventListener("resize", this.updateDimensions); @@ -607,7 +810,7 @@ class Board extends React.Component { clearTimeout(this.updateSizeTimer); this.updateSizeTimer = 0; } - window.removeEventListener("mousedown", this.randomize); + document.removeEventListener("keyup", this.keyUp); window.removeEventListener("mousemove", this.mouseMove); window.removeEventListener("touchmove", this.mouseMove); window.removeEventListener("resize", this.updateDimensions); @@ -620,11 +823,11 @@ class Board extends React.Component {
In hand
- - - - - + + + + +
Available to play
@@ -651,7 +854,7 @@ class Board extends React.Component {
Stats
Points: 7
-
Cards: 8
+
Cards: {this.state.total}
Roads remaining: 4
Longest road: 7
Cities remaining: 4