entosisController.py (7267B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\entosis\ui\entosisController.py 2 from carbon.common.lib.const import SEC, MIN 3 import gametime 4 import logging 5 import inventorycommon.const as invConst 6 import uthread2 7 try: 8 import localization 9 except ImportError: 10 localization = None 11 12 logger = logging.getLogger(__name__) 13 NEUTRAL = invConst.ownerSystem 14 15 class EntosisCounterController(object): 16 isInverted = False 17 18 def __init__(self, timer, bracket, componentRegistry, slimItem, entosisComponentInstance, *args): 19 self.captureTime = entosisComponentInstance.GetCaptureTime() 20 self.twoDirectionalCaptureTarget = entosisComponentInstance.IsTwoDirectionalCaptureTarget() 21 self.componentRegistry = componentRegistry 22 self.bracket = bracket 23 self.slimItem = slimItem 24 self.itemID = slimItem.itemID 25 self.controllingTeamId = None 26 self.scoringTeamId = None 27 self.defenderTeamId = None 28 self.scoreAtLastUpdateTime = None 29 self.lastUpdatedScoreTime = None 30 self.scoringRate = None 31 self.isBlocked = False 32 self.timer = timer 33 self.updateLoopRunning = False 34 self.sublabelInfo = None 35 if slimItem.entosis_score is not None: 36 controllingTeamId, scoringTeamId, scoringAttributes, defenderTeamId = slimItem.entosis_score 37 self.SetScoreValues(controllingTeamId, scoringTeamId, scoringAttributes, defenderTeamId) 38 39 def _IsScoring(self): 40 return self.scoringRate is not None and self.scoringRate != 0.0 41 42 def _UpdateTimers(self): 43 currentScore = self._CalculateCurrentScore() 44 self._SetTimerDisplayValue(currentScore) 45 correctedCurrentScore = self._GetScoreCorrectedForInvertedMode(currentScore) 46 if self._IsScoring(): 47 if self.scoringRate > 0: 48 endPointScore = 1.0 49 else: 50 endPointScore = 0.0 51 scoreRequiredUntilEndPoint = endPointScore - currentScore 52 timeUntilEndPoint = self.captureTime * scoreRequiredUntilEndPoint / self.scoringRate 53 self.timer.SetEntosisValueTimed(correctedCurrentScore, self._GetScoreCorrectedForInvertedMode(endPointScore), timeUntilEndPoint) 54 elif self.isBlocked: 55 self.timer.SetStalemate(correctedCurrentScore) 56 else: 57 self.timer.SetEntosisValueImmediate(correctedCurrentScore) 58 self._UpdateSubLabel() 59 60 def _SetTimerDisplayValue(self, currentScore): 61 displayValue = True 62 if not self.isInverted and currentScore >= 1.0 and not self.isBlocked: 63 displayValue = False 64 self.timer.SetDisplayValue(displayValue) 65 66 def SetScoreValues(self, controllingTeamId, scoringTeamId, scoringAttributes, defenderTeamId): 67 self.controllingTeamId = controllingTeamId 68 self.scoringTeamId = scoringTeamId 69 self.defenderTeamId = defenderTeamId 70 scoreAtLastUpdateTime, lastUpdatedScoreTime, scoringRate, isBlocked = scoringAttributes 71 self.scoreAtLastUpdateTime = scoreAtLastUpdateTime 72 self.lastUpdatedScoreTime = lastUpdatedScoreTime 73 self.scoringRate = scoringRate 74 self.isBlocked = isBlocked 75 self._UpdateTimers() 76 77 def _CalculateCurrentScore(self): 78 if self._IsScoring(): 79 timeSinceLastScoreUpdate = gametime.GetSimTime() - self.lastUpdatedScoreTime 80 scoringDuration = timeSinceLastScoreUpdate / self.captureTime / float(SEC) 81 score = self.scoreAtLastUpdateTime + scoringDuration * self.scoringRate 82 score = min(1.0, max(score, 0.0)) 83 elif self.scoreAtLastUpdateTime is not None: 84 score = self.scoreAtLastUpdateTime 85 else: 86 score = 0 87 return score 88 89 def _GetScoreCorrectedForInvertedMode(self, score): 90 if self.isInverted: 91 return 1 - score 92 return score 93 94 def SetTimerInvertedMode(self, isInverted): 95 self.isInverted = isInverted 96 self._UpdateTimers() 97 98 def _KillBracketSubLabel(self): 99 self.updateLoopRunning = False 100 self.sublabelInfo = None 101 self.bracket.UpdateSubLabelIfNeeded('') 102 self.bracket.CloseSubLabel() 103 104 def _ShouldShowSubLabel(self): 105 if self.isBlocked: 106 return True 107 if self._IsScoring(): 108 if self.scoringRate > 0 and self.scoreAtLastUpdateTime != 1.0: 109 return True 110 if self.scoringRate < 0 and self.scoreAtLastUpdateTime != -1.0: 111 return True 112 return False 113 114 def _UpdateSubLabel(self): 115 if self._ShouldShowSubLabel(): 116 uthread2.StartTasklet(self._UpdateSublabel_thread) 117 else: 118 self._KillBracketSubLabel() 119 120 def _GetCaptureStatusText(self): 121 if not self._IsScoring(): 122 if self.isBlocked: 123 return localization.GetByLabel('UI/Sovereignty/BracketProgressBlocked') 124 else: 125 return None 126 if self.controllingTeamId > 0: 127 controllingTeamTicker = cfg.allianceshortnames.Get(self.controllingTeamId).shortName 128 return localization.GetByLabel('UI/Sovereignty/BracketEntosisStatus', allianceTicker=controllingTeamTicker) 129 else: 130 return localization.GetByLabel('UI/Sovereignty/BracketAttackingClaimed') 131 132 def _GetCaptureTimestamp(self): 133 if not self._IsScoring(): 134 return None 135 fullCaptureTime = abs(self.captureTime / self.scoringRate) 136 if self.scoringRate < 0: 137 score = self.scoreAtLastUpdateTime 138 else: 139 score = 1 - self.scoreAtLastUpdateTime 140 if (self.defenderTeamId is NEUTRAL or self.twoDirectionalCaptureTarget) and self.scoringRate < 0: 141 score += 1 142 timeInSec = score * fullCaptureTime 143 time = long(round(timeInSec * SEC)) 144 return time + self.lastUpdatedScoreTime 145 146 def _FormatCountdown(self, time): 147 timeText = localization.formatters.FormatTimeIntervalShort(time, showFrom='minute', showTo='second') 148 return timeText 149 150 def _UpdateSublabel_thread(self): 151 statusText = self._GetCaptureStatusText() 152 captureTimestamp = self._GetCaptureTimestamp() 153 self.sublabelInfo = (statusText, captureTimestamp) 154 if self.updateLoopRunning: 155 return 156 self._RunUpdateLoop() 157 158 def _RunUpdateLoop(self): 159 self.updateLoopRunning = True 160 while self.updateLoopRunning: 161 if not self._UpdateLoopContent(): 162 break 163 uthread2.SleepSim(1) 164 165 self.updateLoopRunning = False 166 167 def _UpdateLoopContent(self): 168 if not self.bracket or self.bracket.destroyed or not self.sublabelInfo: 169 self._KillBracketSubLabel() 170 return False 171 statusText, captureTimestamp = self.sublabelInfo 172 if captureTimestamp is not None: 173 now = gametime.GetSimTime() 174 timeUntil = max(0, captureTimestamp - now) 175 timeUntilText = self._FormatCountdown(timeUntil) 176 text = ' - '.join(filter(None, [statusText, timeUntilText])) 177 else: 178 text = statusText 179 self.bracket.UpdateSubLabelIfNeeded(text) 180 return True