69 lines
2.4 KiB
Python
69 lines
2.4 KiB
Python
import random, team, player
|
|
from team import Team
|
|
from player import Player, AtkAction, DefAction
|
|
from skillContests import SkillContestParams, Situations
|
|
from attributes import normalDis
|
|
|
|
class Game(object):
|
|
"""A game of hockey!"""
|
|
|
|
def __init__(self, awayTeam:Team, homeTeam:Team, threes:bool=False):
|
|
if awayTeam is not None and homeTeam is not None:
|
|
self.away = awayTeam
|
|
self.home = homeTeam
|
|
|
|
self.lineSize = 5
|
|
if len(awayTeam.roster) != 10 or len(homeTeam.roster) != 10 or threes:
|
|
self.lineSize = 3
|
|
|
|
self.goalieHome = self.home.chooseGoalie()
|
|
self.goalieAway = self.away.chooseGoalie()
|
|
|
|
self.playerInPossession = None
|
|
self.teamInPossession = None
|
|
|
|
self.skatersHome = [] #LW LD C RD RW
|
|
self.skatersAway = []
|
|
|
|
self.penaltyBoxAway = []
|
|
self.penaltyBoxHome = []
|
|
self.pulledGoalieAway = False
|
|
self.pulledGoalieHome = False
|
|
|
|
self.period = 1
|
|
self.clock = 60*20 #clock will be given in seconds
|
|
|
|
self.eventLog = []
|
|
|
|
def defendingTeam(self):
|
|
if teamInPossession == self.home:
|
|
return self.away
|
|
else:
|
|
return self.home
|
|
|
|
def homeAttacking(self):
|
|
return teamInPossession == self.home
|
|
|
|
def currentSituation(self):
|
|
skatersH = self.lineSize + self.pulledGoalieHome - len(self.penaltyBoxHome)
|
|
skatersA = self.lineSize + self.pulledGoalieAway - len(self.penaltyBoxAway)
|
|
if self.teamInPossession == self.home:
|
|
return Situations(skatersH - skatersA)
|
|
else:
|
|
return Situations(skatersA - skatersH)
|
|
|
|
def skillContest(self, atkPlayer:Player, defPlayer:Player, params:SkillContestParams):
|
|
"""Contests the two players with the given stats and stat weights. Returns True on offensive success."""
|
|
if params.override is not None:
|
|
return params.override
|
|
else:
|
|
atkValue = 0
|
|
defValue = 0
|
|
for attr, weight in params.atkStats:
|
|
atkValue += atkPlayer.getAttribute(attr).value * weight/100
|
|
for attr, weight in params.defStats:
|
|
defValue += defPlayer.getAttribute(attr).value * weight/100
|
|
|
|
atkRoll = normalDis(atkValue, atkValue/2, 0)
|
|
defRoll = normalDis(defValue, defValue/2, 0)
|
|
return atkRoll-defRoll > 0 |