git.fiddlerwoaroof.com
display.py
a9acab05
 from __future__ import print_function
 import numpy as np
 
 class CoordPair(object):
    def __init__(self, fst, snd=None):
       if snd == None: fst, snd = fst
       self.fst, self.snd = fst,snd
 
    @property
    def pair(self):
       return self.fst, self.snd
 
    def __len__(self): return 2
    def __iter__(self): return iter(self.pair)
    def __getitem__(self, idx):
       if idx == 0: return self.fst
       elif idx == 1: return self.snd
       else: raise KeyError("Only two elements in a coordpair")
 
    def transform(self, *transforms):
       '''Note: mul _then_ add'''
       f,s = self.pair
       for transform in transforms:
          x = transform.get('mul', (1,1))
          if not hasattr(x, '__iter__'): x=(x,x)
          f1,f2 = x
          f *= f1
          s *= f2
          x = transform.get('add', (0,0))
          if not hasattr(x, '__iter__'): x=(x,x)
          f1,f2 = x
          f += f1
          s += f2
       return f,s
 
    def __ne__(self, other):
       return not self.__eq__(other)
    def __rne__(self, other):
       return not self.__eq__(other)
 
    def __eq__(self, other):
       a,b = self
       c,d = other
       return a==c and b==d
    def __req__(self, other):
       return self == other
 
    def __add__(self, other):
       return self.__class__(self.transform({'add': other}))
    def __radd__(self, other):
       return self.__class__(self.transform({'add': other}))
 
    def __mul__(self, other):
       return self.__class__(self.transform({'mul': other}))
    def __rmul__(self, other):
       return self.__class__(self.transform({'mul': other}))
 
 
    def __sub__(self, other):
       a,b = other
       return self.__class__(self.transform({'add': (-a,-b)}))
    def __rsub__(self, other):
       a,b = other
       return self.__class__(self.transform({'add': (-a,-b)}))
 
    def __div__(self, other):
       return self.__class__(self.transform({'mul': 1.0/other}))
    def __rdiv__(self, other):
       return self.__class__(self.transform({'mul': 1.0/other}))
 
    def __repr__(self):
       return '%s(%s,%s)' % (self.__class__.__name__, self.fst, self.snd)
 
 class MazeDigger(object):
    def __init__(self, traveller, size, multiplier=3):
       self.t = traveller
       self.size = CoordPair(*size)*multiplier
       self.mult = multiplier
       self.map = np.ones(self.size+1, int)*2
 
    def clamp(self, start):
       if start.fst < 0: start.fst = 0
       elif start.fst >= self.size.fst: start.fst = self.size.fst-1
       if start.snd < 0: start.snd = 0
       elif start.snd >= self.size.snd: start.snd = self.size.snd-1
       return start
 
    def draw_line(self, fro, to):
       (x1,y1),  (x2,y2) = fro, to
       if x2<x1: x1,x2 = x2,x1
       if y2<y1: y1,y2 = y2,y1
       x1*=self.mult;x2*=self.mult
       x2 += 1
       y1*=self.mult;y2*=self.mult
       y2 += 1
       self.map[x1+1:x2+1,y1+1:y2+1] = 3
 
    def make_map(self):
       for x,y in self.t.visited:
          self.map[x*self.mult:(x+1)*self.mult, y*self.mult:(y+1)*self.mult] = 0
       for fro, to in self.t.connections:
          self.draw_line(fro, to)
       x,y = self.t.pos
       #self.map[x*self.mult:(x+1)*self.mult, y*self.mult:(y+1)*self.mult] = 1
       return self
 
    def show_map(self):
       nmap = np.rollaxis(self.map, 1)
       for row in nmap:
          for col in row:
             if col == 3: print('.', end='')
             if col == 2: print('#', end='')
             if col == 1: print('o', end='')
             if col == 0: print('x', end='')
          print()
 
    def tcod_show_map(self):
       nmap = self.map.copy()
       nmap = nmap.max() - nmap
       omin = nmap.min()
       nmap -= omin
       omax = nmap.max()
       nmap *= 255
       nmap /= omax
       nmap = np.rollaxis(nmap, 1)
       tc.console_fill_background(0, nmap,nmap,nmap)
 
 
 if __name__ == '__main__':
a95f10f0
    import sys
    aldus = __import__(sys.argv[1])
a9acab05
    import time
    import libtcodpy as tc
 
    self = MazeDigger(aldus.t, (aldus.x,aldus.y))
 
    tc.console_init_root(self.size.fst+1, self.size.snd+1, 'The Title', False, 2)
    tc.sys_set_fps(30)
 
    key, mouse = tc.Key(), tc.Mouse()
 
    walk_result = False
    while True:
       tc.sys_check_for_event(tc.EVENT_KEY_PRESS|tc.EVENT_MOUSE|tc.KEY_PRESSED, key, mouse)
       if key.c == ord('q'): break
 
       if not walk_result:
          walk_result = aldus.t.random_walk(aldus.maze)
          self.make_map()
 
          tc.sys_save_screenshot('tmp.png')
          self.tcod_show_map()
 
       tc.console_flush()