static void FloodFillBlob(NMap map, NLocate loc, NLocateSet set, byte valid) { if (!map.WithIn(loc)) { return; } if (map.GetBlock(loc.X, loc.Y) == valid) { map.SetBlock(loc.X, loc.Y, (byte)(255 - valid)); set.Set.Add(loc); foreach (var l in loc.Direction4()) { FloodFillBlob(map, l, set, valid); } } }
public static void Line(NMap map, NLocate src, NLocate dst, byte digType) { if (src.Equals(dst)) { return; } if (map.WithIn(src)) { map.SetBlock(src.X, src.Y, digType); } List <NLocate> mos = new List <NLocate>(); mos.AddRange(src.Direction4()); mos.Sort((x, y) => x.DistanceTo(dst).CompareTo(y.DistanceTo(dst))); Line(map, mos[0], dst, digType); }
public static void Noise(NMap map, NLocate src, NLocate dst, byte movType, byte digType) { if (src.Equals(dst)) { return; } if (map.WithIn(src)) { map.SetBlock(src.X, src.Y, digType); } List <NLocate> mos = new List <NLocate>(); mos.AddRange(src.Direction4()); mos.Sort((x, y) => x.DistanceTo(dst).CompareTo(y.DistanceTo(dst))); Dictionary <NLocate, double> rateDict = new Dictionary <NLocate, double>(); if (map.WithIn(mos[0])) { rateDict.Add(mos[0], 0.6); } if (map.WithIn(mos[1])) { rateDict.Add(mos[1], 0.3); } if (map.WithIn(mos[2])) { rateDict.Add(mos[2], 0.1); } if (map.WithIn(mos[3])) { rateDict.Add(mos[3], 0.1); } NLocate mov = RandomSelectByRate <NLocate> .Select(rateDict); Noise(map, mov, dst, movType, digType); }