Weather + Seasons + calendar

* Redesigned weather systems and added seasons along with seeded weights for each quarter.
* Added weather forecast to the calendar
* Bug fixes
This commit is contained in:
LoafyLemon 2024-04-25 16:33:49 +01:00
parent 2c9348be59
commit 7535e0b756
3 changed files with 109 additions and 19 deletions

View File

@ -1,9 +1,11 @@
init python:
class Calendar(object):
def __init__(self):
pass
class Calendar():
periods = ("Janemar", "Aprimju", "Juliasep", "Octobrinde")
weekdays = ("Monday", "Tuesday", "Wednsday", "Thursday", "Friday", "Saturday", "Sunday")
_day = 0
def get_schedule(self, span=35):
@staticmethod
def get_schedule(span=35):
contents = {i: "" for i in range(span)}
# Add moon cycles
@ -14,31 +16,60 @@ init python:
contents[i] += "🌓"
# elif (game.day % 60 == 30) # Blood moon
forecast = Weather.forecast(span)
for i, v in forecast.items():
if v == "clear":
contents[i] += "☀️"
elif v == "cloudy":
contents[i] += "⛅"
elif v == "overcast":
contents[i] += "☁️"
elif v in ("blizzard", "snow"):
contents[i] += "🌨️"
elif v == "rain":
contents[i] += "🌧️"
elif v == "storm":
contents[i] += "🌩️"
# Add letters
letters = mailbox.get_letters(True)
for i in letters:
contents[game.day+i.wait] += "✉️"
if (day := game.day+i.wait) < span+1:
contents[day] += "✉️"
# Add parcels
parcels = mailbox.get_parcels(True)
for i in parcels:
contents[game.day+i.wait] += "📦"
if (day := game.day+i.wait) < span+1:
contents[day] += "📦"
return contents
def get_weekday(self, n):
weekdays = ("Monday", "Tuesday", "Wednsday", "Thursday", "Friday", "Saturday", "Sunday")
@staticmethod
def get_weekday(n=None):
if n is None:
n = game.day
return weekdays[n % 7]
return Calendar.weekdays[n % 7]
default calendar = Calendar()
@staticmethod
def get_period(n=None):
if n is None:
n = game.day
return Calendar.periods[(n // 30) % 4]
label calendar:
call screen calendar
jump main_room_menu
screen calendar:
default contents = calendar.get_schedule().items()
default contents = Calendar.get_schedule().items()
default period = Calendar.get_period()
text "[period]" align (0.5, 0.1) color "#fff" size 24
grid 7 6:
style "empty"
align (0.5, 0.5)

View File

@ -0,0 +1,65 @@
init python:
class Weather():
weather_types = ("clear", "cloudy", "overcast", "blizzard", "snow", "storm", "rain")
weather_weights = {
"Janemar": (8, 9, 10, 3, 4, 7, 7),
"Aprimju": (9, 10, 9, 2, 3, 8, 8),
"Juliasep": (10, 10, 8, 1, 2, 6, 9),
"Octobrinde": (6, 7, 9, 9, 10, 6, 6),
}
_weather = None
@staticmethod
def _interpolate_weights(day, period):
current_weights = Weather.weather_weights[period]
current_index = Calendar.periods.index(period)
next_index = (current_index + 1) % len(Calendar.periods)
next_weights = Weather.weather_weights[Calendar.periods[next_index]]
interpolation_factor = (day / 30) * 0.25
# Interpolate between current season and next season
adjusted_weights = tuple(
max(0.01, (1 - interpolation_factor) * current_weight + interpolation_factor * next_weights[i])
for i, current_weight in enumerate(current_weights)
)
return adjusted_weights
@staticmethod
def get_weather():
return Weather._weather
@staticmethod
def set_weather(value=None):
if value is None or value == "random":
period = Calendar.get_period()
weights = Weather._interpolate_weights(game.day, period)
rand = renpy.random.Random(seed=game.day)
value = rand.choices(Weather.weather_types, weights=weights)[0]
elif value not in Weather.weather_types:
raise ValueError(f"Unsupported weather type: {value!r}")
Weather._weather = value
return value
weather = property(get_weather, set_weather)
@staticmethod
def forecast(span=35):
forecast = {}
start_day = game.day - (game.day % 30)
period = Calendar.get_period()
for i in range(span):
day = start_day + i
weights = Weather._interpolate_weights(day, period)
rand = renpy.random.Random(seed=day)
value = rand.choices(Weather.weather_types, weights=weights)[0]
forecast[i] = value
return forecast

View File

@ -54,17 +54,11 @@ init -100 python:
@property
def weather(self):
return self._weather
return Weather.get_weather()
@weather.setter
def weather(self, value):
if value == "random":
value = renpy.random.choices(self.weather_types, weights=self.weather_weights)[0]
if not value in self.weather_types:
raise ValueError(f"Unsupported weather type: {value!r}")
self._weather = value
Weather.set_weather(value)
self.moon = (self.day % 7 == 0)
screen gold(old, new):