rewardPreviewItemEntry.py (16218B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\ui\shared\loginRewards\rewardPreviewItemEntry.py 2 import evetypes 3 import trinity 4 import uthread2 5 from carbon.common.script.sys.serviceConst import ROLE_GML, ROLE_WORLDMOD, ROLE_LEGIONEER 6 from carbon.common.script.util.format import FmtAmt 7 from carbonui import uiconst, fontconst 8 from carbonui.primitives.container import Container 9 from carbonui.primitives.containerAutoSize import ContainerAutoSize 10 from carbonui.primitives.sprite import Sprite, StreamingVideoSprite 11 from carbonui.primitives.stretchspritehorizontal import StretchSpriteHorizontal 12 from carbonui.uianimations import animations 13 from clonegrade import COLOR_OMEGA_GOLD 14 from crates import CratesStaticData 15 from eve.client.script.ui.control.eveIcon import Icon 16 from eve.client.script.ui.control.eveLabel import Label, EveLabelMedium, EveLabelSmall 17 from eve.client.script.ui.shared.loginRewards.congratsCont import CongratsScreenInEntry 18 from eve.client.script.ui.shared.loginRewards.rewardTooltip import LoadTooltipPanelForReward 19 from eve.client.script.ui.shared.loginRewards.rewardUiConst import TODAYS_SIDE_PADDING, GREEN_CHECKMARK 20 from eve.client.script.ui.shared.loginRewards.rewardsCrosshair import RewardCrosshair 21 from eve.client.script.ui.eveColor import WHITE 22 from eveexceptions import ExceptionEater 23 from eveservices.menu import GetMenuService 24 from inventorycommon.const import categoryBlueprint 25 from localization import GetByLabel 26 from loginrewards.client.tooltips import OmegaIconToolTip 27 from loginrewards.common.const import CLAIM_STATE_CLAIMED 28 from loginrewards.common.rewardUtils import GetTierName, GetTierColor, GetTierFanfareVideoPath, GetCloneStateVideoPath, ShouldShowQty 29 import blue 30 from utillib import KeyVal 31 OVERLAY_ICON_SIZE = 96 32 33 class PreviewItemEntry(Container): 34 default_name = 'previewItemEntry' 35 default_bgColor = (0.1, 0.1, 0.1, 1.0) 36 default_align = uiconst.CENTER 37 default_state = uiconst.UI_NORMAL 38 todayBracketOpacity = 0.1 39 40 def ApplyAttributes(self, attributes): 41 self.panelController = attributes.panelController 42 pConst = self.panelController.GetPanelConstants() 43 self.default_height = pConst.TODAY_HEIGHT 44 self.currentRewardInfo = None 45 Container.ApplyAttributes(self, attributes) 46 self.congratsCont = CongratsScreenInEntry(name='congratsCont', parent=self, panelController=self.panelController) 47 self.rewardCont = Container(name='rewardCont', parent=self) 48 self.ConstructRewardCont() 49 self.crosshair = RewardCrosshair(parent=self) 50 if session.charid: 51 self.GetMenu = self.GetMenuFunc 52 53 def ConstructRewardCont(self): 54 pConst = self.panelController.GetPanelConstants() 55 self.videoCont = Container(name='videoCont', parent=self.rewardCont, padTop=-2, padBottom=-2, clipChildren=True) 56 lineTexture = 'res:/UI/Texture/classes/LoginCampaign/todaysRewardBracket.png' 57 self.todayBracket = StretchSpriteHorizontal(parent=self.rewardCont, align=uiconst.TOBOTTOM_NOPUSH, texturePath=lineTexture, height=12, rightEdgeSize=80, leftEdgeSize=80, opacity=self.todayBracketOpacity) 58 self.fadeCont = Container(name='fadeCont', parent=self, align=uiconst.CENTER, pos=(0, 59 0, 60 pConst.ICON_SIZE, 61 pConst.ICON_SIZE), state=uiconst.UI_DISABLED) 62 self.fadeItem = Icon(name='fadeItem', parent=self.fadeCont, align=uiconst.CENTER, pos=(0, 63 0, 64 pConst.ICON_SIZE, 65 pConst.ICON_SIZE), state=uiconst.UI_DISABLED) 66 self.fanfareVideo = StreamingVideoSprite(parent=self.videoCont, name='fanfareVideo', videoPath='res:/UI/Texture/classes/LoginCampaign/hexagons_09d_greyscale_03.webm', videoLoop=False, align=uiconst.CENTER, state=uiconst.UI_DISABLED, blendMode=trinity.TR2_SBM_ADD, spriteEffect=trinity.TR2_SFX_COPY, opacity=0.0, disableAudio=True, pos=(0, 0, 315, 200)) 67 self.fanfareVideo.Pause() 68 self.itemCont = Container(name='itemCont', parent=self.rewardCont, pos=(0, 69 0, 70 pConst.ICON_SIZE, 71 pConst.ICON_SIZE), align=uiconst.CENTER) 72 self.overlaySprite = Sprite(name='overlaySprite', parent=self.itemCont, align=uiconst.CENTER, pos=(0, 73 0, 74 OVERLAY_ICON_SIZE, 75 OVERLAY_ICON_SIZE)) 76 self.qtypar = ContainerAutoSize(parent=self.itemCont, name='qtypar', align=uiconst.BOTTOMRIGHT, bgColor=(0, 0, 0, 0.9)) 77 self.quantityLabel = Label(parent=self.qtypar, maxLines=1, bold=True, fontsize=fontconst.EVE_SMALL_FONTSIZE, opacity=1.0, padding=(4, 1, 4, 0)) 78 self.itemIcon = Icon(parent=self.itemCont, align=uiconst.CENTER, pos=(0, 79 0, 80 pConst.ICON_SIZE, 81 pConst.ICON_SIZE), state=uiconst.UI_DISABLED) 82 self.typeText = EveLabelMedium(name='typeText', parent=self.rewardCont, align=uiconst.TOTOP_NOPUSH, top=self.height + 6, padLeft=TODAYS_SIDE_PADDING + 4, padRight=TODAYS_SIDE_PADDING + 4, color=WHITE) 83 84 def LoadRewardInfo(self, rewardInfo, fullOpacity = True): 85 self._LoadRewardInfo(rewardInfo, fullOpacity) 86 self.SetVideoPath(rewardInfo) 87 88 def _LoadRewardInfo(self, rewardInfo, fullOpacity = True): 89 pConst = self.panelController.GetPanelConstants() 90 self.currentRewardInfo = rewardInfo 91 if not rewardInfo: 92 self.LoadCompletedScreen(fullOpacity) 93 return 94 qty = rewardInfo.qty 95 typeID = rewardInfo.typeID 96 texturePath = rewardInfo.texturePath 97 overlayTexturePath = rewardInfo.overlayTexturePath 98 iconSize = rewardInfo.iconSize or pConst.ICON_SIZE 99 self.SetTypeText(rewardInfo) 100 if texturePath: 101 self.itemIcon.LoadIcon(texturePath) 102 else: 103 self.itemIcon.LoadIconByTypeID(typeID=typeID, isCopy=True) 104 self.itemIcon.SetSize(iconSize, iconSize) 105 if overlayTexturePath: 106 self.overlaySprite.LoadTexture(overlayTexturePath) 107 self.overlaySprite.display = True 108 else: 109 self.overlaySprite.display = False 110 self.qtypar.display = False 111 if ShouldShowQty(rewardInfo): 112 self.qtypar.display = True 113 self.quantityLabel.text = FmtAmt(qty) 114 115 def _GetTierNamePath(self, tier): 116 tierNamePath = GetTierName(tier) if tier else None 117 return tierNamePath 118 119 def SetTierCont(self, tier, fullOpacity = True): 120 color = GetTierColor(tier) 121 if color: 122 self.tierLineCont.display = True 123 self.tierLineCont.SetColor(color) 124 if fullOpacity: 125 self.tierLineCont.opacity = 1.0 126 else: 127 self.tierLineCont.opacity = 0.0 128 else: 129 self.tierLineCont.display = False 130 131 def SetVideoPath(self, rewardInfo): 132 with ExceptionEater('SetVideoPath'): 133 if rewardInfo: 134 videoPath = self.GetVideoPath(rewardInfo.tier) 135 self.fanfareVideo.SetVideoPath(videoPath) 136 self.fanfareVideo.Pause() 137 138 def GetVideoPath(self, tier): 139 return GetTierFanfareVideoPath(tier) 140 141 def LoadNewReward(self, rewardInfo, sleepTimeSec = 2, delayedEndSec = 0, playVideo = True): 142 self.FadeOutAndPlayVideo(sleepTimeSec, playVideo) 143 if delayedEndSec: 144 uthread2.call_after_wallclocktime_delay(self._EndLoadNewReward, delayedEndSec, rewardInfo) 145 else: 146 self._EndLoadNewReward(rewardInfo) 147 148 def FadeOutAndPlayVideo(self, sleepTimeSec = 2, playVideo = True): 149 self.fadeItem.LoadIcon(self.itemIcon.texturePath) 150 fadeTimeInSec = 0.3 151 elementsToFade = self.GetElementsToFade() 152 for eachElement in elementsToFade: 153 animations.FadeOut(eachElement, duration=fadeTimeInSec) 154 155 blue.pyos.synchro.SleepWallclock(fadeTimeInSec * 1000) 156 timeOffset = 0.6 * sleepTimeSec 157 if playVideo: 158 self.fanfareVideo.Play() 159 animations.FadeIn(self.fanfareVideo, duration=0.1) 160 animations.FadeOut(self.fadeCont, duration=fadeTimeInSec, timeOffset=timeOffset) 161 blue.pyos.synchro.SleepWallclock(sleepTimeSec * 1000) 162 else: 163 animations.FadeOut(self.fadeCont, duration=fadeTimeInSec) 164 165 def _EndLoadNewReward(self, rewardInfo): 166 if not self or self.destroyed: 167 return 168 fadeTimeInSec = 0.3 169 self._LoadRewardInfo(rewardInfo, False) 170 elementsToFade = self.GetElementsToFade() 171 for eachElement in elementsToFade: 172 endValue = getattr(eachElement, 'fullOpacity', 1.0) 173 animations.FadeTo(eachElement, eachElement.opacity, endValue, duration=fadeTimeInSec) 174 175 uthread2.call_after_wallclocktime_delay(self.SetVideoPath, 2, rewardInfo) 176 177 def GetElementsToFade(self): 178 elementsToFade = [self.typeText, self.itemCont, self.crosshair] 179 return elementsToFade 180 181 def SetTypeText(self, rewardInfo): 182 text = self.GetTypeText(rewardInfo) 183 self.typeText.text = text 184 185 def GetTypeText(self, rewardInfo): 186 rewardName = rewardInfo.GetRewardName() 187 qty = rewardInfo.qty 188 if ShouldShowQty(rewardInfo): 189 text = '<center><b>%s</b></center>' % GetByLabel('UI/LoginRewards/NumType', qty=qty, typeName=rewardName) 190 else: 191 text = '<center><b>%s</b></center>' % rewardName 192 return text 193 194 def GetMenuFunc(self, *args): 195 typeID = self.currentRewardInfo.typeID 196 pConst = self.panelController.GetPanelConstants() 197 if not pConst.CRATES_HAVE_INFO and CratesStaticData().is_crate(typeID): 198 if session.role & (ROLE_GML | ROLE_WORLDMOD | ROLE_LEGIONEER): 199 return [('GM / WM Extras', ('isDynamic', GetMenuService().GetGMMenu, (None, 200 None, 201 None, 202 None, 203 None, 204 typeID)))] 205 return [] 206 if evetypes.GetCategoryID(typeID) == categoryBlueprint: 207 bpData = sm.GetService('blueprintSvc').GetBlueprintTypeCopy(typeID=typeID, runsRemaining=self.currentRewardInfo.qty, original=False) 208 abstractInfo = KeyVal(fullBlueprintData=bpData) 209 else: 210 abstractInfo = None 211 return GetMenuService().GetMenuFromItemIDTypeID(None, typeID, includeMarketDetails=True, abstractInfo=abstractInfo) 212 213 def LoadCompletedScreen(self, fullOpacity = True): 214 if fullOpacity: 215 self.rewardCont.Hide() 216 else: 217 animations.FadeOut(self.rewardCont, duration=0.2, callback=lambda *args: self.rewardCont.Hide()) 218 self.crosshair.SetSideSpriteDisplay(False) 219 self.congratsCont.LoadCongratsScreen() 220 221 def LoadTooltipPanel(self, tooltipPanel, *args): 222 if not self.currentRewardInfo: 223 return 224 LoadTooltipPanelForReward(tooltipPanel, self.currentRewardInfo) 225 226 227 class CompactPreviewItemEntry(PreviewItemEntry): 228 cloneTexture = '' 229 default_padTop = 4 230 default_padBottom = 4 231 cloneSpriteColor = (1, 1, 1, 0) 232 cloneText = '' 233 todayBracketOpacity = 0.4 234 235 def ApplyAttributes(self, attributes): 236 PreviewItemEntry.ApplyAttributes(self, attributes) 237 wOffest = 60 238 hOffset = 10 239 w = self.absoluteRight - self.absoluteLeft 240 wCenter = w / 2 241 wLeft = wCenter + wOffest 242 h = self.absoluteBottom - self.absoluteTop 243 hCenter = h / 2 244 hTop = hCenter + hOffset 245 self.cloneSprite = Sprite(name='cloneSprite', parent=self.rewardCont, opacity=1.0, align=uiconst.BOTTOMRIGHT, state=uiconst.UI_DISABLED, texturePath=self.cloneTexture, pos=(wLeft, 246 hTop, 247 30, 248 30), color=self.cloneSpriteColor) 249 textColor = self.cloneSpriteColor[:3] + (0.8,) 250 self.cloneLabel = EveLabelMedium(parent=self.rewardCont, align=uiconst.TOPRIGHT, pos=(wLeft, 251 hTop, 252 0, 253 0), text=self.cloneText, color=textColor) 254 self.typeText.Close() 255 maxWidth = w - wLeft 256 maxHeight = h - hTop 257 self.typeText = EveLabelSmall(parent=self.rewardCont, align=uiconst.TOPLEFT, text='', color=textColor, pos=(wLeft, 258 hTop, 259 maxWidth, 260 0)) 261 self.typeText.SetBottomAlphaFade(maxHeight - 10, 10) 262 self.claimedIcon = Sprite(parent=self.rewardCont, align=uiconst.CENTER, pos=(0, 0, 64, 64), texturePath='res:/ui/Texture/classes/LoginCampaign/claimedCheck.png', hint=GetByLabel('UI/LoginRewards/HasBeenClaimed'), color=GREEN_CHECKMARK, idx=0) 263 self.claimedIcon.display = False 264 265 def _LoadRewardInfo(self, rewardInfo, fullOpacity = True): 266 PreviewItemEntry._LoadRewardInfo(self, rewardInfo, fullOpacity) 267 if not rewardInfo: 268 return 269 rewardName = rewardInfo.GetRewardName() 270 self.typeText.text = rewardName 271 272 def GetElementsToFade(self): 273 elements = PreviewItemEntry.GetElementsToFade(self) 274 elements += [self.cloneSprite, self.cloneLabel] 275 return elements 276 277 278 class TwoTrackPreviewItemEntryAlpha(CompactPreviewItemEntry): 279 cloneTexture = 'res:/UI/Texture/classes/LoginCampaign/alpha_Icon.png' 280 cloneText = GetByLabel('UI/LoginRewards/CloneAlpha') 281 cloneSpriteColor = (1, 1, 1, 1) 282 283 def _LoadRewardInfo(self, rewardInfo, fullOpacity = True): 284 if rewardInfo and rewardInfo.claimState == CLAIM_STATE_CLAIMED: 285 self.claimedIcon.display = True 286 self.itemIcon.opacity = 0.5 287 else: 288 self.claimedIcon.display = False 289 CompactPreviewItemEntry._LoadRewardInfo(self, rewardInfo, fullOpacity) 290 if not rewardInfo: 291 return 292 293 def GetVideoPath(self, *args): 294 return GetCloneStateVideoPath(isOmegaEntry=False) 295 296 297 class TwoTrackPreviewItemEntryOmega(CompactPreviewItemEntry): 298 cloneTexture = 'res:/UI/Texture/classes/LoginCampaign/omega_Icon.png' 299 cloneSpriteColor = COLOR_OMEGA_GOLD 300 cloneText = GetByLabel('UI/LoginRewards/CloneOmega') 301 302 def ApplyAttributes(self, attributes): 303 CompactPreviewItemEntry.ApplyAttributes(self, attributes) 304 self.omegaLockSprite = Sprite(name='omegaLockSprite', parent=self.rewardCont, texturePath='res:/UI/Texture/classes/LoginCampaign/rewardTrack_omegaLocked.png', pos=(0, -8, 24, 24), align=uiconst.CENTERBOTTOM, state=uiconst.UI_NORMAL, idx=0, color=COLOR_OMEGA_GOLD) 305 self.omegaLockSprite.tooltipPanelClassInfo = OmegaIconToolTip(sm.GetService('loginCampaignService').open_vgs_to_buy_omega_time_from_DLI) 306 self.SetOmegaState() 307 308 def ConstructHatchPattern(self): 309 if getattr(self, 'hatchCont', None) is None: 310 self.hatchCont = Container(name='hatchCont', parent=self.rewardCont, align=uiconst.TOALL, clipChildren=True, idx=1, bgColor=(0, 0, 0, 0.55)) 311 color = COLOR_OMEGA_GOLD[:3] + (0.2,) 312 hatchPattern = Sprite(name='hatchPattern', parent=self.hatchCont, texturePath='res:/UI/Texture/Classes/LoginCampaign/itemContainer_negation.png', align=uiconst.CENTERBOTTOM, pos=(0, 0, 372, 198), state=uiconst.UI_DISABLED, color=color) 313 314 def LoadRewardInfo(self, rewardInfo, fullOpacity = True): 315 CompactPreviewItemEntry.LoadRewardInfo(self, rewardInfo, fullOpacity) 316 if not rewardInfo: 317 return 318 newCrosshairColor = COLOR_OMEGA_GOLD[:3] + (RewardCrosshair.LINE_OPACITY,) 319 self.crosshair.SetRGBA(newCrosshairColor) 320 newTodayBracketColor = COLOR_OMEGA_GOLD[:3] + (self.todayBracket.opacity,) 321 self.todayBracket.SetRGBA(*newTodayBracketColor) 322 self.SetOmegaState() 323 324 def SetOmegaState(self): 325 if self.panelController.IsOmega(): 326 self.omegaLockSprite.display = False 327 if getattr(self, 'hatchCont', None): 328 self.hatchCont.display = False 329 else: 330 self.omegaLockSprite.display = True 331 self.ConstructHatchPattern() 332 self.hatchCont.display = True 333 334 def GetVideoPath(self, *args): 335 return GetCloneStateVideoPath(isOmegaEntry=True) 336 337 338 class ReminderPreviewItemEntry(CompactPreviewItemEntry): 339 cloneSpriteColor = (1, 1, 1, 0) 340 341 def ApplyAttributes(self, attributes): 342 CompactPreviewItemEntry.ApplyAttributes(self, attributes)