/* ************************************************************************** */
/*                                                                            */
/*                                                        :::      ::::::::   */
/*   types.h                                            :+:      :+:    :+:   */
/*                                                    +:+ +:+         +:+     */
/*   By: qmennen <qmennen@student.codam.nl>         +#+  +:+       +#+        */
/*                                                +#+#+#+#+#+   +#+           */
/*   Created: 2025/04/15 15:52:44 by qmennen           #+#    #+#             */
/*   Updated: 2025/05/06 19:20:58 by qmennen          ###   ########.fr       */
/*                                                                            */
/* ************************************************************************** */

#ifndef TYPES_H
#define TYPES_H

#include "cub3d.h"

typedef enum TILE
{
	TILE_VISITED = -2,
	TILE_VOID = -1,
	TILE_EMPTY = 0,
	TILE_WALL = 1,
	TILE_PLAYER = 2,
} t_tile;

typedef struct s_vec2
{
	double x;
	double y;
} t_vec2;

typedef struct s_vec2_int
{
	int x;
	int y;
} t_vec2_int;

typedef struct s_vec2_line
{
	t_vec2 support;
	t_vec2 dir;
} t_vec2_line;

typedef struct s_player
{
	t_vec2 pos;
	t_vec2 dir;
	t_vec2 camera;
	double speed;
	double fov;
	int steps;
} t_player;

typedef struct s_map
{
	unsigned int width;
	unsigned int height;
	t_tile **grid;
	char *NO_texture;
	char *SO_texture;
	char *WE_texture;
	char *EA_texture;
	mlx_texture_t	*texture_floor;
	mlx_texture_t	*texture_ceiling;
	mlx_texture_t	*textures[4];
	unsigned int floor_color;
	unsigned int ceiling_color;
} t_map;

typedef struct s_keyboard
{
	int keys[NUM_KEYS];
	int last_keys[NUM_KEYS];
} t_keyboard;

typedef struct s_screen
{
	mlx_t *mlx;
	mlx_image_t *img;
	mlx_image_t *minimap;
	mlx_image_t *background;
	unsigned int width;
	unsigned int height;
} t_screen;

typedef enum e_side
{
	SIDE_NORTH,
	SIDE_SOUTH,
	SIDE_WEST,
	SIDE_EAST,
} t_side;

typedef struct s_render
{
	double perp_dist;
	t_side side;
	double wall_x;
} t_render;

typedef struct s_game
{
	t_map *map;
	t_player *player;
	t_screen *screen;
	t_keyboard *keyboard;
} t_game;

#endif
