Example #1
0
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)
Example #2
0
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)
Example #3
0
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 not None:
            self._screen.deleteLater()
        self._screen = SphereView(
                self._sim.grid,
                { v: self.tilecolor(t) for (v, t) in self._sim.tiles.iteritems() },
                self)
        self._screen.rotate(self._rotate)
        self.layout().addWidget(self._screen)
Example #4
0
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)
Example #5
0
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)
Example #6
0
 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)
Example #7
0
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)
Example #8
0
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 not None:
            self._screen.deleteLater()
        self._screen = SphereView(
                self._sim.grid,
                { v: self.tilecolor(t) for (v, t) in self._sim.tiles.iteritems() },
                self)
        self._screen.rotate(self._rotate)
        self.layout().addWidget(self._screen)
Example #9
0
 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)
Example #10
0
class PlanetDisplay(QWidget):
    dt = 0.01

    _colorfunctions = [climatecolor, color, elevationcolor, 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(elevationcolor)
        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 invalidate(self):
        if self._screen is not None:
            self._screen.deleteLater()
        self._screen = SphereView(
            self._sim.grid,
            { v: self.tilecolor(t) for (v, t) in self._sim.tiles.iteritems() },
            self)
        self._screen.rotate(self._rotate)
        self.layout().addWidget(self._screen)
Example #11
0
 def invalidate(self):
     if self._screen is not None:
         self._screen.deleteLater()
     self._screen = SphereView(
         self._sim.grid,
         { v: self.tilecolor(t) for (v, t) in self._sim.tiles.iteritems() },
         self)
     self._screen.rotate(self._rotate)
     self.layout().addWidget(self._screen)
Example #12
0
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)
Example #13
0
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.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 not None:
            self._screen.deleteLater()
        attribute = self._attributes[self.shownattribute]
        if attribute['seasonal']:
            fn = lambda t: attribute['function'](t, self.season)
        else:
            fn = attribute['function']
        self._screen = SphereView(
            self._sim.grid,
            { v: fn(t) for (v, t) in self._sim.tiles.iteritems() },
            self)
        self._screen.rotate(self._rotate)
        self.layout().addWidget(self._screen)
Example #14
0
 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)
Example #15
0
 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)
Example #16
0
 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)
Example #17
0
 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)
Example #18
0
 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)
Example #19
0
 def invalidate(self):
     if self._screen is not None:
         self._screen.deleteLater()
     attribute = self._attributes[self.shownattribute]
     if attribute['seasonal']:
         fn = lambda t: attribute['function'](t, self.season)
     else:
         fn = attribute['function']
     self._screen = SphereView(
         self._sim.grid,
         { v: fn(t) for (v, t) in self._sim.tiles.iteritems() },
         self)
     self._screen.rotate(self._rotate)
     self.layout().addWidget(self._screen)
Example #20
0
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)
Example #21
0
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)
Example #22
0
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
Example #23
0
 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)