package javastory.channel.life;
import java.awt.Point;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Map;
import javastory.db.Database;
import javastory.game.data.MobInfo;
import javastory.game.data.NpcInfo;
import javastory.tools.StringUtil;
import javastory.wz.WzData;
import javastory.wz.WzDataProvider;
import javastory.wz.WzDataProviderFactory;
import javastory.wz.WzDataTool;
import com.google.common.collect.Maps;
public final class LifeFactory {
private static final WzDataProvider dataRoot = WzDataProviderFactory.getDataProvider("Mob.wz");
private static final WzDataProvider stringRoot = WzDataProviderFactory.getDataProvider("String.wz");
private static final WzDataProvider etcRoot = WzDataProviderFactory.getDataProvider("Etc.wz");
private static final WzData npcStrings = stringRoot.getData("Npc.img");
private static final WzData npcLocationData = etcRoot.getData("NpcLocation.img");
private static final Map<Integer, MobInfo> monsterInfo = Maps.newHashMap();
private static final Map<Integer, Integer> npcLocations = Maps.newHashMap();
public static AbstractLoadedLife getLife(final int id, final String type) {
final String typeUpper = type.toUpperCase();
switch (typeUpper) {
case "N":
return getNpc(id);
case "M":
return getMonster(id);
default:
System.err.println("Unknown Life type: " + type + "");
return null;
}
}
public static int getNpcLocation(final int npcId) {
if (npcLocations.containsKey(npcId)) {
return npcLocations.get(npcId);
}
final int map = WzDataTool.getIntConvert(Integer.toString(npcId) + "/0", npcLocationData);
npcLocations.put(npcId, map);
return map;
}
public static Monster getMonster(final int mobId) {
MobInfo info = monsterInfo.get(Integer.valueOf(mobId));
if (info == null) {
info = loadMonster(mobId);
}
return new Monster(info);
}
private static MobInfo loadMonster(final int mobId) {
final WzData monsterData = getMonsterData(mobId);
if (monsterData == null) {
return null;
}
final int linkedMobId = WzDataTool.getIntConvert("info/link", monsterData, 0);
WzData linkedData = null;
if (linkedMobId != 0) {
linkedData = getMonsterData(linkedMobId);
}
final MobInfo info = new MobInfo(mobId, monsterData, linkedData);
monsterInfo.put(Integer.valueOf(mobId), info);
return info;
}
private static WzData getMonsterData(final int mobId) {
final String paddedId = StringUtil.getLeftPaddedStr(Integer.toString(mobId), '0', 7);
final WzData monsterData = dataRoot.getData(paddedId + ".img");
return monsterData;
}
public static Npc getNpc(final int lifeId) {
if (isPlayerNpc(lifeId)) {
final NpcInfo info = new NpcInfo("", true);
final Npc npc = new Npc(lifeId, info);
PreparedStatement ps = null;
ResultSet rs = null;
try {
final Connection con = Database.getConnection();
ps = con.prepareStatement("SELECT * FROM playernpcs WHERE npcid = ?");
ps.setInt(1, lifeId);
rs = ps.executeQuery();
if (rs.next()) {
info.setCY(rs.getInt("cy"));
info.setName(rs.getString("name"));
info.setHair(rs.getInt("hair"));
info.setFace(rs.getInt("face"));
info.setSkin(rs.getByte("skin"));
info.setFH(rs.getInt("Foothold"));
info.setRX0(rs.getInt("rx0"));
info.setRX1(rs.getInt("rx1"));
npc.setPosition(new Point(rs.getInt("x"), info.getCY()));
ps.close();
rs.close();
ps = con.prepareStatement("SELECT * FROM playernpcs_equip WHERE npcid = ?");
ps.setInt(1, rs.getInt("id"));
rs = ps.executeQuery();
final Map<Byte, Integer> equips = Maps.newHashMap();
while (rs.next()) {
equips.put(rs.getByte("equippos"), rs.getInt("equipid"));
}
info.setEquips(equips);
rs.close();
ps.close();
}
} catch (final SQLException ex) {
} finally {
try {
if (ps != null) {
ps.close();
}
if (rs != null) {
rs.close();
}
} catch (final SQLException ignore) {
}
}
return npc;
} else {
final String name = WzDataTool.getString(lifeId + "/name", npcStrings, "MISSINGNO");
return new Npc(lifeId, new NpcInfo(name, false));
}
}
private static boolean isPlayerNpc(final int lifeId) {
return lifeId >= 9901000 && lifeId <= 9901551;
}
}