A daily game

Implement daily game logic

+23 -5
+4
src/lib/game.ts
··· 52 52 53 53 return grouped; 54 54 } 55 + 56 + export function generateSeedForDay(day: Date) { 57 + return `${day.getFullYear()}${day.getMonth().toString().padStart(2, "0")}${day.getDate().toString().padStart(2, "0")}`; 58 + }
+9
src/lib/hash.ts
··· 1 + const encoder = new TextEncoder(); 2 + 3 + export async function sha256(input: string) { 4 + const digest = await crypto.subtle.digest( 5 + { name: "SHA-256" }, 6 + encoder.encode(input), 7 + ); 8 + return new Uint8Array(digest); 9 + }
+10 -5
src/pages/index.tsx
··· 1 - import { arrayOfSize } from "@/lib/game"; 1 + import { arrayOfSize, generateSeedForDay } from "@/lib/game"; 2 2 import { Game } from "../components/game"; 3 3 import { HydrationProvider } from "@/components/providers/hydration-provider"; 4 4 import { defaultHeight, defaultVariants, defaultWidth } from "@/lib/state"; 5 + import { sha256 } from "@/lib/hash"; 5 6 6 - const board = arrayOfSize(defaultWidth * defaultHeight).map(() => 7 - Math.floor(Math.random() * defaultVariants.length), 8 - ); 7 + async function board(seed: string) { 8 + const bytes = Array.from(await sha256(seed)); 9 + return arrayOfSize(defaultWidth * defaultHeight).map((_, i) => 10 + Math.floor(bytes[i]! % defaultVariants.length), 11 + ); 12 + } 9 13 10 14 export default async function HomePage() { 15 + const seed = generateSeedForDay(new Date()); 11 16 const props = { 12 17 width: defaultWidth, 13 18 height: defaultHeight, 14 19 variants: defaultVariants, 15 - board, 20 + board: await board(seed), 16 21 }; 17 22 return ( 18 23 <HydrationProvider {...props}>