args = {...} require("rng") self = args[1] gen = {} -- Logical worldgen -- Strategy: splatter some rooms on a canvas -- rooms are {location, width, height, specialty} -- splatter some large rooms first, in a mostly-straight line, -- then some medium rooms with a larger spread -- then a bunch of small rooms with a large spread -- then connect each room with nearby neighbors room_sizes = { -- avgx, stdx, avgy, stdy large: { avg_w: 40 std_w: 10 avg_l: 40 std_l: 10 } medium: { avg_w: 20 std_w: 5 avg_l: 20 std_l: 5 } small: { avg_w: 8 std_w: 3 avg_l: 8 std_l: 3 } } level = { avg_w: 1000 std_w: 200 avg_h: 1000 std_h: 200 } gen.level = (seed) -> random_gen = rng.generator(seed) normal = (avg, std, gen) => -- Box-Muller transform bm = math.sqrt(-2 * math.log(gen())) * math.cos(2 * math.pi * gen()) -- Box-Muller gives us std = e^-0.5 , avg = 0 ((bm / math.exp(-1/2)) * std) + avg width = random_gen(avg_w, std_w, random_gen) height = random_gen(avg_h, std_h, random_gen) rooms = {} -- Pick a a direction to splatter direction = random_gen() * 2 * math.pi --rooms[0] = gen