X-Git-Url: http://4ch.mooo.com/gitweb/?p=16.git;a=blobdiff_plain;f=src%2Flib%2F16_map.c;h=33c27d1446fb98d81c362e15519466160c1bd331;hp=f74f46caa505af888b76b1a4b860c0a03ce10e31;hb=def418b6ee7f06ce7229e6eae5dbfbe44e9b9e82;hpb=9f7ffee2115e5b995c5470117e426d2c89b58979 diff --git a/src/lib/16_map.c b/src/lib/16_map.c index f74f46ca..33c27d14 100755 --- a/src/lib/16_map.c +++ b/src/lib/16_map.c @@ -1,5 +1,5 @@ /* Project 16 Source Code~ - * Copyright (C) 2012-2017 sparky4 & pngwen & andrius4669 & joncampbell123 & yakui-lover + * Copyright (C) 2012-2019 sparky4 & pngwen & andrius4669 & joncampbell123 & yakui-lover * * This file is part of Project 16. * @@ -20,7 +20,12 @@ * */ +//TODO USE CA AND THIS FILE FORMAT + #include "src/lib/16_map.h" +//#define JSMN_STATIC +#include "src/lib/jsmn/jsmn.h" +#include // Ideally, preprocess json during compilation and read serialized data @@ -32,292 +37,114 @@ int jsoneq(const char *json, jsmntok_t *tok, const char *s) { return -1; } -/*//this function is quite messy ^^; sorry! it is a quick and dirty fix~ -word dump(const char *js, jsmntok_t *t, size_t count, word indent, char *js_sv, map_t *map, dword q) { - dword i; - word j;//, k; - bitmap_t bp; - #ifdef DEBUG_JS - if(indent==0) - { - fprintf(stdout, "%s\n", js); - fprintf(stdout, "\n"); - } - #endif - #ifdef DEBUG_DUMPVARS - fprintf(stdout, "t->size=[%d] ", t->size); - fprintf(stdout, "q=[%d] ", q); - fprintf(stdout, "indent= [%d] ", indent); - fprintf(stdout, "js_sv= [%s]\n", js_sv); - #endif - if (count == 0) { - return 0; - } - // We may want to do strtol() here to get numeric value -//0000fprintf(stderr, "t->type=%d\n", t->type); - if (t->type == JSMN_PRIMITIVE) { - if(strstr(js_sv, "data")) - { - // - // here we should recursivly call dump again here to skip over the array until we get the width of the map. - // so we can initiate the map which allocates the facking map->tiles ->data->data properly and THEN we can return - // here to read the data.... That is my design for this... wwww - - // well i am stuck.... wwww - // - map->data[q] = (byte)atoi(js+t->start); - #ifdef DEBUG_MAPDATA - fprintf(stdout, "%d[%d]", q, map->data[q]); - #endif - } - else - if(strstr(js_sv, "height")) - { - map->height = atoi(js+t->start); - #ifdef DEBUG_MAPVAR - fprintf(stdout, "indent= [%d] ", indent); - fprintf(stdout, "h:[%d]\n", map->height); - #endif - }else if(strstr(js_sv, "width")) - { - map->width = atoi(js+t->start); - #ifdef DEBUG_MAPVAR - fprintf(stdout, "indent= [%d] ", indent); - fprintf(stdout, "w:[%d]\n", map->width); - #endif - } - return 1; - // We may use strndup() to fetch string value - } else if (t->type == JSMN_STRING) { - if(jsoneq(js, t, "data") == 0) - { -// fprintf(stdout, "[[[[%d|%d]]]]\n", &(t+1)->size, (t+1)->size); -// fprintf(stdout, "\n%.*s[xx[%d|%d]xx]\n", (t+1)->end - (t+1)->start, js+(t+1)->start, &(t+1)->size, (t+1)->size); - map->data = malloc(sizeof(byte) * (t+1)->size); - map->tiles = malloc(sizeof(tiles_t)); - map->tiles->btdata = malloc(sizeof(bitmap_t)); - //fix this to be far~ -//0000 bp = bitmapLoadPcx("data/ed.pcx"); -// bp = bitmapLoadPcx("data/koishi^^.pcx"); - map->tiles->btdata = &bp; -//---- map->tiles->data = planar_buf_from_bitmap(&bp); - //map->tiles->data->data = malloc((16)*16); - //map->tiles->data->width = (16/); - //map->tiles->data->height= 16; - map->tiles->tileHeight = 16; - map->tiles->tileWidth = 16; - map->tiles->rows = 1; - map->tiles->cols = 1; -#ifdef __DEBUG_MAP__ - dbg_maptext=false; -#endif - strcpy(js_sv, "data");//strdup(js+t->start);//, t->end - t->start); - } - else - if (jsoneq(js, t, "height") == 0 && indent<=1) - { - strcpy(js_sv, "height");//strdup(js+t->start);//, t->end - t->start); - }else - if(jsoneq(js, t, "width") == 0 && indent<=1) - { - strcpy(js_sv, "width");//strdup(js+t->start);//, t->end - t->start); - }else strcpy(js_sv, "\0"); - return 1; - } else if (t->type == JSMN_OBJECT) { - //fprintf(stdout, "\n"); - j = 0; - for (i = 0; i < t->size; i++) { - //for (k = 0; k < indent; k++) fprintf(stdout, "\t"); - j += dump(js, t+1+j, count-j, indent+1, js_sv, map, i); - //fprintf(stdout, ": "); - j += dump(js, t+1+j, count-j, indent+1, js_sv, map, i); - //fprintf(stdout, "\n"); - } - return j+1; - } else if (t->type == JSMN_ARRAY) { - j = 0; - //fprintf(stdout, "==\n"); - for (i = 0; i < t->size; i++) { - //for (k = 0; k < indent-1; k++) fprintf(stdout, "\t"); - //fprintf(stdout, "\t-"); - j += dump(js, t+1+j, count-j, indent+1, js_sv, map, i); - //fprintf(stdout, "==\n"); - } - return j+1; - } - return 0; -} - -int loadmap(char *mn, map_t *map, global_game_variables_t *gvar) -{ - int r; - static word incr=0; - int eof_expected = 0; - char *js = NULL; - size_t jslen = 0; - char buf[BUFSIZ]; - static char js_ss[16]; - - jsmn_parser p; - jsmntok_t *tok; - size_t tokcount = 2; - - FILE *fh = fopen(mn, "r"); - - // Prepare parser - jsmn_init(&p); - - // Allocate some tokens as a start -//0000fprintf(stderr, "tok malloc\n"); - tok = malloc(sizeof(*tok) * tokcount); - if (tok == NULL) { - fprintf(stderr, "malloc(): errno=%d\n", errno); - return 3; - } - - for (;;) { - // Read another chunk -//0000fprintf(stderr, "read\n"); - r = fread(buf, 1, sizeof(buf), fh); - if (r < 0) { - fprintf(stderr, "fread(): %d, errno=%d\n", r, errno); - return 1; - } - if (r == 0) { - if (eof_expected != 0) { - return 0; - } else { - fprintf(stderr, "fread(): unexpected EOF\n"); - return 2; - } - } -//0000fprintf(stdout, "r= [%d] BUFSIZ=%d\n", r, BUFSIZ); -//0000fprintf(stderr, "js alloc~\n"); - js = realloc(js, jslen + r + 1); - if (js == NULL) { - fprintf(stderr, "*js=%Fp\n", *js); - fprintf(stderr, "realloc(): errno = %d\n", errno); - return 3; - } - strncpy(js + jslen, buf, r); - jslen = jslen + r; - -again: -//0000fprintf(stdout, " parse~ tok=%zu jslen=%zu r=%d _memavl()=%u BUFSIZ=%d~\n", tokcount, jslen, r, _memavl(), BUFSIZ); -//0000fprintf(stdout, "p=[%u] [%u] [%d]\n", p.pos, p.toknext, p.toksuper); -// -// I think it crashes on the line below when it tries to parse the data of huge maps... wwww this is a jsmn problem wwww -// - r = jsmn_parse(&p, js, jslen, tok, tokcount); -//0000fprintf(stdout, "r= [%d]\n", r); - if (r < 0) { - if (r == JSMN_ERROR_NOMEM) { - tokcount = tokcount * 2; -//0000fprintf(stderr, "tok realloc~ %zu\n", tokcount); - tok = realloc(tok, sizeof(*tok) * tokcount); - if (tok == NULL) { - fprintf(stderr, "realloc(): errno=%d\n", errno); - return 3; - } - goto again; - } - } else { - //printf("js=%Fp\n", (js)); - //printf("*js=%Fp\n", (*(js))); - //printf("&*js=%s\n", &(*(js))); - //printf("&buf=[%Fp]\n", &buf); - //printf("&buf_seg=[%x]\n", FP_SEG(&buf)); - //printf("&buf_off=[%x]\n", FP_OFF(&buf)); - //printf("&buf_fp=[%Fp]\n", MK_FP(FP_SEG(&buf), FP_OFF(&buf))); - //printf("buf=[\n%s\n]\n", buf); - //printf("buff=[%Fp]\n", buff); - //printf("(*buff)=[%Fp]\n", (*buff)); - //printf("&(*buff)=[\n%s\n]\n", &(*buff)); - #ifdef DEBUG_DUMPVARS - fprintf(stdout, "running dump~\n"); - #endif - dump(js, tok, p.toknext, incr, &js_ss, map, 0); - eof_expected = 1; - } - } - - //free(js); - //free(tok); - //fclose(fh); - - return 0; -}*/ - +//TODO: WORK ON THIS LIKE CRAZY! --sparky4 +//FIXME: please FIX THIS AND USE CA! --sparky4 void extract_map(const char *js, jsmntok_t *t, size_t count, map_t *map) { int i, j, k, indent=0, inner_end; char *s; + boolean objlay=0; //bitmap_t bp; i = 0; +#define MAPLNAMESIZE t[i+1].end - t[i+1].start while(ilayerdata = malloc(sizeof(byte*) * t[i].size); inner_end = t[i].end; k = 0; while(t[i].start < inner_end) { -#ifdef DEBUG_DUMPVARS - printf("t[%d].start=%d, %d\n", i, t[i].start, inner_end); -#endif +//#define DEBUG_DUMPVARS +//#ifdef DEBUG_DUMPVARS +// printf("t[%d].start=%d, %d\n", i, t[i].start, inner_end); +//#endif + if(!objlay){ if(jsoneq(js, &(t[i]), "data") == 0) { #ifdef DEBUG_MAPDATA - printf("Layer %d data: [\n", k); + printf("Layer %d data: (size is %d)[\n", k, t[i+1].size); #endif - map->layerdata[k].data = malloc(sizeof(byte) * t[i+1].size); -// map->data = (map->layerdata[k].data); //for backwards compatibility for rest of code + map->layerdata[k].data = malloc(sizeof(byte) * t[i+1].size);//TODO: USE MM_ CA_ AND PM_ for(j = 0; j < t[i+1].size; j++) { - //map->layerdata[k][j] = (byte)atoi(js + t[i+2+j].start); map->layerdata[k].data[j] = (byte)atoi(js + t[i+2+j].start); #ifdef DEBUG_MAPDATA - //printf("[%d,%d]%d", k, j, map->MAPDATAPTK[j]); - printf("%c", map->MAPDATAPTK[j]+44); - //fprintf(stdout, "%c", map->data[j]+44); + printf("%c", map->layerdata[k].data[j]+44); #endif } i += j + 2; - k++; #ifdef DEBUG_MAPDATA puts("\n]"); #endif - }else{ - i++; + }else if(jsoneq(js, &(t[i]), "name") == 0) { +#ifdef DEBUG_MAPVARS + printf("Layer %d's name: (size is %d)[\n", k, MAPLNAMESIZE); +#endif + //map->layerdata[k].layername = malloc(sizeof(byte) * MAPLNAMESIZE);//TODO: USE MM_ CA_ AND PM_ + strncpy(&(map->layerdata[k].layername), js+t[i+1].start, MAPLNAMESIZE); + if((map->layerdata[k].layername[MAPLNAMESIZE])!=0) map->layerdata[k].layername[MAPLNAMESIZE]='\0'; + if(strstr(&map->layerdata[k].layername, "ob")) objlay=1; +#ifdef DEBUG_MAPDATA + printf("%s", map->layerdata[k].layername); + printf("\n]\n"); +#endif + k++; } - } - } + }else{ //objlay + if(jsoneq(js, &(t[i]), "objects") == 0) { +#ifdef DEBUG_OBVARS + printf("objects detected\n"); +#endif +#ifdef DEBUG_OBVARS + +#endif +// map->layerdata[k].layername = mAlloc(sizeof(byte) * MAPLNAMESIZE);//TODO: USE MM_ CA_ AND PM_ +// strncpy(map->layerdata[k].layername, js+t[i+1].start, MAPLNAMESIZE);//TODO: USE MM_ CA_ AND PM_ +// if(map->layerdata[k].layername[MAPLNAMESIZE]!=0) map->layerdata[k].layername[MAPLNAMESIZE]='\0'; + }else if(jsoneq(js, &(t[i]), "name") == 0) { +#ifdef DEBUG_OBVARS + printf("Object %d's name: ", k);//, MAPLNAMESIZE + printf("'%.*s'\n", t[i+1].end - t[i+1].start, js+t[i+1].start); +#endif + }else if(jsoneq(js, &(t[i]), "properties") == 0) { +#ifdef DEBUG_OBVARS + printf(" properties: %.*s\n", t[i+1].end - t[i+1].start, js+t[i+1].start); +#endif + }else if(jsoneq(js, &(t[i]), "walkable") == 0) { + printf(" walkable: %d\n", atoi(js + t[i+1].start)); + } + + }//end objlay + i++;//next token + }//tokens + }//layers + + if(jsoneq(js, &(t[i]), "tilesets") == 0) { i++; inner_end = t[i].end; k = 0; while(t[i].start < inner_end) { if(jsoneq(js, &(t[i]), "image") == 0) { - map->MAPTILESPTK = malloc(sizeof(tiles_t)); + map->tiles = malloc(sizeof(tiles_t));//TODO: USE MM_ CA_ AND PM_ s = remove_ext((char *)js+t[i+1].start, '.', '/'); - strcpy(map->MAPTILESPTK->imgname, s); + strcpy(map->tiles->imgname, s); //And move to vrs, probably // bp = bitmapLoadPcx("data/ed.pcx"); -// map->MAPTILESPTK->btdata = &bp; - //map->MAPTILESPTK->btdata = malloc(sizeof(bitmap_t)); - map->MAPTILESPTK->rows = 1; - map->MAPTILESPTK->cols = 1; +// map->tiles->btdata = &bp; + map->tiles->rows = 1; + map->tiles->cols = 1; #ifdef __DEBUG_MAP__ dbg_maptext=false; #endif i++; }else if(jsoneq(js, &(t[i]), "tileheight") == 0) { - map->MAPTILESPTK->tileHeight = atoi(js + t[i+1].start); -#ifdef DEBUG_MAPVAR - printf("Tile Height: %d\n", map->MAPTILESPTK->tileHeight); + map->tiles->tileHeight = atoi(js + t[i+1].start); +#ifdef DEBUG_MAPVARS + printf("Tile Height: %d\n", map->tiles->tileHeight); #endif i++; }else if(jsoneq(js, &(t[i]), "tilewidth") == 0) { - map->MAPTILESPTK->tileWidth = atoi(js + t[i+1].start); -#ifdef DEBUG_MAPVAR - printf("Tile Width: %d\n", map->MAPTILESPTK->tileWidth); + map->tiles->tileWidth = atoi(js + t[i+1].start); +#ifdef DEBUG_MAPVARS + printf("Tile Width: %d\n", map->tiles->tileWidth); #endif i++; } @@ -328,14 +155,14 @@ void extract_map(const char *js, jsmntok_t *t, size_t count, map_t *map) { if (jsoneq(js, &(t[i]), "height") == 0 && indent<=1) { map->height = atoi(js + t[i+1].start); -#ifdef DEBUG_MAPVAR +#ifdef DEBUG_MAPVARS printf("Height: %d\n", map->height); #endif i++; } else if(jsoneq(js, &(t[i]), "width") == 0 && indent<=1) { map->width = atoi(js + t[i+1].start); -#ifdef DEBUG_MAPVAR +#ifdef DEBUG_MAPVARS printf("Width: %d\n", map->width); #endif i++; @@ -358,7 +185,7 @@ int newloadmap(char *mn, map_t *map) { jsmn_init(&p); file_s = filesize(fh); - js = malloc(file_s); + js = malloc(file_s);//TODO: USE MM_ CA_ AND PM_ if(js == NULL) { fprintf(stderr, "malloc(): errno = %d", 2); fclose(fh); @@ -371,7 +198,7 @@ int newloadmap(char *mn, map_t *map) { return 1; } tokcount = jsmn_parse(&p, js, file_s, NULL, 0); - tok = malloc(tokcount*sizeof(jsmntok_t)); + tok = malloc(tokcount*sizeof(jsmntok_t));//TODO: USE MM_ CA_ AND PM_ printf("Allocated %d tokens", tokcount); jsmn_init(&p); if((status = jsmn_parse(&p, js, file_s, tok, tokcount)) < 0) @@ -382,9 +209,9 @@ int newloadmap(char *mn, map_t *map) { else if(status != tokcount) { printf("Warning: used %d tok\n", status);} extract_map(js, tok, tokcount, map); - free(js); - free(tok); - fclose(fh); + free(js); //TODO: USE MM_ CA_ AND PM_ + free(tok); //TODO: USE MM_ CA_ AND PM_ + fclose(fh); //TODO: USE MM_ CA_ AND PM_ return 0; } @@ -393,7 +220,6 @@ int newloadmap(char *mn, map_t *map) { //====== -#define MAPBUFINLM (gvar->ca.camap.mapsegs) int CA_loadmap(char *mn, map_t *map, global_game_variables_t *gvar) { jsmn_parser p; @@ -407,21 +233,23 @@ int CA_loadmap(char *mn, map_t *map, global_game_variables_t *gvar) jsmn_init(&p); file_s = filesize(fh); - CA_LoadFile(mn, &MAPBUFINLM, gvar); - tokcount = jsmn_parse(&p, MAPBUFINLM, file_s, NULL, 0); - tok = malloc(tokcount*sizeof(jsmntok_t)); + CA_LoadFile(mn, MEMPTRCONV MAPSEGINLM, gvar); + tokcount = jsmn_parse(&p, (char const *)MAPSEGINLM, file_s, NULL, 0); + tok = malloc(tokcount*sizeof(jsmntok_t));//TODO: USE MM_ CA_ AND PM_ // printf("Allocated %d tokens", tokcount); jsmn_init(&p); - if((status = jsmn_parse(&p, MAPBUFINLM, file_s, tok, tokcount)) < 0) + if((status = jsmn_parse(&p, (char const *)MAPSEGINLM, file_s, tok, tokcount)) < 0) { printf("Error: %d\n", status); return status; } else if(status != tokcount) { printf("Warning: used %d tok\n", status);} - extract_map(MAPBUFINLM, tok, tokcount, map); + extract_map((char const *)MAPSEGINLM, tok, tokcount, map); - free(tok); - fclose(fh); +// printf("freeing tok\n"); + free(tok); //TODO: USE MM_ CA_ AND PM_ +// printf("fclose fh\n"); + fclose(fh); //TODO: USE MM_ CA_ AND PM_ return 0; }