mirror of
https://github.com/OMGeeky/ATCS.git
synced 2025-12-26 23:57:25 +01:00
main changes are: - Modified marker (* character before name) goes up the project tree by marking all parents of a modified object as modified. - Impact management when changing an object's ID. Allows for some refactoring to occur, while marking the impacted elements as modified, or aven creating "altered" versions if imapcted element was only in game source.
272 lines
7.4 KiB
Java
272 lines
7.4 KiB
Java
package com.gpl.rpg.atcontentstudio.model.sprites;
|
|
|
|
import java.awt.Graphics;
|
|
import java.awt.Image;
|
|
import java.awt.image.BufferedImage;
|
|
import java.io.File;
|
|
import java.io.IOException;
|
|
import java.util.ArrayList;
|
|
import java.util.Enumeration;
|
|
import java.util.LinkedHashMap;
|
|
import java.util.List;
|
|
import java.util.Map;
|
|
|
|
import javax.imageio.ImageIO;
|
|
import javax.swing.tree.TreeNode;
|
|
|
|
import com.gpl.rpg.atcontentstudio.Notification;
|
|
import com.gpl.rpg.atcontentstudio.model.GameDataElement;
|
|
import com.gpl.rpg.atcontentstudio.model.GameSource.Type;
|
|
import com.gpl.rpg.atcontentstudio.model.Project;
|
|
import com.gpl.rpg.atcontentstudio.model.ProjectTreeNode;
|
|
import com.gpl.rpg.atcontentstudio.model.SaveEvent;
|
|
import com.gpl.rpg.atcontentstudio.model.gamedata.GameDataSet;
|
|
|
|
public class Spritesheet extends GameDataElement {
|
|
|
|
private static final long serialVersionUID = -5981708088278528586L;
|
|
|
|
public SpriteSheetSet parent;
|
|
public File spritesheetFile;
|
|
public int spriteWidth = 32;
|
|
public int spriteHeight = 32;
|
|
public String id;
|
|
public Category category = Category.none;
|
|
public boolean animated = false;
|
|
|
|
public enum Category {
|
|
none,
|
|
monster,
|
|
item,
|
|
actorcondition
|
|
};
|
|
|
|
//Lazy initialization.
|
|
public BufferedImage spritesheet = null;
|
|
public Map<Integer, BufferedImage> cache_full_size = new LinkedHashMap<Integer, BufferedImage>();
|
|
public Map<Integer, Image> cache_icon = new LinkedHashMap<Integer, Image>();
|
|
|
|
public Spritesheet(SpriteSheetSet parent, File f) {
|
|
this.spritesheetFile = f;
|
|
this.id = f.getName().substring(0, f.getName().lastIndexOf("."));
|
|
this.parent = parent;
|
|
|
|
String cat = getProject().getSpritesheetsProperty("atcs.spritesheet."+this.id+".category");
|
|
if (cat != null) {
|
|
this.category = Category.valueOf(cat);
|
|
}
|
|
String sizex = getProject().getSpritesheetsProperty("atcs.spritesheet."+this.id+".sizex");
|
|
if (sizex != null) {
|
|
this.spriteWidth = Integer.parseInt(sizex);
|
|
}
|
|
String sizey = getProject().getSpritesheetsProperty("atcs.spritesheet."+this.id+".sizey");
|
|
if (sizey != null) {
|
|
this.spriteHeight = Integer.parseInt(sizey);
|
|
}
|
|
String anim = getProject().getSpritesheetsProperty("atcs.spritesheet."+this.id+".animate");
|
|
if (anim != null) {
|
|
this.animated = Boolean.parseBoolean(anim);
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public Enumeration<ProjectTreeNode> children() {
|
|
return null;
|
|
}
|
|
@Override
|
|
public boolean getAllowsChildren() {
|
|
return false;
|
|
}
|
|
@Override
|
|
public TreeNode getChildAt(int arg0) {
|
|
return null;
|
|
}
|
|
@Override
|
|
public int getChildCount() {
|
|
return 0;
|
|
}
|
|
@Override
|
|
public int getIndex(TreeNode arg0) {
|
|
return 0;
|
|
}
|
|
@Override
|
|
public TreeNode getParent() {
|
|
return parent;
|
|
}
|
|
@Override
|
|
public boolean isLeaf() {
|
|
return true;
|
|
}
|
|
@Override
|
|
public void childrenAdded(List<ProjectTreeNode> path) {
|
|
path.add(0, this);
|
|
parent.childrenAdded(path);
|
|
}
|
|
@Override
|
|
public void childrenChanged(List<ProjectTreeNode> path) {
|
|
path.add(0, this);
|
|
parent.childrenChanged(path);
|
|
}
|
|
@Override
|
|
public void childrenRemoved(List<ProjectTreeNode> path) {
|
|
path.add(0, this);
|
|
parent.childrenRemoved(path);
|
|
}
|
|
@Override
|
|
public void notifyCreated() {
|
|
childrenAdded(new ArrayList<ProjectTreeNode>());
|
|
}
|
|
@Override
|
|
public String getDesc() {
|
|
return (needsSaving() ? "*" : "")+spritesheetFile.getName();
|
|
}
|
|
|
|
@Override
|
|
public Project getProject() {
|
|
return parent.getProject();
|
|
}
|
|
|
|
public int getSpriteCount() {
|
|
if (spritesheet == null) {
|
|
try {
|
|
spritesheet = ImageIO.read(spritesheetFile);
|
|
} catch (IOException e) {
|
|
Notification.addError("Error loading image "+spritesheetFile.getAbsolutePath()+" : "+e.getMessage());
|
|
e.printStackTrace();
|
|
return 0;
|
|
}
|
|
}
|
|
return (int) (Math.ceil(((double)spritesheet.getWidth()) / ((double)spriteWidth)) * Math.ceil(((double)spritesheet.getHeight()) / ((double)spriteHeight)));
|
|
}
|
|
|
|
public BufferedImage getImage(int index) {
|
|
if (spritesheet == null) {
|
|
try {
|
|
spritesheet = ImageIO.read(spritesheetFile);
|
|
} catch (IOException e) {
|
|
Notification.addError("Error loading image "+spritesheetFile.getAbsolutePath()+" : "+e.getMessage());
|
|
e.printStackTrace();
|
|
return null;
|
|
}
|
|
}
|
|
if (cache_full_size.get(index) != null) {
|
|
return cache_full_size.get(index);
|
|
}
|
|
BufferedImage result = new BufferedImage(spriteWidth, spriteHeight, BufferedImage.TYPE_INT_ARGB);
|
|
Graphics g = result.getGraphics();
|
|
int sx1, sy1;
|
|
sx1 = (index * spriteWidth) % spritesheet.getWidth();
|
|
sy1 = spriteHeight * ((index * spriteWidth) / spritesheet.getWidth());
|
|
if (sx1 + spriteWidth > spritesheet.getWidth() || sy1 + spriteHeight > spritesheet.getHeight()) {
|
|
g.finalize();
|
|
return null;
|
|
}
|
|
g.drawImage(spritesheet, 0, 0, spriteWidth, spriteHeight, sx1, sy1, sx1 + spriteWidth, sy1 + spriteHeight, null);
|
|
result.flush();
|
|
g.finalize();
|
|
cache_full_size.put(index, result);
|
|
return result;
|
|
}
|
|
|
|
public Image getIcon(int index) {
|
|
if (cache_icon.get(index) != null) {
|
|
return cache_icon.get(index);
|
|
}
|
|
Image result = getImage(index);
|
|
if (result == null) return null;
|
|
result = result.getScaledInstance(16, 16, BufferedImage.SCALE_SMOOTH);
|
|
cache_icon.put(index, result);
|
|
return result;
|
|
}
|
|
|
|
public void clearCache() {
|
|
cache_full_size.clear();
|
|
cache_icon.clear();
|
|
}
|
|
|
|
|
|
@Override
|
|
public Image getIcon() {
|
|
return getIcon(0);
|
|
}
|
|
@Override
|
|
public Image getLeafIcon() {
|
|
return getIcon();
|
|
}
|
|
@Override
|
|
public Image getClosedIcon() {return null;}
|
|
@Override
|
|
public Image getOpenIcon() {return null;}
|
|
|
|
|
|
@Override
|
|
public GameDataSet getDataSet() {
|
|
return null;
|
|
}
|
|
|
|
@Override
|
|
public Type getDataType() {
|
|
return parent.getDataType();
|
|
}
|
|
|
|
@Override
|
|
public boolean isEmpty() {
|
|
return false;
|
|
}
|
|
|
|
@Override
|
|
public void parse() {
|
|
if(this.state == GameDataElement.State.init){
|
|
this.state = GameDataElement.State.parsed;
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void link() {
|
|
if (this.state == GameDataElement.State.init) {
|
|
this.parse();
|
|
}
|
|
if(this.state == GameDataElement.State.parsed) {
|
|
this.state = GameDataElement.State.linked;
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public GameDataElement clone() {
|
|
Spritesheet clone = new Spritesheet((SpriteSheetSet) getParent(), new File(spritesheetFile.getAbsolutePath()));
|
|
clone.id = this.id;
|
|
clone.animated = this.animated;
|
|
clone.category = this.category;
|
|
clone.spriteWidth = this.spriteWidth;
|
|
clone.spriteHeight = this.spriteHeight;
|
|
return clone;
|
|
}
|
|
|
|
@Override
|
|
public void elementChanged(GameDataElement oldOne, GameDataElement newOne) {
|
|
//nothing linked.
|
|
}
|
|
|
|
@Override
|
|
public String getProjectFilename() {
|
|
return spritesheetFile.getName();
|
|
}
|
|
|
|
@Override
|
|
public void save() {
|
|
if (this.category != null) getProject().setSpritesheetsProperty("atcs.spritesheet."+this.id+".category", this.category.toString());
|
|
if (this.spriteWidth != 32) getProject().setSpritesheetsProperty("atcs.spritesheet."+this.id+".sizex", Integer.toString(this.spriteWidth));
|
|
if (this.spriteHeight != 32) getProject().setSpritesheetsProperty("atcs.spritesheet."+this.id+".sizey", Integer.toString(this.spriteHeight));
|
|
if (this.animated)getProject().setSpritesheetsProperty("atcs.spritesheet."+this.id+".animate", Boolean.toString(this.animated));
|
|
getProject().save();
|
|
|
|
this.state = GameDataElement.State.saved;
|
|
}
|
|
|
|
@Override
|
|
public List<SaveEvent> attemptSave() {
|
|
save();
|
|
return null;
|
|
}
|
|
}
|