Compare commits

...

1 Commits

Author SHA1 Message Date
Quinten Mennen
84a3dd8d36 Organizational purposes 2025-06-12 17:10:10 +02:00
109 changed files with 946 additions and 632 deletions

View File

@ -15,7 +15,10 @@
"game_menu.h": "c",
"game_manager.h": "c",
"collision.h": "c",
"monster.h": "c"
"monster.h": "c",
"shaders.h": "c",
"hooks.h": "c",
"player.h": "c"
},
"cmake.ignoreCMakeListsMissing": true
}

View File

@ -6,7 +6,7 @@
/* By: qmennen <qmennen@student.codam.nl> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2025/04/15 12:22:29 by qmennen #+# #+# */
/* Updated: 2025/06/11 20:32:00 by qmennen ### ########.fr */
/* Updated: 2025/06/12 13:29:23 by qmennen ### ########.fr */
/* */
/* ************************************************************************** */
@ -77,11 +77,9 @@
# include "game_manager.h"
# include "game_menu.h"
# include "monster.h"
# include "shaders.h"
int initialize_cub3d(t_game **game, const char *mapfile);
int shader_init(void);
void set_uniforms(t_game *game);
int load_uniforms(t_game **game);
void count_scores(t_game *game);
int count_tiles(t_map *map, t_tile tile_type);

View File

@ -6,7 +6,7 @@
/* By: qmennen <qmennen@student.codam.nl> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2025/04/15 15:46:16 by qmennen #+# #+# */
/* Updated: 2025/06/03 15:54:12 by qmennen ### ########.fr */
/* Updated: 2025/06/12 14:01:38 by qmennen ### ########.fr */
/* */
/* ************************************************************************** */
@ -22,8 +22,9 @@ void game_terminate(t_game *game);
void free_game(t_game **game);
void print_scores(t_game *game);
void game_run(t_game *game);
void handle_battery(t_game *game);
void handle_record(t_game *game);
void hud_update_battery(t_game *game);
void hud_draw_record(t_game *game);
void handle_flash(t_sprite *sprite, t_game *game);
void hud_draw_battery(mlx_image_t *img, float battery);
#endif

View File

@ -6,7 +6,7 @@
/* By: qmennen <qmennen@student.codam.nl> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2025/05/27 13:40:20 by qmennen #+# #+# */
/* Updated: 2025/06/11 15:00:14 by qmennen ### ########.fr */
/* Updated: 2025/06/12 14:08:47 by qmennen ### ########.fr */
/* */
/* ************************************************************************** */
@ -18,8 +18,7 @@
t_game_manager *game_manager_create(t_game *game, int state);
void game_manager_display(t_game_manager *manager);
void game_manager_update(void *param);
void game_manager_select(t_game_manager *manager);
void game_manager_handle_input(t_game_manager *manager);
void game_manager_destroy(void *param);
void game_manager_handle_input(t_game_manager *manager);
#endif

View File

@ -1,12 +1,12 @@
/* ************************************************************************** */
/* */
/* :::::::: */
/* game_menu.h :+: :+: */
/* +:+ */
/* By: qmennen <qmennen@student.codam.nl> +#+ */
/* +#+ */
/* Created: 2025/05/27 15:07:48 by qmennen #+# #+# */
/* Updated: 2025/06/10 19:30:12 by whaffman ######## odam.nl */
/* ::: :::::::: */
/* game_menu.h :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: qmennen <qmennen@student.codam.nl> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2025/05/27 15:07:48 by qmennen #+# #+# */
/* Updated: 2025/06/12 14:13:33 by qmennen ### ########.fr */
/* */
/* ************************************************************************** */
@ -17,9 +17,8 @@
void menu_display(t_menu *menu, t_screen *screen);
void draw_end_screen(t_game_manager *manager, t_menu *menu);
t_menu *create_end_screen(t_game_manager *manager);
mlx_image_t *menu_load_background(mlx_t *mlx, char *background_path);
void menu_set_background(t_menu *menu, mlx_t *mlx, char *b_path);
t_menu *create_end_screen(t_game_manager *manager);
t_menu *create_main_menu(t_game_manager *manager);
t_menu *menu_create(t_game_manager *manager, char *b_path,
const t_menu_item *options[]);

View File

@ -1,12 +1,12 @@
/* ************************************************************************** */
/* */
/* :::::::: */
/* hooks.h :+: :+: */
/* +:+ */
/* By: qmennen <qmennen@student.codam.nl> +#+ */
/* +#+ */
/* Created: 2025/04/15 17:51:44 by qmennen #+# #+# */
/* Updated: 2025/06/04 16:42:43 by whaffman ######## odam.nl */
/* ::: :::::::: */
/* hooks.h :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: qmennen <qmennen@student.codam.nl> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2025/04/15 17:51:44 by qmennen #+# #+# */
/* Updated: 2025/06/12 13:45:28 by qmennen ### ########.fr */
/* */
/* ************************************************************************** */
@ -15,7 +15,7 @@
# include "cub3d.h"
void keyhandle(mlx_key_data_t keydata, void *param);
void hook_keyboard(mlx_key_data_t keydata, void *param);
void handle_mouse(t_game *game);
#endif

View File

@ -6,7 +6,7 @@
/* By: qmennen <qmennen@student.codam.nl> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2025/05/28 17:16:29 by qmennen #+# #+# */
/* Updated: 2025/05/28 17:16:43 by qmennen ### ########.fr */
/* Updated: 2025/06/12 14:14:52 by qmennen ### ########.fr */
/* */
/* ************************************************************************** */
@ -15,6 +15,6 @@
# include "cub3d.h"
void update_monsters(t_game *game);
void monster_update(t_game *game);
#endif

View File

@ -1,12 +1,12 @@
/* ************************************************************************** */
/* */
/* :::::::: */
/* player.h :+: :+: */
/* +:+ */
/* By: qmennen <qmennen@student.codam.nl> +#+ */
/* +#+ */
/* Created: 2025/04/15 18:53:27 by qmennen #+# #+# */
/* Updated: 2025/06/10 19:29:24 by whaffman ######## odam.nl */
/* ::: :::::::: */
/* player.h :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: qmennen <qmennen@student.codam.nl> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2025/04/15 18:53:27 by qmennen #+# #+# */
/* Updated: 2025/06/12 14:01:23 by qmennen ### ########.fr */
/* */
/* ************************************************************************** */
@ -17,8 +17,9 @@
int player_create(t_game **game);
void player_update(t_game *game, double delta_time);
void visit_area(t_game *game);
void rotate(t_player *player, double rot_speed, double delta);
void player_move(t_map *map, t_player *player, int dir, double delta);
void player_rotate(t_player *player, double rot_speed, double delta);
void player_strafe(t_map *map, t_player *player, int dir, double delta);
void interact_door(t_game *game);
#endif

View File

@ -6,7 +6,7 @@
/* By: qmennen <qmennen@student.codam.nl> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2025/04/15 15:30:34 by qmennen #+# #+# */
/* Updated: 2025/06/03 19:44:17 by qmennen ### ########.fr */
/* Updated: 2025/06/12 13:24:29 by qmennen ### ########.fr */
/* */
/* ************************************************************************** */
@ -18,5 +18,6 @@
int screen_create(t_game **game);
int screen_display(t_screen *screen);
void fill_background(mlx_image_t *image, int color);
int screen_center(t_screen *screen);
#endif

25
inc/shaders.h Normal file
View File

@ -0,0 +1,25 @@
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* shaders.h :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: qmennen <qmennen@student.codam.nl> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2025/06/12 13:28:42 by qmennen #+# #+# */
/* Updated: 2025/06/12 13:40:35 by qmennen ### ########.fr */
/* */
/* ************************************************************************** */
#ifndef SHADERS_H
# define SHADERS_H
# include "cub3d.h"
# include "glad.h"
# include "MLX42_Int.h"
int shader_init(void);
int shader_load_uniforms(t_game **game);
void shader_set_uniforms(t_game *game);
const char *shader_read_glsl(const char *target);
#endif

View File

@ -6,7 +6,7 @@
/* By: qmennen <qmennen@student.codam.nl> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2025/05/06 15:46:20 by qmennen #+# #+# */
/* Updated: 2025/05/06 15:59:52 by qmennen ### ########.fr */
/* Updated: 2025/06/12 13:43:38 by qmennen ### ########.fr */
/* */
/* ************************************************************************** */
@ -15,6 +15,7 @@
# include "cub3d.h"
int texture_load(t_game *game);
int texture_load(t_game *game);
void texture_delete(t_game *game);
#endif

View File

@ -0,0 +1,22 @@
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* hook_keyboard.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: qmennen <qmennen@student.codam.nl> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2025/06/12 13:44:48 by qmennen #+# #+# */
/* Updated: 2025/06/12 13:46:46 by qmennen ### ########.fr */
/* */
/* ************************************************************************** */
#include "hooks.h"
void hook_keyboard(mlx_key_data_t keydata, void *param)
{
t_game_manager *manager;
manager = (t_game_manager *)param;
if (keydata.key == MLX_KEY_ESCAPE)
game_manager_destroy(manager);
}

View File

@ -1,26 +1,17 @@
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* hooks.c :+: :+: :+: */
/* hook_mouse.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: qmennen <qmennen@student.codam.nl> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2025/04/15 17:51:26 by qmennen #+# #+# */
/* Updated: 2025/06/10 15:48:10 by qmennen ### ########.fr */
/* Created: 2025/06/12 13:45:46 by qmennen #+# #+# */
/* Updated: 2025/06/12 16:06:12 by qmennen ### ########.fr */
/* */
/* ************************************************************************** */
#include "hooks.h"
void keyhandle(mlx_key_data_t keydata, void *param)
{
t_game_manager *manager;
manager = (t_game_manager *)param;
if (keydata.key == MLX_KEY_ESCAPE)
game_manager_destroy(manager);
}
void handle_mouse(t_game *game)
{
t_vec2_int mouse_pos;
@ -29,6 +20,7 @@ void handle_mouse(t_game *game)
mlx = game->screen->mlx;
mlx_set_cursor_mode(mlx, MLX_MOUSE_HIDDEN);
mlx_get_mouse_pos(mlx, &mouse_pos.x, &mouse_pos.y);
rotate(game->player, 0.1 * (mouse_pos.x - mlx->width / 2), mlx->delta_time);
player_rotate(game->player, 0.1 * (mouse_pos.x - mlx->width / 2),
mlx->delta_time);
mlx_set_mouse_pos(mlx, mlx->width / 2, mlx->height / 2);
}

