orton_runner/src/memory/thrower.c

90 lines
2.2 KiB
C

/*
** EPITECH PROJECT, 2018
** task01
** File description:
** I do task
*/
#include <stdlib.h>
#include "game/memory.h"
#include "game/core.h"
static void init_bullet(object_t *object, thrower_t *thrower)
{
object->dx = (thrower->action == ID_THROWER_LEFT) ? BULLET_SPEED : 0;
if (thrower->action == ID_THROWER_RIGHT)
object->dx = -BULLET_SPEED;
object->dy = (thrower->action == ID_THROWER_DOWN) ? BULLET_SPEED : 0;
if (thrower->action == ID_THROWER_UP)
object->dy = -BULLET_SPEED;
object->x = thrower->x + 16;
object->y = thrower->y + 16;
object->sleep = 0;
}
object_t *init_object(thrower_t *thrower)
{
object_t *object;
object = (object_t*)malloc(sizeof(object_t));
if (thrower->action == ID_THROWER_STONE){
object->dx = (rand() % 9) - 4;
object->dy = 0;
object->x = thrower->x + 16;
object->y = thrower->y + 16;
object->sleep = 0;
return (object);
}
init_bullet(object, thrower);
return (object);
}
static thrower_t *setup_thrower(int i, int width, uint8_t action)
{
thrower_t *thrower;
int j;
j = -1;
thrower = (thrower_t*)malloc(sizeof(thrower_t));
thrower->object = (object_t**)malloc(sizeof(object_t*) * NB_OBJECT);
while (++j < NB_OBJECT)
thrower->object[j] = NULL;
thrower->x = (i - ((i / width) * width)) << 6;
thrower->y = (i / width) << 6;
thrower->action = action;
return (thrower);
}
static thrower_t **get_thrower(uint8_t *map, int width,
int height, int thrower_counter)
{
thrower_t **thrower;
int counter;
int i;
i = -1;
counter = 0;
thrower = (thrower_t**)malloc(sizeof(thrower_t*) * thrower_counter);
while (++i < width * height && counter < thrower_counter)
if (map[i] >= ID_THROWER_STONE && map[i] <= ID_THROWER_RIGHT)
thrower[counter++] = setup_thrower(i, width, map[i]);
return (thrower);
}
thrower_t **init_thrower(level_t *level)
{
int i;
i = -1;
level->thrower_counter = 0;
while (++i < level->width * level->height)
if (level->map[i] >= ID_THROWER_STONE
&& level->map[i] <= ID_THROWER_RIGHT)
level->thrower_counter++;
if (!level->thrower_counter)
return (NULL);
level->timer_stone = 0;
level->timer_bullet = 0;
return (get_thrower(level->map, level->width,
level->height, level->thrower_counter));
}