package com.clearlyspam23.GLE.basic.layers.tile; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Set; import com.clearlyspam23.GLE.basic.layers.tile.TilesetTreeNode.Type; public class TilesetManager { private TilesetGroupNode root = new TilesetGroupNode("Tilesets"); private Map<String, TilesetHandle> nameTable = new HashMap<String, TilesetHandle>(); private Map<Integer, TilesetHandle> idTable = new HashMap<Integer, TilesetHandle>(); private int lastId; /** * this function is now only here for debugging, and will soon be removed entirely * @param t * @return */ public boolean addTilesetToRoot(TilesetHandle t){ if(nameTable.containsKey(t.getName())) return false; root.addNode(new TilesetTileNode(t)); nameTable.put(t.getName(), t); return true; } private boolean helperUpdate(TilesetTreeNode node, Set<String> entries, Map<String, TilesetHandle> tempMap){ if(node.getType()==Type.TILE){ if(entries.add(node.getName())){ tempMap.put(node.getName(), node.getAsTiles().getTileset()); return true; } return false; } else{ for(TilesetTreeNode n : node.getAsGroup().getChildren()) if(!helperUpdate(n, entries, tempMap)) return false; return true; } } public TilesetHandle getTilesetByID(int id){ return idTable.get(id); } /** * updates the map to reflect the current TilesetGroupNode * @return */ public boolean updateMap(){ Set<String> entries = new HashSet<String>(); Map<String, TilesetHandle> tempMap = new HashMap<String, TilesetHandle>(); if(!helperUpdate(root, entries, tempMap)) return false; for(Entry<String, TilesetHandle> e : tempMap.entrySet()){ nameTable.put(e.getKey(), e.getValue()); } List<String> toRemove = new ArrayList<String>(); for(String s : nameTable.keySet()){ if(!entries.contains(s)) toRemove.add(s); } for(String s : toRemove) nameTable.remove(s); return true; } public List<TilesetHandle> getAllTilesets(){ return root.getTilesets(); } private boolean willWork(TilesetHandle h, List<TilesetSelectionConstraint> constraints){ for(TilesetSelectionConstraint c : constraints){ if(!c.willTilesetWork(h)) return false; } return true; } public List<TilesetHandle> getAllMatchingTilesets(List<TilesetSelectionConstraint> constraints){ List<TilesetHandle> all = getAllTilesets(); List<TilesetHandle> ans = new ArrayList<TilesetHandle>(); for(TilesetHandle h : all){ if(willWork(h, constraints)) ans.add(h); } return ans; } public TilesetHandle getTilesetByName(String name){ return nameTable.get(name); } public Map<String, TilesetHandle> getNameTable() { return nameTable; } public void setNameTable(Map<String, TilesetHandle> nameTable) { this.nameTable = nameTable; } public TilesetGroupNode getRoot(){ return root; } private void discoverNodes(TilesetGroupNode node){ for(TilesetTreeNode n : node.getChildren()){ if(n.getType()==Type.TILE){ nameTable.put(n.getName(), n.getAsTiles().getTileset()); if(idTable.put(n.getAsTiles().getTileset().getID(), n.getAsTiles().getTileset())!=null) System.out.println("probably a bug"); lastId = Math.max(lastId, n.getAsTiles().getTileset().getID()); } else{ discoverNodes(n.getAsGroup()); } } } public void setRoot(TilesetGroupNode root){ this.root = root; nameTable.clear(); idTable.clear(); lastId = 0; discoverNodes(root); } public int getLastId(){ return lastId; } // public void setAllTilesets(List<TilesetHandle> allTilesets) { // this.allTilesets = allTilesets; // } }