/** ** Assign worker to gather a certain resource. ** ** @param unit pointer to the unit. ** @param resource resource identification. ** ** @return 1 if the worker was assigned, 0 otherwise. */ static int AiAssignHarvester(CUnit &unit, int resource) { // It can't. if (unit.Removed) { return 0; } const ResourceInfo &resinfo = *unit.Type->ResInfo[resource]; Assert(&resinfo); if (resinfo.TerrainHarvester) { return AiAssignHarvesterFromTerrain(unit, resource); } else { return AiAssignHarvesterFromUnit(unit, resource); } }
/** ** Assign worker to gather a certain resource. ** ** @param unit pointer to the unit. ** @param resource resource identification. ** ** @return 1 if the worker was assigned, 0 otherwise. */ static int AiAssignHarvester(CUnit &unit, int resource) { // It can't. //Wyrmgus start // if (unit.Removed) { if (unit.Removed || unit.CurrentAction() == UnitActionBuild) { //prevent units building from outside to being assigned to gather a resource, and then leaving the construction unbuilt forever and ever //Wyrmgus end return 0; } if (std::find(AiPlayer->Scouts.begin(), AiPlayer->Scouts.end(), &unit) != AiPlayer->Scouts.end()) { //if a scouting unit was assigned to harvest, remove it from the scouts vector AiPlayer->Scouts.erase(std::remove(AiPlayer->Scouts.begin(), AiPlayer->Scouts.end(), &unit), AiPlayer->Scouts.end()); } const ResourceInfo &resinfo = *unit.Type->ResInfo[resource]; Assert(&resinfo); //Wyrmgus start /* if (resinfo.TerrainHarvester) { return AiAssignHarvesterFromTerrain(unit, resource); } else { return AiAssignHarvesterFromUnit(unit, resource); } */ int ret = 0; int resource_range = 0; for (int i = 0; i < 3; ++i) { //search for resources first in a 16 tile radius, then in a 32 tile radius, and then in the whole map resource_range += 16; if (i == 2) { resource_range = 1000; } ret = AiAssignHarvesterFromUnit(unit, resource, resource_range); if (ret == 0) { ret = AiAssignHarvesterFromTerrain(unit, resource, resource_range); } if (ret != 0) { return ret; } } return ret; //Wyrmgus end }