import { room } from './websim.
js';
// Element references - these are now the *only* elements this script needs to
reference
// as the face setting has moved to avatarManager.js
const settingsContainer = document.getElementById('settings-container');
const settingsBackButton = settingsContainer ?
settingsContainer.querySelector('.back-button') : null;
// Admin Panel Elements (for settings managed here)
const adminPanelContainer = document.getElementById('admin-panel-container');
const speedSlider = adminPanelContainer ?
adminPanelContainer.querySelector('#speed-slider') : null;
const currentSpeedValueSpan = adminPanelContainer ?
adminPanelContainer.querySelector('#current-speed-value') : null;
const flyModeCheckbox = adminPanelContainer ?
adminPanelContainer.querySelector('#fly-mode-checkbox') : null;
// NEW: References for Size Slider
const sizeSlider = adminPanelContainer ? adminPanelContainer.querySelector('#size-
slider') : null;
const currentSizeValueSpan = adminPanelContainer ?
adminPanelContainer.querySelector('#current-size-value') : null;
// --- Settings Logic ---
const SETTINGS_STORAGE_KEY = 'gameNonAvatarSettings';
// Default settings (only non-avatar related here)
const defaultSettings = {
playerSpeed: 0.1, // Match default slider value
flyMode: false, // New default setting for fly mode
playerScale: 1.0, // NEW: Default player scale
};
let currentSettings = { ...defaultSettings };
// Load settings from local storage
function loadSettings() {
const savedSettings = localStorage.getItem(SETTINGS_STORAGE_KEY);
if (savedSettings) {
try {
// Merge saved settings over defaults, ensuring defaults are present
const parsedSettings = JSON.parse(savedSettings);
currentSettings = { ...defaultSettings, ...parsedSettings };
console.log("Non-avatar settings loaded:", currentSettings);
} catch (error) {
console.error("Error loading non-avatar settings from local storage:",
error);
currentSettings = { ...defaultSettings };
}
} else {
console.log("No non-avatar settings found in local storage, using
defaults.");
currentSettings = { ...defaultSettings };
}
// Apply loaded settings to UI immediately after loading
applySettingsToUI();
}
// Save settings to local storage
function saveSettings() {
try {
localStorage.setItem(SETTINGS_STORAGE_KEY,
JSON.stringify(currentSettings));
console.log("Non-avatar settings saved:", currentSettings);
} catch (error) {
console.error("Error saving non-avatar settings to local storage:", error);
}
}
// Apply loaded/current settings to the UI elements
function applySettingsToUI() {
// Apply Speed Slider setting
if (speedSlider && currentSpeedValueSpan) {
// Ensure the loaded value is within the slider's min/max range
const clampedSpeed = Math.max(parseFloat(speedSlider.min),
Math.min(parseFloat(speedSlider.max), currentSettings.playerSpeed));
speedSlider.value = clampedSpeed.toString();
currentSpeedValueSpan.textContent = clampedSpeed.toFixed(2);
console.log("Applied playerSpeed setting to UI:", clampedSpeed);
} else {
console.warn("Speed slider or value span not found, cannot apply
playerSpeed setting to UI.");
}
// Apply Fly Mode setting
if (flyModeCheckbox) {
flyModeCheckbox.checked = currentSettings.flyMode;
console.log("Applied flyMode setting to UI:", currentSettings.flyMode);
} else {
console.warn("Fly mode checkbox not found, cannot apply flyMode setting to
UI.");
}
// NEW: Apply Size Slider setting
if (sizeSlider && currentSizeValueSpan) {
// Ensure the loaded value is within the slider's min/max range
const clampedSize = Math.max(parseFloat(sizeSlider.min),
Math.min(parseFloat(sizeSlider.max), currentSettings.playerScale));
sizeSlider.value = clampedSize.toString();
currentSizeValueSpan.textContent = clampedSize.toFixed(2);
console.log("Applied playerScale setting to UI:", clampedSize);
} else {
console.warn("Size slider or value span not found, cannot apply
playerScale setting to UI.");
}
}
// --- UI Event Listeners for Settings ---
// Speed Slider Listener (moved from gameLogic.js)
if (speedSlider && currentSpeedValueSpan) {
speedSlider.addEventListener('input', () => {
const newSpeed = parseFloat(speedSlider.value);
currentSpeedValueSpan.textContent = newSpeed.toFixed(2);
currentSettings.playerSpeed = newSpeed; // Update the setting value
saveSettings(); // Save settings
// No need to update presence here, gameLogic reads from settings object
console.log("Settings: Player speed changed via UI to:",
currentSettings.playerSpeed);
});
}
// Fly Mode Checkbox Listener (New)
if (flyModeCheckbox) {
flyModeCheckbox.addEventListener('change', () => {
const newFlyModeState = flyModeCheckbox.checked;
currentSettings.flyMode = newFlyModeState; // Update the setting value
saveSettings(); // Save settings
// Update local player presence when fly mode changes
const localClientId = room.clientId;
if (localClientId && room.presence[localClientId]) {
console.log("Settings: Updating local presence with flyMode:",
newFlyModeState);
room.updatePresence({ flyMode: newFlyModeState });
} else {
console.warn("Settings: Websim room or local presence not available,
cannot update presence for flyMode change.");
}
console.log("Settings: Fly mode changed via UI to:",
currentSettings.flyMode);
});
}
// NEW: Size Slider Listener
if (sizeSlider && currentSizeValueSpan) {
sizeSlider.addEventListener('input', () => {
const newSize = parseFloat(sizeSlider.value);
currentSizeValueSpan.textContent = newSize.toFixed(2);
currentSettings.playerScale = newSize; // Update the setting value
saveSettings(); // Save settings
// Update local player presence with the new scale
const localClientId = room.clientId;
if (localClientId && room.presence[localClientId]) {
console.log("Settings: Updating local presence with playerScale:",
newSize);
room.updatePresence({ playerScale: newSize });
} else {
console.warn("Settings: Websim room or local presence not available,
cannot update presence for playerScale change.");
}
console.log("Settings: Player scale changed via UI to:",
currentSettings.playerScale);
});
}
// --- Initialization ---
// Initialize settings: load from storage and apply to UI
function initializeSettings() {
loadSettings();
}
// Export functions needed by other modules
export { initializeSettings, currentSettings as settings };
console.log("Settings handler initialized.");