View File

@ -0,0 +1,28 @@
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* screen_center.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: qmennen <qmennen@student.codam.nl> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2025/06/12 13:23:39 by qmennen #+# #+# */
/* Updated: 2025/06/12 13:32:59 by qmennen ### ########.fr */
/* */
/* ************************************************************************** */
#include "screen.h"
int screen_center(t_screen *screen)
{
int m_width;
int m_height;
m_width = 0;
m_height = 0;
mlx_get_monitor_size(0, &m_width, &m_height);
if (m_width == 0 || m_height == 0)
return (FAILURE);
mlx_set_window_pos(screen->mlx, (m_width - screen->width) / 2,
(m_height - screen->height) / 2);
return (SUCCESS);
}

View File

@ -6,7 +6,7 @@
/* By: qmennen <qmennen@student.codam.nl> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2025/04/15 15:30:27 by qmennen #+# #+# */
/* Updated: 2025/06/10 14:41:07 by qmennen ### ########.fr */
/* Updated: 2025/06/12 13:27:08 by qmennen ### ########.fr */
/* */
/* ************************************************************************** */
@ -40,60 +40,3 @@ int screen_create(t_game **game)
(*game)->screen = screen;
return (SUCCESS);
}
void fill_background(mlx_image_t *image, int color)
{
unsigned int i;
unsigned int j;
i = 0;
while (i < image->width)
{
j = 0;
while (j < image->height)
{
mlx_put_pixel(image, i, j, color);
j++;
}
i++;
}
}
int center_window(t_screen *screen)
{
int m_width;
int m_height;
m_width = 0;
m_height = 0;
mlx_get_monitor_size(0, &m_width, &m_height);
if (m_width == 0 || m_height == 0)
return (FAILURE);
mlx_set_window_pos(screen->mlx, (m_width - screen->width) / 2,
(m_height - screen->height) / 2);
return (SUCCESS);
}
int screen_display(t_screen *screen)
{
int display_error;
fill_background(screen->background, 0x000000FF);
display_error = 0;
display_error |= mlx_image_to_window(screen->mlx,
screen->background, 0, 0) < 0;
display_error |= mlx_image_to_window(screen->mlx,
screen->img, 0, 0) < 0;
display_error |= mlx_image_to_window(screen->mlx,
screen->minimap, 175, 575) < 0;
display_error |= mlx_image_to_window(screen->mlx,
screen->hud, 0, 0) < 0;
if (display_error || !center_window(screen))
{
printf(RED "Display failed to initialize\n" RESET);
return (FAILURE);
}
screen->hud->instances[0].enabled = false;
screen->minimap->instances[0].enabled = false;
return (SUCCESS);
}

View File

@ -0,0 +1,37 @@
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* screen_display.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: qmennen <qmennen@student.codam.nl> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2025/06/12 13:25:50 by qmennen #+# #+# */
/* Updated: 2025/06/12 13:33:46 by qmennen ### ########.fr */
/* */
/* ************************************************************************** */
#include "screen.h"
int screen_display(t_screen *screen)
{
int display_error;
fill_background(screen->background, 0x000000FF);
display_error = 0;
display_error |= mlx_image_to_window(screen->mlx,
screen->background, 0, 0) < 0;
display_error |= mlx_image_to_window(screen->mlx,
screen->img, 0, 0) < 0;
display_error |= mlx_image_to_window(screen->mlx,
screen->minimap, 175, 575) < 0;
display_error |= mlx_image_to_window(screen->mlx,
screen->hud, 0, 0) < 0;
if (display_error || !screen_center(screen))
{
printf(RED "Display failed to initialize\n" RESET);
return (FAILURE);
}
screen->hud->instances[0].enabled = false;
screen->minimap->instances[0].enabled = false;
return (SUCCESS);
}

View File

@ -0,0 +1,31 @@
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* screen_fill_background.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: qmennen <qmennen@student.codam.nl> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2025/06/12 13:26:49 by qmennen #+# #+# */
/* Updated: 2025/06/12 13:33:58 by qmennen ### ########.fr */
/* */
/* ************************************************************************** */
#include "screen.h"
void fill_background(mlx_image_t *image, int color)
{
unsigned int i;
unsigned int j;
i = 0;
while (i < image->width)
{
j = 0;
while (j < image->height)
{
mlx_put_pixel(image, i, j, color);
j++;
}
i++;
}
}

View File

@ -0,0 +1,24 @@
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* shader_init.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: qmennen <qmennen@student.codam.nl> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2025/05/08 18:27:59 by qmennen #+# #+# */
/* Updated: 2025/06/12 13:42:50 by qmennen ### ########.fr */
/* */
/* ************************************************************************** */
#include "cub3d.h"
int shader_init(void)
{
vert_shader = shader_read_glsl("./assets/shaders/vert.glsl");
if (!vert_shader)
return (FAILURE);
frag_shader = shader_read_glsl("./assets/shaders/frag.glsl");
if (!frag_shader)
return (FAILURE);
return (SUCCESS);
}

View File

