diff --git a/game/00-framework-tools/03-compression/dictionaries.js b/game/00-framework-tools/03-compression/dictionaries.js index 8dd8b92dbe4cecdf589238b014bdec0c1d259dcc..b551b956ea3f3ccee11543300d986df67dd7e4fa 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 9304b8bb5f269d97f5634b3280e35bc486a0d8f0..10d7a2b8a75fefe319813285f714a80fca5ed265 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 e817b8b49ef26a24cb355916ca0b434bb7779868..8ffe17e43d96c1060e0d1e8349e257a3a7aa479c 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 a3bd5e94edf652bdfcb9021e2cfd823c882eb92c..76077c4dcb56318529ee3f36f417d321011c0692 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 a6618addddf34a1017ad0b576c67793629f299e7..6cdaab408cdf34f1ddd7294712669346eae0df16 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 aaf2ac3789aca1f599263e0485f255021050d3c4..10625025fbc7c709a26071bc8825ed02e1359f00 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 4d6343234294b53a856367166ed640517f902dc2..5eaf8a66430a309c43ccf8635e6d75fa172f8353 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 3498d58664a5bab154053c76550cf1221a8f3fda..7c1510e650ddeec31a67a93c4e05ab6d475e1038 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 5de86577a9bede2e8d0e9ccf77b9a72f90f93531..b197b23184a9ab9e9901fb329d4ef728c14a05d4 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 807cf045bf98f8059f495888edc29394afa1c806..39400d8d101174ceb98bc217f29163ed4acd3335 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 9694546ef8ecfb49066188665770da5e24f59a25..a0daba09507a568878d2f52f272dc4fb053225c8 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 0000000000000000000000000000000000000000..adb6b622f036ab2acf1e14c584e6eb0aef428b1e --- /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 38029389826f9cd775cfbb94329821f05eb08e31..c445e2882bf1cdeba7953837d3e108112e15d04d 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 0000000000000000000000000000000000000000..9acb553ae99a05033bf8aff80f3fd0b242b10ceb --- /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 0000000000000000000000000000000000000000..cb1863d479646b10a8bc36892fe5fecc10cf6511 --- /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 0000000000000000000000000000000000000000..2b9f04485792e662f82b8fbb73fd22bb28300eda --- /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 73cd90aa1ccff527350ba97e1e70fe9bd7bd65e1..1104eef71d46b74a6986a67ac0b1c8cf617aa507 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 33eb4cb73785a828a438d9f0a73ad24f5a49a231..7994ebb77ac24e18cd1481c3966add3d3e926930 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 96682de5215575cdf1c3320fe681154a9697e575..7546bd447451166d2d3b2d09a4b40c7c035a71ac 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 7561e2ea9ce0d5b860027ca20512ebd4606a2b53..c79f5d2bc88a21284e9727e79ffdf55792021434 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 0ab84052b20be7ee6ebd3f68b37594852dff7ae9..90a81ec8327263e7806ef827a5a30c80ba48e772 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 6b1f3bfe5926a3b71befd89b31c3f1e2ed9888e0..a75700ae8e17a3853e01b13d2cd760ed03201071 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 1ce6c2be00520810c8f8e6ca9355ec5c6a6ba602..2bff23fbfe1ae1c36cd44e04752bb9ab20badb46 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 2f215fdc004c13d6624ece5b328e7dd95fbd5126..052e951b06caf096106db17a471b5df1255695de 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 303d5b3113f5f059d6214bc63089679436b2aeb4..fb8e302c3f547257595ded1c227cac0e326199d5 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 18ed91a089f496fb5dba10dc969d9068afa44572..8afc0832c00d2115229eb749f7d6ecfccd0c3669 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 4486e94f2760648d54ba3fae92fa64f25d5908ff..cac088076b5bd87a8834c7c59dc07333358e669a 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 5722d28f4e5ee7cc0b69a818a40eb3a12e81b7e3..b2a7d4fc63cbd27b936cedcc69854de6ca63fd45 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 81e93c603808166e340b1e8608d0316027c9b4c8..005c084d5a2c980d2b753c5354bcc1e838bb8cfc 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 e395891aea65fb5e69e78170f73c3627bce1bc87..4a656b8b880cb83765ac49d65fd9f7bd63d0b945 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 8220ca3392769e22ebaaed0ad8aa3cf9ed7a2a43..ce5aeb48dececed173e78688f6a0e891ec610dc9 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 b203da8d2c3873322a7f6c13af71677b6e08dded..e0ec1acd4c09ab76e24c8bb523b9d1075508adbf 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 0cd840707b6d39465474ec0667f262bdb356f50a..0e689bbb27f94ee79cb66f259fa9940f79e45915 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 999a931b36f46da558449a0f22e9d72ea52997a0..226306fd4fbe285453d99a8fa8c6afe7bf9149cd 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 1d8c13bb34745b27e7f65f401da8ee5d63fbc7da..802b9d31f16028f9ffbba569a191aa551a765b08 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 f827f11ae8f49fcde41313d8a079b91a9ceae4e5..bb26de928976c24a2b25b44f69aafb74fd0dbf02 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; }