Adde saucer boss, level 4.
authorlimb <limb@bc5cbbab-a4ec-0310-bb52-ff3d296db539>
Thu, 5 Apr 2007 18:36:47 +0000 (18:36 +0000)
committerlimb <limb@bc5cbbab-a4ec-0310-bb52-ff3d296db539>
Thu, 5 Apr 2007 18:36:47 +0000 (18:36 +0000)
git-svn-id: svn+ssh://svn/var/repos/curfender@645 bc5cbbab-a4ec-0310-bb52-ff3d296db539

CHANGELOG
main.cpp

index ff33cc3..6774949 100644 (file)
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,4 @@
+Added saucer boss, level 4.
 Added crawlers, which can shoot and are affected by all weapons.  No pod interaction.
 Added static markers on ground for frame of reference.
 Added laser (Z) powerup.
index cabb771..e9d3cc8 100644 (file)
--- a/main.cpp
+++ b/main.cpp
@@ -55,7 +55,7 @@ struct game_object {
   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
@@ -167,6 +167,21 @@ game_object object_out(game_object object){
   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; };
@@ -395,6 +410,22 @@ game_object crawler_init(game_object crawler){
   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;
@@ -981,6 +1012,22 @@ int main(){
     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
@@ -1196,6 +1243,11 @@ int main(){
       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);
 
@@ -1289,6 +1341,8 @@ int main(){
       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);
@@ -1298,6 +1352,7 @@ int main(){
     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
@@ -1478,6 +1533,25 @@ int main(){
            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.
@@ -1561,6 +1635,15 @@ int main(){
          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
@@ -1621,6 +1704,7 @@ int main(){
            };
          };
        };
+       //check each active crawler
        for(int crawlerloop = 0; crawlerloop<crawlermax; crawlerloop++){
          if(crawlers[crawlerloop].active==1){
            if(check_collision(bullets[bulletloop], crawlers[crawlerloop])==1){
@@ -1642,6 +1726,29 @@ int main(){
            };
          };
        };
+       //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;
+           };
+         };
+       };
       };
     };
     
@@ -1750,6 +1857,30 @@ int main(){
       };
     };
 
+    //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){
@@ -1849,6 +1980,37 @@ int main(){
       };
     };
 
+    // 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){ 
@@ -1922,7 +2084,7 @@ int main(){
       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++;};
@@ -1965,6 +2127,10 @@ int main(){
              crawlers[crawlerloop] = crawler_init(crawlers[crawlerloop]);
            };
          };
+         //Gen saucer
+         if(level==4){
+           saucer = saucer_init(saucer);
+         };
        };
        if(podsin<=0&&landercount>0){
          //crazy the landers