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