def createFunctional(self, dispatcher, ctx):
        clientPrb = prb_control.getClientPrebattle()
        if clientPrb is not None:
            if prb_control.isPrebattleSettingsReceived(prebattle=clientPrb):
                prbSettings = prb_control.getPrebattleSettings(prebattle=clientPrb)
                prbType = prb_control.getPrebattleType(settings=prbSettings)
                clazz = None
                if prbType in _SUPPORTED_FUNCTIONAL:
                    clazz = _SUPPORTED_FUNCTIONAL[prbType]
                if clazz:
                    prbFunctional = clazz(prbSettings)
                    for listener in dispatcher._globalListeners:
                        prbFunctional.addListener(listener())

                    createParams = ctx.getCreateParams()
                    if 'settings' in createParams and isStatefulFunctional(prbFunctional):
                        guiSettings = createParams['settings']
                        if guiSettings:
                            prbFunctional.applyStates(guiSettings.get(CTRL_ENTITY_TYPE.PREBATTLE))
                else:
                    LOG_ERROR('Prebattle with given type is not supported', prbType)
                    prbFunctional = PrbNotSupportedFunctional(prbSettings)
            else:
                prbFunctional = PrbInitFunctional()
        else:
            prbType = ctx.getPrbType()
            clazz = None
            if prbType in _SUPPORTED_INTRO:
                clazz = _SUPPORTED_INTRO[prbType]
            if clazz is None:
                clazz = NoPrbFunctional
            prbFunctional = clazz()
        return prbFunctional
Exemple #2
0
 def fini(self, clientPrb = None, woEvents = False):
     self.__dispatcher = None
     if clientPrb is None:
         clientPrb = prb_control.getClientPrebattle()
     if clientPrb is not None:
         clientPrb.onSettingsReceived -= self.prb_onSettingsReceived
         clientPrb.onRosterReceived -= self.prb_onRosterReceived
Exemple #3
0
    def fini(self, clientPrb = None, woEvents = False):
        self._hasEntity = False
        self._settings = None
        super(PrbDispatcher, self).fini(clientPrb, woEvents)
        if self._limits is not None:
            self._limits.clear()
            self._limits = None
        if not woEvents:
            try:
                for listener in self._listeners:
                    listener.onPrbFunctionalFinished()

            except:
                LOG_CURRENT_EXCEPTION()

        if clientPrb is None:
            clientPrb = prb_control.getClientPrebattle()
        if clientPrb is not None:
            clientPrb.onSettingUpdated -= self.prb_onSettingUpdated
            clientPrb.onTeamStatesReceived -= self.prb_onTeamStatesReceived
            clientPrb.onPlayerStateChanged -= self.prb_onPlayerStateChanged
            clientPrb.onPlayerRosterChanged -= self.prb_onPlayerRosterChanged
            clientPrb.onPlayerAdded -= self.prb_onPlayerAdded
            clientPrb.onPlayerRemoved -= self.prb_onPlayerRemoved
            clientPrb.onKickedFromQueue -= self.prb_onKickedFromQueue
Exemple #4
0
    def fini(self, clientPrb = None, woEvents = False):
        self._hasEntity = False
        self._settings = None
        super(PrbDispatcher, self).fini(clientPrb, woEvents)
        if self._limits is not None:
            self._limits.clear()
            self._limits = None
        if not woEvents:
            try:
                for listener in self._listeners:
                    listener.onPrbFunctionalFinished()

            except:
                LOG_CURRENT_EXCEPTION()

        if clientPrb is None:
            clientPrb = prb_control.getClientPrebattle()
        if clientPrb is not None:
            clientPrb.onSettingUpdated -= self.prb_onSettingUpdated
            clientPrb.onTeamStatesReceived -= self.prb_onTeamStatesReceived
            clientPrb.onPlayerStateChanged -= self.prb_onPlayerStateChanged
            clientPrb.onPlayerRosterChanged -= self.prb_onPlayerRosterChanged
            clientPrb.onPlayerAdded -= self.prb_onPlayerAdded
            clientPrb.onPlayerRemoved -= self.prb_onPlayerRemoved
            clientPrb.onKickedFromQueue -= self.prb_onKickedFromQueue
        return
