/* ************************************************************************** */ /* */ /* ::: :::::::: */ /* move_utils.c :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: mcolonna +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/11/13 21:42:57 by mcolonna #+# #+# */ /* Updated: 2024/11/13 21:46:49 by mcolonna ### ########.fr */ /* */ /* ************************************************************************** */ #include "move_utils.h" #include "utils.h" #include "map.h" #include "global.h" #include "const.h" static void move_in_direction(t_point_double *pos, t_direction dir, double value) { if (dir == NORTH) pos->y -= value; else if (dir == SOUTH) pos->y += value; else if (dir == EAST) pos->x -= value; else if (dir == WEST) pos->x += value; } static void push_from_wall(int cx, int cy) { const t_point_double p = g_map.player.pos; double distance_with_side[4]; t_direction d; t_direction d_min; const t_point_double c_d = {cx, cy}; if (map_get_case(&g_map, cx, cy)->wall == EMPTY) return ; if (p.x > c_d.x - HITBOX && p.x < c_d.x + 1 + HITBOX && p.y > c_d.y - HITBOX && p.y < c_d.y + 1 + HITBOX) { distance_with_side[NORTH] = p.y - (c_d.y - HITBOX); distance_with_side[SOUTH] = (c_d.y + 1 + HITBOX) - p.y; distance_with_side[EAST] = p.x - (c_d.x - HITBOX); distance_with_side[WEST] = (c_d.x + 1 + HITBOX) - p.x; d_min = 0; d = 0; while (++d < 4) if (distance_with_side[d] < distance_with_side[d_min]) d_min = d; move_in_direction(&g_map.player.pos, d_min, distance_with_side[d_min]); } } void push_from_walls(void) { t_point_int p; p.x = (int)g_map.player.pos.x; p.y = (int)g_map.player.pos.y; push_from_wall(p.x - 1, p.y); push_from_wall(p.x + 1, p.y); push_from_wall(p.x, p.y - 1); push_from_wall(p.x, p.y + 1); push_from_wall(p.x - 1, p.y - 1); push_from_wall(p.x - 1, p.y + 1); push_from_wall(p.x + 1, p.y - 1); push_from_wall(p.x + 1, p.y + 1); }