/* ************************************************************************** */
/*                                                                            */
/*                                                        :::      ::::::::   */
/*   ft_extra_keys.c                                    :+:      :+:    :+:   */
/*                                                    +:+ +:+         +:+     */
/*   By: rbousset <marvin@42.fr>                    +#+  +:+       +#+        */
/*                                                +#+#+#+#+#+   +#+           */
/*   Created: 2020/02/14 17:22:32 by rbousset          #+#    #+#             */
/*   Updated: 2020/02/14 17:23:42 by rbousset         ###   ########lyon.fr   */
/*                                                                            */
/* ************************************************************************** */

#include <cub3d.h>
#include <stdint.h>
#include <stdio.h>
#include <math.h>
#include <time.h>
#include <libft.h>
#include <pthread.h>

int
	ft_left_key(t_cub *clist)
{
	t_player		*pl;
	float			sav_dir_x;
	float			sav_plane_x;
	const float		rot_speed = FT_ROT_SPEED;

	pl = &clist->plist;
	sav_dir_x = pl->dir_x;
	pl->dir_x = pl->dir_x * cos(rot_speed) - pl->dir_y * sin(rot_speed);
	pl->dir_y = sav_dir_x * sin(rot_speed) + pl->dir_y * cos(rot_speed);
	sav_plane_x = pl->plane_x;
	pl->plane_x = pl->plane_x * cos(rot_speed) - pl->plane_y * sin(rot_speed);
	pl->plane_y = sav_plane_x * sin(rot_speed) + pl->plane_y * cos(rot_speed);
	return (0);
}

int
	ft_right_key(t_cub *clist)
{
	t_player		*pl;
	float			sav_dir_x;
	float			sav_plane_x;
	const float		rot_speed = FT_ROT_SPEED;

	pl = &clist->plist;
	sav_dir_x = pl->dir_x;
	pl->dir_x = pl->dir_x * cos(-rot_speed) - pl->dir_y * sin(-rot_speed);
	pl->dir_y = sav_dir_x * sin(-rot_speed) + pl->dir_y * cos(-rot_speed);
	sav_plane_x = pl->plane_x;
	pl->plane_x = pl->plane_x * cos(-rot_speed) - pl->plane_y * sin(-rot_speed);
	pl->plane_y = sav_plane_x * sin(-rot_speed) + pl->plane_y * cos(-rot_speed);
	return (0);
}

int
	ft_f1_key(t_cub *clist)
{
	if (clist->ishud == 0)
	{
		clist->ishud = 1;
		ft_draw_scene(clist);
	}
	else if (clist->ishud == 1)
	{
		clist->ishud = 0;
		ft_draw_scene(clist);
	}
	return (0);
}

void
    ft_hitscan(t_cub *cl, uint16_t hit)
{
    while (hit == 0)
    {
        if (cl->rlist.x_side_dist < cl->rlist.y_side_dist)
        {
            cl->rlist.x_side_dist += cl->rlist.x_delta_dist;
            cl->rlist.sqx += cl->mlist.x_step;
            cl->rlist.side = 0;
        }
        else
        {
            cl->rlist.y_side_dist += cl->rlist.y_delta_dist;
            cl->rlist.sqy += cl->mlist.y_step;
            cl->rlist.side = 1;
        }
        if (ft_ischarset("23456",
            cl->mlist.map[cl->rlist.sqx][cl->rlist.sqy]))
        {
            hit = 1;
            cl->mlist.map[cl->rlist.sqx][cl->rlist.sqy] = '0';
            ft_get_sprite_spawn(cl);
        }
        else if (ft_ischarset("1",
            cl->mlist.map[cl->rlist.sqx][cl->rlist.sqy]))
            hit = 1;
    }
}

void
    ft_shoot(t_cub *cl, uint16_t i)
{
    t_win		*wl;
    t_player	*pl;

    wl = &cl->wlist;
    pl = &cl->plist;
    pl->cam_x = 2 * i / (float)(wl->x_size) - 1;
    cl->rlist.x_ray_pos = pl->pos_y;
    cl->rlist.y_ray_pos = pl->pos_x;
    cl->rlist.x_ray_dir = pl->dir_x + pl->plane_x *
        pl->cam_x;
    cl->rlist.y_ray_dir = pl->dir_y + pl->plane_y *
        pl->cam_x;
    cl->rlist.sqx = (int16_t)cl->rlist.x_ray_pos;
    cl->rlist.sqy = (int16_t)cl->rlist.y_ray_pos;
    ft_detection_init_x(cl);
    ft_detection_init_y(cl);
    ft_hitscan(cl, 0);
}

int
	ft_space_key(t_cub *clist)
{
	if (clist->plist.fire == 0)
	{
		clist->sfx[clist->plist.handles_weapon + 7].sfx_play(clist->sfx);
		clist->plist.fire = 1;
        ft_shoot(clist, clist->wlist.x_size / 2);
	}
	return (0);
}