/*
* Copyright (C) 2006 Clam <clamisgood@gmail.com>
* Copyright (C) 2008, 2010, 2011 IsmAvatar <IsmAvatar@gmail.com>
* Copyright (C) 2008, 2009 Quadduc <quadduc@gmail.com>
* Copyright (C) 2013, 2014 Robert B. Colton
*
* This file is part of LateralGM.
* LateralGM is free software and comes with ABSOLUTELY NO WARRANTY.
* See LICENSE for details.
*/
package org.lateralgm.resources;
import java.awt.Color;
import java.awt.Point;
import java.awt.geom.Point2D;
import java.util.Arrays;
import java.util.Collections;
import java.util.EnumMap;
import java.util.List;
import org.lateralgm.main.LGM;
import org.lateralgm.main.UpdateSource;
import org.lateralgm.main.UpdateSource.UpdateEvent;
import org.lateralgm.main.UpdateSource.UpdateTrigger;
import org.lateralgm.resources.sub.BackgroundDef;
import org.lateralgm.resources.sub.Instance;
import org.lateralgm.resources.sub.Instance.PInstance;
import org.lateralgm.resources.sub.Tile;
import org.lateralgm.resources.sub.View;
import org.lateralgm.subframes.CodeFrame.CodeHolder;
import org.lateralgm.util.ActiveArrayList;
import org.lateralgm.util.PropertyMap;
public class Room extends InstantiableResource<Room,Room.PRoom> implements CodeHolder
{
public static final int TAB_OBJECTS = 0;
public static final int TAB_SETTINGS = 1;
public static final int TAB_TILES = 2;
public static final int TAB_BACKGROUNDS = 3;
public static final int TAB_VIEWS = 4;
public final List<BackgroundDef> backgroundDefs;
public final List<View> views;
public final ActiveArrayList<Instance> instances = new ActiveArrayList<Instance>();
public final ActiveArrayList<Tile> tiles = new ActiveArrayList<Tile>();
private final UpdateTrigger instanceUpdateTrigger = new UpdateTrigger();
public final UpdateSource instanceUpdateSource = new UpdateSource(this,instanceUpdateTrigger);
private final UpdateTrigger tileUpdateTrigger = new UpdateTrigger();
public final UpdateSource tileUpdateSource = new UpdateSource(this,tileUpdateTrigger);
public enum PRoom
{
CAPTION,WIDTH,HEIGHT,SNAP_X,SNAP_Y,ISOMETRIC,SPEED,PERSISTENT,BACKGROUND_COLOR,
DRAW_BACKGROUND_COLOR,CREATION_CODE,REMEMBER_WINDOW_SIZE,EDITOR_WIDTH,EDITOR_HEIGHT,SHOW_GRID,
SHOW_OBJECTS,SHOW_TILES,SHOW_BACKGROUNDS,SHOW_FOREGROUNDS,SHOW_VIEWS,DELETE_UNDERLYING_OBJECTS,
DELETE_UNDERLYING_TILES,CURRENT_TAB,SCROLL_BAR_X,SCROLL_BAR_Y,VIEWS_ENABLED,VIEWS_CLEAR,
PHYSICS_WORLD,PHYSICS_TOP,PHYSICS_LEFT,PHYSICS_RIGHT,PHYSICS_BOTTOM,PHYSICS_GRAVITY_X,
PHYSICS_GRAVITY_Y,PHYSICS_PIXTOMETERS
}
private static final EnumMap<PRoom,Object> DEFS = PropertyMap.makeDefaultMap(PRoom.class,"",640,
480,16,16,false,30,false,new Color(102,204,255),true,"",true,1024,640,true,true,true,true,true,
false,false,false,TAB_OBJECTS,0,0,false,true,false,0,0,640,480,0.0,10.0,0.1);
public Room()
{
this(null);
}
public Room(ResourceReference<Room> r)
{
super(r);
BackgroundDef[] b = new BackgroundDef[8];
for (int j = 0; j < b.length; j++)
b[j] = new BackgroundDef();
backgroundDefs = Collections.unmodifiableList(Arrays.asList(b));
View[] v = new View[8];
for (int j = 0; j < v.length; j++)
v[j] = new View();
views = Collections.unmodifiableList(Arrays.asList(v));
}
@Override
public Room makeInstance(ResourceReference<Room> r)
{
return new Room(r);
}
public Instance addInstance()
{
Instance inst = new Instance(this);
inst.properties.put(PInstance.ID,++LGM.currentFile.lastInstanceId);
instances.add(inst);
return inst;
}
public int getWidth()
{
return properties.get(PRoom.WIDTH);
}
public int getHeight()
{
return properties.get(PRoom.HEIGHT);
}
public String getCode()
{
return properties.get(PRoom.CREATION_CODE);
}
public void setCode(String s)
{
properties.put(PRoom.CREATION_CODE,s);
}
@Override
protected void postCopy(Room dest)
{
super.postCopy(dest);
for (Instance inst : instances)
{
Instance inst2 = dest.addInstance();
inst2.properties.putAll(inst.properties);
}
for (Tile tile : tiles)
{
Tile tile2 = new Tile(this);
tile2.properties.putAll(tile.properties);
dest.tiles.add(tile2);
}
int s = views.size();
for (int i = 0; i < s; i++)
{
View view = views.get(i);
View view2 = dest.views.get(i);
view2.properties.putAll(view.properties);
}
s = backgroundDefs.size();
for (int i = 0; i < s; i++)
{
BackgroundDef back = backgroundDefs.get(i);
BackgroundDef back2 = dest.backgroundDefs.get(i);
back2.properties.putAll(back.properties);
}
}
@Override
protected PropertyMap<PRoom> makePropertyMap()
{
return new PropertyMap<PRoom>(PRoom.class,this,DEFS);
}
public void instanceUpdated(UpdateEvent e)
{
instanceUpdateTrigger.fire(new UpdateEvent(instanceUpdateSource,e));
}
public void tileUpdated(UpdateEvent e)
{
tileUpdateTrigger.fire(new UpdateEvent(tileUpdateSource,e));
}
public interface Piece
{
boolean isLocked();
void setLocked(boolean l);
void setName(String name);
String getName();
void setPosition(Point pos);
void setScale(Point2D scale);
Point2D getScale();
double getRotation();
void setRotation(double rotation);
void setAlpha(int alpha);
void setColor(Color color);
int getAlpha();
void setSelected(boolean l);
boolean isSelected();
Point getPosition();
}
}