예제 #1
0
    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