@ -0,0 +1,40 @@
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* shader_load_uniforms.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: qmennen <qmennen@student.codam.nl> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2025/06/12 13:36:40 by qmennen #+# #+# */
/* Updated: 2025/06/12 13:37:13 by qmennen ### ########.fr */
/* */
/* ************************************************************************** */
#include "shaders.h"
int shader_load_uniforms(t_game **game)
{
mlx_ctx_t *ctx;
ctx = (mlx_ctx_t *)(*game)->screen->mlx->context;
(*game)->screen->u_time_location = glGetUniformLocation(
ctx->shaderprogram, "u_time");
(*game)->screen->u_battery_location = glGetUniformLocation(
ctx->shaderprogram, "u_battery");
(*game)->screen->u_hit_timer_location = glGetUniformLocation(
ctx->shaderprogram, "u_hit_timer");
(*game)->screen->u_enabled_location = glGetUniformLocation(
ctx->shaderprogram, "u_enabled");
(*game)->screen->u_resolution_location = glGetUniformLocation(
ctx->shaderprogram, "u_resolution");
(*game)->screen->u_ismoving_location = glGetUniformLocation(
ctx->shaderprogram, "u_ismoving");
if ((*game)->screen->u_time_location < 0
|| (*game)->screen->u_battery_location < 0
|| (*game)->screen->u_hit_timer_location < 0
|| (*game)->screen->u_enabled_location < 0
|| (*game)->screen->u_resolution_location < 0
|| (*game)->screen->u_ismoving_location < 0)
return (FAILURE);
return (SUCCESS);
}

View File

@ -0,0 +1,41 @@
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* shader_read_glsl.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: qmennen <qmennen@student.codam.nl> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2025/06/12 13:38:37 by qmennen #+# #+# */
/* Updated: 2025/06/12 13:42:43 by qmennen ### ########.fr */
/* */
/* ************************************************************************** */
#include "shaders.h"
const char *shader_read_glsl(const char *target)
{
char *shader;
int fd;
int file_size;
ssize_t bytes_read;
if (!target)
return (NULL);
file_size = get_file_size(target);
fd = open(target, O_RDONLY);
if (fd < 0)
return (perror("Error opening shader file"), NULL);
shader = malloc(file_size * sizeof(char) + 1);
if (!shader)
{
return (perror("Error allocating memory for shader"), close(fd), NULL);
}
bytes_read = read(fd, shader, file_size);
if (bytes_read < 0)
{
return (perror("Error reading shader file"),
free(shader), close(fd), NULL);
}
shader[bytes_read] = '\0';
return (close(fd), shader);
}

View File

@ -0,0 +1,26 @@
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* shader_set_uniforms.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: qmennen <qmennen@student.codam.nl> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2025/06/12 13:30:25 by qmennen #+# #+# */
/* Updated: 2025/06/12 13:31:57 by qmennen ### ########.fr */
/* */
/* ************************************************************************** */
#include "shaders.h"
void shader_set_uniforms(t_game *game)
{
glUniform1f(game->screen->u_time_location, (float)mlx_get_time());
glUniform1i(game->screen->u_ismoving_location,
game->player->is_moving);
glUniform1f(game->screen->u_battery_location, game->player->battery);
glUniform2f(game->screen->u_resolution_location,
(float)game->screen->width, (float)game->screen->height);
glUniform1f(game->screen->u_hit_timer_location, game->player->hit_timer);
glUniform1i(game->screen->u_enabled_location,
game->manager->state == GAME_STATE_PLAYING);
}

View File

@ -0,0 +1,36 @@
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* texture_delete.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: qmennen <qmennen@student.codam.nl> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2025/06/12 13:43:20 by qmennen #+# #+# */
/* Updated: 2025/06/12 13:43:52 by qmennen ### ########.fr */
/* */
/* ************************************************************************** */
#include "texture.h"
void texture_delete(t_game *game)
{
int i;
i = 0;
while (i < 4)
{
if (game->map->textures[i])
mlx_delete_texture(game->map->textures[i]);
i++;
}
if (game->map->texture_floor)
{
mlx_delete_texture(game->map->texture_floor);
game->map->texture_floor = NULL;
}
if (game->map->texture_ceiling)
{
mlx_delete_texture(game->map->texture_ceiling);
game->map->texture_ceiling = NULL;
}
}

View File

@ -0,0 +1,24 @@
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* texutre_load.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: qmennen <qmennen@student.codam.nl> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2025/05/06 15:45:58 by qmennen #+# #+# */
/* Updated: 2025/06/12 13:43:15 by qmennen ### ########.fr */
/* */
/* ************************************************************************** */
#include "texture.h"
int texture_load(t_game *game)
{
if (!game->map->textures[SIDE_NORTH] || !game->map->textures[SIDE_EAST]
|| !game->map->textures[SIDE_SOUTH] || !game->map->textures[SIDE_WEST])
{
texture_delete(game);
return (FAILURE);
}
return (SUCCESS);
}

View File

