Files
ProcGen/scripts/init.js
T

235 lines
6.3 KiB
JavaScript
Raw Normal View History

2024-04-27 14:46:59 -07:00
const MACROS = {
TILE_SIZE: 30,
COLORS: ['red', 'orange', 'yellow', 'green', 'blue', 'purple', 'white', 'black'],
ROOM_MIN_SIZE: 3,
ROOM_MAX_SIZE: 6,
HALLWAY_WIDTH: 1
};
const inRange = (x, min, max) => (x >= min && x <= max);
window.addEventListener("DOMContentLoaded", () => {
if (!localStorage.getItem('seed')) {
localStorage.setItem('seed', Math.round(Date.now() * Math.random()));
}
MACROS.seed = Number(localStorage.getItem('seed'));
MACROS.numTiles = [Math.floor(window.innerWidth / MACROS.TILE_SIZE), Math.floor(window.innerHeight / MACROS.TILE_SIZE)];
2024-04-28 09:40:13 -07:00
const main = document.querySelector('main.dispGrid');
2024-04-27 14:46:59 -07:00
const r = loadMap();
2024-04-28 09:40:13 -07:00
if (r) {
const edges = Array.from(document.querySelectorAll('.edgePath'));
const edge = edges[getRandInRange(edges.length - 1, 0, false)];
const y = Array.prototype.indexOf.call(main.children, edge.parentNode),
x = Array.prototype.indexOf.call(main.children[y].children, edge); //this does not work, why?
const player = new Player(x, y);
player.save();
return;
}
2024-04-27 14:46:59 -07:00
// create the grid
for (let i = 0; i < MACROS.numTiles[1]; i++) {
const row = document.createElement('div');
row.className = 'gridRow';
row.style.columnCount = MACROS.numTiles[0];
for (let j = 0; j < MACROS.numTiles[0]; j++) {
// const bkcol = MACROS.COLORS[getRandInRange(MACROS.COLORS.length, 0, false)];
const colBox = document.createElement('div');
colBox.className = "colBox";
// colBox.innerText = bkcol;
colBox.style.width = `${MACROS.TILE_SIZE}px`;
colBox.style.height = `${MACROS.TILE_SIZE}px`;
row.appendChild(colBox);
}
main.appendChild(row);
}
generateMap(); // Call the map generation after grid initialization
});
function generateRooms() {
const main = document.querySelector('main.dispGrid');
// idk make one for every 20 tiles
const numRoomsRaw = (MACROS.numTiles[0] / 20) > 1 ? Math.round((MACROS.numTiles[0] / 10)) : 2;
const numRooms = getRandInRange(numRoomsRaw, 2, false);
let rooms = [];
for (let i = 0; i < numRooms; i++) {
const roomWidth = getRandInRange(MACROS.ROOM_MAX_SIZE, MACROS.ROOM_MIN_SIZE, false),
roomHeight = getRandInRange(MACROS.ROOM_MAX_SIZE, MACROS.ROOM_MIN_SIZE, false),
x = getRandInRange(MACROS.numTiles[0] - roomWidth, 0, false),
y = getRandInRange(MACROS.numTiles[1] - roomHeight, 0, false);
rooms.push({ x, y, width: roomWidth, height: roomHeight });
for (let ry = y; ry < y + roomHeight; ry++) {
for (let rx = x; rx < x + roomWidth; rx++) {
main.children[ry].children[rx].classList.add('room');
}
}
}
return rooms;
}
/** will return the coords of the end of the path */
function drawLineToRoom(x1, y1, x2, y2) {
let xret = x1, yret = y1;
const main = document.querySelector('main.dispGrid');
// Connect horizontally from room1 to room2
while (x1 !== x2) {
if (main.children[y1]?.children[x1]) {
main.children[y1].children[x1].classList.add('path');
xret = x1;
}
x1 += (x2 > x1) ? 1 : -1; // Increment or decrement to move towards x2
}
// Once x1 is aligned with x2, connect vertically
while (y1 !== y2) {
if (main.children[y1]?.children[x1]) {
main.children[y1].children[x1].classList.add('path');
yret = y1;
}
y1 += (y2 > y1) ? 1 : -1; // Increment or decrement to move towards y2
}
return {x: xret, y: yret};
}
function getRandomEdgePoint() {
const width = window.innerWidth;
const height = window.innerHeight;
let x, y;
// Choose a random edge: 0 = top, 1 = right, 2 = bottom, 3 = left
const edge = Math.floor(Math.random() * 4);
console.log(edge);
switch (edge) {
case 0: // Top edge
x = Math.random() * width;
y = 0;
break;
case 1: // Right edge
x = width;
y = Math.random() * height;
break;
case 2: // Bottom edge
x = Math.random() * width;
y = height;
break;
case 3: // Left edge
x = 0;
y = Math.random() * height;
break;
}
return { x: Math.round(x), y: Math.round(y) };
}
const calculateDistance = (point1, point2) => Math.sqrt(Math.pow(point2.x - point1.x, 2) + Math.pow(point2.y - point1.y, 2));
function findClosestRoom(edgePoint, rooms) {
let closestRoom = null;
let minDistance = Infinity;
rooms.forEach(room => {
const roomCenter = {
x: room.x + room.width / 2,
y: room.y + room.height / 2
};
const distance = calculateDistance(edgePoint, roomCenter);
if (distance < minDistance) {
minDistance = distance;
closestRoom = room;
}
});
return closestRoom;
}
function connectRooms(room1, room2) {
let x1 = room1.x + Math.floor(room1.width / 2);
let y1 = room1.y + Math.floor(room1.height / 2);
let x2 = room2.x + Math.floor(room2.width / 2);
let y2 = room2.y + Math.floor(room2.height / 2);
drawLineToRoom(x1, y1, x2, y2);
}
const saveMap = () => {
localStorage.setItem('savedMap', document.querySelector('main.dispGrid').innerHTML);
}
const loadMap = () => {
const htmlToLoad = localStorage.getItem('savedMap');
if (htmlToLoad) {
document.querySelector('main.dispGrid').innerHTML = htmlToLoad;
return true;
}
return false;
}
function reset(player = false) {
localStorage.clear();
if (player) player.save();
window.location.reload();
}
function generateMap() {
const rooms = generateRooms();
for (let i = 0; i < rooms.length - 1; i++) {
connectRooms(rooms[i], rooms[i + 1]);
}
if (!localStorage.getItem('outerEdges')) {
const outerEdges = [];
const rToEMax = Math.round(Math.random() * rooms.length);
for (let i = 0; i < getRandInRange(rToEMax > 2 ? rToEMax : 2, 2, false); i++) {
const {x, y} = getRandomEdgePoint();
// Find the closest room to this edge point
const closestRoom = findClosestRoom({x, y}, rooms);
// Draw a line from the edge point to the center of the closest room
outerEdges.push(drawLineToRoom(closestRoom.x, closestRoom.y, x, y));
}
localStorage.setItem('outerEdges', JSON.stringify(outerEdges));
}
const edges = JSON.parse(localStorage.getItem('outerEdges'));
const main = document.querySelector('main.dispGrid');
for (const edge of edges) {
main.children[edge.y].children[edge.x].classList.add('edgePath');
}
const edge = edges[getRandInRange(edges.length - 1, 0, false)];
2024-04-28 09:40:13 -07:00
const player = new Player(edge.x, edge.y, rooms);
2024-04-27 14:46:59 -07:00
player.save();
saveMap();
}
function getRandInRange(upper, lower = 0, asFloat = true) {
const num = Math.random() * (upper - lower) + lower;
return asFloat ? num : Math.floor(num);
}