scale = 256; range = 1; rough = .5; // CREATE THE CORNER POINT ds_grid_set(map, 0, 0, range - random(range*2)); // THE FRACTAL ITERATION while(scale > 1) { rep = cells/(scale*scale); mid = scale >> 1; // DIAMOND STEP xx = 0; yy = 0; repeat(rep) { val0 = ds_grid_get(map, xx, yy); val1 = ds_grid_get(map, (xx+scale)mod size, yy); val2 = ds_grid_get(map, xx, (yy+scale)mod size); val3 = ds_grid_get(map, (xx+scale)mod size, (yy+scale)mod size); val = mean(val0, val1, val2, val3) - range + random(range*2); ds_grid_set(map, xx+mid, yy+mid, val); xx = (xx+scale)mod size; if (xx == 0) yy += scale; } // SQUARE STEP xx = 0; yy = 0; repeat(rep) { val0 = ds_grid_get(map, xx, yy); val1 = ds_grid_get(map, (xx+scale)mod size, yy); val2 = ds_grid_get(map, xx+mid, yy+mid); val3 = ds_grid_get(map, xx+mid, ((yy-mid)+size)mod size); val = mean(val0, val1, val2, val3) - range + random(range*2); ds_grid_set(map, xx+mid, yy, val); val1 = ds_grid_get(map, xx, (yy+scale)mod size); val3 = ds_grid_get(map, ((xx-mid)+size)mod size, yy+mid); val = mean(val0, val1, val2, val3) - range + random(range*2); ds_grid_set(map, xx, yy+mid, val); xx = (xx+scale)mod size; if (xx == 0) yy += scale; } // REDUCE THE RANGE AND SCALE range *= power(2, -rough); scale = mid; }