/**
     * Computes the 'intensity' of each {@link MZRoom}. MZRooms generally Get more
     * intense the deeper they are into the dungeon.
     *
     * @param levels    the keyLevel -> room-set mapping to update
     * @ if it fails
     * @see KeyLevelRoomMapping
     * @see MZRoom
     */
    protected void ComputeIntensity(KeyLevelRoomMapping levels)
    {
        double nextLevelBaseIntensity = 0.0;

        for (int level = 0; level < levels.KeyCount(); ++level)
        {
            double intensity = nextLevelBaseIntensity *
                               (1.0 - intensityEaseOff);

            foreach (MZRoom room in levels.GetRooms(level))
            {
                if (room.GetParent() == null ||
                    !room.GetParent().GetPrecond().
                    Implies(room.GetPrecond()))
                {
                    nextLevelBaseIntensity = Math.Max(
                        nextLevelBaseIntensity,
                        ApplyIntensity(room, intensity));
                }
            }
        }

        NormalizeIntensity();

        dungeon.FindBoss().SetIntensity(1.0);
        MZRoom goalRoom = dungeon.FindGoal();

        if (goalRoom != null)
        {
            goalRoom.SetIntensity(0.0);
        }
    }
    /**
     * Recursively applies the given intensity to the given {@link MZRoom}, and
     * higher intensities to each of its descendants that are within the same
     * keyLevel.
     * <p>
     * Intensities set by this method may (will) be outside of the normal range
     * from 0.0 to 1.0. See {@link #NormalizeIntensity} to correct this.
     *
     * @param room      the room to set the intensity of
     * @param intensity the value to set intensity to (some randomn variance is
     *                  Added)
     * @see MZRoom
     */
    protected double ApplyIntensity(MZRoom room, double intensity)
    {
        intensity *= 1.0 - intensityGrowthJitter / 2.0 +
                     intensityGrowthJitter * UnityEngine.Random.value;

        room.SetIntensity(intensity);

        double maxIntensity = intensity;

        foreach (MZRoom child in room.GetChildren())
        {
            if (room.GetPrecond().Implies(child.GetPrecond()))
            {
                maxIntensity = Math.Max(maxIntensity, ApplyIntensity(child,
                                                                     intensity + 1.0));
            }
        }

        return(maxIntensity);
    }