diff options
| author | Alex Pickering <alex@cogarr.net> | 2026-02-01 13:14:32 -0600 |
|---|---|---|
| committer | Alexander M Pickering <alex@cogarr.net> | 2026-02-01 13:14:32 -0600 |
| commit | 3a975db66a3711f34e8b64bb27a8eaca79fdeca9 (patch) | |
| tree | fcc12f8f9d638ff575c1963796de76b7628854b4 /src/prefab | |
| download | ggj26-3a975db66a3711f34e8b64bb27a8eaca79fdeca9.tar.gz ggj26-3a975db66a3711f34e8b64bb27a8eaca79fdeca9.tar.bz2 ggj26-3a975db66a3711f34e8b64bb27a8eaca79fdeca9.zip | |
Diffstat (limited to 'src/prefab')
| -rw-r--r-- | src/prefab/cabin.moon | 79 | ||||
| -rw-r--r-- | src/prefab/hall.moon | 21 | ||||
| -rw-r--r-- | src/prefab/lobby.moon | 112 | ||||
| -rw-r--r-- | src/prefab/room.moon | 10 | ||||
| -rw-r--r-- | src/prefab/spawn.moon | 3 | ||||
| -rw-r--r-- | src/prefab/worldgen.moon | 58 |
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 |
