makeWay/src/rooms.c

143 lines
3.0 KiB
C

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <math.h>
#include <stdbool.h>
#include <unistd.h>
#include <termios.h>
#include <limits.h>
#include <time.h>
#include <sys/time.h>
#include <SDL2/SDL.h>
#include <SDL2/SDL_image.h>
#include "structure.h"
#include "base.h"
#include "rooms.h"
int START_CHX;
int START_CHY;
int FINISH_CHX;
int FINISH_CHY;
int START_DIR;
bool is_digit(char c) {
return ((int)c >= 48 && (int)c <= 57);
}
int read_int(FILE* ptr) {
int res = 0;
char c = fgetc(ptr);
while(c != EOF && !is_digit(c)) {
c = fgetc(ptr);
}
while(c != EOF && is_digit(c)) {
res = 10*res + (int)c - 48;
c = fgetc(ptr);
}
return res;
}
// typedef enum road_t {NONE, START, END, STR_V, STR_H, TURN_NE, TURN_SE, TURN_SW, TURN_NW} road; //
/*
. = NULL
0 = Vertical
1 = Horizontal
2 = TopRight (NE)
3 = BottomRight (SE)
4 = BottomLeft (SW)
5 = TopLeft (NW)
S = Start
E = End
*/
road get_type(char c) {
switch (c){
case '.':
return NONE;
case 'S':
return START;
case 'E':
return END;
case '0':
return STR_V;
case '1':
return STR_H;
case '2':
return TURN_NE;
case '3':
return TURN_SE;
case '4':
return TURN_SW;
case '5':
return TURN_NW;
default:
fprintf(stderr, "unrecognized character '%c' encountered in parsing", c);
return NONE;
}
}
void test_file(char* path) {
FILE* ptr = fopen(path, "r");
char c = fgetc(ptr);
while(c != EOF) {
printf("%c", c);
c = fgetc(ptr);
}
fclose(ptr);
}
level* parse_level(char* path) {
FILE* ptr = fopen(path, "r");
level* lvl = malloc(sizeof(level));
lvl->lines = read_int(ptr);
lvl->cols = read_int(ptr);
//printf("dims : (%d %d)\n", lvl->lines, lvl->cols);
lvl->map = malloc(sizeof(road*)*(lvl->lines));
for(int l = 0; l < lvl->lines; l++) {
lvl->map[l] = malloc(sizeof(road)*(lvl->cols));
}
for(int l = 0; l < lvl->lines; l++) {
for(int c = 0; c < lvl->cols; c++) {
char ch = fgetc(ptr);
if(ch == '\n') {ch = fgetc(ptr); printf("\n");}
printf("%c", ch);
lvl->map[l][c] = get_type(ch);
if(ch == 'S') {
START_CHX = l;
START_CHY = c;
} else if(ch == 'E') {
FINISH_CHX = l;
FINISH_CHY = c;
}
}
}
printf("\n");
if(START_CHX-1 >= 0 && lvl->map[START_CHX-1][START_CHY] != NONE) {
START_DIR = 0;
}
if(START_CHX+1 < lvl->lines && lvl->map[START_CHX+1][START_CHY] != NONE) {
START_DIR = 2;
}
if(START_CHY-1 >= 0 && lvl->map[START_CHX][START_CHY-1] != NONE) {
START_DIR = 3;
}
if(START_CHY+1 < lvl->cols && lvl->map[START_CHX][START_CHY+1] != NONE) {
START_DIR = 1;
}
return lvl;
}
void free_level(level* lvl) {
for(int l = 0; l < lvl->lines; l++) {
free(lvl->map[l]);
}
free(lvl->map);
free(lvl);
}