introducing logic for color sorting of chips

This commit is contained in:
2022-08-25 13:04:57 -05:00
parent 4cfc41374e
commit e987a2aad8
15 changed files with 139 additions and 78 deletions

View File

@@ -1,30 +0,0 @@
.card-row {
display: flex;
flex-flow: column nowrap;
margin: 2rem;
width: 80vw;
}
.card-row-cards-visible {
display: flex;
flex-flow: row nowrap;
width: 100%;
justify-content: space-around;
}
.card {
width: 25%;
}
.tier-1 {
background-color: green;
}
.tier-2 {
background-color: yellow;
color: black;
}
.tier-3 {
background-color: blue;
}

View File

@@ -0,0 +1,30 @@
.card-row {
display: flex;
flex-flow: column nowrap;
margin: 2rem;
width: 80vw;
.card-row-cards-visible {
display: flex;
flex-flow: row nowrap;
width: 100%;
justify-content: space-around;
}
}
.card {
width: 25%;
}
.tier-1 {
background-color: green;
}
.tier-2 {
background-color: yellow;
color: black;
}
.tier-3 {
background-color: blue;
}

View File

@@ -3,7 +3,7 @@ import { CardData } from "../../util/types"
import Card from "../Card/Card" import Card from "../Card/Card"
import { v4 } from 'uuid'; import { v4 } from 'uuid';
import cardTierToKey from '../../util/cardTierToKey'; import cardTierToKey from '../../util/cardTierToKey';
import "./Card.scss"; import "./CardRow.scss";
export default function CardRow({tier, state, setState}: CardRowProps) { export default function CardRow({tier, state, setState}: CardRowProps) {
const typedTier = cardTierToKey(tier); const typedTier = cardTierToKey(tier);

View File

@@ -1,19 +1,19 @@
// types, data, utils // types, data, utils
import { AppState, PlayerData, ResourceCost } from '../../util/types';
import { useCallback, useEffect, useState } from 'react'; import { useCallback, useEffect, useState } from 'react';
import { Link } from 'react-router-dom';
import initializeBoard, { setCardRows } from '../../util/initializeBoard';
import { AppState, PlayerData, ResourceCost } from '../../util/types';
import { getChipsActions } from '../Player/ActionMethods'; import { getChipsActions } from '../Player/ActionMethods';
import { StateProps } from '../../util/propTypes'; import { StateProps } from '../../util/propTypes';
import { Link } from 'react-router-dom'; import './Gameboard.scss';
// components // components
import Nobles from '../Nobles/Nobles'; import Nobles from '../Nobles/Nobles';
import initializeBoard, { setCardRows } from '../../util/initializeBoard';
import AvailableChips from '../Resources/AvailableChips'; import AvailableChips from '../Resources/AvailableChips';
import AllPlayers from '../Player/AllPlayers'; import AllPlayers from '../Player/AllPlayers';
import CardRow from '../Card/CardRow'; import CardRow from '../Card/CardRow';
import SelectionView from '../Resources/SelectionView'; import SelectionView from '../Resources/SelectionView';
import { useCurrentPlayer } from '../../hooks/useCurrentPlayer'; import { useCurrentPlayer } from '../../hooks/useCurrentPlayer';
import getTotalBuyingPower from '../../util/getTotalBuyingPower';
import usePreviousPlayer from '../../hooks/usePreviousPlayer'; import usePreviousPlayer from '../../hooks/usePreviousPlayer';
const { validateChips } = getChipsActions; const { validateChips } = getChipsActions;
@@ -47,35 +47,26 @@ export default function Gameboard({ state, setState }: StateProps) {
}, [state]); }, [state]);
// util functions, setup on mount // util functions, setup on mount
useEffect(() => { useEffect(() => initializeBoard(state, setState), [])
initializeBoard(state, setState);
}, [])
useEffect(() => { useEffect(() => {
setCardRows(state); setCardRows(state);
}, [state]) }, [state])
useEffect(() => { // endgame logic: once triggered, sets "endgame" to the player who triggered the effect
if (state.actions.buyCard.active) {
const currentPlayer = useCurrentPlayer(state);
currentPlayer && console.log(getTotalBuyingPower(currentPlayer));
}
}, [state.actions])
useEffect(() => { useEffect(() => {
const previousPlayer = usePreviousPlayer(state); const previousPlayer = usePreviousPlayer(state);
if (previousPlayer && previousPlayer.points >= 15) setEndgame(previousPlayer); if (previousPlayer && previousPlayer.points >= 15) setEndgame(previousPlayer);
}, [state]) }, [state])
// endgame logic: determines the player with highest score after remaining allowed turns
useEffect(() => { useEffect(() => {
if (endgame) { if (endgame) {
console.log('endgame!'); let winner: PlayerData;
const currentPlayer = useCurrentPlayer(state); const currentPlayer = useCurrentPlayer(state);
if (!currentPlayer) return; if (!currentPlayer) return;
if (currentPlayer.id <= endgame.id) { if (currentPlayer.id <= endgame.id) {
let winner: PlayerData;
const winnerData = state.players; const winnerData = state.players;
winner = winnerData.sort((x,y) => x.points - y.points)[0]; winner = winnerData.sort((x,y) => x.points - y.points)[0];
console.log(winner.name + ' wins!'); console.log(winner.name + ' wins!');
@@ -83,7 +74,7 @@ export default function Gameboard({ state, setState }: StateProps) {
} }
}, [state, endgame]) }, [state, endgame])
// displays state of board if data is populated, otherwise points to game constructor // rendering: displays state of board if data is populated, otherwise points to game constructor
useEffect(() => { useEffect(() => {
if (!state.players.length) { if (!state.players.length) {
setView( setView(
@@ -108,6 +99,5 @@ export default function Gameboard({ state, setState }: StateProps) {
} }
}, [state]); }, [state]);
// render
return view return view
} }

View File

@@ -1,9 +1,22 @@
@import '../../sass/helper/mixins';
.all-players { .all-players {
display: flex; display: flex;
background-color: rgb(237, 213, 156); background-color: rgb(237, 213, 156);
color: black; color: black;
} .player-ui {
p {
margin: 1rem;
}
.subheader {
font-weight: bold;
}
.all-players p { .resources {
margin: 1rem; .player-chips-enum {
display: flex;
@include map-gem-values(".player-chip");
}
}
}
} }

View File

@@ -57,11 +57,7 @@ export default function Player({ player, state, setState }: PlayerProps) {
return ( return (
<div className="player-ui" key={v4()}> <div className="player-ui" key={v4()}>
{/* Static Data */} <p className="subheader">Name: {player.name} {player.starter && "(round starter)"}</p>
<section className="player-constants">
<p>Name: {player.name}</p>
<p>Is {player.starter || "not"} round starter</p>
</section>
{/* Dynamic data from state */} {/* Dynamic data from state */}
<section className="turn-and-action-based"> <section className="turn-and-action-based">
@@ -90,13 +86,19 @@ export default function Player({ player, state, setState }: PlayerProps) {
</section> </section>
<section className="resources"> <section className="resources">
<strong>{dynamic?.name}'s Resources</strong> <p className="subheader">{dynamic?.name}'s Resources</p>
<div className="player-chips"> <div className="player-chips">
<p>Chips:</p> <p>Chips:</p>
{ dynamic && Object.entries(dynamic.inventory).map(([key,value]) => { <div className="player-chips-enum">
return value > 0 && <p key={v4()}>{key}: {value}</p> { dynamic && Object.entries(dynamic.inventory).map(([key,value]) => {
})} return value > 0 && (
<p key={v4()} className={`player-chip-${key}`}>
{key}: {value}
</p>
)
})}
</div>
</div> </div>
<div className="player-cards"> <div className="player-cards">

View File

@@ -1,10 +1,14 @@
@import "../../sass/helper/mixins";
.available-chips { .available-chips {
display: flex; display: flex;
flex-flow: row nowrap; flex-flow: row nowrap;
background-color: rgb(236, 238, 186); background-color: rgb(236, 238, 186);
color: black; color: black;
}
.available-chips p { p {
margin: 1rem; margin: 1rem;
}
@include map-gem-values(".chips");
} }

View File

@@ -5,22 +5,22 @@ import "./AvailableChips.scss"
export default function AvailableChips({ state, liftSelection }: ResourceProps) { export default function AvailableChips({ state, liftSelection }: ResourceProps) {
return ( return (
<div className="available-chips"> <div className={state.actions.getChips.active ? 'available-chips' : 'hidden'}>
{ {
Object.keys(state.gameboard.tradingResources).map((key: string) => { Object.keys(state.gameboard.tradingResources).map((key: string) => {
const typedKey = key as keyof ResourceCost; const typedKey = key as keyof ResourceCost;
return ( return (
<div key={v4()} className={`chips-${key}`}> <button
<button key={v4()}
key={v4()} value={key}
value={key} className={`chips-${key}`}
// @ts-ignore // @ts-ignore
disabled={state.gameboard.tradingResources[typedKey] <= 0} disabled={state.gameboard.tradingResources[typedKey] <= 0}
onClick={() => liftSelection(typedKey)} onClick={() => liftSelection(typedKey)}
> >
{key}: {state.gameboard.tradingResources[typedKey]} {key}: {state.gameboard.tradingResources[typedKey]}
</button> </button>
</div>
) )
}) })
} }

View File

@@ -0,0 +1,16 @@
@import "../../sass/helper/mixins";
.selection-view {
.current-selections {
display: flex;
align-items: center;
justify-content: center;
@include map-gem-values(".selection-value");
p {
margin: 1rem;
padding: 0.5rem;
border-radius: 25%;
}
}
}

View File

@@ -2,6 +2,7 @@ import { useEffect, useState } from "react";
import { StateProps } from "../../util/propTypes"; import { StateProps } from "../../util/propTypes";
import { useCurrentPlayer } from "../../hooks/useCurrentPlayer"; import { useCurrentPlayer } from "../../hooks/useCurrentPlayer";
import { GetChipsHTML, ReserveCardHTML } from "./ViewHTML"; import { GetChipsHTML, ReserveCardHTML } from "./ViewHTML";
import './SelectionView.scss';
export default function SelectionView({ state, setState }: StateProps) { export default function SelectionView({ state, setState }: StateProps) {
const [currentPlayer, setCurrentPlayer] = useState(useCurrentPlayer(state)); const [currentPlayer, setCurrentPlayer] = useState(useCurrentPlayer(state));

View File

@@ -28,7 +28,7 @@ export const GetChipsHTML = ({ state, setState }: StateProps) => {
<div className="current-selections"> <div className="current-selections">
{ {
state.actions.getChips.active && state.actions.getChips.active &&
state.actions.getChips.selection?.map((each: keyof ResourceCost) => <p key={v4()}>{each}</p>) state.actions.getChips.selection?.map((each: keyof ResourceCost) => <p className={`selection-value-${each}`} key={v4()}>{each}</p>)
} }
</div> </div>
{ {

View File

@@ -1,4 +1,10 @@
@import './helper/placeholders';
#root { #root {
.hidden {
@extend %hidden;
}
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: center; justify-content: center;

View File

@@ -0,0 +1,26 @@
@mixin map-gem-values($parentClass) {
#{$parentClass} {
&-emerald {
background-color: green;
}
&-diamond {
background-color: white;
color: black;
}
&-onyx {
background-color: black;
color: white;
}
&-sapphire {
background-color: blue;
color: white;
}
&-ruby {
background-color: red;
}
&-gold {
background-color: gold;
color: black;
}
}
}

View File

@@ -0,0 +1,3 @@
%hidden {
display: none;
}