The way it is now, the heading is being reduced before the movement sequence starts. This is why the player is spinning each time. The reduction needs to happen after the turn interval has finished.
#define this somewhere
def reducePlayerH(self):
"""reduce the player heading to eliminate wrap-around"""
reducedH = self.player.getH()%360.0
self.player.setH(reducedH)
.
.
.
#in moveToPosition
self.playerMovement = Sequence(playerTurn, Func(self.reduceH), playerMove)
Alternatively, you can reduce the player heading before you calculate the closesDestAngle:
# Calculate the new hpr
self.npLook.setPos(self.player.getPos())
self.npLook.lookAt(self.position) # Look at the clicked position.
reducedH = self.player.getH()%360.0
self.player.setH(reducedH)
currHpr = self.player.getHpr()
newHpr = self.npLook.getHpr()
newH = closestDestAngle(currHpr[0], newHpr[0])