/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package org.petah.spring.bai.cache;
import org.petah.spring.bai.map.metal.*;
import com.springrts.ai.oo.clb.Map;
import java.io.File;
import java.io.Serializable;
import java.util.List;
import java.util.logging.Logger;
import org.petah.common.option.Option;
import org.petah.common.option.OptionsManager;
import org.petah.common.util.profiler.Profiler;
import org.petah.spring.bai.InformationLogger;
import org.petah.spring.bai.ResourceManager;
import org.petah.spring.bai.util.ArrayUtil;
import org.petah.spring.bai.util.IOUtil;
import org.petah.spring.bai.util.MapUtil;
/**
*
* @author Petah
*/
public class CachedMetalMap implements Serializable {
public static final long serialVersionUID = 1L;
// Options
private static final Option<Integer> metalMapMinAverageMetal = OptionsManager.getOption(
new Option<Integer>("CachedMetalMap.metalMapMinAverageMetal", 60));
private static final Option<Integer> greenFieldsMapMaxMetal = OptionsManager.getOption(
new Option<Integer>("CachedMetalMap.greenFieldsMapMaxMetal", 1000));
private static final Option<Boolean> cacheToDisk = OptionsManager.getOption(
new Option<Boolean>("CachedMetalMap.cacheToDisk", false));
// Class properties
private int width;
private int height;
private List<Short> metalMap;
private float metalExtractorRadius;
private MetalMapType metalMapType;
private long totalMetal;
private float averageMetal;
public CachedMetalMap(Map map) {
Profiler.start(CachedMetalMap.class, "CachedMetalMap()");
File file = new File(InformationLogger.getCacheDirectory().getAbsolutePath() + File.separator +
map.getName() + "." + map.getChecksum() + "." + serialVersionUID + ".metal.bin");
CachedMetalMap loadedObject = (CachedMetalMap) IOUtil.loadCacheFile(cacheToDisk, file);
if (loadedObject != null) {
width = loadedObject.width;
height = loadedObject.height;
metalMap = loadedObject.metalMap;
metalExtractorRadius = loadedObject.metalExtractorRadius;
metalMapType = loadedObject.metalMapType;
totalMetal = loadedObject.totalMetal;
averageMetal = loadedObject.averageMetal;
Logger.getLogger(CachedMetalMap.class.getName()).info("Loaded metal map from cache.");
} else {
width = MapUtil.mapToMetal(map.getWidth());
height = MapUtil.mapToMetal(map.getHeight());
metalMap = map.getResourceMapRaw(ResourceManager.getMetal());
metalExtractorRadius = map.getExtractorRadius(ResourceManager.getMetal());
// Calculate total metal
totalMetal = 0;
for (int x = 0; x < width; x++) {
for (int y = 0; y < height; y++) {
totalMetal += getValue(x, y);
}
}
// Get average metal
averageMetal = (float) totalMetal / (float) metalMap.size();
// Get metal map type
if (averageMetal >= metalMapMinAverageMetal.getValue()) {
metalMapType = MetalMapType.Metal;
} else if (totalMetal <= greenFieldsMapMaxMetal.getValue()) {
metalMapType = MetalMapType.GreenFields;
} else {
metalMapType = MetalMapType.Normal;
}
Logger.getLogger(CachedMetalMap.class.getName()).info("Processed metal map.");
}
IOUtil.saveCacheFile(cacheToDisk, file, this);
Profiler.stop(CachedMetalMap.class, "CachedMetalMap()");
}
/**
* Gets the metal value at a position.
* @param x x position on the metal map
* @param y y position on the metal map
* @return value between 0-255
*/
public short getValue(int x, int y) {
short value = metalMap.get(ArrayUtil.get1DIndex(x, y, width));
if (value == -1) {
value = 255;
} else if (value < -1) {
value += 256;
}
return value;
}
public float getMetalExtractorTerrainRadius() {
return metalExtractorRadius;
}
public float getMetalExtractorRadius() {
return metalExtractorRadius / 20;
}
public int getWidth() {
return width;
}
public int getHeight() {
return height;
}
public MetalMapType getMetalMapType() {
return metalMapType;
}
public float getAverageMetal() {
return averageMetal;
}
public long getTotalMetal() {
return totalMetal;
}
}