/* * Copyright (C) 2021 P. J. McDermott * * This file is part of Dodge Balls * * Dodge Balls is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Dodge Balls is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Dodge Balls. If not, see . */ #include #include "ball.h" #include "collision.h" #include "tileset.h" #include "output.h" struct db_ball { double x; double y; int r; double a; int d; int sr; double s; struct db_tileset *tilesets; int gid; struct db_ball *next; }; struct db_ball * db_ball_new(int x, int y, int r, int a, int d, int sr, double s, struct db_tileset *tilesets, int gid, struct db_ball *prev) { struct db_ball *ball; ball = calloc(1, sizeof(*ball)); if (ball == NULL) { db_err("Failed to allocate memory"); return NULL; } ball->x = x; ball->y = y; ball->r = r; ball->a = a; ball->d = d; ball->sr = sr; ball->s = s; ball->tilesets = tilesets; ball->gid = gid; if (prev != NULL) { prev->next = ball; } return ball; } void db_balls_collisions(struct db_ball *ball) { struct db_ball *other; int col_x; int col_y; for (; other != NULL; other = other->next) { if (db_col_pt_cir_cir(ball->x, ball->y, ball->r, other->x, other->y, other->r, &col_x, &col_y)) { /* TODO: Reverse direction */ } } if (ball->next != NULL) { db_balls_collisions(ball->next); } } int db_balls_player_collisions(struct db_ball *ball, int player_x, int player_y, int player_r) { if (db_col_cir_cir(ball->x, ball->y, ball->r, player_x, player_y, player_r)) { return 1; } if (ball->next != NULL) { return db_balls_player_collisions(ball->next, player_x, player_y, player_r); } else { return 0; } }