enemy spawning etc

This commit is contained in:
t. boddy 2026-02-14 22:44:21 -05:00
parent b2c0eaf30b
commit 11547e9d13
6 changed files with 109 additions and 54 deletions

View file

@ -1,20 +1,53 @@
void spawnEnemy(u8 type){
(void)type; // Unused parameter, kept for API compatibility
s16 i = -1;
for(s16 j = 0; j < ENEMY_COUNT; j++) if(!enemies[j].active && i == -1) i = j;
if(i > -1){
enemies[i].active = TRUE;
enemies[i].type = type;
enemies[i].pos.x = FIX32(64);
enemies[i].pos.y = FIX32(64);
enemies[i].off = 16;
enemies[i].image = SPR_addSprite(&butterflySprite,
getScreenX(enemies[i].pos.x, player.camera) - enemies[i].off, fix32ToInt(enemies[i].pos.y) - enemies[i].off, TILE_ATTR(gameOver ? PAL1 : PAL0, 0, 0, 0));
enemies[i].angle = 128;
enemies[i].speed = FIX32(1);
enemies[i].vel.x = fix32Mul(fix16ToFix32(cosFix16(enemies[i].angle)), enemies[i].speed);
enemies[i].vel.y = fix32Mul(fix16ToFix32(sinFix16(enemies[i].angle)), enemies[i].speed);
#define ENEMY_MIN_DIST FIX32(64)
static bool isValidEnemyPosition(fix32 x, fix32 y) {
for(s16 j = 0; j < ENEMY_COUNT; j++) {
if(enemies[j].active) {
fix32 dx = getWrappedDelta(x, enemies[j].pos.x);
fix32 dy = y - enemies[j].pos.y;
// Check if within 64px in both X and Y
if(dx >= -ENEMY_MIN_DIST && dx <= ENEMY_MIN_DIST &&
dy >= -ENEMY_MIN_DIST && dy <= ENEMY_MIN_DIST) {
return FALSE; // Too close to existing enemy
}
}
}
return TRUE; // Position is valid
}
void spawnEnemy(u8 type, u8 zone){
// Find available slot, return if none
s16 i = -1;
for(s16 j = 0; j < ENEMY_COUNT; j++) if(!enemies[j].active) { i = j; break; }
if(i == -1) return;
enemies[i].active = TRUE;
enemies[i].type = type;
// Calculate zone bounds (each zone is 512px)
fix32 zoneStart = FIX32(zone * 512);
fix32 randX, randY;
u16 attempts = 0;
do {
// Random X within zone: zoneStart + random(0-511)
randX = zoneStart + FIX32(random() % 512);
randY = FIX32(16 + (random() % 192));
attempts++;
} while(!isValidEnemyPosition(randX, randY) && attempts < 100);
enemies[i].pos.x = randX;
enemies[i].pos.y = randY;
enemies[i].off = 16;
enemies[i].image = SPR_addSprite(&butterflySprite,
getScreenX(enemies[i].pos.x, player.camera) - enemies[i].off, fix32ToInt(enemies[i].pos.y) - enemies[i].off, TILE_ATTR(gameOver ? PAL1 : PAL0, 0, 0, 0));
enemies[i].angle = random() % 2 < 1 ? 128 : 384;
enemies[i].speed = FIX32(1);
enemies[i].vel.x = fix32Mul(fix16ToFix32(cosFix16(enemies[i].angle)), enemies[i].speed);
enemies[i].vel.y = fix32Mul(fix16ToFix32(sinFix16(enemies[i].angle)), enemies[i].speed);
for(u8 j = 0; j < PROP_COUNT; j++){
enemies[i].ints[j] = 0;
}
enemies[i].ints[0] = random() % 45;
}
static void boundsEnemy(u8 i){
@ -43,13 +76,13 @@ static void updateEnemy(u8 i){
SPR_setPosition(enemies[i].image, sx - enemies[i].off, sy - enemies[i].off);
if(enemies[i].clock % 45 == 0){
if(enemies[i].clock % 45 == enemies[i].ints[0]){
struct bulletSpawner spawner = {
.x = enemies[i].pos.x,
.y = enemies[i].pos.y,
.anim = 7,
// .frame = 1,
.speed = FIX32(2),
.speed = FIX32(4),
.angle = random() % 128,
};
for(u8 j = 0; j < 8; j++){