package javastory.game.data;
import java.util.Map;
import javastory.wz.WzData;
import javastory.wz.WzDataProviderFactory;
import javastory.wz.WzDataTool;
import com.google.common.collect.Maps;
public final class ItemMakerFactory {
private final static ItemMakerFactory instance = new ItemMakerFactory();
private final Map<Integer, MakerItemInfo> itemCache = Maps.newHashMap();
private final Map<Integer, GemInfo> gemCache = Maps.newHashMap();
public static ItemMakerFactory getInstance() {
// DO ItemMakerFactory.getInstance() on ChannelServer startup.
return instance;
}
private ItemMakerFactory() {
System.out.println(":: Loading ItemMakerFactory ::");
// 0 = Item upgrade crystals
// 1 / 2/ 4/ 8 = Item creation
final WzData info = WzDataProviderFactory.getDataProvider("Etc.wz").getData("ItemMake.img");
for (final WzData directory : info.getChildren()) {
final int type = Integer.parseInt(directory.getName());
switch (type) {
case 0: // Gem
this.cacheGems(directory);
break;
case 1: // Warrior
case 2: // Magician
case 4: // Bowman
case 8: // Thief
case 16: // Pirate
this.cacheItems(directory);
break;
}
}
}
private void cacheGems(final WzData directory) {
byte reqMakerLevel;
int reqLevel, cost, quantity;
for (final WzData gemDirectory : directory.getChildren()) {
reqLevel = WzDataTool.getInt("reqLevel", gemDirectory, 0);
reqMakerLevel = (byte) WzDataTool.getInt("reqSkillLevel", gemDirectory, 0);
cost = WzDataTool.getInt("meso", gemDirectory, 0);
quantity = WzDataTool.getInt("itemNum", gemDirectory, 0);
final RandomRewardList rewards = new RandomRewardList();
final ItemRecipeBuilder recipe = new ItemRecipeBuilder();
for (final WzData gemInfo : gemDirectory.getChildren()) {
for (final WzData ind : gemInfo.getChildren()) {
switch (gemInfo.getName()) {
case "randomReward":
rewards.addEntry(WzDataTool.getInt("prob", ind, 0), WzDataTool.getInt("item", ind, 0));
break;
case "recipe":
recipe.addEntry(WzDataTool.getInt("item", ind, 0), WzDataTool.getInt("count", ind, 0));
break;
}
}
}
final GemInfo gemInfo = new GemInfo(rewards.build(), recipe.build(), cost, reqLevel, reqMakerLevel, quantity);
this.gemCache.put(Integer.parseInt(gemDirectory.getName()), gemInfo);
}
}
private void cacheItems(final WzData directory) {
for (final WzData itemFolder : directory.getChildren()) {
final int reqLevel = WzDataTool.getInt("reqLevel", itemFolder, 0);
final byte reqMakerLevel = (byte) WzDataTool.getInt("reqSkillLevel", itemFolder, 0);
final int cost = WzDataTool.getInt("meso", itemFolder, 0);
final int quantity = WzDataTool.getInt("itemNum", itemFolder, 0);
final byte totalupgrades = (byte) WzDataTool.getInt("tuc", itemFolder, 0);
final int stimulator = WzDataTool.getInt("catalyst", itemFolder, 0);
final ItemRecipeBuilder recipe = new ItemRecipeBuilder();
for (final WzData recipeFolder : itemFolder.getChildren()) {
for (final WzData ind : recipeFolder.getChildren()) {
if (recipeFolder.getName().equals("recipe")) {
final int id = WzDataTool.getInt("item", ind, 0);
final int count = WzDataTool.getInt("count", ind, 0);
recipe.addEntry(id, count);
}
}
}
final MakerItemInfo makerItemInfo = new MakerItemInfo(recipe.build(), cost, reqLevel, reqMakerLevel, quantity, totalupgrades, stimulator);
final int itemId = Integer.parseInt(itemFolder.getName());
this.itemCache.put(itemId, makerItemInfo);
}
}
public GemInfo getGemInfo(final int itemId) {
return this.gemCache.get(itemId);
}
public MakerItemInfo getItemInfo(final int itemId) {
return this.itemCache.get(itemId);
}
}