int xtrail[10]; //x history
int ytrail[10]; //y history
int chase; //the pod a lander is targeting
- int phase; //chase phase
+ int phase; //chase phase, also used to hold boss life
char line0[6]; //object: left
char line1[6]; //object: right
char line2[6]; //object: alt1
return object;
}
+game_object saucer_motion(game_object object, game_object player){
+ if(player.ytrail[7]<object.y){
+ if(player.xtrail[7]<object.x){ object.direction = 7; };
+ if(player.xtrail[7]==object.x){ object.direction = 4; };
+ if(player.xtrail[7]>object.x){ object.direction = 1; };
+ };
+ if(player.ytrail[7]>=object.y){
+ if(player.xtrail[7]<object.x){ object.direction = 9; };
+ if(player.xtrail[7]==object.x){ object.direction = 6; };
+ if(player.xtrail[7]>object.x){ object.direction = 3; };
+ };
+
+ return object;
+}
+
game_object crazy_motion(game_object object, game_object player){
if(player.ytrail[9]<object.y){
if(player.xtrail[9]<object.x){ object.direction = 7; };
return crawler;
}
+game_object saucer_init(game_object saucer){
+ saucer.active=1;
+ saucer.x = rand()%17;
+ saucer.y = rand()%600+20;
+ saucer.direction = rand()%1000;
+ if(saucer.direction<500){
+ saucer.direction = 4;
+ } else {
+ saucer.direction = 6;
+ };
+ saucer.speed = 1;
+ saucer.phase = 20;
+
+ return saucer;
+}
+
game_object encrazify(game_object lander, game_object crazy){
crazy.active=1;
crazy.x = lander.x;
strcpy (crawlers[crawlerloop].radar, "^");
};
+ //saucer
+ game_object saucer;
+ saucer.number = 300;
+ saucer.active = 0; //debug 0
+ saucer.x = 0;
+ saucer.y = 0;
+ saucer.direction = 5; //debug 5
+ saucer.face = 1;
+ saucer.speed = 0; //debug 0
+ saucer.vspeed = 0;
+ saucer.vtime = 0;
+ saucer.phase = 0; //debug 0
+ strcpy (saucer.line0, "/==O==\\");
+ strcpy (saucer.line1, "/==O==\\");
+ strcpy (saucer.radar, "O");
+
initscr();
//Check screen size 80x24 and exit if not big enough
crawlers[crawlerloop] = process_motion(crawlers[crawlerloop], player);
};
+ if(saucer.active==1){
+ saucer = saucer_motion(saucer, player);
+ saucer = process_motion(saucer, player);
+ };
+
// Draw player object 1
drawlocation = draw_object(player, drawlocation);
drawlocation = draw_object(crawlers[crawlerloop], drawlocation);
};
+ drawlocation = draw_object(saucer, drawlocation);
+
//Radar plot 18x620 represented in 4x62
radar_plot(gate, drawlocation);
radar_plot(gatebeam1, drawlocation);
for(int landerloop = 0; landerloop<landermax; landerloop++){ radar_plot(landers[landerloop], drawlocation); };
for(int crazyloop = 0; crazyloop<landermax; crazyloop++){ radar_plot(crazies[crazyloop], drawlocation); };
for(int crawlerloop = 0; crawlerloop<crawlermax; crawlerloop++){ radar_plot(crawlers[crawlerloop], drawlocation); };
+ radar_plot(saucer, drawlocation);
radar_plot(player, drawlocation);
//alerts
score = score + 10;
};
};
+ //hurt/kill saucer
+ if(saucer.active==1){
+ if((abs(player.y-saucer.y)<=40)&&(player.x==saucer.x)&&((player.face==0&&(saucer.y<player.y))||(player.face==1&&(saucer.y>player.y)))){
+ saucer.phase = saucer.phase - 5;
+ if(saucer.phase<=0){
+ //powerup?
+ if(rand()%1000>600){
+ for(int puploop = 0; puploop<4; puploop++){
+ if(powerups[puploop].active==0){
+ powerups[puploop] = powerup_init(powerups[puploop], saucer);
+ break;
+ };
+ };
+ };
+ saucer = object_out(saucer);
+ score = score + 100;
+ };
+ };
+ };
laser--;
} else {
//get next inactive bullet, give it player's direction, speed, height, location +speed in direction, active, set vtime=1.
score = score + 20;
};
};
+ if(saucer.active==1){
+ if(abs(player.y-saucer.y)<=40){
+ saucer.phase = saucer.phase - 5;
+ if(saucer.phase<=0){
+ saucer = object_out(saucer);
+ score = score + 100;
+ };
+ };
+ };
};
//for each active bullet
};
};
};
+ //check each active crawler
for(int crawlerloop = 0; crawlerloop<crawlermax; crawlerloop++){
if(crawlers[crawlerloop].active==1){
if(check_collision(bullets[bulletloop], crawlers[crawlerloop])==1){
};
};
};
+ //check saucer
+ if(saucer.active==1){
+ if(check_collision(bullets[bulletloop], saucer)==1){
+ //kill hurt or kill saucer, kill bullet
+ saucer.phase = saucer.phase - 1;
+ if(saucer.phase<=0){
+ //powerup?
+ if(rand()%1000>600){
+ for(int puploop = 0; puploop<4; puploop++){
+ if(powerups[puploop].active==0){
+ powerups[puploop] = powerup_init(powerups[puploop], saucer);
+ break;
+ };
+ };
+ };
+ saucer = object_out(saucer);
+ bullets[bulletloop].vtime = 100;
+ bullets[bulletloop] = age_bullet(bullets[bulletloop]);
+ //add to score
+ score = score + 100;
+ };
+ };
+ };
};
};
};
};
+ //watch for saucer/player collisions
+ if(saucer.active == 1){
+
+ if(check_collision(player, saucer)==1){
+ //kill player only
+ lives--;
+ life_loss(lives, score);
+ player = player_init(player);
+ drawlocation = player.y-20;
+ //kill any carried pods
+ if(pod_in>0){
+ for(int podloop = 0; podloop<podmax; podloop++){
+ if(pods[podloop].number==pod_in){
+ pods[podloop] = object_out(pods[podloop]);
+ pod_in = 0;
+ strcpy (player.line0, "<==_>");
+ strcpy (player.line1, "<_==>");
+ };
+ };
+ };
+ };
+ //Shields don't hurt the saucer! Tee hee. . .
+ };
+
// Lander shots
for(int landerloop = 0; landerloop<landermax; landerloop++){
if(landers[landerloop].active==1&&landers[landerloop].chase<=0){
};
};
+ // saucer shots
+ if(saucer.active==1){
+ if(rand()%1000>600){
+ // saucer shoot
+ for(int saucershotloop = 0; saucershotloop<landershotmax; saucershotloop++){
+ if(landershot[saucershotloop].active==0){
+ int multiplier = 1;
+ landershot[saucershotloop].active=1;
+ //set direction
+ if(player.y<saucer.y){
+ if(player.x<saucer.x){ landershot[saucershotloop].direction = 7; };
+ if(player.x==saucer.x){ landershot[saucershotloop].direction = 4; };
+ if(player.x>saucer.x){ landershot[saucershotloop].direction = 1; };
+ //set multipler based on direction
+ multiplier = -1;
+ };
+ if(player.y>=saucer.y){
+ if(player.x<saucer.x){ landershot[saucershotloop].direction = 9; };
+ if(player.x==saucer.x){ landershot[saucershotloop].direction = 6; };
+ if(player.x>saucer.x){ landershot[saucershotloop].direction = 3; };
+ };
+ landershot[saucershotloop].speed = saucer.speed;
+ landershot[saucershotloop].x = saucer.x;
+ landershot[saucershotloop].y = saucer.y + (saucer.speed * multiplier);
+ landershot[saucershotloop].vtime = 1;
+ break;
+ };
+ };
+ };
+ };
+
//for each active lander shot
for(int landershotloop = 0; landershotloop<landershotmax; landershotloop++){
if(landershot[landershotloop].active==1){
crawlercount = 0;
for(int crawlerloop = 0; crawlerloop<crawlermax; crawlerloop++){ crawlercount = crawlercount + crawlers[crawlerloop].active; };
if(crazycount<=0&&crawlercount<=0){
- if(podsin>0&&landercount<=0){
+ if(podsin>0&&landercount<=0&&saucer.active==0){
//Tally bonuses
//Award lives, if any
if(lives<4){lives++;};
crawlers[crawlerloop] = crawler_init(crawlers[crawlerloop]);
};
};
+ //Gen saucer
+ if(level==4){
+ saucer = saucer_init(saucer);
+ };
};
if(podsin<=0&&landercount>0){
//crazy the landers