levelz-c 0.1.0
Loading...
Searching...
No Matches
level.h
1#ifndef LEVELZ_LEVEL_H
2#define LEVELZ_LEVEL_H
3
4#include <stdio.h>
5#include <stdlib.h>
6#include <string.h>
7
8#include "block.h"
9#include "coordinate.h"
10#include "matrix.h"
11
15typedef struct LevelHeader {
19 char* name;
20
24 char* value;
26
33LevelHeader* createLevelHeader(char* name, char* value) {
34 LevelHeader* h = (LevelHeader*) malloc(sizeof(LevelHeader));
35 h->name = name;
36 h->value = value;
37 return h;
38}
39
45char* LevelHeader_toString(LevelHeader* header) {
46 if (header == 0) return 0;
47
48 char* str = (char*) malloc(strlen(header->name) + strlen(header->value) + 3);
49 sprintf(str, "@%s %s", header->name, header->value);
50
51 return str;
52}
53
59LevelHeader* LevelHeader_fromString(const char* str) {
60 if (str == 0) return 0;
61
62 char* str0 = (char*) malloc(strlen(str) + 1);
63 strcpy(str0, str);
64
65 char* name = strtok(str0, " ") + 1;
66 char* value = name + strlen(name) + 1;
67
68 return createLevelHeader(name, value);
69}
70
90
91enum Scroll {
95 NONE,
96
100 HORIZONTAL_LEFT,
101
105 HORIZONTAL_RIGHT,
106
110 VERTICAL_UP,
111
115 VERTICAL_DOWN
116};
117
123Level2D* createLevel2D(Coordinate2D* spawn) {
124 Level2D* l = (Level2D*) malloc(sizeof(Level2D));
125 l->spawn = spawn;
126 return l;
127}
128
134int Level2D_getHeaderCount(Level2D* level) {
135 int headerCount = 0;
136 while (level->headers[headerCount] != NULL) {
137 headerCount++;
138 }
139
140 return headerCount;
141}
142
149char* Level2D_getHeader(Level2D* level, char* name) {
150 if (level->headers == 0) return 0;
151
152 int i = 0;
153 while (level->headers[i] != 0) {
154 if (strcmp(level->headers[i]->name, name) == 0) {
155 return level->headers[i]->value;
156 }
157 i++;
158 }
159
160 return 0;
161}
162
168void Level2D_setHeader(Level2D* level, LevelHeader* h) {
169 if (level->headers == 0) {
170 level->headers = (LevelHeader**) malloc(2 * sizeof(LevelHeader*));
171 level->headers[0] = h;
172 level->headers[1] = 0;
173 } else {
174 int headerCount = Level2D_getHeaderCount(level);
175 for (int i = 0; i < headerCount; i++) {
176 LevelHeader* header = level->headers[i];
177 if (strcmp(header->name, h->name) == 0) {
178 header->value = h->value;
179 return;
180 } else {
181 level->headers = (LevelHeader**) realloc(level->headers, (headerCount + 2) * sizeof(LevelHeader*));
182 level->headers[headerCount] = h;
183 level->headers[headerCount + 1] = 0;
184 }
185 }
186 }
187}
188
195void Level2D_addHeader(Level2D* level, char* name, char* value) {
196 LevelHeader* h = (LevelHeader*) malloc(sizeof(LevelHeader));
197 h->name = name;
198 h->value = value;
199
200 Level2D_setHeader(level, h);
201}
202
208void Level2D_removeHeader(Level2D* level, char* name) {
209 if (level->headers == 0) return;
210
211 int i = 0;
212 while (level->headers[i] != 0) {
213 if (strcmp(level->headers[i]->name, name) == 0) {
214 free(level->headers[i]);
215
216 for (int j = i; j < sizeof(level->headers) - 1; j++) {
217 level->headers[j] = level->headers[j + 1];
218 }
219 level->headers[sizeof(level->headers) - 1] = 0;
220 return;
221 }
222 i++;
223 }
224}
225
231int Level2D_getBlockCount(Level2D* level) {
232 int blockCount = 0;
233 while (level->blocks[blockCount] != NULL) {
234 blockCount++;
235 }
236
237 return blockCount;
238}
239
246Block* Level2D_getBlock(Level2D* level, Coordinate2D* coordinate) {
247 if (level->blocks == 0) return 0;
248
249 int i = 0;
250 while (level->blocks[i] != 0) {
251 if (level->blocks[i]->coordinate->x == coordinate->x && level->blocks[i]->coordinate->y == coordinate->y) {
252 return level->blocks[i]->block;
253 }
254 i++;
255 }
256
257 return 0;
258}
259
265void Level2D_addBlock(Level2D* level, LevelObject2D* block) {
266 if (level == 0) return;
267 if (block == 0) return;
268
269 if (level->blocks == 0) {
270 level->blocks = (LevelObject2D**) malloc(16 * sizeof(LevelObject2D*));
271 level->blocks[0] = block;
272 level->blocks[1] = 0;
273 } else {
274 int size = Level2D_getBlockCount(level);
275 for (int i = 0; i < size; i++) {
276 Coordinate2D* c = level->blocks[i]->coordinate;
277 if (c->x == block->coordinate->x && c->y == block->coordinate->y) {
278 level->blocks[i] = block;
279 return;
280 }
281 }
282
283 level->blocks = (LevelObject2D**) realloc(level->blocks, (size + 2) * sizeof(LevelObject2D*));
284 level->blocks[size] = block;
285 level->blocks[size + 1] = 0;
286 }
287}
288
295void Level2D_addMatrix(Level2D* level, Block* block, CoordinateMatrix2D* matrix) {
296 int size = CoordinateMatrix2D_size(matrix);
297 Coordinate2D** coordinates = CoordinateMatrix2D_coordinates(matrix);
298
299 for (int i = 0; i < size; i++) {
300 Coordinate2D* coordinate = coordinates[i];
301 Level2D_addBlock(level, createLevelObject2D(block, coordinate));
302 }
303
304}
305
311void Level2D_removeBlock(Level2D* level, LevelObject2D* block) {
312 if (level->blocks == 0) return;
313
314 int i = 0;
315 while (level->blocks[i] != 0) {
316 if (level->blocks[i] == block) {
317 free(level->blocks[i]);
318
319 for (int j = i; j < sizeof(level->blocks) - 1; j++) {
320 level->blocks[j] = level->blocks[j + 1];
321 }
322 level->blocks[sizeof(level->blocks) - 1] = 0;
323 return;
324 }
325 i++;
326 }
327}
328
335int Level2D_blockCount(Level2D* level, const char* name) {
336 if (level == 0) return 0;
337 if (level->blocks == 0) return 0;
338 if (name == 0) return 0;
339
340 int count = 0;
341 for (int i = 0; i < Level2D_getBlockCount(level); i++) {
342 if (strcmp(level->blocks[i]->block->name, name) == 0) {
343 count++;
344 }
345 }
346
347 return count;
348}
349
369
375Level3D* createLevel3D(Coordinate3D* spawn) {
376 Level3D* l = (Level3D*) malloc(sizeof(Level3D));
377 l->headers = NULL;
378 l->blocks = NULL;
379 l->spawn = spawn;
380 return l;
381}
382
388int Level3D_getHeaderCount(Level3D* level) {
389 int headerCount = 0;
390 while (level->headers[headerCount] != NULL) {
391 headerCount++;
392 }
393
394 return headerCount;
395}
396
403char* Level3D_getHeader(Level3D* level, char* name) {
404 if (level->headers == 0) return 0;
405
406 int i = 0;
407 while (level->headers[i] != 0) {
408 if (strcmp(level->headers[i]->name, name) == 0) {
409 return level->headers[i]->value;
410 }
411 i++;
412 }
413
414 return 0;
415}
416
422void Level3D_setHeader(Level3D* level, LevelHeader* h) {
423 if (level->headers == 0) {
424 level->headers = (LevelHeader**) malloc(2 * sizeof(LevelHeader*));
425 level->headers[0] = h;
426 level->headers[1] = 0;
427 } else {
428 int headerCount = Level3D_getHeaderCount(level);
429 for (int i = 0; i < headerCount; i++) {
430 LevelHeader* header = level->headers[i];
431 if (strcmp(header->name, h->name) == 0) {
432 header->value = h->value;
433 return;
434 } else {
435 level->headers = (LevelHeader**) realloc(level->headers, (headerCount + 1) * sizeof(LevelHeader*));
436 level->headers[headerCount] = h;
437 level->headers[headerCount + 1] = 0;
438 }
439 }
440 }
441}
442
449void Level3D_addHeader(Level3D* level, char* name, char* value) {
450 LevelHeader* h = (LevelHeader*) malloc(sizeof(LevelHeader));
451 h->name = name;
452 h->value = value;
453
454 Level3D_setHeader(level, h);
455}
456
462void Level3D_removeHeader(Level3D* level, char* name) {
463 if (level->headers == 0) return;
464
465 int i = 0;
466 while (level->headers[i] != 0) {
467 if (strcmp(level->headers[i]->name, name) == 0) {
468 free(level->headers[i]);
469
470 for (int j = i; j < sizeof(level->headers) - 1; j++) {
471 level->headers[j] = level->headers[j + 1];
472 }
473 level->headers[sizeof(level->headers) - 1] = 0;
474 return;
475 }
476 i++;
477 }
478}
479
486Block* Level3D_getBlock(Level3D* level, Coordinate3D* coordinate) {
487 if (level->blocks == 0) return 0;
488
489 int i = 0;
490 while (level->blocks[i] != 0) {
491 if (level->blocks[i]->coordinate->x == coordinate->x && level->blocks[i]->coordinate->y == coordinate->y && level->blocks[i]->coordinate->z == coordinate->z) {
492 return level->blocks[i]->block;
493 }
494 i++;
495 }
496
497 return 0;
498}
499
505int Level3D_getBlockCount(Level3D* level) {
506 int blockCount = 0;
507 while (level->blocks[blockCount] != NULL) {
508 blockCount++;
509 }
510
511 return blockCount;
512}
513
519void Level3D_addBlock(Level3D* level, LevelObject3D* block) {
520 if (level->blocks == 0) {
521 level->blocks = (LevelObject3D**) malloc(16 * sizeof(LevelObject3D*));
522 level->blocks[0] = block;
523 level->blocks[1] = 0;
524 } else {
525 int size = Level3D_getBlockCount(level);
526
527 for (int i = 0; i < size; i++) {
528 Coordinate3D* c = level->blocks[i]->coordinate;
529 if (c->x == block->coordinate->x && c->y == block->coordinate->y && c->z == block->coordinate->z) {
530 level->blocks[i] = block;
531 return;
532 }
533 }
534
535 level->blocks = (LevelObject3D**) realloc(level->blocks, (size + 2) * sizeof(LevelObject3D*));
536 level->blocks[size] = block;
537 level->blocks[size + 1] = 0;
538 }
539}
540
547void Level3D_addMatrix(Level3D* level, Block* block, CoordinateMatrix3D* matrix) {
548 int size = CoordinateMatrix3D_size(matrix);
549 Coordinate3D** coordinates = CoordinateMatrix3D_coordinates(matrix);
550 for (int i = 0; i < size; i++) {
551 Coordinate3D* coordinate = coordinates[i];
552 Level3D_addBlock(level, createLevelObject3D(block, coordinate));
553 }
554}
555
561void Level3D_removeBlock(Level3D* level, LevelObject3D* block) {
562 if (level->blocks == 0) return;
563
564 int i = 0;
565 while (level->blocks[i] != 0) {
566 if (level->blocks[i] == block) {
567 free(level->blocks[i]);
568
569 for (int j = i; j < sizeof(level->blocks) - 1; j++) {
570 level->blocks[j] = level->blocks[j + 1];
571 }
572 level->blocks[sizeof(level->blocks) - 1] = 0;
573 return;
574 }
575 i++;
576 }
577}
578
585int Level3D_blockCount(Level3D* level, const char* name) {
586 if (level == 0) return 0;
587 if (level->blocks == 0) return 0;
588 if (name == 0) return 0;
589
590 int count = 0;
591 for (int i = 0; i < Level3D_getBlockCount(level); i++) {
592 if (strcmp(level->blocks[i]->block->name, name) == 0) {
593 count++;
594 }
595 }
596
597 return count;
598}
599
600#endif
Definition block.h:30
char * name
Definition block.h:34
Definition coordinate.h:11
double y
Definition coordinate.h:20
double x
Definition coordinate.h:15
Definition coordinate.h:108
double x
Definition coordinate.h:112
double z
Definition coordinate.h:122
double y
Definition coordinate.h:117
Definition matrix.h:13
Definition matrix.h:154
Definition level.h:74
LevelObject2D ** blocks
Definition level.h:83
Coordinate2D * spawn
Definition level.h:88
LevelHeader ** headers
Definition level.h:78
Definition level.h:353
LevelObject3D ** blocks
Definition level.h:362
LevelHeader ** headers
Definition level.h:357
Coordinate3D * spawn
Definition level.h:367
Definition level.h:15
char * name
Definition level.h:19
char * value
Definition level.h:24
Definition block.h:241
Block * block
Definition block.h:246
Coordinate2D * coordinate
Definition block.h:251
Definition block.h:300
Block * block
Definition block.h:305
Coordinate3D * coordinate
Definition block.h:310