I think that special rooms could be controled using conditionals. You use perlin noise to generate your map while you drop rooms at random and set connections between them, then your generation algorithm drops a special and change a state, boolean is great for this. You need to have a little list of special rooms.