package com.bioxx.tfc2.api.trees; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.Random; import com.bioxx.tfc2.api.types.ClimateTemp; import com.bioxx.tfc2.api.types.Moisture; import com.bioxx.tfc2.api.types.WoodType; public class TreeRegistry { public static TreeRegistry instance = new TreeRegistry(); private HashMap<String, TreeConfig> treeTypeHash = new HashMap<String, TreeConfig>(); private HashMap<String, TreeSchemManager> treeList; public TreeRegistry() { treeList = new HashMap<String, TreeSchemManager>(); } public void RegisterSchematic(TreeSchematic treeSchematic, String name) { if(!treeList.containsKey(name)) treeList.put(name, new TreeSchemManager()); treeList.get(name).addSchem(treeSchematic); } public String[] getTreeNames() { return (String[])treeTypeHash.keySet().toArray(new String[treeTypeHash.size()]); } public TreeSchematic getRandomTreeSchematic(Random R) { return treeList.get(R.nextInt(treeList.size())).getRandomSchematic(R); } /** * @return Returns a random schematic for a specific tree type at any growth stage */ public TreeSchematic getRandomTreeSchematic(Random R, String treeID) { if(!treeList.containsKey(treeID)) return null; return treeList.get(treeID).getRandomSchematic(R); } /** * @return Returns a random schematic for a specific tree type at a specific growth stage */ public TreeSchematic getRandomTreeSchematic(Random R, String treeID, int growthStage) { if(!treeList.containsKey(treeID)) return null; return treeList.get(treeID).getRandomSchematic(R, growthStage); } /** * @return Returns a specific schematic */ public TreeSchematic getTreeSchematic(String treeID, int schemID, int growthStage) { if(!treeList.containsKey(treeID)) return null; return treeList.get(treeID).getSchematic(schemID, growthStage); } public void addTreeType(TreeConfig configuration) { if(!treeTypeHash.containsKey(configuration.name)) { treeTypeHash.put(configuration.name, configuration); } } public TreeSchemManager managerFromString(String n) { if(treeList.containsKey(n)) return ((TreeSchemManager) treeList.get(n)); return null; } /** * @param n Name of the Tree type. Used as the Key in the hash map for lookups. * @return Full TreeConfig object */ public TreeConfig treeFromString(String n) { if(treeTypeHash.containsKey(n)) return ((TreeConfig) treeTypeHash.get(n)); return null; } public TreeConfig getRandomTree() { int id = new Random().nextInt(treeTypeHash.keySet().toArray().length); return treeTypeHash.get(treeTypeHash.keySet().toArray(new String[treeTypeHash.keySet().size()])[id]); } public String getRandomTreeTypeForIsland(Random r, ClimateTemp temp, Moisture moisture) { ArrayList<String> list = new ArrayList<String>(); Iterator iter = treeTypeHash.keySet().iterator(); while(iter.hasNext()) { String tree = (String) iter.next(); //Palm trees are a special case and will always exist on subtropical and tropical islands. if(tree.equals(WoodType.Palm.name())) continue; TreeConfig tc = treeFromString(tree); if(tc.minTemp.getMapTemp() <= temp.getMapTemp() && tc.maxTemp.getMapTemp() >= temp.getMapTemp() && tc.minMoisture.getMoisture() <= moisture.getMoisture() && tc.maxMoisture.getMoisture() >= moisture.getMoisture()) list.add(tree); } if(list.size() == 0) return null; if(list.size() == 1) return list.get(0); return list.get(r.nextInt(list.size())); } }