Exemple #5
0
 def fini(self, clientPrb = None, woEvents = False):
     self.__dispatcher = None
     if clientPrb is None:
         clientPrb = prb_control.getClientPrebattle()
     if clientPrb is not None:
         clientPrb.onSettingsReceived -= self.prb_onSettingsReceived
         clientPrb.onRosterReceived -= self.prb_onRosterReceived
Exemple #6
0
 def create(self, ctx, callback=None):
     if not isinstance(ctx, TrainingSettingsCtx):
         LOG_ERROR('Invalid context to create training', ctx)
         if callback:
             callback(False)
     elif info.isRequestInCoolDown(REQUEST_TYPE.CREATE):
         SystemMessages.pushMessage(messages.getJoinFailureMessage(
             JOIN_FAILURE.COOLDOWN),
                                    type=SystemMessages.SM_TYPE.Error)
         if callback:
             callback(False)
     elif prb_control.getClientPrebattle() is None or ctx.isForced():
         ctx.startProcessing(callback=callback)
         BigWorld.player().prb_createTraining(ctx.getArenaTypeID(),
                                              ctx.getRoundLen(),
                                              ctx.isOpened(),
                                              ctx.getComment())
         info.setRequestCoolDown(
             REQUEST_TYPE.CREATE,
             coolDown=REQUEST_COOLDOWN.PREBATTLE_CREATION)
     else:
         LOG_ERROR(
             'First, player has to confirm exit from the current prebattle',
             prb_control.getPrebattleType())
         if callback:
             callback(False)
     return
Exemple #7
0
 def _canAddPlayers(self):
     clientPrb = prb_control.getClientPrebattle()
     result = False
     if clientPrb is not None:
         settings = prb_control.getPrebattleSettings(prebattle=clientPrb)
         rosters = prb_control.getPrebattleRosters(prebattle=clientPrb)
         result, _ = MaxCount().check(rosters, 1, settings.getTeamLimits(1))
     return result
Exemple #8
0
 def join(self, ctx, callback = None):
     if prb_control.getClientPrebattle() is None or ctx.isForced():
         ctx.startProcessing(callback=callback)
         BigWorld.player().prb_join(ctx.getID())
     else:
         LOG_ERROR('First, player has to confirm exit from the current prebattle', prb_control.getPrebattleType())
         if callback:
             callback(False)
Exemple #9
0
 def _canAddPlayers(self):
     clientPrb = prb_control.getClientPrebattle()
     result = False
     if clientPrb is not None:
         settings = prb_control.getPrebattleSettings(prebattle=clientPrb)
         rosters = prb_control.getPrebattleRosters(prebattle=clientPrb)
         result, _ = MaxCount().check(rosters, 1, settings.getTeamLimits(1))
     return result
Exemple #10
0
 def join(self, ctx, callback = None):
     if prb_control.getClientPrebattle() is None or ctx.isForced():
         ctx.startProcessing(callback=callback)
         BigWorld.player().prb_join(ctx.getID())
     else:
         LOG_ERROR('First, player has to confirm exit from the current prebattle', prb_control.getPrebattleType())
         if callback:
             callback(False)
Exemple #11
0
 def canAssignToTeam(self, team = 1):
     clientPrb = prb_control.getClientPrebattle()
     result = False
     if clientPrb is not None:
         settings = prb_control.getPrebattleSettings(prebattle=clientPrb)
         rosters = prb_control.getPrebattleRosters(prebattle=clientPrb)
         prbType = prb_control.getPrebattleType(clientPrb, settings)
         result, _ = TeamNoPlayersInBattle(prbType).check(rosters, team, settings.getTeamLimits(team))
     return result
Exemple #12
0
 def pe_onPrebattleJoined(self):
     clientPrb = getClientPrebattle()
     if clientPrb:
         self.__prbFunctional.fini()
         self.__prbFunctional = functional.createPrbFunctional(self)
         self.__prbFunctional.init()
     else:
         LOG_ERROR('ClientPrebattle is not defined')
         self.__requestCtx.stopProcessing(result=False)
Exemple #13
0
 def pe_onPrebattleJoined(self):
     clientPrb = getClientPrebattle()
     if clientPrb:
         self.__prbFunctional.fini()
         self.__prbFunctional = functional.createPrbFunctional(self)
         self.__prbFunctional.init()
     else:
         LOG_ERROR('ClientPrebattle is not defined')
         self.__requestCtx.stopProcessing(result=False)
