level design etc

This commit is contained in:
t. boddy 2026-02-17 17:40:34 -05:00
parent 0151304d05
commit 4036b5f07e
13 changed files with 460 additions and 21 deletions

View file

@ -29,14 +29,16 @@ void spawnEnemy(u8 type, u8 zone){
// Calculate zone bounds (each zone is 512px)
fix32 zoneStart = FIX32(zone * 512);
fix32 randX, randY;
fix32 randX, randY, playerDist;
u16 attempts = 0;
do {
// Random X within zone: zoneStart + random(0-511)
randX = zoneStart + FIX32(random() % 512);
randY = FIX32(16 + (random() % 128));
attempts++;
} while(!isValidEnemyPosition(randX, randY) && attempts < 100);
playerDist = getWrappedDelta(randX, player.pos.x);
if(playerDist < 0) playerDist = -playerDist;
} while((playerDist < CULL_LIMIT || !isValidEnemyPosition(randX, randY)) && attempts < 100);
enemies[i].pos.x = randX;
enemies[i].pos.y = randY;
@ -47,13 +49,29 @@ void spawnEnemy(u8 type, u8 zone){
enemies[i].active = FALSE;
return;
}
enemies[i].hp = 1;
for(u8 j = 0; j < PROP_COUNT; j++){
enemies[i].ints[j] = 0;
}
switch(enemies[i].type){
case 0:
case ENEMY_TYPE_TEST:
loadEnemyOne(i);
break;
case ENEMY_TYPE_DRONE:
loadDrone(i);
break;
case ENEMY_TYPE_GUNNER:
loadGunner(i);
break;
case ENEMY_TYPE_HUNTER:
loadHunter(i);
break;
case ENEMY_TYPE_BUILDER:
loadBuilder(i);
break;
case ENEMY_TYPE_BOSS:
loadBoss(i);
break;
}
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);
@ -61,7 +79,7 @@ void spawnEnemy(u8 type, u8 zone){
}
static void boundsEnemy(u8 i){
if(enemies[i].ints[3] >= 0){
if((enemies[i].type == ENEMY_TYPE_TEST || enemies[i].type == ENEMY_TYPE_BUILDER) && enemies[i].ints[3] >= 0){
s16 h = enemies[i].ints[3];
// if the human was collected by player or gone, kill this enemy
if(!humans[h].active || humans[h].state == HUMAN_COLLECTED){
@ -75,7 +93,11 @@ static void boundsEnemy(u8 i){
if(humans[h].active) killHuman(h);
enemies[i].ints[3] = -1;
humanBeingCarried = FALSE;
// TODO: spawn mutant here
if(enemies[i].type == ENEMY_TYPE_BUILDER){
u8 zone = fix32ToInt(enemies[i].pos.x) / 512;
spawnEnemy(ENEMY_TYPE_GUNNER, zone);
}
enemies[i].hp = 0;
killEnemy(i);
return;
}
@ -104,9 +126,24 @@ static void updateEnemy(u8 i){
enemies[i].onScreen = (dx >= -CULL_LIMIT && dx <= CULL_LIMIT);
switch(enemies[i].type){
case 0:
case ENEMY_TYPE_TEST:
updateEnemyOne(i);
break;
case ENEMY_TYPE_DRONE:
updateDrone(i);
break;
case ENEMY_TYPE_GUNNER:
updateGunner(i);
break;
case ENEMY_TYPE_HUNTER:
updateHunter(i);
break;
case ENEMY_TYPE_BUILDER:
updateBuilder(i);
break;
case ENEMY_TYPE_BOSS:
updateBoss(i);
break;
}
s16 sx = getScreenX(enemies[i].pos.x, player.camera);