@ -6,7 +6,7 @@
/* By: qmennen <qmennen@student.codam.nl> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2025/04/22 17:08:26 by qmennen #+# #+# */
/* Updated: 2025/06/10 14:42:24 by qmennen ### ########.fr */
/* Updated: 2025/06/12 16:06:38 by qmennen ### ########.fr */
/* */
/* ************************************************************************** */
@ -14,7 +14,7 @@
t_sprite make_sprite(t_sprite_lib *def, double x, double y)
{
t_sprite sprite;
t_sprite sprite;
ft_memset(&sprite, 0, sizeof(t_sprite));
sprite.texture = def->texture;
@ -28,11 +28,11 @@ t_sprite make_sprite(t_sprite_lib *def, double x, double y)
static int init_temp(t_game **game)
{
mlx_texture_t *hud_texture;
mlx_texture_t *hud_texture;
hud_texture = mlx_load_png("./assets/hud/cam_overlay.png");
(*game)->screen->hud = mlx_texture_to_image((*game)->screen->mlx,
hud_texture);
hud_texture);
mlx_delete_texture(hud_texture);
return (SUCCESS);
}
@ -51,7 +51,7 @@ int initialize_cub3d(t_game **game, const char *mapfile)
return (FAILURE);
if (!screen_create(game))
return (FAILURE);
if (!load_uniforms(game))
if (!shader_load_uniforms(game))
return (FAILURE);
if (!keyboard_create(game))
return (FAILURE);

View File

@ -0,0 +1,29 @@
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* collision_axis.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: qmennen <qmennen@student.codam.nl> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2025/06/12 13:47:35 by qmennen #+# #+# */
/* Updated: 2025/06/12 13:47:51 by qmennen ### ########.fr */
/* */
/* ************************************************************************** */
#include "collision.h"
int collision_horizontal(t_map *map, t_player *player, double xa)
{
t_tile tile;
tile = get_tile(map, (int)((player->pos.x + xa)), (int)((player->pos.y)));
return (tile != TILE_WALL && tile != TILE_VOID && tile != TILE_DOOR);
}
int collision_vertical(t_map *map, t_player *player, double ya)
{
t_tile tile;
tile = get_tile(map, (int)((player->pos.x)), (int)((player->pos.y + ya)));
return (tile != TILE_WALL && tile != TILE_VOID && tile != TILE_DOOR);
}

View File

@ -1,12 +1,12 @@
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* collision.c :+: :+: :+: */
/* collision_sprite.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: qmennen <qmennen@student.codam.nl> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2025/04/22 14:40:59 by qmennen #+# #+# */
/* Updated: 2025/06/11 20:17:16 by qmennen ### ########.fr */
/* Created: 2025/06/12 13:48:08 by qmennen #+# #+# */
/* Updated: 2025/06/12 13:48:55 by qmennen ### ########.fr */
/* */
/* ************************************************************************** */
@ -58,19 +58,3 @@ int collision_sprite(t_game *game, double xa, double ya)
}
return (0);
}
int collision_horizontal(t_map *map, t_player *player, double xa)
{
t_tile tile;
tile = get_tile(map, (int)((player->pos.x + xa)), (int)((player->pos.y)));
return (tile != TILE_WALL && tile != TILE_VOID && tile != TILE_DOOR);
}
int collision_vertical(t_map *map, t_player *player, double ya)
{
t_tile tile;
tile = get_tile(map, (int)((player->pos.x)), (int)((player->pos.y + ya)));
return (tile != TILE_WALL && tile != TILE_VOID && tile != TILE_DOOR);
}

View File

@ -6,7 +6,7 @@
/* By: qmennen <qmennen@student.codam.nl> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2025/04/15 15:46:08 by qmennen #+# #+# */
/* Updated: 2025/06/11 17:44:59 by qmennen ### ########.fr */
/* Updated: 2025/06/12 16:05:45 by qmennen ### ########.fr */
/* */
/* ************************************************************************** */
@ -27,51 +27,3 @@ int game_create(t_game **game)
}
return (SUCCESS);
}
void game_over(t_game_manager *manager)
{
t_game *game;
game = manager->game;
game->screen->hud->instances[0].enabled = false;
game->screen->minimap->instances[0].enabled = false;
game->screen->img->instances[0].enabled = false;
game->scoreboard->end_time = mlx_get_time();
manager->state = GAME_STATE_END_SCREEN;
manager->active_menu = &manager->end_screen;
set_uniforms(game);
}
void game_run(t_game *game)
{
static int fps = 0;
fps += (int)(1.f / game->screen->mlx->delta_time);
set_uniforms(game);
player_update(game, game->screen->mlx->delta_time);
cast_rays(game);
update_monsters(game);
render_map(game);
handle_battery(game);
handle_record(game);
handle_mouse(game);
collision_sprite(game, 0, 0);
if (game->player->battery <= 0 || count_tiles(game->map, TILE_EMPTY) == 0)
game_over(game->manager);
}
void game_free(t_game *game)
{
if (game->scoreboard)
free(game->scoreboard);
if (game->screen)
free(game->screen);
if (game->player)
free(game->player);
if (game->map)
map_free(game->map);
if (game->keyboard)
free(game->keyboard);
game->scoreboard = NULL;
free(game);
}

29
src/game/core/game_free.c Normal file
View File

@ -0,0 +1,29 @@
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* game_free.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: qmennen <qmennen@student.codam.nl> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2025/04/15 15:46:08 by qmennen #+# #+# */
/* Updated: 2025/06/12 16:03:18 by qmennen ### ########.fr */
/* */
/* ************************************************************************** */
#include "game.h"
void game_free(t_game *game)
{
if (game->scoreboard)
free(game->scoreboard);
if (game->screen)
free(game->screen);
if (game->player)
free(game->player);
if (game->map)
map_free(game->map);
if (game->keyboard)
free(game->keyboard);
game->scoreboard = NULL;
free(game);
}

