diff --git a/src/components/game/map/Effects.vue b/src/components/game/map/Effects.vue index 955bb64..8298767 100644 --- a/src/components/game/map/Effects.vue +++ b/src/components/game/map/Effects.vue @@ -15,7 +15,8 @@ const LIGHT_CONFIG = { SUNRISE_HOUR: 6, SUNSET_HOUR: 20, DAY_STRENGTH: 100, - NIGHT_STRENGTH: 30 + NIGHT_STRENGTH: 30, + TRANSITION_HOURS: 3 } // Stores and refs @@ -23,7 +24,6 @@ const gameStore = useGameStore() const mapStore = useMapStore() const mapStorage = new MapStorage() const sceneRef = ref(null) -const mapEffectsReady = ref(false) const mapObject = ref(null) // Effect objects @@ -61,7 +61,6 @@ watch( () => mapStore.mapId, async (newMapId) => { if (newMapId) { - mapEffectsReady.value = false await loadMap() updateScene() } @@ -107,54 +106,54 @@ const updateScene = () => { {} ) as { [key: string]: number } - // Only update effects once mapEffects are loaded - if (!mapEffectsReady.value) { - if (mapObject.value) { - mapEffectsReady.value = true - } else { - return - } - } - - const finalEffects = - mapEffects && Object.keys(mapEffects).length - ? mapEffects - : { - light: timeBasedLight, - rain: weatherState.value.rainPercentage, - fog: weatherState.value.fogDensity * 100 - } + const finalEffects = {...mapEffects, + light: timeBasedLight, + rain: weatherState.value.rainPercentage, + fog: weatherState.value.fogDensity * 100 } + console.log(finalEffects) applyEffects(finalEffects) } const applyEffects = (effectValues: any) => { if (effects.light.value) { - const darkness = 1 - (effectValues.light ?? 100) / 100 + const darkness = 1 - (effectValues.light) / 100 effects.light.value.clear().fillStyle(0x000000, darkness).fillRect(0, 0, window.innerWidth, window.innerHeight) } - if (effects.rain.value) { - const strength = effectValues.rain ?? 0 - strength > 0 ? effects.rain.value.start().setQuantity(Math.floor((strength / 100) * 10)) : effects.rain.value.stop() - } + if (effects.rain) + effects.rain.value.start().setQuantity(effectValues.rain / 10) + else effects.rain.value.stop() - if (effects.fog.value) { - effects.fog.value.setAlpha((effectValues.fog ?? 0) / 100) - } + effects.fog.value.setAlpha(effectValues.fog / 100) } +// Linear Interpolation +// moves a value between x and y where a is the percentage of progress the value has made in moving from x to y +// a = 0 return x +// a = 0.5 return (x+y)/2 +// a = 1 return y +const lerp = (x,y,a) => x * (1-a) + y * a + const calculateLightStrength = (time: Date): number => { const hour = time.getHours() const minute = time.getMinutes() - if (hour >= LIGHT_CONFIG.SUNSET_HOUR || hour < LIGHT_CONFIG.SUNRISE_HOUR) return LIGHT_CONFIG.NIGHT_STRENGTH - - if (hour > LIGHT_CONFIG.SUNRISE_HOUR && hour < LIGHT_CONFIG.SUNSET_HOUR - 2) return LIGHT_CONFIG.DAY_STRENGTH - - if (hour === LIGHT_CONFIG.SUNRISE_HOUR) return LIGHT_CONFIG.NIGHT_STRENGTH + ((LIGHT_CONFIG.DAY_STRENGTH - LIGHT_CONFIG.NIGHT_STRENGTH) * minute) / 60 - const totalMinutes = (hour - (LIGHT_CONFIG.SUNSET_HOUR - 2)) * 60 + minute - return LIGHT_CONFIG.DAY_STRENGTH - (LIGHT_CONFIG.DAY_STRENGTH - LIGHT_CONFIG.NIGHT_STRENGTH) * (totalMinutes / 120) + + //Transition from daylight to night + if (hour >= LIGHT_CONFIG.SUNSET_HOUR - LIGHT_CONFIG.TRANSITION_HOURS && hour < LIGHT_CONFIG.SUNSET_HOUR) + return lerp(LIGHT_CONFIG.DAY_STRENGTH, LIGHT_CONFIG.NIGHT_STRENGTH, + (hour-(LIGHT_CONFIG.SUNSET_HOUR-LIGHT_CONFIG.TRANSITION_HOURS))/LIGHT_CONFIG.TRANSITION_HOURS) + + //Transition from sunrise to morning + else if (hour >= LIGHT_CONFIG.SUNRISE_HOUR && hour < LIGHT_CONFIG.SUNRISE_HOUR + LIGHT_CONFIG.TRANSITION_HOURS) + return lerp(LIGHT_CONFIG.NIGHT_STRENGTH, LIGHT_CONFIG.DAY_STRENGTH, + (hour-LIGHT_CONFIG.SUNRISE_HOUR)/LIGHT_CONFIG.TRANSITION_HOURS) + + else if (hour > LIGHT_CONFIG.SUNRISE_HOUR && hour < LIGHT_CONFIG.SUNSET_HOUR) + return LIGHT_CONFIG.DAY_STRENGTH + else + return LIGHT_CONFIG.NIGHT_STRENGTH } // Socket and window handlers @@ -181,7 +180,6 @@ const handleResize = () => { watch( () => mapObject.value, () => { - mapEffectsReady.value = false updateScene() }, { deep: true }