2021-07-06 02:14:22 +00:00
import json , random , os , math , jsonpickle , weather , archetypes
2020-12-21 05:23:02 +00:00
import database as db
2021-07-06 01:26:55 +00:00
from league_storage import get_mods , get_team_mods
2021-03-25 00:04:03 +00:00
from gametext import base_string , appearance_outcomes , game_strings_base
2020-12-21 05:23:02 +00:00
2021-01-06 10:53:51 +00:00
data_dir = " data "
games_config_file = os . path . join ( data_dir , " games_config.json " )
2020-12-21 05:23:02 +00:00
def config ( ) :
2021-01-06 10:53:51 +00:00
if not os . path . exists ( os . path . dirname ( games_config_file ) ) :
os . makedirs ( os . path . dirname ( games_config_file ) )
if not os . path . exists ( games_config_file ) :
2020-12-21 05:23:02 +00:00
#generate default config
config_dic = {
" default_length " : 3 ,
" stlat_weights " : {
" batting_stars " : 1 , #batting
2020-12-27 23:09:19 +00:00
" pitching_stars " : 0.8 , #pitching
2020-12-21 05:23:02 +00:00
" baserunning_stars " : 1 , #baserunning
" defense_stars " : 1 #defense
2020-12-27 21:51:41 +00:00
} ,
" stolen_base_chance_mod " : 1 ,
" stolen_base_success_mod " : 1
2020-12-21 05:23:02 +00:00
}
2021-01-06 10:53:51 +00:00
with open ( games_config_file , " w " ) as config_file :
2020-12-21 05:23:02 +00:00
json . dump ( config_dic , config_file , indent = 4 )
return config_dic
else :
2021-01-06 10:53:51 +00:00
with open ( games_config_file ) as config_file :
2020-12-21 05:23:02 +00:00
return json . load ( config_file )
class player ( object ) :
def __init__ ( self , json_string ) :
self . stlats = json . loads ( json_string )
self . id = self . stlats [ " id " ]
self . name = self . stlats [ " name " ]
2020-12-22 06:56:33 +00:00
self . game_stats = {
" outs_pitched " : 0 ,
" walks_allowed " : 0 ,
" hits_allowed " : 0 ,
" strikeouts_given " : 0 ,
" runs_allowed " : 0 ,
" plate_appearances " : 0 ,
" walks_taken " : 0 ,
" sacrifices " : 0 ,
" hits " : 0 ,
" home_runs " : 0 ,
" total_bases " : 0 ,
" rbis " : 0 ,
" strikeouts_taken " : 0
}
2021-02-24 03:14:47 +00:00
self . stat_name = self . name
2021-06-30 20:03:33 +00:00
if self . name == " Tim Locastro " :
self . randomize_stars ( )
2021-02-24 03:14:47 +00:00
2020-12-23 01:20:58 +00:00
def star_string ( self , key ) :
str_out = " "
starstring = str ( self . stlats [ key ] )
if " .5 " in starstring :
starnum = int ( starstring [ 0 ] )
addhalf = True
else :
starnum = int ( starstring [ 0 ] )
addhalf = False
str_out + = " ⭐ " * starnum
if addhalf :
str_out + = " ✨ "
return str_out
2020-12-22 06:56:33 +00:00
def __str__ ( self ) :
return self . name
2020-12-21 05:23:02 +00:00
2021-06-30 20:03:33 +00:00
def randomize_stars ( self ) :
for key in [ " batting_stars " , " pitching_stars " , " baserunning_stars " , " defense_stars " ] :
#random star value between 0 and 6.5
stars = random . randint ( 0 , 6 )
half_star = random . random ( ) < 0.5 #half star addition
if half_star :
stars = half_star + 0.5
self . stlats [ key ] = stars
2021-07-06 01:26:55 +00:00
def apply_mods ( self , mod_dic ) :
for stat in iter ( mod_dic . keys ( ) ) :
self . stlats [ stat ] = self . stlats [ stat ] + mod_dic [ stat ]
2020-12-21 05:23:02 +00:00
class team ( object ) :
def __init__ ( self ) :
self . name = None
self . lineup = [ ]
self . lineup_position = 0
2021-01-02 06:10:52 +00:00
self . rotation = [ ]
2021-07-06 02:14:22 +00:00
self . archetypes = { }
2020-12-21 05:23:02 +00:00
self . pitcher = None
2020-12-22 06:56:33 +00:00
self . score = 0
2020-12-24 09:51:38 +00:00
self . slogan = None
2020-12-21 05:23:02 +00:00
2021-01-02 09:02:57 +00:00
def find_player ( self , name ) :
for index in range ( 0 , len ( self . lineup ) ) :
2021-03-28 17:20:55 +00:00
if self . lineup [ index ] . name . replace ( " " , " " ) == name :
2021-01-02 09:02:57 +00:00
return ( self . lineup [ index ] , index , self . lineup )
for index in range ( 0 , len ( self . rotation ) ) :
2021-03-28 17:20:55 +00:00
if self . rotation [ index ] . name . replace ( " " , " " ) == name :
2021-01-02 09:02:57 +00:00
return ( self . rotation [ index ] , index , self . rotation )
else :
return ( None , None , None )
2021-02-03 08:12:24 +00:00
def find_player_spec ( self , name , roster ) :
for s_index in range ( 0 , len ( roster ) ) :
2021-03-28 17:20:55 +00:00
if roster [ s_index ] . name . replace ( " " , " " ) == name :
2021-02-03 08:12:24 +00:00
return ( roster [ s_index ] , s_index )
2021-01-03 06:04:51 +00:00
def average_stars ( self ) :
total_stars = 0
for _player in self . lineup :
total_stars + = _player . stlats [ " batting_stars " ]
for _player in self . rotation :
total_stars + = _player . stlats [ " pitching_stars " ]
return total_stars / ( len ( self . lineup ) + len ( self . rotation ) )
2021-01-02 06:10:52 +00:00
def swap_player ( self , name ) :
2021-01-02 09:02:57 +00:00
this_player , index , roster = self . find_player ( name )
if this_player is not None and len ( roster ) > 1 :
if roster == self . lineup :
if self . add_pitcher ( this_player ) :
roster . pop ( index )
return True
else :
if self . add_lineup ( this_player ) [ 0 ] :
self . rotation . pop ( index )
return True
2021-01-02 06:10:52 +00:00
return False
2021-01-02 09:02:57 +00:00
def delete_player ( self , name ) :
this_player , index , roster = self . find_player ( name )
if this_player is not None and len ( roster ) > 1 :
roster . pop ( index )
return True
else :
return False
def slide_player ( self , name , new_spot ) :
this_player , index , roster = self . find_player ( name )
2021-01-04 20:37:53 +00:00
if this_player is not None and new_spot < = len ( roster ) :
2021-01-02 09:02:57 +00:00
roster . pop ( index )
roster . insert ( new_spot - 1 , this_player )
return True
else :
return False
2021-02-03 08:12:24 +00:00
def slide_player_spec ( self , this_player_name , new_spot , roster ) :
index = None
for s_index in range ( 0 , len ( roster ) ) :
if roster [ s_index ] . name == this_player_name :
index = s_index
this_player = roster [ s_index ]
if index is None :
return False
elif new_spot < = len ( roster ) :
roster . pop ( index )
roster . insert ( new_spot - 1 , this_player )
return True
else :
return False
2021-01-02 06:10:52 +00:00
2020-12-21 05:23:02 +00:00
def add_lineup ( self , new_player ) :
2020-12-28 08:21:47 +00:00
if len ( self . lineup ) < 20 :
2020-12-21 05:23:02 +00:00
self . lineup . append ( new_player )
return ( True , )
else :
2020-12-28 08:21:47 +00:00
return ( False , " 20 players in the lineup, maximum. We ' re being really generous here. " )
2020-12-21 05:23:02 +00:00
2021-01-02 06:10:52 +00:00
def add_pitcher ( self , new_player ) :
if len ( self . rotation ) < 8 :
self . rotation . append ( new_player )
return True
else :
return False
def set_pitcher ( self , rotation_slot = None , use_lineup = False ) :
temp_rotation = self . rotation . copy ( )
if use_lineup :
2021-02-03 11:55:04 +00:00
for batter in self . lineup :
2021-01-02 06:10:52 +00:00
temp_rotation . append ( batter )
if rotation_slot is None :
self . pitcher = random . choice ( temp_rotation )
else :
2021-01-14 00:20:58 +00:00
self . pitcher = temp_rotation [ ( rotation_slot - 1 ) % len ( temp_rotation ) ]
2020-12-21 05:23:02 +00:00
def is_ready ( self ) :
2021-01-03 22:59:13 +00:00
try :
return ( len ( self . lineup ) > = 1 and len ( self . rotation ) > 0 )
except AttributeError :
self . rotation = [ self . pitcher ]
self . pitcher = None
return ( len ( self . lineup ) > = 1 and len ( self . rotation ) > 0 )
2020-12-21 05:23:02 +00:00
2021-07-06 01:26:55 +00:00
def apply_team_mods ( self , league_name ) :
mod_dic = get_team_mods ( league_name , self . name )
if mod_dic != { } and mod_dic != None :
for player_name in iter ( mod_dic . keys ( ) ) :
this_player = self . find_player ( player_name ) [ 0 ]
if this_player is not None :
this_player . apply_mods ( mod_dic [ player_name ] )
2020-12-24 09:51:38 +00:00
def prepare_for_save ( self ) :
self . lineup_position = 0
self . score = 0
2021-01-02 06:10:52 +00:00
if self . pitcher is not None and self . pitcher not in self . rotation :
self . rotation . append ( self . pitcher )
self . pitcher = None
2020-12-24 09:51:38 +00:00
for this_player in self . lineup :
for stat in this_player . game_stats . keys ( ) :
this_player . game_stats [ stat ] = 0
2021-01-02 06:10:52 +00:00
for this_player in self . rotation :
for stat in this_player . game_stats . keys ( ) :
this_player . game_stats [ stat ] = 0
2021-01-04 04:18:45 +00:00
return self
2020-12-24 09:51:38 +00:00
2020-12-21 05:23:02 +00:00
def finalize ( self ) :
if self . is_ready ( ) :
2021-01-13 11:32:28 +00:00
if self . pitcher == None :
self . set_pitcher ( )
2020-12-21 05:23:02 +00:00
while len ( self . lineup ) < = 4 :
2021-01-02 06:10:52 +00:00
self . lineup . append ( random . choice ( self . lineup ) )
return self
else :
2020-12-21 05:23:02 +00:00
return False
class game ( object ) :
2021-01-03 11:06:51 +00:00
def __init__ ( self , team1 , team2 , length = None ) :
2020-12-22 06:56:33 +00:00
self . over = False
2021-06-30 21:01:19 +00:00
self . random_weather_flag = False
2020-12-21 05:23:02 +00:00
self . teams = { " away " : team1 , " home " : team2 }
2022-09-18 15:27:36 +00:00
2021-07-06 02:14:22 +00:00
self . offense_archetypes = { }
self . defense_archetypes = { }
2020-12-21 05:23:02 +00:00
self . inning = 1
2020-12-22 06:56:33 +00:00
self . outs = 0
2020-12-21 05:23:02 +00:00
self . top_of_inning = True
2020-12-27 21:51:41 +00:00
self . last_update = ( { } , 0 ) #this is a ({outcome}, runs) tuple
2021-02-21 19:12:34 +00:00
self . play_has_begun = False
2020-12-23 01:20:58 +00:00
self . owner = None
2020-12-31 08:32:01 +00:00
self . victory_lap = False
2020-12-21 05:23:02 +00:00
if length is not None :
self . max_innings = length
else :
self . max_innings = config ( ) [ " default_length " ]
self . bases = { 1 : None , 2 : None , 3 : None }
2021-02-21 18:02:47 +00:00
self . weather = weather . Weather ( self )
2021-03-27 23:51:43 +00:00
self . voice = None
2021-02-21 08:03:25 +00:00
self . current_batter = None
2020-12-24 09:51:38 +00:00
2022-09-18 15:27:36 +00:00
try :
self . archetypes = { team1 . name : team1 . archetypes , team2 . name : team2 . archetypes }
for this_team in [ team1 , team2 ] :
for this_player in this_team . lineup + this_team . rotation :
if this_player . name in this_team . archetypes . keys ( ) :
this_team . archetypes [ this_player . name ] . modify_player_stats ( this_player )
except :
pass
2021-07-07 02:53:09 +00:00
2021-02-26 00:27:11 +00:00
def occupied_bases ( self ) :
occ_dic = { }
for base in self . bases . keys ( ) :
if self . bases [ base ] is not None :
occ_dic [ base ] = self . bases [ base ]
return occ_dic
2021-02-21 08:03:25 +00:00
def choose_next_batter ( self ) :
2020-12-21 05:23:02 +00:00
if self . top_of_inning :
bat_team = self . teams [ " away " ]
else :
bat_team = self . teams [ " home " ]
2021-01-02 10:42:14 +00:00
2021-02-21 08:03:25 +00:00
self . current_batter = bat_team . lineup [ bat_team . lineup_position % len ( bat_team . lineup ) ]
self . weather . on_choose_next_batter ( self )
def get_batter ( self ) :
if self . current_batter == None :
self . choose_next_batter ( )
return self . current_batter
2020-12-21 05:23:02 +00:00
def get_pitcher ( self ) :
if self . top_of_inning :
return self . teams [ " home " ] . pitcher
else :
return self . teams [ " away " ] . pitcher
def at_bat ( self ) :
2020-12-22 06:56:33 +00:00
outcome = { }
2020-12-21 05:23:02 +00:00
pitcher = self . get_pitcher ( )
batter = self . get_batter ( )
2020-12-22 06:56:33 +00:00
2020-12-21 05:23:02 +00:00
if self . top_of_inning :
2020-12-30 01:25:41 +00:00
defender_list = self . teams [ " home " ] . lineup . copy ( )
2020-12-21 05:23:02 +00:00
else :
2020-12-30 01:25:41 +00:00
defender_list = self . teams [ " away " ] . lineup . copy ( )
defender_list . append ( pitcher )
defender = random . choice ( defender_list ) #make pitchers field
2020-12-21 05:23:02 +00:00
2020-12-22 06:56:33 +00:00
outcome [ " batter " ] = batter
2021-03-31 00:00:29 +00:00
outcome [ " pitcher " ] = pitcher
2020-12-22 06:56:33 +00:00
outcome [ " defender " ] = " "
2021-07-06 02:14:22 +00:00
if pitcher . name in self . defense_archetypes . keys ( ) :
outcome [ " pitcher_archetype " ] = self . defense_archetypes [ pitcher . name ]
else :
outcome [ " pitcher_archetype " ] = archetypes . Archetype
if batter . name in self . offense_archetypes . keys ( ) :
outcome [ " batter_archetype " ] = self . offense_archetypes [ batter . name ]
else :
outcome [ " batter_archetype " ] = archetypes . Archetype
if defender . name in self . defense_archetypes . keys ( ) :
outcome [ " defender_archetype " ] = self . defense_archetypes [ defender . name ]
else :
outcome [ " defender_archetype " ] = archetypes . Archetype
2021-02-21 18:02:47 +00:00
player_rolls = { }
player_rolls [ " bat_stat " ] = random_star_gen ( " batting_stars " , batter )
player_rolls [ " pitch_stat " ] = random_star_gen ( " pitching_stars " , pitcher )
2021-02-21 08:03:25 +00:00
2021-02-21 18:02:47 +00:00
self . weather . modify_atbat_stats ( player_rolls )
2020-12-27 21:51:41 +00:00
2021-02-21 18:02:47 +00:00
roll = { }
roll [ " pb_system_stat " ] = ( random . gauss ( 1 * math . erf ( ( player_rolls [ " bat_stat " ] - player_rolls [ " pitch_stat " ] ) * 1.5 ) - 1.8 , 2.2 ) )
roll [ " hitnum " ] = random . gauss ( 2 * math . erf ( player_rolls [ " bat_stat " ] / 4 ) - 1 , 3 )
2020-12-21 05:23:02 +00:00
2021-02-21 18:02:47 +00:00
self . weather . modify_atbat_roll ( outcome , roll , defender )
2020-12-21 05:23:02 +00:00
2021-07-06 02:14:22 +00:00
outcome [ " batter_archetype " ] . modify_bat_rolls ( outcome , roll )
outcome [ " pitcher_archetype " ] . modify_bat_rolls ( outcome , roll )
2020-12-22 06:56:33 +00:00
2021-02-21 18:02:47 +00:00
if roll [ " pb_system_stat " ] < = 0 :
2020-12-21 05:23:02 +00:00
outcome [ " ishit " ] = False
fc_flag = False
2021-02-21 18:02:47 +00:00
if roll [ " hitnum " ] < - 1.5 :
2021-03-25 02:16:56 +00:00
outcome [ " outcome " ] = random . choice ( [ appearance_outcomes . strikeoutlooking , appearance_outcomes . strikeoutswinging ] )
2021-02-21 18:02:47 +00:00
elif roll [ " hitnum " ] < 1 :
2021-03-25 02:16:56 +00:00
outcome [ " outcome " ] = appearance_outcomes . groundout
2020-12-21 05:23:02 +00:00
outcome [ " defender " ] = defender
2021-02-21 18:02:47 +00:00
elif roll [ " hitnum " ] < 4 :
2021-03-25 02:16:56 +00:00
outcome [ " outcome " ] = appearance_outcomes . flyout
2020-12-21 05:23:02 +00:00
outcome [ " defender " ] = defender
2020-12-21 09:46:12 +00:00
else :
2021-03-25 02:16:56 +00:00
outcome [ " outcome " ] = appearance_outcomes . walk
2020-12-21 05:23:02 +00:00
2021-07-06 02:14:22 +00:00
outcome [ " batter_archetype " ] . modify_out_type ( outcome )
outcome [ " pitcher_archetype " ] . modify_out_type ( outcome )
2022-07-05 04:13:54 +00:00
if self . bases [ 1 ] is not None and roll [ " hitnum " ] < - 2 and ( self . outs != 2 or self . weather . out_extension ) :
2021-03-25 02:16:56 +00:00
outcome [ " outcome " ] = appearance_outcomes . doubleplay
2020-12-22 06:56:33 +00:00
outcome [ " defender " ] = " "
2020-12-27 07:06:43 +00:00
#for base in self.bases.values():
#if base is not None:
#fc_flag = True
2020-12-22 06:56:33 +00:00
2020-12-27 07:06:43 +00:00
runners = [ ( 0 , self . get_batter ( ) ) ]
for base in range ( 1 , 4 ) :
if self . bases [ base ] == None :
break
runners . append ( ( base , self . bases [ base ] ) )
outcome [ " runners " ] = runners #list of consecutive baserunners: (base number, player object)
2020-12-22 06:56:33 +00:00
2020-12-27 07:06:43 +00:00
if self . outs < 2 and len ( runners ) > 1 : #fielder's choice replaces not great groundouts if any forceouts are present
2020-12-27 07:44:40 +00:00
def_stat = random_star_gen ( " defense_stars " , defender )
2021-02-21 18:02:47 +00:00
if - 1.5 < = roll [ " hitnum " ] and roll [ " hitnum " ] < - 0.5 : #poorly hit groundouts
2021-03-25 02:16:56 +00:00
outcome [ " outcome " ] = appearance_outcomes . fielderschoice
2020-12-22 06:56:33 +00:00
outcome [ " defender " ] = " "
2020-12-27 07:06:43 +00:00
2021-07-07 02:53:09 +00:00
if outcome [ " outcome " ] not in [ appearance_outcomes . strikeoutlooking , appearance_outcomes . strikeoutswinging ] and 2.5 < = roll [ " hitnum " ] and self . outs < 2 : #well hit flyouts can lead to sacrifice flies/advanced runners
2020-12-27 07:06:43 +00:00
if self . bases [ 2 ] is not None or self . bases [ 3 ] is not None :
outcome [ " advance " ] = True
2020-12-21 05:23:02 +00:00
else :
2020-12-21 09:46:12 +00:00
outcome [ " ishit " ] = True
2021-02-21 18:02:47 +00:00
if roll [ " hitnum " ] < 1 :
2021-03-25 02:16:56 +00:00
outcome [ " outcome " ] = appearance_outcomes . single
2021-02-21 18:02:47 +00:00
elif roll [ " hitnum " ] < 2.85 or " error " in outcome . keys ( ) :
2021-03-25 02:16:56 +00:00
outcome [ " outcome " ] = appearance_outcomes . double
2021-02-21 18:02:47 +00:00
elif roll [ " hitnum " ] < 3.1 :
2021-03-25 02:16:56 +00:00
outcome [ " outcome " ] = appearance_outcomes . triple
2020-12-21 05:23:02 +00:00
else :
if self . bases [ 1 ] is not None and self . bases [ 2 ] is not None and self . bases [ 3 ] is not None :
2021-03-25 02:16:56 +00:00
outcome [ " outcome " ] = appearance_outcomes . grandslam
2020-12-21 05:23:02 +00:00
else :
2021-03-25 02:16:56 +00:00
outcome [ " outcome " ] = appearance_outcomes . homerun
2021-07-06 02:14:22 +00:00
outcome [ " batter_archetype " ] . modify_hit_type ( outcome )
outcome [ " pitcher_archetype " ] . modify_hit_type ( outcome )
2020-12-22 06:56:33 +00:00
return outcome
2020-12-27 21:51:41 +00:00
def thievery_attempts ( self ) : #returns either false or "at-bat" outcome
thieves = [ ]
attempts = [ ]
2021-07-06 07:01:44 +00:00
outcome = { }
2020-12-27 21:51:41 +00:00
for base in self . bases . keys ( ) :
if self . bases [ base ] is not None and base != 3 : #no stealing home in simsim, sorry stu
if self . bases [ base + 1 ] is None : #if there's somewhere to go
thieves . append ( ( self . bases [ base ] , base ) )
for baserunner , start_base in thieves :
2021-02-21 18:02:47 +00:00
stats = {
" run_stars " : random_star_gen ( " baserunning_stars " , baserunner ) * config ( ) [ " stolen_base_chance_mod " ] ,
" def_stars " : random_star_gen ( " defense_stars " , self . get_pitcher ( ) )
}
self . weather . modify_steal_stats ( stats )
2021-07-06 07:01:44 +00:00
if self . get_pitcher ( ) . name in self . defense_archetypes . keys ( ) :
outcome [ " pitcher_archetype " ] = self . defense_archetypes [ self . get_pitcher ( ) . name ]
2021-07-06 02:14:22 +00:00
else :
outcome [ " pitcher_archetype " ] = archetypes . Archetype
if baserunner . name in self . offense_archetypes . keys ( ) :
outcome [ " baserunner_archetype " ] = self . offense_archetypes [ baserunner . name ]
else :
outcome [ " baserunner_archetype " ] = archetypes . Archetype
outcome [ " pitcher_archetype " ] . hold_runner ( outcome , stats )
2021-02-21 18:02:47 +00:00
if stats [ " run_stars " ] > = ( stats [ " def_stars " ] - 1.5 ) : #if baserunner isn't worse than pitcher
2020-12-27 21:51:41 +00:00
roll = random . random ( )
2021-07-06 02:14:22 +00:00
outcome [ " baserunner_archetype " ] . steal_check ( outcome , roll )
2021-02-21 18:02:47 +00:00
if roll > = ( - ( ( ( stats [ " run_stars " ] + 1 ) / 14 ) * * 2 ) + 1 ) : #plug it into desmos or something, you'll see
2020-12-27 21:51:41 +00:00
attempts . append ( ( baserunner , start_base ) )
if len ( attempts ) == 0 :
return False
else :
2021-07-06 07:01:44 +00:00
return ( self . steals_check ( attempts , outcome ) , 0 ) #effectively an at-bat outcome with no score
2020-12-27 21:51:41 +00:00
2021-07-06 07:01:44 +00:00
def steals_check ( self , attempts , outcome ) :
2020-12-27 21:51:41 +00:00
if self . top_of_inning :
defense_team = self . teams [ " home " ]
else :
defense_team = self . teams [ " away " ]
for baserunner , start_base in attempts :
defender = random . choice ( defense_team . lineup ) #excludes pitcher
run_stat = random_star_gen ( " baserunning_stars " , baserunner )
def_stat = random_star_gen ( " defense_stars " , defender )
2020-12-27 23:09:19 +00:00
run_roll = random . gauss ( 2 * math . erf ( ( run_stat - def_stat ) / 4 ) - 1 , 3 ) * config ( ) [ " stolen_base_success_mod " ]
2021-07-06 02:14:22 +00:00
outcome [ " baserunner_archetype " ] . modify_steal_attempt ( outcome , run_roll )
outcome [ " pitcher_archetype " ] . modify_steal_attempt ( outcome , run_roll )
2021-07-06 02:29:02 +00:00
if defender . name in self . defense_archetypes . keys ( ) :
self . defense_archetypes [ defender . name ] . modify_steal_attempt ( outcome , run_roll )
2020-12-27 21:51:41 +00:00
if start_base == 2 :
run_roll = run_roll * .9 #stealing third is harder
if run_roll < 1 :
2021-03-27 23:13:08 +00:00
successful = False
2021-01-13 11:32:28 +00:00
self . get_pitcher ( ) . game_stats [ " outs_pitched " ] + = 1
2020-12-27 21:51:41 +00:00
self . outs + = 1
else :
2021-03-27 23:13:08 +00:00
successful = True
2020-12-27 21:51:41 +00:00
self . bases [ start_base + 1 ] = baserunner
self . bases [ start_base ] = None
2021-03-27 23:51:43 +00:00
self . voice . stealing ( outcome , baserunner . name , base_string ( start_base + 1 ) , defender . name , successful )
2021-03-27 23:13:08 +00:00
2021-04-18 18:39:34 +00:00
self . weather . steal_post_activate ( self , outcome )
2020-12-27 21:51:41 +00:00
if self . outs > = 3 :
self . flip_inning ( )
return outcome
2020-12-22 06:56:33 +00:00
def baserunner_check ( self , defender , outcome ) :
def_stat = random_star_gen ( " defense_stars " , defender )
2021-03-25 02:16:56 +00:00
if outcome [ " outcome " ] == appearance_outcomes . homerun or outcome [ " outcome " ] == appearance_outcomes . grandslam :
2020-12-22 06:56:33 +00:00
runs = 1
for base in self . bases . values ( ) :
if base is not None :
runs + = 1
self . bases = { 1 : None , 2 : None , 3 : None }
2021-01-14 03:34:46 +00:00
if " veil " in outcome . keys ( ) :
if runs < 4 :
self . bases [ runs ] = self . get_batter ( )
else :
runs + = 1
2020-12-22 06:56:33 +00:00
return runs
elif " advance " in outcome . keys ( ) :
2020-12-23 23:02:55 +00:00
runs = 0
2020-12-22 06:56:33 +00:00
if self . bases [ 3 ] is not None :
2021-03-25 02:16:56 +00:00
outcome [ " outcome " ] = appearance_outcomes . sacrifice
2020-12-26 10:21:14 +00:00
self . get_batter ( ) . game_stats [ " sacrifices " ] + = 1
2020-12-22 06:56:33 +00:00
self . bases [ 3 ] = None
runs = 1
if self . bases [ 2 ] is not None :
2020-12-27 08:16:19 +00:00
run_roll = random . gauss ( 2 * math . erf ( ( random_star_gen ( " baserunning_stars " , self . bases [ 2 ] ) - def_stat ) / 4 ) - 1 , 3 )
2021-07-06 02:29:02 +00:00
if self . bases [ 2 ] . name in self . offense_archetypes . keys ( ) :
self . offense_archetypes [ self . bases [ 2 ] . name ] . modify_tag_up_roll ( outcome , run_roll )
outcome [ " defender_archetype " ] . modify_tag_up_roll ( outcome , run_roll )
2020-12-27 08:16:19 +00:00
if run_roll > 2 :
2020-12-22 06:56:33 +00:00
self . bases [ 3 ] = self . bases [ 2 ]
self . bases [ 2 ] = None
return runs
2021-03-25 02:16:56 +00:00
elif outcome [ " outcome " ] == appearance_outcomes . fielderschoice :
2020-12-27 07:06:43 +00:00
furthest_base , runner = outcome [ " runners " ] . pop ( ) #get furthest baserunner
self . bases [ furthest_base ] = None
outcome [ " fc_out " ] = ( runner . name , base_string ( furthest_base + 1 ) ) #runner thrown out
2021-03-25 03:46:24 +00:00
outcome [ " runner " ] = runner . name
2021-03-25 02:16:56 +00:00
outcome [ " base " ] = furthest_base + 1
2020-12-27 07:06:43 +00:00
for index in range ( 0 , len ( outcome [ " runners " ] ) ) :
base , this_runner = outcome [ " runners " ] . pop ( )
self . bases [ base + 1 ] = this_runner #includes batter, at base 0
if self . bases [ 3 ] is not None and furthest_base == 1 : #fielders' choice with runners on the corners
self . bases [ 3 ] = None
return 1
2020-12-22 06:56:33 +00:00
return 0
2021-03-25 02:16:56 +00:00
elif outcome [ " outcome " ] == appearance_outcomes . groundout or outcome [ " outcome " ] == appearance_outcomes . doubleplay :
2020-12-27 07:06:43 +00:00
runs = 0
if self . bases [ 3 ] is not None :
runs + = 1
self . bases [ 3 ] = None
if self . bases [ 2 ] is not None :
2020-12-27 08:16:19 +00:00
run_roll = random . gauss ( 2 * math . erf ( ( random_star_gen ( " baserunning_stars " , self . bases [ 2 ] ) - def_stat ) / 4 ) - 1 , 3 )
2021-07-06 02:29:02 +00:00
if self . bases [ 2 ] . name in self . offense_archetypes . keys ( ) :
self . offense_archetypes [ self . bases [ 2 ] . name ] . modify_advance_roll ( outcome , run_roll )
outcome [ " defender_archetype " ] . modify_advance_roll ( outcome , run_roll )
2021-03-25 02:16:56 +00:00
if run_roll > 1.5 or outcome [ " outcome " ] == appearance_outcomes . doubleplay : #double play gives them time to run, guaranteed
2020-12-27 07:06:43 +00:00
self . bases [ 3 ] = self . bases [ 2 ]
self . bases [ 2 ] = None
if self . bases [ 1 ] is not None : #double plays set this to None before this call
2020-12-27 08:16:19 +00:00
run_roll = random . gauss ( 2 * math . erf ( ( random_star_gen ( " baserunning_stars " , self . bases [ 1 ] ) - def_stat ) / 4 ) - 1 , 3 )
2021-07-06 02:29:02 +00:00
if self . bases [ 1 ] . name in self . offense_archetypes . keys ( ) :
self . offense_archetypes [ self . bases [ 1 ] . name ] . modify_advance_roll ( outcome , run_roll )
outcome [ " defender_archetype " ] . modify_advance_roll ( outcome , run_roll )
2020-12-27 08:16:19 +00:00
if run_roll < 2 or self . bases [ 2 ] is not None : #if runner can't make it or if baserunner blocking on second, convert to fielder's choice
2021-03-25 02:16:56 +00:00
outcome [ " outcome " ] == appearance_outcomes . fielderschoice
2020-12-27 07:44:40 +00:00
runners = [ ( 0 , self . get_batter ( ) ) ]
for base in range ( 1 , 4 ) :
if self . bases [ base ] == None :
break
runners . append ( ( base , self . bases [ base ] ) )
outcome [ " runners " ] = runners #rebuild consecutive runners
return runs + self . baserunner_check ( defender , outcome ) #run again as fielder's choice instead
else :
2020-12-27 07:06:43 +00:00
self . bases [ 2 ] = self . bases [ 1 ]
self . bases [ 1 ] = None
return runs
2020-12-22 06:56:33 +00:00
elif outcome [ " ishit " ] :
runs = 0
2021-03-25 02:16:56 +00:00
if outcome [ " outcome " ] == appearance_outcomes . single :
2020-12-22 06:56:33 +00:00
if self . bases [ 3 ] is not None :
runs + = 1
self . bases [ 3 ] = None
if self . bases [ 2 ] is not None :
run_roll = random . gauss ( math . erf ( random_star_gen ( " baserunning_stars " , self . bases [ 2 ] ) - def_stat ) - .5 , 1.5 )
2021-07-06 02:29:02 +00:00
if self . bases [ 2 ] . name in self . offense_archetypes . keys ( ) :
self . offense_archetypes [ self . bases [ 2 ] . name ] . modify_extra_running_roll ( outcome , run_roll )
outcome [ " defender_archetype " ] . modify_extra_running_roll ( outcome , run_roll )
2020-12-22 06:56:33 +00:00
if run_roll > 0 :
runs + = 1
else :
self . bases [ 3 ] = self . bases [ 2 ]
self . bases [ 2 ] = None
if self . bases [ 1 ] is not None :
if self . bases [ 3 ] is None :
run_roll = random . gauss ( math . erf ( random_star_gen ( " baserunning_stars " , self . bases [ 1 ] ) - def_stat ) - .5 , 1.5 )
2021-07-06 02:29:02 +00:00
if self . bases [ 1 ] . name in self . offense_archetypes . keys ( ) :
self . offense_archetypes [ self . bases [ 1 ] . name ] . modify_extra_running_roll ( outcome , run_roll )
outcome [ " defender_archetype " ] . modify_extra_running_roll ( outcome , run_roll )
2020-12-22 06:56:33 +00:00
if run_roll > 0.75 :
self . bases [ 3 ] = self . bases [ 1 ]
else :
self . bases [ 2 ] = self . bases [ 1 ]
else :
self . bases [ 2 ] = self . bases [ 1 ]
self . bases [ 1 ] = None
self . bases [ 1 ] = self . get_batter ( )
return runs
2021-03-25 02:16:56 +00:00
elif outcome [ " outcome " ] == appearance_outcomes . double :
2020-12-22 06:56:33 +00:00
runs = 0
if self . bases [ 3 ] is not None :
runs + = 1
self . bases [ 3 ] = None
if self . bases [ 2 ] is not None :
runs + = 1
self . bases [ 2 ] = None
if self . bases [ 1 ] is not None :
run_roll = random . gauss ( math . erf ( random_star_gen ( " baserunning_stars " , self . bases [ 1 ] ) - def_stat ) - .5 , 1.5 )
2021-07-06 02:29:02 +00:00
if self . bases [ 1 ] . name in self . offense_archetypes . keys ( ) :
self . offense_archetypes [ self . bases [ 1 ] . name ] . modify_extra_running_roll ( outcome , run_roll )
outcome [ " defender_archetype " ] . modify_extra_running_roll ( outcome , run_roll )
2020-12-22 06:56:33 +00:00
if run_roll > 1 :
runs + = 1
self . bases [ 1 ] = None
else :
self . bases [ 3 ] = self . bases [ 1 ]
self . bases [ 1 ] = None
self . bases [ 2 ] = self . get_batter ( )
return runs
2020-12-21 05:23:02 +00:00
2021-03-25 02:16:56 +00:00
elif outcome [ " outcome " ] == appearance_outcomes . triple :
2020-12-22 06:56:33 +00:00
runs = 0
for basenum in self . bases . keys ( ) :
if self . bases [ basenum ] is not None :
runs + = 1
self . bases [ basenum ] = None
self . bases [ 3 ] = self . get_batter ( )
return runs
def batterup ( self ) :
scores_to_add = 0
2021-03-14 17:35:00 +00:00
2021-03-25 02:16:56 +00:00
if " twopart " not in self . last_update [ 0 ] :
2021-03-28 20:14:54 +00:00
result = self . at_bat ( )
2021-02-21 08:03:25 +00:00
2021-03-25 02:16:56 +00:00
if self . top_of_inning :
offense_team = self . teams [ " away " ]
defense_team = self . teams [ " home " ]
else :
offense_team = self . teams [ " home " ]
defense_team = self . teams [ " away " ]
2021-07-06 02:14:22 +00:00
self . offense_archetypes = self . archetypes [ offense_team . name ]
self . defense_archetypes = self . archetypes [ defense_team . name ]
2021-03-25 02:16:56 +00:00
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
2021-03-25 03:46:24 +00:00
if " advance " in result . keys ( ) and self . bases [ 3 ] is not None :
result [ " outcome " ] = appearance_outcomes . sacrifice
result [ " runner " ] = self . bases [ 3 ] . name
2021-03-28 20:14:54 +00:00
2021-03-25 02:16:56 +00:00
text_list = getattr ( self . voice , result [ " outcome " ] . name )
voice_index = random . randrange ( 0 , len ( text_list ) )
result [ " voiceindex " ] = voice_index
2020-12-21 05:23:02 +00:00
else :
2021-03-25 02:16:56 +00:00
result = { }
2020-12-27 21:51:41 +00:00
2021-06-27 20:55:24 +00:00
result = self . voice . activate ( self . last_update [ 0 ] , result , self )
2021-01-02 10:42:14 +00:00
2021-03-28 20:14:54 +00:00
if " twopart " not in result :
self . weather . activate ( self , result ) # possibly modify result in-place
if " text_only " in result :
return ( result , 0 )
2021-03-25 02:16:56 +00:00
if " twopart " in result :
2021-03-28 17:02:03 +00:00
if self . voice . post_format != [ ] :
format_list = [ ]
for extra_format in self . voice . post_format :
2021-04-01 05:33:20 +00:00
try :
if extra_format == " base " :
format_list . append ( base_string ( result [ " base " ] ) )
elif extra_format == " runner " :
format_list . append ( result [ " runner " ] )
except KeyError :
format_list . append ( " None " )
2021-03-28 17:02:03 +00:00
self . voice . post_format = [ ]
result [ " displaytext " ] = result [ " displaytext " ] . format ( * format_list )
2021-03-25 02:16:56 +00:00
return ( result , 0 )
2020-12-22 06:56:33 +00:00
if result [ " ishit " ] : #if batter gets a hit:
self . get_batter ( ) . game_stats [ " hits " ] + = 1
self . get_pitcher ( ) . game_stats [ " hits_allowed " ] + = 1
2021-03-25 02:16:56 +00:00
if result [ " outcome " ] == appearance_outcomes . single :
2020-12-22 06:56:33 +00:00
self . get_batter ( ) . game_stats [ " total_bases " ] + = 1
2021-03-25 02:16:56 +00:00
elif result [ " outcome " ] == appearance_outcomes . double :
2020-12-22 06:56:33 +00:00
self . get_batter ( ) . game_stats [ " total_bases " ] + = 2
2021-03-25 02:16:56 +00:00
elif result [ " outcome " ] == appearance_outcomes . triple :
2020-12-22 06:56:33 +00:00
self . get_batter ( ) . game_stats [ " total_bases " ] + = 3
2021-03-25 02:16:56 +00:00
elif result [ " outcome " ] == appearance_outcomes . homerun or result [ " outcome " ] == appearance_outcomes . grandslam :
2020-12-22 06:56:33 +00:00
self . get_batter ( ) . game_stats [ " total_bases " ] + = 4
self . get_batter ( ) . game_stats [ " home_runs " ] + = 1
2021-01-14 03:34:46 +00:00
2020-12-22 06:56:33 +00:00
2021-03-25 02:16:56 +00:00
scores_to_add + = self . baserunner_check ( result [ " defender " ] , result )
2020-12-22 06:56:33 +00:00
else : #batter did not get a hit
2021-03-25 02:16:56 +00:00
if result [ " outcome " ] == appearance_outcomes . walk :
2020-12-22 06:56:33 +00:00
walkers = [ ( 0 , self . get_batter ( ) ) ]
for base in range ( 1 , 4 ) :
if self . bases [ base ] == None :
break
walkers . append ( ( base , self . bases [ base ] ) )
for i in range ( 0 , len ( walkers ) ) :
this_walker = walkers . pop ( )
if this_walker [ 0 ] == 3 :
self . bases [ 3 ] = None
scores_to_add + = 1
else :
self . bases [ this_walker [ 0 ] + 1 ] = this_walker [ 1 ] #this moves all consecutive baserunners one forward
self . get_batter ( ) . game_stats [ " walks_taken " ] + = 1
self . get_pitcher ( ) . game_stats [ " walks_allowed " ] + = 1
2021-03-25 02:16:56 +00:00
elif result [ " outcome " ] == appearance_outcomes . doubleplay :
2020-12-22 06:56:33 +00:00
self . get_pitcher ( ) . game_stats [ " outs_pitched " ] + = 2
self . outs + = 2
2020-12-27 07:44:40 +00:00
self . bases [ 1 ] = None
if self . outs < 3 :
2021-03-28 17:02:03 +00:00
scores_to_add + = self . baserunner_check ( result [ " defender " ] , result )
2020-12-27 07:44:40 +00:00
self . get_batter ( ) . game_stats [ " rbis " ] - = scores_to_add #remove the fake rbi from the player in advance
2020-12-22 06:56:33 +00:00
2021-03-25 02:16:56 +00:00
elif result [ " outcome " ] == appearance_outcomes . fielderschoice or result [ " outcome " ] == appearance_outcomes . groundout :
2020-12-22 06:56:33 +00:00
self . get_pitcher ( ) . game_stats [ " outs_pitched " ] + = 1
self . outs + = 1
2020-12-27 07:44:40 +00:00
if self . outs < 3 :
2021-03-25 02:16:56 +00:00
scores_to_add + = self . baserunner_check ( result [ " defender " ] , result )
2020-12-22 06:56:33 +00:00
2021-03-25 03:46:24 +00:00
elif " advance " in result . keys ( ) or result [ " outcome " ] == appearance_outcomes . sacrifice :
2020-12-22 06:56:33 +00:00
self . get_pitcher ( ) . game_stats [ " outs_pitched " ] + = 1
self . outs + = 1
2020-12-27 07:44:40 +00:00
if self . outs < 3 :
if self . bases [ 3 ] is not None :
2021-03-25 03:46:24 +00:00
result [ " runner " ] = self . bases [ 3 ] . name
2020-12-27 07:44:40 +00:00
self . get_batter ( ) . game_stats [ " sacrifices " ] + = 1
2021-03-25 03:46:24 +00:00
scores_to_add + = self . baserunner_check ( result [ " defender " ] , result )
2020-12-22 06:56:33 +00:00
2021-03-25 02:16:56 +00:00
elif result [ " outcome " ] == appearance_outcomes . strikeoutlooking or result [ " outcome " ] == appearance_outcomes . strikeoutswinging :
2020-12-22 06:56:33 +00:00
self . get_pitcher ( ) . game_stats [ " outs_pitched " ] + = 1
self . outs + = 1
self . get_batter ( ) . game_stats [ " strikeouts_taken " ] + = 1
self . get_pitcher ( ) . game_stats [ " strikeouts_given " ] + = 1
else :
self . get_pitcher ( ) . game_stats [ " outs_pitched " ] + = 1
self . outs + = 1
2020-12-26 10:21:14 +00:00
self . get_batter ( ) . game_stats [ " plate_appearances " ] + = 1
2021-03-25 02:45:49 +00:00
if self . voice . post_format != [ ] :
format_list = [ ]
for extra_format in self . voice . post_format :
2021-04-01 03:53:56 +00:00
try :
if extra_format == " base " :
format_list . append ( base_string ( result [ " base " ] ) )
elif extra_format == " runner " :
format_list . append ( result [ " runner " ] )
except KeyError :
format_list . append ( " None " )
2021-03-25 02:45:49 +00:00
self . voice . post_format = [ ]
result [ " displaytext " ] = result [ " displaytext " ] . format ( * format_list )
2021-04-18 18:39:34 +00:00
2020-12-27 19:23:17 +00:00
if self . outs < 3 :
2021-03-25 02:16:56 +00:00
result [ " offense_team " ] . score + = scores_to_add #only add points if inning isn't over
2020-12-27 19:23:17 +00:00
else :
scores_to_add = 0
2020-12-22 06:56:33 +00:00
self . get_batter ( ) . game_stats [ " rbis " ] + = scores_to_add
self . get_pitcher ( ) . game_stats [ " runs_allowed " ] + = scores_to_add
2021-03-25 02:16:56 +00:00
result [ " offense_team " ] . lineup_position + = 1 #put next batter up
2021-04-18 18:39:34 +00:00
self . choose_next_batter ( )
2021-04-18 17:02:08 +00:00
self . weather . post_activate ( self , result )
2020-12-22 06:56:33 +00:00
if self . outs > = 3 :
self . flip_inning ( )
2021-02-21 08:03:25 +00:00
2020-12-22 06:56:33 +00:00
return ( result , scores_to_add ) #returns ab information and scores
def flip_inning ( self ) :
for base in self . bases . keys ( ) :
self . bases [ base ] = None
self . outs = 0
2021-02-21 08:03:25 +00:00
self . top_of_inning = not self . top_of_inning
2021-06-30 21:01:19 +00:00
if self . random_weather_flag and self . top_of_inning :
setattr ( self , " weather " , random . choice ( list ( weather . safe_weathers ( ) . values ( ) ) ) ( self ) )
2021-02-21 08:03:25 +00:00
self . weather . on_flip_inning ( self )
self . choose_next_batter ( )
2021-01-02 10:42:14 +00:00
2021-02-22 06:52:01 +00:00
if self . top_of_inning :
2020-12-22 06:56:33 +00:00
self . inning + = 1
if self . inning > self . max_innings and self . teams [ " home " ] . score != self . teams [ " away " ] . score : #game over
self . over = True
2021-06-30 21:01:19 +00:00
try : #if something goes wrong with OBL don't erase game
if self . max_innings > = 9 or self . weather . name in [ " Leaf Eddies " , " Torrential Downpour " ] :
2022-07-07 15:58:00 +00:00
this_xvi_team = None
2021-06-30 21:01:19 +00:00
db . save_obl_results ( self . teams [ " home " ] if self . teams [ " home " ] . score > self . teams [ " away " ] . score else self . teams [ " away " ] , self . teams [ " home " ] if self . teams [ " home " ] . score < self . teams [ " away " ] . score else self . teams [ " away " ] , xvi_team = this_xvi_team )
except :
pass
2021-02-03 09:24:11 +00:00
2020-12-22 06:56:33 +00:00
def end_of_game_report ( self ) :
return {
" away_team " : self . teams [ " away " ] ,
" away_pitcher " : self . teams [ " away " ] . pitcher ,
" home_team " : self . teams [ " home " ] ,
" home_pitcher " : self . teams [ " home " ] . pitcher
}
2020-12-28 08:21:47 +00:00
def named_bases ( self ) :
name_bases = { }
for base in range ( 1 , 4 ) :
if self . bases [ base ] is not None :
name_bases [ base ] = self . bases [ base ] . name
else :
name_bases [ base ] = None
return name_bases
2020-12-22 12:59:46 +00:00
2020-12-27 21:51:41 +00:00
def gamestate_update_full ( self ) :
2021-02-21 19:12:34 +00:00
self . play_has_begun = True
2020-12-27 21:51:41 +00:00
attempts = self . thievery_attempts ( )
2021-03-25 03:46:24 +00:00
if attempts == False or " twopart " in self . last_update [ 0 ] :
2020-12-27 21:51:41 +00:00
self . last_update = self . batterup ( )
else :
self . last_update = attempts
2020-12-22 06:56:33 +00:00
return self . gamestate_display_full ( )
def gamestate_display_full ( self ) :
2021-02-21 19:12:34 +00:00
if not self . over :
2020-12-27 21:51:41 +00:00
return " Still in progress. "
else :
2021-02-21 19:12:34 +00:00
return f """ Game over! Final score: ** { self . teams [ ' away ' ] . score } - { self . teams [ ' home ' ] . score } ** """
2020-12-26 09:46:42 +00:00
def add_stats ( self ) :
2021-01-13 09:23:48 +00:00
players = self . get_stats ( )
db . add_stats ( players )
def get_stats ( self ) :
2020-12-26 09:46:42 +00:00
players = [ ]
for this_player in self . teams [ " away " ] . lineup :
2021-02-24 03:14:47 +00:00
players . append ( ( this_player . stat_name , this_player . game_stats ) )
2020-12-26 09:46:42 +00:00
for this_player in self . teams [ " home " ] . lineup :
2021-02-24 03:14:47 +00:00
players . append ( ( this_player . stat_name , this_player . game_stats ) )
players . append ( ( self . teams [ " home " ] . pitcher . stat_name , self . teams [ " home " ] . pitcher . game_stats ) )
players . append ( ( self . teams [ " away " ] . pitcher . stat_name , self . teams [ " away " ] . pitcher . game_stats ) )
2021-01-13 09:23:48 +00:00
return players
2021-01-13 11:32:28 +00:00
def get_team_specific_stats ( self ) :
players = {
self . teams [ " away " ] . name : [ ] ,
self . teams [ " home " ] . name : [ ]
}
for this_player in self . teams [ " away " ] . lineup :
2021-02-24 17:36:10 +00:00
try :
players [ self . teams [ " away " ] . name ] . append ( ( this_player . stat_name , this_player . game_stats ) )
except AttributeError :
players [ self . teams [ " away " ] . name ] . append ( ( this_player . name , this_player . game_stats ) )
2021-01-13 11:32:28 +00:00
for this_player in self . teams [ " home " ] . lineup :
2021-02-24 17:36:10 +00:00
try :
players [ self . teams [ " home " ] . name ] . append ( ( this_player . stat_name , this_player . game_stats ) )
except AttributeError :
players [ self . teams [ " home " ] . name ] . append ( ( this_player . name , this_player . game_stats ) )
try :
players [ self . teams [ " home " ] . name ] . append ( ( self . teams [ " home " ] . pitcher . stat_name , self . teams [ " home " ] . pitcher . game_stats ) )
except AttributeError :
players [ self . teams [ " home " ] . name ] . append ( ( self . teams [ " home " ] . pitcher . name , self . teams [ " home " ] . pitcher . game_stats ) )
try :
players [ self . teams [ " away " ] . name ] . append ( ( self . teams [ " away " ] . pitcher . stat_name , self . teams [ " away " ] . pitcher . game_stats ) )
except AttributeError :
players [ self . teams [ " away " ] . name ] . append ( ( self . teams [ " away " ] . pitcher . name , self . teams [ " away " ] . pitcher . game_stats ) )
2021-01-13 11:32:28 +00:00
return players
2020-12-21 05:23:02 +00:00
2020-12-21 09:46:12 +00:00
2020-12-21 05:23:02 +00:00
def random_star_gen ( key , player ) :
return random . gauss ( config ( ) [ " stlat_weights " ] [ key ] * player . stlats [ key ] , 1 )
# innings_pitched
# walks_allowed
# strikeouts_given
# runs_allowed
# plate_appearances
# walks
# hits
# total_bases
# rbis
# walks_taken
# strikeouts_taken
2020-12-24 09:51:38 +00:00
def get_team ( name ) :
2020-12-27 08:42:09 +00:00
try :
team_json = jsonpickle . decode ( db . get_team ( name ) [ 0 ] , keys = True , classes = team )
if team_json is not None :
2021-01-02 06:10:52 +00:00
if team_json . pitcher is not None : #detects old-format teams, adds pitcher
team_json . rotation . append ( team_json . pitcher )
team_json . pitcher = None
update_team ( team_json )
2021-06-30 20:03:33 +00:00
for player in team_json . rotation + team_json . lineup :
if player . name == " Tim Locastro " :
player . randomize_stars ( )
2021-07-06 07:01:44 +00:00
if not hasattr ( team_json , " archetypes " ) :
team_json . archetypes = { }
2020-12-27 08:42:09 +00:00
return team_json
return None
2021-01-02 06:10:52 +00:00
except AttributeError :
team_json . rotation = [ ]
team_json . rotation . append ( team_json . pitcher )
team_json . pitcher = None
update_team ( team_json )
return team_json
2020-12-27 08:42:09 +00:00
except :
return None
2020-12-24 09:51:38 +00:00
2020-12-28 00:05:49 +00:00
def get_team_and_owner ( name ) :
2021-01-02 06:10:52 +00:00
try :
counter , name , team_json_string , timestamp , owner_id = db . get_team ( name , owner = True )
team_json = jsonpickle . decode ( team_json_string , keys = True , classes = team )
if team_json is not None :
if team_json . pitcher is not None : #detects old-format teams, adds pitcher
team_json . rotation . append ( team_json . pitcher )
team_json . pitcher = None
update_team ( team_json )
2021-06-30 20:03:33 +00:00
for player in team_json . rotation + team_json . lineup :
if player . name == " Tim Locastro " :
player . randomize_stars ( )
2021-07-06 07:01:44 +00:00
if not hasattr ( team_json , " archetypes " ) :
team_json . archetypes = { }
2021-01-02 06:10:52 +00:00
return ( team_json , owner_id )
2021-07-06 05:39:19 +00:00
return ( None , None )
2021-01-02 06:10:52 +00:00
except AttributeError :
team_json . rotation = [ ]
team_json . rotation . append ( team_json . pitcher )
team_json . pitcher = None
update_team ( team_json )
2020-12-28 00:05:49 +00:00
return ( team_json , owner_id )
2021-01-02 06:10:52 +00:00
except :
2023-03-31 06:18:28 +00:00
return ( None , None )
2020-12-28 00:05:49 +00:00
2020-12-27 02:53:46 +00:00
def save_team ( this_team , user_id ) :
2020-12-24 09:51:38 +00:00
try :
this_team . prepare_for_save ( )
team_json_string = jsonpickle . encode ( this_team , keys = True )
2020-12-27 02:53:46 +00:00
db . save_team ( this_team . name , team_json_string , user_id )
2020-12-24 09:51:38 +00:00
return True
except :
2020-12-26 09:46:42 +00:00
return None
2021-01-02 06:10:52 +00:00
def update_team ( this_team ) :
try :
this_team . prepare_for_save ( )
team_json_string = jsonpickle . encode ( this_team , keys = True )
db . update_team ( this_team . name , team_json_string )
return True
except :
return None
2020-12-26 09:46:42 +00:00
def get_all_teams ( ) :
teams = [ ]
for team_pickle in db . get_all_teams ( ) :
this_team = jsonpickle . decode ( team_pickle [ 0 ] , keys = True , classes = team )
teams . append ( this_team )
return teams
def search_team ( search_term ) :
teams = [ ]
for team_pickle in db . search_teams ( search_term ) :
2021-01-02 06:10:52 +00:00
team_json = jsonpickle . decode ( team_pickle [ 0 ] , keys = True , classes = team )
try :
if team_json . pitcher is not None :
if len ( team_json . rotation ) == 0 : #detects old-format teams, adds pitcher
team_json . rotation . append ( team_json . pitcher )
team_json . pitcher = None
update_team ( team_json )
2021-06-30 20:03:33 +00:00
for player in team_json . rotation + team_json . lineup :
if player . name == " Tim Locastro " :
player . randomize_stars ( )
2021-07-06 07:01:44 +00:00
if not hasattr ( team_json , " archetypes " ) :
team_json . archetypes = { }
2021-01-02 06:10:52 +00:00
except AttributeError :
team_json . rotation = [ ]
team_json . rotation . append ( team_json . pitcher )
team_json . pitcher = None
update_team ( team_json )
except :
return None
teams . append ( team_json )
2021-01-02 09:02:57 +00:00
return teams
2021-02-22 19:27:04 +00:00
def get_filtered_teams ( teams_to_remove ) :
teams = [ ]
for team_pickle in db . get_all_teams ( ) :
this_team = jsonpickle . decode ( team_pickle [ 0 ] , keys = True , classes = team )
if this_team . name not in teams_to_remove :
teams . append ( this_team )
return teams