27
src/game/core/game_over.c Normal file
View File

@ -0,0 +1,27 @@
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* game_over.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: qmennen <qmennen@student.codam.nl> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2025/06/12 16:05:39 by qmennen #+# #+# */
/* Updated: 2025/06/12 16:05:48 by qmennen ### ########.fr */
/* */
/* ************************************************************************** */
#include "game.h"
void game_over(t_game_manager *manager)
{
t_game *game;
game = manager->game;
game->screen->hud->instances[0].enabled = false;
game->screen->minimap->instances[0].enabled = false;
game->screen->img->instances[0].enabled = false;
game->scoreboard->end_time = mlx_get_time();
manager->state = GAME_STATE_END_SCREEN;
manager->active_menu = &manager->end_screen;
shader_set_uniforms(game);
}

31
src/game/core/game_run.c Normal file
View File

@ -0,0 +1,31 @@
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* game_run.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: qmennen <qmennen@student.codam.nl> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2025/06/12 16:05:15 by qmennen #+# #+# */
/* Updated: 2025/06/12 16:05:29 by qmennen ### ########.fr */
/* */
/* ************************************************************************** */
#include "game.h"
void game_run(t_game *game)
{
static int fps = 0;
fps += (int)(1.f / game->screen->mlx->delta_time);
shader_set_uniforms(game);
player_update(game, game->screen->mlx->delta_time);
cast_rays(game);
monster_update(game);
render_map(game);
hud_update_battery(game);
hud_draw_record(game);
handle_mouse(game);
collision_sprite(game, 0, 0);
if (game->player->battery <= 0 || count_tiles(game->map, TILE_EMPTY) == 0)
game_over(game->manager);
}

View File

@ -1,12 +1,12 @@
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* game_hud.c :+: :+: :+: */
/* hud_draw_battery.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: qmennen <qmennen@student.codam.nl> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2025/05/28 14:26:29 by qmennen #+# #+# */
/* Updated: 2025/06/11 20:19:25 by qmennen ### ########.fr */
/* Created: 2025/06/12 13:58:31 by qmennen #+# #+# */
/* Updated: 2025/06/12 14:02:13 by qmennen ### ########.fr */
/* */
/* ************************************************************************** */
@ -22,7 +22,7 @@ static int battery_color(float battery)
return (0xFF000066);
}
static void draw_battery(mlx_image_t *img, float battery)
void hud_draw_battery(mlx_image_t *img, float battery)
{
int x;
int y;
@ -50,51 +50,3 @@ static void draw_battery(mlx_image_t *img, float battery)
x++;
}
}
void handle_battery(t_game *game)
{
if (game->player->battery_charger > 0)
{
game->player->battery += (BATTERY_CHARGE / CHARGE_FRAMES);
game->player->battery_charger--;
}
if (game->player->battery > 1.0f)
{
game->player->battery = 1.0f;
}
game->player->battery -= game->screen->mlx->delta_time * BATTERY_RATE;
if (game->player->battery < 0)
{
game->player->battery = 0;
game->manager->state = GAME_STATE_MENU;
}
draw_battery(game->screen->minimap, game->player->battery);
}
void handle_record(t_game *game)
{
static int flash = 0;
int x;
int y;
flash = (int) mlx_get_time() % 2;
y = -15;
while (y <= 15)
{
x = -15;
while (x <= 15)
{
if (x * x + y * y <= 225)
{
if (flash)
mlx_put_pixel(
game->screen->hud, 1530 + x, 212 + y, 0xFF000055);
else
mlx_put_pixel(
game->screen->hud, 1530 + x, 212 + y, 0x00000066);
}
x++;
}
y++;
}
}

View File

@ -0,0 +1,41 @@
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* hud_draw_record.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: qmennen <qmennen@student.codam.nl> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2025/05/28 14:26:29 by qmennen #+# #+# */
/* Updated: 2025/06/12 14:01:54 by qmennen ### ########.fr */
/* */
/* ************************************************************************** */
#include "game.h"
void hud_draw_record(t_game *game)
{
static int flash = 0;
int x;
int y;
flash = (int)mlx_get_time() % 2;
y = -15;
while (y <= 15)
{
x = -15;
while (x <= 15)
{
if (x * x + y * y <= 225)
{
if (flash)
mlx_put_pixel(
game->screen->hud, 1530 + x, 212 + y, 0xFF000055);
else
mlx_put_pixel(
game->screen->hud, 1530 + x, 212 + y, 0x00000066);
}
x++;
}
y++;
}
}

View File

@ -0,0 +1,33 @@
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* hud_update_battery.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: qmennen <qmennen@student.codam.nl> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2025/06/12 13:59:52 by qmennen #+# #+# */
/* Updated: 2025/06/12 14:02:08 by qmennen ### ########.fr */
/* */
/* ************************************************************************** */
#include "game.h"
void hud_update_battery(t_game *game)
{
if (game->player->battery_charger > 0)
{
game->player->battery += (BATTERY_CHARGE / CHARGE_FRAMES);
game->player->battery_charger--;
}
if (game->player->battery > 1.0f)
{
game->player->battery = 1.0f;
}
game->player->battery -= game->screen->mlx->delta_time * BATTERY_RATE;
if (game->player->battery < 0)
{
game->player->battery = 0;
game->manager->state = GAME_STATE_MENU;
}
hud_draw_battery(game->screen->minimap, game->player->battery);
}