Exemple #14
0
 def canAssignToTeam(self, team=1):
     clientPrb = prb_control.getClientPrebattle()
     result = False
     if clientPrb is not None:
         settings = prb_control.getPrebattleSettings(prebattle=clientPrb)
         rosters = prb_control.getPrebattleRosters(prebattle=clientPrb)
         prbType = prb_control.getPrebattleType(clientPrb, settings)
         result, _ = TeamNoPlayersInBattle(prbType).check(
             rosters, team, settings.getTeamLimits(team))
     return result
Exemple #15
0
 def init(self, clientPrb = None, ctx = None):
     if clientPrb is None:
         clientPrb = prb_control.getClientPrebattle()
     if clientPrb is not None:
         clientPrb.onSettingsReceived += self.prb_onSettingsReceived
         clientPrb.onRosterReceived += self.prb_onRosterReceived
         if prb_control.isPrebattleSettingsReceived(prebattle=clientPrb):
             self.prb_onSettingsReceived()
         if len(prb_control.getPrebattleRosters(prebattle=clientPrb)):
             self.prb_onRosterReceived()
     return FUNCTIONAL_INIT_RESULT.INITED
Exemple #16
0
 def init(self, clientPrb = None, ctx = None):
     if clientPrb is None:
         clientPrb = prb_control.getClientPrebattle()
     if clientPrb is not None:
         clientPrb.onSettingsReceived += self.prb_onSettingsReceived
         clientPrb.onRosterReceived += self.prb_onRosterReceived
         if prb_control.isPrebattleSettingsReceived(prebattle=clientPrb):
             self.prb_onSettingsReceived()
         if len(prb_control.getPrebattleRosters(prebattle=clientPrb)):
             self.prb_onRosterReceived()
     return FUNCTIONAL_INIT_RESULT.INITED
Exemple #17
0
 def create(self, ctx, callback = None):
     if prb_cooldown.validatePrbCreationCooldown():
         if callback:
             callback(False)
     elif getClientPrebattle() is None or ctx.isForced():
         ctx.startProcessing(callback=callback)
         BigWorld.player().prb_createEventSquad()
         prb_cooldown.setPrbCreationCooldown()
     else:
         LOG_ERROR('First, player has to confirm exit from the current prebattle', getPrebattleType())
         if callback:
             callback(False)
 def __checkPrebattleLockedVehicle(self):
     clientPrb = prb_control.getClientPrebattle()
     if clientPrb is not None:
         rosters = prb_control.getPrebattleRosters(prebattle=clientPrb)
         for rId, roster in rosters.iteritems():
             if BigWorld.player().id in roster:
                 vehCompDescr = roster[BigWorld.player().id].get('vehCompDescr', '')
                 if len(vehCompDescr):
                     vehDescr = vehicles.VehicleDescr(vehCompDescr)
                     vehicle = g_itemsCache.items.getItemByCD(vehDescr.type.compactDescr)
                     if vehicle is not None:
                         return vehicle.invID
     return 0
Exemple #19
0
 def doAction(self, action, dispatcher = None):
     if action.actionName == PREBATTLE_ACTION_NAME.LEAVE_TRAINING_LIST:
         events_dispatcher.loadHangar()
     elif prb_control.getClientPrebattle() is None:
         self.__loadTrainingList()
     elif prb_control.isTraining():
         if dispatcher is not None:
             self.__loadTrainingRoom(dispatcher)
         else:
             LOG_ERROR('Dispatcher not found')
     else:
         LOG_ERROR('Player is joined to prebattle', prb_control.getPrebattleType())
     return True
Exemple #20
0
    def __checkPrebattleLockedVehicle(self):
        clientPrb = prb_control.getClientPrebattle()
        if clientPrb is not None:
            rosters = prb_control.getPrebattleRosters(prebattle=clientPrb)
            for rId, roster in rosters.iteritems():
                if BigWorld.player().id in roster:
                    vehCompDescr = roster[BigWorld.player().id].get('vehCompDescr', '')
                    if len(vehCompDescr):
                        vehDescr = vehicles.VehicleDescr(vehCompDescr)
                        vehicle = g_itemsCache.items.getItemByCD(vehDescr.type.compactDescr)
                        if vehicle is not None:
                            return vehicle.invID

        return 0
