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

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