Example #1
0
    def _handle_server_data(self, data):
        """ Handle data that was sent by the server. """
        for key in ('dungeon', 'player', 'messages', 'monsters', 'items'):
            if key not in data.keys():
                continue

            value = data[key]
            if key == 'dungeon':
                levels = {int(i): Level(**d)
                          for i, d in value['levels'].items()}
                current_level = value['current_level']
                self.dungeon = Dungeon(levels, current_level)
            elif key == 'player':
                self.player = Player.fromJson(value)
                self.player.update_fov(self.dungeon.is_blocked)
            elif key == 'messages':
                self.messages = value
            elif key == 'monsters':
                self.monsters = [Creature(**m) for m in value]
            elif key == 'items':
                self.items = [ObjectModel(**i) for i in value]

        self.dungeon.update_explored(self.player)
        self.draw()
Example #2
0
class UIDraw(object):
    def __init__(self):
        self.main_window = MainWindow()

        self.dungeon = None
        self.player = None
        self.messages = []
        self.monsters = []
        self.items = []
        self.draw_not_in_fov = False

    def draw(self):
        """ Draw main game window. """
        self.main_window.draw(self.dungeon, self.player, self.monsters,
                              self.items, self.messages, self.draw_not_in_fov)

    def _handle_server_data(self, data):
        """ Handle data that was sent by the server. """
        for key in ('dungeon', 'player', 'messages', 'monsters', 'items'):
            if key not in data.keys():
                continue

            value = data[key]
            if key == 'dungeon':
                levels = {int(i): Level(**d)
                          for i, d in value['levels'].items()}
                current_level = value['current_level']
                self.dungeon = Dungeon(levels, current_level)
            elif key == 'player':
                self.player = Player.fromJson(value)
                self.player.update_fov(self.dungeon.is_blocked)
            elif key == 'messages':
                self.messages = value
            elif key == 'monsters':
                self.monsters = [Creature(**m) for m in value]
            elif key == 'items':
                self.items = [ObjectModel(**i) for i in value]

        self.dungeon.update_explored(self.player)
        self.draw()

    def handle_event(self):
        global INVENTORY_ITEM
        """ Get a new event and process it. """
        if not DRAW_EVENTS.empty():
            event_name, event_data = DRAW_EVENTS.get()

            if event_name == 'toggle-fov':
                self.draw_not_in_fov = not self.draw_not_in_fov
                self.draw()
            elif event_name == 'inventory-show':
                header = "Press the key next to an item to choose it, or any other to cancel.\n"
                options = [(item.key, item.name) for item in self.player.inventory]
                self.main_window.show_menu(options, header, False)
            elif event_name == 'inventory-item':
                INVENTORY_ITEM = self.player.get_item(event_data)

                if INVENTORY_ITEM:
                    header = INVENTORY_ITEM.name + ":\n"
                    options = INVENTORY_ITEM.allowed_actions()
                    self.main_window.show_menu(options, header, True)
                else:
                    self.draw()
            elif event_name == 'inventory-hide':
                INVENTORY_ITEM = None
                self.draw()
            elif event_name == 'server-msg':
                self._handle_server_data(event_data)

            DRAW_EVENTS.task_done()