|
|
@ -340,7 +340,7 @@ void findAndAssignInvasionJob(color_ostream& out, void* tickTime) {
|
|
|
|
if ( invaderPts.find(unit->pos) != invaderPts.end() )
|
|
|
|
if ( invaderPts.find(unit->pos) != invaderPts.end() )
|
|
|
|
continue;
|
|
|
|
continue;
|
|
|
|
//must be able to wield a pick: this is overly pessimistic
|
|
|
|
//must be able to wield a pick: this is overly pessimistic
|
|
|
|
if ( unit->status2.limbs_grasp_count < unit->status2.limbs_grasp_max )
|
|
|
|
if ( unit->status2.limbs_grasp_max <= 0 || unit->status2.limbs_grasp_count < unit->status2.limbs_grasp_max )
|
|
|
|
continue;
|
|
|
|
continue;
|
|
|
|
df::map_block* block = Maps::getTileBlock(unit->pos);
|
|
|
|
df::map_block* block = Maps::getTileBlock(unit->pos);
|
|
|
|
invaderConnectivity.insert(block->walkable[unit->pos.x&0xF][unit->pos.y&0xF]);
|
|
|
|
invaderConnectivity.insert(block->walkable[unit->pos.x&0xF][unit->pos.y&0xF]);
|
|
|
@ -460,25 +460,30 @@ void findAndAssignInvasionJob(color_ostream& out, void* tickTime) {
|
|
|
|
|
|
|
|
|
|
|
|
//find important edges
|
|
|
|
//find important edges
|
|
|
|
Edge firstImportantEdge(df::coord(), df::coord(), -1);
|
|
|
|
Edge firstImportantEdge(df::coord(), df::coord(), -1);
|
|
|
|
df::coord closest;
|
|
|
|
//df::coord closest;
|
|
|
|
cost_t closestCostEstimate=0;
|
|
|
|
//cost_t closestCostEstimate=0;
|
|
|
|
cost_t closestCostActual=0;
|
|
|
|
//cost_t closestCostActual=0;
|
|
|
|
for ( auto i = localPts.begin(); i != localPts.end(); i++ ) {
|
|
|
|
for ( auto i = localPts.begin(); i != localPts.end(); i++ ) {
|
|
|
|
df::coord pt = *i;
|
|
|
|
df::coord pt = *i;
|
|
|
|
if ( costMap.find(pt) == costMap.end() )
|
|
|
|
if ( costMap.find(pt) == costMap.end() )
|
|
|
|
continue;
|
|
|
|
continue;
|
|
|
|
if ( parentMap.find(pt) == parentMap.end() )
|
|
|
|
if ( parentMap.find(pt) == parentMap.end() )
|
|
|
|
continue;
|
|
|
|
continue;
|
|
|
|
closest = pt;
|
|
|
|
//closest = pt;
|
|
|
|
closestCostEstimate = costMap[closest];
|
|
|
|
//closestCostEstimate = costMap[closest];
|
|
|
|
//if ( workNeeded[pt] == 0 )
|
|
|
|
//if ( workNeeded[pt] == 0 )
|
|
|
|
// continue;
|
|
|
|
// continue;
|
|
|
|
while ( parentMap.find(pt) != parentMap.end() ) {
|
|
|
|
while ( parentMap.find(pt) != parentMap.end() ) {
|
|
|
|
//out.print("(%d,%d,%d)\n", pt.x, pt.y, pt.z);
|
|
|
|
//out.print("(%d,%d,%d)\n", pt.x, pt.y, pt.z);
|
|
|
|
df::coord parent = parentMap[pt];
|
|
|
|
df::coord parent = parentMap[pt];
|
|
|
|
closestCostActual += getEdgeCost(out, parent, pt);
|
|
|
|
cost_t cost = getEdgeCost(out, parent, pt);
|
|
|
|
|
|
|
|
if ( cost < 0 ) {
|
|
|
|
|
|
|
|
//path invalidated
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
//closestCostActual += cost;
|
|
|
|
if ( Maps::canStepBetween(parent, pt) ) {
|
|
|
|
if ( Maps::canStepBetween(parent, pt) ) {
|
|
|
|
|
|
|
|
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
if ( pt.x == parent.x && pt.y == parent.y ) {
|
|
|
|
if ( pt.x == parent.x && pt.y == parent.y ) {
|
|
|
|
if ( pt.z < parent.z ) {
|
|
|
|
if ( pt.z < parent.z ) {
|
|
|
@ -502,10 +507,12 @@ void findAndAssignInvasionJob(color_ostream& out, void* tickTime) {
|
|
|
|
if ( firstImportantEdge.p1 == df::coord() )
|
|
|
|
if ( firstImportantEdge.p1 == df::coord() )
|
|
|
|
return;
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
if ( closestCostActual != closestCostEstimate ) {
|
|
|
|
if ( closestCostActual != closestCostEstimate ) {
|
|
|
|
out.print("%s,%d: closest = (%d,%d,%d), estimate = %lld != actual = %lld\n", __FILE__, __LINE__, closest.x,closest.y,closest.z, closestCostEstimate, closestCostActual);
|
|
|
|
out.print("%s,%d: closest = (%d,%d,%d), estimate = %lld != actual = %lld\n", __FILE__, __LINE__, closest.x,closest.y,closest.z, closestCostEstimate, closestCostActual);
|
|
|
|
return;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
assignJob(out, firstImportantEdge, parentMap, costMap, invaders, requiresZNeg, requiresZPos, cache);
|
|
|
|
assignJob(out, firstImportantEdge, parentMap, costMap, invaders, requiresZNeg, requiresZPos, cache);
|
|
|
|
lastInvasionDigger = firstInvader->id;
|
|
|
|
lastInvasionDigger = firstInvader->id;
|
|
|
|