Mercurial > molko
diff librpg/rpg/map-file.c @ 210:70e6ed74940d
rpg: attempt of collide detection in map
author | David Demelier <markand@malikania.fr> |
---|---|
date | Sat, 14 Nov 2020 16:59:11 +0100 |
parents | 852d0b7817ce |
children | adcbb7ccfdee |
line wrap: on
line diff
--- a/librpg/rpg/map-file.c Wed Nov 11 17:10:40 2020 +0100 +++ b/librpg/rpg/map-file.c Sat Nov 14 16:59:11 2020 +0100 @@ -23,6 +23,7 @@ #include <limits.h> #include <stddef.h> #include <stdio.h> +#include <stdlib.h> #include <string.h> #include <core/alloc.h> @@ -42,6 +43,20 @@ char basedir[PATH_MAX]; /* Parent map directory */ }; +static int +tile_cmp(const void *d1, const void *d2) +{ + const struct map_tile *mt1 = d1; + const struct map_tile *mt2 = d2; + + if (mt1->id < mt2->id) + return -1; + if (mt1->id > mt2->id) + return 1; + + return 0; +} + static bool parse_layer(struct parser *ps, const char *line) { @@ -74,7 +89,7 @@ if (!(ps->mf->layers[layer_type].tiles = alloc_zero(amount, sizeof (unsigned short)))) return false; - for (int tile; fscanf(ps->fp, "%d", &tile) && current < amount; ++current) + for (int tile; fscanf(ps->fp, "%d\n", &tile) && current < amount; ++current) ps->mf->layers[layer_type].tiles[current] = tile; ps->map->layers[layer_type].tiles = ps->mf->layers[layer_type].tiles; @@ -179,6 +194,32 @@ } static bool +parse_tiles(struct parser *ps, const char *line) +{ + (void)line; + + short x, y; + unsigned short id, w, h; + struct map_tile *tiles = NULL; + size_t tilesz = 0; + + while (fscanf(ps->fp, "%hu|%hd|%hd|%hu|%hu\n", &id, &x, &y, &w, &h) == 5) { + tiles = allocator.realloc(tiles, ++tilesz * sizeof (*tiles)); + tiles[tilesz - 1].id = id; + tiles[tilesz - 1].x = x; + tiles[tilesz - 1].y = y; + tiles[tilesz - 1].w = w; + tiles[tilesz - 1].h = h; + } + + qsort(tiles, tilesz, sizeof (struct map_tile), tile_cmp); + ps->map->tiles = ps->mf->tiles = tiles; + ps->map->tilesz = tilesz; + + return true; +} + +static bool parse_line(struct parser *ps, const char *line) { static const struct { @@ -192,7 +233,8 @@ { "tileheight", parse_tileheight }, { "tileset", parse_tileset }, { "origin", parse_origin }, - { "layer", parse_layer } + { "layer", parse_layer }, + { "tiles", parse_tiles } }; for (size_t i = 0; i < NELEM(props); ++i) @@ -285,6 +327,7 @@ { assert(file); + free(file->tiles); texture_finish(&file->tileset); memset(file, 0, sizeof (*file)); }