implemented weather events (just supernova to start)

This commit is contained in:
Sakimori 2021-03-08 15:03:10 -05:00
parent b9be2a481f
commit 4b3921695d
3 changed files with 37 additions and 1 deletions

View file

@ -146,6 +146,7 @@ def save_league(league):
state_dic = { state_dic = {
"season" : league.season, "season" : league.season,
"day" : league.day, "day" : league.day,
"last_weather_event" : league.last_weather_event_day,
"constraints" : league.constraints, "constraints" : league.constraints,
"game_length" : league.game_length, "game_length" : league.game_length,
"series_length" : league.series_length, "series_length" : league.series_length,

View file

@ -18,6 +18,9 @@ class league_structure(object):
self.autoplay = -1 self.autoplay = -1
self.champion = None self.champion = None
self.weather_forecast = {} self.weather_forecast = {}
self.weather_override = None #set to a weather for league-wide weather effects
self.last_weather_event_day = 0
self.weather_event_duration = 0
def setup(self, league_dic, division_games = 1, inter_division_games = 1, inter_league_games = 1, games_per_hour = 2): def setup(self, league_dic, division_games = 1, inter_division_games = 1, inter_league_games = 1, games_per_hour = 2):
self.league = league_dic # { subleague name : { division name : [team object] } } self.league = league_dic # { subleague name : { division name : [team object] } }
@ -466,7 +469,23 @@ class league_structure(object):
return this_embed return this_embed
def get_weather_now(self, team_name): def get_weather_now(self, team_name):
return all_weathers()[self.weather_forecast[team_name][self.day - 1]] if self.weather_override is None or self.weather_event_duration <= 0: #if no override set or if past event expired
return all_weathers()[self.weather_forecast[team_name][self.day - 1]]
else:
if self.weather_event_duration == 1 and random.random() < 0.1: #once per weather event, roll for forecast regen
self.new_weathers_midseason(team_name)
return self.weather_override
def weather_event_check(self): #2 for new event, 1 for continued event, 0 for no event
if self.day - self.last_weather_event_day > 12: #arbitrary cooldown between weather events
if random.random() < 0.1: #10% chance for weather event?
self.weather_override = all_weathers()["Supernova"]
self.last_weather_event_day = self.day
self.weather_event_duration = random.randint(self.weather_override.duration_range[0], self.weather_override.duration_range[1])
return 2
else:
self.weather_event_duration -= 1
return 1 if self.weather_event_duration > 0 else 0
class tournament(object): class tournament(object):
@ -621,4 +640,8 @@ def load_league_file(league_name):
for this_team in this_league.teams_in_league(): #give them all fresh forecasts starting at current day for this_team in this_league.teams_in_league(): #give them all fresh forecasts starting at current day
this_league.new_weathers_midseason(this_team.name) this_league.new_weathers_midseason(this_team.name)
save_league(this_league) save_league(this_league)
try:
this_league.last_weather_event_day = state_dic["last_weather_event"]
except:
this_league.last_weather_event_day = 0
return this_league return this_league

View file

@ -2146,6 +2146,8 @@ async def start_league_day(channel, league, partial = False):
else: else:
game_length = league.game_length game_length = league.game_length
weather_check_result = league.weather_event_check()
for pair in games_to_start: for pair in games_to_start:
if pair[0] is not None and pair[1] is not None: if pair[0] is not None and pair[1] is not None:
away = get_team_fuzzy_search(pair[0]) away = get_team_fuzzy_search(pair[0])
@ -2170,6 +2172,11 @@ async def start_league_day(channel, league, partial = False):
main_controller.master_games_dic[id] = (this_game, state_init, discrim_string) main_controller.master_games_dic[id] = (this_game, state_init, discrim_string)
ext = "?league=" + urllib.parse.quote_plus(league.name) ext = "?league=" + urllib.parse.quote_plus(league.name)
if weather_check_result == 2:
await channel.send(f"The entire league is struck by a {league.weather_override.emoji} {league.weather_override.name}! The games must go on.")
elif weather_check_result == 1:
await channel.send(f"The {league.weather_override.emoji} {league.weather_override.name} continues to afflict the league.")
if league.last_series_check(): #if finals if league.last_series_check(): #if finals
await channel.send(f"The final series of the {league.name} regular season is starting now, at {config()['simmadome_url']+ext}") await channel.send(f"The final series of the {league.name} regular season is starting now, at {config()['simmadome_url']+ext}")
@ -2270,6 +2277,11 @@ async def league_day_watcher(channel, league, games_list, filter_url, last = Fal
leagues.save_league(league) leagues.save_league(league)
active_standings[league] = await channel.send(embed=league.standings_embed()) active_standings[league] = await channel.send(embed=league.standings_embed())
await channel.send(f"The day {league.day} games for the {league.name} will start in {math.ceil(wait_seconds/60)} minutes.") await channel.send(f"The day {league.day} games for the {league.name} will start in {math.ceil(wait_seconds/60)} minutes.")
weather_check_result = league.weather_event_check()
if weather_check_result == 2:
await channel.send(f"The entire league is struck by a {league.weather_override.emoji} {league.weather_override.name}! The games must go on.")
elif weather_check_result == 1:
await channel.send(f"The {league.weather_override.emoji} {league.weather_override.name} continues to afflict the league.")
await asyncio.sleep(wait_seconds) await asyncio.sleep(wait_seconds)
await channel.send(f"A {league.name} series is continuing now at {filter_url}") await channel.send(f"A {league.name} series is continuing now at {filter_url}")
games_list = await continue_league_series(league, queued_games, games_list, series_results, missed) games_list = await continue_league_series(league, queued_games, games_list, series_results, missed)