82 lines
2.1 KiB
JavaScript
82 lines
2.1 KiB
JavaScript
import { SHAPES, shapeToEmoji } from "./emoji.js";
|
|
import { COLORS } from "./color.js";
|
|
import { numberToEmoji } from "./number.js";
|
|
|
|
export let level = 1;
|
|
|
|
export function nextLevel() {
|
|
level = Math.min(level + 1, 3);
|
|
}
|
|
|
|
export function resetLevel() {
|
|
level = 1;
|
|
}
|
|
|
|
export function getGridSize(lvl = level) {
|
|
if (lvl <= 1) return 2;
|
|
if (lvl === 2) return 3;
|
|
return 4;
|
|
}
|
|
|
|
export function getGridPositions(size) {
|
|
const positions = [];
|
|
for (let y = 0; y < size; y++) {
|
|
for (let x = 0; x < size; x++) {
|
|
positions.push([y, x]);
|
|
}
|
|
}
|
|
return positions;
|
|
}
|
|
|
|
export function generateRandomTile(lvl = level) {
|
|
const gridSize = getGridSize(lvl);
|
|
const POSITIONS = getGridPositions(gridSize);
|
|
const index = Math.floor(Math.random() * POSITIONS.length);
|
|
const position = POSITIONS[index];
|
|
|
|
return {
|
|
shape: SHAPES[Math.floor(Math.random() * SHAPES.length)],
|
|
color: COLORS[Math.floor(Math.random() * COLORS.length)],
|
|
number: Math.floor(Math.random() * 10),
|
|
position
|
|
};
|
|
}
|
|
|
|
export function mutateTile(tile, lvl = level) {
|
|
const dimensions = ["shape", "color", "number", "position"];
|
|
const changes = dimensions.filter(() => Math.random() < 0.5);
|
|
|
|
const newTile = { ...tile };
|
|
const POSITIONS = getGridPositions(getGridSize(lvl));
|
|
|
|
for (const dim of changes) {
|
|
switch (dim) {
|
|
case "shape":
|
|
newTile.shape = pickOther(SHAPES, tile.shape);
|
|
break;
|
|
case "color":
|
|
newTile.color = pickOther(COLORS, tile.color);
|
|
break;
|
|
case "number":
|
|
newTile.number = pickOther([...Array(10).keys()], tile.number);
|
|
break;
|
|
case "position":
|
|
newTile.position = pickOther(POSITIONS, tile.position);
|
|
break;
|
|
}
|
|
}
|
|
return newTile;
|
|
}
|
|
|
|
function pickOther(arr, exclude) {
|
|
const options = arr.filter(x => JSON.stringify(x) !== JSON.stringify(exclude));
|
|
return options[Math.floor(Math.random() * options.length)];
|
|
}
|
|
|
|
export function getChangedDimensions(a, b) {
|
|
return ["shape", "color", "number", "position"].filter(dim => {
|
|
return JSON.stringify(a[dim]) !== JSON.stringify(b[dim]);
|
|
});
|
|
}
|
|
|