42_so_long/src/room/pathfinding_utils.c

80 lines
2.6 KiB
C

/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* pathfinding_utils.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: mcolonna <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2024/04/15 17:35:13 by mcolonna #+# #+# */
/* Updated: 2024/04/18 16:05:23 by mcolonna ### ########.fr */
/* */
/* ************************************************************************** */
#include "includes.h"
#include "pathfinding_utils.h"
void path_map_case_init(t_point p, void **el, void *args_p)
{
const t_path_map_case_init_args *args = (t_path_map_case_init_args *)args_p;
const t_room room = g_env.room;
const t_object *obj = room.objects[p.y * room.width + p.x];
const t_sprite *surface
= &room.surfaces[p.y * room.width + p.x];
const t_path_map_case r = {
to_check: false,
before: point_init(-1, -1),
solid: p.x == 0 || p.x == room.width - 1 || p.y == 0
|| p.y == room.height - 1 || (
obj && (
(args->for_firsk && obj->type.solid_firsk)
|| (!args->for_firsk && obj->type.solid_snas)
))
|| (args->for_firsk && surface->meta->first_frame == BRIDGE)
};
*el = mem_alloc(error_err, args->mc, sizeof(r));
**(t_path_map_case **)el = r;
}
t_path_map init_map(t_memclass mc, bool for_firsk)
{
t_path_map r;
t_path_map_case_init_args args;
r.dim.x = g_env.room.width;
r.dim.y = g_env.room.height;
r = map_init(mc, point_init(g_env.room.width, g_env.room.height));
args.mc = mc;
args.for_firsk = for_firsk;
map_foreach(&r, path_map_case_init, &args);
return (r);
}
t_tochecklist inittochecklist(t_memclass mc, t_point dim, t_point first)
{
t_tochecklist r;
int i;
r.cases = map_init(mc, dim);
i = -1;
while (++i < dim.x * dim.y)
{
r.cases.cases[i] = mem_alloc(error_err, mc, sizeof(t_point));
*((t_point *)r.cases.cases[i]) = point_init(-1, -1);
}
r.last = first;
r.current = first;
return (r);
}
void addtocheck(t_tochecklist *tocheck, t_point p)
{
*(t_point *)*map_at(&tocheck->cases, tocheck->last) = p;
tocheck->last = p;
}
t_point nexttocheck(t_tochecklist *tocheck)
{
tocheck->current = *(t_point *)*map_at(&tocheck->cases, tocheck->current);
return (tocheck->current);
}