git.fiddlerwoaroof.com
main.py
42741360
 import os.path
76408e86
 import textwrap
 import math
 import libtcodpy as libtcod
42741360
 import glob
76408e86
 libtcod.console_set_keyboard_repeat(500, 50)
42741360
 for file in glob.glob('./data/namegen/*.cfg'):
 	libtcod.namegen_parse(file)
76408e86
 
539d5ff4
 from game import GameBase
 import levels
 import objects
 import utilities
42741360
 if __name__ == 'main':
539d5ff4
 	class Game(GameBase):
 		#actual size of the window
 		SCREEN_WIDTH, SCREEN_HEIGHT = 155, 90
 
 		MAP_WIDTH, MAP_HEIGHT = SCREEN_WIDTH, SCREEN_HEIGHT - 17
 
 		INVENTORY_WIDTH = 50
 		BAR_WIDTH = 25
 
 		PANEL_HEIGHT = SCREEN_HEIGHT - MAP_HEIGHT - 2
 		PANEL_Y = SCREEN_HEIGHT - PANEL_HEIGHT
 
 		MSG_X = BAR_WIDTH + 2
 		MSG_WIDTH, MSG_HEIGHT = SCREEN_WIDTH - BAR_WIDTH - 2, PANEL_HEIGHT - 1
 
 		ROOM_MIN_SIZE, ROOM_MAX_SIZE = 7, 19
 
 		MAX_ROOMS = 51
 
 		MAX_ROOM_MONSTERS, MAX_ROOM_ITEMS = 9, 6
 
 		CONFUSE_NUM_TURNS = 17
 
 		LIMIT_FPS = 20	#20 frames-per-second maximum
 
 		def __init__(self):
 			GameBase.__init__(self, 'caer flinding', self.SCREEN_WIDTH, self.SCREEN_HEIGHT)
 
 			self.select_cb = None
 
 			self.panel = libtcod.console_new(self.SCREEN_WIDTH, self.PANEL_HEIGHT)
 
42741360
 			self.levels = []
 
539d5ff4
 			self.current_level = 0
42741360
 			self.levels = [levels.Level(self.MAP_WIDTH, self.MAP_HEIGHT, self.con, self.item_types, self.monster_types)]
539d5ff4
 
 			x,y = None,None
 			self.player = objects.Player(self.level.map, self.con, x,y, '@', libtcod.white,
 				fighter=objects.Fighter(hp=20, defense = 2, power = 10, death_function=self.player_death)
42741360
 			)
 
 
539d5ff4
 
 		def player_death(self, player):
 			utilities.message(self.game_msgs, self.MSG_HEIGHT, self.MSG_WIDTH, 'You died!')
 			self.game_state = 'dead'
 			player.char = '%'
 			player.color = libtcod.dark_red
 
 		def setup_map(self):
42741360
 			print self.monster_types
 			self.player.enter_level(self.level)
 
539d5ff4
 			self.level.setup(self.MAX_ROOMS,
 				self.ROOM_MIN_SIZE, self.ROOM_MAX_SIZE,
 				self.MAX_ROOM_MONSTERS, self.MAX_ROOM_ITEMS
 			)
 			self.set_fov()
 
 		def set_fov(self):
 			self.player.enter_level(self.level)
 			self.level.init_fov()
 			self.level.recompute_fov(True)
 
 		item_types = {}
 		@classmethod
 		def register_item_type(cls, chance):
 			def _inner(typ):
 				cls.item_types[typ] = chance
 				return cls
 			return _inner
 
 
 		monster_types = {}
 		@classmethod
 		def register_monster_type(cls, typ, chance):
 			cls.monster_types[typ] = chance
 
 		@property
 		def level(self):
 			return self.levels[self.current_level]
 
 		@property
 		def map(self):
 			return self.level.map
 
 		def change_level(self, down=True):
 			change = 1 if down else -1
 			self.current_level += change
 
 			if (
 					(self.current_level < 0 and not down)
 						or
 					(self.current_level >= len(self.levels))
 			):
 				print 'hello'
 				new_level = levels.Level(
 					self.MAP_WIDTH, self.MAP_HEIGHT,
 					self.con, self.item_types, self.monster_types
 				)
 
 				if down:
 					self.levels.append(new_level)
 				else:
 					self.levels.insert(0,new_level)
 				self.current_level = self.levels.index(new_level)
 				self.setup_map()
 			else:
 				self.set_fov()
 
 
 
 		def main(self):
 			self.message('Welcome %s! Prepare to perish in the Tombs of the Ancient Kings.' % self.player.name,
 				libtcod.red
 			)
 			for x in GameBase.main(self):
 				if x == 1:
 					if (
 						self.game_state in ('playing','selecting')
 							and
 						self.player_action != 'didnt-take-turn'
 					):
 						for object in self.level.objects:
 							if object.ai:
 								object.clear()
 								object.ai.take_turn()
 
 
 					for object in self.level.objects:
 						object.clear()
 
 					if self.game_state == 'selecting':
 						self.cursor.clear()
 
 				elif x == 2:
 					if self.player_action == 'move':
 						self.player.tick()
 
 
 
 
 		def do_playing(self):
 			if self.player_action != 'didnt-take-turn':
 				for object in self.level.iter_objects():
 					if object.ai:
 						object.clear()
 						object.ai.take_turn()
 			self.player.clear()
 
 			if self.player_action == 'move':
 				self.player.tick()
 
 		def do_selecting(self):
 			self.cursor.clear()
 
 		def do_dead(self):
 			pass
 
 
 		mvkeyhandler = utilities.MovementKeyListener()
 		@mvkeyhandler.up
 		def mvkeyhandler(self):
 			self.player.move_or_attack(0,-1)
 			return 'move'
 
 		@mvkeyhandler.down
 		def mvkeyhandler(self):
 			self.player.move_or_attack(0, 1)
 			return 'move'
 
 		@mvkeyhandler.left
 		def mvkeyhandler(self):
 			self.player.move_or_attack(-1, 0)
 			return 'move'
 
 		@mvkeyhandler.right
 		def mvkeyhandler(self):
 			self.player.move_or_attack(1, 0)
 			return 'move'
 
 		@mvkeyhandler.handle('i')
 		def mvkeyhandler(self):
 			item = self.inventory_menu('choose item\n')
 			if item is not None:
 				self.player.use(item)
 
 		@mvkeyhandler.handle('d')
 		def mvkeyhandler(self):
 			chosen_item = self.inventory_menu('Choose the item to drop:')
 			if chosen_item is not None:
