BuildingGraph.java

package io.github.neonteam10.graphs;


import java.util.ArrayList;
import java.util.List;

/**
 * This graph is used to show the relationship between buildings (do they have a road connecting them?).
 */
public class BuildingGraph {
    final float BEST_DISTANCE = 6f;
    List<BuildingNode> nodes;
    float accommodationQualityScore;

    public BuildingGraph() {
        nodes = new ArrayList<>();
    }

    public boolean addNode(BuildingNode node) {
        return nodes.add(node);
    }


    // Returns the accommodation quality score (some function of distance between accommodation and all other building types
    public void calculateAccommodationQualityScore() {
        float total = 0;
        for (BuildingNode node : nodes) {
            if (node.building.isAccommodation()) {
                int bestDistCanteen = Integer.MAX_VALUE;
                int bestDistRecreation = Integer.MAX_VALUE;
                int bestDistStudy = Integer.MAX_VALUE;
                for (BuildingNode neighbour : node.connections.keySet()) {
                    if (neighbour.building.isCanteen()){
                        bestDistCanteen = Math.min(bestDistCanteen, node.connections.get(neighbour));
                    }
                    else if (neighbour.building.isRecreation()){
                        bestDistRecreation = Math.min(bestDistRecreation, node.connections.get(neighbour));
                    }
                    else if (neighbour.building.isStudy()){
                        bestDistStudy = Math.min(bestDistStudy, node.connections.get(neighbour));
                    }
                }
                total += (BEST_DISTANCE/bestDistCanteen + BEST_DISTANCE/bestDistRecreation + BEST_DISTANCE/bestDistStudy);
            }
        }
        accommodationQualityScore = total;
    }

    /*
     * Gives a flat score bonus based on how close the canteens are to other facilities.
     * For every accommodation building within radius 5 from a canteen, you get a bonus of 0.5
     * For every study building within radius 15 from a canteen, you get a bonus of 1
     * While they may seem small, this is called every tic, and so quickly adds up
     */
    public float canteenBonus() {
        float bonus = 0.0f;
        for (BuildingNode canteenNode : nodes) {
            if (canteenNode.building.isCanteen()) {
                for (BuildingNode neighbour : canteenNode.connections.keySet()) {
                    if (neighbour.building.isAccommodation()) {
                        int distanceToAccommodation = canteenNode.connections.get(neighbour);
                        if (Math.abs(distanceToAccommodation) < 5){
                            bonus += 0.5;
                        }
                    }
                    if (neighbour.building.isStudy()) {
                        int distanceToStudy = canteenNode.connections.get(neighbour);
                        if (Math.abs(distanceToStudy) < 15) {
                            bonus += 1;
                        }
                    }
                }
            }
        }
        return bonus;
    }

    /*
     * Gives a flat score bonus based on how close the accommodation are to other facilities.
     * For every accommodation building within radius 5 from a study building, you get a bonus of 5
     * For every accommodation building within radius 15 from a recreation building, you get a bonus of 10
     */
    public float accommodationBonus() {
        float bonus = 0.0f;
        for (BuildingNode accommNode : nodes) {
            if (accommNode.building.isAccommodation()) {
                for (BuildingNode neighbour : accommNode.connections.keySet()) {
                    if (neighbour.building.isStudy()) {
                        int distanceToAccommodation = accommNode.connections.get(neighbour);
                        if (distanceToAccommodation < 5) bonus += 5;
                    }
                    if (neighbour.building.isRecreation()) {
                        int distanceToStudy = accommNode.connections.get(neighbour);
                        if (distanceToStudy < 15) bonus += 10;
                    }
                }
            }
        }
        return bonus;
    }

    @Override
    public String toString() {
        String out = "BuildingGraph: \n";
        for (BuildingNode node : nodes) {
            out += node + " : {";
            for (BuildingNode node2 : node.connections.keySet()) {
                out += node2 + ":" + node.connections.get(node2) + ", ";
            }
            out += "}\n";
        }
        return out;
    }
}