📄 worldmodel.cpp
字号:
isGoalie = true; } if (teamId == TID_UNKNOWN) // Quarter { for (i = 0; i < QUARTER_PLAYERS_NUM; i++) if (!quarterPlayers[i]->isValid() && !quarterPlayers[i]->isReadyToUpdate()) break; if (i < QUARTER_PLAYERS_NUM) quarterPlayers[i]->parse(teamId, uniNum, isGoalie, exp, getCurTime()); } else if (uniNum == 0) // Half { for (i = 0; i < HALF_PLAYERS_NUM; i++) if (!halfPlayers[teamId][i]->isValid() && !halfPlayers[teamId][i]->isReadyToUpdate()) break; if (i < HALF_PLAYERS_NUM) halfPlayers[teamId][i]->parse(teamId, uniNum, isGoalie, exp, getCurTime()); } else // Full { assert(uniNum <= FULL_PLAYERS_NUM); fullPlayers[teamId][uniNum - 1]->parse(teamId, uniNum, isGoalie, exp, getCurTime()); }}void WorldModel::resetObjects(){ unsigned i; flagsNum = 0; goalsNum = 0; linesNum = 0; // Reading to parse objects ball->setReadyToUpdate(false); for (i = 0; i < FULL_PLAYERS_NUM; i++) fullPlayers[TID_TEAMMATE][i]->setReadyToUpdate(false); for (i = 0; i < FULL_PLAYERS_NUM; i++) fullPlayers[TID_OPPONENT][i]->setReadyToUpdate(false); for (i = 0; i < HALF_PLAYERS_NUM; i++) halfPlayers[TID_TEAMMATE][i]->setReadyToUpdate(false); for (i = 0; i < HALF_PLAYERS_NUM; i++) halfPlayers[TID_OPPONENT][i]->setReadyToUpdate(false); for (i = 0; i < QUARTER_PLAYERS_NUM; i++) quarterPlayers[i]->setReadyToUpdate(false); // Killing a few players for (i = 0; i < QUARTER_PLAYERS_NUM; i++) quarterPlayers[i]->kill(); for (i = 0; i < HALF_PLAYERS_NUM; i++) { if (halfPlayers[TID_TEAMMATE][i]->isAlive() && halfPlayers[TID_TEAMMATE][i]->canBodySee(body->getPos(), body->getViewAngle(), body->getVisibleDistance())) halfPlayers[TID_TEAMMATE][i]->kill(); if (halfPlayers[TID_OPPONENT][i]->isAlive() && halfPlayers[TID_OPPONENT][i]->canBodySee(body->getPos(), body->getViewAngle(), body->getVisibleDistance())) halfPlayers[TID_OPPONENT][i]->kill(); }}void WorldModel::replaceBodyInPlayersList(unsigned bodyUniNum){ delete fullPlayers[TID_TEAMMATE][bodyUniNum - 1]; fullPlayers[TID_TEAMMATE][bodyUniNum - 1] = body; setBodyReplaced(true);}void WorldModel::updateObjects(){ unsigned i; for (i = 0; i < flagsNum; i++) flags[i]->update(fieldData); for (i = 0; i < goalsNum; i++) goals[i]->update(fieldData); for (i = 0; i < linesNum; i++) lines[i]->update(fieldData); body->update(flags, goals, lines, flagsNum, goalsNum, linesNum); if (ball->isReadyToUpdate()) ball->update(*body); else if (ball->isValid()) ball->virtualUpdate(*body); for (i = 0; i < FULL_PLAYERS_NUM; i++) if (fullPlayers[TID_TEAMMATE][i]->isReadyToUpdate()) fullPlayers[TID_TEAMMATE][i]->update(*body, playMode); else if (i != body->getUniNum() - 1 && // this function do not virtual update body. fullPlayers[TID_TEAMMATE][i]->isAlive()) fullPlayers[TID_TEAMMATE][i]->virtualUpdate(*body); for (i = 0; i < FULL_PLAYERS_NUM; i++) if (fullPlayers[TID_OPPONENT][i]->isReadyToUpdate()) fullPlayers[TID_OPPONENT][i]->update(*body, playMode); else if (fullPlayers[TID_OPPONENT][i]->isAlive()) fullPlayers[TID_OPPONENT][i]->virtualUpdate(*body); for (i = 0; i < HALF_PLAYERS_NUM; i++) if (halfPlayers[TID_TEAMMATE][i]->isReadyToUpdate()) halfPlayers[TID_TEAMMATE][i]->update(*body, playMode); else if (halfPlayers[TID_TEAMMATE][i]->isValid()) halfPlayers[TID_TEAMMATE][i]->virtualUpdate(*body); for (i = 0; i < HALF_PLAYERS_NUM; i++) if (halfPlayers[TID_OPPONENT][i]->isReadyToUpdate()) halfPlayers[TID_OPPONENT][i]->update(*body, playMode); else if (halfPlayers[TID_OPPONENT][i]->isValid()) halfPlayers[TID_OPPONENT][i]->virtualUpdate(*body); for (i = 0; i < QUARTER_PLAYERS_NUM; i++) if (quarterPlayers[i]->isReadyToUpdate()) quarterPlayers[i]->update(*body, playMode); else if (quarterPlayers[i]->isValid()) quarterPlayers[i]->virtualUpdate(*body); completeUpdateObjects();}void WorldModel::simulateObjects(const Body &lastBody, const Command *bodyCycleCommand){ unsigned i; if (getPlayMode() == PM_FREE_KICK && getVirtualPlayMode() == VPM_GOALIE_CATCH_BALL && body->isGoalie()) ball->simulateByAction(lastBody, bodyCycleCommand, true); else ball->simulateByAction(lastBody, bodyCycleCommand); ball->simulateByDynamics(*body, 2, ballStatus, curTime); for (i = 0; i < FULL_PLAYERS_NUM; i++) if (i != body->getUniNum() - 1 && // this function do not simulate body. fullPlayers[TID_TEAMMATE][i]->isAlive()) fullPlayers[TID_TEAMMATE][i]->simulateByDynamics(*body); for (i = 0; i < FULL_PLAYERS_NUM; i++) if (fullPlayers[TID_OPPONENT][i]->isAlive()) fullPlayers[TID_OPPONENT][i]->simulateByDynamics(*body); for (i = 0; i < HALF_PLAYERS_NUM; i++) if (halfPlayers[TID_TEAMMATE][i]->isValid()) halfPlayers[TID_TEAMMATE][i]->simulateByDynamics(*body); for (i = 0; i < HALF_PLAYERS_NUM; i++) if (halfPlayers[TID_OPPONENT][i]->isValid()) halfPlayers[TID_OPPONENT][i]->simulateByDynamics(*body); for (i = 0; i < QUARTER_PLAYERS_NUM; i++) if (quarterPlayers[i]->isValid()) quarterPlayers[i]->simulateByDynamics(*body);}void WorldModel::completeUpdateObjects(){ int i, j; Player *playerPtr; // Removing same Halves for (i = 0; i < HALF_PLAYERS_NUM; i++) { // Teammates if (halfPlayers[TID_TEAMMATE][i]->isValid() && halfPlayers[TID_TEAMMATE][i]->getSeeTime() != getCurTime()) { playerPtr = NULL; for (j = 0; j < HALF_PLAYERS_NUM; j++) if (halfPlayers[TID_TEAMMATE][j]->isValid() && halfPlayers[TID_TEAMMATE][j]->getSeeTime() == getCurTime() && halfPlayers[TID_TEAMMATE][j]->getDistance(*halfPlayers[TID_TEAMMATE][i]) <= halfPlayers[TID_TEAMMATE][j]->getPosDeviation() + halfPlayers[TID_TEAMMATE][i]->getPosDeviation() + 1) // One meter for sure { if (!playerPtr) playerPtr = halfPlayers[TID_TEAMMATE][j]; else { playerPtr = NULL; break; } } if (playerPtr) { for (j = 0; j < HALF_PLAYERS_NUM; j++) if (i != j && halfPlayers[TID_TEAMMATE][j]->isValid() && halfPlayers[TID_TEAMMATE][j]->getSeeTime() != getCurTime() && halfPlayers[TID_TEAMMATE][j]->getDistance(*playerPtr) <= halfPlayers[TID_TEAMMATE][j]->getPosDeviation() + playerPtr->getPosDeviation() + 1) // One meter for sure { j = -1; break; } if (j != -1) halfPlayers[TID_TEAMMATE][i]->kill(); } } // Opponents if (halfPlayers[TID_OPPONENT][i]->isValid() && halfPlayers[TID_OPPONENT][i]->getSeeTime() != getCurTime()) { playerPtr = NULL; for (j = 0; j < HALF_PLAYERS_NUM; j++) if (halfPlayers[TID_OPPONENT][j]->isValid() && halfPlayers[TID_OPPONENT][j]->getSeeTime() == getCurTime() && halfPlayers[TID_OPPONENT][j]->getDistance(*halfPlayers[TID_OPPONENT][i]) <= halfPlayers[TID_OPPONENT][j]->getPosDeviation() + halfPlayers[TID_OPPONENT][i]->getPosDeviation() + 1) // One meter for sure { if (!playerPtr) playerPtr = halfPlayers[TID_OPPONENT][j]; else { playerPtr = NULL; break; } } if (playerPtr) { for (j = 0; j < HALF_PLAYERS_NUM; j++) if (i != j && halfPlayers[TID_OPPONENT][j]->isValid() && halfPlayers[TID_OPPONENT][j]->getSeeTime() != getCurTime() && halfPlayers[TID_OPPONENT][j]->getDistance(*playerPtr) <= halfPlayers[TID_OPPONENT][j]->getPosDeviation() + playerPtr->getPosDeviation() + 1) // One meter for sure { j = -1; break; } if (j != -1) halfPlayers[TID_OPPONENT][i]->kill(); } } } // Changing Quarters to Halves for (i = 0; i < QUARTER_PLAYERS_NUM; i++) if (quarterPlayers[i]->isValid()) { playerPtr = NULL; for (j = 0; j < HALF_PLAYERS_NUM; j++) { // Teammates if (halfPlayers[TID_TEAMMATE][j]->isValid() && halfPlayers[TID_TEAMMATE][j]->getSeeTime() != getCurTime() && halfPlayers[TID_TEAMMATE][j]->getDistance(*quarterPlayers[i]) <= halfPlayers[TID_TEAMMATE][j]->getPosDeviation() + quarterPlayers[i]->getPosDeviation() + 1) // One meter for sure { if (playerPtr == NULL) playerPtr = halfPlayers[TID_TEAMMATE][j]; else { playerPtr = NULL; break; } } // Opponents if (halfPlayers[TID_OPPONENT][j]->isValid() && halfPlayers[TID_OPPONENT][j]->getSeeTime() != getCurTime() && halfPlayers[TID_OPPONENT][j]->getDistance(*quarterPlayers[i]) <= halfPlayers[TID_OPPONENT][j]->getPosDeviation() + quarterPlayers[i]->getPosDeviation() + 1) // One meter for sure { if (playerPtr == NULL) playerPtr = halfPlayers[TID_OPPONENT][j]; else { playerPtr = NULL; break; } } } if (playerPtr != NULL) { for (j = 0; j < QUARTER_PLAYERS_NUM; j++) if (i != j && quarterPlayers[j]->isValid() && quarterPlayers[j]->getDistance(*playerPtr) <= quarterPlayers[j]->getPosDeviation() + playerPtr->getPosDeviation() + 1) // One meter for sure { j = -1; break; } if (j != -1) { playerPtr->setByAnotherPlayer(*quarterPlayers[i], *body); quarterPlayers[i]->kill(); } } } // Changing Quarters to Fulls for (i = 0; i < QUARTER_PLAYERS_NUM; i++) if (quarterPlayers[i]->isValid()) { playerPtr = NULL; for (j = 0; j < FULL_PLAYERS_NUM; j++) { // Teammates if (fullPlayers[TID_TEAMMATE][j]->isAlive() && !fullPlayers[TID_TEAMMATE][j]->isBody() && fullPlayers[TID_TEAMMATE][j]->getSeeTime() != getCurTime() && fullPlayers[TID_TEAMMATE][j]->getDistance(*quarterPlayers[i]) <= fullPlayers[TID_TEAMMATE][j]->getPosDeviation() + quarterPlayers[i]->getPosDeviation() + 1) // One meter for sure { if (playerPtr == NULL) playerPtr = fullPlayers[TID_TEAMMATE][j]; else { playerPtr = NULL; break; } } // Opponents if (fullPlayers[TID_OPPONENT][j]->isAlive() && fullPlayers[TID_OPPONENT][j]->getSeeTime() != getCurTime() && fullPlayers[TID_OPPONENT][j]->getDistance(*quarterPlayers[i]) <= fullPlayers[TID_OPPONENT][j]->getPosDeviation() + quarterPlayers[i]->getPosDeviation() + 1) // One meter for sure { if (playerPtr == NULL) playerPtr = fullPlayers[TID_OPPONENT][j]; else { playerPtr = NULL; break; } } } if (playerPtr != NULL) { for (j = 0; j < QUARTER_PLAYERS_NUM; j++) if (i != j && quarterPlayers[j]->isValid() && quarterPlayers[j]->getDistance(*playerPtr) <= quarterPlayers[j]->getPosDeviation() + playerPtr->getPosDeviation() + 1) // One meter for sure { j = -1; break; } if (j != -1) { playerPtr->setByAnotherPlayer(*quarterPlayers[i], *body); quarterPlayers[i]->kill();//LOG << "Tran qua to " << playerPtr->getTeamId() << " " << playerPtr->getUniNum() << endl;//LOG << "qu ti: " << quarterPlayers[i]->getSeeTime() << " fu ti: " << playerPtr->getSeeTime() << " cur ti: " << curTime << endl; } } } // Changing Halves to Fulls for (i = 0; i < HALF_PLAYERS_NUM; i++) { // Teammates if (halfPlayers[TID_TEAMMATE][i]->isValid()) { playerPtr = NULL; for (j = 0; j < FULL_PLAYERS_NUM; j++) if (fullPlayers[TID_TEAMMATE][j]->isAlive() && !fullPlayers[TID_TEAMMATE][j]->isBody() && fullPlayers[TID_TEAMMATE][j]->getSeeTime() != getCurTime() && fullPlayers[TID_TEAMMATE][j]->getDistance(*halfPlayers[TID_TEAMMATE][i]) <= fullPlayers[TID_TEAMMATE][j]->getPosDeviation() + halfPlayers[TID_TEAMMATE][i]->getPosDeviation() + 1) // One meter for sure { if (playerPtr == NULL) playerPtr = fullPlayers[TID_TEAMMATE][j]; else { playerPtr = NULL; break; } } if (playerPtr != NULL) { for (j = 0; j < HALF_PLAYERS_NUM; j++) if (i != j && halfPlayers[TID_TEAMMATE][j]->isValid() && halfPlayers[TID_TEAMMATE][j]->getDistance(*playerPtr) <= halfPlayers[TID_TEAMMATE][j]->getPosDeviation() + playerPtr->getPosDeviation() + 1) // One meter for sure { j = -1; break; } if (j != -1) { playerPtr->setByAnotherPlayer(*halfPlayers[TID_TEAMMATE][i], *body); halfPlayers[TID_TEAMMATE][i]->kill(); } } } // Opponents if (halfPlayers[TID_OPPONENT][i]->isValid()) { playerPtr = NULL; for (j = 0; j < FULL_PLAYERS_NUM; j++) if (fullPlayers[TID_OPPONENT][j]->isAlive() && fullPlayers[TID_OPPONENT][j]->getSeeTime() != getCurTime() && fullPlayers[TID_OPPONENT][j]->getDistance(*halfPlayers[TID_OPPONENT][i]) <= fullPlayers[TID_OPPONENT][j]->getPosDeviation() + halfPlayers[TID_OPPONENT][i]->getPosDeviation() + 1) // One meter for sure { if (playerPtr == NULL) playerPtr = fullPlayers[TID_OPPONENT][j]; else { playerPtr = NULL; break; } } if (playerPtr != NULL) { for (j = 0; j < HALF_PLAYERS_NUM; j++) if (i != j && halfPlayers[TID_OPPONENT][j]->isValid() && halfPlayers[TID_OPPONENT][j]->getDistance(*playerPtr) <= halfPlayers[TID_OPPONENT][j]->getPosDeviation() + playerPtr->getPosDeviation() + 1) // One meter for sure { j = -1; break; } if (j != -1) { playerPtr->setByAnotherPlayer(*halfPlayers[TID_OPPONENT][i], *body); halfPlayers[TID_OPPONENT][i]->kill(); } } } } // Players change place for (i = 0; i < FULL_PLAYERS_NUM; i++) { if (fullPlayers[TID_TEAMMATE][i]->isAlive() && !fullPlayers[TID_TEAMMATE][i]->isBody() && fullPlayers[TID_TEAMMATE][i]->getSeeTime() != getCurTime()) { putOutOfVisibleDistance(*fullPlayers[TID_TEAMMATE][i]); if (fabs(fullPlayers[TID_TEAMMATE][i]->getHeadVec().getDirection()) < body->getViewAngle() - CHANGE_PLACE_SURE_ANGLE && fullPlayers[TID_TEAMMATE][i]->getAbsVec().getMagnitude() < UNUM_FAR_LENGTH - CHANGE_PLACE_SURE_DIST)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -