- bugfixes to AI where workers harvesting think they have arrived but really did not.

This commit is contained in:
Mark Vejvoda 2010-10-19 04:38:55 +00:00
parent d96bf7f978
commit 182f2cd20d
5 changed files with 20 additions and 23 deletions

View File

@ -125,7 +125,7 @@ TravelState PathFinder::findPath(Unit *unit, const Vec2i &finalPos) {
} }
//route cache miss //route cache miss
TravelState ts= aStar(unit, finalPos); TravelState ts= aStar(unit, finalPos, false);
//post actions //post actions
switch(ts) { switch(ts) {
@ -142,7 +142,7 @@ TravelState PathFinder::findPath(Unit *unit, const Vec2i &finalPos) {
for(int bailoutY = -20; bailoutY <= 20 && ts == tsBlocked; ++bailoutY) { for(int bailoutY = -20; bailoutY <= 20 && ts == tsBlocked; ++bailoutY) {
const Vec2i newFinalPos = finalPos + Vec2i(bailoutX,bailoutY); const Vec2i newFinalPos = finalPos + Vec2i(bailoutX,bailoutY);
if(map->canMove(unit, unit->getPos(), newFinalPos)) { if(map->canMove(unit, unit->getPos(), newFinalPos)) {
ts= aStar(unit, newFinalPos); ts= aStar(unit, newFinalPos, true);
if(ts == tsMoving) { if(ts == tsMoving) {
unit->setInBailOutAttempt(false); unit->setInBailOutAttempt(false);
@ -173,10 +173,10 @@ TravelState PathFinder::findPath(Unit *unit, const Vec2i &finalPos) {
throw runtime_error("unsupported or missing path finder detected!"); throw runtime_error("unsupported or missing path finder detected!");
} }
} }
else if(ts == tsArrived) { //else if(ts == tsArrived) {
ts = aStar(unit, finalPos); // ts = aStar(unit, finalPos, true);
break; // break;
} //}
} }
} }
} }
@ -225,7 +225,7 @@ TravelState PathFinder::findPath(Unit *unit, const Vec2i &finalPos) {
// ==================== PRIVATE ==================== // ==================== PRIVATE ====================
//route a unit using A* algorithm //route a unit using A* algorithm
TravelState PathFinder::aStar(Unit *unit, const Vec2i &targetPos){ TravelState PathFinder::aStar(Unit *unit, const Vec2i &targetPos, bool inBailout) {
Chrono chrono; Chrono chrono;
chrono.start(); chrono.start();
@ -237,6 +237,7 @@ TravelState PathFinder::aStar(Unit *unit, const Vec2i &targetPos){
const Vec2i finalPos= computeNearestFreePos(unit, targetPos); const Vec2i finalPos= computeNearestFreePos(unit, targetPos);
//if arrived //if arrived
/*
if(finalPos == unit->getPos()) { if(finalPos == unit->getPos()) {
Command *command= unit->getCurrCommand(); Command *command= unit->getCurrCommand();
if(command == NULL || command->getPos() != unit->getPos()) { if(command == NULL || command->getPos() != unit->getPos()) {
@ -247,12 +248,13 @@ TravelState PathFinder::aStar(Unit *unit, const Vec2i &targetPos){
commandDesc = command->getCommandType()->toString(); commandDesc = command->getCommandType()->toString();
} }
char szBuf[1024]=""; char szBuf[1024]="";
sprintf(szBuf,"State: arrived#2 at pos: %s, command [%s]",targetPos.getString().c_str(),commandDesc.c_str()); sprintf(szBuf,"State: arrived#2 at pos: %s, command [%s] inBailout = %d",targetPos.getString().c_str(),commandDesc.c_str(),inBailout);
unit->setCurrentUnitTitle(szBuf); unit->setCurrentUnitTitle(szBuf);
} }
return tsArrived; return tsArrived;
} }
} }
*/
//path find algorithm //path find algorithm

View File

@ -71,7 +71,7 @@ public:
TravelState findPath(Unit *unit, const Vec2i &finalPos); TravelState findPath(Unit *unit, const Vec2i &finalPos);
private: private:
TravelState aStar(Unit *unit, const Vec2i &finalPos); TravelState aStar(Unit *unit, const Vec2i &finalPos, bool inBailout);
Node *newNode(); Node *newNode();
Vec2i computeNearestFreePos(const Unit *unit, const Vec2i &targetPos); Vec2i computeNearestFreePos(const Unit *unit, const Vec2i &targetPos);
float heuristic(const Vec2i &pos, const Vec2i &finalPos); float heuristic(const Vec2i &pos, const Vec2i &finalPos);

View File

@ -3788,8 +3788,12 @@ void Renderer::renderUnitTitles(Font2D *font, Vec3f color) {
for(int idx = 0; idx < renderUnitTitleList.size(); idx++) { for(int idx = 0; idx < renderUnitTitleList.size(); idx++) {
std::pair<Unit *,Vec3f> &unitInfo = renderUnitTitleList[idx]; std::pair<Unit *,Vec3f> &unitInfo = renderUnitTitleList[idx];
Unit *unit = unitInfo.first; Unit *unit = unitInfo.first;
if(unit != NULL && unitRenderedList.find(unit->getId()) == unitRenderedList.end()) {
string str = unit->getFullName() + " - " + intToStr(unit->getId()); const World *world= game->getWorld();
Unit *validUnit = world->findUnitById(unit->getId());
if(validUnit != NULL && unitRenderedList.find(validUnit->getId()) == unitRenderedList.end()) {
string str = validUnit->getFullName() + " - " + intToStr(validUnit->getId());
//get the screen coordinates //get the screen coordinates
Vec3f &screenPos = unitInfo.second; Vec3f &screenPos = unitInfo.second;
renderText(str, font, color, fabs(screenPos.x) + 5, fabs(screenPos.y) + 5, false); renderText(str, font, color, fabs(screenPos.x) + 5, fabs(screenPos.y) + 5, false);

View File

@ -458,22 +458,13 @@ void World::tick() {
} }
} }
Unit* World::findUnitById(int id){ Unit* World::findUnitById(int id) const {
for(int i= 0; i<getFactionCount(); ++i){ for(int i= 0; i<getFactionCount(); ++i){
Faction* faction= getFaction(i); const Faction* faction= getFaction(i);
Unit* unit = faction->findUnit(id); Unit* unit = faction->findUnit(id);
if(unit != NULL) { if(unit != NULL) {
return unit; return unit;
} }
/*
for(int j= 0; j<faction->getUnitCount(); ++j){
Unit* unit= faction->getUnit(j);
if(unit->getId()==id){
return unit;
}
}
*/
} }
return NULL; return NULL;
} }

View File

@ -174,7 +174,7 @@ public:
//misc //misc
void update(); void update();
Unit* findUnitById(int id); Unit* findUnitById(int id) const;
const UnitType* findUnitTypeById(const FactionType* factionType, int id); const UnitType* findUnitTypeById(const FactionType* factionType, int id);
bool placeUnit(const Vec2i &startLoc, int radius, Unit *unit, bool spaciated= false); bool placeUnit(const Vec2i &startLoc, int radius, Unit *unit, bool spaciated= false);
void moveUnitCells(Unit *unit); void moveUnitCells(Unit *unit);