fix: can't open room if exit "blocked" by ketchup

This commit is contained in:
mcolonna 2024-04-18 16:07:35 +02:00
parent fb966caa48
commit 0e745f82b3
11 changed files with 39 additions and 29 deletions

View file

@ -6,7 +6,7 @@
/* By: mcolonna <marvin@42.fr> +#+ +:+ +#+ */ /* By: mcolonna <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2024/03/15 14:58:25 by mcolonna #+# #+# */ /* Created: 2024/03/15 14:58:25 by mcolonna #+# #+# */
/* Updated: 2024/04/15 17:42:06 by mcolonna ### ########.fr */ /* Updated: 2024/04/18 15:56:04 by mcolonna ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
@ -21,7 +21,8 @@ typedef t_object (*t_object_init)(t_memclass);
typedef struct s_objecttype typedef struct s_objecttype
{ {
t_object_init init; t_object_init init;
bool solid; bool solid_snas;
bool solid_firsk;
t_point (*loop)(t_object *, t_point pos); t_point (*loop)(t_object *, t_point pos);
void (*draw)(t_object *, t_point p); void (*draw)(t_object *, t_point p);
// Called when a character want to walk through this object. // Called when a character want to walk through this object.

View file

@ -6,7 +6,7 @@
/* By: mcolonna <marvin@42.fr> +#+ +:+ +#+ */ /* By: mcolonna <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2024/04/10 18:13:05 by mcolonna #+# #+# */ /* Created: 2024/04/10 18:13:05 by mcolonna #+# #+# */
/* Updated: 2024/04/18 13:50:36 by mcolonna ### ########.fr */ /* Updated: 2024/04/18 16:03:39 by mcolonna ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
@ -15,6 +15,6 @@
# include "includes.h" # include "includes.h"
t_direction pathfinding(t_point start, t_point finish, bool solid_bridge); t_direction pathfinding(t_point start, t_point finish, bool for_firsk);
#endif #endif

View file

@ -1,12 +1,12 @@
1111111111 1111111111
1PB0000FC1 1PB0000FC1
10B0000001 10B0000C01
10B00000C1 10B00000C1
10B0000001 10B0000C01
10B00000C1 10B00000C1
10B0000001 10B0000C01
10B00000C1 10B00000C1
10B0000001 10B0000C01
11111111B1 11111111B1
1E00000001 1E00000001
1111111111 1111111111

View file

@ -6,7 +6,7 @@
/* By: mcolonna <marvin@42.fr> +#+ +:+ +#+ */ /* By: mcolonna <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2024/04/08 15:01:16 by mcolonna #+# #+# */ /* Created: 2024/04/08 15:01:16 by mcolonna #+# #+# */
/* Updated: 2024/04/15 17:43:20 by mcolonna ### ########.fr */ /* Updated: 2024/04/18 15:56:50 by mcolonna ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
@ -47,7 +47,8 @@ static bool exit_walk_through(
t_object exit_init(t_memclass mc) t_object exit_init(t_memclass mc)
{ {
static const t_objecttype type static const t_objecttype type
= {solid: true, init: exit_init, loop: exit_loop, draw: exit_draw, = {solid_firsk: true, solid_snas: true,
init: exit_init, loop: exit_loop, draw: exit_draw,
walk_through: exit_walk_through}; walk_through: exit_walk_through};
t_object r; t_object r;
t_exit_data *data; t_exit_data *data;

View file

@ -6,7 +6,7 @@
/* By: mcolonna <marvin@42.fr> +#+ +:+ +#+ */ /* By: mcolonna <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2024/04/11 13:55:04 by mcolonna #+# #+# */ /* Created: 2024/04/11 13:55:04 by mcolonna #+# #+# */
/* Updated: 2024/04/18 13:51:12 by mcolonna ### ########.fr */ /* Updated: 2024/04/18 15:57:21 by mcolonna ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
@ -36,7 +36,8 @@ static void firsk_draw(t_object *obj, t_point p)
t_object firsk_init(t_memclass mc) t_object firsk_init(t_memclass mc)
{ {
static const t_objecttype type static const t_objecttype type
= {init: firsk_init, loop: firsk_loop, draw: firsk_draw, = {solid_firsk: false, solid_snas: false,
init: firsk_init, loop: firsk_loop, draw: firsk_draw,
walk_through: NULL}; walk_through: NULL};
static const t_character_sprites sprites = { static const t_character_sprites sprites = {
still: SPR_FIRSK, still: SPR_FIRSK,

View file

@ -6,7 +6,7 @@
/* By: mcolonna <marvin@42.fr> +#+ +:+ +#+ */ /* By: mcolonna <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2024/03/15 15:27:03 by mcolonna #+# #+# */ /* Created: 2024/03/15 15:27:03 by mcolonna #+# #+# */
/* Updated: 2024/04/15 19:53:54 by mcolonna ### ########.fr */ /* Updated: 2024/04/18 15:57:45 by mcolonna ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
@ -38,7 +38,8 @@ t_object ketchup_init(t_memclass mc)
{ {
static const t_objecttype type static const t_objecttype type
= { = {
solid: true, solid_firsk: true,
solid_snas: false,
init: ketchup_init, init: ketchup_init,
loop: ketchup_loop, loop: ketchup_loop,
draw: ketchup_draw, draw: ketchup_draw,

View file

@ -6,7 +6,7 @@
/* By: mcolonna <marvin@42.fr> +#+ +:+ +#+ */ /* By: mcolonna <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2024/03/15 15:27:03 by mcolonna #+# #+# */ /* Created: 2024/03/15 15:27:03 by mcolonna #+# #+# */
/* Updated: 2024/04/17 16:20:51 by mcolonna ### ########.fr */ /* Updated: 2024/04/18 15:58:11 by mcolonna ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
@ -54,7 +54,8 @@ static void snas_draw(t_object *obj, t_point p)
t_object snas_init(t_memclass mc) t_object snas_init(t_memclass mc)
{ {
static const t_objecttype type static const t_objecttype type
= {solid: false, init: snas_init, loop: snas_loop, draw: snas_draw, = {solid_firsk: false, solid_snas: false,
init: snas_init, loop: snas_loop, draw: snas_draw,
walk_through: snas_walk_through}; walk_through: snas_walk_through};
static const t_character_sprites sprites = { static const t_character_sprites sprites = {
still: SPR_SNAS, still: SPR_SNAS,

View file

@ -6,7 +6,7 @@
/* By: mcolonna <marvin@42.fr> +#+ +:+ +#+ */ /* By: mcolonna <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2024/03/15 15:27:03 by mcolonna #+# #+# */ /* Created: 2024/03/15 15:27:03 by mcolonna #+# #+# */
/* Updated: 2024/04/15 17:44:49 by mcolonna ### ########.fr */ /* Updated: 2024/04/18 15:58:27 by mcolonna ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
@ -27,7 +27,8 @@ static void wall_draw(t_object *obj, t_point p)
t_object wall_init(t_memclass mc) t_object wall_init(t_memclass mc)
{ {
static const t_objecttype type static const t_objecttype type
= {solid: true, init: wall_init, loop: wall_loop, draw: wall_draw, = {solid_firsk: true, solid_snas: true,
init: wall_init, loop: wall_loop, draw: wall_draw,
walk_through: NULL}; walk_through: NULL};
t_object r; t_object r;
t_wall_data *data; t_wall_data *data;

View file

@ -6,7 +6,7 @@
/* By: mcolonna <marvin@42.fr> +#+ +:+ +#+ */ /* By: mcolonna <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2024/04/10 18:19:19 by mcolonna #+# #+# */ /* Created: 2024/04/10 18:19:19 by mcolonna #+# #+# */
/* Updated: 2024/04/18 14:00:51 by mcolonna ### ########.fr */ /* Updated: 2024/04/18 16:03:05 by mcolonna ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
@ -63,7 +63,7 @@ static t_direction pathfinding_checkdirections(
return (NO_DIRECTION); return (NO_DIRECTION);
} }
t_direction pathfinding(t_point start, t_point finish, bool solid_bridge) t_direction pathfinding(t_point start, t_point finish, bool for_firsk)
{ {
const t_pathfinding_env env = { const t_pathfinding_env env = {
start: start, start: start,
@ -77,7 +77,7 @@ t_direction pathfinding(t_point start, t_point finish, bool solid_bridge)
if (start.x == finish.x && start.y == finish.y) if (start.x == finish.x && start.y == finish.y)
return (NO_DIRECTION); return (NO_DIRECTION);
map = init_map(env.mc, solid_bridge); map = init_map(env.mc, for_firsk);
tocheck = inittochecklist(env.mc, map.dim, start); tocheck = inittochecklist(env.mc, map.dim, start);
case_checking = start; case_checking = start;
while (case_checking.x != -1 || case_checking.y != -1) while (case_checking.x != -1 || case_checking.y != -1)

View file

@ -6,7 +6,7 @@
/* By: mcolonna <marvin@42.fr> +#+ +:+ +#+ */ /* By: mcolonna <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2024/04/15 17:35:13 by mcolonna #+# #+# */ /* Created: 2024/04/15 17:35:13 by mcolonna #+# #+# */
/* Updated: 2024/04/18 14:03:03 by mcolonna ### ########.fr */ /* Updated: 2024/04/18 16:05:23 by mcolonna ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
@ -24,15 +24,19 @@ void path_map_case_init(t_point p, void **el, void *args_p)
to_check: false, to_check: false,
before: point_init(-1, -1), before: point_init(-1, -1),
solid: p.x == 0 || p.x == room.width - 1 || p.y == 0 solid: p.x == 0 || p.x == room.width - 1 || p.y == 0
|| p.y == room.height - 1 || (obj && obj->type.solid) || p.y == room.height - 1 || (
|| (surface->meta->first_frame == BRIDGE && args->solid_bridge) 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)); *el = mem_alloc(error_err, args->mc, sizeof(r));
**(t_path_map_case **)el = r; **(t_path_map_case **)el = r;
} }
t_path_map init_map(t_memclass mc, bool solid_bridge) t_path_map init_map(t_memclass mc, bool for_firsk)
{ {
t_path_map r; t_path_map r;
t_path_map_case_init_args args; t_path_map_case_init_args args;
@ -41,7 +45,7 @@ t_path_map init_map(t_memclass mc, bool solid_bridge)
r.dim.y = g_env.room.height; r.dim.y = g_env.room.height;
r = map_init(mc, point_init(g_env.room.width, g_env.room.height)); r = map_init(mc, point_init(g_env.room.width, g_env.room.height));
args.mc = mc; args.mc = mc;
args.solid_bridge = solid_bridge; args.for_firsk = for_firsk;
map_foreach(&r, path_map_case_init, &args); map_foreach(&r, path_map_case_init, &args);
return (r); return (r);
} }

View file

@ -6,7 +6,7 @@
/* By: mcolonna <marvin@42.fr> +#+ +:+ +#+ */ /* By: mcolonna <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2024/04/10 18:21:55 by mcolonna #+# #+# */ /* Created: 2024/04/10 18:21:55 by mcolonna #+# #+# */
/* Updated: 2024/04/18 14:01:33 by mcolonna ### ########.fr */ /* Updated: 2024/04/18 16:03:22 by mcolonna ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
@ -37,13 +37,13 @@ typedef struct s_path_map_case
typedef struct s_path_map_case_init_args typedef struct s_path_map_case_init_args
{ {
t_memclass *mc; t_memclass *mc;
bool solid_bridge; bool for_firsk;
} t_path_map_case_init_args; } t_path_map_case_init_args;
typedef t_map t_path_map; typedef t_map t_path_map;
void path_map_case_init(t_point p, void **el, void *mc); void path_map_case_init(t_point p, void **el, void *mc);
t_path_map init_map(t_memclass mc, bool solid_bridge); t_path_map init_map(t_memclass mc, bool for_firsk);
t_tochecklist inittochecklist(t_memclass mc, t_point dim, t_point first); t_tochecklist inittochecklist(t_memclass mc, t_point dim, t_point first);
void addtocheck(t_tochecklist *tocheck, t_point p); void addtocheck(t_tochecklist *tocheck, t_point p);
t_point nexttocheck(t_tochecklist *tocheck); t_point nexttocheck(t_tochecklist *tocheck);