|
@@ -9,36 +9,28 @@
|
|
|
#include "missile.h"
|
|
#include "missile.h"
|
|
|
#include "barry.h"
|
|
#include "barry.h"
|
|
|
|
|
|
|
|
-void missile_tick(MISSILE* const missiles, BARRY* const barry, State* const state) {
|
|
|
|
|
|
|
+void missile_tick(MISSILE* const missiles, BARRY* const barry, void (*death_handler)()) {
|
|
|
// Move missiles towards the player
|
|
// Move missiles towards the player
|
|
|
for(int i = 0; i < MISSILES_MAX; i++) {
|
|
for(int i = 0; i < MISSILES_MAX; i++) {
|
|
|
- if(missile_colides(&missiles[i], barry)) {
|
|
|
|
|
- // (*state) = GameStateGameOver;
|
|
|
|
|
- UNUSED(state);
|
|
|
|
|
|
|
+ if(missiles[i].visible && missile_colides(&missiles[i], barry)) {
|
|
|
|
|
+ death_handler();
|
|
|
}
|
|
}
|
|
|
- if(missiles[i].point.x > 0) {
|
|
|
|
|
|
|
+ if(missiles[i].visible) {
|
|
|
missiles[i].point.x -= 2; // move left by 2 units
|
|
missiles[i].point.x -= 2; // move left by 2 units
|
|
|
- if(missiles[i].point.x < -16) { // if the coin is out of screen
|
|
|
|
|
- missiles[i].point.x = 0; // set coin x coordinate to 0 to mark it as "inactive"
|
|
|
|
|
|
|
+ if(missiles[i].point.x < -MISSILE_WIDTH) { // if the missile is out of screen
|
|
|
|
|
+ missiles[i].visible = false; // set missile as "inactive"
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-bool missile_colides(MISSILE* const missile, BARRY* const barry) {
|
|
|
|
|
- return !(
|
|
|
|
|
- barry->point.x > missile->point.x + 26 || // Barry is to the right of the missile
|
|
|
|
|
- barry->point.x + 11 < missile->point.x || // Barry is to the left of the missile
|
|
|
|
|
- barry->point.y > missile->point.y + 12 || // Barry is below the missile
|
|
|
|
|
- barry->point.y + 15 < missile->point.y); // Barry is above the missile
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
void spawn_random_missile(MISSILE* const missiles) {
|
|
void spawn_random_missile(MISSILE* const missiles) {
|
|
|
- // Check for an available slot for a new coin
|
|
|
|
|
|
|
+ // Check for an available slot for a new missile
|
|
|
for(int i = 0; i < MISSILES_MAX; ++i) {
|
|
for(int i = 0; i < MISSILES_MAX; ++i) {
|
|
|
- if(missiles[i].point.x <= 0) {
|
|
|
|
|
- missiles[i].point.x = 127;
|
|
|
|
|
- missiles[i].point.y = rand() % 64;
|
|
|
|
|
|
|
+ if(!missiles[i].visible) {
|
|
|
|
|
+ missiles[i].point.x = 2 * SCREEN_WIDTH;
|
|
|
|
|
+ missiles[i].point.y = rand() % (SCREEN_HEIGHT - MISSILE_HEIGHT);
|
|
|
|
|
+ missiles[i].visible = true;
|
|
|
break;
|
|
break;
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
@@ -46,14 +38,48 @@ void spawn_random_missile(MISSILE* const missiles) {
|
|
|
|
|
|
|
|
void draw_missiles(const MISSILE* missiles, Canvas* const canvas, const GameSprites* sprites) {
|
|
void draw_missiles(const MISSILE* missiles, Canvas* const canvas, const GameSprites* sprites) {
|
|
|
for(int i = 0; i < MISSILES_MAX; ++i) {
|
|
for(int i = 0; i < MISSILES_MAX; ++i) {
|
|
|
- if(missiles[i].point.x > 0) {
|
|
|
|
|
|
|
+ if(missiles[i].visible) {
|
|
|
canvas_set_color(canvas, ColorBlack);
|
|
canvas_set_color(canvas, ColorBlack);
|
|
|
- canvas_draw_icon_animation(
|
|
|
|
|
- canvas, missiles[i].point.x, missiles[i].point.y, sprites->missile);
|
|
|
|
|
|
|
|
|
|
- canvas_set_color(canvas, ColorWhite);
|
|
|
|
|
- canvas_draw_icon(
|
|
|
|
|
- canvas, missiles[i].point.x, missiles[i].point.y, sprites->missile_infill);
|
|
|
|
|
|
|
+ if(missiles[i].point.x > 128) {
|
|
|
|
|
+ canvas_draw_icon_animation(
|
|
|
|
|
+ canvas, SCREEN_WIDTH - 7, missiles[i].point.y, sprites->alert);
|
|
|
|
|
+ } else {
|
|
|
|
|
+ canvas_draw_icon_animation(
|
|
|
|
|
+ canvas, missiles[i].point.x, missiles[i].point.y, sprites->missile);
|
|
|
|
|
+
|
|
|
|
|
+ canvas_set_color(canvas, ColorWhite);
|
|
|
|
|
+ canvas_draw_icon(
|
|
|
|
|
+ canvas, missiles[i].point.x, missiles[i].point.y, sprites->missile_infill);
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
-}
|
|
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+bool missile_colides(MISSILE* const missile, BARRY* const barry) {
|
|
|
|
|
+ return !(
|
|
|
|
|
+ barry->point.x >
|
|
|
|
|
+ missile->point.x + MISSILE_WIDTH - 10 || // Barry is to the right of the missile
|
|
|
|
|
+ barry->point.x + BARRY_WIDTH < missile->point.x || // Barry is to the left of the missile
|
|
|
|
|
+ barry->point.y > missile->point.y + MISSILE_WIDTH || // Barry is below the missile
|
|
|
|
|
+ barry->point.y + BARRY_HEIGHT < missile->point.y); // Barry is above the missile
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+int get_rocket_spawn_distance(int player_distance) {
|
|
|
|
|
+ // Define the start and end points for rocket spawn distance
|
|
|
|
|
+ int start_distance = 256;
|
|
|
|
|
+ int end_distance = 32;
|
|
|
|
|
+
|
|
|
|
|
+ // Define the maximum player distance at which the spawn distance should be at its minimum
|
|
|
|
|
+ int max_player_distance = 5000; // Adjust this value based on your game's difficulty curve
|
|
|
|
|
+
|
|
|
|
|
+ if(player_distance >= max_player_distance) {
|
|
|
|
|
+ return end_distance;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // Calculate the linear interpolation factor
|
|
|
|
|
+ float t = (float)player_distance / max_player_distance;
|
|
|
|
|
+
|
|
|
|
|
+ // Interpolate the rocket spawn distance
|
|
|
|
|
+ return start_distance + t * (end_distance - start_distance);
|
|
|
|
|
+}
|