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

twoTrackRewardPanel.py (19207B)


      1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\ui\shared\loginRewards\twoTrackRewardPanel.py
      2 import math
      3 import evetypes
      4 from carbon.client.script.environment.AudioUtil import PlaySound
      5 from carbonui.primitives.container import Container
      6 from carbonui import uiconst
      7 from carbonui.primitives.fill import Fill
      8 from carbonui.primitives.sprite import Sprite
      9 from carbonui.primitives.vectorlinetrace import VectorLineTrace
     10 from carbonui.uianimations import animations
     11 from carbonui.util.color import Color
     12 from clonegrade import COLOR_OMEGA_ORANGE
     13 from crates import CratesStaticData
     14 from eve.client.script.ui.control.eveLabel import EveLabelMedium
     15 from eve.client.script.ui.eveColor import WHITE
     16 from eve.client.script.ui.shared.loginRewards import rewardUiConst
     17 from eve.client.script.ui.shared.loginRewards.bottomCont import TwoTrackRewardBottomCont
     18 from eve.client.script.ui.shared.loginRewards.browseControls import BrowseControls
     19 from eve.client.script.ui.shared.loginRewards.rewardEntry import OmegaRewardEntry, AlphaRewardEntry, DayEntry
     20 from eve.client.script.ui.shared.loginRewards.rewardInfo import RewardInfo
     21 from eve.client.script.ui.shared.loginRewards.rewardItemsGrid import RewardItemsGrid, DayGrid
     22 from eve.client.script.ui.shared.loginRewards.rewardPreviewCont import TwoTrackRewardPreviewCont, TwoTrackTodaysItemTop
     23 from localization import GetByLabel
     24 from eve.client.script.ui.shared.loginRewards.rewardUiConst import SCROLL_ANIMATION, TODAYS_SIDE_PADDING
     25 from loginrewards.client.tooltips import OmegaIconToolTip
     26 from loginrewards.common.rewardUtils import GetClaimState
     27 from utillib import KeyVal
     28 import mathext
     29 arrowPath = 'res:/UI/Texture/classes/LoginCampaign/rewardTrack_trackArrow.png'
     30 trackBgColor = (0,
     31  0,
     32  0,
     33  0.6)
     34 
     35 class BaseTwoTrackRewardPanel(Container):
     36 
     37     def ApplyAttributes(self, attributes):
     38         self.panelController = self.GetPanelController()
     39         pConst = self.panelController.GetPanelConstants()
     40         self.campaignDataByID = {}
     41         self.currentFirstVisibleDay = 0
     42         Container.ApplyAttributes(self, attributes)
     43         centerCont = Container(name='centerCont', parent=self, align=uiconst.TOALL, padding=(12, 5, 12, 5))
     44         Fill(bgParent=centerCont, color=trackBgColor)
     45         self.claimCont = TwoTrackRewardBottomCont(parent=centerCont, panelController=self.panelController, isOmega=self.panelController.IsOmega())
     46         self.topInfoCont = Container(name='topCont', parent=centerCont, align=uiconst.TOTOP, height=pConst.CENTER_TOP_HEIGHT)
     47         self.todaysItemTop = TwoTrackTodaysItemTop(name='todaysItemTop', parent=self.topInfoCont, align=uiconst.TORIGHT, height=pConst.CENTER_TOP_HEIGHT, panelController=self.panelController, padRight=4, width=290)
     48         Fill(bgParent=self.topInfoCont, color=trackBgColor)
     49         self.leftCont = Container(name='leftCont', parent=centerCont, align=uiconst.TOLEFT, width=pConst.LEFT_WIDTH, padTop=-6)
     50         self.cloneCont = Container(name='cloneCont', parent=self.leftCont)
     51         self.BuildAlphaTrack()
     52         self.BuildOmegaTrack()
     53         self.sideCont = TwoTrackRewardPreviewCont(name='sideCont', parent=centerCont, align=uiconst.TOALL, padding=(0, -8, 4, 0), panelController=self.panelController, isOmega=self.panelController.IsOmega())
     54         self.campaignProgressLabel = EveLabelMedium(parent=self.topInfoCont, align=uiconst.CENTER, color=WHITE)
     55         rewardCount = self.GetRewardCount()
     56         if pConst.SHOW_BROWSE_CONTROLS and rewardCount > pConst.NUM_VISIBLE_ITEMS:
     57             BrowseControls(parent=self.topInfoCont, browseFunc=self.OnBrowse, resetFunc=self.GoToToday, padLeft=3)
     58         self.LoadCampaign()
     59         sm.RegisterNotify(self)
     60 
     61     def GetPanelController(self):
     62         raise NotImplemented('panel controller needs to be overriden')
     63 
     64     def BuildAlphaTrack(self):
     65         pConst = self.panelController.GetPanelConstants()
     66         dayTrackPar = Container(name='dayTrackPar', parent=self.cloneCont, align=uiconst.TOTOP, height=30, padTop=2)
     67         alphaTrackPar = Container(name='alphaTrackPar', parent=self.cloneCont, align=uiconst.TOTOP, height=152, padding=(0, 2, 0, 2))
     68         Container(name='arrowCont', parent=alphaTrackPar, align=uiconst.TORIGHT, width=pConst.TRACK_ARROW_WIDTH, clipChildren=True)
     69         alphaSpriteCont = Container(name='alphaSpriteCont', parent=alphaTrackPar, align=uiconst.TOLEFT, width=pConst.CLONE_COLUMN_WIDTH, bgColor=(1, 1, 1, 0.1), padding=(0, 0, 0, 60))
     70         Sprite(name='alpha', parent=alphaSpriteCont, align=uiconst.CENTER, state=uiconst.UI_NORMAL, pos=(1, 0, 16, 16), texturePath='res:/UI/Texture/classes/LoginCampaign/alpha_Icon.png', hint=GetByLabel('UI/LoginRewards/Tooltips/AlphaTooltip'))
     71         self.dayTrackCont = Container(name='dayTrackCont', parent=dayTrackPar, align=uiconst.TOALL, clipChildren=True, padding=(pConst.SIDE_PADDING + pConst.CLONE_COLUMN_WIDTH,
     72          0,
     73          pConst.TRACK_ARROW_WIDTH,
     74          0))
     75         self.alphaTrackCont = Container(name='alphaTrackCont', parent=alphaTrackPar, align=uiconst.TOALL, clipChildren=True, padding=(pConst.SIDE_PADDING,
     76          0,
     77          0,
     78          0))
     79 
     80     def BuildOmegaTrack(self):
     81         pConst = self.panelController.GetPanelConstants()
     82         omegaTrackPar = Container(name='omegaTrackPar', parent=self.cloneCont, align=uiconst.TOTOP, height=152, padding=(0, 2, 0, 2))
     83         Container(name='arrowCont', parent=omegaTrackPar, align=uiconst.TORIGHT, width=pConst.TRACK_ARROW_WIDTH, clipChildren=True)
     84         omegaSpriteCont = Container(name='omegaSpriteCont', parent=omegaTrackPar, align=uiconst.TOLEFT, width=pConst.CLONE_COLUMN_WIDTH, bgColor=(0.988, 0.761, 0.027, 0.45), padding=(0, 0, 0, 60))
     85         omegaSprite = Sprite(name='omega', parent=omegaSpriteCont, align=uiconst.CENTER, state=uiconst.UI_NORMAL, pos=(1, 0, 16, 16), texturePath='res:/UI/Texture/classes/LoginCampaign/omega_Icon.png', color=COLOR_OMEGA_ORANGE)
     86         omegaSprite.tooltipPanelClassInfo = OmegaIconToolTip(sm.GetService('loginCampaignService').open_vgs_to_buy_omega_time_from_DLI)
     87         self.omegaTrackCont = Container(name='omegaTrackCont', parent=omegaTrackPar, align=uiconst.TOALL, clipChildren=True, padding=(pConst.SIDE_PADDING,
     88          0,
     89          0,
     90          0))
     91 
     92     def GoToToday(self, animationTime = rewardUiConst.SCROLL_ANIMATION, *args):
     93         posInTrack = self.panelController.GetPositionInGridTrack()
     94         self.GoToDay(posInTrack, animationTime=animationTime)
     95 
     96     def GoToDay(self, posInTrack, animationTime = SCROLL_ANIMATION, *args):
     97         if self.panelController.CanRetroClaimNow():
     98             posInTrack -= 1
     99         self.dayGrid.GoToSelectedEntry(posInTrack, animationTime)
    100         newDayAlpha = self.alphaGrid.GoToSelectedEntry(posInTrack, animationTime)
    101         newDayOmega = self.omegaGrid.GoToSelectedEntry(posInTrack, animationTime)
    102         if newDayAlpha is not None or newDayOmega is not None:
    103             self.currentFirstVisibleDay = newDayAlpha or newDayOmega
    104 
    105     def OnBrowse(self, direction, *args):
    106         self.dayGrid.OnBrowse(direction, self.currentFirstVisibleDay)
    107         newDayAlpha = self.alphaGrid.OnBrowse(direction, self.currentFirstVisibleDay)
    108         newDayOmega = self.omegaGrid.OnBrowse(direction, self.currentFirstVisibleDay)
    109         if newDayAlpha is not None or newDayOmega is not None:
    110             self.currentFirstVisibleDay = newDayAlpha or newDayOmega
    111 
    112     def GetCampaignData(self):
    113         return self.panelController.GetCampaignData()
    114 
    115     def LoadCampaign(self):
    116         self.LoadGrid()
    117 
    118     def LoadGrid(self):
    119         self.alphaTrackCont.Flush()
    120         self.omegaTrackCont.Flush()
    121         rewardCount = self.GetRewardCount()
    122         self.dayGrid = DayGrid(name='alphaDayGrid', parent=self.dayTrackCont, align=uiconst.CENTERLEFT, columns=rewardCount, numAllEntries=rewardCount, panelConst=self.panelController.GetPanelConstants())
    123         self.dayGridLineCont = self.GetLineCont(self.dayTrackCont)
    124         self.alphaGrid = RewardItemsGrid(name='alphaRewardGrid', parent=self.alphaTrackCont, align=uiconst.CENTERLEFT, columns=rewardCount, numAllEntries=rewardCount, panelConst=self.panelController.GetPanelConstants())
    125         self.alphaGridLineCont = self.GetLineCont(self.alphaTrackCont)
    126         self.omegaGrid = RewardItemsGrid(name='omegaRewardGrid', parent=self.omegaTrackCont, align=uiconst.CENTERLEFT, columns=rewardCount, numAllEntries=rewardCount, panelConst=self.panelController.GetPanelConstants())
    127         self.omegaGridLineCont = self.GetLineCont(self.omegaTrackCont)
    128         daysClaimedByAlpha = self.panelController.GetDayNumbersClaimedInAlphaTrack()
    129         daysClaimedByOmega = self.panelController.GetDayNumbersClaimedInOmegaTrack()
    130         numRewardsClaimed = self.panelController.GetNumDaysClaimed()
    131         somethingCanBeClaimedNow = self.panelController.CanSomethingBeClaimedNow()
    132         selectedDay = numRewardsClaimed
    133         if self.panelController.CanRetroClaimNow():
    134             selectedDay -= 1
    135         alphaEntryInfoForGrid = []
    136         dayEntryInfoForGrid = []
    137         cratesStaticData = CratesStaticData()
    138         campaignData = self.GetCampaignData()
    139         for day, info in campaignData.alphaRewards.iteritems():
    140             isClaimed = day in daysClaimedByAlpha
    141             isNextClaimable = numRewardsClaimed == day
    142             claimState = GetClaimState(isClaimed, isNextClaimable, somethingCanBeClaimedNow)
    143             messageID = evetypes.GetDescriptionID(info.typeID)
    144             displayNameID = cratesStaticData.get_crate_nameID(info.typeID)
    145             rewardInfo = RewardInfo(day + 1, info, claimState, messageID, displayNameID=displayNameID)
    146             dayEntryInfoForGrid.append({'entryClass': DayEntry,
    147              'rewardInfo': rewardInfo,
    148              'panelController': self.panelController})
    149             alphaEntryInfoForGrid.append({'entryClass': AlphaRewardEntry,
    150              'rewardInfo': rewardInfo,
    151              'panelController': self.panelController})
    152 
    153         dayEntryInfoForGrid.sort(key=lambda x: x['rewardInfo'].day)
    154         alphaEntryInfoForGrid.sort(key=lambda x: x['rewardInfo'].day)
    155         omegaEntryInfoForGrid = []
    156         for day, info in campaignData.omegaRewards.iteritems():
    157             isClaimed = day in daysClaimedByOmega
    158             isNextClaimable = selectedDay == day
    159             claimState = GetClaimState(isClaimed, isNextClaimable, somethingCanBeClaimedNow)
    160             messageID = evetypes.GetDescriptionID(info.typeID)
    161             displayNameID = cratesStaticData.get_crate_nameID(info.typeID)
    162             rewardInfo = RewardInfo(day + 1, info, claimState, messageID, displayNameID=displayNameID)
    163             omegaEntryInfoForGrid.append({'entryClass': OmegaRewardEntry,
    164              'rewardInfo': rewardInfo,
    165              'panelController': self.panelController})
    166 
    167         omegaEntryInfoForGrid.sort(key=lambda x: x['rewardInfo'].day)
    168         self.dayGrid.LoadEntries(dayEntryInfoForGrid)
    169         self.alphaGrid.LoadEntries(alphaEntryInfoForGrid)
    170         self.omegaGrid.LoadEntries(omegaEntryInfoForGrid)
    171         self.ShowLinesIfNeeded(self.dayGridLineCont, self.dayGrid)
    172         self.ShowLinesIfNeeded(self.alphaGridLineCont, self.alphaGrid)
    173         self.ShowLinesIfNeeded(self.omegaGridLineCont, self.omegaGrid)
    174         self.SetDayAsCurrent(selectedDay)
    175         self.GoToToday(animationTime=0)
    176 
    177     def ShowLinesIfNeeded(self, lineCont, grid):
    178         if grid.AreEntriesFewerThanMaxVisible():
    179             width = grid.GetEntriesWidth()
    180             lineCont.width = width
    181             lineCont.display = True
    182         else:
    183             lineCont.display = False
    184 
    185     def GetRewardCount(self):
    186         campaignData = self.GetCampaignData()
    187         rewardCount = min(len(campaignData.alphaRewards), len(campaignData.omegaRewards))
    188         return rewardCount
    189 
    190     def GetLineCont(self, parent):
    191         lineTexturePath = 'res:/UI/Texture/classes/LoginCampaign/todaysRewardContainerStroke.png'
    192         lineCont = Container(name='lineCont', parent=parent, align=uiconst.CENTER, pos=(0, 0, 0, 5))
    193         lineWidth = 150
    194         Sprite(name='leftSprite', parent=lineCont, align=uiconst.CENTERLEFT, state=uiconst.UI_DISABLED, texturePath=lineTexturePath, pos=(-lineWidth - 10,
    195          0,
    196          lineWidth,
    197          5), rotation=math.pi, opacity=0.4)
    198         Sprite(name='rightSprite', parent=lineCont, align=uiconst.CENTERRIGHT, state=uiconst.UI_DISABLED, texturePath=lineTexturePath, pos=(-lineWidth - 10,
    199          0,
    200          lineWidth,
    201          5), opacity=0.4)
    202         lineCont.display = False
    203         return lineCont
    204 
    205     def SetDayAsCurrent(self, entryNum, withTransition = False, giftsReceivedConst = None):
    206         alphaEntry = self.alphaGrid.GetEntry(entryNum)
    207         omegaEntry = self.omegaGrid.GetEntry(entryNum)
    208         alphaRewardInfo = omegaRewardInfo = claimState = None
    209         campaignStatus = self.panelController.GetCampaignStatus()
    210         if campaignStatus == rewardUiConst.CAMPAIGN_STATUS_ONGOING:
    211             if alphaEntry:
    212                 alphaRewardInfo = alphaEntry.rewardInfo
    213                 omegaRewardInfo = omegaEntry.rewardInfo
    214                 claimState = omegaRewardInfo.claimState
    215             else:
    216                 return
    217         next_reward_time = self.panelController.GetTimestampWhenRewardCanBeClaimed()
    218         self.claimCont.LoadRewardInfo(claimState, next_reward_time)
    219         if campaignStatus in (rewardUiConst.CAMPAIGN_STATUS_ENDING, rewardUiConst.CAMPAIGN_STATUS_SUCCESSFULLY_COMPLETED):
    220             self.sideCont.PlayVideosAndFadeOut(next_reward_time, withTransition, giftsReceivedConst)
    221             self.todaysItemTop.UpdateTextAndHelpIcon(next_reward_time)
    222             self.sideCont.LoadCompletedScreen(withTransition)
    223             if withTransition:
    224                 animations.MorphScalar(self.todaysItemTop, 'padLeft', self.todaysItemTop.padLeft, TODAYS_SIDE_PADDING, duration=0.2)
    225                 animations.MorphScalar(self.todaysItemTop, 'padRight', self.todaysItemTop.padRight, TODAYS_SIDE_PADDING, duration=0.2)
    226             else:
    227                 self.todaysItemTop.padLeft = TODAYS_SIDE_PADDING
    228                 self.todaysItemTop.padRight = TODAYS_SIDE_PADDING
    229             self.todaysItemTop.UpdateTextAndHelpIcon(next_reward_time)
    230         elif alphaRewardInfo:
    231             self.sideCont.LoadRewardInfo(alphaRewardInfo, omegaRewardInfo, next_reward_time, withTransition, giftsReceivedConst)
    232             self.todaysItemTop.UpdateTextAndHelpIcon(next_reward_time)
    233         else:
    234             raise RuntimeError('Invalid two track campaign state and reward info')
    235         rewardDaysRemaining = self.panelController.GetNumberOfRewardsDaysRemainingAndAvailable()
    236         claimedDaysInAlphaTrack = self.panelController.GetDayNumbersClaimedInAlphaTrack()
    237         if claimedDaysInAlphaTrack:
    238             maxDayClaimed = max(claimedDaysInAlphaTrack)
    239         else:
    240             maxDayClaimed = -1
    241         availableRewardsDays = range(maxDayClaimed + 1, maxDayClaimed + 1 + rewardDaysRemaining)
    242         selectedDay = entryNum if campaignStatus == rewardUiConst.CAMPAIGN_STATUS_ONGOING else None
    243         self.dayGrid.UpdateEntryState(selectedDay, KeyVal(claimedDays=claimedDaysInAlphaTrack, availableRewardsDays=availableRewardsDays))
    244         self.alphaGrid.UpdateEntryState(selectedDay, KeyVal(claimedDays=claimedDaysInAlphaTrack, availableRewardsDays=availableRewardsDays))
    245         self.omegaGrid.UpdateEntryState(selectedDay, KeyVal(claimedDays=self.panelController.GetDayNumbersClaimedInOmegaTrack(), availableRewardsDays=availableRewardsDays))
    246         self.dayGrid.SetDayEntryAsSelected(selectedDay, withTransition)
    247         self.alphaGrid.SetEntryAsSelected(selectedDay, withTransition)
    248         self.omegaGrid.SetEntryAsSelected(selectedDay, withTransition)
    249         self.UpdateCampaignProgressLabel()
    250 
    251     def UpdateCampaignProgressLabel(self):
    252         numRewardsClaimed = self.panelController.GetNumDaysClaimed()
    253         numRewardsTotal = self.GetRewardCount()
    254         hexColor = Color.RGBtoHex(*rewardUiConst.BLUE_TEXT_COLOR)
    255         startTags = '<color=%s><b>' % hexColor
    256         endTags = '</b></color>'
    257         self.campaignProgressLabel.text = GetByLabel('UI/LoginRewards/CampaignProgress', numRewardsCollected=numRewardsClaimed, numRewardsTotal=numRewardsTotal, startTags=startTags, endTags=endTags)
    258 
    259     def OnDailyRewardClaimed(self, todays_alpha_rewards, todays_omega_rewards, retroactive_rewards):
    260         giftsReceivedConst = GetGiftsReceivedConst(todays_alpha_rewards, todays_omega_rewards, retroactive_rewards)
    261         if giftsReceivedConst in (rewardUiConst.ONLY_ALPHA_GIFT_REWARDED, rewardUiConst.ONLY_OMEGA_GIFT_REWARDED):
    262             PlaySound('daily_login_gift_single_play')
    263         else:
    264             PlaySound('daily_login_gift_play')
    265         selectedDay = self.panelController.GetNumDaysClaimed()
    266         if self.panelController.CanRetroClaimNow():
    267             selectedDay = max(selectedDay - 1, 0)
    268         self.SetDayAsCurrent(selectedDay, True, giftsReceivedConst=giftsReceivedConst)
    269         daysScrolling = abs(self.currentFirstVisibleDay - 1 - selectedDay)
    270         scrollTime = mathext.clamp(daysScrolling * rewardUiConst.SCROLL_ANIMATION_AUTO_STEP, 0.5, 1.5)
    271         self.GoToToday(animationTime=scrollTime)
    272 
    273     def BuildFrame(self, frameCont, arrowCont):
    274         pConst = self.panelController.GetPanelConstants()
    275         lineColor = (1.0, 1.0, 1.0, 0.25)
    276         height = arrowCont.absoluteBottom - arrowCont.absoluteTop
    277         lineArrow = VectorLineTrace(name='lineArrow', parent=arrowCont, lineWidth=0.35)
    278         posList = [(0, 0), (arrowCont.width, height / 2.0), (0, height)]
    279         lineArrow.AddPoints(posList, lineColor)
    280         lineBox = VectorLineTrace(name='lineBox', parent=frameCont, lineWidth=0.55)
    281         frameWidth = frameCont.absoluteRight - frameCont.absoluteLeft
    282         posList = [(frameWidth, 0),
    283          (0, 0),
    284          (0, height),
    285          (frameWidth, height)]
    286         lineBox.AddPoints(posList, lineColor)
    287         Sprite(parent=arrowCont, texturePath='res:/UI/Texture/classes/LoginCampaign/rewardTrack_circuitBoard.png', align=uiconst.CENTERRIGHT, pos=(2, 0, 771, 155), opacity=0.8)
    288         Sprite(parent=arrowCont, texturePath=arrowPath, align=uiconst.TORIGHT, color=trackBgColor, width=pConst.TRACK_ARROW_WIDTH, state=uiconst.UI_DISABLED)
    289         trackBgCont = Container(name='trackBgCont', parent=frameCont, align=uiconst.TOALL, clipChildren=True, left=pConst.CLONE_COLUMN_WIDTH)
    290         Fill(bgParent=trackBgCont, color=trackBgColor, padding=(0, 2, 0, 2))
    291         Sprite(parent=trackBgCont, texturePath='res:/UI/Texture/classes/LoginCampaign/rewardTrack_circuitBoard.png', align=uiconst.CENTERRIGHT, pos=(0, 0, 771, 155), padding=(0,
    292          2,
    293          -pConst.TRACK_ARROW_WIDTH,
    294          2), opacity=0.8, state=uiconst.UI_DISABLED)
    295 
    296 
    297 def GetGiftsReceivedConst(todays_alpha_rewards, todays_omega_rewards, retroactive_rewards):
    298     if todays_alpha_rewards and not todays_omega_rewards and not retroactive_rewards:
    299         return rewardUiConst.ONLY_ALPHA_GIFT_REWARDED
    300     if (todays_omega_rewards or retroactive_rewards) and not todays_alpha_rewards:
    301         return rewardUiConst.ONLY_OMEGA_GIFT_REWARDED
    302     return rewardUiConst.ALPHA_OMEGA_GIFTS_REWARDED