123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124 |
- from itertools import product
- import numpy as np
- from app.verkolst import verkolst
- from app.colormap.colormap import apply_colormap
- from app.trade.trade_utils import trade_distance
- class Overlay:
- def __init__(self, ui, hexmap_layer, opacity=120):
- self._ui = ui
- self._overlay = hexmap_layer
- self._enabled = False
- self._opacity = opacity
- def enable(self):
- self._enabled = True
- self.update()
- def disable(self):
- self._enabled = False
- def toggle(self):
- if self._enabled:
- self.disable()
- else:
- self.enable()
- @property
- def enabled(self):
- return self._enabled
- def _recalculate(self):
- pass
- def update(self):
- if not self._enabled:
- return
- self._recalculate()
- for i, j in product(range(verkolst.width), range(verkolst.height)):
- self._overlay.set_cell_color(i, j, self.get_cell_color(i, j))
- self._overlay.set_cell_opacity(i, j, self.get_cell_opacity(i, j))
- def get_cell_color(self, i, j):
- raise NotImplementedError()
- def get_cell_opacity(self, i, j):
- return self._opacity
- class FoodOverlay(Overlay):
- def __init__(self, ui, hexmap_layer):
- super().__init__(ui, hexmap_layer, opacity=200)
- self._colors = None
- def _recalculate(self):
- self._colors = apply_colormap(verkolst.resources.food_stored/verkolst.resources.food_stored_capacity,
- 'magma', min_=0)
- def get_cell_color(self, i, j):
- # res = verkolst.resources
- if verkolst.resources.any_starvation[i, j]:
- return 255, 0, 0 # Red
- else:
- return self._colors[i, j]
- class PopsOverlay(Overlay):
- def __init__(self, ui, hexmap_layer, class_):
- super().__init__(ui, hexmap_layer, opacity=240)
- self._class = class_
- self._colors = None
- def _recalculate(self):
- pops = {
- 'lc': verkolst.resources.lc_pops,
- 'mc': verkolst.resources.mc_pops,
- 'uc': verkolst.resources.uc_pops,
- }[self._class]
- self._colors = apply_colormap(pops, 'magma', min_=0)
- def get_cell_color(self, i, j):
- return self._colors[i, j]
- class TradeDistanceOverlay(Overlay):
- def __init__(self, ui, hexmap_layer):
- super().__init__(ui, hexmap_layer, opacity=180)
- self._colors = None
- self.trade_distance = np.full_like(verkolst.resources.lc_pops, 0)
- self.exp_partner = None
- def _recalculate(self):
- if self._ui.hl_province is not None:
- i, j = self._ui.hl_province.i, self._ui.hl_province.j
- self.exp_partner, self.trade_distance = trade_distance(i, j,
- verkolst.resources.trade_range[i, j],
- verkolst.resources.trade_impedance,
- verkolst.resources.trade_value)
- else:
- self.trade_distance[:, :] = 0.0
- self._colors = apply_colormap(self.trade_distance, 'viridis', min_=0)
- def get_cell_color(self, i, j):
- if self._ui.hl_province is None:
- return 0, 0, 0
- elif (i, j) == self.exp_partner:
- return 255, 204, 0 # Gold
- else:
- return self._colors[i, j]
- def get_cell_opacity(self, i, j):
- if self._ui.hl_province is None:
- return 0
- elif self.trade_distance[i, j] < 0: # out of range
- return 0
- elif (i, j) == self.exp_partner:
- return 255
- else:
- return self._opacity
|