Exemple #21
0
 def doAction(self, action, dispatcher=None):
     if action.actionName == PREBATTLE_ACTION_NAME.LEAVE_TRAINING_LIST:
         events_dispatcher.loadHangar()
     elif prb_control.getClientPrebattle() is None:
         self.__loadTrainingList()
     elif prb_control.isTraining():
         if dispatcher is not None:
             self.__loadTrainingRoom(dispatcher)
         else:
             LOG_ERROR('Dispatcher not found')
     else:
         LOG_ERROR('Player is joined to prebattle',
                   prb_control.getPrebattleType())
     return True
Exemple #22
0
 def pe_onPrebattleJoined(self):
     clientPrb = getClientPrebattle()
     if clientPrb:
         prbFunctional = self.getFunctional(CTRL_ENTITY_TYPE.PREBATTLE)
         if prbFunctional:
             if self.__requestCtx and self.__requestCtx.getPrbType() == prbFunctional.getPrbType():
                 exit = FUNCTIONAL_EXIT.PREBATTLE
             else:
                 exit = FUNCTIONAL_EXIT.NO_FUNC
             prbFunctional.setExit(exit)
         else:
             LOG_ERROR('Prebattle functional is not found')
         self.__factories.createFunctional(self, CreateFunctionalCtx(CTRL_ENTITY_TYPE.PREBATTLE))
     else:
         LOG_ERROR('ClientPrebattle is not defined')
         self.__requestCtx.stopProcessing(result=False)
Exemple #23
0
 def create(self, ctx, callback=None):
     if prb_cooldown.validatePrbCreationCooldown():
         if callback:
             callback(False)
     elif getClientPrebattle() is None or ctx.isForced():
         ctx.startProcessing(callback=callback)
         BigWorld.player().prb_createCompany(ctx.isOpened(),
                                             ctx.getComment(),
                                             ctx.getDivision())
         prb_cooldown.setPrbCreationCooldown()
     else:
         LOG_ERROR(
             'First, player has to confirm exit from the current prebattle',
             getPrebattleType())
         if callback:
             callback(False)
Exemple #24
0
 def create(self, ctx, callback = None):
     if not isinstance(ctx, prb_ctx.TrainingSettingsCtx):
         LOG_ERROR('Invalid context to create training', ctx)
         if callback:
             callback(False)
     elif prb_cooldown.validatePrbCreationCooldown():
         if callback:
             callback(False)
     elif getClientPrebattle() is None or ctx.isForced():
         ctx.startProcessing(callback=callback)
         BigWorld.player().prb_createTraining(ctx.getArenaTypeID(), ctx.getRoundLen(), ctx.isOpened(), ctx.getComment())
         prb_cooldown.setPrbCreationCooldown()
     else:
         LOG_ERROR('First, player has to confirm exit from the current prebattle', getPrebattleType())
         if callback:
             callback(False)
Exemple #25
0
 def create(self, ctx, callback = None):
     if not isinstance(ctx, context.SquadSettingsCtx):
         LOG_ERROR('Invalid context to create squad', ctx)
         if callback:
             callback(False)
     elif info.isRequestInCoolDown(REQUEST_TYPE.CREATE):
         SystemMessages.pushMessage(messages.getJoinFailureMessage(JOIN_FAILURE.COOLDOWN), type=SystemMessages.SM_TYPE.Error)
         if callback:
             callback(False)
     elif prb_control.getClientPrebattle() is None or ctx.isForced():
         ctx.startProcessing(callback=callback)
         BigWorld.player().prb_createSquad()
         info.setRequestCoolDown(REQUEST_TYPE.CREATE, coolDown=REQUEST_COOLDOWN.PREBATTLE_CREATION)
     else:
         LOG_ERROR('First, player has to confirm exit from the current prebattle', prb_control.getPrebattleType())
         if callback:
             callback(False)
     return
Exemple #26
0
    def init(self, clientPrb = None, ctx = None):
        if clientPrb is None:
            clientPrb = prb_control.getClientPrebattle()
        if clientPrb is not None:
            clientPrb.onSettingUpdated += self.prb_onSettingUpdated
            clientPrb.onRosterReceived += self.prb_onRosterReceived
            clientPrb.onTeamStatesReceived += self.prb_onTeamStatesReceived
            clientPrb.onPlayerStateChanged += self.prb_onPlayerStateChanged
            clientPrb.onPlayerRosterChanged += self.prb_onPlayerRosterChanged
            clientPrb.onPlayerAdded += self.prb_onPlayerAdded
            clientPrb.onPlayerRemoved += self.prb_onPlayerRemoved
            clientPrb.onKickedFromQueue += self.prb_onKickedFromQueue
            for listener in self._listeners:
                listener.onPrbFunctionalInited()

        else:
            LOG_ERROR('ClientPrebattle is not defined')
        return
