summaryrefslogtreecommitdiff
path: root/Week1-Pacman/src/map.c
diff options
context:
space:
mode:
Diffstat (limited to 'Week1-Pacman/src/map.c')
-rw-r--r--Week1-Pacman/src/map.c115
1 files changed, 115 insertions, 0 deletions
diff --git a/Week1-Pacman/src/map.c b/Week1-Pacman/src/map.c
new file mode 100644
index 0000000..0610fd4
--- /dev/null
+++ b/Week1-Pacman/src/map.c
@@ -0,0 +1,115 @@
+#include <stdio.h>
+#include <errno.h>
+#include <SDL2/SDL.h>
+#include <SDL2/SDL_image.h>
+#include "map.h"
+
+#define TILE_SIDE 8
+
+SDL_Texture* map_texture = NULL;
+
+void add_map_row(const char* string, int* row, int width);
+
+void load_map(const char* filename, struct map* map) {
+ if(map->contents != NULL) {
+ printf("Reallocating non empty map, exitting!\n");
+ exit(1);
+ }
+
+ FILE* file = fopen(filename, "r");
+
+ if(file == NULL) {
+ const char* error;
+
+ switch(errno) {
+ default:
+ error = "Unknown Error";
+ }
+
+ printf("Failed to load map %s, error: %s, exitting!\n",filename, error);
+ exit(1);
+ }
+
+ map->height = 0;
+ char buffer[1024];
+
+ fgets(buffer, 1024, file);
+ buffer[1023] = '\0';
+
+ map->width = 1;
+ for (unsigned long i = 0; i < strlen(buffer); i++) {
+ if (buffer[i] == ',')
+ map->width++;
+ }
+ fseek(file, 0, SEEK_SET);
+
+ while(fgets(buffer, 1024, file)) {
+ //Add another row to the map
+ map->height++;
+ map->contents =
+ realloc(map->contents, map->width * map->height * sizeof(int));
+
+ add_map_row(buffer,
+ &map->contents[map->width * (map->height - 1)],
+ map->width);
+ }
+
+ fclose(file);
+}
+
+void add_map_row(const char* line, int* row, int width) {
+ for(int i = 0; i < width; i++) {
+ sscanf(line, "%d", &row[i]);
+
+ int length = 1;
+ int j = row[i];
+
+ if(j < 0) {
+ length++;
+ j = -j;
+ }
+ for(; j > 0; j /= 10, length++);
+
+ line += length;
+ }
+}
+
+void draw_map(struct demo* demo, struct map* map) {
+
+ for(int i = 0; i < map->height; i++)
+ for(int j = 0; j < map->width; j++) {
+ int tile =
+ map->contents[i * map->width + j];
+
+ if(tile == -1) {
+ continue;
+ }
+
+ SDL_Rect s = {
+ .x = (tile % 36) * TILE_SIDE,
+ .y = (tile / 36) * TILE_SIDE,
+ .w = TILE_SIDE,
+ .h = TILE_SIDE
+ };
+
+ SDL_Rect d = {
+ .x = j * 26,
+ .y = i * 20,
+ .w = 26,
+ .h = 20
+ };
+
+ demo_rendercopy(demo, map_texture, &s, &d);
+ }
+}
+
+void map_init(struct demo* demo) {
+ map_texture =
+ IMG_LoadTexture(demo->ren, "assets/Sprites/Tileset.png");
+
+ if(map_texture == NULL) {
+ printf("Failed to load map tileset, error: %s, exitting!\n",
+ SDL_GetError());
+ exit(1);
+ }
+}