/* ************************************************************************** */ /* */ /* ::: :::::::: */ /* map_utils1.c :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: mcolonna +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/10/03 15:02:09 by mc #+# #+# */ /* Updated: 2024/10/15 17:43:29 by mcolonna ### ########.fr */ /* */ /* ************************************************************************** */ #include "map_utils.h" #include "map.h" #include "map_mapping.h" #include 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); read_expected_string(" ", stream, &err); read_unsigned(&rgb[0], stream, &err); read_expected_string(",", stream, &err); read_unsigned(&rgb[1], stream, &err); read_expected_string(",", stream, &err); read_unsigned(&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); read_expected_string(" ", stream, &err); 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); } void reset_map(t_map *dest) { dest->cases = NULL; dest->color_ceiling = 0xFF000000; dest->color_floor = 0xFF000000; dest->texture_east = NULL; dest->texture_west = NULL; dest->texture_north = NULL; dest->texture_south = NULL; } bool read_map(t_map *dest, t_stream *stream) { bool err; bool rdf; reset_map(dest); err = false; rdf = false; while (!rdf && !err && stream->str[stream->i]) { if ((read_expected_string("\n", stream, &err), err) && !read_string_parameter("NO", &dest->texture_north, stream, &rdf) && !read_string_parameter("SO", &dest->texture_south, stream, &rdf) && !read_string_parameter("WE", &dest->texture_west, stream, &rdf) && !read_string_parameter("EA", &dest->texture_east, stream, &rdf) && !read_color_parameter("F", &dest->color_floor, stream, &rdf) && !read_color_parameter("C", &dest->color_ceiling, stream, &rdf)) { err = !read_map_description(dest, stream); break ; } err = false; } if (!rdf && !dest->cases) err = (write_err("Map description missing\n", NULL), true); (rdf || err) && (map_destroy(dest), false); return (!err && !rdf && dest->cases); } void map_init_objects(t_map *map) { t_point_int pos; int i; pos.x = 0; while (pos.x < (int)map->width) { pos.y = 0; while (pos.y < (int)map->height) { i = pos.y * map->width + pos.x; if (map->cases[i].object.init) map->cases[i].object.init(&map->cases[i].object.data, pos); pos.y++; } pos.x++; } }