def update(self, gameStateObj, metaDataObj): # Don't do this if there is no exp change if not self.force_level and self.expNew == 0 or (self.unit.level%CONSTANTS['max_level'] == 0 and metaDataObj['class_dict'][self.unit.klass]['turns_into'] is None): return True # We're done here if self.instantiationTime is None: # First time update is called. self.instantiationTime = pygame.time.get_ticks() SOUNDDICT['Experience Gain'].play(-1) #print self.state.getState() #print self.expSet, self.expOld, self.expNew currentTime = pygame.time.get_ticks() if self.state.getState() == 'exp0': self.expSet = self.expOld + (currentTime - self.instantiationTime)/float(self.EXPTIME/100) # 100 is total exp self.expSet = int(min(self.expNew + self.expOld, self.expSet)) if self.expNew + self.expOld <= self.expSet: SOUNDDICT['Experience Gain'].stop() if self.expSet >= 100: if self.unit.level%CONSTANTS['max_level'] == 0: # If I would promote because I am level 20 SOUNDDICT['Experience Gain'].stop() if metaDataObj['class_dict'][self.unit.klass]['turns_into']: # If has at least one class to turn into self.expSet = 0 class_options = metaDataObj['class_dict'][self.unit.klass]['turns_into'] if len(class_options) > 1: gameStateObj.activeMenu = MenuFunctions.ChoiceMenu(self.unit, class_options, 'auto', gameStateObj) gameStateObj.stateMachine.changeState('levelpromote') elif len(class_options) == 1: self.unit.klass = class_options[0] self.state.changeState('promote') else: return True else: # Unit is at the highest point it can be. No more. self.unit.exp = 99 return True else: self.expSet = 0 self.unit.level += 1 self.levelup_list = self.unit.level_up(metaDataObj['class_dict'][self.unit.klass]) self.state.changeState('exp100') elif currentTime - self.instantiationTime >= self.EXPTIME: SOUNDDICT['Experience Gain'].stop() self.unit.exp += self.expNew return True elif self.state.getState() == 'exp100': # Problem... It is not counting time needed to get to this state. Should minus away that time - Time taken to get to this point in (100 - self.expOld)*float(self.EXPTIME/100) self.expSet = (currentTime - self.instantiationTime - (100 - self.expOld)*float(self.EXPTIME/100))/float(self.EXPTIME/100) self.expSet = int(min(self.expNew + self.expOld - 100, self.expSet)) if self.expNew + self.expOld - 100 <= self.expSet: SOUNDDICT['Experience Gain'].stop() if currentTime - self.instantiationTime >= self.EXPTIME: SOUNDDICT['Experience Gain'].stop() #MUSICTHREAD.pause() SOUNDDICT['Level Up'].play() self.state.changeState('levelUp') elif self.state.getState() == 'levelUp': if currentTime - self.instantiationTime >= self.LEVELANIMATIONTIME + self.EXPTIME: self.state.changeState('levelUpWait') else: time = currentTime - self.instantiationTime - self.EXPTIME marker1 = min(4, int(time/(self.LEVELANIMATIONTIME/5))) marker2 = min(4, int((time%(self.LEVELANIMATIONTIME/5))/(self.LEVELANIMATIONTIME/25))) self.animationMarker = (marker1, marker2) elif self.state.getState() == 'levelUpWait': if currentTime - self.instantiationTime >= self.LEVELANIMATIONTIME + self.WAITTIME + self.EXPTIME: self.state.changeState('levelScreen') #MUSICTHREAD.resume() else: self.animationMarker = (4, 4) # Set to last frame elif self.state.getState() == 'levelScreen': # Am i Done displaying? if currentTime - self.instantiationTime >= self.LEVELUPWAIT + self.get_num_sparks()*self.SPARKTIME + self.LEVELANIMATIONTIME + self.WAITTIME + self.EXPTIME: # Handle EXP when the user levels up self.unit.exp += self.expNew if self.unit.exp >= 100: self.unit.exp = self.expNew - (100 - self.expOld) # Remove animations self.animations = [] # check for skill gain for level_needed, class_skill in metaDataObj['class_dict'][self.unit.klass]['skills']: if self.unit.level%CONSTANTS['max_level'] == level_needed: if class_skill == 'Feat': gameStateObj.cursor.currentSelectedUnit = self.unit gameStateObj.stateMachine.changeState('feat_choice') else: skill = StatusObject.statusparser(class_skill) StatusObject.HandleStatusAddition(skill, self.unit) gameStateObj.banners.append(MenuFunctions.gainedSkillBanner(self.unit, skill)) gameStateObj.stateMachine.changeState('itemgain') return True elif self.state.getState() == 'promote': # Class should already have been changed by now in the levelpromote state # Here's where I change all the important information new_class = metaDataObj['class_dict'][self.unit.klass] self.unit.removeSprites() self.unit.loadSprites() # Reset Level - Don't! self.unit.level += 1 # Actually change class # Reset movement speed self.unit.stats['MOV'].base_stat = new_class['movement'] # Reset movement group self.unit.movement_group = new_class['movement_group'] # Add weapon exp gains from that class. self.unit.increase_wexp(new_class['wexp_gain'], gameStateObj) # Add any extra tags if new_class['tags']: # Add any necessary tags. Does not currently take away tags, although it may have to later self.unit.tags.append(new_class['tags'].split(',')) self.unit.tags = list(set(self.unit.tags)) # Remove duplicates # Give promotion self.levelup_list = self.unit.level_up(new_class, apply_level=False) # Level up once, then promote. self.levelup_list = [x + y for x, y in zip(self.levelup_list, new_class['promotion'])] # Add lists together current_stats = [self.unit.stats['HP'], self.unit.stats['STR'], self.unit.stats['MAG'], self.unit.stats['SKL'], self.unit.stats['SPD'], self.unit.stats['LCK'], self.unit.stats['DEF'], self.unit.stats['RES'], self.unit.stats['CON']] assert len(self.levelup_list) == len(new_class['max']) == len(current_stats), "%s %s %s"%(self.levelup_list, new_class['max'], current_stats) for index, stat in enumerate(self.levelup_list): self.levelup_list[index] = min(stat, new_class['max'][index] - current_stats[index]) self.unit.apply_levelup(self.levelup_list) self.state.changeState('levelScreen') self.instantiationTime = currentTime # Reset time so that it doesn't skip right over LevelScreen return False