1 /* Project 16 Source Code~
\r
2 * Copyright (C) 2012-2022 sparky4 & pngwen & andrius4669 & joncampbell123 & yakui-lover
\r
4 * This file is part of Project 16.
\r
6 * Project 16 is free software; you can redistribute it and/or modify
\r
7 * it under the terms of the GNU General Public License as published by
\r
8 * the Free Software Foundation; either version 3 of the License, or
\r
9 * (at your option) any later version.
\r
11 * Project 16 is distributed in the hope that it will be useful,
\r
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
\r
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
\r
14 * GNU General Public License for more details.
\r
16 * You should have received a copy of the GNU General Public License
\r
17 * along with this program. If not, see <http://www.gnu.org/licenses/>, or
\r
18 * write to the Free Software Foundation, Inc., 51 Franklin Street,
\r
19 * Fifth Floor, Boston, MA 02110-1301 USA.
\r
23 //TODO USE CA AND THIS FILE FORMAT
\r
25 #include "src/lib/16_map.h"
\r
26 //#define JSMN_STATIC
\r
27 #include "src/lib/jsmn/jsmn.h"
\r
30 // Ideally, preprocess json during compilation and read serialized data
\r
32 int jsoneq(const char *json, jsmntok_t *tok, const char *s) {
\r
33 if (tok->type == JSMN_STRING && (int) strlen(s) == tok->end - tok->start &&
\r
34 strncmp(json + tok->start, s, tok->end - tok->start) == 0) {
\r
40 //TODO: WORK ON THIS LIKE CRAZY! --sparky4
\r
41 //FIXME: please FIX THIS AND USE CA! --sparky4
\r
42 void extract_map(const char *js, jsmntok_t *t, size_t count, map_t *map) {
\r
43 int i, j, k, indent=0, inner_end;
\r
49 #define MAPLNAMESIZE t[i+1].end - t[i+1].start
\r
51 if(jsoneq(js, &(t[i]), "layers") == 0) {
\r
53 inner_end = t[i].end;
\r
55 while(t[i].start < inner_end) {
\r
56 //#define DEBUG_DUMPVARS
\r
57 //#ifdef DEBUG_DUMPVARS
\r
58 // printf("t[%d].start=%d, %d\n", i, t[i].start, inner_end);
\r
61 if(jsoneq(js, &(t[i]), "data") == 0) {
\r
62 #ifdef DEBUG_MAPDATA
\r
63 printf("Layer %d data: (size is %d)[\n", k, t[i+1].size);
\r
65 map->layerdata[k].data = malloc(sizeof(byte) * t[i+1].size);//TODO: USE MM_ CA_ AND PM_
\r
66 for(j = 0; j < t[i+1].size; j++) {
\r
67 map->layerdata[k].data[j] = (byte)atoi(js + t[i+2+j].start);
\r
68 #ifdef DEBUG_MAPDATA
\r
69 printf("%c", map->layerdata[k].data[j]+44);
\r
73 #ifdef DEBUG_MAPDATA
\r
76 }else if(jsoneq(js, &(t[i]), "name") == 0) {
\r
77 #ifdef DEBUG_MAPVARS
\r
78 printf("Layer %d's name: (size is %d)[\n", k, MAPLNAMESIZE);
\r
80 //map->layerdata[k].layername = malloc(sizeof(byte) * MAPLNAMESIZE);//TODO: USE MM_ CA_ AND PM_
\r
81 strncpy(&(map->layerdata[k].layername), js+t[i+1].start, MAPLNAMESIZE);
\r
82 if((map->layerdata[k].layername[MAPLNAMESIZE])!=0) map->layerdata[k].layername[MAPLNAMESIZE]='\0';
\r
83 if(strstr(&map->layerdata[k].layername, "ob")) objlay=1;
\r
84 #ifdef DEBUG_MAPDATA
\r
85 printf("%s", map->layerdata[k].layername);
\r
91 if(jsoneq(js, &(t[i]), "objects") == 0) {
\r
93 printf("objects detected\n");
\r
98 // map->layerdata[k].layername = mAlloc(sizeof(byte) * MAPLNAMESIZE);//TODO: USE MM_ CA_ AND PM_
\r
99 // strncpy(map->layerdata[k].layername, js+t[i+1].start, MAPLNAMESIZE);//TODO: USE MM_ CA_ AND PM_
\r
100 // if(map->layerdata[k].layername[MAPLNAMESIZE]!=0) map->layerdata[k].layername[MAPLNAMESIZE]='\0';
\r
101 }else if(jsoneq(js, &(t[i]), "name") == 0) {
\r
102 #ifdef DEBUG_OBVARS
\r
103 printf("Object %d's name: ", k);//, MAPLNAMESIZE
\r
104 printf("'%.*s'\n", t[i+1].end - t[i+1].start, js+t[i+1].start);
\r
106 }else if(jsoneq(js, &(t[i]), "properties") == 0) {
\r
107 #ifdef DEBUG_OBVARS
\r
108 printf(" properties: %.*s\n", t[i+1].end - t[i+1].start, js+t[i+1].start);
\r
110 }else if(jsoneq(js, &(t[i]), "walkable") == 0) {
\r
111 printf(" walkable: %d\n", atoi(js + t[i+1].start));
\r
120 if(jsoneq(js, &(t[i]), "tilesets") == 0) {
\r
122 inner_end = t[i].end;
\r
124 while(t[i].start < inner_end) {
\r
125 if(jsoneq(js, &(t[i]), "image") == 0) {
\r
126 map->tiles = malloc(sizeof(tiles_t));//TODO: USE MM_ CA_ AND PM_
\r
127 s = remove_ext((char *)js+t[i+1].start, '.', '/');
\r
128 strcpy(map->tiles->imgname, s);
\r
129 //And move to vrs, probably
\r
130 // bp = bitmapLoadPcx("data/ed.pcx");
\r
131 // map->tiles->btdata = &bp;
\r
132 map->tiles->rows = 1;
\r
133 map->tiles->cols = 1;
\r
134 #ifdef __DEBUG_MAP__
\r
138 }else if(jsoneq(js, &(t[i]), "tileheight") == 0) {
\r
139 map->tiles->tileHeight = atoi(js + t[i+1].start);
\r
140 #ifdef DEBUG_MAPVARS
\r
141 printf("Tile Height: %d\n", map->tiles->tileHeight);
\r
144 }else if(jsoneq(js, &(t[i]), "tilewidth") == 0) {
\r
145 map->tiles->tileWidth = atoi(js + t[i+1].start);
\r
146 #ifdef DEBUG_MAPVARS
\r
147 printf("Tile Width: %d\n", map->tiles->tileWidth);
\r
156 if (jsoneq(js, &(t[i]), "height") == 0 && indent<=1) {
\r
157 map->height = atoi(js + t[i+1].start);
\r
158 #ifdef DEBUG_MAPVARS
\r
159 printf("Height: %d\n", map->height);
\r
163 else if(jsoneq(js, &(t[i]), "width") == 0 && indent<=1) {
\r
164 map->width = atoi(js + t[i+1].start);
\r
165 #ifdef DEBUG_MAPVARS
\r
166 printf("Width: %d\n", map->width);
\r
174 int newloadmap(char *mn, map_t *map) {
\r
178 jsmntok_t *tok = NULL;
\r
179 size_t tokcount, file_s;
\r
181 FILE *fh = fopen(mn, "r");
\r
184 /* Prepare parser */
\r
187 file_s = filesize(fh);
\r
188 js = malloc(file_s);//TODO: USE MM_ CA_ AND PM_
\r
190 fprintf(stderr, "malloc(): errno = %d", 2);
\r
194 if(fread(js, 1, file_s, fh) != file_s) {
\r
195 fprintf(stderr, "Map read error");
\r
200 tokcount = jsmn_parse(&p, js, file_s, NULL, 0);
\r
201 tok = malloc(tokcount*sizeof(jsmntok_t));//TODO: USE MM_ CA_ AND PM_
\r
202 printf("Allocated %d tokens", tokcount);
\r
204 if((status = jsmn_parse(&p, js, file_s, tok, tokcount)) < 0)
\r
206 printf("Error: %d\n", status);
\r
209 else if(status != tokcount) { printf("Warning: used %d tok\n", status);}
\r
210 extract_map(js, tok, tokcount, map);
\r
212 free(js); //TODO: USE MM_ CA_ AND PM_
\r
213 free(tok); //TODO: USE MM_ CA_ AND PM_
\r
214 fclose(fh); //TODO: USE MM_ CA_ AND PM_
\r
223 int CA_loadmap(char *mn, map_t *map, global_game_variables_t *gvar)
\r
226 jsmntok_t *tok = NULL;
\r
227 size_t tokcount, file_s;
\r
229 FILE *fh = fopen(mn, "r");
\r
232 /* Prepare parser */
\r
235 file_s = filesize(fh);
\r
236 CA_LoadFile(mn, MEMPTRCONV MAPSEGINLM, gvar);
\r
237 tokcount = jsmn_parse(&p, (char const *)MAPSEGINLM, file_s, NULL, 0);
\r
238 tok = malloc(tokcount*sizeof(jsmntok_t));//TODO: USE MM_ CA_ AND PM_
\r
239 // printf("Allocated %d tokens", tokcount);
\r
241 if((status = jsmn_parse(&p, (char const *)MAPSEGINLM, file_s, tok, tokcount)) < 0)
\r
243 printf("Error: %d\n", status);
\r
246 else if(status != tokcount) { printf("Warning: used %d tok\n", status);}
\r
247 extract_map((char const *)MAPSEGINLM, tok, tokcount, map);
\r
249 // printf("freeing tok\n");
\r
250 free(tok); //TODO: USE MM_ CA_ AND PM_
\r
251 // printf("fclose fh\n");
\r
252 fclose(fh); //TODO: USE MM_ CA_ AND PM_
\r