aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/config.h15
-rw-r--r--src/main.c4
-rw-r--r--src/tilemap.c65
-rw-r--r--src/tilemap.h4
-rw-r--r--src/typedef.h2
5 files changed, 61 insertions, 29 deletions
diff --git a/src/config.h b/src/config.h
index 06525cb..36f43a6 100644
--- a/src/config.h
+++ b/src/config.h
@@ -1,11 +1,13 @@
// comment this if you dont want to generate the tiles, but
// want to use the tileset defined in the TILESET_NAME directive
-// #define GENERATE_PPM_TILES
+#define GENERATE_PPM_TILES
#ifdef GENERATE_PPM_TILES
int generated_tile_colors[2][3] = {
- { 211, 211, 211 }, // blank | default 255
- { 30, 144, 155 } // not blank | defalut 0
+ { 0, 32, 63 }, // blank | default 255
+ { 173, 239, 209 } // not blank | defalut 0
+ // { 255, 255, 255 },
+ // { 0, 0, 0 }
};
#endif
@@ -13,7 +15,7 @@
// name of the tileset, localated in files/tilesets directory
// must be defined only when GENERATE_PPM_TILES is not
// if both arent defined, only tiles.dat will be generated
-#define TILESET_NAME "knots"
+// #define TILESET_NAME "knots"
/* The TILES are
@@ -38,7 +40,6 @@ need to put in the tiles_to_load array
// Array for which tiles to include the tiles.dat
int tiles_to_load[] = {
- 2,
- 3,
- 4,
+ 0,
+ 1,
};
diff --git a/src/main.c b/src/main.c
index 6b70536..59a1fc0 100644
--- a/src/main.c
+++ b/src/main.c
@@ -132,7 +132,6 @@ error:
int main(int argc, char **argv)
{
- // SEED = 69;
SEED = time(0);
manage_arguments(argc, argv);
@@ -141,8 +140,8 @@ int main(int argc, char **argv)
printf("The Seed is %ld\n", SEED);
load_tiles();
- generate_tile_masks(get_tile_connections());
init_tilemap();
+ generate_tile_masks(get_tile_connections());
while(1) {
int lei;
@@ -173,6 +172,7 @@ int main(int argc, char **argv)
}
free_tiles();
+ destroy_tilemap();
char file_name[64] = {0};
diff --git a/src/tilemap.c b/src/tilemap.c
index 85d76bd..efd0b4e 100644
--- a/src/tilemap.c
+++ b/src/tilemap.c
@@ -1,39 +1,50 @@
+#include <stdlib.h>
+#include <string.h>
#include "typedef.h"
#include "tilemap.h"
+#define MAX(x, y) (((x) > (y)) ? (x) : (y))
+#define MIN(x, y) (((x) < (y)) ? (x) : (y))
+
extern size_t TILES;
extern size_t SWIDTH;
extern size_t SHEIGHT;
-big_t tilemap[TILEMAP_CAP];
+big_t (*tilemap)[TILEMAP_CAP];
+size_t tsz = 0;
// 0 up 1 right
// 2 left 3 down
// each bit of the numbers is for every tiles
// if the tile is a possibility
// least significant bit is tile index 0
-big_t tile_masks[TILES_CAP][4];
+big_t (*tile_masks)[TILES_CAP][4];
void set(int t, int n)
{
- tilemap[t] |= (1 << n);
+ tilemap[(n/64)][t] |= (1 << (n%64));
}
int is_set(int t, int n)
{
- return (tilemap[t] >> n) & 1;
+ return (tilemap[(n/64)][t] >> (n%64)) & 1;
}
void init_tilemap()
{
- // this is for support of more than 63 different tiles in
- // for(size_t i = 0; i < SWIDTH * SHEIGHT; i++)
- // for(size_t n = 0; n < TILES; n++)
- // set(i, n);
+ // 63 max tiles in 64 bit int
+ tsz = (TILES/64) + 1;
+ tilemap = malloc(sizeof(big_t[tsz][TILEMAP_CAP]));
- for(size_t i = 0; i < SWIDTH * SHEIGHT; i++)
- tilemap[i] = ((1 << TILES) - 1);
+ for(size_t i = 0; i < tsz; i++)
+ for(size_t n = 0; n < SWIDTH * SHEIGHT; n++)
+ tilemap[i][n] = ((1 << MIN(63, TILES)) - 1);
+}
+void destroy_tilemap()
+{
+ free(tilemap);
+ free(tile_masks);
}
int has_collapsed(int t)
@@ -51,7 +62,8 @@ int get_collapsed_tile(int t)
void collapse(int t, int n)
{
- tilemap[t] = 0;
+ for(size_t i = 0; i < tsz; i++)
+ tilemap[i][t] = 0;
set(t, n);
set(t, TILES);
}
@@ -69,29 +81,46 @@ size_t count_entropy(int t)
void mask(int t, int m, int r)
{
- tilemap[t] &= tile_masks[m][r];
+ for(size_t i = 0; i < tsz; i++)
+ tilemap[i][t] &= tile_masks[i][m][r];
}
void generate_tile_masks(small_t* tile_connections)
{
- size_t wt_con[4] = {0};
- size_t no_con[4] = {0};
+ size_t (*wt_con)[4];
+ size_t (*no_con)[4];
+ wt_con = malloc(sizeof(size_t[tsz][4]));
+ no_con = malloc(sizeof(size_t[tsz][4]));
for(int n = 0; n < 4; n++)
{
+ for(size_t i = 0; i < tsz; i++) {
+ wt_con[i][n] = 0;
+ no_con[i][n] = 0;
+ }
+
for(size_t i = 0; i < TILES; i++)
- wt_con[n] |= ((tile_connections[i] >> n) & 1) << i;
+ wt_con[(i/64)][n] |= ((tile_connections[i] >> n) & 1) << (i%64);
- no_con[n] = (~wt_con[n]) & ((1 << TILES) - 1);
+ for(size_t i = 0; i < TILES; i++)
+ no_con[(i/64)][n] |= ((wt_con[(i/64)][n] >> (i%64)) & 1) ? 0 : 1 << (i % 64);
}
+ tile_masks = malloc(sizeof(big_t[tsz][TILES_CAP][4]));
+
for(size_t i = 0; i < TILES; i++)
{
for(int n = 0; n < 4; n++)
{
if((tile_connections[i] >> (3-n)) & 1)
- tile_masks[i][n] = wt_con[n];
- else tile_masks[i][n] = no_con[n];
+ for(size_t t = 0; t < tsz; t++)
+ tile_masks[t][i][n] = wt_con[t][n];
+ else
+ for(size_t t = 0; t < tsz; t++)
+ tile_masks[t][i][n] = no_con[t][n];
}
}
+
+ free(wt_con);
+ free(no_con);
}
diff --git a/src/tilemap.h b/src/tilemap.h
index 74344dd..f25e7df 100644
--- a/src/tilemap.h
+++ b/src/tilemap.h
@@ -8,10 +8,12 @@ int is_set(int t, int n);
// self explanatory names
int has_collapsed(int t);
-int get_collapsed_tile(int i);
+int get_collapsed_tile(int t);
void collapse(int t, int n);
size_t count_entropy(int t);
+
void init_tilemap();
+void destroy_tilemap();
void generate_tile_masks(small_t* tile_connections);
diff --git a/src/typedef.h b/src/typedef.h
index 8924dc8..cf7787e 100644
--- a/src/typedef.h
+++ b/src/typedef.h
@@ -3,7 +3,7 @@
// useful definitions
-#define TILES_CAP 63
+#define TILES_CAP 128
#define TILEMAP_CAP 16384
#include <stdint.h>