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