Advertisement
Guest User

Untitled

a guest
Nov 19th, 2017
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 6.51 KB | None | 0 0
  1. float myZRState[12], myPos[3], positionA[2], positionB[3], positionC[3], positionD[3], attitude[3], att[3], vector[3],
  2.       height, min, distance, vel, angVel;
  3. int counter, step, br, geyser, n, p, k;
  4.  
  5. void init(){
  6.     //This function is called once when your code is first loaded.
  7.     attitude[0] = 0.0f;
  8.     attitude[1] = 0.0f;
  9.     attitude[2] = -1.0f;
  10.     positionA[2] = 0.26f;
  11.     positionB[2] = 0.26f;
  12.     positionC[0] = 0.0f;
  13.     positionC[1] = 0.0f;
  14.     positionC[2] = 0.0f;
  15.     counter = 0;
  16.     step = 0;
  17.     geyser = 0;
  18.     p = 0;
  19.     k = 0;
  20.     //IMPORTANT: make sure to set any variables that need an initial value.
  21.     //Do not assume variables will be set to 0 automatically!
  22. }
  23.  
  24. void loop(){
  25.     api.getMyZRState(myZRState);
  26.     att[0] = myZRState[6];
  27.     att[1] = myZRState[7];
  28.     att[2] = 0.0f;
  29.     mathVecNormalize(att, 3);
  30.     for (int i = 0; i < 3; i++)
  31.     {
  32.         myPos[i] = myZRState[i];
  33.     }
  34.     if (counter == 0)
  35.     {
  36.         if (myZRState[0] > 0)
  37.         {
  38.             br = 1;
  39.         }
  40.         else
  41.         {
  42.             br = -1;
  43.         }
  44.         coordinates();
  45.         counter++;
  46.     }
  47.     if (step == 0 || step == 4)
  48.     {
  49.         api.setAttitudeTarget(att);
  50.         vel = sqrt(myZRState[3] * myZRState[3] + myZRState[4] * myZRState[4] + myZRState[5] * myZRState[5]);
  51.         angVel = sqrt(myZRState[9] * myZRState[9] + myZRState[10] * myZRState[10] + myZRState[11] * myZRState[11]);
  52.         move(1);
  53.         if ((myZRState[0] < (positionB[0] + 0.03f)) && (myZRState[0] > (positionB[0] - 0.03f)) && (vel < 0.01f) && (fabs(myZRState[8]) < 0.13f) &&
  54.             (myZRState[1] < (positionB[1] + 0.03f)) && (myZRState[1] > (positionB[1] - 0.03f)) && (myZRState[2] >= 0.255f) && (angVel < 0.04f))
  55.         {
  56.             step = 10;
  57.             geyser = 0;
  58.             n = 0;
  59.             p = 0;
  60.         }
  61.     }
  62.     else if (step == 9)
  63.     {
  64.         if (k < 4)
  65.         {
  66.             move(2);
  67.             k++;
  68.         }
  69.         else
  70.         {
  71.             move(4);
  72.         }
  73.         api.setAttitudeTarget(attitude);
  74.         if (game.atBaseStation() == 1)
  75.         {
  76.             for (int i = 0; i < 5; i++)
  77.             {
  78.                 game.dropSample(i);
  79.             }
  80.             coordinates();
  81.             step = 0;
  82.             geyser = 0;
  83.             k = 0;
  84.         }
  85.     }
  86.     else
  87.     {
  88.         if (geyser == 0)
  89.         {
  90.             drill();
  91.         }
  92.         if ((game.getDrills(myPos) == 3 && game.getNumSamplesHeld() == 4) || game.getNumSamplesHeld() == 5)
  93.         {
  94.             game.stopDrill();
  95.             step = 9;
  96.         }
  97.         else if (game.getDrills(myPos) == 3 || geyser == 1)
  98.         {
  99.             if (n == 0)
  100.             {
  101.                 coordinates();
  102.                 game.stopDrill();
  103.                 n++;
  104.             }
  105.             move(3);
  106.             if (geyser == 1)
  107.             {
  108.                 step -= 3;
  109.             }
  110.             else
  111.             {
  112.                 step = 4;
  113.             }
  114.         }
  115.     }
  116.     //This function is called once per second.  Use it to control the satellite.
  117. }
  118.  
  119. void coordinates()
  120. {
  121.     min = 1.0f;
  122.     for (int i = 0; i < 16; i++)
  123.     {
  124.         for (int j = 0; j < 10; j++)
  125.         {
  126.             positionA[0] = -0.6f + 0.08f * i;
  127.             positionA[1] = (0.04f + 0.08f * j) * br;
  128.             if (game.getDrills(positionA) > 0)
  129.             {
  130.                 continue;
  131.             }
  132.             height = game.getTerrainHeight(positionA);
  133.             if (height == 0.4f && (fabs(positionA[0]) > 0.16f || fabs(positionA[1]) > 0.16f))
  134.             {
  135.                 distance = sqrtf((positionA[0] - myZRState[0]) * (positionA[0] - myZRState[0]) +
  136.                                  (positionA[1] - myZRState[1]) * (positionA[1] - myZRState[1]));
  137.                 if (distance < min)
  138.                 {
  139.                     min = distance;
  140.                     positionB[0] = positionA[0];
  141.                     positionB[1] = positionA[1];
  142.                 }
  143.             }
  144.         }
  145.     }
  146. }
  147.  
  148. void drill()
  149. {
  150.     geyser = 0;
  151.     api.setPositionTarget(positionB);
  152.     if (game.getDrillEnabled() == 0)
  153.     {
  154.         game.startDrill();
  155.     }
  156.     if (game.getDrillError() == true)
  157.     {
  158.         game.stopDrill();
  159.         coordinates();
  160.         step = 4;
  161.     }
  162.     if (game.getDrillEnabled() == 1)
  163.     {
  164.         for (int i = 0; i < 3; i++)
  165.         {
  166.             positionD[i] = positionB[i];
  167.         }
  168.         mathVecCross(positionD, att, attitude);
  169.         mathVecNormalize(positionD, 3);
  170.         api.setAttitudeTarget(positionD);
  171.     }
  172.     if (game.checkSample() == 1)
  173.     {
  174.         game.pickupSample();
  175.         if (game.isGeyserHere(positionB) == true)
  176.         {
  177.             game.stopDrill();
  178.             geyser = 1;
  179.         }
  180.     }
  181. }
  182.  
  183. void move(int variant)
  184. {
  185.     switch (variant)
  186.     {
  187.     case 1:
  188.         mathVecSubtract(vector, positionB, myPos, 3);
  189.         if (api.getTime() < 20)
  190.         {
  191.             if (myZRState[5] < 0.03f && myZRState[2] < 0.1f)
  192.             {
  193.                 api.setVelocityTarget(vector);
  194.             }
  195.             else if (myZRState[2] > 0.15f)
  196.             {
  197.                 api.setPositionTarget(positionB);
  198.             }
  199.         }
  200.         else
  201.         {
  202.             if (((vel < 0.032f) && (p == 0 || p == 1) && (myZRState[5] < 0.02f) && (geyser == 1)) ||
  203.                 ((geyser == 0) && (p == 0 || p == 1) && (vel < 0.011f) && (step == 4)) ||
  204.                 ((step == 0) && (p == 0 || p == 1) && (vel < 0.02f)))
  205.             {
  206.                 api.setVelocityTarget(vector);
  207.                 p = 1;
  208.                 DEBUG(("YCKORENIE"));
  209.             }
  210.             else
  211.             {
  212.                 if (p == 1 && myZRState[2] > 0.24f && myZRState[5] > 0.0f)
  213.                 {
  214.                     DEBUG(("BLOKIROVKA"));
  215.                     p = 2;
  216.                 }
  217.                 api.setPositionTarget(positionB);
  218.                 DEBUG(("ZAMEDLENIE"));
  219.             }
  220.         }
  221.         break;
  222.     case 2:
  223.         mathVecSubtract(vector, positionC, myPos, 3);
  224.         api.setVelocityTarget(vector);
  225.         break;
  226.     case 3:
  227.         mathVecSubtract(vector, positionB, myPos, 3);
  228.         for (int i = 0; i < 3; i++)
  229.         {
  230.             vector[i] = vector[i] * 100;
  231.         }
  232.         api.setVelocityTarget(vector);
  233.         break;
  234.     case 4:
  235.         for (int i = 0; i < 3; i++)
  236.         {
  237.             positionC[i] = myZRState[i] * 0.2201f / mathVecMagnitude(myPos, 3);
  238.         }
  239.         api.setPositionTarget(positionC);
  240.         break;
  241.     }
  242. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement