rewardcont.py (17437B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\agentinteraction\rewardcont.py 2 import carbonui.text.styles 3 import gametime 4 import mathext 5 import trinity 6 from agentinteraction.constUI import PADDING_SMALLER, HEADER_SIZE_MEDIUM, PADDING_SMALL 7 from agentinteraction.reward import RewardType 8 from carbon.common.script.util.format import FmtDate 9 from carbon.common.script.util.timerstuff import AutoTimer 10 import carbonui 11 from carbonui import uiconst, TextAlign 12 from carbonui.primitives.container import Container 13 from carbonui.primitives.containerAutoSize import ContainerAutoSize 14 from carbonui.primitives.frame import Frame 15 from carbonui.primitives.sprite import Sprite 16 from carbonui.util.color import Color 17 from clonegrade.const import CLONE_STATE_ALPHA, CLONE_STATE_OMEGA 18 from eve.client.script.ui import eveColor 19 from eve.client.script.ui.control.eveIcon import GetOwnerLogo 20 from eve.client.script.ui.control.gaugeCircular import GaugeCircular 21 from eve.client.script.ui.control.infoIcon import MoreInfoIconBeta 22 from eve.client.script.ui.control.itemIcon import ItemIcon 23 from eve.client.script.ui.shared.tooltip.blueprints import AddBlueprintInfo 24 from eve.common.lib.vgsConst import CATEGORYTAG_GAMETIME 25 from eve.common.script.sys.idCheckers import IsOwner 26 from evetypes import GetName 27 from localization import GetByLabel 28 from omega.client.clone_grade_svc import get_clone_grade_svc 29 TITLE_HEIGHT = 29 30 REWARD_ICON_SIZE = 64 31 REWARD_ICON_CONT_SIZE = 84 32 REWARD_TEXT_HEIGHT = 35 33 REWARD_TEXT_TOP_PADDING = 6 34 GAUGE_WIDTH = 16 35 REWARD_CONTAINER_HEIGHT = TITLE_HEIGHT + PADDING_SMALLER + REWARD_ICON_CONT_SIZE + REWARD_TEXT_TOP_PADDING + REWARD_TEXT_HEIGHT 36 REWARD_TITLE_BY_TYPE = {RewardType.NORMAL: 'UI/Agents/StandardMission/RewardsTitle', 37 RewardType.BONUS: 'UI/Agents/StandardMission/BonusRewardsTitle'} 38 CLONE_STATE_BADGE_SIZE = 24 39 OMEGA_UPSELL_LEFT = 32 40 OMEGA_UPSELL_INFO_WIDTH = 186 41 OMEGA_UPSELL_INFO_PADDING_H = 13 42 43 class RewardTypeCont(ContainerAutoSize): 44 default_name = 'RewardTypeCont' 45 default_height = REWARD_CONTAINER_HEIGHT 46 default_alignMode = uiconst.TOLEFT 47 default_title_color = carbonui.TextColor.HIGHLIGHT 48 49 def ApplyAttributes(self, attributes): 50 super(RewardTypeCont, self).ApplyAttributes(attributes) 51 hint_text = attributes.hint_text 52 reward_type = attributes.reward_type 53 title_color = attributes.title_color if attributes.title_color else self.default_title_color 54 self.current_rewards = set() 55 self.title_cont = Container(name='title_container_%s_rewards' % reward_type, parent=self, align=uiconst.TOTOP, padBottom=PADDING_SMALLER) 56 self._build_title_text(reward_type, title_color) 57 self._build_hint(hint_text) 58 self.title_cont.height = self.title_label.height 59 self.minWidth = self.title_label.width 60 self.tile_cont = ContainerAutoSize(name='tile_cont', parent=self, align=uiconst.TOLEFT) 61 self._update_sizes() 62 63 def add_rewards(self, rewards, reward_type): 64 for reward in rewards: 65 if reward.quantity > 0: 66 self._add_reward(reward, reward_type) 67 68 self.update_info(rewards) 69 if self.get_amount_of_rewards() > 0: 70 self.Show() 71 else: 72 self.Hide() 73 74 def get_amount_of_rewards(self): 75 return len(self.current_rewards) 76 77 def _build_title_text(self, reward_type, title_color): 78 self.title_text_cont = ContainerAutoSize(name='self.title_text_cont', parent=self.title_cont, align=uiconst.TOLEFT, alignMode=uiconst.CENTERLEFT) 79 self.title_label = carbonui.text.styles.TextHeader(name='title_%s_rewards' % reward_type, parent=self.title_text_cont, align=uiconst.CENTERLEFT, text=GetByLabel(REWARD_TITLE_BY_TYPE[reward_type]), color=title_color) 80 81 def _build_hint(self, hint_text): 82 self.hint_cont = Container(name='hint_cont', parent=self.title_cont, align=uiconst.TOLEFT) 83 self.hint_icon = MoreInfoIconBeta(parent=self.hint_cont, align=uiconst.CENTERLEFT, left=4) 84 self.hint_cont.width = self.hint_icon.width 85 self._set_hint_text(hint_text) 86 87 def _set_hint_text(self, hint_text): 88 self.hint_icon.hint = hint_text 89 self.hint_cont.display = bool(self.hint_icon.hint) 90 91 def flush_content(self): 92 self.tile_cont.Flush() 93 94 def _add_reward(self, reward, reward_type): 95 type_id = reward.type_id 96 self.current_rewards.add((type_id, reward_type)) 97 RewardCont(name='container_%s_reward_%s' % (reward_type, type_id), parent=self.tile_cont, align=uiconst.TOLEFT, padRight=PADDING_SMALL, state=uiconst.UI_NORMAL, reward=reward, reward_type=reward_type) 98 99 def get_current_rewards(self): 100 return self.current_rewards 101 102 def clear_current_rewards(self): 103 self.current_rewards = set() 104 105 def update_info(self, rewards): 106 pass 107 108 def _update_sizes(self): 109 self.minWidth = self.title_label.width + self._get_hint_width() 110 111 def _get_hint_width(self): 112 if self.hint_cont.display: 113 return self.hint_cont.width + self.hint_cont.left 114 return 0 115 116 117 class BonusRewardTypeCont(RewardTypeCont): 118 default_name = 'BonusRewardTypeCont' 119 default_height = REWARD_CONTAINER_HEIGHT 120 default_alignMode = uiconst.TOLEFT 121 122 def ApplyAttributes(self, attributes): 123 self.timer_cont = None 124 super(BonusRewardTypeCont, self).ApplyAttributes(attributes) 125 self._build_timer_cont() 126 127 def _build_timer_cont(self): 128 if self.timer_cont and not self.timer_cont.destroyed: 129 return self.timer_cont 130 self.timer_cont = TimerCont(parent=self.title_cont) 131 return self.timer_cont 132 133 def update_info(self, rewards): 134 self.update_expiry_time(rewards) 135 self._update_sizes() 136 137 def update_expiry_time(self, rewards): 138 reward_with_earliest_expiry = None 139 expiry_times = [ x for x in rewards if x.get_bonus_expiry_time() ] 140 if expiry_times: 141 expiry_times = sorted(expiry_times, key=lambda x: x.get_bonus_expiry_time() is not None) 142 reward_with_earliest_expiry = expiry_times[0] 143 hint = self._get_hint_text(rewards) 144 if not reward_with_earliest_expiry: 145 self.timer_cont.display = False 146 self._set_hint_text(hint) 147 return 148 self._set_hint_text('') 149 self.timer_cont.hint = hint 150 self.timer_cont.display = True 151 self.timer_cont.update_expiry_time(reward_with_earliest_expiry) 152 self._update_sizes() 153 154 def _get_hint_text(self, rewards): 155 hint = '' 156 bonus_times = filter(None, [ x.get_time_bonus() for x in rewards ]) 157 if bonus_times: 158 bonus_time = min(bonus_times) 159 hint = GetByLabel('UI/Agents/StandardMission/BonusRewardsHeader2', timeRemaining=bonus_time) 160 return hint 161 162 def _update_sizes(self): 163 self.minWidth = self.title_label.width + self._get_timer_width() + self._get_hint_width() 164 165 def _get_timer_width(self): 166 if not self.timer_cont: 167 return 0 168 return self.timer_cont.get_counter_width() 169 170 171 class RewardCont(ContainerAutoSize): 172 173 def ApplyAttributes(self, attributes): 174 super(RewardCont, self).ApplyAttributes(attributes) 175 self.reward = attributes.reward 176 self.reward_type = attributes.reward_type 177 self.reward_type_id = self.reward.type_id 178 self.icon_parent_cont = Container(name='icon_parent_cont', parent=self, width=REWARD_ICON_CONT_SIZE, height=REWARD_ICON_CONT_SIZE, align=uiconst.TOPLEFT) 179 self._add_icon(self.icon_parent_cont, self.reward_type_id) 180 self._add_label(parent=self) 181 self._add_clone_state_ui() 182 183 def _add_icon(self, parent, type_id, size = REWARD_ICON_SIZE): 184 self.icon_cont = Container(name='icon_cont', parent=parent, width=REWARD_ICON_CONT_SIZE, height=REWARD_ICON_CONT_SIZE, align=uiconst.CENTERTOP) 185 icon_name = 'icon_{type_id}'.format(type_id=type_id) 186 if IsOwner(type_id): 187 GetOwnerLogo(ownerID=type_id, name=icon_name, parent=self.icon_cont, align=uiconst.CENTER, state=uiconst.UI_DISABLED, size=size) 188 else: 189 if self.reward.is_blueprint_copy(): 190 bpData = sm.GetService('blueprintSvc').GetBlueprintTypeCopy(self.reward.type_id, original=False, runsRemaining=self.reward.get_runs_remaining(), materialEfficiency=self.reward.get_material_level(), timeEfficiency=self.reward.get_productivity_level()) 191 else: 192 bpData = None 193 self.reward_icon = ItemIcon(name=icon_name, parent=self.icon_cont, align=uiconst.CENTER, width=size, height=size, showOmegaOverlay=False, typeID=type_id, bpData=bpData) 194 self.reward_icon.icon.spriteEffect = trinity.TR2_SFX_MODULATE 195 self.reward_icon.icon.SetSecondaryTexturePath('res:/UI/Texture/Classes/AgentInteraction/panel1Corner_Solid_64.png') 196 self.reward_icon.LoadTooltipPanel = self._reward_tooltip_panel 197 if not self.reward.is_normal_type(): 198 self.reward_icon.state = uiconst.UI_DISABLED 199 background_name = 'background_reward_%s_%s' % (self.reward_type, self.reward_type_id) 200 self._add_background(parent=self.icon_cont, name=background_name, color=(1.0, 1.0, 1.0, 0.1)) 201 202 def _reward_tooltip_panel(self, tooltip_panel, *args): 203 tooltip_panel.LoadGeneric2ColumnTemplate() 204 tooltip_panel.margin = (12, 8, 12, 8) 205 tooltip_panel.AddLabelMedium(text=GetName(self.reward.type_id), colSpan=2, bold=True, wrapWidth=200) 206 if self.reward_icon.bpData: 207 AddBlueprintInfo(tooltip_panel, typeID=self.reward.type_id, bpData=self.reward_icon.bpData) 208 209 def _add_background(self, parent, name, color): 210 background_container = Container(name='container_%s' % name, parent=parent, state=uiconst.UI_DISABLED) 211 Frame(name='stroke_frame_%s' % name, parent=background_container, color=color, cornerSize=9, texturePath='res:/UI/Texture/Shared/DarkStyle/panel1Corner_Stroke.png') 212 Frame(name='solid_frame_%s' % name, parent=background_container, color=color, cornerSize=9, texturePath='res:/UI/Texture/Shared/DarkStyle/panel1Corner_Solid.png') 213 214 def _add_label(self, parent, use_omega_quantity = False): 215 label_cont = Container(name='label_cont', parent=parent, align=uiconst.TOPLEFT, width=REWARD_ICON_CONT_SIZE, height=REWARD_TEXT_HEIGHT + REWARD_TEXT_TOP_PADDING, clipChildren=True, top=REWARD_ICON_CONT_SIZE, padTop=REWARD_TEXT_TOP_PADDING, hint=self.reward.get_hint(use_omega_quantity), state=uiconst.UI_NORMAL) 216 carbonui.text.styles.TextBody(name='label_%s_reward_%s' % (self.reward_type, self.reward_type_id), parent=label_cont, align=uiconst.TOTOP, text=self.reward.get_text(use_omega_quantity), color=carbonui.TextColor.HIGHLIGHT, textAlign=TextAlign.LEFT) 217 218 def _add_clone_state_ui(self): 219 alpha_quantity = self.reward.alpha_quantity or self.reward.quantity 220 omega_quantity = self.reward.omega_quantity or self.reward.quantity 221 if alpha_quantity == omega_quantity: 222 return 223 clone_state = get_clone_grade_svc().get_clone_grade_with_grace_period() 224 self._add_clone_state_badge(clone_state, parent=self.icon_parent_cont) 225 self._add_omega_upsell(clone_state) 226 227 def _add_clone_state_badge(self, clone_state, parent): 228 texture_path = None 229 if clone_state == CLONE_STATE_ALPHA: 230 texture_path = 'res:/UI/Texture/Classes/CloneGrade/Alpha_32.png' 231 elif clone_state == CLONE_STATE_OMEGA: 232 texture_path = 'res:/UI/Texture/Classes/CloneGrade/Omega_24.png' 233 if not texture_path: 234 return 235 offset = -CLONE_STATE_BADGE_SIZE / 2 236 Sprite(name='clone_state_badge', parent=parent, align=uiconst.TOPLEFT, state=uiconst.UI_DISABLED, width=CLONE_STATE_BADGE_SIZE, height=CLONE_STATE_BADGE_SIZE, texturePath=texture_path, top=offset, left=parent.width + offset, idx=0) 237 238 def _add_omega_upsell(self, clone_state): 239 if clone_state != CLONE_STATE_ALPHA: 240 return 241 omega_vs_alpha_ratio = self.reward.get_omega_vs_alpha_ratio() 242 if not omega_vs_alpha_ratio: 243 return 244 omega_upsell_container = Container(name='omega_upsell_container', parent=self, width=REWARD_ICON_CONT_SIZE + OMEGA_UPSELL_INFO_WIDTH, height=REWARD_ICON_CONT_SIZE + REWARD_TEXT_HEIGHT + REWARD_TEXT_TOP_PADDING, align=uiconst.TOPLEFT, left=REWARD_ICON_CONT_SIZE + OMEGA_UPSELL_LEFT) 245 omega_upsell_top_container = Container(name='omega_upsell_top_container', parent=omega_upsell_container, width=REWARD_ICON_CONT_SIZE + OMEGA_UPSELL_INFO_WIDTH, height=REWARD_ICON_CONT_SIZE, align=uiconst.TOPLEFT) 246 omega_upsell_icon_parent_container = Container(name='omega_upsell_icon_parent_container', parent=omega_upsell_top_container, width=REWARD_ICON_CONT_SIZE, height=REWARD_ICON_CONT_SIZE, align=uiconst.TOPLEFT) 247 self._add_icon(omega_upsell_icon_parent_container, self.reward_type_id) 248 self._add_upsell_info(omega_upsell_container, omega_vs_alpha_ratio) 249 self._add_label(parent=omega_upsell_container, use_omega_quantity=True) 250 background_color = Color(*eveColor.SAND_YELLOW).SetOpacity(0.1).GetRGBA() 251 self._add_background(parent=omega_upsell_top_container, name='omega_upsell_background', color=background_color) 252 253 def _add_upsell_info(self, parent, omega_vs_alpha_ratio): 254 upsell_info_container = Container(name='upsell_info_container', parent=parent, width=OMEGA_UPSELL_INFO_WIDTH, height=REWARD_ICON_CONT_SIZE, align=uiconst.TOPLEFT, left=REWARD_ICON_CONT_SIZE, state=uiconst.UI_NORMAL) 255 upsell_info_label_container = Container(name='upsell_info_label_container', parent=upsell_info_container, align=uiconst.CENTER, width=OMEGA_UPSELL_INFO_WIDTH, height=REWARD_ICON_CONT_SIZE, clipChildren=True, padding=(OMEGA_UPSELL_INFO_PADDING_H, 256 0, 257 OMEGA_UPSELL_INFO_PADDING_H, 258 0)) 259 omega_vs_alpha_ratio = round(omega_vs_alpha_ratio, ndigits=2) 260 if float(omega_vs_alpha_ratio).is_integer(): 261 omega_vs_alpha_ratio = int(omega_vs_alpha_ratio) 262 text = GetByLabel('UI/Agents/StandardMission/OmegaUpsell', omegaVsAlphaRatio=omega_vs_alpha_ratio, typeName=GetName(self.reward_type_id)) 263 carbonui.text.styles.TextBody(name='upsell_info_label', parent=upsell_info_label_container, align=uiconst.CENTER, text=text, color=carbonui.TextColor.HIGHLIGHT, textAlign=TextAlign.LEFT, maxWidth=upsell_info_label_container.width - 2 * OMEGA_UPSELL_INFO_PADDING_H) 264 self._add_clone_state_badge(clone_state=CLONE_STATE_OMEGA, parent=upsell_info_container) 265 upsell_info_container.OnClick = self._see_omega_in_new_eden_store 266 self.icon_cont.OnClick = self._see_omega_in_new_eden_store 267 268 def _see_omega_in_new_eden_store(self, *args, **kwargs): 269 sm.GetService('vgsService').OpenStore(categoryTag=CATEGORYTAG_GAMETIME) 270 271 272 class TimerCont(ContainerAutoSize): 273 default_name = 'timer_cont' 274 default_align = uiconst.TOLEFT 275 default_alignMode = uiconst.TOLEFT 276 default_padLeft = 12 277 default_state = uiconst.UI_NORMAL 278 279 def ApplyAttributes(self, attributes): 280 self.reward_with_timer_info = None 281 self.expiry_thread = None 282 super(TimerCont, self).ApplyAttributes(attributes) 283 gauge_size = GAUGE_WIDTH 284 self.gauge_cont = Container(name='gauge_cont', parent=self, align=uiconst.TOLEFT, width=GAUGE_WIDTH) 285 self.gauge_circular = GaugeCircular(parent=self.gauge_cont, showMarker=False, align=uiconst.CENTER, colorStart=eveColor.CRYO_BLUE, colorEnd=eveColor.CRYO_BLUE, radius=GAUGE_WIDTH / 2, state=uiconst.UI_DISABLED) 286 self.text_cont = ContainerAutoSize(name='text_cont', parent=self, align=uiconst.TOLEFT, height=gauge_size + 4) 287 self.timer_label = carbonui.text.styles.TextBody(name='timer_label', parent=self.text_cont, align=uiconst.CENTERLEFT, maxLines=1, color=carbonui.TextColor.HIGHLIGHT, text=' ', left=8) 288 289 def update_expiry_time(self, reward): 290 self.reward_with_timer_info = reward 291 self.update_expiry_elements_thread(animate=False) 292 self.expiry_thread = AutoTimer(500, self.update_expiry_elements_thread) 293 294 def update_expiry_elements_thread(self, animate = True): 295 if self.destroyed: 296 self.expiry_thread = None 297 return 298 if self.reward_with_timer_info is None: 299 return 300 reward_expiry_time = self.reward_with_timer_info.get_bonus_expiry_time() 301 diff = reward_expiry_time - gametime.GetWallclockTime() 302 is_expired = diff < 0 303 if is_expired: 304 self.set_as_expired(animate) 305 return 306 diff = max(0, diff) 307 self.timer_label.text = FmtDate(diff, 'ss') 308 bonus_progress = self.reward_with_timer_info.get_bonus_progress() 309 progress = mathext.clamp(bonus_progress, 0, 1.0) 310 self.gauge_circular.SetValue(1 - progress, animate=animate) 311 312 def set_as_expired(self, animate): 313 self.expiry_thread = None 314 self.timer_label.text = GetByLabel('UI/Agents/StandardMission/BonusRewardsAreExpired') 315 self.timer_label.SetAlpha(0.5) 316 self.gauge_circular.SetValue(0.0, animate=animate) 317 318 def get_counter_width(self): 319 if not self.display: 320 return 0 321 return self.gauge_cont.width + self.timer_label.width + self.timer_label.left