From d49eb98aedd56872b888cc50443d17128b1dc370 Mon Sep 17 00:00:00 2001 From: Sakimori Date: Wed, 24 Mar 2021 20:04:03 -0400 Subject: [PATCH] started making voices actually display --- games.py | 12 ++++++--- gametext.py | 62 +++++++++++++++++++++++++++++++++++----------- main_controller.py | 24 ++++++++++++++---- the_prestige.py | 9 ++++--- 4 files changed, 80 insertions(+), 27 deletions(-) diff --git a/games.py b/games.py index cedeef5..5cbc3a4 100644 --- a/games.py +++ b/games.py @@ -1,7 +1,6 @@ -import json, random, os, math, jsonpickle +import json, random, os, math, jsonpickle, weather import database as db -import weather -from gametext import base_string, appearance_outcomes +from gametext import base_string, appearance_outcomes, game_strings_base data_dir = "data" games_config_file = os.path.join(data_dir, "games_config.json") @@ -223,6 +222,7 @@ class game(object): self.max_innings = config()["default_length"] self.bases = {1 : None, 2 : None, 3 : None} self.weather = weather.Weather(self) + self.voice = game_strings_base() self.current_batter = None def occupied_bases(self): @@ -519,8 +519,9 @@ class game(object): result = self.at_bat() self.weather.activate(self, result) # possibly modify result in-place + self.voice.activate(self.last_update[0], result) - if "text_only" in result: + if "text_only" in result or "twopart" in result: return (result, 0) @@ -535,6 +536,9 @@ class game(object): defenders = defense_team.lineup.copy() defenders.append(defense_team.pitcher) defender = random.choice(defenders) #pitcher can field outs now :3 + result["defender"] = defender + result["defense_team"] = defense_team + result["offense_team"] = offense_team if result["ishit"]: #if batter gets a hit: self.get_batter().game_stats["hits"] += 1 diff --git a/gametext.py b/gametext.py index c31b31b..4d2101f 100644 --- a/gametext.py +++ b/gametext.py @@ -16,11 +16,11 @@ class appearance_outcomes(Enum): grandslam = "hits a grand slam!" class game_strings_base(object): - default_format = ("defender",) - diff_formats = {fielderschoice: ("defender", "base_string")} - no_formats = [strikeoutlooking, strikeoutswinging, doubleplay, walk, single, double, triple, homerun, grandslam] + def __init__(self): + self.intro_counter = 1 + + default_format = ("defender",) - intro_counter = 1 intro_formats = [] intro = [("🎆", "Play ball!")] @@ -37,21 +37,45 @@ class game_strings_base(object): triple = "hits a triple!" homerun = "hits a dinger!" grandslam = "hits a grand slam!" + twoparts = [] - def check_for_twopart(game, gamestring): #will check just before atbat is generated - return gamestring in twoparts + diff_formats = {fielderschoice: ("defender", "base_string")} + no_formats = [strikeoutlooking, strikeoutswinging, doubleplay, walk, single, double, triple, homerun, grandslam] + + def activate(self, lastupdate, currentupdate): + #try: + if "text" in lastupdate and self.check_for_twopart(getattr(self, lastupdate["text"].name)[lastupdate["voiceindex"]]): + currentupdate.clear() + currentupdate.update({ + "text": getattr(self, lastupdate["text"].name)[lastupdate["text_index"][1]], + "twopart": True, + 'defender': lastupdate['defender'], + 'base': lastupdate['base'], + 'batter': lastupdate['batter'], + 'runner': lastupdate['runner'], + 'defense_team': lastupdate['defense_team'], + 'offense_team': lastupdate['offense_team'] + }) + #except: + #pass + + def check_for_twopart(self, gamestring): + return gamestring in self.twoparts + + def format_gamestring(self, gamestring, game): + if gamestring in self.no_formats: + return gamestring + elif gamestring in self.diff_formats: + return gamestring.format(*parse_formats(self.diff_formats[gamestring], game)) + else: + return gamestring.format(*parse_formats(self.default_format, game)) class TheGoddesses(game_strings_base): - diff_formats = {groundout[3][1] : ("batter",), - flyout[0][1]: ("batter",), flyout[2][1]: ("defender", "batter"), - fielderschoice[0]: ("defender", "fc_out", "batter"), fielderschoice[1]: ("base_string", "fc_out"), - doubleplay[0]: ("defender", "defense_team"), doubleplay[1]: ("defender", "defense_team"), - sacrifice[0][0]: ("runner",), sacrifice[1]: ("runner",), - single[0][1]: ("batter",)} - no_formats = strikeoutlooking + strikeoutswinging + walk + single[1:] + [flyout[4][0], sacrifice[0][1]] - intro_counter = 2 + def __init__(self): + self.intro_counter = 3 + intro = [("💜", "This game is now blessed 💜\nI'm Sakimori,"), ("🌺", "and i'm xvi! the sim16 goddesses are live and on-site, bringing you today's game~"), ("🎆", "Play ball!!")] strikeoutlooking = ["watches a slider barely catch the outside corner. Hang up a ꓘ!", @@ -97,7 +121,15 @@ class TheGoddesses(game_strings_base): triple = "hits a triple!" homerun = "hits a dinger!" grandslam = "hits a grand slam!" - twoparts = [groundout[1], groundout[3], flyout[0], flyout[2], flyout[4], walk[2], single[0]] + + diff_formats = {groundout[3][1] : ("batter",), + flyout[0][1]: ("batter",), flyout[2][1]: ("defender", "batter"), + fielderschoice[0]: ("defender", "fc_out", "batter"), fielderschoice[1]: ("base_string", "fc_out"), + doubleplay[0]: ("defender", "defense_team"), doubleplay[1]: ("defender", "defense_team"), + sacrifice[0][0]: ("runner",), sacrifice[1]: ("runner",), + single[0][1]: ("batter",)} + no_formats = strikeoutlooking + strikeoutswinging + walk + single[1:] + [flyout[4][0], sacrifice[0][1]] + twoparts = [groundout[1], groundout[3], flyout[0], flyout[2], flyout[4], walk[2], single[0], sacrifice[0]] def parse_formats(format_tuple, game): diff --git a/main_controller.py b/main_controller.py index 0c0db3a..f2e59ca 100644 --- a/main_controller.py +++ b/main_controller.py @@ -3,6 +3,7 @@ from leagues import league_structure from league_storage import league_exists from flask import Flask, url_for, Response, render_template, request, jsonify, send_from_directory, abort from flask_socketio import SocketIO, emit +from random import randrange import database as db app = Flask("the-prestige", static_folder='simmadome/build/', subdomain_matching=True) @@ -142,8 +143,13 @@ def update_loop(): state["home_score"] = this_game.teams["home"].score #update_pause = 0 #victory_lap = False if not this_game.play_has_begun: #weather_emoji - state["update_emoji"] = "🎆" #weather_text - state["update_text"] = "Play ball!" #they also need a timestamp + if state["start_delay"] - this_game.voice.intro_counter > -1: + state["update_emoji"] = "🪑" #weather_text + state["update_text"] = "The broadcast booth is being prepared..." #they also need a timestamp + else: + state["update_emoji"] = this_game.voice.intro[-this_game.voice.intro_counter][0] + state["update_text"] = this_game.voice.intro[-this_game.voice.intro_counter][1] + this_game.voice.intro_counter -= 1 state["start_delay"] -= 1 state["display_top_of_inning"] = state["top_of_inning"] @@ -218,12 +224,20 @@ def update_loop(): name, out_at_base_string = this_game.last_update[0]['fc_out'] updatestring = f"{this_game.last_update[0]['batter']} {this_game.last_update[0]['text'].value.format(name, out_at_base_string)} {this_game.last_update[0]['defender']}{punc}" else: - updatestring = f"{this_game.last_update[0]['batter']} {this_game.last_update[0]['text'].value} {this_game.last_update[0]['defender']}{punc}" + text_list = getattr(this_game.voice, this_game.last_update[0]["text"].name) + voice_index = randrange(0, len(text_list)) + updatestring = text_list[voice_index] + this_game.last_update[0]["voiceindex"] = voice_index + if this_game.voice.check_for_twopart(updatestring): + updatestring = updatestring[0] + this_game.last_update[0]["twopart"] = True + updatestring = this_game.voice.format_gamestring(updatestring, this_game) + if this_game.last_update[1] > 0: updatestring += f"{this_game.last_update[1]} runs scored!" - state["update_text"] = updatestring + state["update_text"] = f"{this_game.last_update[0]['batter']} {updatestring}" this_game.weather.modify_atbat_message(this_game, state) @@ -247,4 +261,4 @@ def update_loop(): state["update_pause"] -= 1 socketio.emit("states_update", game_states) - time.sleep(8) \ No newline at end of file + time.sleep(3) \ No newline at end of file diff --git a/the_prestige.py b/the_prestige.py index 8609ee5..53b01c0 100644 --- a/the_prestige.py +++ b/the_prestige.py @@ -1,4 +1,4 @@ -import discord, json, math, os, roman, games, asyncio, random, main_controller, threading, time, urllib, leagues, datetime +import discord, json, math, os, roman, games, asyncio, random, main_controller, threading, time, urllib, leagues, datetime, gametext import database as db import onomancer as ono from league_storage import league_exists, season_save, season_restart @@ -1684,11 +1684,14 @@ async def watch_game(channel, newgame, user = None, league = None): main_controller.master_games_dic[id] = (newgame, state_init, discrim_string) -def prepare_game(newgame, league = None, weather_name = None): +def prepare_game(newgame, league = None, weather_name = None, voice = None): if weather_name is None and newgame.weather.name == "Sunny": weathers = weather.all_weathers() newgame.weather = weathers[random.choice(list(weathers.keys()))](newgame) + if voice is None: + newgame.voice = gametext.TheGoddesses() + state_init = { "away_name" : newgame.teams['away'].name, "home_name" : newgame.teams['home'].name, @@ -1698,7 +1701,7 @@ def prepare_game(newgame, league = None, weather_name = None): "victory_lap" : False, "weather_emoji" : newgame.weather.emoji, "weather_text" : newgame.weather.name, - "start_delay" : 3, + "start_delay" : 5, "end_delay" : 9 }