SPYSpheres
|
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 }