def open_gate(*args, **kwargs):
    caster = args[0]
    gate_entity = args[1]
    results = []
    player = kwargs.get('player')
    game_map = kwargs.get('game_map')

    jail_key = caster.inventory.check_item_by_index("jail_key")
    master_key = caster.inventory.check_item_by_index("master_key")

    if jail_key or master_key:

        # Don't Consume Key
        if not master_key:
            results.append({"change_map_object": [gate_entity, 2],
                            'message': Message('You unlock the cell consuming a {}.'.format(jail_key.name),
                                               tcod.yellow)})
            jail_key.item.use_function = eval("ItemFunctions.consume")
            results.extend(caster.inventory.use(jail_key))
        else:
            results.append({"change_map_object": [gate_entity, 2],
                            'message': Message('You unlock the cell.', tcod.yellow)})

        # Free Denizens of Jail and Make them Head towards Exit or Follow Player
        # if caster == player:

        if game_map.level == 'undergrave':
            for jail_cell in game_map.map.jail_cells:
                if gate_entity in jail_cell.entrances:
                    ai_type = 1
                    # ai_type = randint(1, 2)
                    for prisoner_entity in jail_cell.entities:
                        EventFunctions.change_faction(entity=prisoner_entity, new_faction='Rebels')

                        # TODO: Either follow player depending on alignment score/wander/head toward exit
                        if ai_type == 1:
                            prisoner_entity.dialogue = Dialogue(['Lead the way boss!'])
                            # encounter =
                            prisoner_entity.ai = FollowAI(follow_entity=player, encounter=prisoner_entity.ai.encounter)
                            prisoner_entity.ai.owner = prisoner_entity
                            # prisoner_entity.ai.encounter.main_target = game_map.stairs
                        else:
                            prisoner_entity.dialogue = Dialogue(['Freedom! I\'m getting outta here!!'])
                            prisoner_entity.ai.encounter.main_target = game_map.stairs

                    # Remove Jail from "Rooms to Avoid" because it has been opened. Room is now Patrollable.
                    game_map.map.jail_cells.remove(jail_cell)
                    break

    else:
        results.append({'message': Message('A locked jail gate blocks your way.', tcod.yellow)})

    return results