def setup(self):
     self.dungeon = Dungeon("map.txt")
     self.hero = Hero("Geralt", "white wolf", 150, 150, 5)
     self.hero.equip(Weapon("Sword", 30))
     self.hero.learn(Spell("wolf's attack", 20, 20, 2))
     self.dungeon.spawn(self.hero)
     self.command = None
Example #2
0
    def get_get_reponse(self, intent_request, session):
        data = {
            "card_title": "Get Request",
            "card_output": "Get card output",
            "request_name": "get",
            "should_end_session": False,
            "speech_output": "",
            "session_attributes": {},
        }

        item_name = intent_request["intent"]["slots"]["Item"]["value"]

        session_attributes = session["attributes"]

        dungeon = Dungeon(session_attributes["dungeon_data"])
        player = Player(session_attributes["player_data"])
        pos = player.data["position"]

        if dungeon.item_is_available(item_name, pos):
            item = dungeon.take_item(item_name, pos)
            player.add_item(item)
            data["speech_output"] = "You take the " + item_name
        else:
            data["speech_output"] = "You cannot take the " + item_name

        session_attributes["player_data"] = player.data
        session_attributes["dungeon_data"] = dungeon.data

        data["session_attributes"] = session_attributes

        return data
Example #3
0
 def make_dungeon_from_dict(self, dungeon_dict):
     self.dungeon = Dungeon(dungeon_dict['name'], dungeon_dict['theme'],
                            dungeon_dict['next'], dungeon_dict['x'],
                            dungeon_dict['y'], dungeon_dict['roomstr'],
                            dungeon_dict['d_id'])
     self.enable_room_icons(True)
     self.view_dungeon_grid()
def main():
    hero_name = input("Enter hero's name: ")
    hero_title = input("Enter hero's title: ")
    hero = Hero(hero_name, hero_title, 150, 150, 5)
    hero.equip(Weapon("Sword", 30))
    hero.learn(Spell("KillALL", 35, 30, 3))
    dungeon = Dungeon("map.txt", "basic_loot_list_example.json")
    dungeon.spawn(hero)


    dict_commands = {"mu": "up", "md": "down", "ml": "left", "mr": "right", "au": "up", "ad": "down", "al": "left", "ar": "right", "h": "help"}
    dict_commands_move = {"mu": "up", "md": "down", "ml": "left", "mr": "right"}
    dict_commands_attack = {"au": "up", "ad": "down", "al": "left", "ar": "right"}

    index_of_hero = [1, 1]

    print_commands()

    while not dungeon.end_of_game:
        dungeon.print_map()
        print()
        player_input = ""
        while player_input not in dict_commands.keys():

            player_input = str(input(">>> "))
        if player_input == "h":
            print_commands()
        if player_input in dict_commands_move.keys():
            dungeon.move_hero(dict_commands_move[player_input])
        if player_input in dict_commands_attack.keys():
            dungeon.hero_atack(dict_commands_attack[player_input])
        if dungeon.end_of_game:
            break
Example #5
0
class SUD:
    def __init__(self):
        self.myDungeon = 0

    def Run(self):
        self.myDungeon = Dungeon()
        self.myDungeon.Init()

        while True:
            self.Process()

    def Process(self):
        self.myDungeon.DisplayCurrentRoom()

        key = input(">")

        user_input = key.split(' ')

        user_input = [x for x in user_input if x != '']

        if user_input[0].lower() == 'help':
            print("do help")
        else:
            if user_input[0].lower() == 'go':
                if self.myDungeon.isValidMove(user_input[1].lower()):
                    self.myDungeon.MovePlayer(user_input[1].lower())
                else:
                    self.handleBadInput()
            else:
                self.handleBadInput()

    def handleBadInput(self):
        print("\nERROR")
        print("Press any key to continue")
        input()
Example #6
0
    def create_dungeon_cb(self, widget, data):
        name = data['name'].get_text()
        theme = data['theme'].get_active()  #.get_active_text()
        next = find_key(data['d_list'], data['next_dungeon'].get_active_text())
        width = data['width'].get_value_as_int()
        height = data['height'].get_value_as_int()

        self.dungeon = Dungeon(name, theme, next, width, height)
        self.enable_room_icons(True)
        self.view_dungeon_grid()
Example #7
0
 def test_entrance_location_is_positive(self):
     """
     This tests whether the entrance location is positive
     """
     try:
         dungeon = Dungeon(6, 6)
         temp4 = dungeon.entrance_generator()
         self.assertGreaterEqual(temp4, [0, 0],
                                 "entrance location is positive")
     except ValueError as value_error:
         self.assertEqual(True, True)
Example #8
0
class Game:
    def __init__(self):
        print("Starting server...")

        # Init vars
        Global.is_server = True  # Used for local client spawning

        # Initialise the database system
        Database.startup()

        # Create the dungeon
        self.dungeon = Dungeon()

        # Create the server interface
        self.server = Server(self.dungeon)

        # Create a client for the local player (for testing).
        self.do_shutdown = False
        #self.create_local_client()  # Comment this out unless a test client is desired

        # Run the game loop
        self.game_loop()

        # Shut down the database
        Database.shutdown()

    """The main game loop. This updates the dungeons and all player events"""

    def game_loop(self):
        while not self.do_shutdown:
            # Update the game
            self.dungeon.update()

            time.sleep(0.1)

        self.dungeon.destroy()

    """Creates the local client for testing"""

    def create_local_client(self):
        # Start the client thread
        threading.Thread(target=self.local_client_thread, daemon=True).start()

    """Local client thread for testing"""

    def local_client_thread(self):
        # Create a local client!
        from ClientApp import ClientApp
        ClientApp()

        # Client has closed, shutdown
        self.do_shutdown = True
Example #9
0
    def setUp(self):
        path = open("path.txt", "w")
        self.dung_map = """S.##......
#.##..###
#.###.###.
#.....###
###.####S"""
        path.write(self.dung_map)
        path.close()
        self.dungeon = Dungeon("path.txt")
        self.bron = Hero("Bron", 100, "DragonSlayer")
        self.orc = Orc("orc", 90, 1.4)
        self.bron.equip_weapon(Weapon("Mighty Axe", 25, 0.2))
        self.orc.equip_weapon(Weapon("basher", 16, 0.75))
Example #10
0
    def new(self):
        """Game class method to start a new game.

        """
        # start a new game
        # initialise sprite groups
        self.all_sprites = pygame.sprite.LayeredUpdates()
        self.walls = pygame.sprite.LayeredUpdates()
        self.gui = pygame.sprite.LayeredUpdates()
        self.enemies = pygame.sprite.LayeredUpdates()
        self.item_drops = pygame.sprite.LayeredUpdates()

        # instantiate dungeon
        self.dungeon = Dungeon(self, cfg.DUNGEON_SIZE)
        if self.loaded:
            self.dungeon.tileset = self.saveGame.data['tileset']
        else:
            self.dungeon.create()

        self.WSign = self.imageLoader.WarnSign
        self.WSign2 = self.imageLoader.WarnSign2

        self.inventory = Inventory(self)

        # spawn the player in the middle of the room
        self.player = Player(self, (cfg.WIDTH // 2, cfg.TILESIZE * 12))

        self.currentpistol = Pistol(self, self.player)
        self.currentmachine = MachineGun(self, self.player)

        if self.pistolpick == True:
            self.player.itemA = self.currentpistol

        elif self.machinegunpick == True:
            self.player.itemA = self.currentmachine

        # load settings
        if self.loaded:
            self.loadSavefile()

        # spawn the new objects (invisible)
        self.prev_room = self.dungeon.current_room_index
        self.transitRoom(self, self.dungeon)

        # create a background image from the tileset for the current room
        self.background = self.tileRoom(self, self.imageLoader.tileset,
                                        self.dungeon.current_room_index)

        self.run()
Example #11
0
 def test_check_for_enemy_down(self):
     d = Dungeon('map.txt', 'basic_loot_list_example.json')
     d.spawn(Hero("nz", "nz", 200, 120, 2))
     d.hero.learn(Spell("idk", 20, 20, 2))
     d.hero_place = [0, 5]
     d.change_map("H")
     result = d.check_for_enemy("down")
     self.assertEqual(result, 2)
Example #12
0
def create_dungeons(world):
    for dungeon_info in dungeon_table:
        name = dungeon_info['name']
        hint = dungeon_info['hint'] if 'hint' in dungeon_info else name

        if world.settings.logic_rules == 'glitched':
            if not world.dungeon_mq[name]:
                dungeon_json = os.path.join(data_path('Glitched World'),
                                            name + '.json')
            else:
                dungeon_json = os.path.join(data_path('Glitched World'),
                                            name + ' MQ.json')
        else:
            if not world.dungeon_mq[name]:
                dungeon_json = os.path.join(data_path('World'), name + '.json')
            else:
                dungeon_json = os.path.join(data_path('World'),
                                            name + ' MQ.json')

        world.load_regions_from_json(dungeon_json)

        boss_keys = ItemFactory(['Boss Key (%s)' % name] *
                                dungeon_info['boss_key'])
        if not world.dungeon_mq[dungeon_info['name']]:
            small_keys = ItemFactory(['Small Key (%s)' % name] *
                                     dungeon_info['small_key'])
        else:
            small_keys = ItemFactory(['Small Key (%s)' % name] *
                                     dungeon_info['small_key_mq'])
        dungeon_items = ItemFactory(
            ['Map (%s)' % name, 'Compass (%s)' % name] *
            dungeon_info['dungeon_item'])

        world.dungeons.append(
            Dungeon(world, name, hint, boss_keys, small_keys, dungeon_items))
Example #13
0
 def make_dungeon_from_dict(self, dungeon_dict):
     self.dungeon = Dungeon( dungeon_dict['name'], dungeon_dict['theme'],
                             dungeon_dict['next'], dungeon_dict['x'],
                             dungeon_dict['y'], dungeon_dict['roomstr'],
                             dungeon_dict['d_id'])
     self.enable_room_icons(True)
     self.view_dungeon_grid()
def create_dungeons(world):
    for dungeon_info in dungeon_table:
        name = dungeon_info['name']
        hint = dungeon_info['hint'] if 'hint' in dungeon_info else name
        font_color = dungeon_info['font_color'] if 'font_color' in dungeon_info else 'White'
        
        if world.settings.logic_rules == 'glitched':
            if not world.dungeon_mq[name]:
                dungeon_json = os.path.join(data_path('Glitched World'), name + '.json')
            else:
                dungeon_json = os.path.join(data_path('Glitched World'), name + ' MQ.json')
        else:
            if not world.dungeon_mq[name]:
                dungeon_json = os.path.join(data_path('World'), name + '.json')
            else:
                dungeon_json = os.path.join(data_path('World'), name + ' MQ.json')

        
        world.load_regions_from_json(dungeon_json)

        boss_keys = ItemFactory(['Boss Key (%s)' % name] * dungeon_info['boss_key'])
        if not world.dungeon_mq[dungeon_info['name']]:
            small_keys = ItemFactory(['Small Key (%s)' % name] * dungeon_info['small_key'])
        else:
            small_keys = ItemFactory(['Small Key (%s)' % name] * dungeon_info['small_key_mq'])           
        dungeon_items = ItemFactory(['Map (%s)' % name, 
                                     'Compass (%s)' % name] * dungeon_info['dungeon_item'])
        if world.settings.shuffle_mapcompass in ['any_dungeon', 'overworld']:
            for item in dungeon_items:
                item.priority = True

        world.dungeons.append(Dungeon(world, name, hint, font_color, boss_keys, small_keys, dungeon_items))
 def setUp(self):
     self.my_hero = Hero("Bron", "Dragonslayer", 100, 50, 2)
     self.my_map = [['S', '.', '#', '#', '.', '.', '.', '.', '.', 'T'],
                    ['#', 'T', '#', '#', '.', '.', '#', '#', '#', '.'],
                    ['#', '.', '#', '#', '#', 'E', '#', '#', '#', 'E'],
                    ['#', '.', 'E', '.', '.', '.', '#', '#', '#', '.'],
                    ['#', '#', '#', 'T', '#', '#', '#', '#', '#', 'G']]
     self.my_dungeon = Dungeon(self.my_hero, self.my_map)
Example #16
0
    def reset(self):
        with open(self.filename) as file:
            line = file.readline()
            dimL = line.split(" ")
            n = int(dimL[0])
            m = int(dimL[1])
            self.Dungeon = Dungeon(n, m)
            self.X = self.Dungeon.size_x
            self.Y = self.Dungeon.size_y
            self.start_position = self.Dungeon.start_position
            for i in range(n):
                line = file.readline()
                ElemL = line.split(" ")
                for j in range(m):
                    elmnt = ElemL[j][:1]
                    self.add_element(elmnt, i, j)

        self.Adventurer = Adventurer(self)
def main():
    c_bid = 0.1
    random.seed(0)
    dungeon = Dungeon(30, 40)
    random.seed()
    simulator1 = RoomGraphSimulator(dungeon)
    simulator2 = CellMoveSimulator({}, dungeon)
    simulator3 = Simulator2({}, dungeon)

    destination_map = learn_room_move(simulator1)
    print(destination_map)

    q = np.random.random((5, 13, 12, 5, 5, 5, 5, 5))
    eps = np.full((5, 13, 12, 5, 5, 5, 5), 0.99)

    max_step = 400000

    file = open('profit_sharing_log_0_.csv', "w")
    for step in range(max_step):
        state = simulator2.info()
        sum_reward = 0
        turn = 0
        rules = []
        while not state['isEnd']:
            s = state_tuple(state)
            action = int(select_action(q[s], eps[s]))
            eps[s] *= 0.99
            rules.append((*s, action))

            reward = simulator2.action({
                'action':
                action,
                'nextRoomId':
                destination_map[state['roomId']]
            })
            if reward == -1:
                sum_reward += reward
            else:
                sum_reward += reward
            state = simulator2.info()
            turn += 1
        for rule in rules:
            q[rule] = q[rule] + c_bid * (sum_reward - q[rule])
        simulator2.reset()
        print(step, '/', max_step, 'reward:', sum_reward, 'turn:', turn)
        file.write(f'{step},{sum_reward},{turn}\n')
        if step % (max_step // 10) == 0:
            test(simulator3, q)
    file.close()

    np.save('q_table1_0_.npy', destination_map)
    np.save('q_table2_0_.npy', q)

    for _ in range(15):
        test(simulator3, q)
        time.sleep(1)
Example #18
0
    def __load_dungeon(self, id):
        self.position = (-1, -1)
        self.playerFacing = NORTH

        d = self.game_engine.get_object('dungeon')
        self.dungeon_id = id
        d.remove_from_engine()
        self.game_engine.remove_object('dungeon')
        self.game_engine.add_object('dungeon', Dungeon(self.dungeon_id))
        self.remove_keys()
Example #19
0
 def setUpClass(cls):
     """
     This class method setup the dungeon generator once and it can be used
     in the test classes below. Otherwise it generates every time and because
     there is a random generation in the dungeon generator and it saves time.
     """
     cls.nrows = 20
     cls.ncols = 20
     cls.dungeon = Dungeon(cls.nrows, cls.ncols)
     cls.dungeon.dungeon_generator()
Example #20
0
    def create_dungeon_cb(self, widget, data):
        name = data['name'].get_text()
        theme = data['theme'].get_active()  #.get_active_text()
        next = find_key( data['d_list'], data['next_dungeon'].get_active_text())
        width = data['width'].get_value_as_int()
        height = data['height'].get_value_as_int()

        self.dungeon = Dungeon( name, theme, next, width, height )
        self.enable_room_icons(True)
        self.view_dungeon_grid()
Example #21
0
def main():
    inp = input(
        "Please write how many rows and how many columns you want in the format: rows cols ").split(' ')
    dung = Dungeon.generate_map(int(inp[0]), int(inp[1]))

    while True:
        direction = input(
            "Please write down a direction (up, down, left, right) or 'fight' to kill the closest enemy: ")
        if not dung.move_hero(direction):
            print("Cannot move that way!")
Example #22
0
    def enterAction(self):
        super(InitializationMode, self).enterAction()
        try:
            del (self.game.dungeon)
        except:
            pass

        self.game.dungeon = Dungeon(self.game.screen.get_width(),
                                    self.game.screen.get_height(), 10, 10)
        pass
Example #23
0
    def get_show_exits_response(self, intent_request, session):
        data = {
            "card_title": "Show Exits Request",
            "card_output": "Show Exits card output",
            "request_name": "show_exits",
            "should_end_session": False,
            "speech_output": "",
            "session_attributes": {},
        }

        session_attributes = session["attributes"]

        dungeon = Dungeon(session_attributes["dungeon_data"])
        player = Player(session_attributes["player_data"])

        data["speech_output"] = dungeon.get_room_layout_text(player.data["position"])

        data["session_attributes"] = session_attributes

        return data
Example #24
0
    def __init__(self, param, dungeon=None):
        self.random_enemy = param.get('randomEnemy', False)
        if dungeon is None:
            self.dungeon = Dungeon(30, 40, no_generate_enemy=self.random_enemy)
        else:
            self.dungeon = dungeon
        self.is_end = False
        self.friend_agent: Friend = None
        self.turn = 0

        self.first_room = param.get('firstRoom', None)
        self.no_enemy = param.get('noEnemy', False)
        self.max_turn = param.get('maxTurn', 1500)

        self.map = self.dungeon.floor_map.copy()
        self.map[self.map == CellInfo.PROTECTED] = CellInfo.ROOM
        self.map[self.map == CellInfo.ENEMY] = CellInfo.ROOM

        self.enemy_list = [Enemy(-1, -1), Enemy(-1, -1)]
        self.reset()
Example #25
0
class SUD:
    def __init__(self):
        self.myDungeon = 0

    # start the dungeon loop
    def Run(self):
        self.myDungeon = Dungeon()
        self.myDungeon.Init()

        while True:
            self.Process()

    def Process(self):

        # on server
        self.myDungeon.DisplayCurrentRoom()  #-> send text to client

        # on client
        key = input(">")

        #on server
        user_input = key.split(' ')

        user_input = [x for x in user_input if x != '']

        if user_input[0].lower() == 'help':
            print("do help")
        else:
            if user_input[0].lower() == "go":
                if self.myDungeon.isValidMove(user_input[1].lower()):
                    self.myDungeon.MovePlayer(user_input[1].lower())
                else:
                    self.handleBadInput()
            else:
                self.handleBadInput()

    # on server  #-> send text to client
    def handleBadInput(self):
        print("\n ERROR")
        print("press any key to continue")
        input()
    def create_quest(self, loc_id, player_id):
        dungeonInst = Dungeon()
        charInst = Character()
        level = charInst.get_char_level(18)
        dung_id = dungeonInst.create_dungeon(level, loc_id, player_id)
        reward = randint(50, 200)
        typeInt = randint(1, 3)
        #set the type
        if (typeInt == 1):
            typeChar = 'K'
            description = "Kill this monster"
        elif (typeInt == 2):
            typeChar = 'F'
            description = "Fetch an item for me"
        elif (typeInt == 3):
            typeChar = 'R'
            description = "Rescue my buddy"
        #set the experience
        if (level < 5):
            experience = randint(100, 800)
        else:
            experience = randint(1000, 3000)

        self.connection.cursor.execute(
            """CALL Test.create_quest('{}','{}', '{}', '{}', '{}', '{}')""".
            format(reward, description, typeChar, loc_id, experience, dung_id))
        self.connection.conn.commit()

        self.connection.cursor.execute(
            """SELECT quest_id FROM Quest WHERE Quest.dungeon_id = {}""".
            format(dung_id))

        quest_id = self.connection.cursor.fetchall()[0][0]

        self.connection.cursor.execute(
            """INSERT INTO Quest_log (character_id, quest_id) VALUES ({}, {})"""
            .format(player_id, quest_id))

        self.connection.conn.commit()

        return description
Example #27
0
    def __init__(self, row=30, column=40):
        self.dungeon = Dungeon(row, column)
        self.is_end = False
        self.friend_agent = None

        # 保護解除したマップ
        self.map = self.dungeon.floor_map.copy()
        self.map[self.map == CellInfo.PROTECTED] = CellInfo.ROOM
        self.map[self.map == CellInfo.ENEMY] = CellInfo.ROOM

        self.enemy_list = []
        self.reset()
Example #28
0
    def get_go_response(self, intent_request, session):
        data = {
            "card_title": "Go Request",
            "card_output": "Go card output",
            "request_name": "go",
            "should_end_session": False,
            "speech_output": "",
            "session_attributes": {},
        }

        direction = intent_request["intent"]["slots"]["Direction"]["value"]

        session_attributes = session["attributes"]

        dungeon = Dungeon(session_attributes["dungeon_data"])
        player = Player(session_attributes["player_data"])
        pos = player.data["position"]

        if dungeon.move_is_allowed(pos, direction):
            if direction == "north":
                pos["y"] = pos["y"] - 1
            if direction == "south":
                pos["y"] = pos["y"] + 1
            if direction == "east":
                pos["x"] = pos["x"] + 1
            if direction == "west":
                pos["x"] = pos["x"] - 1

            player.data["position"] = pos
            session_attributes["player_data"] = player.data

            data["speech_output"] = dungeon.get_room_entry_text(pos)
        else:
            data["speech_output"] = "You cannot travel " + direction + ". "

        data["session_attributes"] = session_attributes

        return data
Example #29
0
    def setUp(self):
        path = open("path.txt", "w")
        self.dung_map = """S.##......
#.##..###
#.###.###.
#.....###
###.####S"""
        path.write(self.dung_map)
        path.close()
        self.dungeon = Dungeon("path.txt")
        self.bron = Hero("Bron", 100, "DragonSlayer")
        self.orc = Orc("orc", 90, 1.4)
        self.bron.equip_weapon(Weapon("Mighty Axe", 25, 0.2))
        self.orc.equip_weapon(Weapon("basher", 16, 0.75))
Example #30
0
    def on_launch(self, launch_request, session):
        card_title         = 'Launch'
        card_output        = 'Launch card'
        speech_output      = ''
        reprompt_text      = 'I\'m sorry, I didn\'t quite catch that.'
        should_end_session = False

        dungeon = Dungeon(None)
        player  = Player(None)

        text = 'You find yourself in a dark room. It is cold. You are alone. '
        text = text + dungeon.get_room_look_text(player.data['position'])
        text = text + dungeon.get_room_layout_text(player.data['position'])

        speech_output = text

        session_attributes = {
            'dungeon_data': dungeon.data,
            'player_data': player.data,
        }

        speechlet = self._build_speechlet_response(card_title, card_output, speech_output, reprompt_text, should_end_session)

        return self._build_response(session_attributes, speechlet)
Example #31
0
    def __init__(self):
        print("Starting server...")

        # Init vars
        Global.is_server = True  # Used for local client spawning

        # Initialise the database system
        Database.startup()

        # Create the dungeon
        self.dungeon = Dungeon()

        # Create the server interface
        self.server = Server(self.dungeon)

        # Create a client for the local player (for testing).
        self.do_shutdown = False
        #self.create_local_client()  # Comment this out unless a test client is desired

        # Run the game loop
        self.game_loop()

        # Shut down the database
        Database.shutdown()
Example #32
0
    def __init__(self, dungeon=None):
        if dungeon is None:
            self.dungeon = Dungeon(30, 40)
        else:
            self.dungeon = dungeon
        self.is_end = False

        # 部屋のグラフを指す隣接行列
        self.map = [[0] * 5 for _ in range(5)]
        for road in self.dungeon.roads:
            room1_id = road.connected_rooms[0].id
            room2_id = road.connected_rooms[1].id
            self.map[room1_id][room2_id] = len(road.cells)
            self.map[room2_id][room1_id] = len(road.cells)

        self.goal_room_id = self.dungeon.goal_room_index

        self.first_room_index_candidate = list(range(5))
        self.first_room_index_candidate.remove(self.goal_room_id)
        self.agent_room_id = random.choice(self.first_room_index_candidate)
Example #33
0
    def test_extract_loot(self):
        e = None
        expected = {
            "loot": {
                "weapons": {
                    "0": {
                        "name": "Winter",
                        "damage": 45
                    },
                    "1": {
                        "name": "Quickfang",
                        "damage": "AARD"
                    }
                },
                "spells": {
                    "0": {
                        "name": "AARD",
                        "damge": 20,
                        "mana_cost": 10,
                        "cast_range": 3
                    },
                    "1": {
                        "name": "IGNI",
                        "damge": 50,
                        "mana_cost": 30,
                        "cast_range": 1
                    }
                }
            }
        }

        try:
            res = Dungeon.extract_loot_dictionary("basic_loot_list_example.json")
        except Exception as exc:
            e = exc

        self.assertIsNone(e)
        self.assertEqual(res, expected)
    def __init__(self):
        GameEngineElement.__init__(self, has_draw=False, has_event=True)
        self.add_to_engine()

        game_size_ratio_x = self.game_engine.width/1200.0
        game_size_ratio_y = self.game_engine.height/900.0

        term_width_offset = game_size_ratio_x * 200
        term_height = game_size_ratio_y * 200
        term_height_offset = game_size_ratio_y * 700
        term_width = game_size_ratio_x * 1000

        """
        term_width_offset = self.game_engine.width/4
        term_height = self.game_engine.height/6
        term_height_offset = self.game_engine.height - term_height
        term_width = self.game_engine.width - term_width_offset
        """

        self.game_engine.add_object('mesg', TermBox(term_width_offset, term_height_offset,term_width,term_height,5) )
        self.game_engine.get_object('mesg').add_line("Welcome to Fortune Hunter")

        self.game_engine.add_object('dungeon', Dungeon( self.game_engine.get_object('profile').dungeon_id))
Example #35
0
def parse(inputStream):
    dungeon = Dungeon()
    start_point = None
    end_point = None
    for line in inputStream:
        if line == '\n':
            continue
        line = line.replace('\n', '')

        # parse start_point and end_point
        if re.match(r'^\S+ \S+$',
                    line) and start_point is None and end_point is None:
            start_point, end_point = line.split()

        # parse edge with type
        elif re.match(
                r'^\S+ \S+ \d+ [ud]$',
                line) and start_point is not None and end_point is not None:
            start, end, dist, edge_type = line.split()
            try:
                dungeon.add_edge(start, end, int(dist), edge_type)
            except Exception as msg:
                return dungeon, start_point, end_point, msg

        # parse edge without type (by default, the edge is oriented)
        elif re.match(
                r'^\S+ \S+ \d+$',
                line) and start_point is not None and end_point is not None:
            start, end, dist = line.split()
            try:
                dungeon.add_edge(start, end, int(dist))
            except Exception as msg:
                return dungeon, start_point, end_point, msg

        else:
            return dungeon, start_point, end_point, 'Invalid input'

    if start_point is None or end_point is None:
        return dungeon, start_point, end_point, 'Invalid input'

    return dungeon, start_point, end_point, None
 def test_pick_treasure(self):
     my_dict = Dungeon.load_treasure_file("treasures.json")
     x = self.my_dungeon.pick_treasure(my_dict)
     x = x[:15]
     needed = "Bron's treasure"
     self.assertEqual(x, needed)
Example #37
0
class Game:
    """This class is main Game class.

    """
    def __init__(self):
        """__init__ method for Game class.

        """
        # initialise game window, settings etc.
        pygame.mixer.pre_init(44100, -16, 2, 2048)
        pygame.mixer.init()
        pygame.init()
        pygame.mouse.set_visible(False)
        pygame.key.set_repeat(10, cfg.KEY_DELAY)

        self.actual_screen = pygame.display.set_mode(
            (cfg.S_WIDTH, cfg.S_HEIGHT))
        #self.actual_screen = pygame.display.set_mode((cfg.S_WIDTH, cfg.S_HEIGHT), pygame.FULLSCREEN)

        self.screen = pygame.Surface((cfg.WIDTH, cfg.HEIGHT))

        self.clock = pygame.time.Clock()
        self.running = True
        self.loaded = False
        self.dircheck = None

        # booleans for drawing the hit rects and other debug stuff
        self.debug = False
        self.draw_vectors = False
        self.show_player_stats = False
        self.caption = ''

        self.key_down = None
        self.state = 'GAME'
        self.in_transition = False

        self.loadAssets()
        self.clearcount = 0
        self.check = True
        self.timer = 0
        self.levelcleared = 1
        self.pistolpick = True
        self.machinegunpick = False
        self.lastweapon = 'MachineGun'
        self.spritecheck = []

    def keyDown(self, events, game):
        """Game class method for checking keys presses.

        Args:
            events (<Event>): key press events.
            game (Integrate.Game): Integrate.Game class object.

        """
        for event in events:
            if event.type == pygame.KEYUP:
                if event.key == cfg.KEY_RIGHT:
                    game.player.RightCheck = False
                if event.key == cfg.KEY_UP:
                    game.player.UpCheck = False
                if event.key == cfg.KEY_LEFT:
                    game.player.LeftCheck = False
                if event.key == cfg.KEY_DOWN:
                    game.player.DownCheck = False

    def transitRoom(self, game, dungeon, offset=pygame.math.Vector2(0, 0)):
        """Game class method for room transition.

        Args:
            game (Integrate.Game): Integrate.Game class object.
            dungeon (Dungeon.Dungeon): Dungeon.Dungeon object

        """
        # get the index of the next and the previous room
        index_next = dungeon.current_room_index
        index_prev = game.prev_room
        # select the rooms based on the indices
        room_prev = dungeon.room_matrix[index_prev[0]][index_prev[1]]
        room_next = dungeon.room_matrix[index_next[0]][index_next[1]]

        # remove all sprite from the previous room
        room_prev.object_data = []

        for sprite in game.all_sprites:
            if sprite != game.player and sprite not in game.item_drops:
                if hasattr(sprite, 'data'):
                    room_prev.object_data.append(sprite.data)
                sprite.kill()

        if room_next.visited == False:
            # if room not visited, get the object data from the initial layout
            data = room_next.layout
            for d in data:
                try:
                    if offset == (0, 0):
                        self.create(game, d)
                    else:
                        self.create(game, d, offset)
                except Exception:
                    traceback.print_exc()
                    pass

            room_next.visited = True

        else:
            # if room already visited, get the objects from the stored data
            data = room_next.object_data
            for d in data:
                try:
                    if offset == (0, 0):
                        self.create(game, d)
                    else:
                        self.create(game, d, offset)
                except Exception:
                    traceback.print_exc()
                    pass

        # set the dungeon's current room based on room index
        dungeon.room_current = dungeon.room_matrix[
            dungeon.current_room_index[0]][dungeon.current_room_index[1]]

    def create(self, game, data, offset=pygame.math.Vector2(0,
                                                            cfg.GUI_HEIGHT)):
        """Game class method for room transition.

        Args:
            game (Integrate.Game): Integrate.Game class object.
            data (dict{'id', 'name', 'x', 'y', 'width', 'height'}): objects data

        """
        # takes a dictionary of sprite properties
        name = data['name']
        # capitalizing first letter
        name_1 = name[0].capitalize()
        name_2 = name[1:]
        name = name_1 + name_2

        #instantiate the sprite
        spr = module_dict[name](game,
                                (data['x'] + offset.x, data['y'] + offset.y),
                                (data['width'], data['height']))

        for key, value in data.items():
            try:
                setattr(spr, key, value)
            except:
                print('cant set value of {0} for {1}'.format(key, spr))

        if hasattr(spr, 'on_create'):
            # do initialisation stuff after ___init__()
            spr.on_create()

        spr.data = data

    def loadAssets(self):
        """Game class method to load all assets.

        """
        #loading assets (images, sounds)
        self.imageLoader = ImageLoader(self)
        self.soundLoader = snd.Sound()
        try:
            self.imageLoader.load_assets()
            self.soundLoader.load()
        except Exception:
            traceback.print_exc()
            self.running = False

    def new(self):
        """Game class method to start a new game.

        """
        # start a new game
        # initialise sprite groups
        self.all_sprites = pygame.sprite.LayeredUpdates()
        self.walls = pygame.sprite.LayeredUpdates()
        self.gui = pygame.sprite.LayeredUpdates()
        self.enemies = pygame.sprite.LayeredUpdates()
        self.item_drops = pygame.sprite.LayeredUpdates()

        # instantiate dungeon
        self.dungeon = Dungeon(self, cfg.DUNGEON_SIZE)
        if self.loaded:
            self.dungeon.tileset = self.saveGame.data['tileset']
        else:
            self.dungeon.create()

        self.WSign = self.imageLoader.WarnSign
        self.WSign2 = self.imageLoader.WarnSign2

        self.inventory = Inventory(self)

        # spawn the player in the middle of the room
        self.player = Player(self, (cfg.WIDTH // 2, cfg.TILESIZE * 12))

        self.currentpistol = Pistol(self, self.player)
        self.currentmachine = MachineGun(self, self.player)

        if self.pistolpick == True:
            self.player.itemA = self.currentpistol

        elif self.machinegunpick == True:
            self.player.itemA = self.currentmachine

        # load settings
        if self.loaded:
            self.loadSavefile()

        # spawn the new objects (invisible)
        self.prev_room = self.dungeon.current_room_index
        self.transitRoom(self, self.dungeon)

        # create a background image from the tileset for the current room
        self.background = self.tileRoom(self, self.imageLoader.tileset,
                                        self.dungeon.current_room_index)

        self.run()

    def checkFight(self, game):
        """Game class method to check distance from door and closes the doors 
           and opens them when player defeats all enemies in the room
        
        """
        room = game.dungeon.room_current
        if len(game.enemies) > 0:
            room.cleared = False
        else:
            if not room.is_doors_shut:
                room.cleared = True
                return

        # check if the room's doors are closed
        if room.is_doors_shut == False:
            # check player's position
            margin_x = 5 * cfg.TILESIZE_SMALL
            margin_y = 5.5 * cfg.TILESIZE_SMALL + cfg.GUI_HEIGHT
            rect = pygame.Rect((margin_x, margin_y),
                               (cfg.WIDTH - 2 * margin_x,
                                cfg.HEIGHT - cfg.GUI_HEIGHT - margin_y))
            if rect.colliderect(game.player.hit_rect):
                # player is far enough in the room to shut the doors
                room.shut_doors()
                game.soundLoader.get['roomLocked'].play()

        else:
            if len(game.enemies) == 0:
                # if all enemies are defeated, open the doors
                room.open_doors()
                game.soundLoader.get['roomCleared'].play()
                room.cleared = True

    def get_inputs(self, game):
        """Game class method to load all assets store keyboard inputs in a key map
        
        """
        game.keys = {
            'A': False,
            'B': False,
            'X': False,
            'Y': False,
            'L': False,
            'BACK': False,
            'START': False,
            'STICK_L_PRESSED': False,
            'STICK_R_PRESSED': False,
            'STICK_R': pygame.math.Vector2(0, 0),
            'STICK_L': pygame.math.Vector2(0, 0),
            'DPAD': pygame.math.Vector2(0, 0),
            'DPAD_MENU': pygame.math.Vector2(0, 0)
        }

        key = game.keys

        # get keyboard keys
        get_keys = pygame.key.get_pressed()
        if get_keys[cfg.KEY_RIGHT]:
            game.player.RightCheck = True
        elif get_keys[cfg.KEY_LEFT]:
            game.player.LeftCheck = True
        if get_keys[cfg.KEY_DOWN]:
            game.player.DownCheck = True
        elif get_keys[cfg.KEY_UP]:
            game.player.UpCheck = True

        get_mkeys = pygame.mouse.get_pressed()

        key['A'] = get_mkeys == cfg.KEY_A or key['A']
        key['B'] = game.key_down == cfg.KEY_B or key['B']
        key['X'] = game.key_down == cfg.KEY_ENTER or key['X']

        key['START'] = get_keys[cfg.KEY_MENU]

    def run(self):
        """Game class method to start running infinite loop until quit.

        """
        # game loop
        self.playing = True
        while self.playing:
            #reset game screen
            self.screen = pygame.Surface((cfg.WIDTH, cfg.HEIGHT))
            self.dt = self.clock.tick(cfg.FPS) / 1000
            self.events()
            self.get_inputs(self)
            self.update()
            self.draw()

    def events(self):
        """Game class method to loop game events.

        """
        # game loop events
        self.event_list = pygame.event.get()
        for event in self.event_list:
            if event.type == pygame.QUIT:
                if self.playing:
                    self.playing = False
                self.running = False
                pygame.quit()
                quit()
            if event.type == pygame.KEYDOWN:
                # Key events
                if event.key == pygame.K_r and self.debug:
                    self.loaded = False
                    self.new()

                if event.key == pygame.K_h:
                    self.debug = not self.debug

                if event.key == pygame.K_k and self.debug:
                    # kill all enemies
                    for e in self.enemies:
                        e.hp = 0

    def screenWrap(self, player, dungeon):
        """Game class method to check if the player goes outside the screen
           if they do, set their new position based on where they went

        """
        index = list(dungeon.current_room_index)
        direction = ''
        new_pos = pygame.math.Vector2(player.hit_rect.center)
        if player.hit_rect.left < cfg.TILESIZE:
            direction = (-1, 0)
            player.vel = pygame.math.Vector2(0, 0)
            new_pos.x = cfg.WIDTH - player.hit_rect.width - cfg.TILESIZE
            index[1] -= 1
        elif player.hit_rect.right > cfg.WIDTH - cfg.TILESIZE:
            player.vel = pygame.math.Vector2(0, 0)
            direction = (1, 0)
            new_pos.x = player.hit_rect.width + cfg.TILESIZE
            index[1] += 1
        elif player.hit_rect.top < cfg.GUI_HEIGHT + cfg.TILESIZE:
            player.vel = pygame.math.Vector2(0, 0)
            direction = (0, -1)
            new_pos.y = cfg.HEIGHT - player.hit_rect.height - cfg.TILESIZE
            index[0] -= 1
        elif player.hit_rect.bottom > cfg.HEIGHT - cfg.TILESIZE:
            player.vel = pygame.math.Vector2(0, 0)
            direction = (0, 1)
            new_pos.y = player.hit_rect.height + cfg.GUI_HEIGHT + cfg.TILESIZE
            index[0] += 1

        try:
            return direction, index, new_pos
        except Exception:
            traceback.print_exc()

    def update(self):
        """Game class method update game situation.

        """

        if self.pistolpick == True:
            self.player.itemA = self.currentpistol

        elif self.machinegunpick == True:
            self.player.itemA = self.currentmachine

        if self.debug:
            self.caption = (str(round(self.clock.get_fps(), 2)))

        else:
            self.caption = cfg.TITLE

        pygame.display.set_caption(self.caption)

        # check for key presses
        self.key_down = self.keyDown(self.event_list, self)

        if self.state == 'GAME':
            pygame.mouse.set_visible(False)
            self.all_sprites.update()

            self.inventory.update()
            # check for room transitions on screen exit (every frame)
            self.direction, self.new_room, self.new_pos = self.screenWrap(
                self.player, self.dungeon)

            if self.direction == UP:
                self.dircheck = UP
            elif self.direction == DOWN:
                self.dircheck = DOWN
            elif self.direction == LEFT:
                self.dircheck = LEFT
            elif self.direction == RIGHT:
                self.dircheck = RIGHT

            if self.new_room != self.dungeon.current_room_index:
                self.prev_room = self.dungeon.current_room_index
                self.dungeon.current_room_index = self.new_room
                self.state = 'TRANSITION'

            # When in a fight, shut the doors:
            if not self.dungeon.room_current.cleared:
                self.checkFight(self)

            if self.check:
                if self.dungeon.room_current.cleared:
                    a = self.clearcount
                    self.clearcount = self.clearcount + 1
                    self.spritecheck = []
                    if a + 1 == self.clearcount:
                        self.check = False

        elif self.state == 'MENU' or self.state == 'MENU_TRANSITION':
            pygame.mouse.set_visible(True)
            self.inventory.update()

        elif self.state == 'TRANSITION':
            #self.RoomTransition(self.new_pos, self.direction)
            # ^this went into draw()
            pass

        elif self.state == 'CUTSCENE':
            self.walls.update()

    def WinSit(self):
        """Game class method to check if player won then show next screen.

        """
        global Dx, Dy

        if self.dungeon.room_current.type == "endboss" and self.dungeon.room_current.cleared:
            pygame.mouse.set_visible(True)
            self.state = 'WIN'
            self.actual_screen.blit(self.imageLoader.WinImg, (0, 0))
            self.Quitbtn = Button(400, 450, 150, 50, 'Quit', (200, 20, 20, 0),
                                  (180, 0, 0, 0), self.imageLoader.font1,
                                  self.imageLoader.font2)
            self.Nextbtn = Button(200, 450, 150, 50, 'Next', (200, 20, 20, 0),
                                  (180, 0, 0, 0), self.imageLoader.font1,
                                  self.imageLoader.font2)
            self.Quitbtn.show(self.imageLoader.WinImg)
            self.Nextbtn.show(self.imageLoader.WinImg)
            if self.Quitbtn.is_mouse_clicked():
                pygame.quit()
                quit()
            if self.Nextbtn.is_mouse_clicked():
                self.levelcleared += 1
                self.clearcount = 0
                self.check = True
                cfg.DUNGEON_SIZE = (Dx, Dy)
                self.state = 'GAME'
                self.new()
                Dx = Dx + 1
                Dy = Dy + 1

    def GameOverr(self):
        """Game class method to check if player is dead and game is over.

        """
        global Dx, Dy
        if self.player.Dead == True:
            self.state = 'GAME OVER'
            pygame.mouse.set_visible(True)
            self.actual_screen.blit(self.imageLoader.GameOverImg, (0, 0))
            self.Quitbtn = Button(400, 450, 150, 50, 'Quit', (200, 20, 20, 0),
                                  (180, 0, 0, 0), self.imageLoader.font1,
                                  self.imageLoader.font2)
            self.Nextbtn = Button(200, 450, 150, 50, 'Restart',
                                  (200, 20, 20, 0), (180, 0, 0, 0),
                                  self.imageLoader.font1,
                                  self.imageLoader.font2)
            self.Quitbtn.show(self.imageLoader.GameOverImg)
            self.Nextbtn.show(self.imageLoader.GameOverImg)
            if self.Quitbtn.is_mouse_clicked():
                pygame.quit()
                quit()
            if self.Nextbtn.is_mouse_clicked():
                self.levelcleared = 1
                self.clearcount = 0
                Dx = 5
                Dy = 5
                self.pistolpick = True
                self.machinegunpick = False
                self.check = True
                cfg.DUNGEON_SIZE = (Dx, Dy)
                self.state = 'GAME'
                self.new()

    def draw(self):
        """Game class method to draw

        """
        if self.state != 'TRANSITION':
            # draw the background (tilemap)
            self.screen.blit(self.background, (0, cfg.GUI_HEIGHT))
            # call additional draw methods (before drawing)
            for sprite in self.all_sprites:
                if hasattr(sprite, 'draw_before'):
                    sprite.draw_before()
            # draw the sprites
            self.all_sprites.draw(self.screen)

            for sprite in self.all_sprites:
                if hasattr(sprite, 'draw_after'):
                    sprite.draw_after()

            # for machine gun with player
            if self.machinegunpick and self.player.itemA == self.currentmachine:
                if self.player.itemA.check and self.player.mana < 9.8:
                    self.WSignRect = self.WSign.get_rect()
                    self.WSignRect.center = pygame.mouse.get_pos(
                    ) - pygame.math.Vector2(0, 30)
                    self.screen.blit(self.WSign, self.WSignRect)

                if self.player.itemA.check and self.player.mana > 9.8:
                    self.WSignRect = self.WSign2.get_rect()
                    self.WSignRect.center = pygame.mouse.get_pos(
                    ) - pygame.math.Vector2(0, 30)
                    self.screen.blit(self.WSign2, self.WSignRect)

                if self.player.mana < 0.2:
                    self.cursor = self.imageLoader.CursorMain1
                elif self.player.mana < 1.4:
                    self.cursor = self.imageLoader.cursor[0]
                elif self.player.mana < 2.8:
                    self.cursor = self.imageLoader.cursor[1]
                elif self.player.mana < 4.2:
                    self.cursor = self.imageLoader.cursor[2]
                elif self.player.mana < 5.6:
                    self.cursor = self.imageLoader.cursor[3]
                elif self.player.mana < 7:
                    self.cursor = self.imageLoader.cursor[4]
                elif self.player.mana < 8.4:
                    self.cursor = self.imageLoader.cursor[5]
                elif self.player.mana < 9.8:
                    self.cursor = self.imageLoader.cursor[6]
                elif self.player.mana < 11.4:
                    self.cursor = self.imageLoader.cursor[7]

                self.cursorrect = self.cursor.get_rect()
                self.cursorrect.center = pygame.mouse.get_pos()
                self.screen.blit(self.cursor, self.cursorrect)

            else:
                self.cursor = self.imageLoader.CursorMain1
                self.cursorrect = self.cursor.get_rect()
                self.cursorrect.center = pygame.mouse.get_pos()
                self.screen.blit(self.cursor, self.cursorrect)

        else:
            self.RoomTransition(self.new_pos, self.direction)
            if not self.dungeon.room_current.cleared:
                self.check = True

        # ----- DEBUG STUFF ----- #
        # draw hitboxes in debug mode
        if self.debug:
            for sprite in self.all_sprites:
                if hasattr(sprite, 'hit_rect'):
                    pygame.draw.rect(self.screen, cfg.CYAN, sprite.hit_rect, 1)
                if hasattr(sprite, 'interact_rect'):
                    pygame.draw.rect(self.screen, cfg.GREEN,
                                     sprite.interact_rect, 1)

        # draw the inventory
        self.drawGUI()
        self.screen = pygame.transform.scale(self.screen,
                                             (cfg.S_WIDTH, cfg.S_HEIGHT))
        self.actual_screen.blit(self.screen, (0, 0))
        self.WinSit()
        self.GameOverr()
        pygame.display.update()

    def drawGUI(self):
        """Game class method draw inventory with map.

        """
        self.inventory.map_img = self.dungeon.render_rooms_map()
        self.inventory.draw()

    def tileRoom(self, game, tileset, index):
        """Game class method render room tiles.

        """
        image = pygame.Surface((cfg.WIDTH, cfg.HEIGHT - cfg.GUI_HEIGHT))
        data = game.dungeon.room_matrix[index[0]][index[1]].tiles

        for i in range(len(data)):
            for j in range(len(data[i])):
                x = j * cfg.TILESIZE
                y = i * cfg.TILESIZE
                try:
                    image.blit(tileset[data[i][j]], (x, y))
                except Exception:
                    traceback.print_exc()
                    return

        return image

    def RoomTransition(self, new_pos, direction):
        """Game class method for room transition.

        Args:
            new_pos (tuple): tuple with x,y corrdinates for the new room for player
            direction (Up, DOWN, LEFT OR RIGHT): direction of start in new room

        """
        if not self.in_transition:
            # store the old background image temporarily
            self.old_background = self.background

            # blit the background and sprites to prevent flickering
            self.screen.blit(self.old_background, (0, cfg.GUI_HEIGHT))
            self.all_sprites.draw(self.screen)

            # build the new room
            self.background = self.tileRoom(self, self.imageLoader.tileset,
                                            self.dungeon.current_room_index)

            # scroll the new and old background
            # start positions for the new bg are based on the direction the
            # player is moving
            start_positions = {
                UP: pygame.math.Vector2(0, -(cfg.HEIGHT - cfg.GUI_HEIGHT * 2)),
                DOWN: pygame.math.Vector2(0, cfg.HEIGHT),
                LEFT: pygame.math.Vector2(-cfg.WIDTH, cfg.GUI_HEIGHT),
                RIGHT: pygame.math.Vector2(cfg.WIDTH, cfg.GUI_HEIGHT)
            }

            self.bg_pos1 = start_positions[direction]
            # pos2 is the old bg's position that gets pushed out of the screen
            self.bg_pos2 = pygame.math.Vector2(0, cfg.GUI_HEIGHT)
            self.in_transition = True

            self.transitRoom(self, self.dungeon, self.bg_pos1)

        else:
            if self.bg_pos1 != (0, cfg.GUI_HEIGHT):
                # moves the 2 room backrounds until the new background is at (0,0)
                # PROBLEM: Only works with certain scroll speeds!

                # calculate the move vector based on the direction
                move = (pygame.math.Vector2(0, 0) -
                        direction) * cfg.SCROLLSPEED

                # move the background surfaces
                self.bg_pos1 += move
                self.bg_pos2 += move

                if direction == UP:
                    self.bg_pos1.y = min(cfg.GUI_HEIGHT, self.bg_pos1.y)
                elif direction == DOWN:
                    self.bg_pos1.y = max(cfg.GUI_HEIGHT, self.bg_pos1.y)
                elif direction == LEFT:
                    self.bg_pos1.x = min(0, self.bg_pos1.x)
                elif direction == RIGHT:
                    self.bg_pos1.x = max(0, self.bg_pos1.x)

                # move the sprites during transition
                for sprite in self.all_sprites:
                    sprite.rect.topleft += move
                    sprite.hit_rect.topleft += move
                    sprite.pos += move

                self.screen.blit(self.old_background, self.bg_pos2)
                self.screen.blit(self.background, self.bg_pos1)
                self.all_sprites.draw(self.screen)

            else:
                # update the player's position
                self.player.pos = pygame.math.Vector2(new_pos)
                self.player.hit_rect.center = pygame.math.Vector2(new_pos)
                self.player.spawn_pos = pygame.math.Vector2(new_pos)
                self.player.rect.bottom = self.player.hit_rect.bottom

                # end transtition
                self.in_transition = False
                self.state = 'GAME'

                # blit the background and sprites to prevent flickering
                self.screen.blit(self.background, (0, cfg.GUI_HEIGHT))
                self.all_sprites.draw(self.screen)
Example #38
0
    def main (self, Surface):
         
        while True:
            Surface.fill((0,0,0))
            dt = self.time
            self.mainClock.tick(30)
            for cell in self.tilemap.layers['triggers'].collide(self.player.collisionRect, 'Porta'):
 
                self.tilemap.StopSounds()
                 
                self.Escroto.SaveTilemap(self.Location+'.tilemap', self.tilemap)
                 
                if self.Location == 'Caverna' and cell['Porta'] == 'Dungeon' or self.Location == 'Dungeon' and cell['Porta'] == 'Caverna':
                    play(pygame.mixer.Sound(resources.file_path('sfx_teleporte.ogg', 'Musica')), 1, self.musicPlaying)
                 
                self.Location = cell['Porta']
                 
                NewSurface = pygame.Surface.copy(Surface)
                self.tilemap.draw(NewSurface)
                 
                del self.tilemap
                 
                if self.Location == 'Campo':
                    self.tilemap = Campo(self.width, self.height, self)
                elif self.Location == 'Caverna':
                    self.tilemap = Caverna(self.width, self.height, self)
                elif self.Location == 'Dungeon':
                    self.tilemap = Dungeon(self.width, self.height, self)
                else:
                    self.tilemap = SalaDoChefe(self.width, self.height, self)
                     
                    self.player.Reset((cell['PlayerX'] - 16, cell['PlayerY']-28))
                    self.player.kill()
                    self.player.add([self.tilemap.SpritesToChoose])
                             
                    self.tilemap.set_focus(self.player.collisionRect.centerx, self.player.collisionRect.centery)
                 
                if self.Location != 'Sala do Mestre':
                    self.tilemap.Reload(self, (cell['PlayerX']-16, cell['PlayerY']-28))
                     
                    for sprite in np.array(self.tilemap.Holes):
                        if self.player.collisionRect.colliderect(sprite.rect):
                            sprite.kill()
                            del sprite
                 
                FadeOut(self, NewSurface, Surface)
                self.ResizeScreen(Surface.get_width(), Surface.get_height())
                 
                         
                self.Pause = True
                self.first = True
                 
                 
 
            if self.Master:
                self.Location = 'Dungeon'
                 
                play(self.Sounds['Jóia'], 1, self.musicPlaying)
                NewSurface = pygame.Surface.copy(Surface)
                NewSurface.blit(self.tilemap.images['background'], ((self.width-WIDTH)//2,0))
                self.tilemap.draw(NewSurface)
                 
                del self.tilemap
                 
                self.tilemap = Dungeon(self.width, self.height, self)
                self.tilemap.Reload(self, (664, 28))
                 
                self.tilemap.set_focus(self.player.collisionRect.centerx, self.player.collisionRect.centery)
                 
                FadeOut(self,NewSurface, Surface)
                 
                for sprite in self.tilemap.Holes:
                    if self.player.collisionRect.colliderect(sprite.rect):
                        sprite.kill()
                        del sprite
                         
                self.Pause = True
                self.first = True
 
                bloqueio = Pilastra(self.tilemap.images['bloqueio'], 'bloqueio', (656, 12), (self.tilemap.SpritesToChoose, self.tilemap.Pilastras))
                for cell in self.tilemap.layers['triggers'].collide(bloqueio.rect, 'block'):
                    if 'a' in cell['block']:
                        cell['block'] = 'ftlrb'
 
            for event in pygame.event.get():
                BASIC_GAME_Events(self, event, Surface)
                 
                if event.type == KEYDOWN:
                    if event.key == K_ESCAPE:
                        play(self.Sounds['MenuSelect'], 1, self.musicPlaying)
                        if self.Pause:
                            if self.menu:
                                if self.Menu.name == 'Escroto':
                                    self.menu = False
                                    self.Pause = False
                                    self.tilemap.UnpauseSounds()
                                else:
                                    self.Menu = self.Escroto
 
                        else:
                            if (self.Location == 'Campo' and not self.tilemap.Moshiro.talking and not self.tilemap.Lisa.talking) or self.Location != 'Campo': 
                                self.Pause = True
                                self.menu = True
                                self.Menu = self.Escroto
                                self.tilemap.PauseSounds()
 
                    if event.key == K_RETURN:
                        #Menu de Gente Grande
                        play(self.Sounds['MenuSelect'], 1, self.musicPlaying)
                        if self.Pause:
                            if self.menu:
                                if self.Menu.name == 'ItemMenu':
                                    if self.Menu.menu == 'Ferramenta':
                                        for key in self.Menu.Itens:
                                            if self.Menu.Itens[key]['Coluna'] == self.Menu.selected[0] and self.Menu.Itens[key]['Linha'] == self.Menu.selected[1]:
                                                self.Menu.Itens[self.Menu.using]['Usando'] = False
                                                self.Menu.Itens[key]['Usando'] = True
                                                self.Menu.using = key
                                                self.player.item = key
                                    self.Pause = False
                                    self.menu = False
                                    self.tilemap.UnpauseSounds()
                                else:
                                    self.Menu = self.ItemMenu
                         
                        else:
                            if (self.Location == 'Campo' and not self.tilemap.Moshiro.talking and not self.tilemap.Lisa.talking) or self.Location != 'Campo': 
                                self.Pause = True
                                self.menu = True
                                self.Menu = self.ItemMenu
                                self.tilemap.PauseSounds()
 
                    if event.key == K_a:
                        if not self.Pause:
                            self.tilemap.EventGet(self)
                             
                        else:
                            if self.Menu.name == 'Escroto':
                                play(self.Sounds['MenuSelect'], 1, self.musicPlaying)
                                if self.Menu.selected == 0 or self.Menu.selected == 4 or self.Menu.selected == 5:
                                    self.Menu.selected = 0
                                    self.Menu.Max = 2
                                    self.Menu.Min = 0
                                    self.menu = False
                                    self.Pause = False
                                    self.tilemap.UnpauseSounds()
                                elif self.Menu.selected == 1 and self.Location != 'Sala do Mestre':
                                    self.Menu.selected = 3
                                    self.Menu.salvando = True
                                elif self.Menu.selected == 2:
                                    self.Menu.selected = 5
                                    self.Menu.Max = 6
                                    self.Menu.Min = 5
                                elif self.Menu.selected == 6:
                                    terminate()
 
 
                    if event.key == K_s and not self.player.atking and not self.Pause:
                        tileX = testX1 = (self.player.collisionRect.centerx // 16)*16
                        tileY = testY1 = (self.player.collisionRect.centery // 12)*12
                        if self.player.direction == 0:
                            testY1 += 12
                        elif self.player.direction == 2:
                            testY1 -= 12
                        elif self.player.direction == 3:
                            testX1 -= 16
                        else:
                            testX1 += 16
                        colide = False
 
                        for enemie in self.tilemap.Enemies:
                            if pygame.rect.Rect(testX1, testY1, 16,12).colliderect(enemie.collisionRect):
                                colide = True
                                break
 
                        if not colide:
                            if self.player.item == 'Pá':
                                self.player.spritesheet = self.player.PaSheet
                                self.player.number_of_sprite = 0
                                self.player.cont = 0
                                                 
                                self.player.image = self.player.spritesheet[self.player.direction
                                ][self.player.number_of_sprite]
 
                                self.player.digging = True
 
                                self.player.collisionRect.centerx = tileX + 8
                                self.player.collisionRect.centery = tileY + 6
                                                 
                                self.player.rect = pygame.rect.Rect(self.player.rect.left - 16, 
                                                                            self.player.rect.top - 20, 
                                                                            48, 44)
 
                            for hole in self.tilemap.Holes:
                                if pygame.rect.Rect(testX1, testY1, 16,12).colliderect(hole.rect):
                                    colide = True
                                    break
                                     
                            if self.player.item == 'Bomba' and len(self.tilemap.Bombas) == 0 and not colide:
                                if len(self.tilemap.Bombas) == 0:
                                    play(self.Sounds['Bomba'], 1, self.musicPlaying)
                                    if len(self.tilemap.layers['triggers'].collide(pygame.rect.Rect(testX1 + 7, testY1 + 5, 1,1), 'block')) == 0:
                                        Pilastra(self.images['Bomba'], 'Bomba', (testX1, testY1), (self.tilemap.Bombas, self.tilemap.SpritesToChoose))
                                        self.player.collisionRect.centerx = tileX + 8
                                        self.player.collisionRect.centery = tileY + 6
                                    else:
                                        Pilastra(self.images['Bomba'], 'Bomba', (tileX, tileY), (self.tilemap.Bombas, self.tilemap.SpritesToChoose))
                                        self.player.collisionRect.centerx = tileX + (tileX - testX1) + 8
                                        self.player.collisionRect.centery = tileY + (tileY - testY1) + 6
 
                            if self.player.item == 'Martelo':
                                self.player.spritesheet = self.player.MarteloSheet
                                self.player.number_of_sprite = 0
                                self.player.cont = 0
                                                 
                                self.player.image = self.player.spritesheet[
                                self.player.direction][self.player.number_of_sprite]
 
                                self.player.martelando = True
 
                                self.player.collisionRect.centerx = tileX + 8
                                self.player.collisionRect.centery = tileY + 6
 
                    if self.menu:
                        play(self.Sounds['MenuMove'], 1, self.musicPlaying)
                        if self.Menu.name == 'ItemMenu':
                            if event.key == K_UP:
                                self.Menu.selected[1] -= 1
                            if event.key == K_DOWN:
                                self.Menu.selected[1] += 1
                            if event.key == K_LEFT:
                                self.Menu.selected[0] -= 1
                            if event.key == K_RIGHT:
                                self.Menu.selected[0] += 1
                             
                        else:
                            if event.key == K_UP:
                                if self.Menu.selected < self.Menu.Max + 1:
                                    self.Menu.selected -= 1
                            if event.key == K_DOWN:
                                if self.Menu.selected < self.Menu.Max + 1:
                                    self.Menu.selected += 1
                             
                                    #if self.selected == 3:
                                        #self.selected = 0
             
            self.tilemap.Actions(self)
 
            if self.first:
                if self.Location == 'Sala do Mestre':
                    NewSurface.fill((0,0,0))
                    NewSurface.blit(self.tilemap.images['background'], (((self.width-WIDTH)//2,0)))
                self.tilemap.draw(NewSurface)
                 
                FadeIn(self,NewSurface, Surface)
                 
                del NewSurface
                 
                self.first = False
                self.second = True
                if self.Master:
                    self.Master = False
                    self.Escroto.SaveGame(self,'CheckPoint.save', 0 ,2,0)
             
            elif self.second:
                self.Pause = False
                self.second = False
                if self.musicPlaying:
                    self.tilemap.InicializeSounds()
                    if self.Location == 'Sala do Mestre':
                        pygame.mixer.Sound(resources.file_path('sfx_mestre_intro.ogg','Musica')).play(0)
                 
            if not self.Pause:
                self.tilemap.update(dt, self)
             
            if self.Location == 'Sala do Mestre':
                Surface.fill((0,0,0))
                Surface.blit(self.tilemap.images['background'], ((self.width-WIDTH)//2,0))
             
            self.tilemap.draw(Surface)
            if self.menu:
                self.Menu.update(dt, self)
            if self.menu:
                self.Menu.draw(self, Surface)
 
            else:
                BlitLife(Surface, self, self.Heart, self.images['Stamina'], self.tools[0][self.choosed[self.player.item]])
             
            if self.PegouJóia:
                play(self.Sounds['Jóia'], 1, self.musicPlaying)
                self.Escroto.SaveGame(self,'CheckPoint.save', 0 ,2,0)
                self.PegouJóia = False
                 
            TransformSurfaceScale(Surface, self.width, self.height, self.rect)
            pygame.display.update()
             
 
            if self.Location == 'Campo':
                self.tilemap.SetSound(self)
 
                for npc in self.tilemap.NPCs:
                    if npc.talking:
                        self.tilemap.PauseEspecial()
                        npc.display(Surface, self)
                 
 
            if self.player.vida <= 0:
                self.tilemap.StopSounds()
                self.Died(Surface)
            elif 0 < self.player.vida <= 2:
                if self.musicPlaying:
                    if self.Sounds['Morrendo'].get_num_channels() == 0:
                        self.Sounds['Morrendo'].play(-1)
            else:
                if self.Sounds['Morrendo'].get_num_channels() > 0:
                    self.Sounds['Morrendo'].stop()
Example #39
0
class FortuneMaker(Activity):
    def __init__(self, handle):
        Activity.__init__(self, handle)

        self.dungeon = None
        self.active_room = None
        self.action_but_group = None

        # INITIALIZE GUI
        ################
        self.set_title('FortuneMaker')

        # Create Toolbox
        self.build_toolbars()
        self.enable_room_icons(False)

        self.show_home()

    def build_toolbars(self):
        self.dungeon_buttons = {}
        self.dungeon_bar = gtk.Toolbar()
        self.view_bar = gtk.Toolbar()

        # BUILD CUSTOM TOOLBAR
        # Dungeon Bar
        self.dungeon_buttons['new'] = ToolButton('add')
        self.dungeon_buttons['new'].set_tooltip(_("New Dungeon"))
        self.dungeon_buttons['new'].connect("clicked", self.view_change_cb, 'new')
        self.dungeon_bar.insert(self.dungeon_buttons['new'], -1)

        self.dungeon_buttons['load'] = ToolButton('fileopen')
        self.dungeon_buttons['load'].set_tooltip(_("Open Dungeon"))
        self.dungeon_buttons['load'].connect("clicked", self.view_change_cb, 'load')
        self.dungeon_bar.insert(self.dungeon_buttons['load'], -1)

        self.dungeon_buttons['save'] = ToolButton('filesave')
        self.dungeon_buttons['save'].set_tooltip( _("Export dungeon file to journal") )
        self.dungeon_buttons['save'].connect("clicked", self.view_change_cb, 'export')
        self.dungeon_bar.insert(self.dungeon_buttons['save'], -1)
        self.dungeon_buttons['save'].set_sensitive( False )

        # VIEW BAR
        self.dungeon_buttons['home'] = ToolButton('go-home')
        self.dungeon_buttons['home'].set_tooltip(_("Welcome Screen"))
        self.dungeon_buttons['home'].connect("clicked", self.view_change_cb, 'home')
        self.view_bar.insert(self.dungeon_buttons['home'], -1)

        self.dungeon_buttons['settings'] = ToolButton('view-spiral')
        self.dungeon_buttons['settings'].set_tooltip(_("View Dungeon Settings"))
        self.dungeon_buttons['settings'].connect("clicked", self.view_change_cb, 'settings')
        self.view_bar.insert(self.dungeon_buttons['settings'], -1)
        self.dungeon_buttons['settings'].set_sensitive( False )

        self.dungeon_buttons['layout'] = ToolButton('view-freeform')
        self.dungeon_buttons['layout'].set_tooltip(_("View Dungeon Layout"))
        self.dungeon_buttons['layout'].connect("clicked", self.view_change_cb, 'layout')
        self.view_bar.insert(self.dungeon_buttons['layout'], -1)
        self.dungeon_buttons['layout'].set_sensitive( False )

        self.toolbox = ActivityToolbox(self)

        # Remove Share Bar
        activity_toolbar = self.toolbox.get_activity_toolbar()
        activity_toolbar.remove(activity_toolbar.share)
        activity_toolbar.share = None

        #Add our custom items to the toolbar
        self.toolbox.add_toolbar(_("Dungeon"), self.dungeon_bar)
        self.toolbox.add_toolbar(_("View"), self.view_bar)

        self.set_toolbox(self.toolbox)
        self.toolbox.show()

    def enable_room_icons(self, dn=True):
        self.dungeon_buttons['settings'].set_sensitive( dn )
        self.dungeon_buttons['save'].set_sensitive( dn )
        self.dungeon_buttons['layout'].set_sensitive( dn )


    def view_change_cb(self, widget, view=None):
        if view == 'layout':
            self.view_dungeon_grid()
        elif view == 'export':
            self.export_view()
        elif view == 'new':
            self.set_create_dungeon_settings()
        elif view == 'load':
            self.show_dungeon_selection()
        elif view == 'settings':
            self.show_dungeon_settings()
        elif view == 'home':
            self.show_home()

    def show_home(self):
        window_container = gtk.VBox()

        label = gtk.Label(_("Welcome to Fortune Maker"))
        window_container.pack_start(label, False)

        # New Dungeon
        button = gtk.Button()
        button.set_image( Icon( icon_name="add" ) )
        button.set_label( _("New Dungeon") )
        button.set_alignment(0.0,0.5)
        button.connect( 'clicked', self.view_change_cb, 'new')
        window_container.pack_start(button, False)

        # load fileopen
        button = gtk.Button()
        button.set_image( Icon( icon_name="fileopen" ) )
        button.set_label( _("Load Exported Dungeon") )
        button.set_alignment(0.0,0.5)
        button.connect( 'clicked', self.view_change_cb, 'load')
        window_container.pack_start(button, False)

        #HELP EXAMPLES
        label = gtk.Label(_("Dungeon Toolbar") )
        label.set_alignment( 0, 0.5 )
        window_container.pack_start(gtk.Label(" "), False)
        window_container.pack_start(label, False)

        row = gtk.HBox()
        row.pack_start( Icon( icon_name="add" ), False )
        label = gtk.Label( _("Creates New Dungeon") )
        label.set_alignment( 0, 0.5 )
        row.pack_start(gtk.Label(" "), False)
        row.pack_start( label )
        window_container.pack_start(row, False)

        row = gtk.HBox()
        row.pack_start( Icon( icon_name="fileopen" ), False )
        label = gtk.Label( _("Opens existing dungeon file") )
        label.set_alignment( 0, 0.5 )
        row.pack_start(gtk.Label(" "), False)
        row.pack_start( label )
        window_container.pack_start(row, False)

        row = gtk.HBox()
        row.pack_start( Icon( icon_name="filesave" ), False )
        label = gtk.Label( _("Export dungeon file to journal") )
        label.set_alignment( 0, 0.5 )
        row.pack_start(gtk.Label(" "), False)
        row.pack_start( label )
        window_container.pack_start(row, False)

        # View Bar Help
        label = gtk.Label(_("View Toolbar") )
        label.set_alignment( 0, 0.5 )
        window_container.pack_start(gtk.Label(" "), False)
        window_container.pack_start(label, False)

        row = gtk.HBox()
        row.pack_start( Icon( icon_name="go-home" ), False )
        label = gtk.Label( _("Display this home screen") )
        label.set_alignment( 0, 0.5 )
        row.pack_start(gtk.Label(" "), False)
        row.pack_start( label )
        window_container.pack_start(row, False)

        row = gtk.HBox()
        row.pack_start( Icon( icon_name="view-spiral" ), False )
        label = gtk.Label( _("Shows the dungeon settings") )
        label.set_alignment( 0, 0.5 )
        row.pack_start(gtk.Label(" "), False)
        row.pack_start( label )
        window_container.pack_start(row, False)

        row = gtk.HBox()
        row.pack_start( Icon( icon_name="view-freeform" ), False )
        label = gtk.Label( _("Shows the dungeon layout") )
        label.set_alignment( 0, 0.5 )
        row.pack_start(gtk.Label(" "), False)
        row.pack_start( label )
        window_container.pack_start(row, False)

        window_container.pack_start( gtk.Label(" "), False )
        label = gtk.Label(_("Dungeons must be exported before they\n" +
                            "may be loaded into Fortune Hunter\n" +
                            "or linked as a next dungeon."))
        window_container.pack_start( label, False)

        room_center = gtk.HBox()
        room_center.pack_start( gtk.Label() )
        room_center.pack_start( window_container )
        room_center.pack_start( gtk.Label() )

        self.set_gui_view( room_center )

    def export_view(self):
        if self.dungeon.valid_dungeon():
            data = self.dungeon.export()
            filename = self.dungeon.name

            JournalIntegration.export_textfile( self, filename, self.dungeon.id, data )
            self._alert( _( "Dungeon Exported to Journal"), filename )

        else:
            self._alert( _( "Export Failed"), _("Invalid dungeon configuration") )

    def set_gui_view(self,  view):
        self.set_canvas( view )
        self.show_all()


    def show_dungeon_selection(self):
        window_container = gtk.VBox()
        frame = gtk.Frame( _("Load Dungeon") )
        file_container = gtk.VBox()

        ##LOAD FILE LIST HERE
        file_list = JournalIntegration.list_fh_files()

        for dfile in file_list:
            row = gtk.HBox()
            label = gtk.Label(dfile.metadata['title'])
            row.pack_start( label, False )

            button = gtk.Button(_("Load"))
            button.connect( 'clicked', self.load_dungeon, dfile )
            row.pack_end(button, False)

            file_container.pack_start( row, False )

        frame.add( make_it_scroll( file_container ) )
        window_container.pack_start( frame )

        room_center = gtk.HBox()
        room_center.pack_start( gtk.Label() )
        room_center.pack_start( window_container )
        room_center.pack_start( gtk.Label() )

        self.set_gui_view( room_center )



    def show_dungeon_settings(self):
        window_container, name, theme, next_dungeon, file_list_map = self._get_dungeon_prop_box(False)

        save_dungeon = gtk.Button(_("Save Dungeon Settings"))
        save_dungeon.connect("clicked", self.edit_dungeon_cb, {'name':name,
                                'theme':theme, 'next_dungeon':next_dungeon,
                                'd_list':file_list_map})

        window_container.pack_start( save_dungeon, False )

        room_center = gtk.HBox()
        room_center.pack_start( gtk.Label() )
        room_center.pack_start( window_container )
        room_center.pack_start( gtk.Label() )

        self.set_gui_view( room_center )

    def _get_dungeon_prop_box(self, new_prop=True):
        window_container = gtk.VBox()

        ## Dungeon Properties
        ###############
        frame = gtk.Frame(_("Dungeon Properties"))

        container =  gtk.VBox()

        # Name
        row = gtk.HBox()
        label = gtk.Label(_("Name:"))
        label.set_alignment( 0, 0.5)
        row.pack_start( label )
        name = gtk.Entry()
        row.pack_end( name )
        container.pack_start( row, False )

        # Theme
        row = gtk.HBox()
        label = gtk.Label(_("Theme:"))
        label.set_alignment( 0, 0.5)
        row.pack_start( label )
        theme = gtk.combo_box_new_text()
        for option in THEME_NAME:
            theme.append_text( option )
        theme.set_active( 0 )
        row.pack_end( theme )
        container.pack_start( row, False )

        # Next Dungeon
        row = gtk.HBox()
        label = gtk.Label(_("Next Dungeon:"))
        label.set_alignment( 0, .5)
        row.pack_start( label )

        next_dungeon = gtk.combo_box_new_text()

        file_list = JournalIntegration.list_fh_files()
        file_list_map = {}
        file_list_map["0"] = _("None")
        next_dungeon.append_text( file_list_map["0"] )
        next_dungeon.set_active(0)
        order_map = ["0"]

        for dfile in file_list:
            file_list_map[dfile.metadata['FM_UID']] = dfile.metadata['title']
            next_dungeon.append_text( dfile.metadata['title'] )
            order_map.append( dfile.metadata['FM_UID'] )

        row.pack_start(next_dungeon)
        container.pack_start( row, False )

        frame.add( container )
        window_container.pack_start( frame, False )

        if not new_prop and self.dungeon:
            name.set_text( self.dungeon.name )
            theme.set_active( self.dungeon.theme )
            next_dungeon.set_active( order_map.index( self.dungeon.next ) )

        return (window_container, name, theme, next_dungeon, file_list_map)

    def set_create_dungeon_settings(self, trash=None, trash2=None):
        window_container, name, theme, next_dungeon, file_list_map = self._get_dungeon_prop_box(True)

        ## Dungeon Size
        ###############
        frame = gtk.Frame(_("Dungeon Size"))

        # Width
        widthADJ = gtk.Adjustment(MIN_GRID_WIDTH, MIN_GRID_WIDTH, MAX_GRID_WIDTH, 1.0, 5.0, 0.0)
        widthspin = gtk.SpinButton(widthADJ, 0, 0)
        container = gtk.VBox()
        row = gtk.HBox()
        label = gtk.Label(_("Width:") )
        label.set_alignment( 0, 0.5)
        row.pack_start( label)
        row.pack_end( widthspin )
        container.pack_start( row, False )

        # Height
        heightADJ = gtk.Adjustment(MIN_GRID_HEIGHT, MIN_GRID_HEIGHT, MAX_GRID_HEIGHT, 1.0, 5.0, 0.0)
        heightspin = gtk.SpinButton(heightADJ, 0, 0)
        row = gtk.HBox()
        label = gtk.Label(_("Height:") )
        label.set_alignment( 0, 0.5)
        row.pack_start( label )
        row.pack_end( heightspin )
        container.pack_start( row, False )

        frame.add( container )
        window_container.pack_start( frame, False )

        ## Make Dungeon Button
        make_dungeon = gtk.Button(_("Create Dungeon"))
        make_dungeon.connect("clicked", self.create_dungeon_cb, {'name':name,
                                'theme':theme,'width':widthspin, 'height':heightspin,
                                'next_dungeon':next_dungeon, 'd_list':file_list_map})

        window_container.pack_start( make_dungeon, False )

        room_center = gtk.HBox()
        room_center.pack_start( gtk.Label() )
        room_center.pack_start( window_container )
        room_center.pack_start( gtk.Label() )

        self.set_gui_view( room_center )

    def load_dungeon(self, widget, file_data):
        #try:
            dungeon_dict = JournalIntegration.load_dungeon( file_data )
            self.make_dungeon_from_dict( dungeon_dict )
        #except:
        #    pass

    def make_dungeon_from_dict(self, dungeon_dict):
        self.dungeon = Dungeon( dungeon_dict['name'], dungeon_dict['theme'],
                                dungeon_dict['next'], dungeon_dict['x'],
                                dungeon_dict['y'], dungeon_dict['roomstr'],
                                dungeon_dict['d_id'])
        self.enable_room_icons(True)
        self.view_dungeon_grid()

    def edit_dungeon_cb(self, widget, data):
        self.dungeon.name = data['name'].get_text()
        self.dungeon.theme = data['theme'].get_active()
        self.dungeon.next = find_key( data['d_list'], data['next_dungeon'].get_active_text())
        self._alert(_("Dungeon Setting Saved"), self.dungeon.theme)

    def create_dungeon_cb(self, widget, data):
        name = data['name'].get_text()
        theme = data['theme'].get_active()  #.get_active_text()
        next = find_key( data['d_list'], data['next_dungeon'].get_active_text())
        width = data['width'].get_value_as_int()
        height = data['height'].get_value_as_int()

        self.dungeon = Dungeon( name, theme, next, width, height )
        self.enable_room_icons(True)
        self.view_dungeon_grid()

    def _draw_room_button_grid(self):
        # Setup Room Panel
        room_array = self.dungeon.get_room_array()
        box = gtk.VBox()
        for row_array in room_array:
            row = gtk.HBox()
            box.pack_start( row, False )
            for room in row_array:
                room_gui = room.render_room()
                room_gui.connect('button-press-event', self.add_prop_to_room, room, room_gui)
                row.pack_start( room_gui, False )
        if self._pane2:
            self.edit_pane.remove( self._pane2 )
        self._pane2 = make_it_scroll( box )
        self._pane2.show_all()
        self.edit_pane.add2( self._pane2 )

    def view_dungeon_grid(self):
        self.edit_pane = gtk.HPaned()
        self._pane2 = None

        # Setup Button Panel
        listbox = gtk.VBox()

        lbl = gtk.RadioButton(None,_('Remove Enemy'))
        lbl.track_mode = 'REM_ENEMY'
        listbox.pack_start( lbl, False )

        lbl = gtk.RadioButton(lbl,_('Remove Item'))
        lbl.track_mode = 'REM_ITEM'
        listbox.pack_start( lbl, False )

        # Doors
        exp = gtk.Expander(_("Doors"))
        box = gtk.VBox()
        doors = DOOR_FLAGS.values()
        doors.sort()
        for val in doors:
            door_mode_key = find_key( DOOR_FLAGS, val )
            lbl = gtk.RadioButton(lbl,val)
            lbl.track_mode = 'DOOR'
            lbl.track_flag = door_mode_key
            box.pack_start(lbl, False)

        exp.add( box )
        listbox.pack_start( exp, False )

        # Room Properties
        exp = gtk.Expander(_("Room Flags"))
        box = gtk.VBox()
        flags = SPEC_FLAGS.values()
        flags.sort()
        for val in flags:
            flag_key = find_key( SPEC_FLAGS, val )
            lbl = gtk.RadioButton(lbl, val)
            lbl.track_mode = 'SPEC_FLAG'
            lbl.track_flag = flag_key
            box.pack_start(lbl, False)
        exp.add( box )
        listbox.pack_start( exp, False )

        # Enemies
        exp = gtk.Expander(_("Enemies"))
        box = gtk.VBox()
        enemies = ENEM_INDEX.values()
        enemies.sort()
        for val in enemies:
            enemy_key = find_key( ENEM_INDEX, val )
            # Ignore None Key
            if enemy_key != '0':
                lbl = gtk.RadioButton(lbl, val)
                lbl.track_mode = 'ENEMY'
                lbl.track_flag = enemy_key
                box.pack_start(lbl, False)

        exp.add( box )
        listbox.pack_start( exp, False )

        # Items
        exp = gtk.Expander(_("Items"))
        box = gtk.VBox()

        items = ITEM_INDEX.values()
        items.sort()
        for val in items:
            item_key = find_key( ITEM_INDEX, val )
            # Ignore None Key
            if item_key != '0':
                lbl = gtk.RadioButton(lbl,val)
                lbl.track_mode = 'ITEM'
                lbl.track_flag = item_key
                box.pack_start(lbl, False)

        exp.add(box)
        listbox.pack_start( exp, False )

        # Save the button group
        self.action_but_group = lbl.get_group()

        # Make Legend
        legendBox = gtk.VBox()
        legendBox.pack_start(gtk.Label(_("Door Legend")),False)

        for door_key in DOOR_FLAGS:
            if door_key != '0':
                row = gtk.HBox()
                colorbox = gtk.EventBox()
                colorbox.add( gtk.Label("    ") )
                colorbox.modify_bg(gtk.STATE_NORMAL, gtk.gdk.color_parse(DOOR_COLOR[door_key]))
                row.pack_start(colorbox, False)
                row.pack_start( gtk.Label("  "), False )
                label = gtk.Label(DOOR_FLAGS[door_key])
                label.set_alignment( 0, 0.5 )
                row.pack_start( label )
                legendBox.pack_start(row, False)

        legendBox.pack_start(gtk.Label(_("Room Legend")),False)

        for spec_key in SPEC_FLAGS:
            if spec_key != '0':
                row = gtk.HBox()
                colorbox = gtk.EventBox()
                colorbox.add( gtk.Label("    ") )
                colorbox.modify_bg(gtk.STATE_NORMAL, gtk.gdk.color_parse(SPEC_COLOR[spec_key]))
                row.pack_start(colorbox, False)
                row.pack_start( gtk.Label("  "), False )
                label = gtk.Label(SPEC_FLAGS[spec_key])
                label.set_alignment( 0, 0.5 )
                row.pack_start( label )
                legendBox.pack_start(row, False)


        split = gtk.VBox()
        split.pack_start( make_it_scroll( listbox, False ) )

        exp = gtk.Expander(_("Legend"))
        exp.add(legendBox)
        split.pack_end( exp, False )

        self.edit_pane.add1( split )
        self._draw_room_button_grid()
        self.set_gui_view( self.edit_pane )

    def set_active_room(self, widgit, room):
        self.active_room = room
        self.view_room()

    def add_prop_to_room(self, widget, event, room, room_gui):
        self.active_room = room
        for but in self.action_but_group:
            if but.get_active():
                if but.track_mode == 'VIEW':
                    self.view_room()
                    return

                elif but.track_mode == 'REM_ENEMY':
                    dialog = gtk.Dialog(_("Remove Enemy"), buttons=(gtk.STOCK_CLOSE, gtk.RESPONSE_CLOSE))
                    def rem_enm(widget, pos, row):
                        room.set_enemy( pos, '0')
                        row.hide()

                    display_box = False
                    for i in range(0,4):
                        if room.enemy[i] != '0':
                            display_box = True
                            row = gtk.HBox()
                            label = gtk.Label( ENEM_INDEX[room.enemy[i]] )
                            label.set_alignment(0.0,0.5)
                            row.pack_start(label)
                            but = gtk.Button(_("Remove"))
                            but.connect('clicked', rem_enm, i, row)
                            row.pack_end(but, False)
                            dialog.vbox.pack_start(row, False)

                    if display_box:
                        dialog.show_all()
                        result = dialog.run()
                    else:
                        self._alert(_("No enemies found in this room"))
                    dialog.destroy()

                elif but.track_mode == 'REM_ITEM':
                    dialog = gtk.Dialog(_("Remove Item"), buttons=(gtk.STOCK_CLOSE, gtk.RESPONSE_CLOSE))

                    def rem_enm(widget, pos, row):
                        room.set_item( pos, '0', '0')
                        row.hide()

                    display_box = False
                    for i in range(0,4):
                        if room.item[i][0] != '0':
                            display_box = True
                            row = gtk.HBox()
                            label = gtk.Label( ITEM_INDEX[room.item[i][0]] )
                            label.set_alignment(0.0,0.5)
                            row.pack_start(label)
                            but = gtk.Button(_("Remove"))
                            but.connect('clicked', rem_enm, i, row)
                            row.pack_end(but, False)
                            dialog.vbox.pack_start(row, False)

                    if display_box:
                        dialog.show_all()
                        result = dialog.run()
                    else:
                        self._alert(_("No items found in this room"))
                    dialog.destroy()


                elif but.track_mode == 'DOOR':
                    door_pos = room.get_door_from_click( event.x, event.y )
                    if not door_pos:
                        return

                    if but.track_flag == '0':
                        self.active_room.remove_door( door_pos )
                        try:
                            adj_room = self.dungeon.get_adj_room( room, door_pos )
                            if door_pos == "N":
                                adj_room.remove_door( "S" )
                            elif door_pos == "E":
                                adj_room.remove_door( "W" )
                            elif door_pos == "S":
                                adj_room.remove_door( "N" )
                            elif door_pos == "W":
                                adj_room.remove_door( "E" )
                            adj_room._room_gui.queue_draw()
                        except:
                            pass

                    else:
                        # If not e or x, add door to adjoining room
                        if not (but.track_flag == 'e' or but.track_flag == 'x'):
                            adj_room = self.dungeon.get_adj_room( room, door_pos )

                            if adj_room:
                                self.active_room.add_door( door_pos, but.track_flag )
                                if door_pos == "N":
                                    adj_room.add_door( "S", but.track_flag)
                                elif door_pos == "E":
                                    adj_room.add_door( "W", but.track_flag)
                                elif door_pos == "S":
                                    adj_room.add_door( "N", but.track_flag)
                                elif door_pos == "W":
                                    adj_room.add_door( "E", but.track_flag)
                                adj_room._room_gui.queue_draw()
                            else:
                                self._alert( _("Door Not Added"), _("This door can not be placed at edge of dungeon"))
                        else:
                            if not self.dungeon.has_door_type( but.track_flag ):
                                self.active_room.add_door( door_pos, but.track_flag )
                            else:
                                self._alert( _("Door Not Added"), _("The dungeon can only have one %s") % DOOR_FLAGS[but.track_flag] )


                elif but.track_mode == 'SPEC_FLAG':
                    self.active_room.set_room_flag( but.track_flag )

                elif but.track_mode == 'ENEMY':
                    if not self.active_room.add_enemy( but.track_flag ):
                        self._alert( _("Enemy not added to room"), _("Room can not hold any more enemies"))

                elif but.track_mode == 'ITEM':

                    def add_item(click, flag):
                        if not self.active_room.add_item( but.track_flag, flag ):
                            self._alert( _("Item not added to room"), _("Room can not hold any more items"))
                        self.dungeon.update_room( self.active_room )
                        room_gui.queue_draw()

                    menu = gtk.Menu()
                    for flag in ITEM_FLAGS:
                        if flag != '0':
                            opt = gtk.MenuItem(ITEM_FLAGS[flag])
                            opt.connect("activate", add_item, flag)
                            menu.append(opt)

                    menu.show_all()
                    menu.popup(None, None, None, event.button, event.get_time())
                    return

                self.dungeon.update_room( self.active_room )
                room_gui.queue_draw()
                #self._draw_room_button_grid()
                break

    def _alert(self, title, text=None, timeout=5):
        alert = NotifyAlert(timeout=timeout)
        alert.props.title = title
        alert.props.msg = text
        self.add_alert(alert)
        alert.connect('response', self._alert_cancel_cb)
        alert.show()

    def _alert_cancel_cb(self, alert, response_id):
        self.remove_alert(alert)

    def can_close( self ):
        if self.metadata['mime_type'] == JournalIntegration.FILE_MIME and self.dungeon:
            if not self.dungeon.valid_dungeon():
                self._alert(_("Dungeon Invalid"),_("Dungeon must be valid to save to an exported dungeon"))
                return False
        return True

    def read_file(self, file_path):
        if hasattr(self, "SHUT_UP_XO_CALLING_ME"):
            print "CALLED YET AGAIN! (%s)"%file_path
            return

        self.SHUT_UP_XO_CALLING_ME = True
        dgnFile=open(file_path,'r')

        try:
            dungeon_dict = JournalIntegration.do_load( dgnFile )
            self.make_dungeon_from_dict( dungeon_dict )
        except:
            pass

        dgnFile.close()
        return

    def write_file(self, file_path):
        if self.dungeon:
            f = open( file_path, 'w' )
            f.write( self.dungeon.export() )
            f.close()
        else:
            # Basically touch file to prevent it from keep error
            open( file_path, 'w' ).close()
class MyGame(arcade.Window):
    def __init__(self, width, height, title):
        super().__init__(width, height, title)

        self.dungeon = None
        self.hero = None

        self.left_pressed = False
        self.right_pressed = False
        self.up_pressed = False
        self.down_pressed = False
        self.move_char = (".", [0, 0])
        self.fight = Fight()
        arcade.set_background_color((59, 68, 75))

    def setup(self):
        self.dungeon = Dungeon("map.txt")
        self.hero = Hero("Geralt", "white wolf", 150, 150, 5)
        self.hero.equip(Weapon("Sword", 30))
        self.hero.learn(Spell("wolf's attack", 20, 20, 2))
        self.dungeon.spawn(self.hero)
        self.command = None

    def on_draw(self):
        arcade.start_render()

        x = self.dungeon.borders[1] * 20 + LEFT_MARGIN - 20
        y = 260
        arcade.draw_rectangle_filled(x, y, 410, 410, (135, 169, 107))
        arcade.draw_rectangle_outline(x, y, 420, 420, (105, 53, 156), 10)
        arcade.draw_text("To move pres the keybord arrows.\nTo attack first you should choose\ndirection. Press on of the keys:\n 'u' for up, 'd' for down,\n 'l' for left, 'r' for right\n......................................",\
            x - 200, y + 100, (55, 3, 106), 14)

        # Prints the map
        for row in range(self.dungeon.borders[0]):
            # Loop for each column
            for column in range(self.dungeon.borders[1]):
                # Calculate our location
                x = column * COLUMN_SPACING + LEFT_MARGIN
                y = (self.dungeon.borders[0] - row -
                     1) * ROW_SPACING + BOTTOM_MARGIN

                # Draw the item
                if (self.dungeon.matrix[row][column] == "#"):
                    arcade.draw_rectangle_filled(x, y, 30, 30, (191, 79, 81))
                elif (self.dungeon.matrix[row][column] == "-"):
                    if row == 0 or row == self.dungeon.borders[0] - 1:
                        if column == 0 or column == self.dungeon.borders[1] - 1:
                            arcade.draw_rectangle_filled(
                                x, y, 30, 30, (59, 68, 75))
                        else:
                            arcade.draw_rectangle_filled(
                                x, y, 50, 30, (59, 68, 75))
                    if column == 0 or column == self.dungeon.borders[1] - 1:
                        if row == 0 or row == self.dungeon.borders[0] - 1:
                            arcade.draw_rectangle_filled(
                                x, y, 30, 30, (59, 68, 75))
                        else:
                            arcade.draw_rectangle_filled(
                                x, y, 30, 50, (59, 68, 75))
                elif (self.dungeon.matrix[row][column] == "H"):
                    arcade.draw_rectangle_filled(x, y, 30, 30, (79, 134, 247))
                    arcade.draw_text("H", x - 10, y - 20, arcade.color.BLUE,
                                     28)
                elif (self.dungeon.matrix[row][column] == "E"):
                    arcade.draw_rectangle_filled(x, y, 30, 30, (255, 117, 24))
                    arcade.draw_text("E", x - 10, y - 20, arcade.color.RED, 28)
                elif (self.dungeon.matrix[row][column] == "T"):
                    arcade.draw_rectangle_filled(x, y, 30, 30, (150, 120, 182))
                    arcade.draw_text("T", x - 10, y - 20, (55, 3, 106), 28)
                elif (self.dungeon.matrix[row][column] == "G"):
                    arcade.draw_rectangle_filled(x, y, 30, 30, (153, 230, 179))
                    arcade.draw_text("G", x - 10, y - 20, (0, 130, 127), 28)
                else:
                    arcade.draw_rectangle_filled(x, y, 30, 30, (135, 169, 107))

        x = self.dungeon.borders[1] * 20 + LEFT_MARGIN - 20
        y = self.dungeon.borders[1] * 10 + BOTTOM_MARGIN
        arcade.draw_rectangle_outline(x, y, 420, 220, (105, 53, 156), 10)

    def on_update(self, delta_time):
        """
        if self.up_pressed and not self.down_pressed:
            self.dungeon.move_hero("up")
        elif self.down_pressed and not self.up_pressed:
            self.dungeon.move_hero("down")
        if self.left_pressed and not self.right_pressed:
            self.dungeon.move_hero("left")
        elif self.right_pressed and not self.left_pressed:
            self.dungeon.move_hero("left")
        """

    def on_key_press(self, key, modifiers):
        """Called whenever a key is pressed. """

        if key == arcade.key.UP:

            self.move_char = self.dungeon.move_hero("up")
            print("HERREEEEERERERER")  #, self.move_hero)

            self.check_move()
            #self.up_pressed = True
        elif key == arcade.key.DOWN:

            self.move_char = self.dungeon.move_hero("down")
            self.check_move()
            #self.down_pressed = True
        elif key == arcade.key.LEFT:

            self.move_char = self.dungeon.move_hero("left")
            self.check_move()
            # self.left_pressed = True
        elif key == arcade.key.RIGHT:

            self.move_char = self.dungeon.move_hero("right")
            self.check_move()
            # self.right_pressed = True

        elif key == arcade.key.NUM_1 or key == arcade.key.KEY_1:
            self.command = self.fight.get_hero_command(1)

        elif key == arcade.key.NUM_2 or key == arcade.key.KEY_2:
            print('hhhhhhh')
            self.command = self.fight.get_hero_command(2)
            print(self.command)

        elif key == arcade.key.NUM_3 or key == arcade.key.KEY_3:
            self.command = self.fight.get_hero_command(3)

        elif key == arcade.key.NUM_4 or key == arcade.key.KEY_4:
            self.command = self.fight.get_hero_command(4)

    def on_key_release(self, key, modifiers):
        """Called when the user releases a key. """

        if key == arcade.key.UP:
            self.up_pressed = False
        elif key == arcade.key.DOWN:
            self.down_pressed = False
        elif key == arcade.key.LEFT:
            self.left_pressed = False
        elif key == arcade.key.RIGHT:
            self.right_pressed = False

    def check_move(self):
        print("nznznz", self.move_char)
        if self.move_char[0] == "E":
            print("WTF???")
            #fight = Fight()
            self.dungeon.hero = self.battle(1)
            if self.dungeon.hero.is_alive():
                self.dungeon.change_map(".")
                self.dungeon.hero_place[self.move_char[1]] = self.move_char[2]
                self.dungeon.change_map("H")
        else:
            return "Hero made move."

    def battle(self, distance):
        enemy = self.dungeon.enemies.pop()
        self.fight.start_fight(self.dungeon.hero, enemy, distance)
        while self.dungeon.hero.is_alive() and enemy.is_alive():
            # the desition of the player
            # self.fight.distance = distance
            if self.dungeon.hero.is_alive():
                print(self.command)
                if self.command is not None:

                    if enemy.is_alive():
                        print(self.fight.hero_attack())
                        if not enemy.is_alive():
                            print("Enemy is dead.")
                if self.enemy.is_alive():
                    if self.hero.is_alive():
                        print(self.fight.enemy_attack())
                        if not self.dungeon.hero.is_alive():
                            print("Hero is dead")
        return self.hero
Example #41
0
class Game(object):
    def main (self, Surface):
         
        while True:
            Surface.fill((0,0,0))
            dt = self.time
            self.mainClock.tick(30)
            for cell in self.tilemap.layers['triggers'].collide(self.player.collisionRect, 'Porta'):
 
                self.tilemap.StopSounds()
                 
                self.Escroto.SaveTilemap(self.Location+'.tilemap', self.tilemap)
                 
                if self.Location == 'Caverna' and cell['Porta'] == 'Dungeon' or self.Location == 'Dungeon' and cell['Porta'] == 'Caverna':
                    play(pygame.mixer.Sound(resources.file_path('sfx_teleporte.ogg', 'Musica')), 1, self.musicPlaying)
                 
                self.Location = cell['Porta']
                 
                NewSurface = pygame.Surface.copy(Surface)
                self.tilemap.draw(NewSurface)
                 
                del self.tilemap
                 
                if self.Location == 'Campo':
                    self.tilemap = Campo(self.width, self.height, self)
                elif self.Location == 'Caverna':
                    self.tilemap = Caverna(self.width, self.height, self)
                elif self.Location == 'Dungeon':
                    self.tilemap = Dungeon(self.width, self.height, self)
                else:
                    self.tilemap = SalaDoChefe(self.width, self.height, self)
                     
                    self.player.Reset((cell['PlayerX'] - 16, cell['PlayerY']-28))
                    self.player.kill()
                    self.player.add([self.tilemap.SpritesToChoose])
                             
                    self.tilemap.set_focus(self.player.collisionRect.centerx, self.player.collisionRect.centery)
                 
                if self.Location != 'Sala do Mestre':
                    self.tilemap.Reload(self, (cell['PlayerX']-16, cell['PlayerY']-28))
                     
                    for sprite in np.array(self.tilemap.Holes):
                        if self.player.collisionRect.colliderect(sprite.rect):
                            sprite.kill()
                            del sprite
                 
                FadeOut(self, NewSurface, Surface)
                self.ResizeScreen(Surface.get_width(), Surface.get_height())
                 
                         
                self.Pause = True
                self.first = True
                 
                 
 
            if self.Master:
                self.Location = 'Dungeon'
                 
                play(self.Sounds['Jóia'], 1, self.musicPlaying)
                NewSurface = pygame.Surface.copy(Surface)
                NewSurface.blit(self.tilemap.images['background'], ((self.width-WIDTH)//2,0))
                self.tilemap.draw(NewSurface)
                 
                del self.tilemap
                 
                self.tilemap = Dungeon(self.width, self.height, self)
                self.tilemap.Reload(self, (664, 28))
                 
                self.tilemap.set_focus(self.player.collisionRect.centerx, self.player.collisionRect.centery)
                 
                FadeOut(self,NewSurface, Surface)
                 
                for sprite in self.tilemap.Holes:
                    if self.player.collisionRect.colliderect(sprite.rect):
                        sprite.kill()
                        del sprite
                         
                self.Pause = True
                self.first = True
 
                bloqueio = Pilastra(self.tilemap.images['bloqueio'], 'bloqueio', (656, 12), (self.tilemap.SpritesToChoose, self.tilemap.Pilastras))
                for cell in self.tilemap.layers['triggers'].collide(bloqueio.rect, 'block'):
                    if 'a' in cell['block']:
                        cell['block'] = 'ftlrb'
 
            for event in pygame.event.get():
                BASIC_GAME_Events(self, event, Surface)
                 
                if event.type == KEYDOWN:
                    if event.key == K_ESCAPE:
                        play(self.Sounds['MenuSelect'], 1, self.musicPlaying)
                        if self.Pause:
                            if self.menu:
                                if self.Menu.name == 'Escroto':
                                    self.menu = False
                                    self.Pause = False
                                    self.tilemap.UnpauseSounds()
                                else:
                                    self.Menu = self.Escroto
 
                        else:
                            if (self.Location == 'Campo' and not self.tilemap.Moshiro.talking and not self.tilemap.Lisa.talking) or self.Location != 'Campo': 
                                self.Pause = True
                                self.menu = True
                                self.Menu = self.Escroto
                                self.tilemap.PauseSounds()
 
                    if event.key == K_RETURN:
                        #Menu de Gente Grande
                        play(self.Sounds['MenuSelect'], 1, self.musicPlaying)
                        if self.Pause:
                            if self.menu:
                                if self.Menu.name == 'ItemMenu':
                                    if self.Menu.menu == 'Ferramenta':
                                        for key in self.Menu.Itens:
                                            if self.Menu.Itens[key]['Coluna'] == self.Menu.selected[0] and self.Menu.Itens[key]['Linha'] == self.Menu.selected[1]:
                                                self.Menu.Itens[self.Menu.using]['Usando'] = False
                                                self.Menu.Itens[key]['Usando'] = True
                                                self.Menu.using = key
                                                self.player.item = key
                                    self.Pause = False
                                    self.menu = False
                                    self.tilemap.UnpauseSounds()
                                else:
                                    self.Menu = self.ItemMenu
                         
                        else:
                            if (self.Location == 'Campo' and not self.tilemap.Moshiro.talking and not self.tilemap.Lisa.talking) or self.Location != 'Campo': 
                                self.Pause = True
                                self.menu = True
                                self.Menu = self.ItemMenu
                                self.tilemap.PauseSounds()
 
                    if event.key == K_a:
                        if not self.Pause:
                            self.tilemap.EventGet(self)
                             
                        else:
                            if self.Menu.name == 'Escroto':
                                play(self.Sounds['MenuSelect'], 1, self.musicPlaying)
                                if self.Menu.selected == 0 or self.Menu.selected == 4 or self.Menu.selected == 5:
                                    self.Menu.selected = 0
                                    self.Menu.Max = 2
                                    self.Menu.Min = 0
                                    self.menu = False
                                    self.Pause = False
                                    self.tilemap.UnpauseSounds()
                                elif self.Menu.selected == 1 and self.Location != 'Sala do Mestre':
                                    self.Menu.selected = 3
                                    self.Menu.salvando = True
                                elif self.Menu.selected == 2:
                                    self.Menu.selected = 5
                                    self.Menu.Max = 6
                                    self.Menu.Min = 5
                                elif self.Menu.selected == 6:
                                    terminate()
 
 
                    if event.key == K_s and not self.player.atking and not self.Pause:
                        tileX = testX1 = (self.player.collisionRect.centerx // 16)*16
                        tileY = testY1 = (self.player.collisionRect.centery // 12)*12
                        if self.player.direction == 0:
                            testY1 += 12
                        elif self.player.direction == 2:
                            testY1 -= 12
                        elif self.player.direction == 3:
                            testX1 -= 16
                        else:
                            testX1 += 16
                        colide = False
 
                        for enemie in self.tilemap.Enemies:
                            if pygame.rect.Rect(testX1, testY1, 16,12).colliderect(enemie.collisionRect):
                                colide = True
                                break
 
                        if not colide:
                            if self.player.item == 'Pá':
                                self.player.spritesheet = self.player.PaSheet
                                self.player.number_of_sprite = 0
                                self.player.cont = 0
                                                 
                                self.player.image = self.player.spritesheet[self.player.direction
                                ][self.player.number_of_sprite]
 
                                self.player.digging = True
 
                                self.player.collisionRect.centerx = tileX + 8
                                self.player.collisionRect.centery = tileY + 6
                                                 
                                self.player.rect = pygame.rect.Rect(self.player.rect.left - 16, 
                                                                            self.player.rect.top - 20, 
                                                                            48, 44)
 
                            for hole in self.tilemap.Holes:
                                if pygame.rect.Rect(testX1, testY1, 16,12).colliderect(hole.rect):
                                    colide = True
                                    break
                                     
                            if self.player.item == 'Bomba' and len(self.tilemap.Bombas) == 0 and not colide:
                                if len(self.tilemap.Bombas) == 0:
                                    play(self.Sounds['Bomba'], 1, self.musicPlaying)
                                    if len(self.tilemap.layers['triggers'].collide(pygame.rect.Rect(testX1 + 7, testY1 + 5, 1,1), 'block')) == 0:
                                        Pilastra(self.images['Bomba'], 'Bomba', (testX1, testY1), (self.tilemap.Bombas, self.tilemap.SpritesToChoose))
                                        self.player.collisionRect.centerx = tileX + 8
                                        self.player.collisionRect.centery = tileY + 6
                                    else:
                                        Pilastra(self.images['Bomba'], 'Bomba', (tileX, tileY), (self.tilemap.Bombas, self.tilemap.SpritesToChoose))
                                        self.player.collisionRect.centerx = tileX + (tileX - testX1) + 8
                                        self.player.collisionRect.centery = tileY + (tileY - testY1) + 6
 
                            if self.player.item == 'Martelo':
                                self.player.spritesheet = self.player.MarteloSheet
                                self.player.number_of_sprite = 0
                                self.player.cont = 0
                                                 
                                self.player.image = self.player.spritesheet[
                                self.player.direction][self.player.number_of_sprite]
 
                                self.player.martelando = True
 
                                self.player.collisionRect.centerx = tileX + 8
                                self.player.collisionRect.centery = tileY + 6
 
                    if self.menu:
                        play(self.Sounds['MenuMove'], 1, self.musicPlaying)
                        if self.Menu.name == 'ItemMenu':
                            if event.key == K_UP:
                                self.Menu.selected[1] -= 1
                            if event.key == K_DOWN:
                                self.Menu.selected[1] += 1
                            if event.key == K_LEFT:
                                self.Menu.selected[0] -= 1
                            if event.key == K_RIGHT:
                                self.Menu.selected[0] += 1
                             
                        else:
                            if event.key == K_UP:
                                if self.Menu.selected < self.Menu.Max + 1:
                                    self.Menu.selected -= 1
                            if event.key == K_DOWN:
                                if self.Menu.selected < self.Menu.Max + 1:
                                    self.Menu.selected += 1
                             
                                    #if self.selected == 3:
                                        #self.selected = 0
             
            self.tilemap.Actions(self)
 
            if self.first:
                if self.Location == 'Sala do Mestre':
                    NewSurface.fill((0,0,0))
                    NewSurface.blit(self.tilemap.images['background'], (((self.width-WIDTH)//2,0)))
                self.tilemap.draw(NewSurface)
                 
                FadeIn(self,NewSurface, Surface)
                 
                del NewSurface
                 
                self.first = False
                self.second = True
                if self.Master:
                    self.Master = False
                    self.Escroto.SaveGame(self,'CheckPoint.save', 0 ,2,0)
             
            elif self.second:
                self.Pause = False
                self.second = False
                if self.musicPlaying:
                    self.tilemap.InicializeSounds()
                    if self.Location == 'Sala do Mestre':
                        pygame.mixer.Sound(resources.file_path('sfx_mestre_intro.ogg','Musica')).play(0)
                 
            if not self.Pause:
                self.tilemap.update(dt, self)
             
            if self.Location == 'Sala do Mestre':
                Surface.fill((0,0,0))
                Surface.blit(self.tilemap.images['background'], ((self.width-WIDTH)//2,0))
             
            self.tilemap.draw(Surface)
            if self.menu:
                self.Menu.update(dt, self)
            if self.menu:
                self.Menu.draw(self, Surface)
 
            else:
                BlitLife(Surface, self, self.Heart, self.images['Stamina'], self.tools[0][self.choosed[self.player.item]])
             
            if self.PegouJóia:
                play(self.Sounds['Jóia'], 1, self.musicPlaying)
                self.Escroto.SaveGame(self,'CheckPoint.save', 0 ,2,0)
                self.PegouJóia = False
                 
            TransformSurfaceScale(Surface, self.width, self.height, self.rect)
            pygame.display.update()
             
 
            if self.Location == 'Campo':
                self.tilemap.SetSound(self)
 
                for npc in self.tilemap.NPCs:
                    if npc.talking:
                        self.tilemap.PauseEspecial()
                        npc.display(Surface, self)
                 
 
            if self.player.vida <= 0:
                self.tilemap.StopSounds()
                self.Died(Surface)
            elif 0 < self.player.vida <= 2:
                if self.musicPlaying:
                    if self.Sounds['Morrendo'].get_num_channels() == 0:
                        self.Sounds['Morrendo'].play(-1)
            else:
                if self.Sounds['Morrendo'].get_num_channels() > 0:
                    self.Sounds['Morrendo'].stop()
     
    def ResizeScreen(self, newWidth, newHeight):
        """
        Função que faz o resize da jogo
        de forma que o jogo seja compátivel com qualquer modo de tela entre 4:3 e 16:9
        """
        #precisamos primeiro calcular o tamanho da imagem que será disponibilizada no novo
        #tamanho de tela
        #Formato 16:9 ou 4:3
        #Usaremos a altura como padrão
        Hfator_widscreen = newHeight/9
        Hfator_oldscreen = newHeight/3
 
        #Teste, tela 200/120
 
        MAXW_widscreen = 16*Hfator_widscreen #213,33333
        MAXW_oldscreen = 4*Hfator_oldscreen #160
 
        if newWidth > MAXW_widscreen:
            self.width = self.tilemap.view_w = round(16*HEIGHT/9)
 
        elif newWidth <= MAXW_widscreen and newWidth >= MAXW_oldscreen:
            #Se isso for verdade devemos modificar o tamanho e posição
            #de algumas sprites do jogo
            #Antes, vamos calcular o novo tamanho de tela no tilemap
            self.width = round(newWidth/(newHeight/HEIGHT))
            self.tilemap.view_w = self.width
        else:
            self.width = WIDTH
            self.tilemap.view_w = WIDTH
         
        self.rect = pygame.rect.Rect((0,0), (self.width, self.height))
        self.tilemap.viewport = Rect((0,0), (self.width, self.height))
        self.tilemap.set_focus(self.player.collisionRect.centerx, self.player.collisionRect.centery, True)
         
        self.ModificaTamanho()
     
    def ModificaTamanho(self):
        #Vamos centralizar as posições dos menus
        for key in self.ItemMenu.Itens:
            self.ItemMenu.Itens[key]['Posição'][0] = self.ItemMenu.Itens[key]['Posição Inicial'] + (self.width-WIDTH)//2
         
        self.Escroto.x =  (self.width-WIDTH)//2
         
        #Vamos agora ampliar algumas as imagens transparentes
        self.InvisivelCima = pygame.transform.scale(self.InvisivelCima, (self.width, self.InvisivelCima.get_height()))
        self.ItemMenu.escuro = pygame.transform.scale(self.ItemMenu.escuro, (self.width, self.ItemMenu.escuro.get_height()))
             
        self.rect = pygame.rect.Rect((0,0), (self.width, self.height))
        self.tilemap.viewport = Rect((0,0), (self.width, self.height))
        self.tilemap.set_focus(self.player.collisionRect.centerx, self.player.collisionRect.centery, True)
             
         
    def CreateGame(self, music):
        self.mainClock = pygame.time.Clock()
        self.FPS = 30
        self.musicPlaying = music
        self.Pause = False
 
        self.menu = False
        self.Menu = None
 
        self.Master = False
 
        self.width = WIDTH
        self.height = HEIGHT
        self.rect = pygame.rect.Rect(0, 0, self.width, self.height)
         
        self.first = self.second = False
         
        self.time = 0.033
         
        self.menuHeart = load_sheet('menu_pause_coracao.png', 'Menus', 9, 8)
        self.Heart = load_sheet('menu_hud_coracao.png', 'Imagens', 9, 8)
        self.InvisivelCima = pygame.image.load(resources.file_path('menu_hud_escuro.png', 'Imagens')).convert_alpha()
        self.tools = load_sheet('menu_hud_ferramenta.png', 'Imagens', 26, 8)
         
        self.images = {'Player': {'MoveSheet': load_sheet('spr_pla_andando.png','Imagens', 48, 60),
                                  'AtkSheet': load_sheet('spr_pla_ataque.png','Imagens', 48, 60),
                                  'StopSheet': load_sheet('spr_pla_parado.png','Imagens', 48, 60)},
                        
                       'EnemyDeath': load_sheet('spr_obj_inimigomorto.png', 'Imagens', 16, 20),
 
 
                       'Sword': load_sheet('spr_pla_espada.png','Imagens', 48, 60),
 
                       'Hole': pygame.image.load(resources.file_path('spr_obj_buraco.png', 'Imagens')).convert_alpha(),
                       'Rachadura': pygame.image.load(resources.file_path('spr_obj_rachadura.png', 'Imagens')).convert_alpha(),
                       'Bomba': load_sheet('spr_obj_bomba.png', 'Imagens',16,12),
                       'Explosion': load_sheet('spr_obj_explosao.png', 'Imagens',48,36),
                       'Stamina': pygame.image.load(resources.file_path('menu_hud_stamina.png', 'Imagens')).convert_alpha(),
                       'StaminaMenu': pygame.image.load(resources.file_path('menu_pause_stamina.png', 'Menus')).convert_alpha(),
                       'Coracao': pygame.image.load(resources.file_path('spr_obj_coracao.png', 'Imagens')).convert_alpha(),
                       'FalaEscuro': pygame.transform.scale(self.InvisivelCima, (178, 36)).convert_alpha()}
 
        self.Sounds = {'Espada': {'Swing': pygame.mixer.Sound(resources.file_path('sfx_espada.ogg', 'Musica')),
                                  'Parede': pygame.mixer.Sound(resources.file_path('sfx_wallhit.ogg', 'Musica')),
                                  'Acertou': pygame.mixer.Sound(resources.file_path('sfx_acertando.ogg', 'Musica'))},
                       'Bomba': pygame.mixer.Sound(resources.file_path('sfx_bomba.ogg', 'Musica')),
                       'Moshiro': 'ost_moshiro.ogg',
                       'Cavando': pygame.mixer.Sound(resources.file_path('sfx_cavando.ogg', 'Musica')),
                       'MenuSelect':pygame.mixer.Sound(resources.file_path('sfx_menu_select.ogg', 'Musica')),
                       'MenuMove': pygame.mixer.Sound(resources.file_path('sfx_menu_move.ogg', 'Musica')),
                       'Jóia': pygame.mixer.Sound(resources.file_path('sfx_joia.ogg', 'Musica')),
                       'Morrendo':pygame.mixer.Sound(resources.file_path('sfx_morrendo.ogg', 'Musica')),
                       'Martelo': pygame.mixer.Sound(resources.file_path('sfx_martelo.ogg', 'Musica')),
                       'Buraco': pygame.mixer.Sound(resources.file_path('sfx_cavando.ogg', 'Musica')),
                       'Coração': pygame.mixer.Sound(resources.file_path('sfx_heart.ogg', 'Musica'))}
 
        self.choosed = {'Pá': 0, 'Martelo': 1, 'Bomba': 2}
 
        self.ItemMenu = ItemMenu()
        self.Escroto = Escroto()
         
        self.Campo = Campo(self.width, self.height, self)
        self.Dungeon = Dungeon(self.width, self.height, self)
        self.Caverna = Caverna(self.width, self.height, self)
         
        self.player = Player(self.images['Player'], (self.Campo.start_cell.px - 16, self.Campo.start_cell.py-28), [self.Campo.SpritesToChoose])
 
        self.Location = 'Campo'
        self.tilemap = self.Campo
         
        self.Delivered = 0
         
        self.PegouJóia = False
         
        #Vampos criar os canais onde os efeitos sonoros devem ser colocados
 
 
    def NewGame(self, Surface, music):
        self.CreateGame(music)
 
        if self.musicPlaying:
            self.tilemap.InicializeSounds()
            self.tilemap.SetSound(self)
 
        self.Pause = True
        dt = self.time
         
        self.ResizeScreen(Surface.get_width(), Surface.get_height())
         
        self.tilemap.update(dt, self)
        self.tilemap.Lisa.image = self.tilemap.Lisa.spritesheet[self.tilemap.Lisa.AllDirection['Up']][self.tilemap.Lisa.number_of_sprite]
        self.tilemap.Moshiro.display(Surface, self, False)
        self.tilemap.Moshiro.MoshiroAndando(Surface, self)
        self.tilemap.Lisa.image = self.tilemap.Lisa.spritesheet[self.tilemap.Lisa.AllDirection['Left']][self.tilemap.Lisa.number_of_sprite]
        self.tilemap.Lisa.display(Surface, self, False)
        self.Pause = False
         
        self.SaveTilemaps()
        self.Escroto.SaveGame(self,'CheckPoint.save',0,2,0)
         
        self.main(Surface)
     
 
    def LoadGame(self, Surface, music, Things_To_Dump, died = False):
        self.CreateGame(music)
         
        self.Location = Things_To_Dump[0]
 
        if self.Location == 'Campo':
            self.tilemap = self.Campo
        elif self.Location == 'Dungeon':
            self.tilemap = self.Dungeon
        else:
            self.tilemap = self.Caverna
         
        self.player.kill()
        self.player.add([self.tilemap.SpritesToChoose])
 
        #Agora vamos atualizar as informações do tilemap onde o player se encontra
        #Primeiro as informações do Player
          
        self.player.direction = Things_To_Dump[2][0]
        self.player.number_of_sprite= Things_To_Dump[2][1]
        self.player.collisionRect = Things_To_Dump[2][2]
        self.player.placedPositions = Things_To_Dump[2][3]
        self.player.Justdied = Things_To_Dump[2][4]
        self.player.vida = Things_To_Dump[2][5]
        self.player.vx = Things_To_Dump[2][6]
        self.player.vy = Things_To_Dump[2][7]
        self.player.cooldown = Things_To_Dump[2][8]
        self.player.imunity = Things_To_Dump[2][9]
        self.player.alive = Things_To_Dump[2][10]
        self.player.atking = Things_To_Dump[2][11]
        self.player.digging = Things_To_Dump[2][12]
        self.player.digged = Things_To_Dump[2][13]
        self.player.first_pressed = Things_To_Dump[2][14]
        self.player.pressed = Things_To_Dump[2][15]
        self.player.cont = Things_To_Dump[2][16]
        self.player.cont2 = Things_To_Dump[2][17]
        self.player.numbX = Things_To_Dump[2][18]
        self.player.numbY = Things_To_Dump[2][19]
        self.player.item = Things_To_Dump[2][20]
        self.player.Undelivered = Things_To_Dump[2][21]
         
        if self.player.atking:
            self.player.spritesheet = self.player.atkSheet
        elif self.player.digging:
            self.player.spritesheet = self.player.PaSheet
        elif self.player.vx != 0 or self.player.vy != 0:
            self.player.spritesheet = self.player.MoveSheet
        else:
            self.player.spritesheet = self.player.StopSheet
         
        #Construimos as Espadas do jogo        
        for SwordInfo in Things_To_Dump[3]:
            sword = Sword(self.images['Sword'], (self.player.rect.x - 16, self.player.rect.y - 20), 'Sword', self.player.direction, (self.tilemap.SpritesToChoose, self.tilemap.Swords))
            sword.number_of_sprite = SwordInfo[0]
            sword.image = sword.spritesheet[sword.direction][sword.number_of_sprite]
            sword.cont = SwordInfo[1]
            sword.rect = SwordInfo[2]
         
        #Construimos os inimigos do jogo        
        for EnemieInfo in Things_To_Dump[4]:
            if 'Lesma' == EnemieInfo[0]:
                inimigo = Lesma(self.tilemap.images['Lesma'], (0,0), 'Lesma', (self.tilemap.SpritesToChoose, self.tilemap.Enemies))
            elif 'Bitch' == EnemieInfo[0]:
                inimigo = Bitch(self.tilemap.images['Bitch'], (0,0), 'Bitch', (self.tilemap.SpritesToChoose, self.tilemap.Enemies))
            elif 'Planta' == EnemieInfo[0]:
                inimigo = Planta(self.tilemap.images['Planta'], (0,0), 'Planta', (self.tilemap.SpritesToChoose, self.tilemap.Enemies))
            elif 'Sniper' == EnemieInfo[0]:
                inimigo = Sniper(self.tilemap.images['Sniper'], (0,0), 'Sniper', (self.tilemap.SpritesToChoose, self.tilemap.Enemies))
            else:
                inimigo = Zumbi(self.tilemap.images['Zumbi'], (0,0), 'Zumbi', (self.tilemap.SpritesToChoose, self.tilemap.Enemies))
             
            inimigo.burn = EnemieInfo[1]
            inimigo.collisionRect = EnemieInfo[2]
            inimigo.direction = EnemieInfo[3]
            inimigo.number_of_sprite = EnemieInfo[4]
            inimigo.vida = EnemieInfo[5]
            inimigo.cooldown = EnemieInfo[6]
            inimigo.Max = EnemieInfo[7]
            inimigo.vy = EnemieInfo[8]
            inimigo.vx = EnemieInfo[9]
            inimigo.alive = EnemieInfo[10]
            inimigo.cont = EnemieInfo[11]
            inimigo.numbX = EnemieInfo[12]
            inimigo.numbY = EnemieInfo[13]
            inimigo.atking = EnemieInfo[14]
            inimigo.originalPosition = EnemieInfo[15]
            if not inimigo.alive:
                if inimigo.burn:
                    inimigo.image = inimigo.cinzas
                else:
                    inimigo.image = inimigo.deadImage
         
        #Construcao de Bombas
        for BombaInfo in Things_To_Dump[5]:
            Bomba = Pilastra(self.images['Bomba'], 'Bomba', (0,0), (self.tilemap.SpritesToChoose, self.tilemap.Bombas))
            Bomba.cont = BombaInfo[0]
            Bomba.number_of_sprite = BombaInfo[1]
            Bomba.rect = BombaInfo[2]
         
        #Construcao de Explosoes
        for ExploInfo in Things_To_Dump[6]:
            Explosion = Explosion(self.images['Explosion'], (0,0), 'Explosion', 0, (self.tilemap.Bombas, self.tilemap.SpritesToChoose))
            Explosion.cont = ExploInfo[0]
            Explosion.number_of_sprite = ExploInfo[1]
            Explosion.rect = ExploInfo[2]
         
        #Contrucao de Animacoes
        for AniInfo in Things_To_Dump[7]:
            Animation = DeathAnimation(self.images[AniInfo[0]], (0,0), AniInfo[0], [self.tilemap.SpritesToChoose])
            Animation.rect = AniInfo[1]
            Animation.image = AniInfo[2]
            Animation.number_of_sprite = AniInfo[3]
            Animation.cont = AniInfo[4]
         
        #Construcao de Atks
        for ATKinfo in Things_To_Dump[8]:
            if ATKinfo[0] == 'AtkZumbi':
                ATK = ZumbiAtk(self.tilemap.images['Zumbi']['Atk'], (0,0), ATKinfo[4], ATKinfo[0], [self.tilemap.SpritesToChoose], [enemy for enemy in self.tilemap.Enemies if enemy.nome == 'Zumbi'][0])
            else:
                if 'Sniper' in ATKinfo[0]:
                    ATK = Atk(self.tilemap.images['Sniper']['Atk'], (0,0), ATKinfo[4], ATKinfo[0], ATKinfo[1], [self.tilemap.SpritesToChoose])
                else:
                    ATK = Atk(self.tilemap.images['Planta']['Atk'], (0,0), ATKinfo[4], ATKinfo[0], ATKinfo[1], [self.tilemap.SpritesToChoose])
             
            ATK.number_of_sprite = ATKinfo[2]
            ATK.alive = ATKinfo[3]
            ATK.rect = ATKinfo[5]
            ATK.Max = ATKinfo[6]
            ATK.cont = ATKinfo[7]
         
        #Colocando o menu de Itens
        self.ItemMenu.Itens = Things_To_Dump[9].Itens
        self.ItemMenu.selected = Things_To_Dump[9].selected
        self.ItemMenu.using = Things_To_Dump[9].using
        self.ItemMenu.menu = Things_To_Dump[9].menu
        self.ItemMenu.Fala = Things_To_Dump[9].Fala
         
         
        self.Campo.AdjustTileHoleAndRachadura(Things_To_Dump[1][0], self)
        self.Campo.AdjustJewels(Things_To_Dump[1][0], self)
         
        self.Caverna.AdjustTileHoleAndRachadura(Things_To_Dump[1][1], self)
        self.Caverna.AdjustJewels(Things_To_Dump[1][1], self)
         
        self.Dungeon.AdjustTileHoleAndRachadura(Things_To_Dump[1][2], self)
        self.Dungeon.AdjustJewels(Things_To_Dump[1][2], self)
         
        #Verificamos o numero de joias devolvidas
        self.Delivered = Things_To_Dump[10]
         
        #E por ultimo vemos se ja dialogamos com o sr moshiro ou nao
        self.Campo.Moshiro.first = Things_To_Dump[11]
 
        self.tilemap.set_focus(self.player.collisionRect.centerx, self.player.collisionRect.centery)
         
        if not died:
            self.Escroto.SaveGame(self,'CheckPoint.save', 0, 2,0)
         
        if self.musicPlaying:
            self.tilemap.InicializeSounds()
            self.tilemap.SetSound(self)
         
        self.SaveTilemaps()
         
       #self.ItemMenu.Itens['Safira']['Possui'] = True
       #self.ItemMenu.Itens['Safira']['Delivered'] = True
       #self.Delivered += 1
        self.ResizeScreen(Surface.get_width(), Surface.get_height())  
        self.main(Surface)
     
    def SaveTilemaps(self):
        self.Escroto.SaveTilemap('Campo.tilemap', self.Campo)
        self.Escroto.SaveTilemap('Caverna.tilemap', self.Caverna)
        self.Escroto.SaveTilemap('Dungeon.tilemap', self.Dungeon)
         
        del self.Campo
        del self.Caverna
        del self.Dungeon
     
    def winGame(self, Surface):
        #self.tilemap.Moshiro.display(Surface, self, music = False)
        pygame.mixer.music.load(resources.file_path('ost_moshiro_presto.ogg', 'Musica'))
        pygame.mixer.music.play(-1, 0.0)
        if self.player.collisionRect.x != 448 or self.player.collisionRect.y != 144:
            self.MovePlayer(Surface)
         
         
        self.tilemap.Moshiro.moshiroAndandoFinal(Surface, self)
        self.player.image = self.player.StopSheet[2][0]
         
        self.tilemap.Moshiro.display(Surface, self, False, False)
         
        for pilastra in self.tilemap.Pilastras:
            if pilastra.nome == 'RuinaFinal':
                pilastra.number_of_sprite = 1
                pilastra.image = pilastra.spritesheet[0][pilastra.number_of_sprite]
         
        contador = 0
        limite = 2
         
        self.tilemap.StopSounds()
        pygame.mixer.music.load(resources.file_path('ost_ending.ogg', 'Musica'))
        pygame.mixer.music.play(0, 0.0)
         
        while contador < limite:
            contador += self.mainClock.tick(30)/1000
             
            for event in pygame.event.get():
                QUIT_Event(event)
                Surface = VIDEORESIZE_Event(self, event, Surface)
             
            self.tilemap.draw(Surface)
 
            TransformSurfaceScale(Surface, self.width, self.height, self.rect)
            pygame.display.flip()
         
        #Fade para o Branco
        NewSurface = pygame.Surface.copy(Surface)
        NewSurface.fill((255,255,255))
         
        FadeIn(self,NewSurface, Surface)
        selected = 0
        self.images['Ending'] = load_sheet('menu_final.png', 'Menus', MAXWIDTH, HEIGHT)
         
        while True:
            for event in pygame.event.get():
                if event.type == QUIT:
                    terminate ()
                if event.type == KEYUP:
                    if event.key == ord('m'):
                        if self.musicPlaying:
                            pygame.mixer.music.stop()
                        else:
                            pygame.mixer.music.play(-1, 0.0)
                         
                        self.musicPlaying = not self.musicPlaying
                 
                if event.type == KEYDOWN:
                    if event.key == K_a:
                        if selected < len(self.images['Ending'][0]) - 1:
                            selected += 1
                        else:
                            terminate()
                 
                Surface = VIDEORESIZE_Event(self, event, Surface)
             
            Surface.blit(self.images['Ending'][0][selected], (- (MAXWIDTH-self.width)//2,0))
             
            TransformSurfaceScale(Surface, self.width, self.height, self.rect)
            pygame.display.flip()
            self.mainClock.tick(self.FPS)
         
     
    def MovePlayer(self, Surface):
        #É preciso calcular a tragetória do player para que ele fique de frente para 
        #o sr moshiro (432, 144) 432 + 16 = 448
        posY = self.tilemap.Moshiro.collisionRect.bottom
        posX = self.tilemap.Moshiro.collisionRect.right
         
        tileX = (self.player.collisionRect.centerx // 16)
        tileY = (self.player.collisionRect.centery // 12)
         
        distY = posY - self.player.collisionRect.bottom
         
         
        #Temos que olhar para posição do retângulo do player como um todo
        #Caso o player esteja na linha dos tilesY 11 precisamos ver se
        #o fundo dele nao encosta na tile block
        if tileY == 11:
            #Caso o player esteja na linha dos tilesY 11 precisamos ver se
            #o fundo dele nao encosta na tile block
            if self.player.collisionRect.bottom > 144:
                self.player.AndaAutomatico(2, (self.player.collisionRect.x, 144), self, Surface)
        elif tileY == 12:
            #Caso o player esteja na linha de tilesY 12 ele precisa se deslocar para cima 
            #ou para baixo dependendo do valor da distância em y
            if self.player.collisionRect.x < posX:
                if distY <= 0:
                    self.player.AndaAutomatico(0, (self.player.collisionRect.x, posY+12), self, Surface)
                else:
                    self.player.AndaAutomatico(2, (self.player.collisionRect.x, posY-12), self, Surface)
        else:
            #Neste último caso ele só pode estar na linha de 13 e logo devemos ver se o topo dele nao bate no block
            if self.player.collisionRect.bottom < posY+12 and self.player.collisionRect.x < posX:
                self.player.AndaAutomatico(0, (self.player.collisionRect.x, posY+12), self, Surface)
             
        #Em seguida é preciso fazer o player se mover horizontalmente
        self.player.AndaAutomatico(1, (posX, self.player.collisionRect.bottom), self, Surface)
         
        #E por fim move-lo verticalmente novamente
        distY = posY - self.player.collisionRect.bottom
         
        if distY > 0:
            self.player.AndaAutomatico(0, (self.player.collisionRect.x, posY), self, Surface)
        else:
            self.player.AndaAutomatico(2, (self.player.collisionRect.x, posY), self, Surface) 
         
 
    def Died(self, Surface):
         
        #Leva o player girando para o centro da Tela
        if self.musicPlaying:
            pygame.mixer.Sound(resources.file_path('ost_gameover.ogg', 'Musica')).play()
         
        cont = 0
        dt = self.time
        self.mainClock.tick(30)
         
 
        girando = load_sheet('spr_pla_olhosfechados.png', 'Imagens', 48,60)
        caindo = load_sheet('spr_pla_morto.png', 'Imagens', 48,60)
        sr_moshiro = load_sheet('menu_gameover_moshiro.png', 'Menus', MAXWIDTH,HEIGHT)
        menu = load_sheet('menu_gameover.png', 'Menus', WIDTH, HEIGHT)
 
 
        numero_da_imagem = 0
        Max = len(girando)
         
        self.ResizeScreen(Surface.get_width(), Surface.get_height())
        #Começa a mostrar a animação do player girando
        while cont < 2:
            dt = 2*self.time
            self.mainClock.tick(self.FPS//2)
            imagem = girando[numero_da_imagem][0]
 
            numero_da_imagem += 1
            if numero_da_imagem == Max:
                numero_da_imagem = 0
 
            Surface.fill((0,0,0))
            Surface.blit(imagem, (56+ + (self.width - WIDTH)//2,34))
            TransformSurfaceScale(Surface, self.width, self.height, self.rect)
            pygame.display.flip()
            cont += dt
 
        #Passa a Fazer o player cai
 
        numero_da_imagem = 0
        Max = len(caindo[0])
 
        while numero_da_imagem != Max:
            dt = 4*self.time
            self.mainClock.tick(self.FPS//4)
            imagem = caindo[0][numero_da_imagem]
            numero_da_imagem += 1
 
            Surface.fill((0,0,0))
            Surface.blit(imagem, (56 + (self.width - WIDTH)//2,34))
            TransformSurfaceScale(Surface, self.width, self.height, self.rect)
            pygame.display.update()
 
        pygame.time.wait(1000)
 
        #Fade para o Branco
        NewSurface = pygame.Surface.copy(Surface)
        NewSurface.fill((255,255,255))
         
        FadeIn(self,NewSurface, Surface)
 
        #Sr.Moshiro Falando
        texto = "Estou decepcionado com você"
        font = pygame.font.SysFont("Calibri", 14)
 
        display = TextHandler(texto, pygame.rect.Rect(20, 85, 123, 35), Surface, self, font,[[sr_moshiro, [-(MAXWIDTH - self.width)//2,0], 0, 3*self.time, 0], [pygame.transform.scale(self.images['FalaEscuro'], (214, 36)).convert_alpha(), (0, 84)]], life = False)
         
        del display
         
        #Colocando o Menu de Escolha
        Choose = False
        self.selected = 0
        while not Choose:
            for event in pygame.event.get():
                if event.type == QUIT:
                    terminate()
                if event.type == KEYDOWN:
                    if event.key == K_DOWN:
                        self.selected += 1
                    if event.key == K_UP:
                        self.selected -= 1
                    if event.key == K_a:
                        if self.selected == 0:
                            Archive = open('CheckPoint.save', 'rb')
                            Things_to_Dump = pickle.load(Archive)
                            self.LoadGame(Surface, self.musicPlaying, Things_to_Dump, died = True)
                        else:
                            terminate ()
 
            if self.selected > 1:
                self.selected = 0
            if self.selected < 0:
                self.selected = 1
             
            Surface.fill((0,0,0))
            Surface.blit(menu[0][self.selected], ((self.width - WIDTH)//2,0))
            TransformSurfaceScale(Surface, self.width, self.height, self.rect)
            pygame.display.update()
Example #42
0
from hero_class import Hero
from enemy_class import Enemy
from Dungeon import Dungeon

import os


if __name__ == '__main__':
    our_hero = Hero(name="Bron", title="Dragonslayer", health=100, mana=100, mana_regeneration_rate=2)
    game_dungeon = Dungeon.load_from_file("level1.txt")

    print("Welcome to Dungeons and Pythons!")
    print("You can move your hero by using the W(up), A(left), S(down) and D(right) keys on your keyboard.")
    print("To attack your enemies, use L.")
    print("Have fun! ;)\n")

    player_choice = input("Do you want to start a new game?[y/n]: ")

    # if player_choice == "H" or player_choice == "h":
    #     print("Dungeons and Pythons' rules:")
    #     print("Your hero is {}".format(our_hero.known_as()) + ". ")
    #     print("Starting health: {}".format(our_hero.get_health()))
    #     print("Starting mana: {}".format(our_hero.get_mana) + "\n")
# 
    #     print("You can move your hero up, down, left and right across the ", )
    #     print("map using the keys on your keyboard.", )
    #     print("")

    if player_choice == "Y" or player_choice == "y":

        game_dungeon.spawn(our_hero)
 def test_map_reading(self):
     self.assertEqual(Dungeon.map_reading("game_map.txt"), self.my_map)
Example #44
0
class Test_Dungeon(unittest.TestCase):

    def setUp(self):
        self.map = Dungeon("level1.txt")
        self.h = Hero(name="Bron", title="Dragonslayer",
                      health=100, mana=100, mana_regeneration_rate=2)

    def test_init(self):
        self.assertEqual(self.map.get_map(), [['S', '.', '#', '#', '.', '.', 'S', '.', '.', 'T'], ['#', 'T', '#', '#', '.', '.', '#', '#', '#', '.'], [
                         '#', '.', '#', '#', '#', 'E', '#', '#', '#', 'E'], ['#', '.', 'E', '.', '.', '.', '#', '#', '#', '.'], ['#', '#', '#', 'T', '#', '#', '#', '#', '#', 'G']])
        self.assertEqual(self.map.get_enemies(), [[2, 5], [2, 9], [3, 2]])

    def test_spawn(self):
        self.map.spawn(self.h)
        self.assertEqual(self.h.mana, self.h.starting_mana)
        self.assertEqual(self.h.health, self.h.starting_health)
        self.assertEqual(self.map.get_hero_x(), 0)
        self.assertEqual(self.map.get_hero_y(), 0)
        self.assertTrue(self.map.spawn(self.h))

    def test_move(self):
        self.map.spawn(self.h)
        self.h.take_damage(90)
        self.assertFalse(self.map.move_hero(self.h, 'up'))
        self.assertTrue(self.map.move_hero(self.h, 'right'))
        with self.assertRaises(Wrong_direction):
            self.assertTrue(self.map.move_hero(self.h, 'hihihi'))
        self.assertEqual(1, self.map.get_hero_x())
        self.assertEqual(0, self.map.get_hero_y())
        self.assertFalse(self.map.move_hero(self.h, 'right'))
        self.assertEqual(1, self.map.get_hero_x())
        self.assertEqual(0, self.map.get_hero_y())
        # self.map.move_hero(self.h, 'down')

    def test_spell_or_weapon(self):
        self.h.equip(Weapon(name="The Axe of Destiny", damage=20))
        self.h.learn(
            Spell(name="Fireball", damage=30, mana_cost=50, cast_range=2))
        self.assertTrue(isinstance(self.map.spell_or_weapon(self.h), Spell))
        self.h.equip(Weapon(name="The Axe of Destiny", damage=120))
        self.assertTrue(isinstance(self.map.spell_or_weapon(self.h), Weapon))

    def test_hero_attack(self):
        self.h.equip(Weapon(name="The Axe of Destiny", damage=20))
        self.h.learn(
            Spell(name="Fireball", damage=30, mana_cost=50, cast_range=2))
        self.map.spawn(self.h)
        self.map.print_map()
        self.map.move_hero(self.h, 'right')
        self.map.print_map()
        self.map.move_hero(self.h, 'down')
        self.map.print_map()
        self.map.move_hero(self.h, 'down')
        self.map.print_map()
        self.map.move_hero(self.h, 'down')
        self.map.print_map()
        # self.assertEqual(self.map.move_hero(self.h, 'right'), True)
        self.map.hero_attack(self.h)
        self.map.print_map()
        for x in range(5):
            self.map.move_hero(self.h, 'right')
        self.map.print_map()
        self.map.move_hero(self.h, 'up')
        self.map.print_map()
        self.map.spawn(self.h)
        self.map.print_map()
        self.map.move_hero(self.h, 'left')
        self.map.move_hero(self.h, 'down')
        self.map.move_hero(self.h, 'down')
        self.map.print_map()
Example #45
0
 def setUp(self):
     self.map = Dungeon("level1.txt")
     self.h = Hero(name="Bron", title="Dragonslayer",
                   health=100, mana=100, mana_regeneration_rate=2)
    def main(self):
        """
        This is the main method.
        """
        global my_image, adventurer_i_index, adventurer_j_index, dng, exit_i_index, exit_j_index, n_rows, n_cols
        adventurer_i_index = 0
        adventurer_j_index = 0

        # Create tk windows and bind key strokes
        DungeonGui.create_tk_windows(self)

        # Create GUI rooms
        dungeon = DungeonGui(n_rows, n_cols)
        dungeon.create_rooms()

        # Populate the GUI rooms with dungeon content
        dng = Dungeon(n_rows, n_cols)
        dng.dungeon_generator()
        print(dng)
        for i in range(0, n_rows):
            for j in range(0, n_cols):
                row_index = i
                col_index = j
                content = dng.room_list[i][j].room_content

                if content == 'i':
                    dungeon.create_content(row_index, col_index, content)

                if content == 'O':
                    dungeon.create_content(row_index, col_index, content)

                east_door_symbol = dng.room_list[i][j].room_matrix[1][2]
                #                dungeon.create_east_door(row_index, col_index, east_door_symbol)

                west_door_symbol = dng.room_list[i][j].room_matrix[1][0]
                #                dungeon.create_west_door(row_index, col_index, west_door_symbol)

                north_door_symbol = dng.room_list[i][j].room_matrix[0][1]
                #                dungeon.create_north_door(row_index, col_index, north_door_symbol)

                south_door_symbol = dng.room_list[i][j].room_matrix[2][1]
                #                dungeon.create_south_door(row_index, col_index, south_door_symbol)

                if content == 'i':
                    adventurer_i_index = i
                    adventurer_j_index = j
                    my_image = dungeon.create_adventurer(
                        adventurer_j_index * 100 + 32,
                        adventurer_i_index * 100 + 32)

                if content == 'O':
                    exit_i_index = i
                    exit_j_index = j
                    #print(exit_i_index,exit_j_index)
        """
         Displays
        """
        label1a = tk.Label(my_window, text='INSTRUCTIONS:', fg="blue")
        label1a.config(font=('Arial', 15))
        my_canvas.create_window(950, 50, window=label1a)

        label1b = tk.Label(my_window, text='Use Keyboard Arrow Keys')
        label1b.config(font=('Arial', 15))
        my_canvas.create_window(950, 75, window=label1b)

        label2 = tk.Label(my_window, text='Entrance: i, Exit: O')
        label2.config(font=('Arial', 15))
        my_canvas.create_window(950, 100, window=label2)

        label3 = tk.Label(my_window, text='Pillars and Doors Hidden')
        label3.config(font=('Arial', 15))
        my_canvas.create_window(950, 150, window=label3)

        label3 = tk.Label(my_window, text='Gather Pillars and Reach O')
        label3.config(font=('Arial', 15))
        my_canvas.create_window(950, 180, window=label3)

        label7 = tk.Label(my_window, text='  SCORE:', fg='blue')
        label7.config(font=('Arial', 15))
        my_canvas.create_window(950, 300, window=label7)

        my_window.mainloop()  # enter main loop
class TestDungeon(unittest.TestCase):

    def setUp(self):
        self.my_hero = Hero("Bron", "Dragonslayer", 100, 50, 2)
        self.my_map = [['S', '.', '#', '#', '.', '.', '.', '.', '.', 'T'],
                       ['#', 'T', '#', '#', '.', '.', '#', '#', '#', '.'],
                       ['#', '.', '#', '#', '#', 'E', '#', '#', '#', 'E'],
                       ['#', '.', 'E', '.', '.', '.', '#', '#', '#', '.'],
                       ['#', '#', '#', 'T', '#', '#', '#', '#', '#', 'G']]
        self.my_dungeon = Dungeon(self.my_hero, self.my_map)

    def test_map_reading(self):
        self.assertEqual(Dungeon.map_reading("game_map.txt"), self.my_map)

    def test_initialisation(self):
        self.assertTrue(isinstance(self.my_dungeon, Dungeon))

    def test_spawn(self):
        with self.assertRaises(NotAHero):
            self.my_dungeon.spawn(10)
        self.my_dungeon.map_reading("game_map.txt")
        self.assertTrue(self.my_dungeon.spawn(self.my_hero))
        self.assertEqual(self.my_dungeon.hero_position_x, 0)
        self.assertEqual(self.my_dungeon.hero_position_y, 0)

    def test_move_hero_falses(self):
        self.my_dungeon.map_reading("game_map.txt")
        self.my_dungeon.spawn(self.my_hero)
        self.assertFalse(self.my_dungeon.move_hero("up"))
        self.assertFalse(self.my_dungeon.move_hero("left"))
        self.my_dungeon.hero_position_x = 4
        self.my_dungeon.hero_position_y = 9
        self.assertFalse(self.my_dungeon.move_hero("down"))
        self.assertFalse(self.my_dungeon.move_hero("right"))

    def test_move_hero(self):
        self.my_dungeon.map_reading("game_map.txt")
        self.my_dungeon.hero_position_y = 1
        self.my_dungeon.hero_position_x = 0
        self.assertTrue(self.my_dungeon.move_hero("left"))
        self.my_dungeon.hero_position_x = 1
        self.my_dungeon.hero_position_y = 1
        self.assertTrue(self.my_dungeon.move_hero("up"))
        self.my_dungeon.hero_position_x = 0
        self.my_dungeon.hero_position_y = 1
        self.assertTrue(self.my_dungeon.move_hero("down"))

    def test_changing_pos(self):
        self.my_dungeon.changing_pos_func(0, 1)
        self.assertEqual(self.my_dungeon.hero_position_x, 0)
        self.assertEqual(self.my_dungeon.hero_position_y, 1)

    def test_pick_treasure(self):
        my_dict = Dungeon.load_treasure_file("treasures.json")
        x = self.my_dungeon.pick_treasure(my_dict)
        x = x[:15]
        needed = "Bron's treasure"
        self.assertEqual(x, needed)

    def test_print_map(self):
        pass
Example #48
0
class Test_dungeon(unittest.TestCase):

    def setUp(self):
        path = open("path.txt", "w")
        self.dung_map = """S.##......
#.##..###
#.###.###.
#.....###
###.####S"""
        path.write(self.dung_map)
        path.close()
        self.dungeon = Dungeon("path.txt")
        self.bron = Hero("Bron", 100, "DragonSlayer")
        self.orc = Orc("orc", 90, 1.4)
        self.bron.equip_weapon(Weapon("Mighty Axe", 25, 0.2))
        self.orc.equip_weapon(Weapon("basher", 16, 0.75))

    def test_dungeon_init(self):
        self.assertEqual(self.dungeon.map, self.dung_map)

    def test_spawn_hero(self):
        self.assertTrue(self.dungeon.spawn("hero", self.bron))
        self.dung_map = """H.##......
#.##..###
#.###.###.
#.....###
###.####S"""
        self.assertEqual(self.dungeon.map, self.dung_map)

    def test_spawn_hero_and_orc(self):
        self.assertTrue(self.dungeon.spawn("hero", self.bron))
        self.assertTrue(self.dungeon.spawn("orc", self.orc))
        self.dung_map = """H.##......
#.##..###
#.###.###.
#.....###
###.####O"""
        self.assertEqual(self.dungeon.map, self.dung_map)

    def test_spawn_no_free_start_postion(self):
        self.dungeon.spawn("hero", self.bron)
        self.dungeon.spawn("hero2", self.bron)
        self.assertFalse(self.dungeon.spawn("heroo", self.orc))

    def test_move_possible(self):
        self.dungeon.spawn("hero", self.bron)
        self.assertTrue(self.dungeon.move("hero", "right"))
        self.dung_map = """.H##......
#.##..###
#.###.###.
#.....###
###.####S"""
        self.assertEqual(self.dungeon.map, self.dung_map)

    def test_move_imposible(self):
        self.dungeon.spawn("hero", self.bron)
        self.assertFalse(self.dungeon.move("hero", "left"))
        self.dung_map = """H.##......
#.##..###
#.###.###.
#.....###
###.####S"""
        self.assertEqual(self.dungeon.map, self.dung_map)

    def test_move_fight(self):
        self.dungeon.map = """SS##......
#.##..###
#.###.###.
#.....###
###.####S"""
        self.dungeon.spawn("hero", self.bron)
        self.dungeon.spawn("orc", self.orc)
        self.dung_map = """.O##......
#.##..###
#.###.###.
#.....###
###.####S"""
        self.dungeon.move("hero", "right")
        self.assertEqual(self.dungeon.map, self.dung_map)

    def tearDown(self):
        os.remove("path.txt")
Example #49
0
class CellMoveSimulator(Simulator):
    def __init__(self, param, dungeon=None):
        self.random_enemy = param.get('randomEnemy', False)
        if dungeon is None:
            self.dungeon = Dungeon(30, 40, no_generate_enemy=self.random_enemy)
        else:
            self.dungeon = dungeon
        self.is_end = False
        self.friend_agent: Friend = None
        self.turn = 0

        self.first_room = param.get('firstRoom', None)
        self.no_enemy = param.get('noEnemy', False)
        self.max_turn = param.get('maxTurn', 1500)

        self.map = self.dungeon.floor_map.copy()
        self.map[self.map == CellInfo.PROTECTED] = CellInfo.ROOM
        self.map[self.map == CellInfo.ENEMY] = CellInfo.ROOM

        self.enemy_list = [Enemy(-1, -1), Enemy(-1, -1)]
        self.reset()

    def reset(self):
        self.is_end = False
        self.turn = 0
        if self.first_room is None or self.first_room < 0:
            first_room: Room = random.choice(self.dungeon.rooms)
        else:
            first_room: Room = self.dungeon.rooms[self.first_room]
        first_room_map = self.dungeon.get_room_map(first_room)
        index = random.choice(
            np.where(first_room_map.reshape(-1) == CellInfo.ROOM)[0])
        y = int(index / first_room_map.shape[1] + first_room.origin[0])
        x = int(index % first_room_map.shape[1] + first_room.origin[1])
        self.friend_agent = Friend(y, x, first_room.id)
        self._load_enemy(first_room.id)

    def action(self, action):
        self.turn += 1
        next_room_id = -1
        if type(action) == dict:
            next_room_id = action['nextRoomId']
            action = action['action']
        before_point = (self.friend_agent.x, self.friend_agent.y)

        if action == 0:
            for v in FOUR_DIRECTION_VECTOR:
                x = self.friend_agent.x + v[0]
                y = self.friend_agent.y + v[1]
                e = [
                    enemy for enemy in self.enemy_list
                    if enemy.x == x and enemy.y == y
                ]
                if len(e) >= 1:
                    e[0].x = -1
                    e[0].y = -1
                    break
        elif action == 1:
            self.friend_agent.y -= 1
        elif action == 2:
            self.friend_agent.x += 1
        elif action == 3:
            self.friend_agent.y += 1
        elif action == 4:
            self.friend_agent.x -= 1

        if self.map[self.friend_agent.y][self.friend_agent.x] == CellInfo.WALL:
            self.friend_agent.x = before_point[0]
            self.friend_agent.y = before_point[1]

        if any([(enemy.x, enemy.y) == (self.friend_agent.x,
                                       self.friend_agent.y)
                for enemy in self.enemy_list]):
            self.friend_agent.x = before_point[0]
            self.friend_agent.y = before_point[1]

        self._enemy_action()

        if self.turn > self.max_turn:
            self.is_end = True
            return -100

        if self.is_end:
            return -100

        if self.map[self.friend_agent.y][self.friend_agent.x] == CellInfo.ROAD:
            road = [
                road
                for road in self.dungeon.rooms[self.friend_agent.room_id].roads
                if (self.friend_agent.x, self.friend_agent.y) in road.ends
            ][0]
            end_position = [
                end for end in road.ends
                if end != (self.friend_agent.x, self.friend_agent.y)
            ][0]
            for v in FOUR_DIRECTION_VECTOR:
                if self.map[end_position[1] + v[1],
                            end_position[0] + v[0]] == CellInfo.ROOM:
                    self.friend_agent.x = end_position[0] + v[0]
                    self.friend_agent.y = end_position[1] + v[1]
                    self.friend_agent.room_id = \
                        [room for room in road.connected_rooms if room.id != self.friend_agent.room_id][0].id
                    break
            self._load_enemy(self.friend_agent.room_id)
            if self.friend_agent.room_id == next_room_id:
                return 100
            else:
                return -100

        if self.map[self.friend_agent.y][self.friend_agent.x] == CellInfo.GOAL:
            self.is_end = True
            return 100

        return -1

    def _load_enemy(self, room_id):
        if self.no_enemy:
            return
        if self.random_enemy:
            room = self.dungeon.rooms[room_id]
            for e in self.enemy_list:
                room_map = self.dungeon.get_room_map(room)
                index = random.choice(
                    np.where(room_map.reshape(-1) == CellInfo.ROOM)[0])
                y = int(index / room_map.shape[1] + room.origin[0])
                x = int(index % room_map.shape[1] + room.origin[1])
                e.x = x
                e.y = y
        else:
            for p, e in zip(
                    self.dungeon.rooms[room_id].initial_enemy_positions,
                    self.enemy_list):
                e.x = p[0]
                e.y = p[1]

    def _enemy_action(self):
        enemy_positions = set()
        for enemy in self.enemy_list:
            action_candidates = self._search(enemy.x, enemy.y)
            next_position_list = []
            distance = 1000000
            for _ in range(len(action_candidates)):
                action_candidate = heappop(action_candidates)
                if action_candidate[0] == 0:
                    self.is_end = True
                    return
                else:
                    next_position = (action_candidate[1], action_candidate[2])
                    if action_candidate[0] > distance:
                        break
                    distance = action_candidate[0]
                    if next_position in enemy_positions:
                        continue
                    next_position_list.append(next_position)
            if next_position_list:
                next_position = random.choice(next_position_list)
                enemy.x = next_position[0]
                enemy.y = next_position[1]
                enemy_positions.add(next_position)

    def _search(self, x, y):
        list_ = []
        for v in FOUR_DIRECTION_VECTOR:
            x2 = x + v[0]
            y2 = y + v[1]
            if self.map[y2][x2] != CellInfo.ROOM:
                continue
            distance = abs(self.friend_agent.x -
                           x2) + abs(self.friend_agent.y - y2)
            heappush(list_, (distance, x2, y2))
        return list_

    def info(self):
        agent_position_inner_room = self._get_agent_position_inner_room()
        return {
            "isEnd":
            self.is_end,
            "roomId":
            self.friend_agent.room_id,
            "x":
            agent_position_inner_room[0],
            "y":
            agent_position_inner_room[1],
            "enemies": [{
                "x":
                max(
                    e.x -
                    self.dungeon.rooms[self.friend_agent.room_id].origin[1],
                    -1),
                "y":
                max(
                    e.y -
                    self.dungeon.rooms[self.friend_agent.room_id].origin[0],
                    -1),
            } for e in self.enemy_list],
            "map": {
                "cells": [[e.value for e in line] for line in self.map],
                "rooms": [room.info() for room in self.dungeon.rooms],
            }
        }

    def _get_agent_position_inner_room(self):
        x = self.friend_agent.x - self.dungeon.rooms[
            self.friend_agent.room_id].origin[1]
        y = self.friend_agent.y - self.dungeon.rooms[
            self.friend_agent.room_id].origin[0]
        return x, y