2026-04-02 15:59:27 +08:00
|
|
|
import {RNG} from "@/utils/rng";
|
2026-04-01 13:36:16 +08:00
|
|
|
|
2026-04-03 15:00:25 +08:00
|
|
|
export type Part<TMeta = {}> = {
|
2026-04-02 13:52:15 +08:00
|
|
|
id: string;
|
2026-04-02 13:58:52 +08:00
|
|
|
|
|
|
|
|
sides?: number;
|
|
|
|
|
side?: number;
|
|
|
|
|
|
2026-04-01 13:36:16 +08:00
|
|
|
alignments?: string[];
|
|
|
|
|
alignment?: string;
|
2026-04-03 12:46:02 +08:00
|
|
|
regionId: string;
|
2026-04-01 13:36:16 +08:00
|
|
|
position: number[];
|
2026-04-03 15:00:25 +08:00
|
|
|
} & TMeta;
|
2026-04-01 13:36:16 +08:00
|
|
|
|
2026-04-03 15:00:25 +08:00
|
|
|
export function flip<TMeta>(part: Part<TMeta>) {
|
2026-04-03 12:46:02 +08:00
|
|
|
if(!part.sides) return;
|
|
|
|
|
part.side = ((part.side || 0) + 1) % part.sides;
|
2026-04-01 13:36:16 +08:00
|
|
|
}
|
|
|
|
|
|
2026-04-03 15:00:25 +08:00
|
|
|
export function flipTo<TMeta>(part: Part<TMeta>, side: number) {
|
2026-04-03 12:46:02 +08:00
|
|
|
if(!part.sides || side >= part.sides) return;
|
|
|
|
|
part.side = side;
|
2026-04-01 13:36:16 +08:00
|
|
|
}
|
|
|
|
|
|
2026-04-03 15:00:25 +08:00
|
|
|
export function roll<TMeta>(part: Part<TMeta>, rng: RNG) {
|
2026-04-03 12:46:02 +08:00
|
|
|
if(!part.sides) return;
|
|
|
|
|
part.side = rng.nextInt(part.sides);
|
2026-04-01 17:48:40 +08:00
|
|
|
}
|
2026-04-03 15:00:25 +08:00
|
|
|
|
2026-04-03 17:36:25 +08:00
|
|
|
export function findPartById<TMeta>(parts: Record<string, Part<TMeta>>, id: string): Part<TMeta> | undefined {
|
|
|
|
|
return parts[id];
|
2026-04-03 15:00:25 +08:00
|
|
|
}
|
|
|
|
|
|
2026-04-03 17:36:25 +08:00
|
|
|
export function isCellOccupied<TMeta>(parts: Record<string, Part<TMeta>>, regionId: string, position: number[]): boolean {
|
2026-04-03 15:00:25 +08:00
|
|
|
const posKey = position.join(',');
|
2026-04-03 17:36:25 +08:00
|
|
|
return Object.values(parts).some(p => p.regionId === regionId && p.position.join(',') === posKey);
|
2026-04-03 15:00:25 +08:00
|
|
|
}
|
|
|
|
|
|
2026-04-03 17:36:25 +08:00
|
|
|
export function getPartAtPosition<TMeta>(parts: Record<string, Part<TMeta>>, regionId: string, position: number[]): Part<TMeta> | undefined {
|
2026-04-03 15:00:25 +08:00
|
|
|
const posKey = position.join(',');
|
2026-04-03 17:36:25 +08:00
|
|
|
return Object.values(parts).find(p => p.regionId === regionId && p.position.join(',') === posKey);
|
2026-04-03 15:00:25 +08:00
|
|
|
}
|