/**
*
*/
package javastory.channel.maps;
import java.awt.Point;
import java.awt.Rectangle;
import java.util.ArrayList;
import java.util.List;
import javastory.wz.WzData;
import javastory.wz.WzDataProvider;
import javastory.wz.WzDataProviderFactory;
import javastory.wz.WzDataTool;
import com.google.common.collect.Lists;
/**
* @author shoftee
*
*/
public final class GameMapInfo {
private static final WzDataProvider mapDataProvider = WzDataProviderFactory.getDataProvider("Map.wz");
private final int mapId;
private final int returnMapId;
private final int forcedReturnMapId;
private final float monsterRate;
private final float recoveryRate;
private final int decHP, createMobInterval;
private final int protectItem;
private final int timeLimit;
private final int fieldLimit;
// private final int maxRegularSpawn;
private final boolean isTown, hasClock, allowsPersonalShop, isEverlast;
// private final boolean isNoDrops;
private final String onUserEnterScript, onFirstUserEnterScript;
private final FootholdTree footholds;
private final List<Rectangle> areas;
// TODO: Load these in constructor
// private final Map<Integer, Portal> portals;
// private final List<Spawns> monsterSpawn;
public GameMapInfo(final int mapId, final WzData data) {
this.mapId = mapId;
this.returnMapId = WzDataTool.getInt("info/returnMap", data);
this.forcedReturnMapId = WzDataTool.getInt("info/forcedReturn", data, 999_999_999);
this.monsterRate = WzDataTool.getFloat("info/mobRate", data, 0.0f);
this.recoveryRate = WzDataTool.getFloat("info/recovery", data, 1.0f);
this.decHP = WzDataTool.getInt("info/decHP", data, 0);
this.protectItem = WzDataTool.getInt("info/protectItem", data, 0);
this.timeLimit = WzDataTool.getInt("info/timeLimit", data, -1);
this.fieldLimit = WzDataTool.getInt("info/fieldLimit", data, 0);
this.createMobInterval = (short) WzDataTool.getInt("info/createMobInterval", data, 9000);
this.hasClock = data.hasChildAtPath("clock");
this.isTown = data.hasChildAtPath("info/town");
this.isEverlast = data.hasChildAtPath("info/everlast");
this.allowsPersonalShop = data.hasChildAtPath("info/personalShop");
this.onFirstUserEnterScript = WzDataTool.getString("info/onFirstUserEnter", data, "");
this.onUserEnterScript = WzDataTool.getString("info/onUserEnter", data, "");
this.footholds = loadFootholds(data);
final WzData areaData = data.getChildByPath("area");
if (areaData != null) {
this.areas = loadAreas(data);
} else {
this.areas = Lists.newArrayList();
}
}
private FootholdTree loadFootholds(WzData data) {
final List<Foothold> footholds = Lists.newLinkedList();
final Point lBound = new Point();
final Point uBound = new Point();
for (final WzData footholdData : data.getChildByPath("foothold")) {
for (final WzData category : footholdData) {
for (final WzData entry : category) {
final Foothold foothold = new Foothold(entry);
if (foothold.getX1() < lBound.x) {
lBound.x = foothold.getX1();
}
if (foothold.getX2() > uBound.x) {
uBound.x = foothold.getX2();
}
if (foothold.getY1() < lBound.y) {
lBound.y = foothold.getY1();
}
if (foothold.getY2() > uBound.y) {
uBound.y = foothold.getY2();
}
footholds.add(foothold);
}
}
}
final FootholdTree footholdTree = new FootholdTree(lBound, uBound);
for (final Foothold item : footholds) {
footholdTree.insert(item);
}
return footholdTree;
}
private ArrayList<Rectangle> loadAreas(WzData data) {
ArrayList<Rectangle> areas = Lists.newArrayList();
for (final WzData area : data) {
final int x1 = WzDataTool.getInt("x1", area);
final int y1 = WzDataTool.getInt("y1", area);
final int x2 = WzDataTool.getInt("x2", area);
final int y2 = WzDataTool.getInt("y2", area);
final Rectangle rectangle = new Rectangle(x1, y1, x2 - x1, y2 - y1);
areas.add(rectangle);
}
return areas;
}
}