Exemple #27
0
 def pe_onPrebattleJoined(self):
     clientPrb = getClientPrebattle()
     if clientPrb:
         prbFunctional = self.getFunctional(CTRL_ENTITY_TYPE.PREBATTLE)
         if prbFunctional:
             if self.__requestCtx and self.__requestCtx.getPrbType(
             ) == prbFunctional.getPrbType():
                 exit = FUNCTIONAL_EXIT.PREBATTLE
             else:
                 exit = FUNCTIONAL_EXIT.NO_FUNC
             prbFunctional.setExit(exit)
         else:
             LOG_ERROR('Prebattle functional is not found')
         self.__factories.createFunctional(
             self, CreateFunctionalCtx(CTRL_ENTITY_TYPE.PREBATTLE))
     else:
         LOG_ERROR('ClientPrebattle is not defined')
         self.__requestCtx.stopProcessing(result=False)
Exemple #28
0
    def init(self, clientPrb = None, ctx = None):
        self._hasEntity = True
        if clientPrb is None:
            clientPrb = prb_control.getClientPrebattle()
        if clientPrb is not None:
            clientPrb.onSettingUpdated += self.prb_onSettingUpdated
            clientPrb.onRosterReceived += self.prb_onRosterReceived
            clientPrb.onTeamStatesReceived += self.prb_onTeamStatesReceived
            clientPrb.onPlayerStateChanged += self.prb_onPlayerStateChanged
            clientPrb.onPlayerRosterChanged += self.prb_onPlayerRosterChanged
            clientPrb.onPlayerAdded += self.prb_onPlayerAdded
            clientPrb.onPlayerRemoved += self.prb_onPlayerRemoved
            clientPrb.onKickedFromQueue += self.prb_onKickedFromQueue
            for listener in self._listeners:
                listener.onPrbFunctionalInited()

        else:
            LOG_ERROR('ClientPrebattle is not defined')
        return FUNCTIONAL_INIT_RESULT.INITED
Exemple #29
0
def createPrbFunctional(dispatcher):
    clientPrb = prb_control.getClientPrebattle()
    if clientPrb is not None:
        if prb_control.isPrebattleSettingsReceived(prebattle=clientPrb):
            prbSettings = prb_control.getPrebattleSettings(prebattle=clientPrb)
            prbType = prb_control.getPrebattleType(settings=prbSettings)
            if prbType in _SUPPORTED_PREBATTLE:
                prbFunctional = _SUPPORTED_PREBATTLE[prbType][1](prbSettings)
                for listener in dispatcher._globalListeners:
                    prbFunctional.addListener(listener())

            else:
                LOG_ERROR('Prebattle with given type is not supported', prbType)
                prbFunctional = PrbNotSupportedFunctional(prbSettings)
        else:
            prbFunctional = PrbInitFunctional()
    else:
        prbFunctional = NoPrbFunctional()
    return prbFunctional
Exemple #30
0
def createPrbFunctional(dispatcher):
    clientPrb = prb_control.getClientPrebattle()
    if clientPrb is not None:
        if prb_control.isPrebattleSettingsReceived(prebattle=clientPrb):
            prbSettings = prb_control.getPrebattleSettings(prebattle=clientPrb)
            prbType = prb_control.getPrebattleType(settings=prbSettings)
            if prbType in _SUPPORTED_PREBATTLE:
                prbFunctional = _SUPPORTED_PREBATTLE[prbType][1](prbSettings)
                for listener in dispatcher._globalListeners:
                    prbFunctional.addListener(listener())

            else:
                LOG_ERROR("Prebattle with given type is not supported", prbType)
                prbFunctional = PrbNotSupportedFunctional(prbSettings)
        else:
            prbFunctional = PrbInitFunctional()
    else:
        prbFunctional = NoPrbFunctional()
    return prbFunctional
