tangled
alpha
login
or
join now
emarref.net
/
ticks
0
fork
atom
A daily game
0
fork
atom
overview
issues
pulls
pipelines
Implement daily game logic
Malcolm Fell
5 months ago
9289a371
492ba2d0
+23
-5
3 changed files
expand all
collapse all
unified
split
src
lib
game.ts
hash.ts
pages
index.tsx
+4
src/lib/game.ts
···
52
52
53
53
return grouped;
54
54
}
55
55
+
56
56
+
export function generateSeedForDay(day: Date) {
57
57
+
return `${day.getFullYear()}${day.getMonth().toString().padStart(2, "0")}${day.getDate().toString().padStart(2, "0")}`;
58
58
+
}
+9
src/lib/hash.ts
···
1
1
+
const encoder = new TextEncoder();
2
2
+
3
3
+
export async function sha256(input: string) {
4
4
+
const digest = await crypto.subtle.digest(
5
5
+
{ name: "SHA-256" },
6
6
+
encoder.encode(input),
7
7
+
);
8
8
+
return new Uint8Array(digest);
9
9
+
}
+10
-5
src/pages/index.tsx
···
1
1
-
import { arrayOfSize } from "@/lib/game";
1
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
5
+
import { sha256 } from "@/lib/hash";
5
6
6
6
-
const board = arrayOfSize(defaultWidth * defaultHeight).map(() =>
7
7
-
Math.floor(Math.random() * defaultVariants.length),
8
8
-
);
7
7
+
async function board(seed: string) {
8
8
+
const bytes = Array.from(await sha256(seed));
9
9
+
return arrayOfSize(defaultWidth * defaultHeight).map((_, i) =>
10
10
+
Math.floor(bytes[i]! % defaultVariants.length),
11
11
+
);
12
12
+
}
9
13
10
14
export default async function HomePage() {
15
15
+
const seed = generateSeedForDay(new Date());
11
16
const props = {
12
17
width: defaultWidth,
13
18
height: defaultHeight,
14
19
variants: defaultVariants,
15
15
-
board,
20
20
+
board: await board(seed),
16
21
};
17
22
return (
18
23
<HydrationProvider {...props}>