summaryrefslogtreecommitdiff
path: root/src/prefab
diff options
context:
space:
mode:
Diffstat (limited to 'src/prefab')
-rw-r--r--src/prefab/hall.moon21
-rw-r--r--src/prefab/room.moon10
-rw-r--r--src/prefab/spawn.moon3
-rw-r--r--src/prefab/worldgen.moon58
4 files changed, 92 insertions, 0 deletions
diff --git a/src/prefab/hall.moon b/src/prefab/hall.moon
new file mode 100644
index 0000000..59dbea0
--- /dev/null
+++ b/src/prefab/hall.moon
@@ -0,0 +1,21 @@
+util = require("util")
+
+-- Halls run from one point to another, the start and end points are in the
+-- middle of the hallway.
+-- "floor_gen" can be a string (the sprites texture to use)a
+-- or a function (passed the "Hall" object to generate the texture for that segment.
+class Hall
+ new: (tbl) =>
+ util.typecheck(tbl,
+ "startx", "number",
+ "starty", "number",
+ "endx", "number",
+ "endy", "number",
+ "width", "number"
+ )
+ assert(tbl.floor_gen, "Hall requires a 'floor_gen' attribute")
+ if type(tbl.floor_gen) == "function"
+ @floor_gen = tbl.floor_gen
+ elseif type(tbl.floor_gen) == "string"
+ @floor_gen = () =>
+ tbl.floor_gen
diff --git a/src/prefab/room.moon b/src/prefab/room.moon
new file mode 100644
index 0000000..c041bb8
--- /dev/null
+++ b/src/prefab/room.moon
@@ -0,0 +1,10 @@
+
+
+class Room
+ new: (x,y,width,height) =>
+ @x = x
+ @y = y
+ @width = width
+ @height = height
+ @hallways = {}
+
diff --git a/src/prefab/spawn.moon b/src/prefab/spawn.moon
new file mode 100644
index 0000000..516c72a
--- /dev/null
+++ b/src/prefab/spawn.moon
@@ -0,0 +1,3 @@
+-- Spawnpoint?
+
+class Spawnpoint extends Room
diff --git a/src/prefab/worldgen.moon b/src/prefab/worldgen.moon
new file mode 100644
index 0000000..846067e
--- /dev/null
+++ b/src/prefab/worldgen.moon
@@ -0,0 +1,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