From 0370d64b3bd7914be55358817e52bbc8a529a7d3 Mon Sep 17 00:00:00 2001 From: Alexander M Pickering Date: Tue, 21 Jan 2025 16:02:51 -0600 Subject: work --- src/prefab/hall.moon | 21 ++++++++++++++++++ src/prefab/room.moon | 10 +++++++++ src/prefab/spawn.moon | 3 +++ src/prefab/worldgen.moon | 58 ++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 92 insertions(+) create mode 100644 src/prefab/hall.moon create mode 100644 src/prefab/room.moon create mode 100644 src/prefab/spawn.moon create mode 100644 src/prefab/worldgen.moon (limited to 'src/prefab') 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 -- cgit v1.2.3-70-g09d2