128 lines
4.3 KiB
JavaScript
128 lines
4.3 KiB
JavaScript
// Настройки
|
|
import { state } from '../core/state.js';
|
|
|
|
let settingsPanel = null;
|
|
let dayNightToggle = null;
|
|
|
|
// Weather button IDs in order
|
|
const WEATHER_BTNS = ['weatherClear', 'weatherRain', 'weatherSnow', 'weatherThunder'];
|
|
const WEATHER_ACTIVE_BG = '#3498db';
|
|
const WEATHER_INACTIVE_BG = '#555';
|
|
|
|
function setWeatherButtonActive(activeId) {
|
|
for (const id of WEATHER_BTNS) {
|
|
const btn = document.getElementById(id);
|
|
if (btn) {
|
|
btn.style.background = (id === activeId) ? WEATHER_ACTIVE_BG : WEATHER_INACTIVE_BG;
|
|
}
|
|
}
|
|
}
|
|
|
|
export function initSettings() {
|
|
settingsPanel = document.getElementById('settingsPanel');
|
|
dayNightToggle = document.getElementById('dayNightToggle');
|
|
|
|
if (!settingsPanel) return;
|
|
|
|
const closeBtn = document.getElementById('settingsClose');
|
|
if (closeBtn) {
|
|
closeBtn.addEventListener('click', () => {
|
|
settingsPanel.style.display = 'none';
|
|
});
|
|
}
|
|
|
|
// Day/night cycle toggle
|
|
if (dayNightToggle) {
|
|
dayNightToggle.checked = state.dayNightCycle !== false;
|
|
dayNightToggle.addEventListener('change', () => {
|
|
state.dayNightCycle = dayNightToggle.checked;
|
|
});
|
|
}
|
|
|
|
// Time-of-day slider
|
|
const timeSlider = document.getElementById('timeSlider');
|
|
if (timeSlider) {
|
|
timeSlider.value = Math.round(state.worldTime * 100);
|
|
timeSlider.addEventListener('input', () => {
|
|
state.worldTime = parseInt(timeSlider.value) / 100;
|
|
if (state.dayNightCycle) {
|
|
state.dayNightCycle = false;
|
|
if (dayNightToggle) dayNightToggle.checked = false;
|
|
}
|
|
});
|
|
}
|
|
|
|
// ====== Weather controls (Ясно / Дождь / Снег / Гроза) ======
|
|
const weatherIntensitySlider = document.getElementById('weatherIntensity');
|
|
|
|
// Helper: apply a weather type
|
|
function applyWeather(type) {
|
|
state.weatherType = type;
|
|
state.weatherChangeInterval = Infinity; // Lock weather manually
|
|
|
|
switch (type) {
|
|
case 'clear':
|
|
state.isRaining = false;
|
|
state.rainIntensity = 0;
|
|
if (weatherIntensitySlider) weatherIntensitySlider.value = 0;
|
|
break;
|
|
case 'rain':
|
|
state.isRaining = true;
|
|
state.rainIntensity = parseInt(weatherIntensitySlider?.value || 40) / 100;
|
|
break;
|
|
case 'snow':
|
|
state.isRaining = false; // snow uses its own rendering
|
|
state.rainIntensity = parseInt(weatherIntensitySlider?.value || 40) / 100;
|
|
break;
|
|
case 'thunder':
|
|
state.isRaining = true; // thunder includes rain
|
|
state.rainIntensity = parseInt(weatherIntensitySlider?.value || 60) / 100;
|
|
if (weatherIntensitySlider) weatherIntensitySlider.value = Math.round(state.rainIntensity * 100);
|
|
break;
|
|
}
|
|
|
|
setWeatherButtonActive('weather' + type.charAt(0).toUpperCase() + type.slice(1));
|
|
}
|
|
|
|
// Button handlers
|
|
for (const id of WEATHER_BTNS) {
|
|
const btn = document.getElementById(id);
|
|
if (btn) {
|
|
const weatherType = btn.dataset.weather || id.replace('weather', '').toLowerCase();
|
|
btn.addEventListener('click', () => applyWeather(weatherType));
|
|
}
|
|
}
|
|
|
|
// Intensity slider
|
|
if (weatherIntensitySlider) {
|
|
weatherIntensitySlider.addEventListener('input', () => {
|
|
const val = parseInt(weatherIntensitySlider.value) / 100;
|
|
if (state.weatherType !== 'clear') {
|
|
state.rainIntensity = val;
|
|
if (state.weatherType === 'thunder' || state.weatherType === 'rain') {
|
|
state.isRaining = true;
|
|
}
|
|
}
|
|
});
|
|
}
|
|
|
|
// Listen for toggleSettings custom event
|
|
document.addEventListener('toggleSettings', () => {
|
|
if (settingsPanel) {
|
|
// Sync all controls when panel opens
|
|
if (timeSlider) timeSlider.value = Math.round(state.worldTime * 100);
|
|
if (dayNightToggle) dayNightToggle.checked = state.dayNightCycle !== false;
|
|
if (weatherIntensitySlider) weatherIntensitySlider.value = Math.round(state.rainIntensity * 100);
|
|
// Highlight active weather button
|
|
const wt = state.weatherType || (state.isRaining ? 'rain' : 'clear');
|
|
const activeId = 'weather' + wt.charAt(0).toUpperCase() + wt.slice(1);
|
|
setWeatherButtonActive(activeId);
|
|
settingsPanel.style.display = settingsPanel.style.display === 'none' ? 'block' : 'none';
|
|
}
|
|
});
|
|
}
|
|
|
|
export function isDayNightEnabled() {
|
|
return state.dayNightCycle !== false;
|
|
}
|