/* ************************************************************************** */ /* */ /* ::: :::::::: */ /* map_utils1.c :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: mcolonna +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/10/03 15:02:09 by mcolonna #+# #+# */ /* Updated: 2024/11/15 16:24:09 by mcolonna ### ########.fr */ /* */ /* ************************************************************************** */ #include "map_utils.h" bool read_color_parameter(const char *name, t_color *dest, t_stream *stream, bool *redefined) { unsigned int rgb[3]; bool err; t_stream old; old = *stream; err = false; read_expected_string(name, stream, &err); if (!read_blank(stream)) err = true; read_unsigned_max_255(&rgb[0], stream, &err); read_expected_string(",", stream, &err); read_unsigned_max_255(&rgb[1], stream, &err); read_expected_string(",", stream, &err); read_unsigned_max_255(&rgb[2], stream, &err); read_expected_string("\n", stream, &err); if (!err && *dest != 0xFF000000) { *redefined = true; write_err("Parameter '", name, "' was defined several times\n", NULL); } else if (!err) *dest = color_from_rgb(rgb[0], rgb[1], rgb[2]); else *stream = old; return (!err); } bool read_string_parameter(const char *name, const char **dest, t_stream *stream, bool *redefined) { char *r; bool err; t_stream old; old = *stream; err = false; r = NULL; read_expected_string(name, stream, &err); if (!read_blank(stream)) err = true; read_until('\n', &r, stream, &err); read_expected_string("\n", stream, &err); if (!err && *dest) { *redefined = true; write_err("Parameter '", name, "' was defined several times\n", NULL); } if (*redefined || err) { *stream = old; free(r); } else *dest = r; return (!err); } static void read_map2(t_map *dest, bool *err, bool *rdf) { ft_memset(dest, '\0', sizeof(t_map)); dest->color_ceiling = 0xFF000000; dest->color_floor = 0xFF000000; *err = false; *rdf = false; } bool read_map(t_map *d, t_stream *s) { bool err[2]; int old_stream_i; read_map2(d, &err[0], &err[1]); while (!err[1] && !err[0] && s->str[s->i]) { old_stream_i = s->i; if ((read_expected_string("\n", s, &err[0]), err[0]) && !read_string_parameter("NO", &d->texture_srcs[NORTH], s, &err[1]) && !read_string_parameter("SO", &d->texture_srcs[SOUTH], s, &err[1]) && !read_string_parameter("WE", &d->texture_srcs[WEST], s, &err[1]) && !read_string_parameter("EA", &d->texture_srcs[EAST], s, &err[1]) && !read_color_parameter("F", &d->color_floor, s, &err[1]) && !read_color_parameter("C", &d->color_ceiling, s, &err[1])) { s->i = old_stream_i; err[0] = !read_map_description(d, s); break ; } err[0] = false; } if (!err[1] && !d->cases) err[0] = (write_err("Map description missing\n", NULL), true); return ((!err[1] && !err[0] && d->cases && map_init_player(d)) || (map_destroy(d), false)); } bool map_init_player(t_map *map) { t_point_int pos; int i; map->player.pos.x = -1; pos.x = -1; while (++pos.x < (int)map->width) { pos.y = -1; while (++pos.y < (int)map->height) { i = pos.y * map->width + pos.x; if (map->cases[i].init_player) { if (map->player.pos.x == -1) map->cases[i].init_player(&map->player, pos); else return (write_err("Map has more than one player.\n", NULL), false); } } } if (map->player.pos.x == -1) return (write_err("Map has no player.\n", NULL), false); return (true); }