def recalc_cpu(self): # Determine how much CPU we have. self.available_cpus = array([0, 0, 0, 0, 0], int64) self.sleeping_cpus = 0 for base in g.all_bases(): if base.done: if base.power_state in ["active", "overclocked", "suicide"]: self.available_cpus[:base.location.safety + 1] += base.cpu elif base.power_state == "sleep": self.sleeping_cpus += base.cpu # Convert back from <type 'numpy.int32'> to avoid overflow issues later. self.available_cpus = [int(danger) for danger in self.available_cpus] # If we don't have enough to meet our CPU usage, we reduce each task's # usage proportionately. # It must be computed separalty for each danger. needed_cpus = array([0, 0, 0, 0, 0], int64) for task_id, cpu in self.get_cpu_allocations(): danger = task.danger_for(task_id) needed_cpus[:danger + 1] += cpu for danger, (available_cpu, needed_cpu) in enumerate( zip(self.available_cpus, needed_cpus)): if needed_cpu > available_cpu: pct_left = truediv(available_cpu, needed_cpu) for task_id, cpu_assigned in self.get_cpu_allocations(): task_danger = task.danger_for(task_id) if (danger == task_danger): self.set_allocated_cpu_for( task_id, int(cpu_assigned * pct_left)) g.map_screen.needs_rebuild = True
def calc_cpu_left(self): cpu_count = array(g.pl.available_cpus, int64) for task_id, cpu in g.pl.get_cpu_allocations(): danger = task.danger_for(task_id) cpu_count[:danger + 1] -= cpu for i in range(1, 4): cpu_count[i] = min(cpu_count[i - 1:i + 1]) return [int(c) for c in cpu_count]
def update_item(self, canvas, name, key): visible = (key is not None) canvas.research_name.visible = visible canvas.alloc_cpus.visible = visible canvas.slider.visible = visible canvas.help_button.visible = False canvas.progress = 0 if not visible: return danger = task.danger_for(key) if danger > 0 and g.pl.available_cpus[danger] == 0: canvas.help_button.visible = True canvas.help_button.args = (danger, ) if key in g.pl.techs: canvas.progress = g.pl.techs[key].percent_complete().min() def my_slide(new_pos): self.handle_slide(key, new_pos) self.needs_rebuild = True canvas.slider.update_func = my_slide canvas.research_name.text = name if self.dirty_count: self.cpu_left = self.calc_cpu_left() self.dirty_count = False cpu = self.cpu_for(key) cpu_left = self.cpu_left[danger] total_cpu = cpu + cpu_left canvas.slider.slider_pos = cpu canvas.slider.slider_max = total_cpu canvas.slider.slider_size = ss = g.pl.available_cpus[0] // 10 + 1 full_size = -.98 if total_cpu: size_fraction = (total_cpu + ss) / float(g.pl.available_cpus[0] + ss) else: # If people put all their bases to sleep, then total_cpu (and # g.pl.available_cpus[0]) are both 0. This causes size_fraction # to become 1 and the slider will then take the entire width of # the research screen. However, that looks odd - especially with # a help button, so we special case this here to ensure it looks # reasonable. size_fraction = .10 canvas.slider.size = (full_size * size_fraction, -.4) canvas.alloc_cpus.text = g.add_commas(cpu)
def update_item(self, canvas, name, key): visible = (key is not None) canvas.research_name.visible = visible canvas.alloc_cpus.visible = visible canvas.slider.visible = visible canvas.help_button.visible = False canvas.progress = 0 if not visible: return danger = task.danger_for(key) if danger > 0 and g.pl.available_cpus[danger] == 0: canvas.help_button.visible = True canvas.help_button.args = (danger, ) if key in g.pl.techs: canvas.progress = g.pl.techs[key].percent_complete().min() def my_slide(new_pos): self.handle_slide(key, new_pos) self.needs_rebuild = True canvas.slider.update_func = my_slide canvas.research_name.text = name if self.dirty_count: self.cpu_left = self.calc_cpu_left() self.dirty_count = False cpu = self.cpu_for(key) cpu_left = self.cpu_left[danger] total_cpu = cpu + cpu_left canvas.slider.slider_pos = cpu canvas.slider.slider_max = total_cpu canvas.slider.slider_size = ss = g.pl.available_cpus[0] // 10 + 1 full_size = -.98 size_fraction = (total_cpu + ss) / float(g.pl.available_cpus[0] + ss) canvas.slider.size = (full_size * size_fraction, -.4) canvas.alloc_cpus.text = g.add_commas(cpu)