util.py (3966B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\characterskills\util.py 2 import collections 3 import math 4 import characterskills 5 from dogma.const import attributeSkillTimeConstant 6 from inventorycommon.const import categorySkill, groupFakeSkills 7 DIVCONSTANT = math.log(2) * 2.5 8 9 def GetLevelProgress(skillPoints, skillTimeConstant): 10 level = GetSkillLevelRaw(skillPoints, skillTimeConstant) 11 if level >= characterskills.MAX_SKILL_LEVEL: 12 return 0.0 13 baseLevelPoints = GetSPForLevelRaw(skillTimeConstant, level) 14 nextLevelPoints = GetSPForLevelRaw(skillTimeConstant, level + 1) 15 return (skillPoints - baseLevelPoints) / float(nextLevelPoints - baseLevelPoints) 16 17 18 def GetSkillLevelRaw(skillPoints, skillTimeConstant): 19 baseSkillLevelConstant = float(skillTimeConstant) * characterskills.SKILL_POINT_MULTIPLIER 20 if baseSkillLevelConstant > skillPoints or baseSkillLevelConstant == 0: 21 return 0 22 level = 1 + int(math.log(skillPoints / baseSkillLevelConstant) / DIVCONSTANT) 23 return min(level, characterskills.MAX_SKILL_LEVEL) 24 25 26 def GetSkillPointsPerMinute(primaryAttributeValue, secondaryAttributeValue): 27 return primaryAttributeValue + secondaryAttributeValue / 2.0 28 29 30 def GetSPForAllLevels(skillTimeConstant): 31 levelList = [] 32 for i in range(characterskills.MAX_SKILL_LEVEL + 1): 33 levelList.append(GetSPForLevelRaw(skillTimeConstant, i)) 34 35 return levelList 36 37 38 def GetSPForLevelRaw(skillTimeConstant, level): 39 if level <= 0: 40 return 0 41 if level > characterskills.MAX_SKILL_LEVEL: 42 level = characterskills.MAX_SKILL_LEVEL 43 preMultipliedSkillPoints = float(skillTimeConstant) * characterskills.SKILL_POINT_MULTIPLIER 44 return int(math.ceil(preMultipliedSkillPoints * 2 ** (2.5 * (level - 1)))) 45 46 47 def GetAllSkillGroups(): 48 import evetypes 49 all_groups = evetypes.GetGroupIDsByCategory(categorySkill) 50 if groupFakeSkills in all_groups: 51 all_groups.remove(groupFakeSkills) 52 return all_groups 53 54 55 def GetSkillTimeConstant(typeID): 56 import dogma.data as dogma_data 57 return dogma_data.get_type_attribute(typeID, attributeSkillTimeConstant) 58 59 60 def GetProgressRatioForSkillLevels(requiredSkills): 61 spTotal = GetTotalSkillPoints(requiredSkills) 62 if not spTotal: 63 return 0 64 else: 65 spTrained = GetTrainedSkillPoints(requiredSkills) 66 return float(spTrained) / spTotal 67 68 69 def GetTotalSkillPoints(requiredSkills): 70 return sum((GetSPForLevelRaw(GetSkillTimeConstant(typeID), level) for typeID, level in requiredSkills.iteritems())) 71 72 73 def GetTrainedSkillPoints(requiredSkills): 74 spTrained = 0 75 for typeID, level in requiredSkills.iteritems(): 76 spRequiredForLevel = GetSPForLevelRaw(GetSkillTimeConstant(typeID), level) 77 spTrained += min(spRequiredForLevel, sm.GetService('skillqueue').GetEstimatedSkillPointsTrained(typeID)) 78 79 return spTrained 80 81 82 def GetInTrainingSkillPoints(requiredSkills): 83 inQueueSkills = sm.GetService('skillqueue').GetSkillLevelsInQueue() 84 sp = 0 85 for typeID, level in requiredSkills.iteritems(): 86 if typeID not in inQueueSkills: 87 continue 88 level = min(level, inQueueSkills[typeID]) 89 spRequiredForLevel = GetSPForLevelRaw(GetSkillTimeConstant(typeID), level) 90 trained = min(spRequiredForLevel, sm.GetService('skillqueue').GetEstimatedSkillPointsTrained(typeID)) 91 sp += spRequiredForLevel - trained 92 93 return sp 94 95 96 def GetInTrainingRatioForSkillLevels(requiredSkills): 97 spTotal = GetTotalSkillPoints(requiredSkills) 98 if not spTotal: 99 return 0 100 else: 101 spInTraining = GetInTrainingSkillPoints(requiredSkills) 102 return float(spInTraining) / spTotal 103 104 105 def GetSkillRequirementsDictFromSkillLevels(skillLevels): 106 requiredSkills = collections.defaultdict(int) 107 for typeID, level in skillLevels: 108 requiredSkills[typeID] = max(level, requiredSkills[typeID]) 109 110 return requiredSkills