def setFromAvatar(self, av): rewardIds = [] for q in av.quests: questId, fromNpcId, toNpcId, rewardId, toonProgress = q if rewardId == Quests.NA: rewardId = Quests.getFinalRewardId(questId, fAll=1) rewardIds.append(rewardId) self.notify.debug('Ignoring rewards: %s' % rewardIds) self.setRewardIndex(av.rewardTier, rewardIds, av.rewardHistory) fishHp = int(len(av.fishCollection) / FishGlobals.FISH_PER_BONUS) self.notify.debug('Adding %s hp for fish collection' % fishHp) self.maxHp += fishHp flowerHp = int(len(av.flowerCollection) / GardenGlobals.FLOWERS_PER_BONUS) self.notify.debug('Adding %s hp for fish collection' % flowerHp) self.maxHp += flowerHp HQdepts = (ToontownGlobals.cogHQZoneId2deptIndex(ToontownGlobals.SellbotHQ), ToontownGlobals.cogHQZoneId2deptIndex(ToontownGlobals.LawbotHQ), ToontownGlobals.cogHQZoneId2deptIndex(ToontownGlobals.CashbotHQ)) levels = av.getCogLevels() cogTypes = av.getCogTypes() suitHp = 0 for dept in HQdepts: suitHp += levels[dept] self.notify.debug('Adding %s hp for cog suits' % suitHp) self.maxHp += suitHp kartingHp = int(av.kartingTrophies.count(1) / RaceGlobals.TrophiesPerCup) self.notify.debug('Adding %s hp for karting trophies' % kartingHp) self.maxHp += kartingHp golfHp = int(av.golfTrophies.count(True) / GolfGlobals.TrophiesPerCup) self.notify.debug('Adding %s hp for golf trophies' % golfHp) self.maxHp += golfHp
def requestEnter(self): avatarID = self.air.getAvatarIdFromSender() assert(self.notify.debug("requestEnter: avatarID:%s" % avatarID)) # Ext cog hq doors require all cog disguise parts # does the toon have a complete cog disguise? dept = ToontownGlobals.cogHQZoneId2deptIndex(self.destinationZone) av = self.air.doId2do.get(avatarID) if av: if self.doorType == DoorTypes.EXT_COGHQ and self.isLockedDoor(): parts = av.getCogParts() if CogDisguiseGlobals.isSuitComplete(parts, dept): allowed = 1 else: allowed = 0 # Interior doors allow all else: allowed = 1 # Check that player has full access if not ToontownAccessAI.canAccess(avatarID, self.zoneId): allowed = 0 # Now send a message back - either reject or accept if not allowed: self.sendReject(avatarID, self.isLockedDoor()) else: self.enqueueAvatarIdEnter(avatarID) self.sendUpdateToAvatarId(avatarID, "setOtherZoneIdAndDoId", [self.destinationZone, self.otherDoor.getDoId()])
def handleToonsWon(self, toons): extraMerits = [0, 0, 0, 0] amount = ToontownGlobals.StageNoticeRewards[self.level.stageId] index = ToontownGlobals.cogHQZoneId2deptIndex(self.level.stageId) extraMerits[index] = amount for toon in toons: recovered, notRecovered = self.air.questManager.recoverItems( toon, self.suitsKilled, self.getTaskZoneId()) self.toonItems[toon.doId][0].extend(recovered) self.toonItems[toon.doId][1].extend(notRecovered) meritArray = self.air.promotionMgr.recoverMerits( toon, self.suitsKilled, self.getTaskZoneId(), getStageCreditMultiplier(self.level.getFloorNum()), extraMerits=extraMerits) if toon.doId in self.helpfulToons: self.toonMerits[toon.doId] = addListsByValue( self.toonMerits[toon.doId], meritArray) else: self.notify.debug('toon %d not helpful list, skipping merits' % toon.doId) if self.bossBattle: self.toonParts[toon.doId] = self.air.cogSuitMgr.recoverPart( toon, 'fullSuit', self.suitTrack, self.getTaskZoneId(), toons) self.notify.debug('toonParts = %s' % self.toonParts)
def checkBoard(self, av): dept = ToontownGlobals.cogHQZoneId2deptIndex(self.zone) if av.hp < self.minLaff: return REJECT_MINLAFF if not av.readyForPromotion(dept): return REJECT_PROMOTION return 0
def handleToonsWon(self, toons): extraMerits = [0, 0, 0, 0] amount = ToontownGlobals.StageNoticeRewards[self.level.stageId] index = ToontownGlobals.cogHQZoneId2deptIndex(self.level.stageId) extraMerits[index] = amount for toon in toons: mult = 1.0 meritArray = self.air.promotionMgr.recoverMerits(toon, [], self.getTaskZoneId(), mult, extraMerits=extraMerits) if toon.doId in self.helpfulToons: self.toonMerits[toon.doId] = addListsByValue(self.toonMerits[toon.doId], meritArray) else: self.notify.debug('toon %d not helpful list, skipping merits' % toon.doId) for floorNum, cogsThisFloor in enumerate(self.suitsKilledPerFloor): self.notify.info('merits for floor %s' % floorNum) for toon in toons: recovered, notRecovered = self.air.questManager.recoverItems(toon, cogsThisFloor, self.getTaskZoneId()) self.toonItems[toon.doId][0].extend(recovered) self.toonItems[toon.doId][1].extend(notRecovered) meritArray = self.air.promotionMgr.recoverMerits(toon, cogsThisFloor, self.getTaskZoneId(), getStageCreditMultiplier(floorNum)) self.notify.info('toon %s: %s' % (toon.doId, meritArray)) if toon.doId in self.helpfulToons: self.toonMerits[toon.doId] = addListsByValue(self.toonMerits[toon.doId], meritArray) else: self.notify.debug('toon %d not helpful list, skipping merits' % toon.doId)
def handleToonsWon(self, toons): # toons just beat the boss extraMerits = [0, 0, 0, 0] amount = ToontownGlobals.MintCogBuckRewards[self.level.mintId] index = ToontownGlobals.cogHQZoneId2deptIndex(self.level.mintId) extraMerits[index] = amount for toon in toons: # Append the recovered and not recovered items to their respective lists recovered, notRecovered = self.air.questManager.recoverItems( toon, self.suitsKilled, self.getTaskZoneId()) self.toonItems[toon.doId][0].extend(recovered) self.toonItems[toon.doId][1].extend(notRecovered) # the new merit list must be added by value to the cumulative list meritArray = self.air.promotionMgr.recoverMerits( toon, self.suitsKilled, self.getTaskZoneId(), getMintCreditMultiplier(self.getTaskZoneId()), extraMerits=extraMerits) if toon.doId in self.helpfulToons: self.toonMerits[toon.doId] = addListsByValue( self.toonMerits[toon.doId], meritArray) else: self.notify.debug("toon %d not helpful list, skipping merits" % toon.doId)
def __init__(self, air, bldg, mintId, antiShuffle=0, minLaff=0): DistributedElevatorExtAI.DistributedElevatorExtAI.__init__( self, air, bldg, antiShuffle=antiShuffle, minLaff=minLaff) self.mintId = mintId self.cogDept = ToontownGlobals.cogHQZoneId2deptIndex(self.mintId) self.type = ELEVATOR_MINT self.countdownTime = ElevatorData[self.type]['countdown']
def requestExit(self): assert(self.debugPrint("requestExit()")) avatarID = self.air.getAvatarIdFromSender() assert(self.notify.debug(" avatarID:%s" % (str(avatarID),))) if self.avatarsWhoAreEntering.has_key(avatarID): del self.avatarsWhoAreEntering[avatarID] if not self.avatarsWhoAreExiting.has_key(avatarID): dept = ToontownGlobals.cogHQZoneId2deptIndex(self.destinationZone) self.avatarsWhoAreExiting[avatarID]=1 self.sendUpdate("avatarExit", [avatarID]) self.openDoor(self.exitDoorFSM) # currently, there are no coghq doors that are unlocked and still # put us our cog suit. Therefore, if we're not locked, we # don't need to update the suit. # We use .lockedDoor instead of .isDoorLocked() because we don't # want to check the 'no-locked-doors' flag if self.lockedDoor: av = self.air.doId2do[avatarID] if self.doorType == DoorTypes.EXT_COGHQ: av.b_setCogIndex(-1) else: av.b_setCogIndex(dept) else: assert(self.notify.debug(str(avatarID) +" requested an exit, and they're already exiting"))
def handleToonsWon(self, toons): extraMerits = [0, 0, 0, 0] amount = ToontownGlobals.StageNoticeRewards[self.level.stageId] index = ToontownGlobals.cogHQZoneId2deptIndex(self.level.stageId) extraMerits[index] = amount for toon in toons: mult = 1.0 meritArray = self.air.promotionMgr.recoverMerits( toon, [], self.getTaskZoneId(), mult, extraMerits=extraMerits) if toon.doId in self.helpfulToons: self.toonMerits[toon.doId] = addListsByValue( self.toonMerits[toon.doId], meritArray) continue self.notify.debug('toon %d not helpful list, skipping merits' % toon.doId) for (floorNum, cogsThisFloor) in enumerate(self.suitsKilledPerFloor): self.notify.info('merits for floor %s' % floorNum) for toon in toons: (recovered, notRecovered) = self.air.questManager.recoverItems( toon, cogsThisFloor, self.getTaskZoneId()) self.toonItems[toon.doId][0].extend(recovered) self.toonItems[toon.doId][1].extend(notRecovered) meritArray = self.air.promotionMgr.recoverMerits( toon, cogsThisFloor, self.getTaskZoneId(), getStageCreditMultiplier(floorNum)) self.notify.info('toon %s: %s' % (toon.doId, meritArray)) if toon.doId in self.helpfulToons: self.toonMerits[toon.doId] = addListsByValue( self.toonMerits[toon.doId], meritArray) continue self.notify.debug('toon %d not helpful list, skipping merits' % toon.doId)
def __init__(self, air, bldg, mintId, antiShuffle=0, minLaff=0): DistributedElevatorExtAI.DistributedElevatorExtAI.__init__( self, air, bldg, antiShuffle=antiShuffle, minLaff=minLaff ) self.mintId = mintId self.cogDept = ToontownGlobals.cogHQZoneId2deptIndex(self.mintId) self.type = ELEVATOR_MINT self.countdownTime = ElevatorData[self.type]["countdown"]
def setFromAvatar(self, av): rewardIds = [] for q in av.quests: (questId, fromNpcId, toNpcId, rewardId, toonProgress) = q if rewardId == Quests.NA: rewardId = Quests.getFinalRewardId(questId, fAll=1) rewardIds.append(rewardId) self.notify.debug('Ignoring rewards: %s' % rewardIds) self.setRewardIndex(av.rewardTier, rewardIds, av.rewardHistory) fishHp = int(len(av.fishCollection) / FishGlobals.FISH_PER_BONUS) self.notify.debug('Adding %s hp for fish collection' % fishHp) self.maxHp += fishHp flowerHp = int( len(av.flowerCollection) / GardenGlobals.FLOWERS_PER_BONUS) self.notify.debug('Adding %s hp for fish collection' % flowerHp) self.maxHp += flowerHp HQdepts = (ToontownGlobals.cogHQZoneId2deptIndex( ToontownGlobals.SellbotHQ), ToontownGlobals.cogHQZoneId2deptIndex( ToontownGlobals.LawbotHQ), ToontownGlobals.cogHQZoneId2deptIndex( ToontownGlobals.CashbotHQ)) levels = av.getCogLevels() cogTypes = av.getCogTypes() suitHp = 0 for dept in HQdepts: level = levels[dept] type = cogTypes[dept] if type >= SuitDNA.suitsPerDept - 1: for milestoneLevel in ToontownGlobals.CogSuitHPLevels: if level >= milestoneLevel: suitHp += 1 continue break self.notify.debug('Adding %s hp for cog suits' % suitHp) self.maxHp += suitHp kartingHp = int( av.kartingTrophies.count(1) / RaceGlobals.TrophiesPerCup) self.notify.debug('Adding %s hp for karting trophies' % kartingHp) self.maxHp += kartingHp golfHp = int(av.golfTrophies.count(True) / GolfGlobals.TrophiesPerCup) self.notify.debug('Adding %s hp for golf trophies' % golfHp) self.maxHp += golfHp
def initToonState(self): self.setAnimState('neutral', 0.9, None, None) self.putOnSuit(ToontownGlobals.cogHQZoneId2deptIndex(self.zoneId), rental=True) if self.name in NPCToons.LaffRestockPositions: pos = NPCToons.LaffRestockPositions[self.name] self.setPos(*pos[0]) self.setH(pos[1])
def handleToonsWon(self, toons): extraMerits = [0, 0, 0, 0] amount = ToontownGlobals.MintCogBuckRewards[self.level.mintId] index = ToontownGlobals.cogHQZoneId2deptIndex(self.level.mintId) extraMerits[index] = amount '''for toon in toons:
def checkBoard(self, av): dept = ToontownGlobals.cogHQZoneId2deptIndex(self.zone) boardingResult = 0 if av.hp < self.minLaff: boardingResult = REJECT_MINLAFF if not av.readyForPromotion(dept): boardingResult = REJECT_PROMOTION if ToontownGlobals.Holidays.SellbotNerfHoliday in self.air.holidayManager.currentHolidays: boardingResult = 0 return boardingResult
def handleToonsWon(self, toons): extraMerits = [0, 0, 0, 0] amount = ToontownGlobals.CountryClubCogBuckRewards[self.level.countryClubId] index = ToontownGlobals.cogHQZoneId2deptIndex(self.level.countryClubId) extraMerits[index] = amount for toon in toons: recovered, notRecovered = self.air.questManager.recoverItems(toon, self.suitsKilled, self.getTaskZoneId()) self.toonItems[toon.doId][0].extend(recovered) self.toonItems[toon.doId][1].extend(notRecovered) meritArray = self.air.promotionMgr.recoverMerits(toon, self.suitsKilled, self.getTaskZoneId(), getCountryClubCreditMultiplier(self.getTaskZoneId()), extraMerits=extraMerits) if toon.doId in self.helpfulToons: self.toonMerits[toon.doId] = addListsByValue(self.toonMerits[toon.doId], meritArray) else: self.notify.debug('toon %d not helpful list, skipping merits' % toon.doId)
def handleToonsWon(self, toons): extraMerits = [0, 0, 0, 0] amount = ToontownGlobals.MintCogBuckRewards[self.level.mintId] index = ToontownGlobals.cogHQZoneId2deptIndex(self.level.mintId) extraMerits[index] = amount for toon in toons: recovered, notRecovered = self.air.questManager.recoverItems(toon, self.suitsKilled, self.getTaskZoneId()) self.toonItems[toon.doId][0].extend(recovered) self.toonItems[toon.doId][1].extend(notRecovered) meritArray = self.air.promotionMgr.recoverMerits(toon, self.suitsKilled, self.getTaskZoneId(), getMintCreditMultiplier(self.getTaskZoneId()), extraMerits=extraMerits) if toon.doId in self.helpfulToons: self.toonMerits[toon.doId] = addListsByValue(self.toonMerits[toon.doId], meritArray) else: self.notify.debug('toon %d not helpful list, skipping merits' % toon.doId)
def requestExit(self): avatarID = self.air.getAvatarIdFromSender() if self.avatarsWhoAreEntering.has_key(avatarID): del self.avatarsWhoAreEntering[avatarID] if not self.avatarsWhoAreExiting.has_key(avatarID): dept = ToontownGlobals.cogHQZoneId2deptIndex(self.destinationZone) self.avatarsWhoAreExiting[avatarID] = 1 self.sendUpdate('avatarExit', [avatarID]) self.openDoor(self.exitDoorFSM) if self.lockedDoor: av = self.air.doId2do[avatarID] if self.doorType == DoorTypes.EXT_COGHQ: av.b_setCogIndex(-1) else: av.b_setCogIndex(dept)
def requestEnter(self): avId = self.air.getAvatarIdFromSender() dept = ToontownGlobals.cogHQZoneId2deptIndex(self.destinationZone) av = self.air.doId2do.get(avId) if av: if self.doorType == DoorTypes.EXT_COGHQ and self.isLockedDoor(): parts = av.getCogParts() if CogDisguiseGlobals.isSuitComplete(parts, dept): allowed = 1 else: allowed = 0 else: allowed = 1 if not allowed: self.sendReject(avId, self.isLockedDoor()) else: self.enter(avId)
def requestEnter(self): avId = self.air.getAvatarIdFromSender() dept = ToontownGlobals.cogHQZoneId2deptIndex(self.destinationZone) av = self.air.doId2do.get(avId) if av: if self.doorType == DoorTypes.EXT_COGHQ and self.isLockedDoor(): parts = av.getCogParts() if CogDisguiseGlobals.isSuitComplete(parts, dept): allowed = 1 else: allowed = 0 else: allowed = 1 if not allowed: self.sendReject(avId, self.isLockedDoor()) else: print("********\nRequesting Lobby GUI...\n********") self.sendUpdate('selectLobby', [avId])
def requestEnter(self): avatarID = self.air.getAvatarIdFromSender() dept = ToontownGlobals.cogHQZoneId2deptIndex(self.destinationZone) av = self.air.doId2do.get(avatarID) if av: if self.doorType == DoorTypes.EXT_COGHQ and self.isLockedDoor(): parts = av.getCogParts() if CogDisguiseGlobals.isSuitComplete(parts, dept): allowed = 1 else: allowed = 0 else: allowed = 1 if not allowed: self.sendReject(avatarID, self.isLockedDoor()) else: self.enqueueAvatarIdEnter(avatarID) self.sendUpdateToAvatarId(avatarID, 'setOtherZoneIdAndDoId', [self.destinationZone, self.otherDoor.getDoId()])
def handleToonsWon(self, toons): extraMerits = [0, 0, 0, 0] amount = ToontownGlobals.StageNoticeRewards[self.level.stageId] index = ToontownGlobals.cogHQZoneId2deptIndex(self.level.stageId) extraMerits[index] = amount for toon in toons: recovered, notRecovered = self.air.questManager.recoverItems(toon, self.suitsKilled, self.getTaskZoneId()) self.toonItems[toon.doId][0].extend(recovered) self.toonItems[toon.doId][1].extend(notRecovered) meritArray = self.air.promotionMgr.recoverMerits(toon, self.suitsKilled, self.getTaskZoneId(), getStageCreditMultiplier(self.level.getFloorNum()), extraMerits=extraMerits) if toon.doId in self.helpfulToons: self.toonMerits[toon.doId] = addListsByValue(self.toonMerits[toon.doId], meritArray) else: self.notify.debug('toon %d not helpful list, skipping merits' % toon.doId) if self.bossBattle: self.toonParts[toon.doId] = self.air.cogSuitMgr.recoverPart( toon, 'fullSuit', self.suitTrack, self.getTaskZoneId(), toons) self.notify.debug('toonParts = %s' % self.toonParts)
def handleToonsWon(self, toons): # toons just beat the boss extraMerits = [0, 0, 0, 0] amount = ToontownGlobals.StageNoticeRewards[self.level.stageId] index = ToontownGlobals.cogHQZoneId2deptIndex(self.level.stageId) extraMerits[index] = amount # take care of the extra merits first for toon in toons: mult = 1. meritArray = self.air.promotionMgr.recoverMerits( toon, [], self.getTaskZoneId(), mult, extraMerits=extraMerits) if toon.doId in self.helpfulToons: self.toonMerits[toon.doId] = addListsByValue( self.toonMerits[toon.doId], meritArray) else: self.notify.debug("toon %d not helpful list, skipping merits" % toon.doId) for floorNum, cogsThisFloor in enumerate(self.suitsKilledPerFloor): self.notify.info('merits for floor %s' % floorNum) for toon in toons: # Append the recovered and not recovered items to their respective lists recovered, notRecovered = self.air.questManager.recoverItems( toon, cogsThisFloor, self.getTaskZoneId()) self.toonItems[toon.doId][0].extend(recovered) self.toonItems[toon.doId][1].extend(notRecovered) # the new merit list must be added by value to the cumulative list meritArray = self.air.promotionMgr.recoverMerits( toon, cogsThisFloor, self.getTaskZoneId(), getStageCreditMultiplier(floorNum)) self.notify.info('toon %s: %s' % (toon.doId, meritArray)) if toon.doId in self.helpfulToons: self.toonMerits[toon.doId] = addListsByValue( self.toonMerits[toon.doId], meritArray) else: self.notify.debug( "toon %d not helpful list, skipping merits" % toon.doId)
def __getAccessLevel(self, avatarID): av = self.air.doId2do.get(avatarID) allowed = 0 suitType = -1 if av: if self.doorType == DoorTypes.EXT_COGHQ and self.isLockedDoor(): parts = av.getCogParts() dept = ToontownGlobals.cogHQZoneId2deptIndex( self.destinationZone) if CogDisguiseGlobals.isSuitComplete(parts, dept): if av.getCogMerits( )[dept] >= CogDisguiseGlobals.getTotalMerits(av, dept): suitType = CogDisguiseGlobals.suitTypes.FullSuit else: suitType = CogDisguiseGlobals.suitTypes.NoMerits allowed = 1 else: suitType = CogDisguiseGlobals.suitTypes.NoSuit if ToontownGlobals.Holidays.SellbotNerfHoliday in self.air.holidayManager.currentHolidays: allowed = 1 else: allowed = 1 return (allowed, suitType)
def handleToonsWon(self, toons): extraMerits = [0, 0, 0, 0] amount = ToontownGlobals.StageNoticeRewards[self.level.stageId] index = ToontownGlobals.cogHQZoneId2deptIndex(self.level.stageId) extraMerits[index] = amount
def handleToonsWon(self, toons): extraMerits = [0, 0, 0, 0] amount = ToontownGlobals.CountryClubCogBuckRewards[ self.level.countryClubId] index = ToontownGlobals.cogHQZoneId2deptIndex(self.level.countryClubId) extraMerits[index] = amount
def setFromAvatar(self, av): # Set the rewards to indicate what the avatar would have after # applying all rewards up to but not including the current # reward index, and not including any currently active quests. # Get the list of current reward ID's. rewardIds = [] for q in av.quests: questId, fromNpcId, toNpcId, rewardId, toonProgress = q if rewardId == Quests.NA: rewardId = Quests.getFinalRewardId(questId, fAll=1) rewardIds.append(rewardId) self.notify.debug("Ignoring rewards: %s" % (rewardIds)) self.setRewardIndex(av.rewardTier, rewardIds, av.rewardHistory) # add maxHp for fishCollection fishHp = int(len(av.fishCollection) / FishGlobals.FISH_PER_BONUS) self.notify.debug("Adding %s hp for fish collection" % (fishHp)) self.maxHp += fishHp # add maxHp for flowerCollection flowerHp = int( len(av.flowerCollection) / GardenGlobals.FLOWERS_PER_BONUS) self.notify.debug("Adding %s hp for fish collection" % (flowerHp)) self.maxHp += flowerHp # add maxHp for HQ cog suit HQdepts = ( # add depts as the HQs are released ToontownGlobals.cogHQZoneId2deptIndex(ToontownGlobals.SellbotHQ), #ToontownGlobals.cogHQZoneId2deptIndex(ToontownGlobals.BossbotHQ), ToontownGlobals.cogHQZoneId2deptIndex(ToontownGlobals.LawbotHQ), ToontownGlobals.cogHQZoneId2deptIndex(ToontownGlobals.CashbotHQ), ) levels = av.getCogLevels() cogTypes = av.getCogTypes() suitHp = 0 for dept in HQdepts: level = levels[dept] type = cogTypes[dept] if type >= (SuitDNA.suitsPerDept - 1): # add 1 HP for every milestone level they've hit for milestoneLevel in ToontownGlobals.CogSuitHPLevels: if level >= milestoneLevel: suitHp += 1 else: break self.notify.debug("Adding %s hp for cog suits" % (suitHp)) self.maxHp += suitHp # add maxHp for karting trophies kartingHp = int( av.kartingTrophies.count(1) / RaceGlobals.TrophiesPerCup) self.notify.debug("Adding %s hp for karting trophies" % (kartingHp)) self.maxHp += kartingHp # add maxHp for golf trophies golfHp = int(av.golfTrophies.count(True) / GolfGlobals.TrophiesPerCup) self.notify.debug("Adding %s hp for golf trophies" % (golfHp)) self.maxHp += golfHp
def handleToonsWon(self, toons): extraMerits = [0, 0, 0, 0] amount = ToontownGlobals.CountryClubCogBuckRewards[self.level.countryClubId] index = ToontownGlobals.cogHQZoneId2deptIndex(self.level.countryClubId) extraMerits[index] = amount
def __init__(self, air, bldg, mintId): DistributedElevatorExtAI.DistributedElevatorExtAI.__init__(self, air, bldg) self.mintId = mintId self.cogDept = ToontownGlobals.cogHQZoneId2deptIndex(self.mintId) self.type = ELEVATOR_MINT self.countdownTime = ElevatorData[self.type]['countdown']