@@ -61,56 +61,101 @@ def __init__(self, em, thermal, kinetic, explosive):
6161 self ._kinetic = kinetic
6262 self ._explosive = explosive
6363 self ._breachers = defaultdict (lambda : [])
64- self .profile = None
65-
66- def add_breacher (self , key , data ):
67- self ._breachers [key ].append (data )
64+ self .__profile = None
65+ # Cached data
66+ self .__cached_em = None
67+ self .__cached_thermal = None
68+ self .__cached_kinetic = None
69+ self .__cached_explosive = None
70+ self .__cached_pure = None
71+ self .__cached_total = None
6872
6973 @classmethod
7074 def default (cls ):
7175 return cls (0 , 0 , 0 , 0 )
7276
77+ def _clear_cached (self ):
78+ self .__cached_em = None
79+ self .__cached_thermal = None
80+ self .__cached_kinetic = None
81+ self .__cached_explosive = None
82+ self .__cached_pure = None
83+ self .__cached_total = None
84+
85+ def add_breacher (self , key , data ):
86+ self ._breachers [key ].append (data )
87+
88+ @property
89+ def profile (self ):
90+ return self .__profile
91+
92+ @profile .setter
93+ def profile (self , profile ):
94+ self .__profile = profile
95+ self ._clear_cached ()
96+
7397 @property
7498 def em (self ):
99+ if self .__cached_em is not None :
100+ return self .__cached_em
75101 dmg = self ._em
76102 if self .profile is not None :
77103 dmg *= 1 - getattr (self .profile , "emAmount" , 0 )
104+ self .__cached_em = dmg
78105 return dmg
79106
80107 @property
81108 def thermal (self ):
109+ if self .__cached_thermal is not None :
110+ return self .__cached_thermal
82111 dmg = self ._thermal
83112 if self .profile is not None :
84113 dmg *= 1 - getattr (self .profile , "thermalAmount" , 0 )
114+ self .__cached_thermal = dmg
85115 return dmg
86116
87117 @property
88118 def kinetic (self ):
119+ if self .__cached_kinetic is not None :
120+ return self .__cached_kinetic
89121 dmg = self ._kinetic
90122 if self .profile is not None :
91123 dmg *= 1 - getattr (self .profile , "kineticAmount" , 0 )
124+ self .__cached_kinetic = dmg
92125 return dmg
93126
94127 @property
95128 def explosive (self ):
129+ if self .__cached_explosive is not None :
130+ return self .__cached_explosive
96131 dmg = self ._explosive
97132 if self .profile is not None :
98133 dmg *= 1 - getattr (self .profile , "explosiveAmount" , 0 )
134+ self .__cached_explosive = dmg
99135 return dmg
100136
101137 @property
102138 def pure (self ):
139+ if self .__cached_pure is not None :
140+ return self .__cached_pure
103141 if self .profile is None :
104- return sum (
142+ dmg = sum (
105143 max ((b .absolute for b in bs ), default = 0 )
106144 for bs in self ._breachers .values ())
107- return sum (
108- max ((min (b .absolute , b .relative * getattr (self .profile , "hp" , math .inf )) for b in bs ), default = 0 )
109- for bs in self ._breachers .values ())
145+ else :
146+ dmg = sum (
147+ max ((min (b .absolute , b .relative * getattr (self .profile , "hp" , math .inf )) for b in bs ), default = 0 )
148+ for bs in self ._breachers .values ())
149+ self .__cached_pure = dmg
150+ return dmg
110151
111152 @property
112153 def total (self ):
113- return self .em + self .thermal + self .kinetic + self .explosive + self .pure
154+ if self .__cached_total is not None :
155+ return self .__cached_total
156+ dmg = self .em + self .thermal + self .kinetic + self .explosive + self .pure
157+ self .__cached_total = dmg
158+ return dmg
114159
115160 # Iterator is needed to support tuple-style unpacking
116161 def __iter__ (self ):
@@ -154,6 +199,7 @@ def __iadd__(self, other):
154199 self ._explosive += other ._explosive
155200 for k , v in other ._breachers .items ():
156201 self ._breachers [k ].extend (v )
202+ self ._clear_cached ()
157203 return self
158204
159205 def __mul__ (self , mul ):
@@ -177,6 +223,7 @@ def __imul__(self, mul):
177223 for v in self ._breachers .values ():
178224 for b in v :
179225 b *= mul
226+ self ._clear_cached ()
180227 return self
181228
182229 def __truediv__ (self , div ):
0 commit comments