Map file correctly loaded.
This commit is contained in:
@@ -6,7 +6,9 @@
|
|||||||
#ifndef MAP_H
|
#ifndef MAP_H
|
||||||
#define 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 {
|
typedef enum FLOOR_TYPES {
|
||||||
VOID = 0,
|
VOID = 0,
|
||||||
@@ -27,6 +29,7 @@ typedef enum OBJECT_TYPES {
|
|||||||
PERSON,
|
PERSON,
|
||||||
PLAYER_START,
|
PLAYER_START,
|
||||||
EXIT,
|
EXIT,
|
||||||
|
DIALOG,
|
||||||
NONE = 9989
|
NONE = 9989
|
||||||
} obj_t;
|
} obj_t;
|
||||||
|
|
||||||
@@ -35,13 +38,26 @@ typedef enum ERROR_CODES {
|
|||||||
FILE_NOT_FOUND,
|
FILE_NOT_FOUND,
|
||||||
OUT_OF_MEMORY,
|
OUT_OF_MEMORY,
|
||||||
PREMATURE_EOF,
|
PREMATURE_EOF,
|
||||||
MAP_TOO_LARGE
|
MAP_TOO_LARGE,
|
||||||
|
INVALID_KEY
|
||||||
} errcode_t;
|
} errcode_t;
|
||||||
|
|
||||||
typedef struct MAP_CELL{
|
typedef struct MAP_CELL{
|
||||||
floor_t f;
|
floor_t f;
|
||||||
} map_cell_t;
|
} 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 readMapData(const char *, map_cell_t ***, int *, int *);
|
||||||
|
extern errcode_t readMapObjects(const char *, game_obj_t **, int *);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -25,13 +25,15 @@ static bool uK, dK, lK, rK;
|
|||||||
static clock_t then;
|
static clock_t then;
|
||||||
static player_t player;
|
static player_t player;
|
||||||
static map_cell_t ** map;
|
static map_cell_t ** map;
|
||||||
static int mW, mH;
|
game_obj_t objs[MAX_OBJECTS];
|
||||||
|
static int mW, mH, nO;
|
||||||
|
|
||||||
void input();
|
void input();
|
||||||
gsname_t update();
|
gsname_t update();
|
||||||
void render(int, int);
|
void render(int, int);
|
||||||
void drawGui(int, int);
|
void drawGui(int, int);
|
||||||
void setPlayerStart();
|
void setPlayerStart();
|
||||||
|
void initObjects();
|
||||||
|
|
||||||
void initInGameState( gs_t * gs) {
|
void initInGameState( gs_t * gs) {
|
||||||
int n, i, j;
|
int n, i, j;
|
||||||
@@ -85,11 +87,30 @@ void initInGameState( gs_t * gs) {
|
|||||||
map[ i ] = ( map_cell_t * ) calloc ( 32 , sizeof ( map_cell_t ) );
|
map[ i ] = ( map_cell_t * ) calloc ( 32 , sizeof ( map_cell_t ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
initObjects();
|
||||||
|
|
||||||
errcode_t rc = readMapData("map_file.map", &map, &mW, &mH);
|
errcode_t rc = readMapData("map_file.map", &map, &mW, &mH);
|
||||||
|
|
||||||
fprintf(stderr, "\t%s: readMapData() returned %d\n", __FILE__, rc);
|
fprintf(stderr, "\t%s: readMapData() returned %d\n", __FILE__, rc);
|
||||||
fprintf(stderr, "\t%s: Map size is (%d, %d).\n", __FILE__, mW, mH);
|
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 ) {
|
for ( i = 0; i < 32; ++i ) {
|
||||||
free(map[ 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
280
src/map.c
280
src/map.c
@@ -2,6 +2,7 @@
|
|||||||
* Copyright (c) 2014, Miguel Angel Astor Romero. All rights reserved.
|
* Copyright (c) 2014, Miguel Angel Astor Romero. All rights reserved.
|
||||||
* See the file LICENSE for more details.
|
* See the file LICENSE for more details.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define _GNU_SOURCE
|
#define _GNU_SOURCE
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
@@ -10,9 +11,9 @@
|
|||||||
#include "map.h"
|
#include "map.h"
|
||||||
|
|
||||||
errcode_t readMapData(const char * file, map_cell_t *** map, int * w, int * h){
|
errcode_t readMapData(const char * file, map_cell_t *** map, int * w, int * h){
|
||||||
|
size_t n = 2048;
|
||||||
char *buffer;
|
char *buffer;
|
||||||
FILE * f;
|
FILE * f;
|
||||||
size_t n = 2048;
|
|
||||||
|
|
||||||
f = fopen(file, "r");
|
f = fopen(file, "r");
|
||||||
if(f == NULL) return FILE_NOT_FOUND;
|
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;
|
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;
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user