| 27 | |
| 28 | |
| 29 | class TimeCache(FitDataCache): |
| 30 | |
| 31 | # Whole data getters |
| 32 | def getDpsData(self, src): |
| 33 | """Return DPS data in {time: {key: dps}} format.""" |
| 34 | return self._data[src.item.ID]['finalDps'] |
| 35 | |
| 36 | def getVolleyData(self, src): |
| 37 | """Return volley data in {time: {key: volley}} format.""" |
| 38 | return self._data[src.item.ID]['finalVolley'] |
| 39 | |
| 40 | def getDmgData(self, src): |
| 41 | """Return inflicted damage data in {time: {key: damage}} format.""" |
| 42 | return self._data[src.item.ID]['finalDmg'] |
| 43 | |
| 44 | # Specific data point getters |
| 45 | def getDpsDataPoint(self, src, time): |
| 46 | """Get DPS data by specified time in {key: dps} format.""" |
| 47 | return self._getDataPoint(src=src, time=time, dataFunc=self.getDpsData) |
| 48 | |
| 49 | def getVolleyDataPoint(self, src, time): |
| 50 | """Get volley data by specified time in {key: volley} format.""" |
| 51 | return self._getDataPoint(src=src, time=time, dataFunc=self.getVolleyData) |
| 52 | |
| 53 | def getDmgDataPoint(self, src, time): |
| 54 | """Get inflicted damage data by specified time in {key: dmg} format.""" |
| 55 | return self._getDataPoint(src=src, time=time, dataFunc=self.getDmgData) |
| 56 | |
| 57 | # Preparation functions |
| 58 | def prepareDpsData(self, src, maxTime): |
| 59 | self._prepareDpsVolleyData(src=src, maxTime=maxTime) |
| 60 | |
| 61 | def prepareVolleyData(self, src, maxTime): |
| 62 | self._prepareDpsVolleyData(src=src, maxTime=maxTime) |
| 63 | |
| 64 | def prepareDmgData(self, src, maxTime): |
| 65 | # Time is none means that time parameter has to be ignored, |
| 66 | # we do not need cache for that |
| 67 | if maxTime is None: |
| 68 | return |
| 69 | self._generateInternalForm(src=src, maxTime=maxTime) |
| 70 | fitCache = self._data[src.item.ID] |
| 71 | # Final cache has been generated already, don't do anything |
| 72 | if 'finalDmg' in fitCache: |
| 73 | return |
| 74 | intCache = fitCache['internalDmg'] |
| 75 | changesByTime = {} |
| 76 | for key, dmgMap in intCache.items(): |
| 77 | for time in dmgMap: |
| 78 | changesByTime.setdefault(time, []).append(key) |
| 79 | # Here we convert cache to following format: |
| 80 | # {time: {key: damage done by key at this time}} |
| 81 | finalCache = fitCache['finalDmg'] = {} |
| 82 | timeDmgData = {} |
| 83 | for time in sorted(changesByTime): |
| 84 | timeDmgData = copy(timeDmgData) |
| 85 | for key in changesByTime[time]: |
| 86 | keyDmg = intCache[key][time] |