From 92dcaeae0c585683f8612e9b01f4344d67c32637 Mon Sep 17 00:00:00 2001
From: xao321 <xao321@hotmail.com>
Date: Wed, 29 May 2024 17:55:09 +0200
Subject: [PATCH] - Made stars less prominent during dawn and dusk - Removed
 Time.nightState since it's unused, and redundant - Reorganised file structure
 slightly - Added weather icons for minimised mobile views - Unset
 $startingseason since it's no longer used after game start - Some file
 cleanup

---
 .../03-compression/dictionaries.js            |   3 -
 game/03-JavaScript/save.js                    |   1 -
 game/03-JavaScript/time.js                    |  27 ++--
 .../weather/01-setup/weather-generation.js    |   5 +
 .../weather/02-main/01-weather.js             |  12 +-
 .../weather/02-main/02-body-temperature.js    |   3 -
 .../00-fadable.js => 00-classes/fadable.js}   |   0
 .../00-orbit.js => 00-classes/orbit.js}       |   0
 .../01-sky.js => 00-classes/sky-canvas.js}    | 123 ------------------
 .../weather-Animation.js}                     |   2 -
 .../weather-AnimationGroup.js}                |   2 -
 .../weather-Effect.js}                        |   2 -
 .../weather-Layer.js}                         |   1 -
 .../03-canvas/01-src/01-main/00-main.js       |  20 +++
 .../01-src/01-main/00-thermometer.js}         |  51 +-------
 .../03-canvas/01-src/01-main/01-events.js     |  88 +++++++++++++
 .../03-canvas/01-src/01-main/02-macros.js     |  41 ++++++
 .../03-canvas/01-src/01-main/03-tooltips.js   |  71 ++++++++++
 .../03-canvas/01-src/01-observables.js        |   6 +-
 .../02-lib/00-effects/effects-clouds.js       |   1 -
 .../02-lib/00-effects/effects-generic.js      |   1 -
 .../02-lib/00-effects/effects-location.js     |   5 +-
 .../02-lib/00-effects/effects-orbitals.js     |   1 -
 .../00-effects/effects-precipitation.js       |   1 -
 .../02-lib/00-effects/effects-sky.js          |   1 -
 .../{docs-layers.txt => 00-docs-layers.txt}   |   0
 .../02-lib/01-layers/banner-canvas-layers.js  |   3 +-
 .../03-canvas/02-lib/01-layers/layer-fog.js   |   1 -
 .../03-canvas/02-lib/01-layers/layer-moon.js  |   1 -
 .../02-lib/01-layers/layer-precipitation.js   |   1 -
 .../03-canvas/02-lib/01-layers/layer-sky.js   |   1 -
 .../02-lib/01-layers/layer-starfield.js       |   3 +-
 .../03-canvas/02-lib/01-layers/layer-sun.js   |   1 -
 game/04-Variables/variables-start2.twee       |   8 +-
 .../04-Variables/variables-versionUpdate.twee |   9 +-
 game/base-system/mobileStats.twee             |   5 +
 game/base-system/overlays/journal.twee        |   2 +-
 game/base-system/overlays/options.twee        |   2 +-
 modules/css/base.css                          |  14 ++
 39 files changed, 274 insertions(+), 245 deletions(-)
 rename game/03-JavaScript/weather/03-canvas/01-src/{01-main/00-fadable.js => 00-classes/fadable.js} (100%)
 rename game/03-JavaScript/weather/03-canvas/01-src/{01-main/00-orbit.js => 00-classes/orbit.js} (100%)
 rename game/03-JavaScript/weather/03-canvas/01-src/{01-main/01-sky.js => 00-classes/sky-canvas.js} (73%)
 rename game/03-JavaScript/weather/03-canvas/01-src/{01-main/00-weather-Animation.js => 00-classes/weather-Animation.js} (98%)
 rename game/03-JavaScript/weather/03-canvas/01-src/{01-main/00-weather-AnimationGroup.js => 00-classes/weather-AnimationGroup.js} (96%)
 rename game/03-JavaScript/weather/03-canvas/01-src/{01-main/00-weather-Effect.js => 00-classes/weather-Effect.js} (98%)
 rename game/03-JavaScript/weather/03-canvas/01-src/{01-main/00-weather-Layer.js => 00-classes/weather-Layer.js} (99%)
 create mode 100644 game/03-JavaScript/weather/03-canvas/01-src/01-main/00-main.js
 rename game/03-JavaScript/weather/{02-main/03-thermometer.js => 03-canvas/01-src/01-main/00-thermometer.js} (59%)
 create mode 100644 game/03-JavaScript/weather/03-canvas/01-src/01-main/01-events.js
 create mode 100644 game/03-JavaScript/weather/03-canvas/01-src/01-main/02-macros.js
 create mode 100644 game/03-JavaScript/weather/03-canvas/01-src/01-main/03-tooltips.js
 rename game/03-JavaScript/weather/03-canvas/02-lib/01-layers/{docs-layers.txt => 00-docs-layers.txt} (100%)

