package net.fe;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Scanner;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.JSONValue;
import org.json.simple.parser.ParseException;
import org.lwjgl.opengl.GL11;
import org.newdawn.slick.openal.Audio;
import org.newdawn.slick.openal.AudioLoader;
import org.newdawn.slick.opengl.Texture;
import org.newdawn.slick.util.ResourceLoader;
import chu.engine.AnimationData;
import chu.engine.anim.BitmapFont;
public class FEResources {
private static String[] searchFolders =
{"battle_anim", "battle_anim/static", "map_mugshots", "gui", "map_anim"};
private static HashMap<String, Audio> audio;
private static HashMap<String, AnimationData> textures;
private static HashMap<String, BitmapFont> bitmapFonts;
static {
audio = new HashMap<String, Audio>();
textures = new HashMap<String, AnimationData>();
bitmapFonts = new HashMap<String, BitmapFont>();
}
public static Texture getTexture(String string) {
return getTextureData(string).getTexture();
}
public static boolean hasTexture(String string){
return textures.containsKey(string);
}
public static void loadResources() {
try {
//Load bitmap fonts
loadBitmapFonts();
// Textures
textures.put("whoops", new AnimationData("res/whoops.png"));
loadTextures();
//load audio
audio.put("miss", AudioLoader.getAudio("WAV",
ResourceLoader.getResourceAsStream("res/sfx/miss.wav")));
} catch (IOException e) {
int max = GL11.glGetInteger(GL11.GL_MAX_TEXTURE_SIZE);
System.out.println(max);
e.printStackTrace();
}
System.gc();
}
public static AnimationData getMapTexture(String name){
AnimationData t = textures.get(name);
if(t!=null) return t;
System.out.println("Warn:" + name + " not explicitly defined");
for(String loc: searchFolders){
try{
AnimationData txt = new AnimationData("res/" + loc + "/" + name + ".png",
96, 24, 4, 4, 4, 4, 0, null, null);
textures.put(name, txt);
return txt;
} catch (Exception e){
}
}
return textures.get("whoops");
}
private static void loadTextures() {
long startTime = System.nanoTime();
// TODO Load textures from JSON
InputStream file = ResourceLoader.getResourceAsStream("res/resources.json");
Scanner in = new Scanner(file);
StringBuilder sb = new StringBuilder();
while(in.hasNextLine()) {
sb.append(in.nextLine());
}
String json = sb.toString();
JSONObject resources = null;
try {
resources = (JSONObject) JSONValue.parseWithException(json);
} catch (ParseException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
JSONArray txArray = (JSONArray) resources.get("textures");
LoadStage.setMaximum(txArray.size());
for(Object obj : txArray) {
JSONObject texture = (JSONObject) obj;
String name = (String)texture.get("name");
String path = (String)texture.get("path");
Number width = (Number)texture.get("width");
Number height = (Number)texture.get("height");
Number frames = (Number)texture.get("frames");
Number columns = (Number)texture.get("columns");
Number freeze = (Number)texture.get("freeze");
Number offsetX = (Number)texture.get("offsetX");
Number offsetY = (Number)texture.get("offsetY");
Number speed = (Number)texture.get("speed");
Number shakeFrames = (Number)texture.get("shakeFrames");
Number shakeIntensity = (Number)texture.get("shakeIntensity");
Boolean stop = (Boolean)texture.get("stop");
JSONArray hitArray = (JSONArray) texture.get("hitframes");
JSONArray audioArray = (JSONArray) texture.get("soundMap");
HashMap<Integer, String> audioMap = new HashMap<Integer, String>();
int[] hitframes;
if(hitArray != null) {
hitframes = new int[hitArray.size()];
for(int i=0; i<hitframes.length; i++) {
hitframes[i] = ((Number)hitArray.get(i)).intValue();
}
} else {
hitframes = new int[0];
}
if(audioArray != null) {
for(Object obj2 : audioArray) {
JSONObject audio = (JSONObject) obj2;
audioMap.put(((Number)audio.get("frame")).intValue(),
(String)audio.get("sound"));
}
}
AnimationData data;
if(width == null) {
data = new AnimationData(path);
} else {
data = new AnimationData(path,
width.intValue(),
height.intValue(),
frames.intValue(),
columns.intValue(),
offsetX.intValue(),
offsetY.intValue(),
freeze.intValue(),
hitframes,
audioMap);
}
if(speed != null)
data.speed = speed.floatValue();
if(shakeFrames != null)
data.shakeFrames = shakeFrames.intValue();
if(shakeIntensity != null)
data.shakeIntensity = shakeIntensity.intValue();
if(stop != null)
data.stop = stop.booleanValue();
textures.put(name, data);
if((System.nanoTime() - startTime)/1000000.0f > 100){
LoadStage.update(textures.size());
LoadStage.render();
}
}
in.close();
}
public static BitmapFont getBitmapFont(String name) {
return bitmapFonts.get(name);
}
public static void loadBitmapFonts() {
Scanner in = new Scanner(ResourceLoader.getResourceAsStream("res/fonts/fonts.txt"));
while(in.hasNextLine()) {
String line = in.nextLine();
if(line.startsWith("#"))
continue;
if(line.startsWith("define")) {
String name = line.split(":")[1];
String texName = in.nextLine();
char[] chars = in.nextLine().toCharArray();
int height = Integer.parseInt(in.nextLine());
int spacing = Integer.parseInt(in.nextLine());
char[] widths = in.nextLine().toCharArray();
BitmapFont font = new BitmapFont(texName);
font.setHeight(height);
font.setSpacing(spacing);
int pos = 0;
for(int i=0; i<chars.length; i++) {
int width = Integer.parseInt(widths[i]+"");
font.put(chars[i], pos, width);
pos += width;
}
bitmapFonts.put(name, font);
System.out.println(name+"(bitmap font) loaded");
}
}
in.close();
}
public static AnimationData getTextureData(String string) {
AnimationData t = textures.get(string);
if(t != null) {
return t;
} else {
//try to get it, in case we forgot
System.err.println("Warn: " + string + " not explicitly defined");
for(String loc: searchFolders){
if(ResourceLoader.resourceExists("res/" + loc + "/" + string + ".png")){
AnimationData txt = new AnimationData("res/" + loc + "/" + string + ".png");
textures.put(string, txt);
return txt;
}
}
return textures.get("whoops");
}
}
public static Audio getAudio(String name) {
Audio a = audio.get(name);
if(a == null) {
// System.err.println("Warn: " + name + " not explicitly defined");
try{
Audio b = AudioLoader.getAudio("WAV",
ResourceLoader.getResourceAsStream("res/sfx/"+name+".wav"));
audio.put(name, b);
return b;
} catch (Exception e){
return null;
}
} else {
return a;
}
}
}