aboutsummaryrefslogtreecommitdiff
path: root/src/gen_tiles.c
blob: e4e2159284ac5e9fd8ac4dc3cea3d0d25bee8a8a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#include "typedef.h"
#include "ppm.h"
#include "config.h"

#define TILE_TYPES  5
#define TILE_WIDTH  3
#define TILE_HEIGHT 3

// possible types: X T I
char symetry[TILE_TYPES] = "XTIIT";

char tile_names[TILE_TYPES][7] = {
    "blank", "t", "plus", "line", "corner"
};

small_t tiles[TILE_TYPES][TILE_WIDTH*TILE_HEIGHT] = {
    {
      0, 0, 0,
      0, 0, 0,
      0, 0, 0
    }, {
      0, 0, 0,
      1, 1, 1,
      0, 1, 0
    }, {
      0, 1, 0,
      1, 1, 1,
      0, 1, 0
    },{
      0, 0, 0,
      1, 1, 1,
      0, 0, 0
    }, {
      0, 1, 0,
      0, 1, 1,
      0, 0, 0
    }
};

small_t tiles_connections[TILE_TYPES][4] = {
    { 0, 0, 0, 0 },
    { 0, 1, 1, 1 },
    { 1, 1, 1, 1 },
    { 0, 1, 1, 0 },
    { 1, 1, 0, 0 },
};

void set_color(small_t *pixels, small_t *t, int x, int y, char k, char blank, char connection)
{
    pixels[(y * TILE_WIDTH + x)*3 + k] = (t[y * TILE_WIDTH + x] == 0) ? blank : connection;

}
FILE *fp;

void save(small_t *t, small_t *c, int n, int i)
{
#ifdef GENERATE_PPM_TILES
    (void)i;

    char file_name[64] = {0};

    sprintf(file_name, "files/tiles/tile_%d.ppm", n);

    small_t *pixels = malloc(TILE_WIDTH * TILE_HEIGHT *3);
    for(int y = 0; y < TILE_HEIGHT; y++)
        for(int x = 0; x < TILE_WIDTH; x++) {
            set_color(pixels, t, x, y, 0,
                      generated_tile_colors[0][0],
                      generated_tile_colors[1][0]);
            set_color(pixels, t, x, y, 1,
                      generated_tile_colors[0][1],
                      generated_tile_colors[1][1]);
            set_color(pixels, t, x, y, 2,
                      generated_tile_colors[0][2],
                      generated_tile_colors[1][2]);
        }

    save_as_ppm(file_name, pixels, TILE_WIDTH, TILE_HEIGHT, 1);
    free(pixels);
    printf("Saved file: %s\n", file_name);
#endif
#ifdef TILESET_NAME
    (void)t; (void)c;

    char command[128];
    sprintf(command, "cp files/tilesets/%s/%s.ppm files/tiles/tile_%d.ppm", TILESET_NAME, tile_names[i], n);
    system(command);
#endif

    small_t connections = 0;
    for(int ci = 0; ci < 4; ci++)
    {
        connections |= (c[ci] << (3-ci));
    }

    fwrite(&connections, sizeof(connections), 1, fp);
}

void gen()
{
    mkdir("files", S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH);
    mkdir("files/tiles", S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH);

    fp = fopen("files/tiles/tiles.dat", "wb");
    if(!fp) {
        fprintf(stderr, "ERROR: Could not open file files/tiles/tiles.dat");
        exit(EXIT_FAILURE);
    }

    size_t tiles_sz = sizeof(tiles_to_load)/sizeof(int);
    fwrite(&tiles_sz, sizeof(size_t), 1, fp);

    char syms[TILE_TYPES];
    size_t sym_sz = 0;

    for(size_t n = 0; n < tiles_sz; n++)
    {
        int i = tiles_to_load[n];
        save(tiles[i], tiles_connections[i], n, i);
        syms[sym_sz++] = symetry[i];
    }

    fwrite(syms, 1, sym_sz, fp);

    fclose(fp);
}


int main(void)
{
    gen();
    return 0;
}