|
|
|
|
|
class GridPopulator { |
|
constructor(gridContainerId, initialUsers = 10) { |
|
this.gridContainer = document.getElementById(gridContainerId); |
|
this.users = new Map(); |
|
this.nextUserId = 1; |
|
this.updateInterval = 2000; |
|
this.maxUsers = 15; |
|
this.minUsers = 5; |
|
|
|
|
|
this.gridContainer.className = "grid gap-4 p-4"; |
|
|
|
|
|
for (let i = 0; i < initialUsers; i++) { |
|
this.addUser(); |
|
} |
|
|
|
this.updateGridLayout(); |
|
this.startUpdates(); |
|
} |
|
|
|
generateUserName() { |
|
return `${this.nextUserId}`; |
|
} |
|
|
|
updateGridLayout() { |
|
const cols = Math.ceil(Math.sqrt(this.users.size)); |
|
this.gridContainer.style.gridTemplateColumns = `repeat(${cols}, minmax(0, 1fr))`; |
|
} |
|
|
|
addUser() { |
|
const personality = window.personalitySystem.getRandomPersonality(); |
|
const square = window.personalitySystem.createPlayerSquare(personality); |
|
const userId = this.nextUserId++; |
|
|
|
|
|
const nameSpan = square.querySelector('.text-xs'); |
|
nameSpan.textContent = this.generateUserName(); |
|
|
|
this.users.set(userId, { |
|
element: square, |
|
personality: personality |
|
}); |
|
|
|
this.gridContainer.appendChild(square); |
|
this.updateGridLayout(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return userId; |
|
} |
|
|
|
removeUser() { |
|
if (this.users.size <= this.minUsers) return; |
|
|
|
const userIds = Array.from(this.users.keys()); |
|
const randomId = userIds[Math.floor(Math.random() * userIds.length)]; |
|
const user = this.users.get(randomId); |
|
|
|
user.element.classList.add('pop-out'); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
setTimeout(() => { |
|
|
|
|
|
|
|
}, 300); |
|
} |
|
|
|
startUpdates() { |
|
setInterval(() => { |
|
const shouldAdd = Math.random() > 0.5; |
|
|
|
if (shouldAdd && this.users.size < this.maxUsers) { |
|
this.addUser(); |
|
} else if (this.users.size > this.minUsers) { |
|
this.removeUser(); |
|
} |
|
|
|
|
|
this.users.forEach((user, userId) => { |
|
if (Math.random() < 0.1) { |
|
const newPersonality = window.personalitySystem.getRandomPersonality(); |
|
if (newPersonality !== user.personality) { |
|
const event = new CustomEvent('personalityUpdated', { |
|
detail: { personality: newPersonality } |
|
}); |
|
user.element.dispatchEvent(event); |
|
user.personality = newPersonality; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
} |
|
} |
|
}); |
|
}, this.updateInterval); |
|
} |
|
} |
|
|
|
|
|
document.addEventListener('DOMContentLoaded', () => { |
|
|
|
if (window.personalitySystem) { |
|
window.gridPopulator = new GridPopulator('grid-container'); |
|
} else { |
|
console.error('Personality system must be initialized before grid populator'); |
|
} |
|
}); |