class PowerupManager: #Max number of each powerup MAX_COUNT = 2 POWERUP_RESET_TIME = 10 def __init__(self, main, actor): self.actor = actor self.powerupViews = {} self.takenPowers = [] self.activePowers = [] self.main = main self.cManager = main.cManager self.Audio = Audio(self) powerupTypes = PowerupTypes() self.powerupPositions = PowerupPositions().positions pwrKey = 1 instanceCount = 0 for posKey in self.powerupPositions.keys(): if instanceCount >= PowerupManager.MAX_COUNT: instanceCount = 0 pwrKey += 1 posValue = self.powerupPositions[posKey] pwrVal = powerupTypes.list[pwrKey] posValue["item"] = pwrVal self.powerupPositions[posKey] = posValue powerUpView = PowerupIcon(self.main, posValue) self.powerupViews[posKey] = powerUpView if posKey not in self.activePowers: self.activePowers.append(posKey) instanceCount += 1 #print "posValue", posValue def createPowerup(self, powerupInfo): if (powerupInfo['item']['name'] == "SHIELD"): return ShieldPowerup(self, powerupInfo) elif(powerupInfo['item']['name'] == "BOOST"): return BoostPowerup(self, powerupInfo) elif(powerupInfo['item']['name'] == "INVINCIBLE"): return InvinciblePowerup(self, powerupInfo) elif(powerupInfo['item']['name'] == "HEALTH"): return HealthPowerup(self, powerupInfo) def setActors(self, actors): self.actors = actors def checkPowerPickup(self, task): powerObtain = self.powerPickup(self.main.vehicleContainer, self.main.vehicleContainer.chassisNP.getPos(), 1)#actor.actorRadius) # if powerObtain != 0: # self.handlePowerups(powerObtain) return task.cont def obtainPowerups(self, powerObtain): #print self.powerupPositions[powerObtain]['item']['name'] if self.powerupPositions[powerObtain]['item']['name'] == "SHIELD": self.actor.props.armor += self.powerupPositions[powerObtain]['item']['rating'] #print "New Armor: ", self.actor.props.armor if self.actor.props.armor > self.actor.props.constants.MAX_ARMOR[self.actor.props.type]: self.actor.props.armor = self.actor.props.constants.MAX_ARMOR[self.actor.props.type] self.main.cManager.sendRequest(Constants.CMSG_HEALTH, self.actor.props.getHitPoint()) if self.powerupPositions[powerObtain]['item']['name'] == "HEALTH": self.actor.props.health += self.powerupPositions[powerObtain]['item']['rating'] #print "New Health: ", self.actor.props.health if self.actor.props.health > self.actor.props.constants.MAX_HEALTH[self.actor.props.type]: self.actor.props.health = self.actor.props.constants.MAX_HEALTH[self.actor.props.type] self.main.cManager.sendRequest(Constants.CMSG_HEALTH, self.actor.props.getHitPoint()) if self.powerupPositions[powerObtain]['item']['name'] == "BOOST": if self.actor.boostCount < 3: self.actor.boostCount += 1 if self.powerupPositions[powerObtain]['item']['name'] == "INVINCIBLE": #print "INVINCIBLE" self.actor.props.isInvincible = True killInvinsibility = threading.Thread(target=self.resetInvinsibility, args=(powerObtain,)) killInvinsibility.start() def powerPickup(self, actor, actorPos, actorRadius): powerObtained = 0 for posKey in self.powerupPositions.keys(): powerUp = self.powerupPositions[posKey] if (math.pow((actorPos.x - powerUp['x']), 2) + math.pow((actorPos.y - powerUp['y']), 2) + math.pow((actorPos.z - powerUp['z']), 2) <= math.pow(actorRadius, 2)): powerObtained = powerUp['id'] if powerObtained in self.activePowers: self.activePowers.remove(powerObtained) if powerObtained not in self.takenPowers: self.takenPowers.append(powerObtained) self.cManager.sendRequest(Constants.CMSG_POWER_UP, powerUp['id']) self.Audio.play_powerup() # print "powerObtained: ", powerObtained self.resetPowerupsTask(powerObtained) break return powerObtained def resetPowerupsTask(self, powerupId, pickup=False): processThread = threading.Thread(target=self.resetPowerup, args=(powerupId,)) #Remove powerup from available list and add to taken list if powerupId in self.activePowers: self.activePowers.remove(powerupId) if powerupId not in self.takenPowers: self.takenPowers.append(powerupId) powerView = self.powerupViews[powerupId] powerView.removeFromField() processThread.start() if pickup: self.obtainPowerups(powerupId) def resetPowerup(self, powerupId): time.sleep(PowerupManager.POWERUP_RESET_TIME) #print self.takenPowers.get(powerupId) if powerupId not in self.activePowers: self.activePowers.append(powerupId) if powerupId in self.takenPowers: self.takenPowers.remove(powerupId) powerView = self.powerupViews[powerupId] powerView.returnToField() #print self.activePowers #print self.takenPowers def resetInvinsibility(self, powerupId): time.sleep(self.powerupPositions[powerupId]['item']['time']) self.actor.props.isInvincible = False