summaryrefslogtreecommitdiff
path: root/src/tiledmap.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/tiledmap.c')
-rw-r--r--src/tiledmap.c155
1 files changed, 155 insertions, 0 deletions
diff --git a/src/tiledmap.c b/src/tiledmap.c
new file mode 100644
index 0000000..69dcdaa
--- /dev/null
+++ b/src/tiledmap.c
@@ -0,0 +1,155 @@
+#include <raylib.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#include "tiledmap.h"
+
+const int i = 1;
+#define is_bigendian() ( (*(char*)&i) == 0 )
+
+void textureFromPixels(Texture2D *texOut, Color *pixels, int width, int height) {
+ Image checkedIm = {
+ .data = pixels,
+ .width = width,
+ .height = height,
+ .format = PIXELFORMAT_UNCOMPRESSED_R8G8B8A8,
+ .mipmaps = 1
+ };
+
+ *texOut = LoadTextureFromImage(checkedIm);
+}
+
+//! read rgba image from file
+void readrgba(Texture2D *loc, int width, int height, FILE *file) {
+ Color *pixels = malloc(width*height*4);
+ fread(pixels, (size_t) width*height*4, (size_t) 1, file);
+ textureFromPixels(loc, pixels, width, height);
+}
+
+
+
+//! write a big endian bytes from file
+int writeb(char * in, size_t noBytes, FILE * file) {
+ if (!is_bigendian()) {
+ int tmp;
+ // reverse byte order
+ for(int i = 0; i < noBytes/2; i++) {
+ tmp = in[i];
+ in[i] = in[noBytes-i-1];
+ in[noBytes-i-1] = tmp;
+ }
+
+ }
+
+ return fwrite(in, (size_t)1, (size_t) noBytes, file);
+}
+
+//! read a big endian bytes from file
+int readb(char * out, size_t noBytes, FILE * file) {
+ if (!fread(out, (size_t)1, (size_t) noBytes, file))
+ return 1;
+
+ if (is_bigendian())
+ return 0;
+
+ int tmp;
+ // reverse byte order
+ for(int i = 0; i < noBytes/2; i++) {
+ tmp = out[i];
+ out[i] = out[noBytes-i-1];
+ out[noBytes-i-1] = tmp;
+ }
+
+ return 0;
+}
+
+char getTiledMapTile(TiledMap tiledMap, int pos[2]) {
+ return tiledMap.tilelayout[pos[1]*tiledMap.width + pos[0]];
+}
+
+void setTiledMapTile(TiledMap tiledMap, int pos[2], char tile) {
+ tiledMap.tilelayout[pos[1]*tiledMap.width + pos[0]] = tile;
+}
+
+//! load tilemap data from file
+TiledMap loadTiledMap(char * filename) {
+ TiledMap tiledMap;
+ FILE * file;
+
+ if (!(file = fopen(filename, "rb"))) {
+ fprintf(stderr, "Failed to load %s\n", filename);
+ return tiledMap;
+ }
+
+ // skip header
+ fseek(file, 10, SEEK_CUR);
+ // 4 bytes for int width
+ readb((char *)&tiledMap.width, 4, file);
+ // 4 bytes for int height
+ readb((char *)&tiledMap.height, 4, file);
+
+ size_t layoutSize = tiledMap.width*tiledMap.height;
+ tiledMap.tilelayout = malloc(layoutSize);
+ fread(tiledMap.tilelayout, layoutSize, 1, file);
+
+ // read the pixel size of each tile
+ readb((char *)&tiledMap.tileSize, 4, file);
+
+ // read the atlas size
+ readb((char *)&tiledMap.atlasSize[0], 4, file);
+ readb((char *)&tiledMap.atlasSize[1], 4, file);
+
+ // read the atlas itself
+ size_t atlasSizeBytes = tiledMap.atlasSize[0]*tiledMap.tileSize*tiledMap.atlasSize[1]*tiledMap.tileSize*4;
+ tiledMap.atlasData = malloc(atlasSizeBytes);
+ fread(tiledMap.atlasData, atlasSizeBytes, (size_t) 1, file);
+
+ tiledMap.tileCount = tiledMap.atlasSize[0]*tiledMap.atlasSize[1] + 1;
+
+ fclose(file);
+ return tiledMap;
+}
+
+TiledMap newTiledMap(Image atlas, int tileSize, int width, int height) {
+ TiledMap tiledMap;
+ tiledMap.width = width;
+ tiledMap.height = height;
+ tiledMap.tilelayout = malloc(width * height);
+
+ tiledMap.tileSize = tileSize;
+
+ tiledMap.atlasSize[0] = atlas.width / tileSize;
+ tiledMap.atlasSize[1] = atlas.height / tileSize;
+
+ tiledMap.atlasData = LoadImageColors(atlas);
+
+ return tiledMap;
+}
+
+void saveTiledMap(char * filename, TiledMap tiledMap) {
+ FILE * file;
+
+ if (!(file = fopen(filename, "wb"))) {
+ fprintf(stderr, "Failed to load %s\n", filename);
+ return;
+ }
+ size_t layoutSize = tiledMap.width*tiledMap.height;
+ size_t atlasSizeBytes = tiledMap.atlasSize[0]*tiledMap.tileSize*tiledMap.atlasSize[1]*tiledMap.tileSize*4;
+
+ fwrite("TILEFILEv2", 10, 1, file);
+
+ writeb((char *) &tiledMap.width, 4, file);
+ writeb((char *) &tiledMap.height, 4, file);
+
+ fwrite(tiledMap.tilelayout, 1, layoutSize, file);
+
+ writeb((char *) &tiledMap.tileSize, 4, file);
+ writeb((char *) &tiledMap.atlasSize[0], 4, file);
+ writeb((char *) &tiledMap.atlasSize[1], 4, file);
+
+ fwrite(tiledMap.atlasData, 1, atlasSizeBytes, file);
+
+ fclose(file);
+ fprintf(stderr, "Written tiledfiled to %s\n", filename);
+}