Exemple #31
0
    def _getPlayersStateStats(self, rosterKey):
        clientPrb = prb_control.getClientPrebattle()
        notReadyCount = 0
        playersCount = 0
        limitMaxCount = 0
        haveInBattle = False
        if clientPrb:
            players = clientPrb.rosters.get(rosterKey, {})
            playersCount = len(players)
            team, assigned = decodeRoster(rosterKey)
            teamLimits = self._settings.getTeamLimits(team)
            limitMaxCount = teamLimits['maxCount'][not assigned]
            for _, accInfo in players.iteritems():
                state = accInfo.get('state', PREBATTLE_ACCOUNT_STATE.UNKNOWN)
                if not state & PREBATTLE_ACCOUNT_STATE.READY:
                    notReadyCount += 1
                    if not haveInBattle and state & PREBATTLE_ACCOUNT_STATE.IN_BATTLE:
                        haveInBattle = True

        return prb_items.PlayersStateStats(notReadyCount, haveInBattle, playersCount, limitMaxCount)
Exemple #32
0
    def _getPlayersStateStats(self, rosterKey):
        clientPrb = prb_control.getClientPrebattle()
        notReadyCount = 0
        playersCount = 0
        limitMaxCount = 0
        haveInBattle = False
        if clientPrb:
            players = clientPrb.rosters.get(rosterKey, {})
            playersCount = len(players)
            team, assigned = decodeRoster(rosterKey)
            teamLimits = self._settings.getTeamLimits(team)
            limitMaxCount = teamLimits['maxCount'][not assigned]
            for _, accInfo in players.iteritems():
                state = accInfo.get('state', PREBATTLE_ACCOUNT_STATE.UNKNOWN)
                if not state & PREBATTLE_ACCOUNT_STATE.READY:
                    notReadyCount += 1
                    if not haveInBattle and state & PREBATTLE_ACCOUNT_STATE.IN_BATTLE:
                        haveInBattle = True

        return prb_items.PlayersStateStats(notReadyCount, haveInBattle, playersCount, limitMaxCount)
Exemple #33
0
 def create(self, ctx, callback=None):
     if not isinstance(ctx, prb_ctx.TrainingSettingsCtx):
         LOG_ERROR('Invalid context to create training', ctx)
         if callback:
             callback(False)
     elif prb_cooldown.validatePrbCreationCooldown():
         if callback:
             callback(False)
     elif getClientPrebattle() is None or ctx.isForced():
         ctx.startProcessing(callback=callback)
         BigWorld.player().prb_createTraining(ctx.getArenaTypeID(),
                                              ctx.getRoundLen(),
                                              ctx.isOpened(),
                                              ctx.getComment())
         prb_cooldown.setPrbCreationCooldown()
     else:
         LOG_ERROR(
             'First, player has to confirm exit from the current prebattle',
             getPrebattleType())
         if callback:
             callback(False)
    def createFunctional(self, dispatcher, ctx):
        clientPrb = prb_control.getClientPrebattle()
        if clientPrb is not None:
            if prb_control.isPrebattleSettingsReceived(prebattle=clientPrb):
                prbSettings = prb_control.getPrebattleSettings(
                    prebattle=clientPrb)
                prbType = prb_control.getPrebattleType(settings=prbSettings)
                clazz = None
                if prbType in _SUPPORTED_FUNCTIONAL:
                    clazz = _SUPPORTED_FUNCTIONAL[prbType]
                if clazz:
                    prbFunctional = clazz(prbSettings)
                    for listener in dispatcher._globalListeners:
                        prbFunctional.addListener(listener())

                    createParams = ctx.getCreateParams()
                    if 'settings' in createParams and isStatefulFunctional(
                            prbFunctional):
                        guiSettings = createParams['settings']
                        if guiSettings:
                            prbFunctional.applyStates(
                                guiSettings.get(CTRL_ENTITY_TYPE.PREBATTLE))
                else:
                    LOG_ERROR('Prebattle with given type is not supported',
                              prbType)
                    prbFunctional = PrbNotSupportedFunctional(prbSettings)
            else:
                prbFunctional = PrbInitFunctional()
        else:
            prbType = ctx.getPrbType()
            clazz = None
            if prbType in _SUPPORTED_INTRO:
                clazz = _SUPPORTED_INTRO[prbType]
            if clazz is None:
                clazz = NoPrbFunctional
            prbFunctional = clazz()
        return prbFunctional