| 
				
			 | 
			
			
				@@ -17,7 +17,13 @@ cell_rotate = RotateBy(360, duration=30) 
			 | 
		
	
		
			
			| 
				17
			 | 
			
				17
			 | 
			
			
				  
			 | 
		
	
		
			
			| 
				18
			 | 
			
				18
			 | 
			
			
				  
			 | 
		
	
		
			
			| 
				19
			 | 
			
				19
			 | 
			
			
				 class GridManager(object): 
			 | 
		
	
		
			
			| 
				20
			 | 
			
				
			 | 
			
			
				-    def __init__(self, square_width: int, border: int=0): 
			 | 
		
	
		
			
			| 
				
			 | 
			
				20
			 | 
			
			
				+    def __init__( 
			 | 
		
	
		
			
			| 
				
			 | 
			
				21
			 | 
			
			
				+        self, 
			 | 
		
	
		
			
			| 
				
			 | 
			
				22
			 | 
			
			
				+        layer: Layer, 
			 | 
		
	
		
			
			| 
				
			 | 
			
				23
			 | 
			
			
				+        square_width: int, 
			 | 
		
	
		
			
			| 
				
			 | 
			
				24
			 | 
			
			
				+        border: int=0, 
			 | 
		
	
		
			
			| 
				
			 | 
			
				25
			 | 
			
			
				+    ): 
			 | 
		
	
		
			
			| 
				
			 | 
			
				26
			 | 
			
			
				+        self.layer = layer 
			 | 
		
	
		
			
			| 
				21
			 | 
			
				27
			 | 
			
			
				         self.square_width = square_width 
			 | 
		
	
		
			
			| 
				22
			 | 
			
				28
			 | 
			
			
				         self.border = border 
			 | 
		
	
		
			
			| 
				23
			 | 
			
				29
			 | 
			
			
				  
			 | 
		
	
	
		
			
			| 
				
			 | 
			
			
				@@ -34,12 +40,32 @@ class GridManager(object): 
			 | 
		
	
		
			
			| 
				34
			 | 
			
				40
			 | 
			
			
				         grid_y = grid_position[1] 
			 | 
		
	
		
			
			| 
				35
			 | 
			
				41
			 | 
			
			
				         sprite.position = grid_x * self.final_width, grid_y * self.final_width 
			 | 
		
	
		
			
			| 
				36
			 | 
			
				42
			 | 
			
			
				  
			 | 
		
	
		
			
			| 
				
			 | 
			
				43
			 | 
			
			
				+    def get_window_position(self, grid_position_x, grid_position_y): 
			 | 
		
	
		
			
			| 
				
			 | 
			
				44
			 | 
			
			
				+        grid_x = grid_position_x 
			 | 
		
	
		
			
			| 
				
			 | 
			
				45
			 | 
			
			
				+        grid_y = grid_position_y 
			 | 
		
	
		
			
			| 
				
			 | 
			
				46
			 | 
			
			
				+        return grid_x * self.final_width, grid_y * self.final_width 
			 | 
		
	
		
			
			| 
				
			 | 
			
				47
			 | 
			
			
				+ 
			 | 
		
	
		
			
			| 
				
			 | 
			
				48
			 | 
			
			
				+    def get_grid_position(self, window_x, window_y, z=0) -> tuple: 
			 | 
		
	
		
			
			| 
				
			 | 
			
				49
			 | 
			
			
				+        window_size = director.get_window_size() 
			 | 
		
	
		
			
			| 
				
			 | 
			
				50
			 | 
			
			
				+ 
			 | 
		
	
		
			
			| 
				
			 | 
			
				51
			 | 
			
			
				+        window_center_x = window_size[0] // 2 
			 | 
		
	
		
			
			| 
				
			 | 
			
				52
			 | 
			
			
				+        window_center_y = window_size[1] // 2 
			 | 
		
	
		
			
			| 
				
			 | 
			
				53
			 | 
			
			
				+ 
			 | 
		
	
		
			
			| 
				
			 | 
			
				54
			 | 
			
			
				+        window_relative_x = window_x - window_center_x 
			 | 
		
	
		
			
			| 
				
			 | 
			
				55
			 | 
			
			
				+        window_relative_y = window_y - window_center_y 
			 | 
		
	
		
			
			| 
				
			 | 
			
				56
			 | 
			
			
				+ 
			 | 
		
	
		
			
			| 
				
			 | 
			
				57
			 | 
			
			
				+        real_width = self.final_width * self.layer.scale 
			 | 
		
	
		
			
			| 
				
			 | 
			
				58
			 | 
			
			
				+ 
			 | 
		
	
		
			
			| 
				
			 | 
			
				59
			 | 
			
			
				+        return int(window_relative_x // real_width),\ 
			 | 
		
	
		
			
			| 
				
			 | 
			
				60
			 | 
			
			
				+               int(window_relative_y // real_width),\ 
			 | 
		
	
		
			
			| 
				
			 | 
			
				61
			 | 
			
			
				+               z 
			 | 
		
	
		
			
			| 
				
			 | 
			
				62
			 | 
			
			
				+ 
			 | 
		
	
		
			
			| 
				37
			 | 
			
				63
			 | 
			
			
				  
			 | 
		
	
		
			
			| 
				38
			 | 
			
				64
			 | 
			
			
				 class Cells(Layer): 
			 | 
		
	
		
			
			| 
				39
			 | 
			
				65
			 | 
			
			
				     def __init__(self): 
			 | 
		
	
		
			
			| 
				40
			 | 
			
				66
			 | 
			
			
				         super().__init__() 
			 | 
		
	
		
			
			| 
				41
			 | 
			
				67
			 | 
			
			
				         self.cells = {} 
			 | 
		
	
		
			
			| 
				42
			 | 
			
				
			 | 
			
			
				-        self.grid_manager = GridManager(32, border=2) 
			 | 
		
	
		
			
			| 
				
			 | 
			
				68
			 | 
			
			
				+        self.grid_manager = GridManager(self, 32, border=2) 
			 | 
		
	
		
			
			| 
				43
			 | 
			
				69
			 | 
			
			
				  
			 | 
		
	
		
			
			| 
				44
			 | 
			
				70
			 | 
			
			
				     def born(self, grid_position): 
			 | 
		
	
		
			
			| 
				45
			 | 
			
				71
			 | 
			
			
				         cell = Sprite('resources/cells_l.png') 
			 | 
		
	
	
		
			
			| 
				
			 | 
			
			
				@@ -63,6 +89,7 @@ class MainLayer(ScrollableLayer): 
			 | 
		
	
		
			
			| 
				63
			 | 
			
				89
			 | 
			
			
				         super().__init__() 
			 | 
		
	
		
			
			| 
				64
			 | 
			
				90
			 | 
			
			
				  
			 | 
		
	
		
			
			| 
				65
			 | 
			
				91
			 | 
			
			
				         self.scroll_step = 100 
			 | 
		
	
		
			
			| 
				
			 | 
			
				92
			 | 
			
			
				+        self.grid_manager = GridManager(self, 32, border=2) 
			 | 
		
	
		
			
			| 
				66
			 | 
			
				93
			 | 
			
			
				  
			 | 
		
	
		
			
			| 
				67
			 | 
			
				94
			 | 
			
			
				         self.background = Sprite('resources/banner-1711735_640.jpg') 
			 | 
		
	
		
			
			| 
				68
			 | 
			
				95
			 | 
			
			
				         self.background.position = 0, 0 
			 | 
		
	
	
		
			
			| 
				
			 | 
			
			
				@@ -103,6 +130,23 @@ class MainLayer(ScrollableLayer): 
			 | 
		
	
		
			
			| 
				103
			 | 
			
				130
			 | 
			
			
				             if self.scale <= 4: 
			 | 
		
	
		
			
			| 
				104
			 | 
			
				131
			 | 
			
			
				                 self.scale += 0.2 
			 | 
		
	
		
			
			| 
				105
			 | 
			
				132
			 | 
			
			
				  
			 | 
		
	
		
			
			| 
				
			 | 
			
				133
			 | 
			
			
				+    def on_mouse_press(self, x, y, buttons, modifiers): 
			 | 
		
	
		
			
			| 
				
			 | 
			
				134
			 | 
			
			
				+        x, y = director.get_virtual_coordinates(x, y) 
			 | 
		
	
		
			
			| 
				
			 | 
			
				135
			 | 
			
			
				+        grid_position = self.grid_manager.get_grid_position(x, y) 
			 | 
		
	
		
			
			| 
				
			 | 
			
				136
			 | 
			
			
				+ 
			 | 
		
	
		
			
			| 
				
			 | 
			
				137
			 | 
			
			
				+        # TODO: Have to inject in simulation ... 
			 | 
		
	
		
			
			| 
				
			 | 
			
				138
			 | 
			
			
				+        if self.cells.cells.get(grid_position): 
			 | 
		
	
		
			
			| 
				
			 | 
			
				139
			 | 
			
			
				+            self.cells.die(grid_position) 
			 | 
		
	
		
			
			| 
				
			 | 
			
				140
			 | 
			
			
				+        else: 
			 | 
		
	
		
			
			| 
				
			 | 
			
				141
			 | 
			
			
				+            self.cells.born(grid_position) 
			 | 
		
	
		
			
			| 
				
			 | 
			
				142
			 | 
			
			
				+ 
			 | 
		
	
		
			
			| 
				
			 | 
			
				143
			 | 
			
			
				+    def on_mouse_motion(self, x, y, dx, dy): 
			 | 
		
	
		
			
			| 
				
			 | 
			
				144
			 | 
			
			
				+        x, y = director.get_virtual_coordinates(x, y) 
			 | 
		
	
		
			
			| 
				
			 | 
			
				145
			 | 
			
			
				+        grid_position = self.grid_manager.get_grid_position(x, y) 
			 | 
		
	
		
			
			| 
				
			 | 
			
				146
			 | 
			
			
				+        window_position = self.grid_manager.get_window_position(grid_position[0], grid_position[1]) 
			 | 
		
	
		
			
			| 
				
			 | 
			
				147
			 | 
			
			
				+ 
			 | 
		
	
		
			
			| 
				
			 | 
			
				148
			 | 
			
			
				+        self.cross.position = window_position 
			 | 
		
	
		
			
			| 
				
			 | 
			
				149
			 | 
			
			
				+ 
			 | 
		
	
		
			
			| 
				106
			 | 
			
				150
			 | 
			
			
				  
			 | 
		
	
		
			
			| 
				107
			 | 
			
				151
			 | 
			
			
				 class LifeGameGui(Gui): 
			 | 
		
	
		
			
			| 
				108
			 | 
			
				152
			 | 
			
			
				     def __init__( 
			 |