level design etc
This commit is contained in:
parent
0151304d05
commit
4036b5f07e
13 changed files with 460 additions and 21 deletions
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue