/* ************************************************************************** */ /* */ /* ::: :::::::: */ /* ft_find_item.c :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: joelecle +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/02/17 20:06:26 by joelecle #+# #+# */ /* Updated: 2020/02/17 20:06:29 by joelecle ### ########lyon.fr */ /* */ /* ************************************************************************** */ #include #include #include static uint16_t ft_fetch_heals_id(uint64_t pos_y, uint64_t pos_x, t_cub *cl) { uint16_t id; id = 0; while (id <= 64) { if (cl->sprites[9][id].s_pos_y == pos_y && cl->sprites[9][id].s_pos_x == pos_x) return (id); id++; } return (0); } static uint16_t ft_fetch_weaps_id(int8_t weap_id, uint64_t pos_y, uint64_t pos_x, t_cub *cl) { uint16_t id; id = 0; while (id <= 32) { if (cl->sprites[10 + weap_id][id].s_pos_y == pos_y && cl->sprites[10 + weap_id][id].s_pos_x == pos_x) return (id); id++; } return (0); } static void ft_set_ammo(uint8_t weap_id, t_player *pl) { if (weap_id == 0) pl->ammo[0] = FT_WEAP_ONE_STRT_AMMO; else if (weap_id == 1) pl->ammo[1] += FT_WEAP_TWO_STRT_AMMO; else if (weap_id == 2) pl->ammo[2] += FT_WEAP_THREE_STRT_AMMO; else if (weap_id == 3) { pl->ammo[2] += FT_AMMO_PACK; weap_id = 2; } if (pl->ammo[weap_id] > FT_WEAP_MAX_AMMO) pl->ammo[weap_id] = FT_WEAP_MAX_AMMO; } static void ft_weapon_check(const char map_char, t_player *pl, t_cub *cl) { uint8_t weap_id; uint8_t that_id; if (ft_ischarset(FT_CHRST_WEAPONS, map_char)) { weap_id = 0; weap_id = (map_char == '@') ? (1) : (weap_id); weap_id = (map_char == '#') ? (2) : (weap_id); weap_id = (map_char == 'x') ? (3) : (weap_id); cl->mlist.map[(uint64_t)pl->pos_y][(uint64_t)pl->pos_x] = '0'; if (weap_id != 3) { that_id = ft_fetch_weaps_id(weap_id, (uint64_t)pl->pos_y, (uint64_t)pl->pos_x, cl); cl->sprites[10 + weap_id][that_id].s_pos_x = 0; cl->sprites[10 + weap_id][that_id].s_pos_y = 0; pl->has_weapon[weap_id] = 1; } pl->handles_weapon = (weap_id == 0) ? (0) : (pl->handles_weapon); pl->handles_weapon = (weap_id == 1) ? (2) : (pl->handles_weapon); pl->handles_weapon = (weap_id == 2) ? (4) : (pl->handles_weapon); ft_set_ammo((weap_id == 3) ? (2) : (weap_id), pl); cl->sfx[6 + (((weap_id == 3) ? (2) : (weap_id)) * 2)].sfx_play(cl->sfx); } } void ft_find_item(t_player *pl, t_map *ml, t_cub *cl) { uint16_t id; const char map_char = ml->map[(uint64_t)pl->pos_y][(uint64_t)pl->pos_x]; if (ft_ischarset(FT_CHRST_ITEM, map_char)) { if (map_char == '+' && pl->life < FT_STRT_LIFE) { pl->life += FT_HEAL_PACK_AMOUNT; pl->life = (pl->life > FT_STRT_LIFE) ? (FT_STRT_LIFE) : (pl->life); ml->map[(uint64_t)pl->pos_y][(uint64_t)pl->pos_x] = '0'; id = ft_fetch_heals_id((uint64_t)pl->pos_y, (uint64_t)pl->pos_x, cl); cl->sprites[9][id].s_pos_x = 0; cl->sprites[9][id].s_pos_y = 0; cl->sfx[5].sfx_play(cl->sfx); } ft_weapon_check(map_char, pl, cl); } }