From 51c30b326ee3a029e8d48a8b30ae8b18d89ce508 Mon Sep 17 00:00:00 2001 From: Sakimori Date: Mon, 5 Jul 2021 22:14:22 -0400 Subject: [PATCH] began implementing archetypes --- archetypes.py | 27 ++++++++++++++++++++++++ games.py | 51 ++++++++++++++++++++++++++++++++++++++++++++- the-prestige.pyproj | 3 +++ 3 files changed, 80 insertions(+), 1 deletion(-) create mode 100644 archetypes.py diff --git a/archetypes.py b/archetypes.py new file mode 100644 index 0000000..80f1703 --- /dev/null +++ b/archetypes.py @@ -0,0 +1,27 @@ +import random +from gametext import appearance_outcomes + +class Archetype: + name = "basic" + display_name = "Jack of All Trades" + display_symbol = "🃏" + + def modify_bat_rolls(self, outcome, rolls): + """"modify the rolls used in batting before using the rolled values""" + pass + + def modify_out_type(self, outcome): + """if the batter would go out, do something""" + pass + + def modify_hit_type(self, outcome): + """if the batter would get a hit, do something""" + pass + + def hold_runner(self, outcome, stats): + """affect the pitcher's ability to prevent steal attempts""" + pass + + def steal_check(self, outcome, steal_roll): + """make a runner more or less likely to steal""" + pass \ No newline at end of file diff --git a/games.py b/games.py index 455e2bd..c54705e 100644 --- a/games.py +++ b/games.py @@ -1,4 +1,4 @@ -import json, random, os, math, jsonpickle, weather +import json, random, os, math, jsonpickle, weather, archetypes import database as db from league_storage import get_mods, get_team_mods from gametext import base_string, appearance_outcomes, game_strings_base @@ -91,6 +91,7 @@ class team(object): self.lineup = [] self.lineup_position = 0 self.rotation = [] + self.archetypes = {} self.pitcher = None self.score = 0 self.slogan = None @@ -234,6 +235,9 @@ class game(object): self.over = False self.random_weather_flag = False self.teams = {"away" : team1, "home" : team2} + self.archetypes = {team1.name : team1.archetypes, team2.name : team2.archetypes} + self.offense_archetypes = {} + self.defense_archetypes = {} self.inning = 1 self.outs = 0 self.top_of_inning = True @@ -294,6 +298,21 @@ class game(object): outcome["pitcher"] = pitcher outcome["defender"] = "" + 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 + player_rolls = {} player_rolls["bat_stat"] = random_star_gen("batting_stars", batter) player_rolls["pitch_stat"] = random_star_gen("pitching_stars", pitcher) @@ -306,6 +325,9 @@ class game(object): self.weather.modify_atbat_roll(outcome, roll, defender) + outcome["batter_archetype"].modify_bat_rolls(outcome, roll) + outcome["pitcher_archetype"].modify_bat_rolls(outcome, roll) + if roll["pb_system_stat"] <= 0: outcome["ishit"] = False @@ -321,6 +343,9 @@ class game(object): else: outcome["outcome"] = appearance_outcomes.walk + outcome["batter_archetype"].modify_out_type(outcome) + outcome["pitcher_archetype"].modify_out_type(outcome) + if self.bases[1] is not None and roll["hitnum"] < -2 and self.outs != 2: outcome["outcome"] = appearance_outcomes.doubleplay outcome["defender"] = "" @@ -358,6 +383,10 @@ class game(object): outcome["outcome"] = appearance_outcomes.grandslam else: outcome["outcome"] = appearance_outcomes.homerun + + outcome["batter_archetype"].modify_hit_type(outcome) + outcome["pitcher_archetype"].modify_hit_type(outcome) + return outcome def thievery_attempts(self): #returns either false or "at-bat" outcome @@ -375,8 +404,21 @@ class game(object): self.weather.modify_steal_stats(stats) + if pitcher.name in self.defense_archetypes.keys(): + outcome["pitcher_archetype"] = self.defense_archetypes[pitcher.name] + 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) + if stats["run_stars"] >= (stats["def_stars"] - 1.5): #if baserunner isn't worse than pitcher roll = random.random() + outcome["baserunner_archetype"].steal_check(outcome, roll) if roll >= (-(((stats["run_stars"]+1)/14)**2)+1): #plug it into desmos or something, you'll see attempts.append((baserunner, start_base)) @@ -398,6 +440,10 @@ class game(object): run_stat = random_star_gen("baserunning_stars", baserunner) def_stat = random_star_gen("defense_stars", defender) run_roll = random.gauss(2*math.erf((run_stat-def_stat)/4)-1,3)*config()["stolen_base_success_mod"] + + outcome["baserunner_archetype"].modify_steal_attempt(outcome, run_roll) + outcome["pitcher_archetype"].modify_steal_attempt(outcome, run_roll) + if start_base == 2: run_roll = run_roll * .9 #stealing third is harder if run_roll < 1: @@ -557,6 +603,9 @@ class game(object): offense_team = self.teams["home"] defense_team = self.teams["away"] + self.offense_archetypes = self.archetypes[offense_team.name] + self.defense_archetypes = self.archetypes[defense_team.name] + defenders = defense_team.lineup.copy() defenders.append(defense_team.pitcher) diff --git a/the-prestige.pyproj b/the-prestige.pyproj index ce3561e..21abac0 100644 --- a/the-prestige.pyproj +++ b/the-prestige.pyproj @@ -24,6 +24,9 @@ false + + Code + Code