3f968324
 				self.player.drop(chosen_item.owner)
539d5ff4
 
 		@mvkeyhandler.handle('g')
 		def mvkeyhandler(self):
 			for obj in self.level.iter_objects():
 						if obj.x == self.player.x and obj.y == self.player.y and obj.item:
 							self.player.pick_up(obj)
 
 		@mvkeyhandler.handle('<')
 		def mvkeyhandler(self):
 			self.change_level(down=False)
 
 		@mvkeyhandler.handle('>')
 		def mvkeyhandler(self):
 			self.change_level(down=True)
 
 		selectkeyhandler = utilities.MovementKeyListener()
 		@selectkeyhandler.up
 		def selectkeyhandler(self):
 			self.cursor.y -= 1
 		@selectkeyhandler.down
 		def selectkeyhandler(self):
 			self.cursor.y += 1
 		@selectkeyhandler.left
 		def selectkeyhandler(self):
 			self.cursor.x -= 1
 		@selectkeyhandler.right
 		def selectkeyhandler(self):
 			self.cursor.x += 1
 
 		@selectkeyhandler.handle(libtcod.KEY_ENTER)
 		def selectkeyhandler(self):
 			self.select_cb(self.cursor.x, self.cursor.y)
 			self.cursor.clear()
 			self.game_state = 'playing'
 
 
 
 		def render_all(self):
 			for obj in self.level.iter_objects():
 				if obj != self.player:
 					obj.draw(self.player)
 			self.player.draw()
 
 			if self.game_state == 'selecting':
 				self.cursor.draw()
 
 			if self.player.fov_recompute:
 				self.level.recompute_fov()
 
 			libtcod.console_blit(self.con, 0,0, self.SCREEN_WIDTH,self.SCREEN_HEIGHT, 0,0, 0)
 
 			libtcod.console_set_default_background(self.panel, libtcod.black)
 			libtcod.console_clear(self.panel)
 
 			utilities.render_bar(self.panel, 1,1, self.BAR_WIDTH, 'HP',
 				self.player.fighter.hp,
 				self.player.fighter.max_hp,
 				libtcod.red,
 				libtcod.darker_red
 			)
 
 			libtcod.console_print_ex(self.panel, self.BAR_WIDTH/2,3, libtcod.BKGND_NONE, libtcod.CENTER,
 				'%s p %s d' %(self.player.fighter.power, self.player.fighter.defense)
 			)
 
 			libtcod.console_set_default_foreground(self.panel, libtcod.light_gray)
 			libtcod.console_print(self.panel, 1, 0, self.get_names_under_mouse())
 
 			y = 1
 			for line, color in self.game_msgs:
 				libtcod.console_set_default_foreground(self.panel, color)
 				libtcod.console_print_ex(self.panel, self.MSG_X, y, libtcod.BKGND_NONE, libtcod.LEFT, line)
 				y += 1
 
 
 			libtcod.console_blit(self.panel, 0,0, self.SCREEN_WIDTH,self.PANEL_HEIGHT, 0,0, self.PANEL_Y)
 
76408e86
 	game_instance = Game()
42741360
 	from monsters import MonsterLoader
 
76408e86
 
 if __name__ == '__main__':
42741360
 	from main import game_instance
76408e86
 	from items import *
 	from utilities import *
 	from maps import *
 	from objects import *
 	from monsters import *
 
 
 	from functools import partial
 	render_bar = partial(render_bar, game_instance.panel)
 
42741360
 	a = MonsterLoader(os.path.join('.','data','monsters'))
 	a.load_monsters()
 
76408e86
 	game_instance.setup_map()
 	game_instance.main()