import { TableBody, TableRow } from "@mui/material"; import * as React from "react"; import { ActiveFragment } from "../ActiveFragment"; import { calculateGrid } from "../Helper"; import { IStaneksGift } from "../IStaneksGift"; import { Cell } from "./Cell"; interface IProps { width: number; height: number; ghostGrid: number[][]; gift: IStaneksGift; enter(i: number, j: number): void; click(i: number, j: number): void; } function randomColor(fragment: ActiveFragment): string { // Can't set Math.random seed so copy casino. TODO refactor both RNG later. let s1 = Math.pow((fragment.x + 1) * (fragment.y + 1), 10); let s2 = s1; let s3 = s1; const colors = []; for (let i = 0; i < 3; i++) { s1 = (171 * s1) % 30269; s2 = (172 * s2) % 30307; s3 = (170 * s3) % 30323; colors.push((s1 / 30269.0 + s2 / 30307.0 + s3 / 30323.0) % 1.0); } return `rgb(${colors[0] * 256}, ${colors[1] * 256}, ${colors[2] * 256})`; } export function Grid(props: IProps): React.ReactElement { const activeGrid = calculateGrid(props.gift); function color(worldX: number, worldY: number): string { if (props.ghostGrid[worldX][worldY] && activeGrid[worldX][worldY]) return "red"; if (props.ghostGrid[worldX][worldY]) return "white"; if (activeGrid[worldX][worldY]) { const fragment = props.gift.fragmentAt(worldX, worldY); if (!fragment) throw new Error("ActiveFragment should not be null"); return randomColor(fragment); } return ""; } // switch the width/length to make axis consistent. const elems = []; for (let j = 0; j < props.height; j++) { const cells = []; for (let i = 0; i < props.width; i++) { cells.push( props.enter(i, j)} onClick={() => props.click(i, j)} color={color(i, j)} />, ); } elems.push({cells}); } return {elems}; }