1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
|
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
|