class PrehistoryDisplay(QWidget): def __init__(self, sim): QWidget.__init__(self) self._sim = sim self._screen = None self._rotate = 0 self.setLayout(QGridLayout()) self.invalidate() @property def rotate(self): return self._rotate @rotate.setter def rotate(self, value): self._rotate = value self._screen.rotate(self._rotate) def invalidate(self): if self._screen is None: self._screen = SphereView(self._sim.grid.faces, self) races = list(set(self._sim.populated.values())) shades = genshades(len(races)) self._screen.usecolors({ v: population(t, self._sim.populated, self._sim.agricultural, races, shades) for (v, t) in self._sim.tiles.items() }) self._screen.rotate(self._rotate) self.layout().addWidget(self._screen)
class RiversDisplay(QWidget): def __init__(self, sim): QWidget.__init__(self) self._sim = sim self._screen = None self._rotate = 0 self.setLayout(QGridLayout()) self.invalidate() @property def rotate(self): return self._rotate @rotate.setter def rotate(self, value): self._rotate = value self._screen.rotate(self._rotate) def invalidate(self): if self._screen is None: self._screen = SphereView(self._sim.grid.faces, self) rts = {} for t in self._sim.tiles.values(): for r in self._sim.rivers: if t in r: rts[t] = (1 + r.index(t))/float(len(r)) self._screen.usecolors({ v: highlightriver(t, rts) for (v, t) in self._sim.tiles.items() }) self._screen.rotate(self._rotate) self.layout().addWidget(self._screen)
class SplitDisplay(QWidget): def __init__(self, sim): QWidget.__init__(self) self._sim = sim self._screen = None self._rotate = 0 self._time = 2 self.setLayout(QGridLayout()) self.invalidate() @property def rotate(self): return self._rotate @rotate.setter def rotate(self, value): self._rotate = value self._screen.rotate(self._rotate) @property def time(self): return self._time @time.setter def time(self, value): self._time = value self.invalidate() def tilecolor(self, tile): h = tile.layers[0].rock if len(tile.layers) > 0 else None if h is not None: r = g = b = 128 if h == 'R': if self._time > 0: r = 255 elif h == 'B': if self._time > 1: b = 255 color = (r, g, b) else: color = (255, 255, 255) return color def invalidate(self): if self._screen is None: self._screen = SphereView(self._sim.grid.faces, self) self._screen.usecolors({ v: self.tilecolor(t) for (v, t) in self._sim.tiles.items() }) self._screen.rotate(self._rotate) self.layout().addWidget(self._screen)
class WorldDisplay(QWidget): _colorfunctions = [climatecolor, colorvalue, population] def __init__(self, sim, selecthandler): QWidget.__init__(self) self._sim = sim self._screen = None self._rotate = 0 self._aspect = self._colorfunctions.index(colorvalue) self._select = selecthandler self.selected = None self.setLayout(QGridLayout()) self.invalidate() @property def rotate(self): return self._rotate @rotate.setter def rotate(self, value): self._rotate = value self._screen.rotate(self._rotate) @property def aspect(self): return self._aspect @aspect.setter def aspect(self, value): self._aspect = value self.invalidate() def tilecolor(self, tile, populated): if tile is self.selected: return (255,0,0) return self._colorfunctions[self._aspect](tile, populated) def select(self, x, y, z): self.selected = self._sim.nearest((z,-x,y)) if abs(z) < 2 else None self._select(self.selected) def invalidate(self): if self._screen is None: self._screen = SphereView(self._sim.grid.faces, self) self._screen.clicked.connect(self.select) populated = {t: p for (t, (_, p)) in self._sim.populated.items()} self._screen.usecolors({ v: self.tilecolor(t, populated) for (v, t) in self._sim.tiles.items() }) self._screen.rotate(self._rotate) self.layout().addWidget(self._screen)
class PlanetDisplay(QWidget): dt = 0.01 _colorfunctions = [climatecolor, color.value, color.elevation, mountaincolor, rockcolor, subductioncolor, thicknesscolor] def __init__(self, sim, selecthandler): QWidget.__init__(self) self._sim = sim self._screen = None self._rotate = 0 self._aspect = self._colorfunctions.index(color.elevation) self._select = selecthandler self.selected = None self.setLayout(QGridLayout()) self.invalidate() @property def rotate(self): return self._rotate @rotate.setter def rotate(self, value): self._rotate = value self._screen.rotate(self._rotate) @property def aspect(self): return self._aspect @aspect.setter def aspect(self, value): self._aspect = value self.invalidate() def tilecolor(self, tile): return self._colorfunctions[self._aspect](tile) def select(self, x, y, z): self.selected = self._sim.nearest((z,-x,y)) if abs(z) < 2 else None self._select(self.selected) def invalidate(self): if self._screen is None: self._screen = SphereView(self._sim.grid.faces, self) self._screen.clicked.connect(self.select) self._screen.usecolors({ v: self.tilecolor(t) for (v, t) in self._sim.tiles.items() }) self._screen.rotate(self._rotate) self.layout().addWidget(self._screen)
class LifeformsDisplay(QWidget): attributeindices = [ (0,1,2), # life (0,), # animals (1,), #plants (2,)] #trees def __init__(self, sim, selecthandler): QWidget.__init__(self) self._sim = sim self._screen = None self._rotate = 0 self.shownattribute = 0 self.season = 0 self.glaciation = 0.5 self._select = selecthandler self.selected = None self.selectedspecies = None self.setLayout(QGridLayout()) self.invalidate() @property def rotate(self): return self._rotate @rotate.setter def rotate(self, value): self._rotate = value self._screen.rotate(self._rotate) def select(self, x, y, z): self.selected = self._sim.nearest((z,-x,y)) if abs(z) < 2 else None self._select(self.selected) def invalidate(self): if self._screen is None: self._screen = SphereView(self._sim.grid.faces, self) self._screen.clicked.connect(self.select) pops = self._sim.species() if self.selectedspecies: fn = lambda v, c: speciespresence(self.selectedspecies, pops, v, self.season, c) else: indices = self.attributeindices[self.shownattribute] fn = lambda v, c: lifepop(pops, indices, v, self.season, c) self._screen.usecolors({ v: (255,0,0) if t is self.selected else fn(v, snoworrock(t)) for v, t in self._sim.tiles.items() }) self._screen.rotate(self._rotate) self.layout().addWidget(self._screen)
class MoveDisplay(QWidget): def __init__(self, sim): QWidget.__init__(self) self._sim = sim self._screen = None self._rotate = 0 self._trail = True self.setLayout(QGridLayout()) self.invalidate() @property def rotate(self): return self._rotate @rotate.setter def rotate(self, value): self._rotate = value self._screen.rotate(self._rotate) @property def trail(self): return self._trail @trail.setter def trail(self, value): self._trail = value def tilecolor(self, tile): h = tile.layers[0].rock if len(tile.layers) > 0 else None if h == 'T': color = (128, 128, 128) elif h == 'M' and self._trail: color = (192, 192, 192) else: color = (255, 255, 255) return color def invalidate(self): if self._screen is None: self._screen = SphereView(self._sim.grid.faces, self) self._screen.usecolors({ v: self.tilecolor(t) for (v, t) in self._sim.tiles.items() }) self._screen.rotate(self._rotate) self.layout().addWidget(self._screen)
class TerrainDisplay(QWidget): def __init__(self, sim): QWidget.__init__(self) self._sim = sim self._screen = None self._rotate = 0 self._rivers = True self.setLayout(QGridLayout()) self.invalidate() @property def rotate(self): return self._rotate @rotate.setter def rotate(self, value): self._rotate = value self._screen.rotate(self._rotate) @property def rivers(self): return self._rivers @rivers.setter def rivers(self, value): if self._rivers != value: self._rivers = value self.invalidate() def isriver(self, v): return self._rivers and any([v in r for r in self._sim.riverroutes]) def invalidate(self): if self._sim.terrainchanged and self._screen is not None: self.layout().removeItem(self.layout().itemAt(0)) self._screen = None self._sim.terrainchanged = False if self._screen is None: self._screen = SphereView(self._sim.faces, self) colors = { v: (0,0,255) if self.isriver(v) else color.elevationcolor(self._sim.faceelevation(v)) for v in self._sim.faces } self._screen.usecolors(colors) self._screen.rotate(self._rotate) self.layout().addWidget(self._screen)
class ClimateDisplay(QWidget): _attributes = [ { 'name': name, 'function': function, 'seasonal': seasonal } for name, function, seasonal in [ ('koeppen', koeppencolor, False), ('insolation', suncolor, True), ('precipitation', precipcolor, True), ('temperature', tempcolor, True)]] def __init__(self, sim): QWidget.__init__(self) self._sim = sim self._screen = None self._rotate = 0 self.shownattribute = 0 self.season = 0 self.glaciation = 0.5 self.setLayout(QGridLayout()) self.invalidate() @property def rotate(self): return self._rotate @rotate.setter def rotate(self, value): self._rotate = value self._screen.rotate(self._rotate) def invalidate(self): if self._screen is None: self._screen = SphereView(self._sim.grid.faces, self) attribute = self._attributes[self.shownattribute] if attribute['seasonal']: fn = lambda t: attribute['function'](t, self.season) else: fn = attribute['function'] self._screen.usecolors({ v: fn(t) for (v, t) in self._sim.tiles.items() }) self._screen.rotate(self._rotate) self.layout().addWidget(self._screen)
class PopulationDisplay(QWidget): def __init__(self, sim): QWidget.__init__(self) self._sim = sim self._screen = None self._rotate = 0 self.setLayout(QGridLayout()) self.invalidate() @property def rotate(self): return self._rotate @rotate.setter def rotate(self, value): self._rotate = value self._screen.rotate(self._rotate) def invalidate(self): if self._screen is None: self._screen = SphereView(self._sim.grid.faces, self) self._screen.usecolors({ v: highlightcoast(t, self._sim.populated) for (v, t) in self._sim.tiles.items() }) self._screen.rotate(self._rotate) self.layout().addWidget(self._screen)
class ErosionDisplay(QWidget): def __init__(self, sim): QWidget.__init__(self) self._sim = sim self._screen = None self._rotate = 0 self._lost = self._gained = True self.setLayout(QGridLayout()) self.invalidate() @property def rotate(self): return self._rotate @rotate.setter def rotate(self, value): self._rotate = value self._screen.rotate(self._rotate) @property def lost(self): return self._lost @lost.setter def lost(self, value): if self._lost != value: self._lost = value self.invalidate() @property def gained(self): return self._gained @gained.setter def gained(self, value): if self._gained != value: self._gained = value self.invalidate() def invalidate(self): if self._screen is None: self._screen = SphereView(self._sim.grid.faces, self) self._screen.usecolors({ v: self.tilecolor(t) for (v, t) in self._sim.tiles.items() }) self._screen.rotate(self._rotate) self.layout().addWidget(self._screen) def tilecolor(self, tile): h = tile.elevation if h > 0: v = 128 r = g = b = int(v + 12.5 * h) else: r = g = b = v = 0 if self.lost: t = sum([d.degree for d in tile.eroding.destinations]) r = v + abs(max(-5, t)) * 25.5 g = b = v if self.gained: t = sum([m.amount for m in tile.eroding.materials]) g = v + abs(min(5, t)) * 25.5 b = v if not self.lost: r = v return r, g, b
class HistoryDisplay(QWidget): _colorfunctions = [nations, species, population, capacity] def __init__(self, sim, selecthandler): QWidget.__init__(self) self._sim = sim self._screen = None self._rotate = 0 self._aspect = self._colorfunctions.index(nations) self._rivers = True self._select = selecthandler self._selectednations = (None, set(), set()) self.setLayout(QGridLayout()) self.invalidate() @property def rotate(self): return self._rotate @rotate.setter def rotate(self, value): self._rotate = value self._screen.rotate(self._rotate) @property def aspect(self): return self._aspect @aspect.setter def aspect(self, value): self._aspect = value self.invalidate() @property def rivers(self): return self._rivers @rivers.setter def rivers(self, value): if self._rivers != value: self._rivers = value self.invalidate() def tilecolor(self, tile, populated): return self._colorfunctions[self._aspect](tile, populated) def select(self, x, y, z): self._select(self._sim.nearest((z,-x,y)) if abs(z) < 2 else None) def selectnations(self, n, ps, cs): self._selectednations = (n, ps, cs) def invalidate(self): if self._sim.terrainchanged and self._screen is not None: self.layout().removeItem(self.layout().itemAt(0)) self._screen = None self._sim.terrainchanged = False if self._screen is None: self._screen = SphereView(self._sim.faces, self) self._screen.clicked.connect(self.select) self._screen.usecolors(self._colorfunctions[self._aspect](self._sim, self._rivers, self._selectednations)) self._screen.rotate(self._rotate) self.layout().addWidget(self._screen)