package com.brackeen.javagamebook.path;

import java.util.List;
import com.brackeen.javagamebook.util.MoreMath;

/**
    Klasa AStarNode wraz z klasą AStarSearch implementują ogólny
    algorytm przeszukiwania A*. Aby umożliwić wykonanie konkretnego
    przeszukiwania, klasa AStarNode powinna zostać podklasowana. 
*/
public abstract class AStarNode implements Comparable {

    AStarNode pathParent;
    float costFromStart;
    float estimatedCostToGoal;


    public float getCost() {
        return costFromStart + estimatedCostToGoal;
    }


    public int compareTo(Object other) {
        float otherValue = ((AStarNode)other).getCost();
        float thisValue = this.getCost();

        return MoreMath.sign(thisValue - otherValue);
    }


    /**
        Pobiera koszt podróży między tym węzłem a podanym 
        węzłem sąsiadującym (tj. "sąsiadem" lub "potomkiem").
    */
    public abstract float getCost(AStarNode node);


    /**
        Pobiera szacunkowy koszt podróży między tym węzłem, 
        a podanym węzłem. Szacunkowy koszt nie powinien przekraczać 
        rzeczywistego kosztu. Im lepsza będzie nasza estymacja, 
        tym efektywniejsze będzie przeszukiwanie.
    */
    public abstract float getEstimatedCost(AStarNode node);


    /**
        Pobiera potomków (tj. "sąsiadów" lub "węzły sąsiadujące")
        tego węzła.
    */
    public abstract List getNeighbors();
}