Code:
public int getNextWalkingDirection() {
if(wQueueReadPtr == wQueueWritePtr)
return -1;
int dir;
do {
dir = Misc.direction(currentX, currentY, walkingQueueX[wQueueReadPtr], walkingQueueY[wQueueReadPtr]);
if(dir == -1) {
wQueueReadPtr = (wQueueReadPtr+1) % walkingQueueSize;
} else if((dir&1) != 0) {
println_debug("Invalid waypoint in walking queue!");
resetWalkingQueue();
return -1;
}
} while((dir == -1) && (wQueueReadPtr != wQueueWritePtr));
if(dir == -1) return -1;
dir >>= 1;
currentX += Misc.directionDeltaX[dir];
currentY += Misc.directionDeltaY[dir];
absX += Misc.directionDeltaX[dir];
absY += Misc.directionDeltaY[dir];
return dir;
}
Code:
public synchronized void postProcessing() {
if(newWalkCmdSteps > 0) {
int firstX = getNewWalkCmdX()[0], firstY = getNewWalkCmdY()[0];
int lastDir = 0;
boolean found = false;
numTravelBackSteps = 0;
int ptr = wQueueReadPtr;
int dir = Misc.direction(currentX, currentY, firstX, firstY);
if(dir != -1 && (dir&1) != 0) {
do {
lastDir = dir;
if(--ptr < 0)
ptr = walkingQueueSize-1;
travelBackX[numTravelBackSteps] = walkingQueueX[ptr];
travelBackY[numTravelBackSteps++] = walkingQueueY[ptr];
dir = Misc.direction(walkingQueueX[ptr], walkingQueueY[ptr], firstX, firstY);
if(lastDir != dir) {
found = true;
break;
}
} while(ptr != wQueueWritePtr);
}
else found = true;
if(!found) println_debug("Fatal: couldn't find connection vertex! Dropping packet.");
else {
wQueueWritePtr = wQueueReadPtr;
addToWalkingQueue(currentX, currentY);
if(dir != -1 && (dir&1) != 0) {
for(int i = 0; i < numTravelBackSteps-1; i++) {
addToWalkingQueue(travelBackX[i], travelBackY[i]);
}
int wayPointX2 = travelBackX[numTravelBackSteps-1], wayPointY2 = travelBackY[numTravelBackSteps-1];
int wayPointX1, wayPointY1;
if(numTravelBackSteps == 1) {
wayPointX1 = currentX;
wayPointY1 = currentY;
}
else {
wayPointX1 = travelBackX[numTravelBackSteps-2];
wayPointY1 = travelBackY[numTravelBackSteps-2];
}
dir = Misc.direction(wayPointX1, wayPointY1, wayPointX2, wayPointY2);
if(dir == -1 || (dir&1) != 0) {
println_debug("Fatal: The walking queue is corrupt! wp1=("+wayPointX1+", "+wayPointY1+"), "+
"wp2=("+wayPointX2+", "+wayPointY2+")");
}
else {
dir >>= 1;
found = false;
int x = wayPointX1, y = wayPointY1;
while(x != wayPointX2 || y != wayPointY2) {
x += Misc.directionDeltaX[dir];
y += Misc.directionDeltaY[dir];
if((Misc.direction(x, y, firstX, firstY)&1) == 0) {
found = true;
break;
}
}
if(!found) {
println_debug("Fatal: Internal error: unable to determine connection vertex!"+
" wp1=("+wayPointX1+", "+wayPointY1+"), wp2=("+wayPointX2+", "+wayPointY2+"), "+
"first=("+firstX+", "+firstY+")");
}
else addToWalkingQueue(wayPointX1, wayPointY1);
}
}
else {
for(int i = 0; i < numTravelBackSteps; i++) {
addToWalkingQueue(travelBackX[i], travelBackY[i]);
}
}
for(int i = 0; i < newWalkCmdSteps; i++) {
addToWalkingQueue(getNewWalkCmdX()[i], getNewWalkCmdY()[i]);
}
}
isRunning = isNewWalkCmdIsRunning() || isRunning2;
}
}