optimized image rendering, tweaks to game ui
This commit is contained in:
@@ -6,7 +6,7 @@ import { buyCardActions } from '../Player/ActionMethods';
|
|||||||
import { hasMaxReserved, reserveCard } from '../Player/ActionMethods/reserveCardActions';
|
import { hasMaxReserved, reserveCard } from '../Player/ActionMethods/reserveCardActions';
|
||||||
const { buyCard, tooExpensive } = buyCardActions;
|
const { buyCard, tooExpensive } = buyCardActions;
|
||||||
|
|
||||||
export default function Card({ data, state, setState, reserved = false }: CardProps) {
|
export default function Card({ data, state, setState, reserved = false, collapsed = false }: CardProps) {
|
||||||
const currentPlayer = useCurrentPlayer(state);
|
const currentPlayer = useCurrentPlayer(state);
|
||||||
if (!data || !currentPlayer) return <div className="card"></div>;
|
if (!data || !currentPlayer) return <div className="card"></div>;
|
||||||
|
|
||||||
@@ -18,7 +18,7 @@ export default function Card({ data, state, setState, reserved = false }: CardPr
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<div className='card' key={v4()}>
|
<div className='card' key={v4()}>
|
||||||
<img src={data.image} loading="lazy" />
|
{ collapsed ? <div className={`img-placeholder-${data.gemValue}`}></div> : <img src={data.image} loading="lazy" /> }
|
||||||
<div className={reserved ? `foreground-${data.gemValue}` : 'foreground'}>
|
<div className={reserved ? `foreground-${data.gemValue}` : 'foreground'}>
|
||||||
<section className="card-top-section">
|
<section className="card-top-section">
|
||||||
<p>{data.gemValue.toUpperCase()}</p>
|
<p>{data.gemValue.toUpperCase()}</p>
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
display: flex;
|
display: flex;
|
||||||
flex-flow: column nowrap;
|
flex-flow: column nowrap;
|
||||||
margin: 1rem 0;
|
margin: 1rem 0;
|
||||||
width: 55vw;
|
width: 45vw;
|
||||||
|
|
||||||
&.collapsed {
|
&.collapsed {
|
||||||
width: 15vw;
|
width: 15vw;
|
||||||
@@ -22,12 +22,12 @@
|
|||||||
|
|
||||||
.card-row-cards-visible {
|
.card-row-cards-visible {
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-flow: row nowrap;
|
flex-flow: row wrap;
|
||||||
|
justify-content: right;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
justify-content: space-around;
|
|
||||||
|
|
||||||
.card {
|
.card {
|
||||||
width: 25%;
|
width: 35%;
|
||||||
height: 40vh;
|
height: 40vh;
|
||||||
border: 2px solid black;
|
border: 2px solid black;
|
||||||
|
|
||||||
|
|||||||
@@ -37,7 +37,7 @@ export default function CardRow({tier, state, setState}: CardRowProps) {
|
|||||||
<p>Remaining: {state.gameboard.deck[typedTier].length}</p>
|
<p>Remaining: {state.gameboard.deck[typedTier].length}</p>
|
||||||
</div>
|
</div>
|
||||||
{ cards && cards.map((cardData: CardData) => {
|
{ cards && cards.map((cardData: CardData) => {
|
||||||
return <Card key={v4()} data={cardData} state={state} setState={setState} />
|
return <Card key={v4()} data={cardData} state={state} setState={setState} collapsed={collapsed} />
|
||||||
})}
|
})}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -1,31 +1,37 @@
|
|||||||
.gameboard {
|
.gameboard {
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-flow: row nowrap;
|
flex-flow: column nowrap;
|
||||||
align-items: flex-start;
|
align-items: flex-start;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
|
|
||||||
background-color: rgb(57, 57, 65);
|
background-color: rgb(57, 57, 65);
|
||||||
|
width: 90vw;
|
||||||
|
padding: 0 18px 12px;
|
||||||
|
|
||||||
|
#round-marker {
|
||||||
|
padding-left: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.gameboard-columns {
|
||||||
|
display: flex;
|
||||||
|
flex-flow: row nowrap;
|
||||||
|
justify-content: center;
|
||||||
|
align-items: flex-start;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
|
|
||||||
section {
|
section {
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-flow: column nowrap;
|
flex-flow: column nowrap;
|
||||||
align-items: center;
|
|
||||||
justify-content: center;
|
|
||||||
margin: 1rem;
|
|
||||||
padding: 1rem;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.gameboard-left {
|
.gameboard-left {
|
||||||
align-items: flex-start;
|
align-items: flex-start;
|
||||||
|
width: 50%;
|
||||||
}
|
}
|
||||||
|
|
||||||
.gameboard-right {
|
.gameboard-right {
|
||||||
max-width: 30vw;
|
justify-content: flex-end;
|
||||||
align-items: flex-end;
|
width: 50%;
|
||||||
}
|
}
|
||||||
|
|
||||||
.round-marker {
|
|
||||||
font-size: 1.5rem;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -87,19 +87,19 @@ export default function Gameboard({ state, setState }: StateProps) {
|
|||||||
} else {
|
} else {
|
||||||
setView(
|
setView(
|
||||||
<div className="gameboard">
|
<div className="gameboard">
|
||||||
|
<h2 id="round-marker">Round: {state.round}</h2>
|
||||||
|
<div className="gameboard-columns">
|
||||||
<section className="gameboard-left">
|
<section className="gameboard-left">
|
||||||
<h2>Round: {state.round}</h2>
|
|
||||||
<Nobles state={state} setState={setState} />
|
<Nobles state={state} setState={setState} />
|
||||||
<CardRow tier={3} state={state} setState={setState} />
|
<CardRow tier={3} state={state} setState={setState} />
|
||||||
<CardRow tier={2} state={state} setState={setState} />
|
<CardRow tier={2} state={state} setState={setState} />
|
||||||
<CardRow tier={1} state={state} setState={setState} />
|
<CardRow tier={1} state={state} setState={setState} />
|
||||||
</section>
|
</section>
|
||||||
<section className="gameboard-right">
|
<section className="gameboard-right">
|
||||||
<SelectionView state={state} setState={setState} />
|
<AllPlayers state={state} setState={setState} liftSelection={liftSelection} />
|
||||||
<AvailableChips state={state} setState={setState} liftSelection={liftSelection} />
|
|
||||||
<AllPlayers state={state} setState={setState} />
|
|
||||||
</section>
|
</section>
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}, [state]);
|
}, [state]);
|
||||||
|
|||||||
@@ -4,21 +4,26 @@
|
|||||||
|
|
||||||
.all-players {
|
.all-players {
|
||||||
display: flex;
|
display: flex;
|
||||||
|
flex-flow: column nowrap;
|
||||||
justify-content: space-around;
|
justify-content: space-around;
|
||||||
max-width: 80vw;
|
align-items: center;
|
||||||
padding: 0 2rem;
|
|
||||||
background-color: rgb(237, 213, 156);
|
background-color: rgb(237, 213, 156);
|
||||||
color: black;
|
color: black;
|
||||||
|
|
||||||
.player-ui {
|
.player-ui {
|
||||||
width: 30vw;
|
|
||||||
p {
|
|
||||||
margin: 1rem;
|
|
||||||
}
|
|
||||||
.subheader {
|
.subheader {
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
background-color:rgb(172, 149, 94);
|
||||||
|
margin: 1rem 0;
|
||||||
|
padding: 0 2rem;
|
||||||
|
|
||||||
|
.turn-and-action-based {
|
||||||
|
display: flex;
|
||||||
|
flex-flow: row nowrap;
|
||||||
|
}
|
||||||
|
|
||||||
.resources {
|
.resources {
|
||||||
.player-chips-enum {
|
.player-chips-enum {
|
||||||
display: flex;
|
display: flex;
|
||||||
|
|||||||
@@ -1,15 +1,29 @@
|
|||||||
import { v4 } from "uuid";
|
import { v4 } from "uuid";
|
||||||
import Player from "./Player";
|
import Player from "./Player";
|
||||||
import { PlayerData } from "../../util/types";
|
import { PlayerData } from "../../util/types";
|
||||||
import { StateProps } from "../../util/propTypes";
|
import { ResourceProps } from "../../util/propTypes";
|
||||||
import "./AllPlayers.scss"
|
import "./AllPlayers.scss"
|
||||||
|
import AvailableChips from "../Resources/AvailableChips";
|
||||||
|
import SelectionView from "../Resources/SelectionView";
|
||||||
|
import { useEffect, useState } from "react";
|
||||||
|
import { useCurrentPlayer } from "../../hooks/useCurrentPlayer";
|
||||||
|
|
||||||
|
export default function AllPlayers({ state, setState, liftSelection }: ResourceProps) {
|
||||||
|
const [playerView, setPlayerView] = useState<JSX.Element>();
|
||||||
|
|
||||||
export default function AllPlayers({ state, setState }: StateProps) {
|
|
||||||
const playerPool = state.players?.map((player: PlayerData) => <Player key={v4()} player={player} state={state} setState={setState} />);
|
const playerPool = state.players?.map((player: PlayerData) => <Player key={v4()} player={player} state={state} setState={setState} />);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
const currentPlayer = useCurrentPlayer(state);
|
||||||
|
if (!currentPlayer) return;
|
||||||
|
setPlayerView(<Player key={v4()} player={currentPlayer} state={state} setState={setState} />);
|
||||||
|
}, [state]);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="all-players">
|
<div className="all-players">
|
||||||
{ playerPool }
|
<SelectionView state={state} setState={setState} />
|
||||||
|
<AvailableChips state={state} setState={setState} liftSelection={liftSelection} />
|
||||||
|
{ playerView }
|
||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@@ -52,14 +52,11 @@ export default function Player({ player, state, setState }: PlayerProps) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className={dynamic && dynamic.turnActive ? 'player-ui' : 'hidden'} key={v4()}>
|
<div className="player-ui" key={v4()}>
|
||||||
<p className="subheader">Name: {player.name} {player.starter && "(round starter)"}</p>
|
<p className="subheader">Name: {player.name} {player.starter && "(round starter)"}</p>
|
||||||
|
|
||||||
{/* Dynamic data from state */}
|
|
||||||
<section className="turn-and-action-based">
|
|
||||||
<p>Score: {dynamic && dynamic.points}</p>
|
<p>Score: {dynamic && dynamic.points}</p>
|
||||||
|
|
||||||
{/* Player actions */}
|
<section className="turn-and-action-based">
|
||||||
<button
|
<button
|
||||||
disabled={(dynamic && hasMaxChips(dynamic)) || (!dynamic?.turnActive)}
|
disabled={(dynamic && hasMaxChips(dynamic)) || (!dynamic?.turnActive)}
|
||||||
onClick={() => handleClick(0)}>
|
onClick={() => handleClick(0)}>
|
||||||
|
|||||||
@@ -8,16 +8,13 @@ export interface StateProps {
|
|||||||
export interface CardProps extends StateProps {
|
export interface CardProps extends StateProps {
|
||||||
data: CardData
|
data: CardData
|
||||||
reserved?: boolean
|
reserved?: boolean
|
||||||
|
collapsed?: boolean
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface CardRowProps extends StateProps {
|
export interface CardRowProps extends StateProps {
|
||||||
tier: number
|
tier: number
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface AllPlayersProps extends StateProps {
|
|
||||||
setActionState: (value: SetActionType, player?: PlayerData) => void
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface PlayerProps extends StateProps {
|
export interface PlayerProps extends StateProps {
|
||||||
player: PlayerData
|
player: PlayerData
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user