Exemplo n.º 1
0
    /// <summary>
    /// Place la <see cref="DungeonRoom"/> de fin et la <see cref="DungeonRoom"/> du boss
    /// </summary>
    private void PlaceGoalAndEndRooms()
    {
        // On souhaite que notre fin de jeu se situe à un bout de la map  mais on souhaite aussi que notre salle de boss
        // ne soit accessible que par 1 entrée et donne seulement sur la salle de fin
        // On va donc assigner une feuille random de l'arbre à la salle de boss, puis ajouter à la suite dans une direction random la salle de fin

        IncreaseKeyLevel();

        // 1 - Récupération de la salle de boss
        List <DungeonRoom> leafs = roomPerKeyLevel[currentKeyLevel - 1].Where(r => r.GetChildrens().Count == 0).ToList();

        if (leafs.Count == 0)
        {
            throw new System.Exception("Aucune feuille disponible");
        }

        leafs.Shuffle();
        DungeonRoom bossRoom = GetRandomRoomWithFreeEdges(leafs);

        if (bossRoom == null)
        {
            throw new System.Exception("Impossible de récupèrer une room de boss");
        }

        bossRoom.SetType(RoomType.BOSS);

        // /!\ Attention pour être sur que le joueur ait récupéré toutes les clés, on met ensuite la salle de boss et de fin au plus haut keylevel /!\
        ChangeKeyLevel(bossRoom, currentKeyLevel);
        DungeonRoom bossParentRoom = bossRoom.GetParent();

        // maj des edges
        bossRoom.Link(bossParentRoom, currentKeyLevel); // il y aura forcément un blocage
        bossParentRoom.Link(bossRoom, currentKeyLevel);

        // 2 - Ajout de la salle finale à la suite de celle du boss
        Vector2     endPos  = GetRandomPosAvailableForRoom(bossRoom.getPos());
        DungeonRoom endRoom = new DungeonRoom(endPos, currentKeyLevel, RoomType.END);

        // On link les salles enfants et parents entre elles
        bossRoom.Link(endRoom, -1); // Pas de blocage entre la salle de boss et de fin
        endRoom.Link(bossRoom, -1);

        endRoom.SetParent(bossRoom);
        bossRoom.AddChild(endRoom);

        // On ajoute la nouvelle salle au donjon
        AddRoomToDungeonForKeyLevel(endRoom, currentKeyLevel);
        AddRoomToDungeon(endRoom);
    }
Exemplo n.º 2
0
    /// <summary>
    /// Ajoute des <see cref="DungeonEdge"/> entre les deux rooms, par défaut on change le parent de l'enfant mais on peut le désactiver
    /// NB : on veut le désactiver lors qu'on graphifie notre arbre pour s'assurer d'avoir toujours un point d'entrée unique par level
    /// </summary>
    /// <param name="parentRoom">La pièce parente</param>
    /// <param name="childRoom">La pièce enfant</param>
    /// <param name="keyLevel">Le niveau de clé</param>
    /// <param name="onlyChildrensRelation">si <see cref="true"/> seules les listes des rooms enfants sont mise à jour</param>
    private void LinkParentAndChild(DungeonRoom parentRoom, DungeonRoom childRoom, int keyLevel, bool onlyChildrensRelation = false)
    {
        // On link les salles enfants et parents entre elles
        parentRoom.Link(childRoom, keyLevel); // Si le niveau de clé a changé, le lien devient conditionnel
        childRoom.Link(parentRoom, keyLevel);

        if (!onlyChildrensRelation)
        {
            childRoom.SetParent(parentRoom);
        }
        else
        {
            childRoom.AddChild(parentRoom);
        }

        parentRoom.AddChild(childRoom);
    }