/// <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); }
/// <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); }