| 28 | |
| 29 | |
| 30 | class FitDamageEnvelopeGraph(FitGraph): |
| 31 | # UI stuff |
| 32 | internalName = 'dmgEnvelopeGraph' |
| 33 | name = _t('Damage Projection') |
| 34 | xDefs = [XDef(handle='distance', unit='km', label=_t('Distance'), mainInput=('distance', 'km'))] |
| 35 | inputs = [ |
| 36 | Input(handle='distance', unit='km', label=_t('Distance'), iconID=1391, defaultValue=None, defaultRange=(0, 100), |
| 37 | mainTooltip=_t('Distance between the attacker and the target, as seen in overview (surface-to-surface)'), |
| 38 | secondaryTooltip=_t( |
| 39 | 'Distance between the attacker and the target, as seen in overview (surface-to-surface)')), |
| 40 | Input(handle='tgtSpeed', unit='%', label=_t('Target speed'), iconID=1389, defaultValue=100, |
| 41 | defaultRange=(0, 100)), |
| 42 | Input(handle='tgtSigRad', unit='%', label=_t('Target signature'), iconID=1390, defaultValue=100, |
| 43 | defaultRange=(100, 200), conditions=[(('tgtSigRad', 'm'), None), (('tgtSigRad', '%'), None)])] |
| 44 | srcVectorDef = VectorDef(lengthHandle='atkSpeed', lengthUnit='%', angleHandle='atkAngle', angleUnit='degrees', |
| 45 | label=_t('Attacker')) |
| 46 | tgtVectorDef = VectorDef(lengthHandle='tgtSpeed', lengthUnit='%', angleHandle='tgtAngle', angleUnit='degrees', |
| 47 | label=_t('Target')) |
| 48 | hasTargets = True |
| 49 | srcExtraCols = ('Dps', 'Speed', 'Radius') |
| 50 | |
| 51 | @property |
| 52 | def yDefs(self): |
| 53 | ignoreResists = GraphSettings.getInstance().get('ignoreResists') |
| 54 | return [YDef(handle='dps', unit=None, label=_t('Best DPS') if ignoreResists else _t('Best effective DPS'))] |
| 55 | |
| 56 | @property |
| 57 | def tgtExtraCols(self): |
| 58 | cols = [] |
| 59 | if not GraphSettings.getInstance().get('ignoreResists'): |
| 60 | cols.append('Target Resists') |
| 61 | cols.extend(('Speed', 'SigRadius', 'Radius', 'FullHP')) |
| 62 | return cols |
| 63 | |
| 64 | # Calculation stuff |
| 65 | _normalizers = {('distance', 'km'): lambda v, src, tgt: None if v is None else v * 1000, |
| 66 | ('atkSpeed', '%'): lambda v, src, tgt: v / 100 * src.getMaxVelocity(), |
| 67 | ('tgtSpeed', '%'): lambda v, src, tgt: v / 100 * tgt.getMaxVelocity(), |
| 68 | ('tgtSigRad', '%'): lambda v, src, tgt: v / 100 * tgt.getSigRadius()} |
| 69 | _getters = {('distance', 'dps'): Distance2EnvelopeDpsGetter} |
| 70 | _denormalizers = {('distance', 'km'): lambda v, src, tgt: None if v is None else v / 1000, |
| 71 | ('tgtSpeed', '%'): lambda v, src, tgt: v * 100 / tgt.getMaxVelocity(), |
| 72 | ('tgtSigRad', '%'): lambda v, src, tgt: v * 100 / tgt.getSigRadius()} |
nothing calls this directly
no test coverage detected