128 lines
1.8 KiB
C
128 lines
1.8 KiB
C
// Copyright (C) 2012 Valeriano Alfonso Rodriguez (Kableado)
|
|
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <math.h>
|
|
|
|
#include "GameLib.h"
|
|
|
|
#include "GameEnts.h"
|
|
#include "GameMap.h"
|
|
|
|
|
|
int ReadLine(FILE *f,char *line,int max){
|
|
int c;
|
|
int i=0;
|
|
while(i<(max-1)){
|
|
c=fgetc(f);
|
|
if(c==EOF){
|
|
line[i]=0;
|
|
return(-1);
|
|
}
|
|
if(c=='\r'){
|
|
continue;
|
|
}
|
|
if(c=='\n'){
|
|
line[i]=0;
|
|
return(i);
|
|
}
|
|
line[i]=c;
|
|
i++;
|
|
}
|
|
line[i]=0;
|
|
return(i);
|
|
}
|
|
|
|
|
|
Entity GameMapAux_CreateEnt(Entity ent,int i,int j,int res){
|
|
Entity e;
|
|
vec2 pos;
|
|
e=Entity_Copy(ent);
|
|
vec2_set(pos,(res/2)+i*res,(res/2)+j*res);
|
|
vec2_plus(e->pos,e->pos,pos);
|
|
Entity_CalcBBox(e);
|
|
GameLib_AddEntity(e);
|
|
return(e);
|
|
}
|
|
|
|
|
|
#define MaxLineLen 1024
|
|
|
|
int GameMap_LoadLevel(char *filename,int res){
|
|
FILE *file;
|
|
char line[MaxLineLen];
|
|
int len,i,j;
|
|
int width,height;
|
|
char *map;
|
|
|
|
|
|
// Open the file
|
|
file=fopen(filename,"rb");
|
|
if(!file){
|
|
return(0);
|
|
}
|
|
|
|
// Read the file to determine sizes
|
|
width=0;
|
|
height=0;
|
|
do{
|
|
len=ReadLine(file,line,MaxLineLen);
|
|
if(len>-1){
|
|
if(len>height){
|
|
height=len;
|
|
}
|
|
width++;
|
|
}
|
|
}while(len>-1);
|
|
fseek(file,0,SEEK_SET);
|
|
|
|
|
|
// Build the map
|
|
map=malloc(sizeof(char)*width*height);
|
|
memset(map,0,width*height);
|
|
#define MAP(x,y) map[(x)+((y)*width)]
|
|
j=0;
|
|
do{
|
|
len=ReadLine(file,line,MaxLineLen);
|
|
for(i=0;i<len;i++){
|
|
MAP(j,(height-1)-i)=line[i];
|
|
}
|
|
j++;
|
|
}while(len>-1);
|
|
|
|
|
|
// Close the file
|
|
fclose(file);
|
|
|
|
|
|
// Parse the map
|
|
for(j=0;j<height;j++){
|
|
for(i=0;i<width;i++){
|
|
Entity ent;
|
|
|
|
|
|
|
|
if(MAP(i,j)=='P'){
|
|
// Player
|
|
GameMapAux_CreateEnt(ent_Player,i,j,res);
|
|
}
|
|
if(MAP(i,j)=='#'){
|
|
// Block
|
|
ent=GameMapAux_CreateEnt(ent_Block,i,j,res);
|
|
}
|
|
if(MAP(i,j)=='|'){
|
|
// Platform
|
|
ent=GameMapAux_CreateEnt(ent_Platform,i,j,res);
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
|
|
// Cleanup
|
|
free(map);
|
|
#undef MAP
|
|
|
|
return(1);
|
|
} |