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->headers = 0;
126 l->blocks = 0;
127 l->spawn = spawn;
128
129 return l;
130}
131
137int Level2D_getHeaderCount(Level2D* level) {
138 if (level == 0) return 0;
139
140 if (level->headers == 0) {
141 level->headers = (LevelHeader**) malloc(sizeof(LevelHeader*));
142 if (!level->headers) return 0;
143
144 level->headers[0] = 0;
145 return 0;
146 }
147
148 int headerCount = 0;
149 while (level->headers[headerCount] != 0) {
150 headerCount++;
151 }
152
153 return headerCount;
154}
155
162char* Level2D_getHeader(Level2D* level, char* name) {
163 if (level == 0) return 0;
164 if (name == 0) return 0;
165 if (level->headers == 0) return 0;
166
167 int i = 0;
168 while (level->headers[i] != 0) {
169 if (strcmp(level->headers[i]->name, name) == 0) {
170 return level->headers[i]->value;
171 }
172 i++;
173 }
174
175 return 0;
176}
177
183void Level2D_setHeader(Level2D* level, LevelHeader* h) {
184 if (level == 0) return;
185 if (h == 0) return;
186
187 if (level->headers == 0) {
188 level->headers = (LevelHeader**) malloc(2 * sizeof(LevelHeader*));
189 level->headers[0] = h;
190 level->headers[1] = 0;
191 } else {
192 int headerCount = Level2D_getHeaderCount(level);
193 for (int i = 0; i < headerCount; i++) {
194 LevelHeader* header = level->headers[i];
195 if (strcmp(header->name, h->name) == 0) {
196 header->value = h->value;
197 return;
198 } else {
199 level->headers = (LevelHeader**) realloc(level->headers, (headerCount + 2) * sizeof(LevelHeader*));
200 level->headers[headerCount] = h;
201 level->headers[headerCount + 1] = 0;
202 }
203 }
204 }
205}
206
213void Level2D_addHeader(Level2D* level, char* name, char* value) {
214 if (level == 0) return;
215 if (name == 0) return;
216 if (value == 0) return;
217
218 LevelHeader* h = (LevelHeader*) malloc(sizeof(LevelHeader));
219 h->name = name;
220 h->value = value;
221
222 Level2D_setHeader(level, h);
223}
224
230void Level2D_removeHeader(Level2D* level, char* name) {
231 if (level == 0) return;
232 if (name == 0) return;
233 if (level->headers == 0) return;
234
235 int i = 0;
236 while (level->headers[i] != 0) {
237 if (strcmp(level->headers[i]->name, name) == 0) {
238 free(level->headers[i]);
239
240 for (int j = i; j < sizeof(level->headers) - 1; j++) {
241 level->headers[j] = level->headers[j + 1];
242 }
243 level->headers[sizeof(level->headers) - 1] = 0;
244 return;
245 }
246 i++;
247 }
248}
249
255int Level2D_getBlockCount(Level2D* level) {
256 if (level == 0) return 0;
257
258 if (level->blocks == 0) {
259 level->blocks = (LevelObject2D**) malloc(2 * sizeof(LevelObject2D*));
260 level->blocks[0] = 0;
261 return 0;
262 }
263
264 int blockCount = 0;
265 while (level->blocks[blockCount] != 0) {
266 blockCount++;
267 }
268
269 return blockCount;
270}
271
278Block* Level2D_getBlock(Level2D* level, Coordinate2D* coordinate) {
279 if (level == 0) return 0;
280 if (coordinate == 0) return 0;
281 if (level->blocks == 0) return 0;
282
283 int i = 0;
284 while (level->blocks[i] != 0) {
285 if (level->blocks[i]->coordinate->x == coordinate->x && level->blocks[i]->coordinate->y == coordinate->y) {
286 return level->blocks[i]->block;
287 }
288 i++;
289 }
290
291 return 0;
292}
293
299void Level2D_addBlock(Level2D* level, LevelObject2D* block) {
300 if (level == 0) return;
301 if (block == 0) return;
302
303 if (level->blocks == 0) {
304 level->blocks = (LevelObject2D**) malloc(16 * sizeof(LevelObject2D*));
305 level->blocks[0] = block;
306 level->blocks[1] = 0;
307 } else {
308 int size = Level2D_getBlockCount(level);
309 for (int i = 0; i < size; i++) {
310 Coordinate2D* c = level->blocks[i]->coordinate;
311 if (c->x == block->coordinate->x && c->y == block->coordinate->y) {
312 level->blocks[i] = block;
313 return;
314 }
315 }
316
317 level->blocks = (LevelObject2D**) realloc(level->blocks, (size + 2) * sizeof(LevelObject2D*));
318 level->blocks[size] = block;
319 level->blocks[size + 1] = 0;
320 }
321}
322
329void Level2D_addMatrix(Level2D* level, Block* block, CoordinateMatrix2D* matrix) {
330 int size = CoordinateMatrix2D_size(matrix);
331 Coordinate2D** coordinates = CoordinateMatrix2D_coordinates(matrix);
332
333 for (int i = 0; i < size; i++) {
334 Coordinate2D* coordinate = coordinates[i];
335 Level2D_addBlock(level, createLevelObject2D(block, coordinate));
336 }
337
338}
339
345void Level2D_removeBlock(Level2D* level, LevelObject2D* block) {
346 if (level->blocks == 0) return;
347
348 int i = 0;
349 while (level->blocks[i] != 0) {
350 if (level->blocks[i] == block) {
351 free(level->blocks[i]);
352
353 for (int j = i; j < sizeof(level->blocks) - 1; j++) {
354 level->blocks[j] = level->blocks[j + 1];
355 }
356 level->blocks[sizeof(level->blocks) - 1] = 0;
357 return;
358 }
359 i++;
360 }
361}
362
369int Level2D_blockCount(Level2D* level, const char* name) {
370 if (level == 0) return 0;
371 if (level->blocks == 0) return 0;
372 if (name == 0) return 0;
373
374 int count = 0;
375 for (int i = 0; i < Level2D_getBlockCount(level); i++) {
376 if (strcmp(level->blocks[i]->block->name, name) == 0) {
377 count++;
378 }
379 }
380
381 return count;
382}
383
403
409Level3D* createLevel3D(Coordinate3D* spawn) {
410 Level3D* l = (Level3D*) malloc(sizeof(Level3D));
411 l->headers = 0;
412 l->blocks = 0;
413 l->spawn = spawn;
414
415 return l;
416}
417
423int Level3D_getHeaderCount(Level3D* level) {
424 if (level == 0) return 0;
425
426 if (level->headers == 0) {
427 level->headers = (LevelHeader**) malloc(sizeof(LevelHeader*));
428 if (!level->headers) return 0;
429
430 level->headers[0] = 0;
431 return 0;
432 }
433
434 int headerCount = 0;
435 while (level->headers[headerCount] != 0) {
436 headerCount++;
437 }
438
439 return headerCount;
440}
441
448char* Level3D_getHeader(Level3D* level, char* name) {
449 if (level == 0) return 0;
450 if (name == 0) return 0;
451 if (level->headers == 0) return 0;
452
453 int i = 0;
454 while (level->headers[i] != 0) {
455 if (strcmp(level->headers[i]->name, name) == 0) {
456 return level->headers[i]->value;
457 }
458 i++;
459 }
460
461 return 0;
462}
463
469void Level3D_setHeader(Level3D* level, LevelHeader* h) {
470 if (level == 0) return;
471 if (h == 0) return;
472
473 if (level->headers == 0) {
474 level->headers = (LevelHeader**) malloc(2 * sizeof(LevelHeader*));
475 level->headers[0] = h;
476 level->headers[1] = 0;
477 } else {
478 int headerCount = Level3D_getHeaderCount(level);
479 for (int i = 0; i < headerCount; i++) {
480 LevelHeader* header = level->headers[i];
481 if (strcmp(header->name, h->name) == 0) {
482 header->value = h->value;
483 return;
484 } else {
485 level->headers = (LevelHeader**) realloc(level->headers, (headerCount + 1) * sizeof(LevelHeader*));
486 level->headers[headerCount] = h;
487 level->headers[headerCount + 1] = 0;
488 }
489 }
490 }
491}
492
499void Level3D_addHeader(Level3D* level, char* name, char* value) {
500 if (level == 0) return;
501 if (name == 0) return;
502 if (value == 0) return;
503
504 LevelHeader* h = (LevelHeader*) malloc(sizeof(LevelHeader));
505 h->name = name;
506 h->value = value;
507
508 Level3D_setHeader(level, h);
509}
510
516void Level3D_removeHeader(Level3D* level, char* name) {
517 if (level == 0) return;
518 if (name == 0) return;
519 if (level->headers == 0) return;
520
521 int i = 0;
522 while (level->headers[i] != 0) {
523 if (strcmp(level->headers[i]->name, name) == 0) {
524 free(level->headers[i]);
525
526 for (int j = i; j < sizeof(level->headers) - 1; j++) {
527 level->headers[j] = level->headers[j + 1];
528 }
529 level->headers[sizeof(level->headers) - 1] = 0;
530 return;
531 }
532 i++;
533 }
534}
535
542Block* Level3D_getBlock(Level3D* level, Coordinate3D* coordinate) {
543 if (level->blocks == 0) return 0;
544
545 int i = 0;
546 while (level->blocks[i] != 0) {
547 if (level->blocks[i]->coordinate->x == coordinate->x && level->blocks[i]->coordinate->y == coordinate->y && level->blocks[i]->coordinate->z == coordinate->z) {
548 return level->blocks[i]->block;
549 }
550 i++;
551 }
552
553 return 0;
554}
555
561int Level3D_getBlockCount(Level3D* level) {
562 int blockCount = 0;
563 while (level->blocks[blockCount] != 0) {
564 blockCount++;
565 }
566
567 return blockCount;
568}
569
575void Level3D_addBlock(Level3D* level, LevelObject3D* block) {
576 if (level->blocks == 0) {
577 level->blocks = (LevelObject3D**) malloc(16 * sizeof(LevelObject3D*));
578 level->blocks[0] = block;
579 level->blocks[1] = 0;
580 } else {
581 int size = Level3D_getBlockCount(level);
582
583 for (int i = 0; i < size; i++) {
584 Coordinate3D* c = level->blocks[i]->coordinate;
585 if (c->x == block->coordinate->x && c->y == block->coordinate->y && c->z == block->coordinate->z) {
586 level->blocks[i] = block;
587 return;
588 }
589 }
590
591 level->blocks = (LevelObject3D**) realloc(level->blocks, (size + 2) * sizeof(LevelObject3D*));
592 level->blocks[size] = block;
593 level->blocks[size + 1] = 0;
594 }
595}
596
603void Level3D_addMatrix(Level3D* level, Block* block, CoordinateMatrix3D* matrix) {
604 int size = CoordinateMatrix3D_size(matrix);
605 Coordinate3D** coordinates = CoordinateMatrix3D_coordinates(matrix);
606 for (int i = 0; i < size; i++) {
607 Coordinate3D* coordinate = coordinates[i];
608 Level3D_addBlock(level, createLevelObject3D(block, coordinate));
609 }
610}
611
617void Level3D_removeBlock(Level3D* level, LevelObject3D* block) {
618 if (level->blocks == 0) return;
619
620 int i = 0;
621 while (level->blocks[i] != 0) {
622 if (level->blocks[i] == block) {
623 free(level->blocks[i]);
624
625 for (int j = i; j < sizeof(level->blocks) - 1; j++) {
626 level->blocks[j] = level->blocks[j + 1];
627 }
628 level->blocks[sizeof(level->blocks) - 1] = 0;
629 return;
630 }
631 i++;
632 }
633}
634
641int Level3D_blockCount(Level3D* level, const char* name) {
642 if (level == 0) return 0;
643 if (level->blocks == 0) return 0;
644 if (name == 0) return 0;
645
646 int count = 0;
647 for (int i = 0; i < Level3D_getBlockCount(level); i++) {
648 if (strcmp(level->blocks[i]->block->name, name) == 0) {
649 count++;
650 }
651 }
652
653 return count;
654}
655
656#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:387
LevelObject3D ** blocks
Definition level.h:396
LevelHeader ** headers
Definition level.h:391
Coordinate3D * spawn
Definition level.h:401
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