42_cub3d/src/map_utils1.c
mcolonna 424b9aa7b2 fixings and improvements
dev:
- add documentation
- main() is more readable

fix:
- unmanaged errors:
  - map parsing: error if color value is >255
  - map parsing: load_textures(): check return value of xml_xpm_file_to_image()
  - main.c: draw_screen(): check return value of mlx_new_image()

other details:
- dev: color_from_rgb(): change signature
- fix: nullize map in map_destroy
- change: change error message for read_all_text() errors
- change: change rotation speed
- change: add and use contant NOOBONUS_SPEED
2024-11-21 15:25:36 +01:00

139 lines
3.9 KiB
C

/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* map_utils1.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: mcolonna <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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);
}