FileHandler.java

package com.vikingz.unitycoon.util;

import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.files.FileHandle;

import com.google.gson.Gson;
import com.vikingz.unitycoon.building.BuildingStats;

import java.util.*;

import static com.vikingz.unitycoon.building.BuildingStats.BuildingType.*;


/**
 * This class handles loading in files
 *
 * Main use is to load in the map file and loading building information.
 * 
 * This class has been refactored slightly to make the code more readable, however it is largely unchanged.
 */
public class FileHandler {

    /**
     * Loads in the map from a file
     * @param fileName Name of the file to load in
     * @return String The map 
     */
    public static String loadMap(String fileName){
        String mapData = "";
        FileHandle fileHandle = Gdx.files.internal("maps/" + fileName + ".txt");

        // Check if the file exists
        if (fileHandle.exists()) {
            // Read the content as a string
            mapData = fileHandle.readString();

        } else {
            System.err.println("File not found!: " + fileHandle.toString());
        }

        return mapData;
    }

    /**
     * Loads Building information maps, into static Dictionaries in BuildingStats
     * @param fileName String Name of the file to load
     * @param textureFileName String Name of the texture file
     */
    public static void loadBuildings(String fileName, String textureFileName)  {
        FileHandle fileHandle = Gdx.files.internal("config/" + fileName + ".json");
        FileHandle textureFileHandle = Gdx.files.internal("config/" + textureFileName + ".json");
        if (fileHandle.exists() && textureFileHandle.exists()) {

            //JSON HANDLE
            String fileRead = fileHandle.readString();
            String textureFileRead = textureFileHandle.readString();
            String[] arrayDict = fileRead.split("\n");
            Gson gson = new Gson();

            //Name
            BuildingParse nameParser = gson.fromJson(arrayDict[0],BuildingParse.class);

            BuildingStats.buildingNameDict = new Hashtable<BuildingStats.BuildingType, String[]>(){{
                put(ACADEMIC, nameParser.ACADEMIC);
                put(ACCOMODATION, nameParser.ACCOMODATION);
                put(RECREATIONAL, nameParser.RECREATIONAL);
                put(FOOD, nameParser.FOOD);
                put(NONE, nameParser.NONE);
            }};

            //Price
            BuildingParse priceParser = gson.fromJson(arrayDict[1],BuildingParse.class);
            BuildingStats.buildingPriceDict = new Hashtable<BuildingStats.BuildingType, String[]>(){{
                put(ACADEMIC, priceParser.ACADEMIC);
                put(ACCOMODATION, priceParser.ACCOMODATION);
                put(RECREATIONAL, priceParser.RECREATIONAL);
                put(FOOD, priceParser.FOOD);
                put(NONE, priceParser.NONE);
            }};

            //Student
            BuildingParse studentParser = gson.fromJson(arrayDict[2],BuildingParse.class);
            BuildingStats.buildingStudentDict = new Hashtable<BuildingStats.BuildingType, String[]>(){{
                put(ACADEMIC, studentParser.ACADEMIC);
                put(ACCOMODATION, studentParser.ACCOMODATION);
                put(RECREATIONAL, studentParser.RECREATIONAL);
                put(FOOD, studentParser.FOOD);
                put(NONE, studentParser.NONE);
            }};

            //Coins
            BuildingParse coinParser = gson.fromJson(arrayDict[3],BuildingParse.class);
            BuildingStats.buildingCoinDict = new Hashtable<BuildingStats.BuildingType, String[]>(){{
                put(ACADEMIC, coinParser.ACADEMIC);
                put(ACCOMODATION, coinParser.ACCOMODATION);
                put(RECREATIONAL, coinParser.RECREATIONAL);
                put(FOOD, coinParser.FOOD);
                put(NONE, coinParser.NONE);
            }};

            //IDs
            BuildingParse idParser = gson.fromJson(arrayDict[4],BuildingParse.class);
            BuildingStats.buildingDict = new Hashtable<BuildingStats.BuildingType, String[]>(){{
                put(ACADEMIC, idParser.ACADEMIC);
                put(ACCOMODATION, idParser.ACCOMODATION);
                put(RECREATIONAL, idParser.RECREATIONAL);
                put(FOOD, idParser.FOOD);
                put(NONE, idParser.NONE);
            }};

            //passing child elements from types
            Enumeration<String[]> BuildingIDsIterator = BuildingStats.buildingDict.elements();
            BuildingStats.BuildingIDs = new ArrayList<String>();
            while (BuildingIDsIterator.hasMoreElements()){
                for (String item :BuildingIDsIterator.nextElement()) {
                    if (item != null){
                        BuildingStats.BuildingIDs.add(item);
                    }
                }
            }

            //Textures
            BuildingStats.buildingTextureMap = new Hashtable<String, int[]>();
            TextureParse textureParse = gson.fromJson(textureFileRead,TextureParse.class);
            BuildingStats.textureAtlasLocation = textureParse.textureAtlasLocation;
            BuildingStats.atlasBuildingSize = textureParse.atlasBuildingSize;
            for (int i=0;i<textureParse.buildings.size();i++){
                int[] convertValue = new int[]{
                    Integer.parseInt(textureParse.buildingPos.get(i).split(",")[0]),
                        Integer.parseInt(textureParse.buildingPos.get(i).split(",")[1]),
                };
                BuildingStats.buildingTextureMap.put(textureParse.buildings.get(i),convertValue);
            }

        }
    }
}

/**
 * Object parser that has public variable to allow map json to dictionary.
 */
class BuildingParse {
    public String ACADEMIC[];
    public String ACCOMODATION[];
    public String RECREATIONAL[];
    public String FOOD[];
    public String NONE[];
}

class TextureParse {
    public String textureAtlasLocation ="textureAtlases/buildingsAtlas.png";
    public int atlasBuildingSize = 128;
    ArrayList<String> buildings;
    ArrayList<String> buildingPos;
}