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].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(0.25); 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); } } static void boundsEnemy(u8 i){ if(enemies[i].pos.y >= GAME_H_F - FIX32(enemies[i].off) || enemies[i].pos.y <= FIX32(enemies[i].off)) enemies[i].vel.y *= -1; if(enemies[i].pos.x >= GAME_WRAP){ enemies[i].pos.x -= GAME_WRAP; } if(enemies[i].pos.x < 0){ enemies[i].pos.x += GAME_WRAP; } } static void updateEnemy(u8 i){ boundsEnemy(i); enemies[i].pos.x += enemies[i].vel.x; enemies[i].pos.y += enemies[i].vel.y; s16 sx = getScreenX(enemies[i].pos.x, player.camera); s16 sy = fix32ToInt(enemies[i].pos.y); fix32 dx = getWrappedDelta(enemies[i].pos.x, player.pos.x); bool onScreen = (dx >= FIX32(-256) && dx <= FIX32(256)); SPR_setVisibility(enemies[i].image, onScreen ? VISIBLE : HIDDEN); SPR_setPosition(enemies[i].image, sx - enemies[i].off, sy - enemies[i].off); enemyCount++; } void updateEnemies(){ enemyCount = 0; for(s16 i = 0; i < ENEMY_COUNT; i++) if(enemies[i].active) updateEnemy(i); intToStr(enemyCount, debugStr, 1); }