diff --git a/game/00-framework-tools/03-compression/dictionaries.js b/game/00-framework-tools/03-compression/dictionaries.js
index 8dd8b92dbe..b551b956ea 100644
--- a/game/00-framework-tools/03-compression/dictionaries.js
+++ b/game/00-framework-tools/03-compression/dictionaries.js
@@ -1621,9 +1621,6 @@ const DoLCompressorDictionaries = (() => {
 		"stalk_intro",
 		"stall_rejected",
 		"stance",
-		"startday",
-		"starthour",
-		"startingseason",
 		"stat_aphrodisiacs_sold",
 		"stat_lurkers_captured",
 		"stat_panties_stolen",
diff --git a/game/03-JavaScript/save.js b/game/03-JavaScript/save.js
index 9304b8bb5f..10d7a2b8a7 100644
--- a/game/03-JavaScript/save.js
+++ b/game/03-JavaScript/save.js
@@ -887,7 +887,6 @@ function settingsObjects(type) {
 					randomize: "characterTrait",
 				},
 				gamemode: { strings: ["normal", "soft", "hard"], displayName: "Game difficulty:" },
-				startingseason: { strings: ["autumn", "winter", "spring", "summer", "random"], displayName: "Starting season:", randomize: "gameplay" },
 				ironmanmode: { bool: false, displayName: "Ironman mode:" },
 				player: {
 					gender: {
diff --git a/game/03-JavaScript/time.js b/game/03-JavaScript/time.js
index e817b8b49e..8ffe17e43d 100644
--- a/game/03-JavaScript/time.js
+++ b/game/03-JavaScript/time.js
@@ -278,6 +278,10 @@ const Time = (() => {
 		return (date.day === date.lastDayOfMonth && date.hour >= 21) || (date.day === 1 && date.hour < 6);
 	}
 
+	function getSeason(date) {
+		return date.month > 11 || date.month < 3 ? "winter" : date.month > 8 ? "autumn" : date.month > 5 ? "summer" : "spring";
+	}
+
 	return Object.create({
 		get date() {
 			return currentDate;
@@ -313,10 +317,10 @@ const Time = (() => {
 			return currentDate.year;
 		},
 		get days() {
-			return Math.floor((currentDate.timeStamp - this.startDate.timeStamp) / TimeConstants.secondsPerDay);
+			return Math.floor((currentDate.timeStamp - Time.startDate.timeStamp) / TimeConstants.secondsPerDay);
 		},
 		get season() {
-			return this.month > 11 || this.month < 3 ? "winter" : this.month > 8 ? "autumn" : this.month > 5 ? "summer" : "spring";
+			return getSeason(currentDate);
 		},
 		set startDate(value) {
 			V.startDate = value.timeStamp;
@@ -342,7 +346,7 @@ const Time = (() => {
 			return isSchoolTime(currentDate);
 		},
 		get dayState() {
-			const hour = this.hour;
+			const hour = currentDate.hour;
 			if (hour < 6 || hour >= 21) {
 				return "night";
 			}
@@ -351,16 +355,6 @@ const Time = (() => {
 			}
 			return hour >= 9 ? "day" : "dawn";
 		},
-		get nightState() {
-			const hour = this.hour;
-			if (hour < 6) {
-				return "morning";
-			}
-			if (hour >= 9) {
-				return "evening";
-			}
-			return undefined;
-		},
 		get nextSchoolTermStartDate() {
 			return getNextSchoolTermStartDate(currentDate);
 		},
@@ -392,13 +386,12 @@ const Time = (() => {
 		nextMoonPhase,
 		previousMoonPhase,
 		isBloodMoon,
-
+		getSeason,
+		getNextSchoolTermStartDate,
+		getNextSchoolTermEndDate,
 		moonPhases,
 		monthNames,
 		daysOfWeek,
-
-		getNextSchoolTermStartDate,
-		getNextSchoolTermEndDate,
 		getNextWeekdayDate: weekDay => currentDate.getNextWeekdayDate(weekDay),
 		getPreviousWeekdayDate: weekDay => currentDate.getPreviousWeekdayDate(weekDay),
 		isWeekEnd: () => currentDate.weekEnd,
diff --git a/game/03-JavaScript/weather/01-setup/weather-generation.js b/game/03-JavaScript/weather/01-setup/weather-generation.js
index a3bd5e94ed..76077c4dcb 100644
--- a/game/03-JavaScript/weather/01-setup/weather-generation.js
+++ b/game/03-JavaScript/weather/01-setup/weather-generation.js
@@ -141,6 +141,7 @@ setup.WeatherGeneration = {
 	weatherTypes: [
 		{
 			name: "clear",
+			iconType: "clear", // Determines which icon to use for the minimised sidebar
 			value: 0, // Value determines how to interpolate between different weather types. It always interpolates to a adjacent value first.
 			probability: {
 				// Weighted probabilities per month - there are compared to the other weather types, and not to the other seasons.
@@ -169,6 +170,7 @@ setup.WeatherGeneration = {
 		},
 		{
 			name: "lightClouds",
+			iconType: "clouds",
 			value: 1,
 			probability: {
 				summer: 0.5,
@@ -188,6 +190,7 @@ setup.WeatherGeneration = {
 		},
 		{
 			name: "heavyClouds",
+			iconType: "clouds",
 			value: 2,
 			probability: {
 				summer: 0.1,
@@ -207,6 +210,7 @@ setup.WeatherGeneration = {
 		},
 		{
 			name: "lightPrecipitation",
+			iconType: () => "light_" + Weather.precipitation,
 			value: 3,
 			probability: {
 				summer: 0.05,
@@ -226,6 +230,7 @@ setup.WeatherGeneration = {
 		},
 		{
 			name: "heavyPrecipitation",
+			iconType: () => "heavy_" + Weather.precipitation,
 			value: 4,
 			probability: {
 				summer: 0.05,
diff --git a/game/03-JavaScript/weather/02-main/01-weather.js b/game/03-JavaScript/weather/02-main/01-weather.js
index a6618adddd..6cdaab408c 100644
--- a/game/03-JavaScript/weather/02-main/01-weather.js
+++ b/game/03-JavaScript/weather/02-main/01-weather.js
@@ -1,14 +1,4 @@
-/* eslint-disable no-undef */
-/* eslint-disable no-unused-vars */
-/*
-
-- Add function:
-	- Only use winter-images after it has snowed once
-	- if it melts (at least 5 hours of warm temperature) back to normal images until it snow again
-*/
-
 const Weather = (() => {
-	const _activeRenderer = {};
 	/* Helper functions */
 
 	function generateKeyPoints({ date, minKeys, maxKeys, timeApart, rangeValue, totalSteps }) {
@@ -37,7 +27,7 @@ const Weather = (() => {
 	 * sunBlockModifier (based on used sun block)
 	 * dayFactor (based on sun position in the sky) - always 0 at night
 	 *
-	 * @param {bool} outside Forces outside check
+	 * @param {boolean} outside Forces outside check
 	 * @param {number} customSunIntensity If this is set - the calculations replaces the sun intensity with a specified one.
 	 */
 	function getTanningFactor(outside, customSunIntensity = 0) {
diff --git a/game/03-JavaScript/weather/02-main/02-body-temperature.js b/game/03-JavaScript/weather/02-main/02-body-temperature.js
index aaf2ac3789..10625025fb 100644
--- a/game/03-JavaScript/weather/02-main/02-body-temperature.js
+++ b/game/03-JavaScript/weather/02-main/02-body-temperature.js
@@ -1,6 +1,3 @@
-/* eslint-disable no-undef */
-/* eslint-disable no-unused-vars */
-
 /**
  * Manages the body temperature of the player in the game.
  * Simulates the body's regulation of heat generation to maintain the base body temperature
diff --git a/game/03-JavaScript/weather/03-canvas/01-src/01-main/00-fadable.js b/game/03-JavaScript/weather/03-canvas/01-src/00-classes/fadable.js
similarity index 100%
rename from game/03-JavaScript/weather/03-canvas/01-src/01-main/00-fadable.js
rename to game/03-JavaScript/weather/03-canvas/01-src/00-classes/fadable.js
diff --git a/game/03-JavaScript/weather/03-canvas/01-src/01-main/00-orbit.js b/game/03-JavaScript/weather/03-canvas/01-src/00-classes/orbit.js
similarity index 100%
rename from game/03-JavaScript/weather/03-canvas/01-src/01-main/00-orbit.js
rename to game/03-JavaScript/weather/03-canvas/01-src/00-classes/orbit.js
diff --git a/game/03-JavaScript/weather/03-canvas/01-src/01-main/01-sky.js b/game/03-JavaScript/weather/03-canvas/01-src/00-classes/sky-canvas.js
similarity index 73%
rename from game/03-JavaScript/weather/03-canvas/01-src/01-main/01-sky.js
rename to game/03-JavaScript/weather/03-canvas/01-src/00-classes/sky-canvas.js
index 4d63432342..5eaf8a6643 100644
--- a/game/03-JavaScript/weather/03-canvas/01-src/01-main/01-sky.js
+++ b/game/03-JavaScript/weather/03-canvas/01-src/00-classes/sky-canvas.js
@@ -242,126 +242,3 @@ Weather.Renderer.Sky = class {
 		this.layers.get("moon").init();
 	}
 };
-
-Weather.sky = new Weather.Renderer.Sky({
-	id: "canvasSkybox",
-	setup: setup.SkySettings.canvas.sidebar,
-	layers: [
-		"sky",
-		"starField",
-		"sun",
-		"moon",
-		"cirrusClouds",
-		"overcastClouds",
-		"clouds",
-		"horizonGlow",
-		"location",
-		"precipitation",
-		"bloodGlow",
-		"sunGlow",
-		"fog",
-	],
-});
-
-// Initialize on loading a save
-$(document).on(":onloadsave", () => {
-	if (!Weather.sky?.loaded.value) return;
-	Weather.activeRenderer = Weather.sky;
-	Weather.sky.initialize();
-});
-
-// Clear all layers on restart
-$(document).on(":enginerestart", () => {
-	Weather.sky?.stopAll();
-});
-
-$(document).on(":passageend", () => {
-	// Initialise banner on passageend in order to load Time and localStorage correctly
-	if (State.passage === "Start" && !Weather.banner?.loaded.value) {
-		// Load localStorage weather object if it exists - then set the weatherObj
-		// Otherwise set a default time state
-		const weatherData = localStorage.getItem("weather");
-		const timeData = localStorage.getItem("time");
-		let startTime = new DateTime(2022, 8, 10, 23, 45);
-		if (weatherData) {
-			Packer.unpackWeatherData(weatherData);
-			startTime = new DateTime(parseInt(timeData, 36));
-		}
-		Time.set(startTime);
-		Weather.banner.initialize();
-	}
-});
-
-// Initialize on page refresh
-$(document).on(":passagestart", () => {
-	// Setup banner for start menu
-	if (State.passage === "Start") {
-		// Set temporary weatherObj for Start menu
-		V.weatherObj = {
-			name: "lightClouds",
-			snow: 0,
-			ice: {},
-			fog: 0,
-			overcast: 0,
-			targetOvercast: 0,
-			monthlyTemperatures: [],
-			keypointsArr: [],
-		};
-		Time.set(0);
-
-		if (!Weather.banner?.loaded.value) {
-			// Setup banner canvas
-			Weather.banner = new Weather.Renderer.Sky({
-				id: "canvasBanner",
-				setup: setup.SkySettings.canvas.banner,
-				layers: [
-					"bannerSky",
-					"sun",
-					"bannerSunGlow",
-					"moon",
-					"bannerCirrusClouds",
-					"bannerOvercastClouds",
-					"bannerClouds",
-					"bannerStarField",
-					"bloodGlow",
-					"bannerPrecipitation",
-					"location",
-				],
-				resizable: true,
-			});
-		}
-
-		Weather.activeRenderer = Weather.banner;
-		return;
-	}
-
-	// Remove banner canvas if no longer on start menu
-	if (State.passage !== "Start" && Weather.banner) {
-		Weather.banner.stopAll();
-		delete Weather.banner;
-	}
-
-	// Return if sidebar has already been initialised
-	if (!V.weatherObj || Weather.sky?.loaded.value) return;
-
-	Weather.activeRenderer = Weather.sky;
-	Weather.sky.initialize();
-});
-
-Macro.add("skybox", {
-	handler() {
-		Weather.sky.skybox.appendTo(this.output);
-	},
-});
-
-Macro.add("banner", {
-	handler() {
-		Weather.banner.skybox.appendTo(this.output);
-		// Use fallback image if it exists (modded game) - otherwise just use the banner canvas
-		const bannerFallbackImage = new Image();
-		bannerFallbackImage.src = "img/misc/banner.png";
-		bannerFallbackImage.onload = () => {
-			Weather.banner.skybox.empty().append($(bannerFallbackImage));
-		};
-	},
-});
diff --git a/game/03-JavaScript/weather/03-canvas/01-src/01-main/00-weather-Animation.js b/game/03-JavaScript/weather/03-canvas/01-src/00-classes/weather-Animation.js
similarity index 98%
rename from game/03-JavaScript/weather/03-canvas/01-src/01-main/00-weather-Animation.js
rename to game/03-JavaScript/weather/03-canvas/01-src/00-classes/weather-Animation.js
index 3498d58664..7c1510e650 100644
--- a/game/03-JavaScript/weather/03-canvas/01-src/01-main/00-weather-Animation.js
+++ b/game/03-JavaScript/weather/03-canvas/01-src/00-classes/weather-Animation.js
@@ -1,5 +1,3 @@
-/* eslint-disable no-undef */
-/* eslint-disable no-unused-vars */
 Weather.Renderer.Animation = class Animation {
 	constructor(options) {
 		this.image = options.image;
diff --git a/game/03-JavaScript/weather/03-canvas/01-src/01-main/00-weather-AnimationGroup.js b/game/03-JavaScript/weather/03-canvas/01-src/00-classes/weather-AnimationGroup.js
similarity index 96%
rename from game/03-JavaScript/weather/03-canvas/01-src/01-main/00-weather-AnimationGroup.js
rename to game/03-JavaScript/weather/03-canvas/01-src/00-classes/weather-AnimationGroup.js
index 5de86577a9..b197b23184 100644
--- a/game/03-JavaScript/weather/03-canvas/01-src/01-main/00-weather-AnimationGroup.js
+++ b/game/03-JavaScript/weather/03-canvas/01-src/00-classes/weather-AnimationGroup.js
@@ -1,5 +1,3 @@
-/* eslint-disable no-undef */
-/* eslint-disable no-unused-vars */
 Weather.Renderer.AnimationGroup = class AnimationGroup {
 	constructor(options, onUpdate) {
 		this.lastUpdateTime = 0;
diff --git a/game/03-JavaScript/weather/03-canvas/01-src/01-main/00-weather-Effect.js b/game/03-JavaScript/weather/03-canvas/01-src/00-classes/weather-Effect.js
similarity index 98%
rename from game/03-JavaScript/weather/03-canvas/01-src/01-main/00-weather-Effect.js
rename to game/03-JavaScript/weather/03-canvas/01-src/00-classes/weather-Effect.js
index 807cf045bf..39400d8d10 100644
--- a/game/03-JavaScript/weather/03-canvas/01-src/01-main/00-weather-Effect.js
+++ b/game/03-JavaScript/weather/03-canvas/01-src/00-classes/weather-Effect.js
@@ -1,5 +1,3 @@
-/* eslint-disable no-undef */
-/* eslint-disable no-unused-vars */
 Weather.Renderer.Effect = class Effect {
 	constructor(effect, condition, compositeOperation, params) {
 		this.params = params ?? {};
diff --git a/game/03-JavaScript/weather/03-canvas/01-src/01-main/00-weather-Layer.js b/game/03-JavaScript/weather/03-canvas/01-src/00-classes/weather-Layer.js
similarity index 99%
rename from game/03-JavaScript/weather/03-canvas/01-src/01-main/00-weather-Layer.js
rename to game/03-JavaScript/weather/03-canvas/01-src/00-classes/weather-Layer.js
index 9694546ef8..a0daba0950 100644
--- a/game/03-JavaScript/weather/03-canvas/01-src/01-main/00-weather-Layer.js
+++ b/game/03-JavaScript/weather/03-canvas/01-src/00-classes/weather-Layer.js
@@ -1,4 +1,3 @@
-/* eslint-disable no-undef */
 Weather.Renderer.Layer = class Layer {
 	constructor(name, blur, zIndex = 0, animation = undefined) {
 		this.name = name;
diff --git a/game/03-JavaScript/weather/03-canvas/01-src/01-main/00-main.js b/game/03-JavaScript/weather/03-canvas/01-src/01-main/00-main.js
new file mode 100644
index 0000000000..adb6b622f0
--- /dev/null
+++ b/game/03-JavaScript/weather/03-canvas/01-src/01-main/00-main.js
@@ -0,0 +1,20 @@
+/* Create the sky canvas instance */
+Weather.sky = new Weather.Renderer.Sky({
+	id: "canvasSkybox",
+	setup: setup.SkySettings.canvas.sidebar,
+	layers: [
+		"sky",
+		"starField",
+		"sun",
+		"moon",
+		"cirrusClouds",
+		"overcastClouds",
+		"clouds",
+		"horizonGlow",
+		"location",
+		"precipitation",
+		"bloodGlow",
+		"sunGlow",
+		"fog",
+	],
+});
diff --git a/game/03-JavaScript/weather/02-main/03-thermometer.js b/game/03-JavaScript/weather/03-canvas/01-src/01-main/00-thermometer.js
similarity index 59%
rename from game/03-JavaScript/weather/02-main/03-thermometer.js
rename to game/03-JavaScript/weather/03-canvas/01-src/01-main/00-thermometer.js
index 3802938982..c445e2882b 100644
--- a/game/03-JavaScript/weather/02-main/03-thermometer.js
+++ b/game/03-JavaScript/weather/03-canvas/01-src/01-main/00-thermometer.js
@@ -1,4 +1,3 @@
-/* eslint-disable no-new */
 Weather.Thermometer = (() => {
 	const temperature = {
 		min: 34,
@@ -46,7 +45,7 @@ Weather.Thermometer = (() => {
 		});
 
 		Promise.all(loadPromises).then(() => {
-			thermometerCanvas = new BaseCanvas(0, 0, 0.5); //todo move to after img size is set
+			thermometerCanvas = new BaseCanvas(0, 0, 0.5);
 			const baseImg = images.baseImg.img;
 			size.width = baseImg.width * size.scaleFactor;
 			size.height = baseImg.height * size.scaleFactor;
@@ -111,40 +110,7 @@ Weather.Thermometer = (() => {
 			thermometerCanvas.ctx.fillRect(13, 2, img.width, img.height);
 		}
 
-		updateTooltip();
-	}
-
-	function updateTooltip() {
-		const tempDescription = Weather.TooltipDescriptions.bodyTemperature();
-		const waterDescription = `<br>${Weather.TooltipDescriptions.waterTemperature()}`;
-		const fatigueModifier = categorise(Weather.BodyTemperature.fatigueModifier, 1, Weather.tempSettings.effects.maxFatigueGainMultiplier, 4);
-		const arousalModifier = categorise(Weather.BodyTemperature.arousalModifier, 1, Weather.tempSettings.effects.maxArousalGainMultiplier, 4);
-		const painModifier = categorise(Weather.BodyTemperature.painModifier, 1, Weather.tempSettings.effects.maxPainGainMultiplier, 4);
-		const stressModifier = categorise(Weather.BodyTemperature.stressModifier, 0, Weather.tempSettings.effects.lowerMaxStressGain, 4);
-
-		const arousalOutput = arousalModifier > 0 ? `<span class="teal">${"- ".repeat(Math.abs(arousalModifier))}Arousal gains</span><br>` : "";
-		const fatigueOutput = fatigueModifier > 0 ? `<span class="red">${"+ ".repeat(Math.abs(fatigueModifier))}Fatigue gains</span><br>` : "";
-		const painOutput = painModifier > 0 ? `<span class="red">${"+ ".repeat(Math.abs(painModifier))}Pain gains</span><br>` : "";
-		const stressOutput = stressModifier > 0 ? `<span class="red">${"+ ".repeat(Math.abs(stressModifier))}Stress gains</span><br>` : "";
-		const modifiers =
-			arousalOutput || fatigueOutput || painOutput || stressOutput ? "<br>" + arousalOutput + fatigueOutput + painOutput + stressOutput : "";
-
-		const direction = Weather.BodyTemperature.direction > 0 ? "(increasing)" : Weather.BodyTemperature.direction < 0 ? "(decreasing)" : "";
-		// eslint-disable-next-line prettier/prettier
-		const debug = V.debug ? `<br><br><span class="teal">DEBUG:</span><br><span class="blue">Passage:</span> <span class="yellow">${V.passage}</span>
-			<br><span class="blue">Time:</span> <span class="yellow">${ampm()}</span>
-			<br><span class="blue">Body temperature:</span> <span class="yellow">${Weather.toSelectedString(Weather.bodyTemperature)} ${direction}</span>
-			<br><span class="blue">Body wetness:</span> <span class="yellow">${Math.round(Weather.wetness * 100)}%</span>
-			<br><span class="blue">Clothing warmth:</span> <span class="yellow">${Weather.BodyTemperature.getTotalWarmth()}</span>
-			<br><span class="blue">Target temperature (current clothing)</span> <span class="yellow">${Weather.toSelectedString(
-				Weather.BodyTemperature.getRestingPoint(6)
-			)}</span>`
-			: "";
-		tooltipElement.tooltip({
-			message: tempDescription + waterDescription + modifiers + debug,
-			delay: 200,
-			position: "cursor",
-		});
+		Weather.Tooltips.thermometer();
 	}
 
 	return Object.create({
@@ -153,18 +119,5 @@ Weather.Thermometer = (() => {
 		enabled,
 		load,
 		update,
-		updateTooltip,
 	});
 })();
-
-Macro.add("thermometer", {
-	handler() {
-		Weather.Thermometer.element.appendTo(this.output);
-		Weather.Thermometer.tooltipElement.appendTo(this.output);
-		Weather.Thermometer.update();
-	},
-});
-
-$(document).one(":passagerender", () => {
-	Weather.Thermometer.load();
-});
diff --git a/game/03-JavaScript/weather/03-canvas/01-src/01-main/01-events.js b/game/03-JavaScript/weather/03-canvas/01-src/01-main/01-events.js
new file mode 100644
index 0000000000..9acb553ae9
--- /dev/null
+++ b/game/03-JavaScript/weather/03-canvas/01-src/01-main/01-events.js
@@ -0,0 +1,88 @@
+/* Initialize sky canvas on loading a save */
+$(document).on(":onloadsave", () => {
+	if (!Weather.sky?.loaded.value) return;
+	Weather.activeRenderer = Weather.sky;
+	Weather.sky.initialize();
+});
+
+/* Clear all layers on restart */
+$(document).on(":enginerestart", () => {
+	Weather.sky?.stopAll();
+});
+
+/* Initialise banner canvas on passageend in order to load Time and localStorage correctly */
+$(document).on(":passageend", () => {
+	if (State.passage === "Start" && !Weather.banner?.loaded.value) {
+		// Load localStorage weather object if it exists - then set the weatherObj
+		// Otherwise set a default time state
+		const weatherData = localStorage.getItem("weather");
+		const timeData = localStorage.getItem("time");
+		let startTime = new DateTime(2022, 8, 10, 23, 45);
+		if (weatherData) {
+			Packer.unpackWeatherData(weatherData);
+			startTime = new DateTime(parseInt(timeData, 36));
+		}
+		Time.set(startTime);
+		Weather.banner.initialize();
+	}
+});
+
+/* Initialize sky canvas on page refresh */
+$(document).on(":passagestart", () => {
+	// Setup banner for start menu
+	if (State.passage === "Start") {
+		// Set temporary weatherObj for Start menu
+		V.weatherObj = {
+			name: "lightClouds",
+			snow: 0,
+			ice: {},
+			fog: 0,
+			overcast: 0,
+			targetOvercast: 0,
+			monthlyTemperatures: [],
+			keypointsArr: [],
+		};
+		Time.set(0);
+
+		// Setup banner canvas
+		if (!Weather.banner?.loaded.value) {
+			Weather.banner = new Weather.Renderer.Sky({
+				id: "canvasBanner",
+				setup: setup.SkySettings.canvas.banner,
+				layers: [
+					"bannerSky",
+					"sun",
+					"bannerSunGlow",
+					"moon",
+					"bannerCirrusClouds",
+					"bannerOvercastClouds",
+					"bannerClouds",
+					"bannerStarField",
+					"bloodGlow",
+					"bannerPrecipitation",
+					"location",
+				],
+				resizable: true,
+			});
+		}
+
+		Weather.activeRenderer = Weather.banner;
+		return;
+	}
+
+	// Remove banner canvas if no longer on start menu
+	if (State.passage !== "Start" && Weather.banner) {
+		Weather.banner.stopAll();
+		delete Weather.banner;
+	}
+
+	// Return if sidebar has already been initialised
+	if (!V.weatherObj || Weather.sky?.loaded.value) return;
+
+	Weather.activeRenderer = Weather.sky;
+	Weather.sky.initialize();
+});
+
+$(document).one(":passagerender", () => {
+	Weather.Thermometer.load();
+});
diff --git a/game/03-JavaScript/weather/03-canvas/01-src/01-main/02-macros.js b/game/03-JavaScript/weather/03-canvas/01-src/01-main/02-macros.js
new file mode 100644
index 0000000000..cb1863d479
--- /dev/null
+++ b/game/03-JavaScript/weather/03-canvas/01-src/01-main/02-macros.js
@@ -0,0 +1,41 @@
+Macro.add("skybox", {
+	handler() {
+		Weather.sky.skybox.appendTo(this.output);
+	},
+});
+
+Macro.add("banner", {
+	handler() {
+		Weather.banner.skybox.appendTo(this.output);
+		// Use fallback image if it exists (modded game) - otherwise just use the banner canvas
+		const bannerFallbackImage = new Image();
+		bannerFallbackImage.src = "img/misc/banner.png";
+		bannerFallbackImage.onload = () => {
+			Weather.banner.skybox.empty().append($(bannerFallbackImage));
+		};
+	},
+});
+
+Macro.add("thermometer", {
+	handler() {
+		Weather.Thermometer.element.appendTo(this.output);
+		Weather.Thermometer.tooltipElement.appendTo(this.output);
+		Weather.Thermometer.update();
+	},
+});
+
+Macro.add("weatherIcon", {
+	handler() {
+		const iconDiv = $("<div />", { id: "weatherIcon" });
+		const iconImg = $("<img />");
+
+		const dayState = Weather.bloodMoon ? "blood" : Weather.dayState === "night" ? "night" : "day";
+		const weatherState = resolveValue(Weather.type.iconType, "clear");
+		const path = `img/misc/icon/weather/${dayState}_${weatherState}.png`;
+
+		iconImg.attr("src", path);
+		Weather.Tooltips.skybox(iconImg);
+		iconDiv.append(iconImg);
+		iconDiv.appendTo(this.output);
+	},
+});
diff --git a/game/03-JavaScript/weather/03-canvas/01-src/01-main/03-tooltips.js b/game/03-JavaScript/weather/03-canvas/01-src/01-main/03-tooltips.js
new file mode 100644
index 0000000000..2b9f044857
--- /dev/null
+++ b/game/03-JavaScript/weather/03-canvas/01-src/01-main/03-tooltips.js
@@ -0,0 +1,71 @@
+Weather.Tooltips = (() => {
+	function skybox(element = Weather.sky.skybox) {
+		// Maybe not hardcode this here
+		const key = V.location === "tentworld" ? "tentaclePlains" : Weather.name;
+		const weatherState = Weather.TooltipDescriptions.type[key];
+
+		if (!weatherState) return;
+		const transition = weatherState.transition ? weatherState.transition() : null;
+		const weatherDescription = transition || (typeof weatherState === "string" ? weatherState : resolveValue(weatherState[Weather.skyState], ""));
+
+		const tempDescription = Weather.TooltipDescriptions.temperature();
+		const debug = V.debug
+			? `<br><br><span class="teal">DEBUG:</span>
+			<br><span class="blue">Passage:</span> <span class="yellow">${V.passage}</span>
+			<br><span class="blue">Time:</span> <span class="yellow">${ampm()}</span>
+			<br><span class="blue">Weather:</span> <span class="yellow">${Weather.name}</span>
+			<br><span class="blue">Outside temperature:</span> <span class="yellow">${Weather.toSelectedString(Weather.temperature)}</span>
+			<br><span class="blue">Inside temperature:</span> <span class="yellow">${Weather.toSelectedString(Weather.insideTemperature)}</span>
+			<br><span class="blue">Water temperature:</span> <span class="yellow">${Weather.toSelectedString(Weather.waterTemperature)}</span>
+			<br><span class="blue">Body temperature:</span> <span class="yellow">${Weather.toSelectedString(Weather.bodyTemperature)}</span>
+			<br><span class="blue">Sun intensity:</span> <span class="yellow">${round(Weather.sunIntensity * 100, 2)}% (${V.outside ? "outside" : "inside"})</span>
+			<br><span class="blue">Overcast amount:</span> <span class="yellow">${round(Weather.overcast * 100, 2)}%</span>
+			<br><span class="blue">Fog amount:</span> <span class="yellow">${round(Weather.fog * 100, 2)}%</span>
+			<br><span class="blue">Snow ground accumulation:</span> <span class="yellow">${V.weatherObj.snow}mm</span>
+			<br><span class="blue">Lake ice thickness:</span> <span class="yellow">${V.weatherObj.ice.lake ?? 0}mm</span>`
+			: "";
+		element.tooltip({
+			message: `${weatherDescription}<br>${tempDescription}${debug}`,
+			delay: 200,
+			position: "cursor",
+		});
+	}
+
+	function thermometer() {
+		const tempDescription = Weather.TooltipDescriptions.bodyTemperature();
+		const waterDescription = `<br>${Weather.TooltipDescriptions.waterTemperature()}`;
+		const fatigueModifier = categorise(Weather.BodyTemperature.fatigueModifier, 1, Weather.tempSettings.effects.maxFatigueGainMultiplier, 4);
+		const arousalModifier = categorise(Weather.BodyTemperature.arousalModifier, 1, Weather.tempSettings.effects.maxArousalGainMultiplier, 4);
+		const painModifier = categorise(Weather.BodyTemperature.painModifier, 1, Weather.tempSettings.effects.maxPainGainMultiplier, 4);
+		const stressModifier = categorise(Weather.BodyTemperature.stressModifier, 0, Weather.tempSettings.effects.lowerMaxStressGain, 4);
+
+		const arousalOutput = arousalModifier > 0 ? `<span class="teal">${"- ".repeat(Math.abs(arousalModifier))}Arousal gains</span><br>` : "";
+		const fatigueOutput = fatigueModifier > 0 ? `<span class="red">${"+ ".repeat(Math.abs(fatigueModifier))}Fatigue gains</span><br>` : "";
+		const painOutput = painModifier > 0 ? `<span class="red">${"+ ".repeat(Math.abs(painModifier))}Pain gains</span><br>` : "";
+		const stressOutput = stressModifier > 0 ? `<span class="red">${"+ ".repeat(Math.abs(stressModifier))}Stress gains</span><br>` : "";
+		const modifiers =
+			arousalOutput || fatigueOutput || painOutput || stressOutput ? "<br>" + arousalOutput + fatigueOutput + painOutput + stressOutput : "";
+
+		const direction = Weather.BodyTemperature.direction > 0 ? "(increasing)" : Weather.BodyTemperature.direction < 0 ? "(decreasing)" : "";
+		// eslint-disable-next-line prettier/prettier
+		const debug = V.debug ? `<br><br><span class="teal">DEBUG:</span><br><span class="blue">Passage:</span> <span class="yellow">${V.passage}</span>
+			<br><span class="blue">Time:</span> <span class="yellow">${ampm()}</span>
+			<br><span class="blue">Body temperature:</span> <span class="yellow">${Weather.toSelectedString(Weather.bodyTemperature)} ${direction}</span>
+			<br><span class="blue">Body wetness:</span> <span class="yellow">${Math.round(Weather.wetness * 100)}%</span>
+			<br><span class="blue">Clothing warmth:</span> <span class="yellow">${Weather.BodyTemperature.getTotalWarmth()}</span>
+			<br><span class="blue">Target temperature (current clothing)</span> <span class="yellow">${Weather.toSelectedString(
+				Weather.BodyTemperature.getRestingPoint(6)
+			)}</span>`
+			: "";
+		Weather.Thermometer.tooltipElement.tooltip({
+			message: tempDescription + waterDescription + modifiers + debug,
+			delay: 200,
+			position: "cursor",
+		});
+	}
+
+	return {
+		skybox,
+		thermometer,
+	};
+})();
diff --git a/game/03-JavaScript/weather/03-canvas/01-src/01-observables.js b/game/03-JavaScript/weather/03-canvas/01-src/01-observables.js
index 73cd90aa1c..1104eef71d 100644
--- a/game/03-JavaScript/weather/03-canvas/01-src/01-observables.js
+++ b/game/03-JavaScript/weather/03-canvas/01-src/01-observables.js
@@ -45,7 +45,7 @@ Weather.Observables = (() => {
 	Object.keys(setup.WeatherBindings).forEach(key => (observables[key] = new ObservableValue(null)));
 
 	const setBindings = () => {
-		if (Weather.sky?.loaded.value) Weather.sky.updateTooltip();
+		if (Weather.sky?.loaded.value) Weather.Tooltips.skybox();
 		Object.entries(setup.WeatherBindings).forEach(([key, config]) => {
 			const value = config.variable();
 			observables[key].value = value;
@@ -58,7 +58,7 @@ Weather.Observables = (() => {
 				if (value === undefined) return;
 				if (config.layers.includes("all")) {
 					scheduler.scheduleUpdate("all", async () => {
-						Weather.sky.updateTooltip();
+						Weather.Tooltips.skybox();
 						Weather.sky.updateOrbits();
 						Weather.sky.drawLayers();
 					});
@@ -74,7 +74,7 @@ Weather.Observables = (() => {
 		});
 	};
 
-	$(document).on(":passageend", () => { // todo one
+	$(document).one(":passageend", () => {
 		setBindings();
 		Object.keys(observables).forEach(key => {
 			changedKeys.set(key, observables[key].value);
diff --git a/game/03-JavaScript/weather/03-canvas/02-lib/00-effects/effects-clouds.js b/game/03-JavaScript/weather/03-canvas/02-lib/00-effects/effects-clouds.js
index 33eb4cb737..7994ebb77a 100644
--- a/game/03-JavaScript/weather/03-canvas/02-lib/00-effects/effects-clouds.js
+++ b/game/03-JavaScript/weather/03-canvas/02-lib/00-effects/effects-clouds.js
@@ -1,4 +1,3 @@
-/* eslint-disable no-undef */
 Weather.Renderer.Effects.add({
 	name: "clouds",
 	defaultParameters: {
diff --git a/game/03-JavaScript/weather/03-canvas/02-lib/00-effects/effects-generic.js b/game/03-JavaScript/weather/03-canvas/02-lib/00-effects/effects-generic.js
index 96682de521..7546bd4474 100644
--- a/game/03-JavaScript/weather/03-canvas/02-lib/00-effects/effects-generic.js
+++ b/game/03-JavaScript/weather/03-canvas/02-lib/00-effects/effects-generic.js
@@ -1,4 +1,3 @@
-/* eslint-disable no-undef */
 Weather.Renderer.Effects.add({
 	name: "gradiantGlow",
 	defaultParameters: {
diff --git a/game/03-JavaScript/weather/03-canvas/02-lib/00-effects/effects-location.js b/game/03-JavaScript/weather/03-canvas/02-lib/00-effects/effects-location.js
index 7561e2ea9c..c79f5d2bc8 100644
--- a/game/03-JavaScript/weather/03-canvas/02-lib/00-effects/effects-location.js
+++ b/game/03-JavaScript/weather/03-canvas/02-lib/00-effects/effects-location.js
@@ -1,4 +1,3 @@
-/* eslint-disable no-undef */
 Weather.Renderer.Effects.add({
 	name: "locationImage",
 	effects: [
@@ -231,10 +230,10 @@ Weather.Renderer.Effects.add({
 				const exponentialFactor = Math.pow(y / this.distortionCanvas.element.height, this.verticalFactor); // More pronounced exponential factor for amplitude
 				const adjustedFrequency = this.waveFrequency * (1 - exponentialFactor);
 				const amplitude = this.amplitude * exponentialFactor; // Amplitude increases exponentially
-		
+
 				// Introduce a vertical shift for the animation effect
 				const verticalShift = (frame * this.verticalSpeed * this.verticalDirection) % this.distortionCanvas.element.height;
-		
+
 				const basePhase = ((y + verticalShift) * adjustedFrequency) % (2 * Math.PI);
 				const totalSineValue = Math.sin(basePhase) * amplitude;
 				sines.push(totalSineValue);
diff --git a/game/03-JavaScript/weather/03-canvas/02-lib/00-effects/effects-orbitals.js b/game/03-JavaScript/weather/03-canvas/02-lib/00-effects/effects-orbitals.js
index 0ab84052b2..90a81ec832 100644
--- a/game/03-JavaScript/weather/03-canvas/02-lib/00-effects/effects-orbitals.js
+++ b/game/03-JavaScript/weather/03-canvas/02-lib/00-effects/effects-orbitals.js
@@ -1,4 +1,3 @@
-/* eslint-disable no-undef */
 /**
  * Renders an orbital object, such as the sun or moon, at a specified position.
  * Changes position on draw() based on the position binding.
diff --git a/game/03-JavaScript/weather/03-canvas/02-lib/00-effects/effects-precipitation.js b/game/03-JavaScript/weather/03-canvas/02-lib/00-effects/effects-precipitation.js
index 6b1f3bfe59..a75700ae8e 100644
--- a/game/03-JavaScript/weather/03-canvas/02-lib/00-effects/effects-precipitation.js
+++ b/game/03-JavaScript/weather/03-canvas/02-lib/00-effects/effects-precipitation.js
@@ -1,4 +1,3 @@
-/* eslint-disable no-undef */
 Weather.Renderer.Effects.add({
 	name: "precipitation",
 	defaultParameters: {
diff --git a/game/03-JavaScript/weather/03-canvas/02-lib/00-effects/effects-sky.js b/game/03-JavaScript/weather/03-canvas/02-lib/00-effects/effects-sky.js
index 1ce6c2be00..2bff23fbfe 100644
--- a/game/03-JavaScript/weather/03-canvas/02-lib/00-effects/effects-sky.js
+++ b/game/03-JavaScript/weather/03-canvas/02-lib/00-effects/effects-sky.js
@@ -1,4 +1,3 @@
-/* eslint-disable no-undef */
 /**
  * Sky gradient effect, simulating transitions between different times of day
  */
diff --git a/game/03-JavaScript/weather/03-canvas/02-lib/01-layers/docs-layers.txt b/game/03-JavaScript/weather/03-canvas/02-lib/01-layers/00-docs-layers.txt
similarity index 100%
rename from game/03-JavaScript/weather/03-canvas/02-lib/01-layers/docs-layers.txt
rename to game/03-JavaScript/weather/03-canvas/02-lib/01-layers/00-docs-layers.txt
diff --git a/game/03-JavaScript/weather/03-canvas/02-lib/01-layers/banner-canvas-layers.js b/game/03-JavaScript/weather/03-canvas/02-lib/01-layers/banner-canvas-layers.js
index 2f215fdc00..052e951b06 100644
--- a/game/03-JavaScript/weather/03-canvas/02-lib/01-layers/banner-canvas-layers.js
+++ b/game/03-JavaScript/weather/03-canvas/02-lib/01-layers/banner-canvas-layers.js
@@ -1,4 +1,3 @@
-/* eslint-disable no-undef */
 Weather.Renderer.Layers.add({
 	name: "bannerSky",
 	zIndex: 0,
@@ -148,7 +147,7 @@ Weather.Renderer.Layers.add({
 				alpha() {
 					const factor = this.renderInstance.orbitals.sun.factor;
 					const nightAlpha = Weather.bloodMoon ? this.opacity.bloodMoon : this.opacity.night;
-					return interpolate(nightAlpha, this.opacity.day, Math.max(0, factor));
+					return interpolate(nightAlpha, this.opacity.day, Math.clamp(factor + 0.4, 0, 1));
 				},
 				rotation() {
 					return Time.date.fractionOfDay * 360;
diff --git a/game/03-JavaScript/weather/03-canvas/02-lib/01-layers/layer-fog.js b/game/03-JavaScript/weather/03-canvas/02-lib/01-layers/layer-fog.js
index 303d5b3113..fb8e302c3f 100644
--- a/game/03-JavaScript/weather/03-canvas/02-lib/01-layers/layer-fog.js
+++ b/game/03-JavaScript/weather/03-canvas/02-lib/01-layers/layer-fog.js
@@ -1,4 +1,3 @@
-/* eslint-disable no-undef */
 Weather.Renderer.Layers.add({
 	name: "fog",
 	zIndex: 13,
diff --git a/game/03-JavaScript/weather/03-canvas/02-lib/01-layers/layer-moon.js b/game/03-JavaScript/weather/03-canvas/02-lib/01-layers/layer-moon.js
index 18ed91a089..8afc0832c0 100644
--- a/game/03-JavaScript/weather/03-canvas/02-lib/01-layers/layer-moon.js
+++ b/game/03-JavaScript/weather/03-canvas/02-lib/01-layers/layer-moon.js
@@ -1,4 +1,3 @@
-/* eslint-disable no-undef */
 Weather.Renderer.Layers.add({
 	name: "moon",
 	zIndex: 3, // zIndex value
diff --git a/game/03-JavaScript/weather/03-canvas/02-lib/01-layers/layer-precipitation.js b/game/03-JavaScript/weather/03-canvas/02-lib/01-layers/layer-precipitation.js
index 4486e94f27..cac088076b 100644
--- a/game/03-JavaScript/weather/03-canvas/02-lib/01-layers/layer-precipitation.js
+++ b/game/03-JavaScript/weather/03-canvas/02-lib/01-layers/layer-precipitation.js
@@ -1,4 +1,3 @@
-/* eslint-disable no-undef */
 Weather.Renderer.Layers.add({
 	name: "precipitation",
 	zIndex: 10,
diff --git a/game/03-JavaScript/weather/03-canvas/02-lib/01-layers/layer-sky.js b/game/03-JavaScript/weather/03-canvas/02-lib/01-layers/layer-sky.js
index 5722d28f4e..b2a7d4fc63 100644
--- a/game/03-JavaScript/weather/03-canvas/02-lib/01-layers/layer-sky.js
+++ b/game/03-JavaScript/weather/03-canvas/02-lib/01-layers/layer-sky.js
@@ -1,4 +1,3 @@
-/* eslint-disable no-undef */
 Weather.Renderer.Layers.add({
 	name: "sky",
 	zIndex: 0,
diff --git a/game/03-JavaScript/weather/03-canvas/02-lib/01-layers/layer-starfield.js b/game/03-JavaScript/weather/03-canvas/02-lib/01-layers/layer-starfield.js
index 81e93c6038..005c084d5a 100644
--- a/game/03-JavaScript/weather/03-canvas/02-lib/01-layers/layer-starfield.js
+++ b/game/03-JavaScript/weather/03-canvas/02-lib/01-layers/layer-starfield.js
@@ -1,4 +1,3 @@
-/* eslint-disable no-undef */
 Weather.Renderer.Layers.add({
 	name: "starField",
 	zIndex: 1,
@@ -67,7 +66,7 @@ Weather.Renderer.Layers.add({
 				alpha() {
 					const factor = this.renderInstance.orbitals.sun.factor;
 					const nightAlpha = Weather.bloodMoon ? this.opacity.bloodMoon : this.opacity.night;
-					return interpolate(nightAlpha, this.opacity.day, Math.max(0, factor));
+					return interpolate(nightAlpha, this.opacity.day, Math.clamp(factor + 0.4, 0, 1));
 				},
 				rotation() {
 					return Time.date.fractionOfDay * 360;
diff --git a/game/03-JavaScript/weather/03-canvas/02-lib/01-layers/layer-sun.js b/game/03-JavaScript/weather/03-canvas/02-lib/01-layers/layer-sun.js
index e395891aea..4a656b8b88 100644
--- a/game/03-JavaScript/weather/03-canvas/02-lib/01-layers/layer-sun.js
+++ b/game/03-JavaScript/weather/03-canvas/02-lib/01-layers/layer-sun.js
@@ -1,4 +1,3 @@
-/* eslint-disable no-undef */
 Weather.Renderer.Layers.add({
 	name: "sun",
 	zIndex: 2,
diff --git a/game/04-Variables/variables-start2.twee b/game/04-Variables/variables-start2.twee
index 8220ca3392..ce5aeb48de 100644
--- a/game/04-Variables/variables-start2.twee
+++ b/game/04-Variables/variables-start2.twee
@@ -126,10 +126,6 @@
 	<<set $player.perceived_breastsize = $player.breastsize>>
 	<<set $player.perceived_bottomsize = $player.bottomsize>>
 
-	<<if $startingseason is "random">>
-		<<set $startingseason to ["autumn","winter","spring","summer"].random()>>
-	<</if>>
-
 	/* Do not use this object directly - use the Weather singleton instead */
 	<<set $weatherObj to {
 		name: "clear",
@@ -144,6 +140,9 @@
 
 	/* Default start date: 6 sept (sunday), 2020, 07:00 */
 	/* Do not change start date during gameplay as time is relative to the start date */
+	<<if $startingseason is "random">>
+		<<set $startingseason to ["autumn","winter","spring","summer"].random()>>
+	<</if>>
 	<<switch $startingseason>>
 		<<case "winter">>
 			<<set Time.startDate to new DateTime(2022, 12, 4, 7)>>
@@ -154,6 +153,7 @@
 		<<default>>
 			<<set Time.startDate to new DateTime(2022, 9, 4, 7)>>
 	<</switch>>
+	<<unset $startingseason>>
 	<<set $timeStamp to 0>>
 	<<set Time.set()>>
 	<<run Weather.activeRenderer = Weather.sky>>
diff --git a/game/04-Variables/variables-versionUpdate.twee b/game/04-Variables/variables-versionUpdate.twee
index b203da8d2c..e0ec1acd4c 100644
--- a/game/04-Variables/variables-versionUpdate.twee
+++ b/game/04-Variables/variables-versionUpdate.twee
@@ -2966,11 +2966,6 @@
 		<</if>>
 	<</if>>
 
-	<!-- 0.3.8.2: starting season backwards compatibility check -->
-	<<if $startingseason is undefined>>
-		<<set $startingseason to "autumn">>
-	<</if>>
-
 	<!-- v0.3.8.6: Fixing mismatched specialtransform after losing your virginity -->
 	<<if $demon gte 1 or $angel gte 1 or $fallenangel gte 2>>
 		<<set $specialTransform to 1>>
@@ -5231,6 +5226,10 @@
 		<<unset $frozenKeys>>
 	<</if>>
 
+	<<if $startingseason isnot undefined>>
+		<<unset $startingseason>>
+	<</if>>
+
 	<<if $clothing_number isnot undefined>>
 		<<unset $clothing_number>>
 	<</if>>
diff --git a/game/base-system/mobileStats.twee b/game/base-system/mobileStats.twee
index 0cd840707b..0e689bbb27 100644
--- a/game/base-system/mobileStats.twee
+++ b/game/base-system/mobileStats.twee
@@ -1,5 +1,10 @@
 :: mobileStats [widget]
 <<widget "mobileStats">>
+	<<if $options.sidebarStats is "all">>
+		<div class="weatherIcon">
+			<<weatherIcon>>
+		</div>
+	<</if>>
 	<<if Number.isFinite($pain) and ($options.sidebarStats is "all" or $pain gt 50)>>
 		<<mobileStatsColor "pain">>
 		<div @class="'stat ' + _mobileColor">
diff --git a/game/base-system/overlays/journal.twee b/game/base-system/overlays/journal.twee
index 999a931b36..226306fd4f 100644
--- a/game/base-system/overlays/journal.twee
+++ b/game/base-system/overlays/journal.twee
@@ -15,7 +15,7 @@
 			<li>You survived <span class="gold">$hardmodedays</span> days on hard mode.</li>
 			<br>
 		<</if>>
-		<li>The game started in $startingseason.</li>
+		<li>The game started in <<print Time.getSeason(new DateTime($startDate))>>.</li>
 		<li>It is <<print Time.season>>.</li>
 		<li><<schoolterm>></li>
 	<</if>>
diff --git a/game/base-system/overlays/options.twee b/game/base-system/overlays/options.twee
index 1d8c13bb34..802b9d31f1 100644
--- a/game/base-system/overlays/options.twee
+++ b/game/base-system/overlays/options.twee
@@ -439,7 +439,7 @@ IMPORTANT:
 			<div style="clear:both;">/*Keep at end of toggles*/</div>
 		</div>
 		<br>
-		<span class="gold">Sidebar</span>
+		<span class="gold">Rendering</span>
 		<br>
 		<div class="description">Close the options menu for the change to apply.</div>
 		<div>
diff --git a/modules/css/base.css b/modules/css/base.css
index f827f11ae8..bb26de9289 100644
--- a/modules/css/base.css
+++ b/modules/css/base.css
@@ -1050,6 +1050,20 @@ input.heart:hover {
 	padding: 0 .3em; */
 }
 
+#mobileStats #weatherIcon {
+	font-weight: 500;
+	font-size: 1.2em;
+	line-height: 1;
+	padding: 0.3em 0;
+	margin-top: 2px;
+	height: 24px;
+	position: relative;
+}
+
+#mobileStats #weatherIcon img {
+	position: absolute;
+}
+
 #mobileStats .time .ampm {
 	font-size: 0.5em;
 }
-- 
GitLab