package org.open2jam.parsers;
import java.awt.image.BufferedImage;
import java.io.*;
import java.net.URL;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Level;
import javax.imageio.ImageIO;
import org.open2jam.parsers.utils.ByteHelper;
import org.open2jam.parsers.utils.Logger;
import org.open2jam.parsers.utils.SampleData;
/**
* this encapsulates a song chart.
* in case there's more than one rank(difficulty)
* for the song, the rank integer follows this pattern:
* 0 - easy, 1 - normal, 2 - hard, 3 - very hard, ...
* there's no upper bound.
*/
public abstract class Chart implements Comparable<Chart>, java.io.Serializable
{
public static enum TYPE {NONE, BMS, OJN, SM, XNT};
public TYPE type = TYPE.NONE;
protected File source;
protected int level = 0;
protected int keys = 7;
protected int players = 1;
protected String title = "";
protected String artist = "";
protected String genre = "";
protected String noter = "";
protected double bpm = 130;
protected int notes = 0;
protected int duration = 0;
protected String cover_name = null;
protected File image_cover = null;
protected File video = null;
protected Map<Integer, String> sample_index = new HashMap<Integer, String>();
protected Map<Integer, String> bga_index = new HashMap<Integer, String>();
/** the File object to the source file of this header */
public abstract File getSource();
/**
* an integer representing difficulty.
* we _should_ have some standard here
* maybe we could use o2jam as the default
* and normalize the others to this rule
*/
public abstract int getLevel();
/** The number of keys in this chart */
public abstract int getKeys();
/** The number of player for this chart */
public abstract int getPlayers();
/** The title of the song */
public abstract String getTitle();
/** The artist of the song */
public abstract String getArtist();
/** The genre of the song */
public abstract String getGenre();
/** The noter of the song (Unused?) */
public abstract String getNoter();
/** The samples of the song */
public Map<Integer, SampleData> getSamples() {
return new HashMap<Integer, SampleData>();
}
/** The images of the song */
public Map<Integer, File> getImages() {
return new HashMap<Integer, File>();
}
/** a bpm representing the whole song.
*** doesn't need to be exact, just for info */
public abstract double getBPM();
/** the number of notes in the song */
public abstract int getNoteCount();
/** the duration in seconds */
public abstract int getDuration();
/** a image cover, representing the song */
public abstract BufferedImage getCover();
/** this should return the list of events from this chart at this rank */
public abstract EventList getEvents();
/** return the cover image name without extension or null if there is no cover name */
public String getCoverName() {
if(cover_name == null) return null;
int dot = cover_name.lastIndexOf(".");
return cover_name.substring(0, dot);
}
/** Return true if the chart has a cover */
public boolean hasCover() {
return image_cover != null;
}
/** Return true if the chart has a video */
public boolean hasVideo() {
return video != null;
}
public File getVideo() {
return video;
}
/** Get the sample index of the chart */
public Map<Integer, String> getSampleIndex() {
return sample_index;
}
/** Get the image index of the chart */
public Map<Integer, String> getBgaIndex() {
return bga_index;
}
/** Copy the sample files to another directory */
public void copySampleFiles(File directory) throws IOException {
Collection<SampleData> samples = getSamples().values();
if(samples.isEmpty()) return;
for(SampleData ad : samples) {
ad.copyToFolder(directory);
}
}
public void copyBgaFiles(File directory) throws FileNotFoundException, IOException {
Collection<File> images = getImages().values();
if(images.isEmpty()) return;
for(File f : images) {
File out = new File(directory, f.getName());
if(!out.exists()) {
ByteHelper.copyTo(new FileInputStream(f), new FileOutputStream(out));
}
}
}
public int compareTo(Chart c)
{
return getLevel() - c.getLevel();
}
public BufferedImage getNoImage()
{
URL u = Chart.class.getResource("/resources/no_image.png"); //TODO Change this
if(u == null) return null;
try {
return ImageIO.read(new File(u.toURI()));
} catch (Exception ex) {
Logger.global.log(Level.WARNING, "Someone deleted or renamed my no_image image file :_ {0}", ex.getMessage());
}
return null;
}
}