package server;
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import provider.MapleData;
import provider.MapleDataProvider;
import provider.MapleDataProviderFactory;
import provider.MapleDataTool;
import tools.Pair;
public class ItemMakerFactory {
private static final ItemMakerFactory instance = new ItemMakerFactory();
protected Map<Integer, ItemMakerCreateEntry> createCache = new HashMap();
protected Map<Integer, GemCreateEntry> gemCache = new HashMap();
public static ItemMakerFactory getInstance() {
return instance;
}
protected ItemMakerFactory() {
// 0 = Item upgrade crystals
// 1 / 2/ 4/ 8 = Item creation
final MapleData info = MapleDataProviderFactory.getDataProvider(new File("wz/Etc.wz")).getData("ItemMake.img");
byte totalupgrades, reqMakerLevel;
int reqLevel, cost, quantity, stimulator;
GemCreateEntry ret;
ItemMakerCreateEntry imt;
for (MapleData dataType : info.getChildren()) {
int type = Integer.parseInt(dataType.getName());
switch (type) {
case 0: { // Caching of gem
for (MapleData itemFolder : dataType.getChildren()) {
reqLevel = MapleDataTool.getInt("reqLevel", itemFolder, 0);
reqMakerLevel = (byte) MapleDataTool.getInt("reqSkillLevel", itemFolder, 0);
cost = MapleDataTool.getInt("meso", itemFolder, 0);
quantity = MapleDataTool.getInt("itemNum", itemFolder, 0);
// totalupgrades = MapleDataTool.getInt("tuc", itemFolder, 0); // Gem is always 0
ret = new GemCreateEntry(cost, reqLevel, reqMakerLevel, quantity);
for (MapleData rewardNRecipe : itemFolder.getChildren()) {
for (MapleData ind : rewardNRecipe.getChildren()) {
if (rewardNRecipe.getName().equals("randomReward")) {
ret.addRandomReward(MapleDataTool.getInt("item", ind, 0), MapleDataTool.getInt("prob", ind, 0));
// MapleDataTool.getInt("itemNum", ind, 0)
} else if (rewardNRecipe.getName().equals("recipe")) {
ret.addReqRecipe(MapleDataTool.getInt("item", ind, 0), MapleDataTool.getInt("count", ind, 0));
}
}
}
gemCache.put(Integer.parseInt(itemFolder.getName()), ret);
}
break;
}
case 1: // Warrior
case 2: // Magician
case 4: // Bowman
case 8: // Thief
case 16: { // Pirate
for (MapleData itemFolder : dataType.getChildren()) {
reqLevel = MapleDataTool.getInt("reqLevel", itemFolder, 0);
reqMakerLevel = (byte) MapleDataTool.getInt("reqSkillLevel", itemFolder, 0);
cost = MapleDataTool.getInt("meso", itemFolder, 0);
quantity = MapleDataTool.getInt("itemNum", itemFolder, 0);
totalupgrades = (byte) MapleDataTool.getInt("tuc", itemFolder, 0);
stimulator = MapleDataTool.getInt("catalyst", itemFolder, 0);
imt = new ItemMakerCreateEntry(cost, reqLevel, reqMakerLevel, quantity, totalupgrades, stimulator);
for (MapleData Recipe : itemFolder.getChildren()) {
for (MapleData ind : Recipe.getChildren()) {
if (Recipe.getName().equals("recipe")) {
imt.addReqItem(MapleDataTool.getInt("item", ind, 0), MapleDataTool.getInt("count", ind, 0));
}
}
}
createCache.put(Integer.parseInt(itemFolder.getName()), imt);
}
break;
}
}
}
}
public GemCreateEntry getGemInfo(int itemid) {
return (GemCreateEntry) this.gemCache.get(Integer.valueOf(itemid));
}
public ItemMakerCreateEntry getCreateInfo(int itemid) {
return (ItemMakerCreateEntry) this.createCache.get(Integer.valueOf(itemid));
}
public static class ItemMakerCreateEntry {
private int reqLevel;
private int cost;
private int quantity;
private int stimulator;
private byte tuc;
private byte reqMakerLevel;
private List<Pair<Integer, Integer>> reqItems = new ArrayList();
private List<Integer> reqEquips = new ArrayList();
public ItemMakerCreateEntry(int cost, int reqLevel, byte reqMakerLevel, int quantity, byte tuc, int stimulator) {
this.cost = cost;
this.tuc = tuc;
this.reqLevel = reqLevel;
this.reqMakerLevel = reqMakerLevel;
this.quantity = quantity;
this.stimulator = stimulator;
}
public byte getTUC() {
return this.tuc;
}
public int getRewardAmount() {
return this.quantity;
}
public List<Pair<Integer, Integer>> getReqItems() {
return this.reqItems;
}
public List<Integer> getReqEquips() {
return this.reqEquips;
}
public int getReqLevel() {
return this.reqLevel;
}
public byte getReqSkillLevel() {
return this.reqMakerLevel;
}
public int getCost() {
return this.cost;
}
public int getStimulator() {
return this.stimulator;
}
protected void addReqItem(int itemId, int amount) {
this.reqItems.add(new Pair(Integer.valueOf(itemId), Integer.valueOf(amount)));
}
}
public static class GemCreateEntry {
private int reqLevel;
private int reqMakerLevel;
private int cost;
private int quantity;
private List<Pair<Integer, Integer>> randomReward = new ArrayList();
private List<Pair<Integer, Integer>> reqRecipe = new ArrayList();
public GemCreateEntry(int cost, int reqLevel, int reqMakerLevel, int quantity) {
this.cost = cost;
this.reqLevel = reqLevel;
this.reqMakerLevel = reqMakerLevel;
this.quantity = quantity;
}
public int getRewardAmount() {
return this.quantity;
}
public List<Pair<Integer, Integer>> getRandomReward() {
return this.randomReward;
}
public List<Pair<Integer, Integer>> getReqRecipes() {
return this.reqRecipe;
}
public int getReqLevel() {
return this.reqLevel;
}
public int getReqSkillLevel() {
return this.reqMakerLevel;
}
public int getCost() {
return this.cost;
}
protected void addRandomReward(int itemId, int prob) {
this.randomReward.add(new Pair(Integer.valueOf(itemId), Integer.valueOf(prob)));
}
protected void addReqRecipe(int itemId, int count) {
this.reqRecipe.add(new Pair(Integer.valueOf(itemId), Integer.valueOf(count)));
}
}
}