summaryrefslogtreecommitdiff
path: root/src/prefab/worldgen.moon
blob: 846067ee0260fd80b228db00db4dfd1f643e09f2 (plain)
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