aboutsummaryrefslogtreecommitdiff
path: root/src/cavegen.c
diff options
context:
space:
mode:
authorJacob Janzen <jacob.a.s.janzen@gmail.com>2024-02-14 12:01:03 -0600
committerJacob Janzen <jacob.a.s.janzen@gmail.com>2024-02-14 12:01:03 -0600
commitb5b4a5d66deefa3858bedf7bc58e6c96340e829b (patch)
tree4aa42f746be3c6ce409938796ca95175dfd1da86 /src/cavegen.c
parent8bd664e467f760db6f689eb9d30c3d685abe6de5 (diff)
major refactor
Diffstat (limited to 'src/cavegen.c')
-rw-r--r--src/cavegen.c92
1 files changed, 92 insertions, 0 deletions
diff --git a/src/cavegen.c b/src/cavegen.c
new file mode 100644
index 0000000..1365e9d
--- /dev/null
+++ b/src/cavegen.c
@@ -0,0 +1,92 @@
+#include "cavegen.h"
+
+#include <stdbool.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#define MAX_STEPS 200
+#define NUM_WALKERS 100
+
+enum direction {
+ UP,
+ LEFT,
+ RIGHT,
+ DOWN,
+ NUM_DIRS,
+};
+
+void create_cave(struct map *map)
+{
+ map->width = WIDTH;
+ map->height = HEIGHT;
+
+ // create a map consisting entirely of walls
+ map->map = malloc(sizeof(enum tile_type) * HEIGHT * WIDTH);
+ for (int i = 0; i < HEIGHT; ++i) {
+ for (int j = 0; j < WIDTH; ++j) {
+ map->map[i * WIDTH + j] = WALL;
+ }
+ }
+
+ // start in the middle of the screen
+ int start_x = WIDTH / 2;
+ int start_y = HEIGHT / 2;
+
+ // make the starting point GROUND
+ map->map[start_y * WIDTH + start_x] = GROUND;
+
+ // setup the open tiles
+ struct point *open_tiles = malloc(sizeof(struct point) * HEIGHT * WIDTH);
+
+ int num_open_tiles = 1;
+ open_tiles[0].x = start_x;
+ open_tiles[0].y = start_y;
+
+ for (int i = 0; i < NUM_WALKERS; ++i) {
+ // get a random open point
+ struct point curr_point = open_tiles[rand() % num_open_tiles];
+
+ int x_pos = curr_point.x;
+ int y_pos = curr_point.y;
+
+ // iterate until the walk exits the array or MAX_STEPS is reached
+ for (int j = 1; j < MAX_STEPS - 1 && x_pos < WIDTH - 1 && x_pos >= 1 &&
+ y_pos < HEIGHT - 1 && y_pos >= 1;
+ ++j) {
+ // add new open point if the current point is still a wall
+ if (map->map[y_pos * WIDTH + x_pos] == WALL) {
+ open_tiles[num_open_tiles].x = x_pos;
+ open_tiles[num_open_tiles].y = y_pos;
+ ++num_open_tiles;
+ }
+
+ map->map[y_pos * WIDTH + x_pos] = GROUND; // assign ground
+
+ // move in a random direction
+ enum direction dir = rand() % NUM_DIRS;
+ switch (dir) {
+ case UP : --y_pos; break;
+ case LEFT : --x_pos; break;
+ case RIGHT : ++x_pos; break;
+ case DOWN : ++y_pos; break;
+ default : exit(EXIT_FAILURE); // should not occur
+ }
+ }
+ }
+
+ // assign the up stair and remove from open tiles
+ int in = rand() % num_open_tiles;
+ map->entry_point = open_tiles[in];
+ open_tiles[in] = open_tiles[num_open_tiles - 1];
+ --num_open_tiles;
+ map->map[map->entry_point.y * WIDTH + map->entry_point.x] = UP_STAIR;
+
+ // assign the down stair and remove from open tiles
+ in = rand() % num_open_tiles;
+ struct point down = open_tiles[in];
+ open_tiles[in] = open_tiles[num_open_tiles - 1];
+ --num_open_tiles;
+ map->map[down.y * WIDTH + down.x] = DOWN_STAIR;
+
+ free(open_tiles);
+}