import * as THREE from "three";
import { minTileIndex, maxTileIndex } from "../constants";
import { type Row, type RowType } from "../types";
export function generateRows(amount: number): Row[] {
for (let i = 0; i < amount; i++) {
const rowData = generateRow();
function generateRow(): Row {
const type: RowType = randomElement(["car", "truck", "forest"]);
if (type === "car") return generateCarLaneMetadata();
if (type === "truck") return generateTruckLaneMetadata();
return generateForesMetadata();
function randomElement<T>(array: T[]): T {
return array[Math.floor(Math.random() * array.length)];
function generateForesMetadata(): Row {
const occupiedTiles = new Set<number>();
const trees = Array.from({ length: 4 }, () => {
tileIndex = THREE.MathUtils.randInt(minTileIndex, maxTileIndex);
} while (occupiedTiles.has(tileIndex));
occupiedTiles.add(tileIndex);
const height = randomElement([20, 45, 60]);
return { tileIndex, height };
return { type: "forest", trees };
function generateCarLaneMetadata(): Row {
const direction = randomElement([true, false]);
const speed = randomElement([125, 156, 188]);
const occupiedTiles = new Set<number>();
const vehicles = Array.from({ length: 3 }, () => {
initialTileIndex = THREE.MathUtils.randInt(
} while (occupiedTiles.has(initialTileIndex));
occupiedTiles.add(initialTileIndex - 1);
occupiedTiles.add(initialTileIndex);
occupiedTiles.add(initialTileIndex + 1);
const color: THREE.ColorRepresentation = randomElement([
0xa52523, 0xbdb638, 0x78b14b,
return { initialTileIndex, color };
return { type: "car", direction, speed, vehicles };