25
src/game/interact_door.c Normal file
View File

@ -0,0 +1,25 @@
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* interact_door.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: qmennen <qmennen@student.codam.nl> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2025/06/12 13:50:14 by qmennen #+# #+# */
/* Updated: 2025/06/12 13:54:23 by qmennen ### ########.fr */
/* */
/* ************************************************************************** */
#include "player.h"
void interact_door(t_game *game)
{
t_vec2_int pos;
pos = vec2_to_int(add(game->player->pos, game->player->dir));
if (game->map->grid[pos.y][pos.x] == TILE_DOOR)
{
game->map->grid[pos.y][pos.x] = TILE_EMPTY;
game->scoreboard->tiles_visited++;
}
}

View File

@ -0,0 +1,27 @@
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* game_manager_create.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: qmennen <qmennen@student.codam.nl> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2025/06/12 14:04:29 by qmennen #+# #+# */
/* Updated: 2025/06/12 14:05:10 by qmennen ### ########.fr */
/* */
/* ************************************************************************** */
#include "game_manager.h"
t_game_manager *game_manager_create(t_game *game, int state)
{
t_game_manager *manager;
manager = malloc(sizeof(t_game_manager));
if (!manager)
return (NULL);
manager->game = game;
manager->menu = NULL;
manager->state = state;
game->manager = manager;
return (manager);
}

View File

@ -6,51 +6,12 @@
/* By: qmennen <qmennen@student.codam.nl> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2025/05/27 13:48:18 by qmennen #+# #+# */
/* Updated: 2025/06/11 15:00:38 by qmennen ### ########.fr */
/* Updated: 2025/06/12 14:05:24 by qmennen ### ########.fr */
/* */
/* ************************************************************************** */
#include "game_manager.h"
t_game_manager *game_manager_create(t_game *game, int state)
{
t_game_manager *manager;
manager = malloc(sizeof(t_game_manager));
if (!manager)
return (NULL);
manager->game = game;
manager->menu = NULL;
manager->state = state;
game->manager = manager;
return (manager);
}
void game_manager_display(t_game_manager *manager)
{
t_game *game;
if (!manager || !manager->game)
return ;
game = manager->game;
if (manager->state == GAME_STATE_MENU)
menu_display(*(manager->active_menu), game->screen);
else if (manager->state == GAME_STATE_PLAYING)
game_run(game);
else if (manager->state == GAME_STATE_END_SCREEN)
draw_end_screen(manager, manager->end_screen);
}
void game_manager_update(void *param)
{
t_game_manager *manager;
manager = (t_game_manager *)param;
game_manager_handle_input(manager);
game_manager_display(manager);
keyboard_update(manager->game);
}
void game_manager_destroy(void *param)
{
t_game_manager *manager;

View File

@ -0,0 +1,28 @@
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* game_manager_display.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: qmennen <qmennen@student.codam.nl> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2025/06/12 14:05:03 by qmennen #+# #+# */
/* Updated: 2025/06/12 14:05:08 by qmennen ### ########.fr */
/* */
/* ************************************************************************** */
#include "game_manager.h"
void game_manager_display(t_game_manager *manager)
{
t_game *game;
if (!manager || !manager->game)
return ;
game = manager->game;
if (manager->state == GAME_STATE_MENU)
menu_display(*(manager->active_menu), game->screen);
else if (manager->state == GAME_STATE_PLAYING)
game_run(game);
else if (manager->state == GAME_STATE_END_SCREEN)
draw_end_screen(manager, manager->end_screen);
}

View File

@ -1,12 +1,12 @@
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* game_manager_utils.c :+: :+: :+: */
/* game_manager_input.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: qmennen <qmennen@student.codam.nl> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2025/05/27 15:22:15 by qmennen #+# #+# */
/* Updated: 2025/06/05 18:44:32 by qmennen ### ########.fr */
/* Created: 2025/06/12 14:07:08 by qmennen #+# #+# */
/* Updated: 2025/06/12 14:09:24 by qmennen ### ########.fr */
/* */
/* ************************************************************************** */
@ -23,6 +23,8 @@ void game_manager_select(t_game_manager *manager)
void game_manager_handle_input(t_game_manager *manager)
{
if (manager->state == GAME_STATE_PLAYING)
return ;
if (get_key_down(manager->game, MLX_KEY_ENTER))
{
game_manager_select(manager);

View File

@ -0,0 +1,23 @@
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* game_manager_update.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: qmennen <qmennen@student.codam.nl> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2025/06/12 14:05:26 by qmennen #+# #+# */
/* Updated: 2025/06/12 14:08:51 by qmennen ### ########.fr */
/* */
/* ************************************************************************** */
#include "game_manager.h"
void game_manager_update(void *param)
{
t_game_manager *manager;
manager = (t_game_manager *)param;
game_manager_handle_input(manager);
game_manager_display(manager);
keyboard_update(manager->game);
}

View File

@ -1,12 +1,12 @@
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* menu.c :+: :+: :+: */
/* menu_create.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: qmennen <qmennen@student.codam.nl> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2025/05/27 14:31:53 by qmennen #+# #+# */
/* Updated: 2025/06/11 15:02:35 by qmennen ### ########.fr */
/* Created: 2025/06/12 14:10:04 by qmennen #+# #+# */
/* Updated: 2025/06/12 14:10:14 by qmennen ### ########.fr */
/* */
/* ************************************************************************** */
@ -32,57 +32,3 @@ t_menu *menu_create(t_game_manager *manager, char *b_path,
menu->num_options = i;
return (menu);
}
void menu_display(t_menu *menu, t_screen *screen)
{
int i;
int half_h;
half_h = screen->height / 2;
if (menu->hidden)
menu_toggle(menu);
menu->selector->instances[0].x = 150;
menu->selector->instances[0].y = half_h + menu->selected_option * 50;
i = 0;
while (i < menu->num_options)
{
menu->items[i]->image->instances[0].x = 200;
menu->items[i]->image->instances[0].y = half_h + i * 50;
i++;
}
}
void menu_toggle(t_menu *menu)
{
int i;
if (!menu)
return ;
menu->hidden = !menu->hidden;
if (menu->selector)
menu->selector->instances[0].enabled = !menu->hidden;
if (menu->background)
menu->background->instances[0].enabled = !menu->hidden;
i = -1;
while (++i < menu->num_options)
{
menu->items[i]->image->instances[0].enabled = !menu->hidden;
mlx_set_instance_depth(menu->items[i]->image->instances, 7);
}
}
void menu_free(t_menu *menu, t_screen *screen)
{
int i;
(void)screen;
i = 0;
if (!menu)
return ;
while (i < menu->num_options)
{
free(menu->items[i]);
i++;
}
free(menu);
}

View File

@ -0,0 +1,32 @@
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* menu_display.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: qmennen <qmennen@student.codam.nl> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2025/06/12 14:10:43 by qmennen #+# #+# */
/* Updated: 2025/06/12 14:12:55 by qmennen ### ########.fr */
/* */
/* ************************************************************************** */
#include "game_menu.h"
void menu_display(t_menu *menu, t_screen *screen)
{
int i;
int half_h;
half_h = screen->height / 2;
if (menu->hidden)
menu_toggle(menu);
menu->selector->instances[0].x = 150;
menu->selector->instances[0].y = half_h + menu->selected_option * 50;
i = 0;
while (i < menu->num_options)
{
menu->items[i]->image->instances[0].x = 200;
menu->items[i]->image->instances[0].y = half_h + i * 50;
i++;
}
}

29
src/game/menu/menu_free.c Normal file
View File

@ -0,0 +1,29 @@
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* menu_free.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: qmennen <qmennen@student.codam.nl> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2025/06/12 14:11:01 by qmennen #+# #+# */
/* Updated: 2025/06/12 14:11:11 by qmennen ### ########.fr */
/* */
/* ************************************************************************** */
#include "game_menu.h"
void menu_free(t_menu *menu, t_screen *screen)
{
int i;
(void)screen;
i = 0;
if (!menu)
return ;
while (i < menu->num_options)
{
free(menu->items[i]);
i++;
}
free(menu);
}

View File

@ -1,18 +1,18 @@
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* menu_util.c :+: :+: :+: */
/* menu_set_background.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: qmennen <qmennen@student.codam.nl> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2025/05/28 14:45:59 by qmennen #+# #+# */
/* Updated: 2025/06/05 18:47:58 by qmennen ### ########.fr */
/* Updated: 2025/06/12 14:12:43 by qmennen ### ########.fr */
/* */
/* ************************************************************************** */
#include "game_menu.h"
mlx_image_t *menu_load_background(mlx_t *mlx, char *background_path)
static mlx_image_t *menu_load_background(mlx_t *mlx, char *background_path)
{
mlx_texture_t *background_texture;
mlx_image_t *background_image;

View File

@ -0,0 +1,32 @@
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* menu_toggle.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: qmennen <qmennen@student.codam.nl> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2025/06/12 14:10:25 by qmennen #+# #+# */
/* Updated: 2025/06/12 14:10:36 by qmennen ### ########.fr */
/* */
/* ************************************************************************** */
#include "game_menu.h"
void menu_toggle(t_menu *menu)
{
int i;
if (!menu)
return ;
menu->hidden = !menu->hidden;
if (menu->selector)
menu->selector->instances[0].enabled = !menu->hidden;
if (menu->background)
menu->background->instances[0].enabled = !menu->hidden;
i = -1;
while (++i < menu->num_options)
{
menu->items[i]->image->instances[0].enabled = !menu->hidden;
mlx_set_instance_depth(menu->items[i]->image->instances, 7);
}
}

View File

@ -1,18 +1,18 @@
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* monster.c :+: :+: :+: */
/* monster_update.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: qmennen <qmennen@student.codam.nl> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2025/05/28 17:15:52 by qmennen #+# #+# */
/* Updated: 2025/06/11 16:22:09 by qmennen ### ########.fr */
/* Updated: 2025/06/12 14:15:00 by qmennen ### ########.fr */
/* */
/* ************************************************************************** */
#include "cub3d.h"
#include "monster.h"
void update_monsters(t_game *game)
void monster_update(t_game *game)
{
unsigned int i;
t_vec2 d;

Some files were not shown because too many files have changed in this diff Show More