git.fiddlerwoaroof.com
levels.py
160f4887
 from algorithms import djikstra
539d5ff4
 import libtcodpy as libtcod
76408e86
 import maps
 import debug
 
 class Level(object):
 	levels = {}
539d5ff4
 	color_dark_wall = libtcod.Color(60, 60, 60)
 	color_light_wall = libtcod.Color(127,127,127)
 	color_dark_ground = libtcod.Color(150,150,150)
 	color_light_ground = libtcod.Color(200,200,200)
 
 
76408e86
 
 	def register(self, num):
 		self.levels[num] = self
 		self.number = num
 		return self
 
67ab39f4
 	dijkstra_cache = {}
160f4887
 	def get_djikstra(self, x,y):
 		if (x,y) not in self.djikstra_cache:
58ab2b1d
 			print 'new (%s, %s)' % (x,y)
67ab39f4
 			dj = libtcod.dijkstra_new(self.fov_map)
 			libtcod.dijkstra_compute(dj, x, y)
 			self.dijkstra_cache[x,y] = dj
160f4887
 		return dj
 
76408e86
 	def __init__(self, width, height, con, item_types=None, monster_types=None):
2dda4cb6
 		self.clear_cells = set()
160f4887
 		self.djikstra_cache = {}
76408e86
 		self.objects = []
 		self.map = maps.Map(width, height, con, self)
539d5ff4
 		self.fov_map = libtcod.map_new(self.map.width, self.map.height)
 		self.con = con
 		self.player = None
76408e86
 
 		if item_types is None: item_types = {}
 		self.item_types = item_types
 
 		if monster_types is None: item_types = {}
 		self.monster_types = monster_types
 
 	def setup(self, max_rooms, min_size, max_size, max_num_monsters, max_num_items):
 		self.map.populate_map(
 			max_rooms, min_size, max_size,
 			self.monster_types, max_num_monsters,
 			self.item_types, max_num_items,
 		)
 
539d5ff4
 	def iter_objects(self):
 		return iter(self.objects)
 
 	def add_object(self, obj):
 		self.objects.append(
 			obj.enter_level(self)
 		)
 		return obj
 
 	def claim_object(self, obj):
 		self.objects.remove(obj)
 		return obj
 
76408e86
 	def enter(self, player):
539d5ff4
 		#self.map.enter(player)
 		if self.player is not None and self.player.level is not None:
 			self.player.level.leave(self.player)
76408e86
 		self.player = player
539d5ff4
 		self.player.pos = self.map.map_entrance
76408e86
 		self.objects.append(player)
 		return self
 
539d5ff4
 	def leave(self, player):
 		#self.map.leave(player)
 		self.objects.remove(player)
 		self.player = None
 
76408e86
 
 	def send_to_back(self, obj):
 		self.objects.remove(obj)
 		self.objects.insert(0,obj)
 
539d5ff4
 	fov_algo = libtcod.FOV_DIAMOND
 	fov_light_walls = True
 	def recompute_fov(self, clear_all=False):
 		x,y = self.map.map_entrance
 		if self.player is not None:
 			x,y = self.player.pos
 
 		libtcod.map_compute_fov(
 			self.fov_map, x,y,
 				player.Player.torch_radius, self.fov_light_walls, self.fov_algo
 		)
 
 		for x,y, cell in self.map.iter_cells_with_coords():
 			visible = libtcod.map_is_in_fov(self.fov_map, x,y)
 			if visible and not cell.explored:
 				cell.explored = True
 
 			color = libtcod.black
b072497a
 			if cell.explored:
539d5ff4
 				wall = cell.block_sight
 				walkable = not cell.blocked
 
 				if wall or walkable:
 					color = {
 						True: {True: self.color_light_wall, False: self.color_light_ground},
 						False: {True: self.color_dark_wall, False: self.color_dark_ground}
 					}[visible][wall]
 				elif not walkable:
 					color = libtcod.Color(100,100,200)
 
 			if cell.explored or clear_all:
67ab39f4
 				if cell.block_sight and cell.explored:
 					libtcod.console_put_char_ex(self.con, x, y, '#', libtcod.white, color)
 				else:
 					libtcod.console_set_char_background(self.con, x, y, color, libtcod.BKGND_SET)
539d5ff4
 
 	def init_fov(self):
 		libtcod.map_clear(self.fov_map)
67ab39f4
 
539d5ff4
 		for x,y,cell in self.map.iter_cells_with_coords():
 			libtcod.map_set_properties(self.fov_map, x,y,
 				not cell.block_sight,
 				not cell.blocked
 			)
 
 	def is_visible(self, x,y):
 		if x < 0 or y < 0:
 			raise ValueError(' (%s,%s) not in map ' % (x,y))
 		elif x >= self.map.width or y >= self.map.height:
 			raise ValueError(' (%s,%s) not in map ' % (x,y))
 		return libtcod.map_is_in_fov(self.fov_map, x,y)
 
 	def is_blocked(self, x,y):
160f4887
 		if x < 0 or x > self.map.width:
 			result = True
 		elif y < 0 or y > self.map.height:
 			result = True
 		else:
 			result = self.map.is_blocked(x,y)
 		return result
539d5ff4
 
76408e86
 
539d5ff4
 import game
 import player