From 55e707c1cec875581581216df4dcc8417dd5c18a Mon Sep 17 00:00:00 2001 From: Miguel Angel Astor Romero Date: Thu, 6 Mar 2014 01:58:49 -0430 Subject: [PATCH] Map file correctly loaded. --- include/map.h | 20 +++- src/in_game.c | 43 +++++++- src/map.c | 280 +++++++++++++++++++++++++++++++++++++++++++++++++- 3 files changed, 339 insertions(+), 4 deletions(-) diff --git a/include/map.h b/include/map.h index a38a962..d4223d0 100644 --- a/include/map.h +++ b/include/map.h @@ -6,7 +6,9 @@ #ifndef MAP_H #define MAP_H -static const int MAX_MAP_SIZE = 64; +#define MAX_MAP_SIZE 64 +#define MAX_OBJECTS 512 +#define MAX_STR 128 typedef enum FLOOR_TYPES { VOID = 0, @@ -27,6 +29,7 @@ typedef enum OBJECT_TYPES { PERSON, PLAYER_START, EXIT, + DIALOG, NONE = 9989 } obj_t; @@ -35,13 +38,26 @@ typedef enum ERROR_CODES { FILE_NOT_FOUND, OUT_OF_MEMORY, PREMATURE_EOF, - MAP_TOO_LARGE + MAP_TOO_LARGE, + INVALID_KEY } errcode_t; typedef struct MAP_CELL{ floor_t f; } map_cell_t; +typedef struct OBJECT { + obj_t type; + short x, y, eX, eY, sX, sY; + short id; + short dId; + char name[MAX_STR]; + char target[MAX_STR]; + char dialog[MAX_STR]; + unsigned char unlocked; +} game_obj_t; + extern errcode_t readMapData(const char *, map_cell_t ***, int *, int *); +extern errcode_t readMapObjects(const char *, game_obj_t **, int *); #endif diff --git a/src/in_game.c b/src/in_game.c index 32b10b9..3c63c2a 100644 --- a/src/in_game.c +++ b/src/in_game.c @@ -25,13 +25,15 @@ static bool uK, dK, lK, rK; static clock_t then; static player_t player; static map_cell_t ** map; -static int mW, mH; +game_obj_t objs[MAX_OBJECTS]; +static int mW, mH, nO; void input(); gsname_t update(); void render(int, int); void drawGui(int, int); void setPlayerStart(); +void initObjects(); void initInGameState( gs_t * gs) { int n, i, j; @@ -85,11 +87,30 @@ void initInGameState( gs_t * gs) { map[ i ] = ( map_cell_t * ) calloc ( 32 , sizeof ( map_cell_t ) ); } + initObjects(); + errcode_t rc = readMapData("map_file.map", &map, &mW, &mH); fprintf(stderr, "\t%s: readMapData() returned %d\n", __FILE__, rc); fprintf(stderr, "\t%s: Map size is (%d, %d).\n", __FILE__, mW, mH); + game_obj_t * objsP = objs; + rc = readMapObjects("map_file.map", &objsP, &nO); + fprintf(stderr, "\t%s: readMapObjects() returned %d\n", __FILE__, rc); + fprintf(stderr, "\t%s: Number of objects is %d.\n", __FILE__, nO); + + for(i = 0; i < nO; i++){ + fprintf(stderr, "\t%s: Object %d\n", __FILE__, i); + fprintf(stderr, "\t\t Type %d\n", (int)objs[i].type); + fprintf(stderr, "\t\t x: %d -- y: %d -- eX: %d -- eY: %d -- sX: %d -- sY: %d\n", objs[i].x, objs[i].x, objs[i].eX, objs[i].eY, objs[i].sX, objs[i].sY); + fprintf(stderr, "\t\t iD: %d -- dId %d\n", objs[i].id, objs[i].dId); + fprintf(stderr, "\t\t name: %s\n", objs[i].name); + fprintf(stderr, "\t\t target: %s\n", objs[i].target); + fprintf(stderr, "\t\t dialog: %s\n", objs[i].dialog); + fprintf(stderr, "\t\t unlocked: %d\n", objs[i].unlocked); + fprintf(stderr, "\n"); + } + for ( i = 0; i < 32; ++i ) { free(map[ i ]); } @@ -276,3 +297,23 @@ void setPlayerStart(){ } } } + +void initObjects(){ + int i; + + for(i = 0; i < MAX_OBJECTS; ++i){ + objs[i].type = NONE; + objs[i].x = 0; + objs[i].y = 0; + objs[i].eX = 0; + objs[i].eY = 0; + objs[i].sX = 0; + objs[i].sY = 0; + objs[i].id = 0; + objs[i].dId = 0; + objs[i].name[0] = '\0'; + objs[i].target[0] = '\0'; + objs[i].dialog[0] = '\0'; + objs[i].unlocked = 0; + } +} diff --git a/src/map.c b/src/map.c index 38a46ba..df52593 100644 --- a/src/map.c +++ b/src/map.c @@ -2,6 +2,7 @@ * Copyright (c) 2014, Miguel Angel Astor Romero. All rights reserved. * See the file LICENSE for more details. */ + #define _GNU_SOURCE #include #include @@ -10,9 +11,9 @@ #include "map.h" errcode_t readMapData(const char * file, map_cell_t *** map, int * w, int * h){ + size_t n = 2048; char *buffer; FILE * f; - size_t n = 2048; f = fopen(file, "r"); if(f == NULL) return FILE_NOT_FOUND; @@ -90,3 +91,280 @@ errcode_t readMapData(const char * file, map_cell_t *** map, int * w, int * h){ return NO_ERROR; } + +errcode_t readMapObjects(const char * file, game_obj_t ** objArr, int *nObj){ + size_t n = 2048; + int rc; + char *buffer; + FILE * f; + + *nObj = 0; + + f = fopen(file, "r"); + if(f == NULL) return FILE_NOT_FOUND; + + buffer = (char*)calloc(n + 1, sizeof(char)); + if(buffer == NULL) return OUT_OF_MEMORY; + + rc = getline(&buffer, &n, f); + if(rc == -1){ + free(buffer); + return PREMATURE_EOF; + } + + while(*nObj < MAX_OBJECTS && rc != -1){ + if(buffer[0] == '%') continue; + + if(strcmp(buffer, "[MAP]\n") == 0){ + int i, w; + + rc = getline(&buffer, &n, f); + if(rc == -1){ + free(buffer); + return PREMATURE_EOF; + } + + w = strtol(buffer, NULL, 10); + + for(i = 0; i <= w; ++i){ + rc = getline(&buffer, &n, f); + if(rc == -1){ + free(buffer); + return PREMATURE_EOF; + } + } + + }else if(strcmp(buffer, "[PLAYER]\n") == 0){ + do{ + rc = getline(&buffer, &n, f); + if(rc == -1) break; + + if(buffer[0] == '%') continue; + else if(buffer[0] == 'p'){ + int i; + + for(i = 0; buffer[i] && buffer[i] != '='; ++i); + + if(strncmp(buffer, "player =", i) == 0){ + int sX, sY; + char *end; + + sX = strtol(&buffer[i + 1], &end, 10); + sY = strtol(end, NULL, 10); + + (*objArr)[*nObj].type = PLAYER_START; + (*objArr)[*nObj].sX = sX; + (*objArr)[*nObj].sY = sY; + + *nObj += 1; + + }else{ + fprintf(stderr, "\t%s.readMapObjects(): Skipped invalid data in PLAYER key in map file %s.\n", __FILE__, file); + fprintf(stderr, "\t%s.readMapObjects(): The invalid line is %s.\n", __FILE__, buffer); + continue; + } + } + }while(buffer[0] != '['); + + }else if(strcmp(buffer, "[EXITS]\n") == 0){ + do{ + rc = getline(&buffer, &n, f); + if(rc == -1) break; + + if(buffer[0] == '%') continue; + else if(buffer[0] == 'e'){ + int i; + + for(i = 0; buffer[i] && buffer[i] != '='; ++i); + + if(strncmp(buffer, "exit =", i) == 0){ + int x, y, eX, eY; + char *end, *end2, *end3; + + x = strtol(&buffer[i + 1], &end, 10); + y = strtol(end, &end2, 10); + end2++; + + (*objArr)[*nObj].type = EXIT; + (*objArr)[*nObj].x = x; + (*objArr)[*nObj].y = y; + + for(i = 0; end2[i] && end2[i] != ' '; ++i); + + strncpy((*objArr)[*nObj].target, end2, i); + (*objArr)[*nObj].target[i] = '\0'; + + eX = strtol(&end2[i], &end3, 10); + eY = strtol(end3, NULL, 10); + + (*objArr)[*nObj].eX = eX; + (*objArr)[*nObj].eY = eY; + + *nObj += 1; + + }else{ + fprintf(stderr, "\t%s.readMapObjects(): Skipped invalid data in EXITS key in map file %s.\n", __FILE__, file); + fprintf(stderr, "\t%s.readMapObjects(): The invalid line is %s.\n", __FILE__, buffer); + continue; + } + } + }while(buffer[0] != '['); + + }else if(strcmp(buffer, "[DOORS]\n") == 0){ + do{ + rc = getline(&buffer, &n, f); + if(rc == -1) break; + + if(buffer[0] == '%') continue; + else if(buffer[0] == 'd'){ + int i; + + for(i = 0; buffer[i] && buffer[i] != '='; ++i); + + if(strncmp(buffer, "door =", i) == 0){ + int dX, dY, dId, un; + char *end, *end2, *end3; + + dX = strtol(&buffer[i + 1], &end, 10); + dY = strtol(end, &end2, 10); + dId = strtol(end2, &end3, 10); + un = strtol(end3, NULL, 10); + + (*objArr)[*nObj].type = DOOR; + (*objArr)[*nObj].x = dX; + (*objArr)[*nObj].y = dY; + (*objArr)[*nObj].id = dId; + (*objArr)[*nObj].unlocked = un; + + *nObj += 1; + + }else{ + fprintf(stderr, "\t%s.readMapObjects(): Skipped invalid data in DOORS key in map file %s.\n", __FILE__, file); + fprintf(stderr, "\t%s.readMapObjects(): The invalid line is %s.\n", __FILE__, buffer); + continue; + } + } + }while(buffer[0] != '['); + + }else if(strcmp(buffer, "[KEYS]\n") == 0){ + do{ + rc = getline(&buffer, &n, f); + if(rc == -1) break; + + if(buffer[0] == '%') continue; + else if(buffer[0] == 'k'){ + int i; + + for(i = 0; buffer[i] && buffer[i] != '='; ++i); + + if(strncmp(buffer, "key =", i) == 0){ + int kX, kY, kId; + char *end, *end2; + + kX = strtol(&buffer[i + 1], &end, 10); + kY = strtol(end, &end2, 10); + kId = strtol(end2, NULL, 10); + + (*objArr)[*nObj].type = KEY; + (*objArr)[*nObj].x = kX; + (*objArr)[*nObj].y = kY; + (*objArr)[*nObj].id = kId; + + *nObj += 1; + + }else{ + fprintf(stderr, "\t%s.readMapObjects(): Skipped invalid data in KEYS key in map file %s.\n", __FILE__, file); + fprintf(stderr, "\t%s.readMapObjects(): The invalid line is %s.\n", __FILE__, buffer); + continue; + } + } + }while(buffer[0] != '['); + + }else if(strcmp(buffer, "[PERSONS]\n") == 0){ + do{ + rc = getline(&buffer, &n, f); + if(rc == -1) break; + + if(buffer[0] == '%') continue; + else if(buffer[0] == 'p'){ + int i; + + for(i = 0; buffer[i] && buffer[i] != '='; ++i); + + if(strncmp(buffer, "person =", i) == 0){ + int pX, pY, pDId; + char *end, *end2; + + pX = strtol(&buffer[i + 1], &end, 10); + pY = strtol(end, &end2, 10); + end2++; + + (*objArr)[*nObj].type = PERSON; + (*objArr)[*nObj].x = pX; + (*objArr)[*nObj].y = pY; + + for(i = 0; end2[i] && end2[i] != ' '; ++i); + + strncpy((*objArr)[*nObj].name, end2, i); + (*objArr)[*nObj].name[i] = '\0'; + + pDId = strtol(&end2[i], NULL, 10); + (*objArr)[*nObj].dId = pDId; + + *nObj += 1; + + }else{ + fprintf(stderr, "\t%s.readMapObjects(): Skipped invalid data in PERSONS key in map file %s.\n", __FILE__, file); + fprintf(stderr, "\t%s.readMapObjects(): The invalid line is %s.\n", __FILE__, buffer); + continue; + } + } + }while(buffer[0] != '['); + + }else if(strcmp(buffer, "[DIALOGS]\n") == 0){ + do{ + rc = getline(&buffer, &n, f); + if(rc == -1) break; + + if(buffer[0] == '%') continue; + else if(buffer[0] == 'd'){ + int i; + + for(i = 0; buffer[i] && buffer[i] != '='; ++i); + + if(strncmp(buffer, "dialog =", i) == 0){ + int dId; + char *end; + + dId = strtol(&buffer[i + 1], &end, 10); + end++; + + (*objArr)[*nObj].type = DIALOG; + (*objArr)[*nObj].id = dId; + + strcpy((*objArr)[*nObj].dialog, end); + for(i = 0; (*objArr)[*nObj].dialog[i] && (*objArr)[*nObj].dialog[i] != '\n'; ++i); + (*objArr)[*nObj].dialog[i] = '\0'; + + *nObj += 1; + + }else{ + fprintf(stderr, "\t%s.readMapObjects(): Skipped invalid data in DIALOGS key in map file %s.\n", __FILE__, file); + fprintf(stderr, "\t%s.readMapObjects(): The invalid line is %s.\n", __FILE__, buffer); + continue; + } + } + }while(buffer[0] != '['); + + }else{ + fprintf(stderr, "\t%s.readMapObjects(): Found invalid key in map file %s. Key is %s\n", __FILE__, file, buffer); + free(buffer); + return INVALID_KEY; + } + } + + fclose(f); + free(buffer); + + return NO_ERROR; +}