Conditions | 53 |
Total Lines | 197 |
Code Lines | 174 |
Lines | 44 |
Ratio | 22.34 % |
Changes | 0 |
Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.
For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.
Commonly applied refactorings include:
If many parameters/temporary variables are present:
Complex classes like AIs.ais_pirate.planetManager() often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes.
Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.
1 | # |
||
35 | |||
36 | def _fill_with_dens(self, system_info): |
||
37 | for planet_id in copy.copy(system_info.idle_planets): |
||
38 | planet = self.db[planet_id] |
||
39 | if planet.plSlots > len(planet.slots): |
||
40 | log.debug(self.player.oid, "PIRATEAI - building pirate den", planet.oid) |
||
41 | dens_to_build = planet.plSlots - len(planet.slots) |
||
42 | planet.prodQueue, self.player.stratRes = self.client.cmdProxy.startConstruction(planet.oid, |
||
43 | Rules.Tech.PIRATEDEN, dens_to_build, |
||
44 | planet.oid, Rules.Tech.PIRATEDEN < 1000, 0, Const.OID_NONE) |
||
45 | system_info.idle_planets.remove(planet_id) |
||
46 | system_info.dens[planet_id] += dens_to_build |
||
47 | continue |
||
48 | |||
49 | def _build_defensive_bases(self, system_info): |
||
50 | for planet_id in copy.copy(system_info.idle_planets): |
||
51 | planet = self.db[planet_id] |
||
52 | if system_info.bases[planet_id] < 2 and planet.plSlots >= 2: |
||
53 | dens_sum = sum(system_info.dens.values()) |
||
54 | # build on the other structure [something nonpiratish :)] or |
||
55 | # pirate den |
||
56 | if system_info.other_struct_id[planet_id]: |
||
57 | planet.prodQueue, self.player.stratRes = self.client.cmdProxy.startConstruction(planet.oid, |
||
58 | Rules.Tech.PIRATEBASE, 1, planet.oid, Rules.Tech.PIRATEBASE < 1000, |
||
59 | 0, system_info.other_struct_id[planet_id]) |
||
60 | system_info.idle_planets.remove(planet_id) |
||
61 | return |
||
62 | elif dens_sum: |
||
63 | bases_to_build = min(dens_sum, 2 - system_info.bases[planet_id]) |
||
64 | planet.prodQueue, self.player.stratRes = self.client.cmdProxy.startConstruction(planet.oid, |
||
65 | Rules.Tech.PIRATEBASE, bases_to_build, |
||
66 | planet.oid, Rules.Tech.PIRATEBASE < 1000, 0, |
||
67 | Rules.Tech.PIRATEDEN) |
||
68 | system_info.idle_planets.remove(planet_id) |
||
69 | system_info.dens[planet_id] -= bases_to_build |
||
70 | return |
||
71 | |||
72 | def _build_bases(self, system_info): |
||
73 | to_colonize = self.data.freePlanets & set(system_info.system.planets) |
||
74 | for planet_id in copy.copy(system_info.idle_planets): |
||
75 | planet = self.db[planet_id] |
||
76 | for target_id in to_colonize: |
||
77 | target = self.db[target_id] |
||
78 | if target.owner == self.player.oid: |
||
79 | planet.prodQueue, self.player.stratRes = self.client.cmdProxy.startConstruction(planet_id, |
||
80 | Rules.Tech.PIRATEDEN, 1, |
||
81 | target_id, Rules.Tech.PIRATEDEN < 1000, 0, Const.OID_NONE) |
||
82 | system_info.idle_planets.remove(planet_id) |
||
83 | system_info.dens[target_id] = 1 |
||
84 | break |
||
85 | else: |
||
86 | planet.prodQueue, self.player.stratRes = self.client.cmdProxy.startConstruction(planet_id, |
||
87 | Rules.Tech.PIRATEBASE, 1, |
||
88 | target_id, Rules.Tech.PIRATEBASE < 1000, 0, Const.OID_NONE) |
||
89 | system_info.idle_planets.remove(planet_id) |
||
90 | break |
||
91 | |||
92 | def _build_brewery(self, system_info): |
||
93 | for planet_id in copy.copy(system_info.idle_planets) & set(system_info.dens.keys()): |
||
94 | planet = self.db[planet_id] |
||
95 | if system_info.dens[planet_id] < 1: |
||
96 | # there was den, but it is not anymore, try another planet |
||
97 | continue |
||
98 | planet.prodQueue, self.player.stratRes = self.client.cmdProxy.startConstruction(planet_id, |
||
99 | Rules.Tech.PIRATEBREWERY, 1, planet_id, |
||
100 | Rules.Tech.PIRATEBASE < 1000, 0, Rules.Tech.PIRATEDEN) |
||
101 | system_info.idle_planets.remove(planet_id) |
||
102 | system_info.dens[planet_id] -= 1 |
||
103 | system_info.breweries += 1 |
||
104 | return |
||
105 | |||
106 | def _build_prisons(self, system_info): |
||
107 | sumOfDens = sum(system_info.dens.values()) |
||
108 | denTech = Rules.techs[Rules.Tech.PIRATEDEN] |
||
109 | prisonTech = Rules.techs[Rules.Tech.PIRATEPRISON] |
||
110 | energy = sumOfDens * denTech.prodEn * 1.25 - system_info.prisons * prisonTech.operEn |
||
111 | possiblePrisons = math.floor(energy / (denTech.prodEn * 1.25 + prisonTech.operEn)) |
||
112 | for planet_id in copy.copy(system_info.idle_planets) & set(system_info.dens.keys()): |
||
113 | planet = self.db[planet_id] |
||
114 | if system_info.dens[planet_id] < 1 or possiblePrisons < 1: |
||
115 | # there was a Den, but it is not there anymore, try another planet |
||
116 | continue |
||
117 | planet.prodQueue, self.player.stratRes = self.client.cmdProxy.startConstruction(planet_id, |
||
118 | Rules.Tech.PIRATEPRISON, 1, planet_id, |
||
119 | Rules.Tech.PIRATEBASE < 1000, 0, Rules.Tech.PIRATEDEN) |
||
120 | system_info.idle_planets.remove(planet_id) |
||
121 | system_info.dens[planet_id] -= 1 |
||
122 | possiblePrisons -= 1 |
||
123 | |||
124 | def _build_shipyard(self, system_info): |
||
125 | slots = 0 |
||
126 | for planet_id in system_info.system.planets: |
||
127 | slots += self.db[planet_id].plSlots |
||
128 | if slots <= 10 or system_info.shipyards: |
||
129 | return |
||
130 | for planet_id in copy.copy(system_info.idle_planets) & set(system_info.dens.keys()): |
||
131 | planet = self.db[planet_id] |
||
132 | if system_info.dens[planet_id] < 1: |
||
133 | # there was a Den, but it is not there anymore, try another planet |
||
134 | continue |
||
135 | planet.prodQueue, self.player.stratRes = self.client.cmdProxy.startConstruction(planet_id, |
||
136 | Rules.Tech.PIRATESD, 1, planet_id, |
||
137 | Rules.Tech.PIRATEBASE < 1000, 0, Rules.Tech.PIRATEDEN) |
||
138 | system_info.idle_planets.remove(planet_id) |
||
139 | system_info.dens[planet_id] -= 1 |
||
140 | system_info.shipyards = 1 |
||
141 | return |
||
142 | |||
143 | def _expand_slots(self, system_info): |
||
144 | if Rules.Tech.ADDSLOT3 not in self.player.techs: |
||
145 | return |
||
146 | for planet_id in copy.copy(system_info.idle_planets): |
||
147 | planet = self.db[planet_id] |
||
148 | if planet.plSlots < planet.plMaxSlots: |
||
149 | planet.prodQueue, self.player.stratRes = self.client.cmdProxy.startConstruction(planet_id, |
||
150 | Rules.Tech.ADDSLOT3, 1, planet_id, |
||
151 | Rules.Tech.ADDSLOT3 < 1000, 0, Const.OID_NONE) |
||
152 | planet.prodQueue, self.player.stratRes = self.client.cmdProxy.startConstruction(planet_id, |
||
153 | Rules.Tech.PIRATEDEN, 1, planet_id, |
||
154 | Rules.Tech.PIRATEDEN < 1000, 0, Const.OID_NONE) |
||
155 | system_info.idle_planets.remove(planet_id) |
||
156 | |||
157 | def _condensePlanet(self, planet, target): |
||
158 | if Rules.Tech.PLCOND5 in self.player.techs: |
||
159 | planet.prodQueue, self.player.stratRes = self.client.cmdProxy.startConstruction(planet.oid, |
||
160 | Rules.Tech.PLCOND5, 1, target.oid, |
||
161 | Rules.Tech.PLCOND5 < 1000, 0, Const.OID_NONE) |
||
162 | planet.prodQueue, self.player.stratRes = self.client.cmdProxy.startConstruction(planet.oid, |
||
163 | Rules.Tech.PIRATEBASE, 1, target.oid, |
||
164 | Rules.Tech.PIRATEBASE < 1000, 0, Const.OID_NONE) |
||
165 | self.data.nonhabPlanets.remove(target.oid) |
||
166 | |||
167 | def _assemblePlanet(self, planet, target): |
||
168 | if Rules.Tech.PLASSEMBL5 in self.player.techs: |
||
169 | planet.prodQueue, self.player.stratRes = self.client.cmdProxy.startConstruction(planet.oid, |
||
170 | Rules.Tech.PLASSEMBL5, 1, target.oid, |
||
171 | Rules.Tech.PLASSEMBL5 < 1000, 0, Const.OID_NONE) |
||
172 | planet.prodQueue, self.player.stratRes = self.client.cmdProxy.startConstruction(planet.oid, |
||
173 | Rules.Tech.PIRATEBASE, 1, target.oid, |
||
174 | Rules.Tech.PIRATEBASE < 1000, 0, Const.OID_NONE) |
||
175 | self.data.nonhabPlanets.remove(target.oid) |
||
176 | |||
177 | def _create_planets(self, system_info): |
||
178 | for target_id in copy.copy(self.data.nonhabPlanets & set(system_info.system.planets)): |
||
179 | target = self.db[target_id] |
||
180 | try: |
||
181 | planet_id = system_info.idle_planets.pop() |
||
182 | except KeyError: |
||
183 | return |
||
184 | planet = self.db[planet_id] |
||
185 | if target.plType == u'G': |
||
186 | self._condensePlanet(planet, target) |
||
187 | elif target.plType == u'A': |
||
188 | self._assemblePlanet(planet, target) |
||
189 | |||
190 | def _build_ships(self, system_info): |
||
191 | system_fleets = getattr(system_info.system, 'fleets', []) |
||
192 | has_scout = False |
||
193 | for fleet_id in system_fleets: |
||
194 | fleet = self.db[fleet_id] |
||
195 | if getattr(fleet, 'owner', Const.OID_NONE) == self.player.oid: |
||
196 | if tool.fleetContains(fleet, {4:1}): |
||
197 | has_scout = True |
||
198 | for planet_id in system_info.idle_planets: |
||
199 | planet = self.db[planet_id] |
||
200 | if not has_scout: |
||
201 | planet.prodQueue, self.player.stratRes = self.client.cmdProxy.startConstruction(planet_id, 4, 1, planet_id, True, False, Const.OID_NONE) |
||
202 | else: |
||
203 | dice = random.randint(1, 3) |
||
204 | if dice == 1: |
||
205 | planet.prodQueue, self.player.stratRes = self.client.cmdProxy.startConstruction(planet_id, 1, 3, planet_id, True, False, Const.OID_NONE) |
||
206 | elif dice == 2: |
||
207 | planet.prodQueue, self.player.stratRes = self.client.cmdProxy.startConstruction(planet_id, 2, 3, planet_id, True, False, Const.OID_NONE) |
||
208 | else: |
||
209 | planet.prodQueue, self.player.stratRes = self.client.cmdProxy.startConstruction(planet_id, 3, 2, planet_id, True, False, Const.OID_NONE) |
||
210 | |||
211 | def _get_system_info(self, system): |
||
212 | system_info = IDataHolder() |
||
213 | # my planets in the system |
||
214 | system_info.system = system |
||
215 | system_info.breweries = 0 |
||
216 | system_info.shipyards = 0 |
||
217 | system_info.prisons = 0 |
||
218 | system_info.dens = {} |
||
219 | system_info.bases = {} |
||
220 | system_info.other_struct_id = {} |
||
221 | system_info.idle_planets = self.data.myPlanets & set(system.planets) |
||
222 | for planet_id in copy.copy(system_info.idle_planets): |
||
223 | planet = self.db[planet_id] |
||
224 | system_info.bases[planet_id] = 0 |
||
225 | system_info.other_struct_id[planet_id] = None |
||
226 | system_info.dens[planet_id] = 0 |
||
227 | for struct in planet.slots: |
||
228 | if struct[0] == Rules.Tech.PIRATEBASE: |
||
229 | system_info.bases[planet_id] += 1 |
||
230 | elif struct[0] == Rules.Tech.PIRATEBREWERY: |
||
231 | system_info.breweries += 1 |
||
232 | elif struct[0] == Rules.Tech.PIRATEDEN: |
||
364 |