package com.clearlyspam23.GLE.basic.layers.tile;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.piccolo2d.PNode;
import com.clearlyspam23.GLE.GUI.util.AxisAlignedRectGridNode;
import com.clearlyspam23.GLE.basic.layers.tile.edit.TileLayerEditManager;
import com.clearlyspam23.GLE.basic.layers.tile.export.CompactExportData;
import com.clearlyspam23.GLE.basic.layers.tile.gui.BasePNode;
import com.clearlyspam23.GLE.basic.layers.tile.gui.TileLayerSelectionListener;
import com.clearlyspam23.GLE.basic.layers.tile.gui.TilePNode;
import com.clearlyspam23.GLE.basic.layers.tile.gui.TileSelection;
import com.clearlyspam23.GLE.edit.LayerEditManager;
import com.clearlyspam23.GLE.level.Layer;
import com.clearlyspam23.GLE.level.Level;
public class TileLayer extends Layer<Object>{
private TileLayerTemplate template;
private BasePNode base;
// private TileLayerPNode tiles;
private PNode overlay = new PNode();
private AxisAlignedRectGridNode grid;
private TileLayerEditManager data;
private List<TileLayerSelectionListener> selectionListeners = new ArrayList<TileLayerSelectionListener>();
public TileLayer(TileLayerTemplate template)
{
super(template.getDefinition());
this.template = template;
data = ((TileLayerDefinition)template.getDefinition()).getEditorData();
base = new BasePNode(template, this);
grid = new AxisAlignedRectGridNode(template.getDefaultGridWidth(), template.getDefaultGridHeight());
grid.setTransparency(0);
overlay.addChild(grid);
}
@Override
public Object getExportData() {
if(base==null||base.getTiles()==null)
return new CompactExportData[0];
Map<TilesetHandle, CompactExportData> dataMap = new HashMap<TilesetHandle, CompactExportData>();
TilePNode[][] grid = base.getTiles().getNodeGrid();
for(int i = 0; i < grid.length; i++){
for(int j = 0; j < grid[i].length; j++){
if(grid[i][j]==null||grid[i][j].getTileset()==null)
continue;
if(!dataMap.containsKey(grid[i][j].getTileset())){
CompactExportData ced = new CompactExportData();
ced.tiles = new int[grid[0].length][grid.length];
ced.tileset = grid[i][j].getTileset().getName();
ced.tilesetId = grid[i][j].getTileset().getID();
fillWithMinus1(ced.tiles);
dataMap.put(grid[i][j].getTileset(), ced);
}
dataMap.get(grid[i][j].getTileset()).tiles[j][i] = grid[i][j].getTilesetX() + grid[i][j].getTileset().getWidth()*grid[i][j].getTilesetY();
}
}
CompactExportData[] ans = new CompactExportData[dataMap.size()];
int i = 0;
for(CompactExportData d : dataMap.values()){
ans[i++] = d;
}
return ans;
}
private void fillWithMinus1(int[][] nodes){
for(int i = 0; i < nodes.length; i++){
for(int j = 0; j < nodes[i].length; j++){
nodes[i][j] = -1;
}
}
}
@Override
public PNode getLayerGUI() {
return base;
}
@Override
public int buildFromData(Object data) {
int failureNum = 0;
CompactExportData[] ceds = (CompactExportData[])data;
for(CompactExportData d : ceds){
TilesetHandle ts = getTilesetManager().getTilesetByID(d.tilesetId);
if(ts==null)
ts = getTilesetManager().getTilesetByName(d.tileset);
if(ts==null){
failureNum++;
continue;
}
for(int i = 0; i < d.tiles.length; i++){
for(int j = 0; j < d.tiles[i].length; j++){
if(d.tiles[i][j]<0){
base.getTiles().getNodeGrid()[j][i].resetTileset();
}
else{
base.getTiles().getNodeGrid()[j][i].setTileset(ts, ts.getXFromIndex(d.tiles[i][j]), ts.getYFromIndex(d.tiles[i][j]));
}
}
}
}
if(failureNum<=0)
return Layer.SUCCESS;
if(failureNum==ceds.length)
return Layer.FAILURE;
return Layer.PARTIAL_SUCCESS;
}
@Override
public void onResize(Level level, double x, double y) {
base.resize(x, y);
grid.resize(x, y);
}
public TilesetManager getTilesetManager(){
return (TilesetManager) template.getTemplate().getTemplateData(template.getDefinition(), "tilesets");
}
@Override
public String getName() {
return template.getName();
}
public BasePNode getBase(){
return base;
}
@Override
public LayerEditManager<TileLayer> getEditManager() {
return data;
}
public void toggleShowGrid(boolean flag){
if(flag)
grid.setTransparency(1);
else
grid.setTransparency(0);
}
public boolean isGridShowing(){
return grid.getTransparency()>0.5f;
}
public float minBorderWidth(){
return (float) (Math.min(template.getDefaultGridWidth(), template.getDefaultGridHeight())/10);
}
public PNode getOverlayGUI(){
return overlay;
}
public boolean refreshTilesets(){
return base.refreshTilesets(getTilesetManager());
}
public void selectionChanged(TileSelection old, TileSelection current){
for(TileLayerSelectionListener l : selectionListeners){
l.selectionChange(this, old, current);
}
}
public void addSelectionListener(TileLayerSelectionListener listener){
selectionListeners.add(listener);
}
public void removeSelectionListener(TileLayerSelectionListener listener){
selectionListeners.remove(listener);
}
public List<TileLayerSelectionListener> getSelectionListeners(){
return selectionListeners;
}
public boolean canCopy(){
return base.canCopy();
}
public boolean canCut(){
return base.canCut();
}
}