package minefantasy.mf2.material;
import java.util.HashMap;
import minefantasy.mf2.api.MineFantasyAPI;
import minefantasy.mf2.api.armour.ArmourMaterialMF;
import minefantasy.mf2.api.helpers.ArmourCalculator;
import minefantasy.mf2.util.MFLogUtil;
import net.minecraft.item.Item.ToolMaterial;
import net.minecraftforge.common.util.EnumHelper;
/**
* This is used to create both tool and armour materials. Variables needed: Durability, protection, sharpness, enchantment, weight, harvestLvl
*/
public class BaseMaterialMF
{
public static HashMap<String, BaseMaterialMF> materialMap = new HashMap<String, BaseMaterialMF>();
public static BaseMaterialMF linen, wool, leatherapron, hide, rough, reinforced, padding, studded, scaled, dragonscale;//Cloth and leather
public static BaseMaterialMF stone, tin, pigiron, silver, gold, ornate, weakblacksteel, weakredsteel, weakbluesteel, tungsten;//Misc Mats
public static BaseMaterialMF copper, bronze, iron, steel, encrusted, obsidian, blacksteel, bluesteel, redsteel,dragonforge, adamantium, mithril, ignotumite, mithium, enderforge;//Tiers
public static BaseMaterialMF cogworks, compositeAlloy;//Engineer
/**
* This scales armour so a sword hitting full mail of equal tier has this as a result
* Used so armour can scale up with weapon damage
*/
private static final float armourVsSwordBalance = 2.0F;
/**
* The base damage for swords used with players. (Swords are 4+dam, adding 1 dam for player base hit dam)
*/
private static final float swordDam = 5F;
private static float ACrounding = 10F; //round to nearest 10
/*
* WOOD(0, 59, 2.0F, 0.0F, 15),
STONE(1, 131, 4.0F, 1.0F, 5),
IRON(2, 250, 6.0F, 2.0F, 14),
EMERALD(3, 1561, 8.0F, 3.0F, 10),
GOLD(0, 32, 12.0F, 0.0F, 22);
* To get variables: X = sword damage, Y = Armour Ratio(+1 of value), Z = Damage
*
* X = Z * Y
* Y = X / Z
* Z = X / Y
*/
//Rounding off to nearest 0.5 makes about an 0.03 difference, but the AR is cleaner
//Hardness isn't added, it calculats armour itself to match sharpness
// name dura, AC enchant weight
public static void init()
{
//LEATHER AND CLOTH
linen = addArmourSpecificMaterial("Linen", 0, 10 , 0.1F, 0, 1.00F, 0);
wool = addArmourSpecificMaterial("Wool" , 1, 15 , 0.1F, 0, 1.00F, 5);
leatherapron = addArmourSpecificMaterial("LeatherApron", 0, 10 , 1.5F, 0, 0.50F, 0);
hide = addArmourSpecificMaterial("Hide", 0, 100 , 1.5F, 0, 1.00F, 0);
rough = addArmourSpecificMaterial("RoughLeather", 0, 150 , 1.5F, 1, 1.00F, 0);
reinforced = addArmourSpecificMaterial("StrongLeather", 1, 250, 2.3F, 1, 1.00F, 5);
padding = addArmourSpecificMaterial("Padded", 1, 100 , 2.3F, 0, 0.50F, 5);
studded = addArmourSpecificMaterial("StudLeather", 1, 500, 2.5F, 5, 1.20F, 15);
scaled = addArmourSpecificMaterial("ScaleLeather", 2, 1000, 2.8F, 8, 1.50F, 25);
dragonscale = addArmourSpecificMaterial("Dragonscale", 3, 3000, 5F, 20, 1.20F, 85).setRarity(2);
// name Tier dura, harvest sharpness enchant weight
//MISC
weakblacksteel = addMaterial("BlackSteelWeak", -1, 250, 4, 2.0F, 0, 1.00F, 40).setForgeStats(4, 4, 4.0F, 150, 500);
weakredsteel = addMaterial("RedSteelWeak", -1, 400, 5, 3.0F, 0, 1.10F, 65).setForgeStats(4, 4, 4.0F, 200, 500);
weakbluesteel = addMaterial("BlueSteelWeak", -1, 300, 5, 2.5F, 0, 0.90F, 65).setForgeStats(4, 4, 4.0F, 175, 500);
stone = addMaterial("Stone", 0, 50 , 0, 0.1F, 0.0F, 0, 2.00F, 0).setForgeStats(0, 0, 0.75F, 0, 0);
tin = addMaterial("Tin", 0, 100, 0, 0.2F, 5 , 0.80F, 0).setForgeStats(0, 0, 0, 85, 100);
pigiron = addMaterial("PigIron", 0, 250, 0, 1.5F, 3 , 1.00F, 0).setForgeStats(2, 2, 2.0F, 100, 400);
silver = addMaterial("Silver", -1, 150, 0, 0.0F, 10, 0.70F, 0).setForgeStats(1, 1, 3F, 90, 120);
gold = addMaterial("Gold", -1, 150, 0, 0.0F, 25, 1.50F, 0).setForgeStats(1, 1, 3F, 90, 120);
//goldPure = addMaterial("PureGold", -1, 50 , 0, 0.0F, 50, 2.00F, 0).setRarity(1);
ornate = addMaterial("Ornate", -1, 300, 0, 0.0F, 30, 1.00F, 30).setRarity(1).setForgeStats(1, 1, 4F, 120, 150);
tungsten = addMaterial("Tungsten", 2, 600, 3, 4F, 5 , 1.50F, 0).setRarity(1).setForgeStats(3, 3, 5.0F, 150, 300);
//TIERS
//Basic / Common Materials (0-2) Levels 0-50
copper = addMaterial("Copper", 0, 200, 1, 1.0F, 5, 1.00F, 0).setForgeStats(0, 0, 1.0F, 95, 250); //lvl 0-4
bronze = addMaterial("Bronze", 1, 300, 2, 1.5F, 5 , 1.00F, 5).setForgeStats(1, 1, 2.5F, 100, 250); //lvl 5-14
iron = addMaterial("Iron", 2, 500, 2, 2.0F, 5 , 1.00F, 15).setForgeStats(2, 2, 2.0F, 90, 250); //lvl 15-24
steel = addMaterial("Steel", 3, 750, 2, 2.5F, 10, 1.00F, 25).setForgeStats(3, 3, 2.5F, 120, 250); //lvl 25-39
encrusted = addMaterial("Encrusted", 3, 2000, 3, 3.5F, 25, 1.00F, 40).setForgeStats(3, 3, 5.0F, 130, 240); //lvl 40-49
obsidian = addMaterial("Obsidian", 3, 2000, 3, 3.5F, 25, 1.00F, 40).setForgeStats(3, 3, 5.0F, 130, 240); //lvl 40-49
//Advanced Materials (3 - 4) Levels 50-75
blacksteel = addMaterial("BlackSteel", 4, 1500, 4, 4.0F, 12, 1.00F, 50).setForgeStats(4, 4, 4.0F, 150, 350);//lvl 50
dragonforge = addMaterial("Dragonforge", 4, 1500, 4, 5.0F, 14, 1.00F, 60).setForgeStats(4, 4, 8.0F, 250, 350).setRarity(1).setResistances(100F, 0F);//lvl 60
redsteel = addMaterial("RedSteel", 5, 2000, 5, 6.0F, 1 , 1.15F, 75).setForgeStats(5, 5, 6.5F, 200, 350).setResistances(20F, 0F);//lvl 75
bluesteel = addMaterial("BlueSteel", 5, 1800, 5, 5.0F, 20, 0.75F, 75).setForgeStats(5, 5, 4.5F, 175, 325).setResistances(0F, 20F);//lvl 75
//Mythic Materials (5) Levels 75-100
adamantium = addMaterial("Adamantium", 6, 3000, 6, 8.0F, 10 , 1.25F, 90).setForgeStats(6, 5, 9.0F, 300, 400).setRarity(1).setResistances(35F, 0F);//lvl 90
mithril = addMaterial("Mithril", 6, 2500, 6, 7.0F, 30, 0.50F, 90).setForgeStats(6, 5, 6.0F, 280, 400).setRarity(1).setResistances(0F, 35F);//lvl 90
//Masterwork Materials (6) Level 100
ignotumite = addMaterial("Ignotumite", 7, 1000, 7, 14.0F, 20 , 2.00F, 100).setForgeStats(7, 5, 15.0F, 350, 400).setRarity(2).setResistances(50F, 0F);//High damage, heavy, fire resist lvl 100
mithium = addMaterial("Mithium", 7, 1000, 7, 10.0F, 40, 0.25F, 100).setForgeStats(7, 5, 15.0F, 330, 400).setRarity(2).setResistances(0F, 50F);//Low damage, light, magic resist lvl 100
enderforge = addMaterial("Ender", 7, 1000, 7, 12.0F, 20, 1.00F, 100).setForgeStats(7, 5, 15.0F, 400, 450).setRarity(2).setResistances(25F, 25F);//Middle lvl 100
//Engineer Materials
//steel = addMaterial("Steel", 3, 750, 2, 2.5F, 10, 1.00F, 25).setForgeStats(3, 3, 2.5F, 120, 250); //lvl 25-39
cogworks = addArmourSpecificMaterial("Cogworks", 4, 500, 1.0F, 10, 1.00F, 85).setForgeStats(3, 3, 2.5F, 120, 250);
compositeAlloy = addArmourSpecificMaterial("CompositeAlloy", 4, 1800, 4.0F, 10, 2.00F, 85).setForgeStats(3, 3, 2.5F, 120, 250).setResistances(95F, 85F);
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~CLASS START~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
/**
* This method auto-calculates the Armour Rating to scale the damage
*/
public static BaseMaterialMF addArmourSpecificMaterial(String name, int tier, int durability, float AC, int enchantment, float weight, int lvl)
{
return addMaterial(name, tier, durability, -1, AC, -1, enchantment, weight, lvl);
}
public static BaseMaterialMF addMaterial(String name, int tier, int durability, int harvestLevel, float sharpness, int enchantment, float weight, int lvl)
{
float AC = 0;
if(ArmourCalculator.useThresholdSystem)
{
AC = (sharpness+swordDam) - 2.0F;
MFLogUtil.logDebug("Added Threshold Armour Material " + name + " AR = " + AC);
}
else
{
AC = ((sharpness+swordDam)/armourVsSwordBalance) - 1.0F;
MFLogUtil.logDebug("Added Ratio Armour Material " + name + " AR = " + AC);
}
float initAc = AC;
AC = Math.round(AC*(100F/ACrounding));
AC = AC/(100F/ACrounding);
if(initAc != AC)
{
MFLogUtil.logDebug("Auto-Calculated ArmourRating for tier: " + name + ", modified to " + AC);
}
return addMaterial(name, tier, durability, harvestLevel, AC, sharpness, enchantment, weight, lvl);
}
public static BaseMaterialMF addMaterial(String name, int tier, int durability, int harvestLevel, float hardness, float sharpness, int enchantment, float weight, int lvl)
{
return register(new BaseMaterialMF(name, tier, durability, harvestLevel, hardness, sharpness, enchantment, weight, lvl));
}
public static BaseMaterialMF register(BaseMaterialMF material)
{
materialMap.put(material.name.toLowerCase(), material);
return material;
}
public String name;
/**
* This variable determines max uses
*/
public int durability;
/**
* This variable determines the protection
* : Hardness and sharpness are normally relevant to each other (so armour vs weapon equal tier has the same after-calculation damage)
*/
public float hardness;
/**
* This variable determines damage and dig speed
* : Hardness and sharpness are normally relevant to each other (so armour vs weapon equal tier has the same after-calculation damage)
*/
public float sharpness;
/**
* This variable determines enchantement
*/
public int enchantment;
public float weight;
/**
* The required level to craft
*/
public int requiredLevel;
//TIERING
/**
* The tier the material is on
*/
public int tier;
public int harvestLevel;
//FORGING
public int hammerTier;
public int anvilTier;
public float craftTimeModifier = 2.0F;
public int workableTemp = 100;
public int unstableTemp = 150;
//RESISTANCES
public float fireResistance;
public float arcaneResistance;
public boolean isMythic = false;
//SPECIALS
private ArmourMaterialMF armourConversion;
private ToolMaterial toolConversion;
public int rarity;
public BaseMaterialMF(String name, int tier, int durability, int harvestLevel, float hardness, float sharpness, int enchantment, float weight, int lvl)
{
this.requiredLevel = lvl;
this.name = name;
this.tier = tier;
this.durability = durability;
this.hardness = hardness;
this.sharpness = sharpness;
this.enchantment = enchantment;
this.weight = weight;
this.harvestLevel = harvestLevel;
}
protected BaseMaterialMF setForgeStats(int hammer, int anvil, float timer, int workable, int unstable)
{
hammerTier = hammer;
anvilTier = anvil;
craftTimeModifier = (timer*2F) + 2.0F;
workableTemp = workable;
unstableTemp = unstable;
return this;
}
protected BaseMaterialMF setResistances(float fire, float arcane)
{
fireResistance = fire;
arcaneResistance = arcane;
return this;
}
protected BaseMaterialMF setRarity(int value)
{
rarity = value;
return this;
}
protected BaseMaterialMF setMythic()
{
isMythic = true;
return this;
}
private ArmourMaterialMF convertToMFArmour()
{
return new ArmourMaterialMF("MF"+name, durability, hardness, enchantment, weight).setFireResistance(fireResistance).setMagicResistance(arcaneResistance).setMythic(isMythic);
}
private ToolMaterial convertToTool()
{
return EnumHelper.addToolMaterial("MF"+name, harvestLevel, durability, 2.0F+(sharpness*2F), sharpness, enchantment);
}
private static ArmourMaterialMF getMFArmourMaterial(String name)
{
BaseMaterialMF material = materialMap.get(name);
return material != null ? getMFArmourMaterial(material) : null;
}
public ArmourMaterialMF getArmourConversion()
{
if(armourConversion == null)
{
armourConversion = getMFArmourMaterial(this);
}
return armourConversion;
}
public static ArmourMaterialMF getMFArmourMaterial(BaseMaterialMF material)
{
return material.convertToMFArmour();
}
public static ToolMaterial getToolMaterial(String name)
{
BaseMaterialMF material = materialMap.get(name);
return material != null ? getToolMaterial(material) : null;
}
public ToolMaterial getToolConversion()
{
if(toolConversion == null)
{
toolConversion = getToolMaterial(this);
}
return toolConversion;
}
public static ToolMaterial getToolMaterial(BaseMaterialMF material)
{
return material.convertToTool();
}
public static BaseMaterialMF getMaterial(String name)
{
return materialMap.get(name.toLowerCase());
}
}