SPYSpheres
ZRItems.cpp
Go to the documentation of this file.
00001 #include <string.h>
00002 #include <math.h>
00003 #include <cstdlib>
00004 #include "ZRGame.h"
00005 #include "ZRGameInternal.h"
00006 
00007 /*#ifdef ZRSIMULATION
00008 #include "mex.h"
00009 #define GAME_TRACE(arg) DEBUG(arg)
00010 #else
00011 #define GAME_TRACE(arg)
00012 #endif*/
00013 
00014 
00015 void ZeroRoboticsGameImpl::initItems(){
00016   #ifndef ALLIANCE
00017   for(int i = 0; i<NUM_ITEMS; i++)
00018   {
00019     challInfo.me.mpTime[i]    = MP_EMPTY;
00020     challInfo.other.mpTime[i] = MP_EMPTY;
00021     for(int j = 0; j<3; j++)
00022       challInfo.mpLoc[i][j] = ITEM_LOC[i][j];
00023   }
00024   #else
00025   float r = (float) (rand() % 10000) / (10000.0);
00026   challInfo.mpLoc[0][0] = r * 0.25f + 0.05;
00027   r = (float) (rand() % 10000) / (10000.0);
00028   challInfo.mpLoc[0][1] = r * 0.3f;
00029   r = (float) (rand() % 10000) / (10000.0);
00030   challInfo.mpLoc[0][2] = r * 0.5f;
00031 
00032   challInfo.mpLoc[1][0] = -challInfo.mpLoc[0][0];
00033   challInfo.mpLoc[1][1] = challInfo.mpLoc[0][1];
00034   challInfo.mpLoc[1][2] = challInfo.mpLoc[0][2];
00035 
00036   challInfo.mpLoc[2][0] = 0.0f;
00037   r = (float) (rand() % 10000) / (10000.0);
00038   challInfo.mpLoc[2][1] = r * 0.3f;
00039   r = (float) (rand() % 10000) / (10000.0);
00040   challInfo.mpLoc[2][2] = r * 0.5f;
00041 
00042   r = (float) (rand() % 10000) / (10000.0);
00043   challInfo.mpLoc[3][0] = r * 0.25f + 0.05f;
00044   r = (float) (rand() % 10000) / (10000.0);
00045   challInfo.mpLoc[3][1] = r * 0.2f + 0.4;
00046   r = (float) (rand() % 10000) / (10000.0);
00047   challInfo.mpLoc[3][2] = r - 0.5f;
00048 
00049   challInfo.mpLoc[4][0] = -challInfo.mpLoc[3][0];
00050   challInfo.mpLoc[4][1] = challInfo.mpLoc[3][1];
00051   challInfo.mpLoc[4][2] = challInfo.mpLoc[3][2];
00052 
00053   r = (float) (rand() % 10000) / (10000.0);
00054   challInfo.mpLoc[5][0] = r * 0.25f + 0.05f;
00055   r = (float) (rand() % 10000) / (10000.0);
00056   challInfo.mpLoc[5][1] = r * 0.2f + 0.4;
00057   r = (float) (rand() % 10000) / (10000.0);
00058   challInfo.mpLoc[5][2] = r - 0.5f;
00059 
00060   challInfo.mpLoc[6][0] = -challInfo.mpLoc[5][0];
00061   challInfo.mpLoc[6][1] = challInfo.mpLoc[5][1];
00062   challInfo.mpLoc[6][2] = challInfo.mpLoc[5][2];
00063 
00064   r = (float) (rand() % 10000) / (10000.0);
00065   challInfo.mpLoc[7][0] = r * 0.2f + 0.3;
00066   r = (float) (rand() % 10000) / (10000.0);
00067   challInfo.mpLoc[7][1] = r * 0.3f;
00068   r = (float) (rand() % 10000) / (10000.0);
00069   challInfo.mpLoc[7][2] = r * 0.2f - 0.5f;
00070 
00071   challInfo.mpLoc[8][0] = -challInfo.mpLoc[7][0];
00072   challInfo.mpLoc[8][1] = challInfo.mpLoc[7][1];
00073   challInfo.mpLoc[8][2] = challInfo.mpLoc[7][2];
00074 
00075   for(int i = 0; i<NUM_ITEMS; i++)
00076   {
00077     challInfo.me.mpTime[i]    = MP_EMPTY;
00078     challInfo.other.mpTime[i] = MP_EMPTY;
00079     //printf("Item %d at (%f,%f,%f)\n", i, challInfo.mpLoc[i][0], challInfo.mpLoc[i][1], challInfo.mpLoc[i][2]);
00080   }
00081   #endif
00082   challInfo.me.mirrors = STARTING_MIRRORS;
00083   challInfo.me.mirrorTime = 0;
00084   challInfo.other.mirrorTime = 0;
00085 
00086 }
00087 
00088 int ZeroRoboticsGame::hasItem(int itemID){
00089   int a = -1;
00090   if (pimpl.challInfo.me.mpTime[itemID] != MP_EMPTY)
00091     a = 0;
00092   if (pimpl.challInfo.other.mpTime[itemID] != MP_EMPTY)
00093     a = 1;
00094   return a;
00095 }
00096 
00097 int ZeroRoboticsGame::getNumItem() {
00098   return NUM_ITEMS;
00099 }
00100 
00101 void ZeroRoboticsGame::getItemLoc(float pos[], int itemID) {
00102   memcpy(pos, pimpl.challInfo.mpLoc[itemID], 3 * sizeof(float));
00103 }
00104 
00105 int ZeroRoboticsGame::getItemType(int itemID) {
00106   if (itemID < NUM_ITEMS) return ITEM_TYPES[itemID];
00107   return -1; // Error
00108 }
00109 
00110 bool ZeroRoboticsGame::useMirror()
00111 {
00112   if(pimpl.challInfo.me.mirrors > 0){
00113     pimpl.challInfo.me.mirrors -= 1;
00114     pimpl.challInfo.me.mirrorTime = pimpl.challInfo.currentTime;
00115     return true;
00116   }
00117   return false;
00118 }
00119 
00120 int ZeroRoboticsGame::getMirrorTimeRemaining()
00121 {
00122   int mirrorEnd = pimpl.challInfo.me.mirrorTime + ITEM_MIRROR_DURATION;
00123   int timeLeft = mirrorEnd - pimpl.challInfo.currentTime;
00124   if(timeLeft > 0 && pimpl.challInfo.me.mirrorTime != 0)
00125     return timeLeft;
00126   return 0;
00127 }
00128 
00129 int ZeroRoboticsGame::getNumMirrorsHeld()
00130 {
00131   return pimpl.challInfo.me.mirrors;
00132 }
00133 
00134 
00135 bool ZeroRoboticsGameImpl::itemPickUp(int mpNum)
00136 {
00137   /*
00138   This function will replicate that of the 2013 game's item PickUp function with
00139   a few minor changes.
00140   */
00141 
00142   state_vector sphState;
00143   apiImpl.api->getMySphState(sphState);
00144   float dist,speed;
00145   dist = dist3d(sphState, challInfo.mpLoc[mpNum]);
00146   speed = mathVecMagnitude(&sphState[3],3);           // VEL_X needs to be changed. - 3
00147   if (speed<MP_SPEED && dist<=MP_RADIUS)
00148   {
00149     if (challInfo.me.mpTime[mpNum] == MP_EMPTY && challInfo.other.mpTime[mpNum] == MP_EMPTY){
00150       challInfo.me.mpTime[mpNum] = apiImpl.api->getTime();
00151       switch (ITEM_TYPES[mpNum]){
00152         case ITEM_TYPE_ADD_SCORE : {challInfo.me.score = challInfo.me.score + ITEM_SCORE;
00153                   GAME_TRACE(("Score item picked up"));
00154                   break;
00155               }
00156         /*case ITEM_TYPE_ADD_MEMORY : {challInfo.camera.memorySize = challInfo.camera.memorySize + ITEM_MEMORY_SIZE;
00157                   GAME_TRACE(("memory item picked up"));
00158                   break;} */
00159         case ITEM_TYPE_ADD_ENERGY: {challInfo.me.energy = challInfo.me.energy + ITEM_ENERGY;
00160                   if (challInfo.me.energy > MAX_ENERGY) {
00161                     challInfo.me.energy = MAX_ENERGY;
00162                   }
00163                   GAME_TRACE(("energy item picked up"));
00164                   break;}
00165         case ITEM_TYPE_MIRROR:{  challInfo.me.mirrors += 1;
00166                 GAME_TRACE(("Mirror picked up"));
00167                 break;
00168               }
00169       }
00170       GAME_TRACE(("score: %f, energy: %f, memorySize: %d", challInfo.me.score, challInfo.me.energy, challInfo.camera.memorySize));
00171 
00172 
00173 
00174 
00175     }
00176 /*
00177     if (!challInfo.me.acquiringMP[mpNum] && mathVecMagnitude(&sphState[RATE_X],3) <= MAX_START_MP)
00178     {
00179       challInfo.me.acquiringMP[mpNum] = true;
00180       memcpy(challInfo.me.initQuat,&sphState[QUAT_1],4*sizeof(float));
00181     }
00182     if (challInfo.me.acquiringMP[mpNum] && fabsf(mathVecInner(challInfo.me.initQuat,&sphState[QUAT_1],4)) < MP_ROTATION_ANGLE)
00183     {
00184       challInfo.me.acquiringMP[mpNum] = false;
00185       //Check for item pickup: item not already picked up by either player,
00186       //and item conditions have been met
00187       if (challInfo.me.mpTime[mpNum] == MP_EMPTY && challInfo.other.mpTime[mpNum] == MP_EMPTY)
00188       {
00189         //Record pickup time with game time
00190         challInfo.me.mpTime[mpNum] = apiImpl.api->getTime();
00191         //challInfo.camera.memorySize++;
00192         challInfo.me.score = challInfo.me.score + ITEM_SCORE;
00193         GAME_TRACE(("[%d] picked up item %d | ", apiImpl.api->getTime(), mpNum));
00194       }
00195     }
00196 */
00197   }
00198   else
00199   {
00200     challInfo.me.acquiringMP[mpNum] = false;
00201   }
00202   return false;
00203 
00204   // return true;
00205 }