NovaBryan/EVE_Dump
Log | Files | 📦 下载最新源码 (.zip) | Refs | README

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