aboutsummaryrefslogtreecommitdiff
path: root/src/prefab
diff options
context:
space:
mode:
authorAlex Pickering <alex@cogarr.net>2026-02-01 13:14:32 -0600
committerAlexander M Pickering <alex@cogarr.net>2026-02-01 13:14:32 -0600
commit3a975db66a3711f34e8b64bb27a8eaca79fdeca9 (patch)
treefcc12f8f9d638ff575c1963796de76b7628854b4 /src/prefab
downloadggj26-3a975db66a3711f34e8b64bb27a8eaca79fdeca9.tar.gz
ggj26-3a975db66a3711f34e8b64bb27a8eaca79fdeca9.tar.bz2
ggj26-3a975db66a3711f34e8b64bb27a8eaca79fdeca9.zip
Initial commitHEADmaster
Diffstat (limited to 'src/prefab')
-rw-r--r--src/prefab/cabin.moon79
-rw-r--r--src/prefab/hall.moon21
-rw-r--r--src/prefab/lobby.moon112
-rw-r--r--src/prefab/room.moon10
-rw-r--r--src/prefab/spawn.moon3
-rw-r--r--src/prefab/worldgen.moon58
6 files changed, 283 insertions, 0 deletions
diff --git a/src/prefab/cabin.moon b/src/prefab/cabin.moon
new file mode 100644
index 0000000..1358c5a
--- /dev/null
+++ b/src/prefab/cabin.moon
@@ -0,0 +1,79 @@
+world = require("world")
+sprites = require("world.sprites")
+ecs = require("ecs")
+
+class CabinGraphicsComponent extends world.GraphicsComponent
+ --
+ -- #####
+ -- # #
+ -- ##/##
+ -- 3x3 floor, 1x3 * 3 walls, 1x1 * 2 door side walls, 1x1 door
+ buf_size: () =>
+ (6*9) + (6*9) + (6* 2) + (6 * 1)
+
+ populate_buf: (geom_view, normal_view, offset) =>
+ z1 = -0.01
+ z2 = -1
+ iuv = sprites.wall_inside_normal
+ ouv = sprites.wall_outside_normal
+ fuv = sprites.floor_normal
+ h1 = sprites.help_1
+ h2 = sprites.help_2
+ h3 = sprites.help_3
+ h1_r = false
+ h2_r = false
+ h3_r = false
+ wall = (geom, uv, offset, start, finish, texture) ->
+ geom[offset + 0] = vec3(start.x, start.y, z1)
+ geom[offset + 1] = vec3(start.x, start.y, z2)
+ geom[offset + 2] = vec3(finish.x, finish.y, z2)
+ geom[offset + 3] = vec3(finish.x, finish.y, z2)
+ geom[offset + 4] = vec3(finish.x, finish.y, z1)
+ geom[offset + 5] = vec3(start.x, start.y, z1)
+ uv[offset+0] = vec2(texture.s1,texture.t1)
+ uv[offset+1] = vec2(texture.s1,texture.t2)
+ uv[offset+2] = vec2(texture.s2,texture.t2)
+ uv[offset+3] = vec2(texture.s2,texture.t2)
+ uv[offset+4] = vec2(texture.s2,texture.t1)
+ uv[offset+5] = vec2(texture.s1,texture.t1)
+
+ floor = (geom, uv, offset, start, finish) ->
+ tuv = fuv
+ if not h1_r
+ tuv = h1
+ h1_r = true
+ elseif not h2_r
+ tuv = h2
+ h2_r = true
+ elseif not h3_r
+ tuv = h3
+ h3_r = true
+ geom[offset + 0] = vec3(start.x,start.y,z1)
+ geom[offset + 1] = vec3(start.x,finish.y,z1)
+ geom[offset + 2] = vec3(finish.x,finish.y,z1)
+ geom[offset + 3] = vec3(finish.x,finish.y,z1)
+ geom[offset + 4] = vec3(finish.x,start.y,z1)
+ geom[offset + 5] = vec3(start.x,start.y,z1)
+ normal_view[offset + 0] = vec2(tuv.s1, tuv.t1)
+ normal_view[offset + 1] = vec2(tuv.s1, tuv.t2)
+ normal_view[offset + 2] = vec2(tuv.s2, tuv.t2)
+ normal_view[offset + 3] = vec2(tuv.s2, tuv.t2)
+ normal_view[offset + 4] = vec2(tuv.s2, tuv.t1)
+ normal_view[offset + 5] = vec2(tuv.s1, tuv.t1)
+
+ --left wall
+ j = 1
+ wall(geom_view, normal_view, j, vec2(-2,-2),vec2(-2,0), sprites.wall_inside_normal)
+ j += 6
+ for floorx = 1,3
+ for floory = 1,3
+ floor(geom_view, normal_view, j, vec2(-2 + (2*floorx), -2 + (2*floory)), vec2(2*floorx, 2*floory))
+ j += 6
+
+
+
+cabin = ecs.Entity("cabin",{
+ graphic: CabinGraphicsComponent("graphic")
+})
+
+cabin
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/lobby.moon b/src/prefab/lobby.moon
new file mode 100644
index 0000000..a560469
--- /dev/null
+++ b/src/prefab/lobby.moon
@@ -0,0 +1,112 @@
+sprites = require("sprites")
+GraphicsComponent = require("ecs.graphics")
+log = require("log")
+
+sd = sprites.floor
+w1 = sprites.wall
+
+floor = (x, y) ->
+ r = {
+ --floor
+ vec3(x,y,0),
+ vec3(x+1,y,0),
+ vec3(x+1,y-1,0),
+ vec3(x+1,y-1,0),
+ vec3(x,y-1,0),
+ vec3(x,y,0)
+ }
+ r
+
+floor_uv = (x, y) ->
+ r = {
+ vec4(sd.s1,sd.t1,1,1),
+ vec4(sd.s2,sd.t1,1,1),
+ vec4(sd.s2,sd.t2,1,1),
+ vec4(sd.s2,sd.t2,1,1),
+ vec4(sd.s1,sd.t2,1,1),
+ vec4(sd.s1,sd.t1,1,1)
+ }
+ r
+
+
+left_wall = (x,y) ->
+ r = {
+ -- Left wall
+ vec3(x+1,y,1),
+ vec3(x+1,y,0),
+ vec3(x+1,y-1,0),
+ vec3(x+1,y-1,0),
+ vec3(x+1,y-1,1),
+ vec3(x+1,y,1)
+ }
+ r
+
+left_wall_uv = (x,y) ->
+ r = {
+ vec4(w1.s1,w1.t1,1,1),
+ vec4(w1.s1,w1.t2,1,1),
+ vec4(w1.s2,w1.t2,1,1),
+ vec4(w1.s2,w1.t2,1,1),
+ vec4(w1.s2,w1.t1,1,1),
+ vec4(w1.s1,w1.t1,1,1)
+ }
+ r
+
+right_wall = (x,y) ->
+ r = {
+ --Right wall
+ vec3(x,y,0),
+ vec3(x,y,1),
+ vec3(x,y-1,1),
+ vec3(x,y-1,1),
+ vec3(x,y-1,0),
+ vec3(x,y,0)
+ }
+ r
+
+right_wall_uv = (x,y) ->
+ r = {
+ vec4(w1.s2,w1.t2,1,1),
+ vec4(w1.s2,w1.t1,1,1),
+ vec4(w1.s1,w1.t1,1,1),
+ vec4(w1.s1,w1.t1,1,1),
+ vec4(w1.s1,w1.t2,1,1),
+ vec4(w1.s2,w1.t2,1,1)
+ }
+ r
+
+compute = () ->
+ geom = {}
+ uv = {}
+ for x = 0,2
+ for y = 0,2
+ for _,v in ipairs(floor(x,y))
+ table.insert(geom,v)
+ for _,v in ipairs(floor_uv(x,y))
+ table.insert(uv,v)
+ for i = 0,2 -- room's left wall
+ for _,v in ipairs(left_wall(-1,i))
+ table.insert(geom,v)
+ for _,v in ipairs(left_wall_uv(-1,i))
+ table.insert(uv,v)
+ for i = 0,2 -- room's right wall
+ for _,v in ipairs(right_wall(3,i))
+ table.insert(geom,v)
+ for _,v in ipairs(right_wall_uv(3,i))
+ table.insert(uv,v)
+ geom, uv, #geom / 3
+
+
+class LobbyGraphic extends GraphicsComponent
+ new: (name, properties) =>
+ @geom, @uv, @n_tris = compute!
+ properties.graphic = sprites.floor.texture
+ super(name, properties)
+ tris: () =>
+ @n_tris
+ populate_buf: (geom_view, uv_view, offset) =>
+ log.info("Creating lobby graphic" .. tostring(@geom),{"level","graphic","lobby"})
+ geom_view\set(@geom, offset, @n_tris * 3)
+ uv_view\set(@uv, offset, @n_tris * 3)
+
+LobbyGraphic
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..1d000a6
--- /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