mnml/client/src/components/game.component.jsx

146 lines
4.0 KiB
JavaScript

const preact = require('preact');
const { STATS, eventClasses, getCombatText, ConstructAvatar } = require('../utils');
// const { animationDivs } = require('../animations');
const GameConstruct = require('./game.construct');
function GamePanel(props) {
const {
game,
account,
resolution,
setActiveSkill,
setActiveConstruct,
sendInstanceState,
sendGameReady,
showLog,
toggleLog,
skip,
quit,
} = props;
if (!game) return <div>...</div>;
// if (showLog) {
// const logs = game.log.map((l, i) => (<div key={i}>{l}</div>)).reverse();
// return (
// <main className="game">
// <div className="instance-hdr">
// <button
// className="game-btn instance-btn instance-ui-btn left"
// onClick={() => toggleLog(!showLog)}>
// Game
// </button>
// <div className="spacer">
// <div>&nbsp;</div>
// </div>
// </div>
// <div className="logs">
// {logs}
// </div>
// </main>
// );
// }
function actionClick() {
if (game.phase === 'Finish') {
sendInstanceState(game.instance);
quit();
return true;
}
if (resolution) {
return skip();
}
return sendGameReady();
}
const otherTeams = game.players.filter(t => t.id !== account.id);
const playerTeam = game.players.find(t => t.id === account.id);
let actionText = 'Ready';
let actionStyles = 'instance-btn instance-ui-btn right';
if (game.phase === 'Finish') actionText = 'Done';
if (resolution) actionText = 'Skip';
if (actionText === 'Ready' && playerTeam.ready) actionStyles += ' ready';
const header = (
<div className="top">
<button
className={actionStyles}
onClick={() => actionClick()}>
{actionText}
</button>
</div>
);
function findConstruct(id) {
const team = game.players.find(t => t.constructs.find(c => c.id === id));
if (team) return team.constructs.find(c => c.id === id);
return null;
}
const zero = Date.parse(game.phase_start);
const now = Date.now();
const end = Date.parse(game.phase_end);
const timerPct = ((now - zero) / (end - zero) * 100);
const displayPct = resolution || game.phase === 'Finish'
? 0
: Math.min(timerPct, 100);
const displayColour = playerTeam.ready
? 'forestgreen'
: timerPct > 80
? 'red'
: 'whitesmoke';
const timerStyles = {
width: `${displayPct}%`,
background: displayColour,
};
const timer = (
<div className="timer-container">
<div className="timer" style={timerStyles} >&nbsp;</div>
</div>
);
function PlayerTeam(team) {
const constructs = team.constructs.map(c =>
<GameConstruct key={c.id} construct={c} player={true} />);
return (
<div className="team player">
{constructs}
</div>
);
}
function OpponentTeam(team) {
const constructs = team.constructs.map(c =>
<GameConstruct key={c.id} construct={c} player={false} />);
return (
<div className="team opponent">
{constructs}
</div>
);
}
const gameClasses = `game ${resolution ? 'resolving': ''}`;
function gameClick(e) {
e.stopPropagation();
setActiveConstruct(null);
}
return (
<main className={gameClasses} onClick={gameClick} >
{header}
{timer}
{otherTeams.map(OpponentTeam)}
{PlayerTeam(playerTeam, setActiveSkill)}
</main>
);
}
module.exports = GamePanel;