import { aWeather, paWeather, pyWeather, hWeather } from "./stores"; const WEATHER = { FAIR: 0, SHOWERS: 1, GALES: 2, BLIZZARDS: 3, HEAT: 4, THUNDER: 5, GLOOM: 6, SNOW: 7, FOG: 8, UMBRAL_WIND: 9, }; // Anemos: 30/Fair, 30/Gales, 30/Showers, 10/Snowy const ANEMOS_WEATHER = [ [WEATHER.FAIR, 30], [WEATHER.GALES, 30], [WEATHER.SHOWERS, 30], [WEATHER.SNOW, 10], ]; // Pagos: 10/Fair, 18/Fog, 18/Heat, 18/Snow, 18/Thunder, 18/Blizzards const PAGOS_WEATHER = [ [WEATHER.FAIR, 10], [WEATHER.FOG, 18], [WEATHER.HEAT, 18], [WEATHER.SNOW, 18], [WEATHER.THUNDER, 18], [WEATHER.BLIZZARDS, 18], ]; // Pyros: 10/Fair, 18/Heat, 18/Thunder, 18/Blizzards, 18/Umbral Wind, 18/Snow const PYROS_WEATHER = [ [WEATHER.FAIR, 10], [WEATHER.HEAT, 18], [WEATHER.THUNDER, 18], [WEATHER.BLIZZARDS, 18], [WEATHER.UMBRAL_WIND, 18], [WEATHER.SNOW, 18], ]; // Hydatos: 12/Fair, 22/Showers, 22/Gloom, 22/Thunder, 22/Snow const HYDATOS_WEATHER = [ [WEATHER.FAIR, 12], [WEATHER.SHOWERS, 22], [WEATHER.GLOOM, 22], [WEATHER.THUNDER, 22], [WEATHER.SNOW, 22], ]; function getWeatherName(weather) { switch (weather) { case 0: return "Fair"; case 1: return "Showers"; case 2: return "Gales"; case 3: return "Blizzards"; case 4: return "Heat"; case 5: return "Thunder"; case 6: return "Gloom"; case 7: return "Snow"; case 8: return "Fog"; case 9: return "Umbral Wind"; default: return "Unknown"; } } function getSeed(date = new Date()) { return Math.floor(date.getTime() / 1400000); } function hash(seed = getSeed()) { const base = Math.floor(seed / 3) * 100 + ((seed + 1) % 3) * 8; const step1 = ((base << 11) ^ base) >>> 0; const step2 = ((step1 >>> 8) ^ step1) >>> 0; return step2 % 100; } function hashSeq(seed = getSeed(), count = 5) { const hashes = []; for (let i = 0; i < count; ++i) { hashes.push(hash(seed + i)); } return hashes; } function getWeather(rates, hash = hashSeed()) { let total = 0; for (const [weather, chance] of rates) { if ((total += chance) > hash) { return weather; } } return WEATHER.FAIR; } function forecast(rates, name, seed = getSeed(), count = 10) { const res = []; let prevHash = hash(seed - 1); let prevWeather = getWeather(rates, prevHash); for (let i = 0; res.length < count && i < 100000; ++i) { const currHash = hash(seed); const currWeather = getWeather(rates, currHash); res.push({ zone: name, prevWeather, currWeather, weatherName: getWeatherName(currWeather), seed, date: new Date(seed * 1400000), }); prevHash = currHash; prevWeather = currWeather; ++seed; } return res; } export default { WEATHER, ANEMOS_WEATHER, PAGOS_WEATHER, PYROS_WEATHER, HYDATOS_WEATHER, getWeather, forecast, getWeatherName, };