package greymerk.roguelike.treasure.loot.provider; import java.util.Random; import greymerk.roguelike.treasure.loot.Enchant; import greymerk.roguelike.treasure.loot.Equipment; import greymerk.roguelike.treasure.loot.Loot; import greymerk.roguelike.treasure.loot.Quality; import greymerk.roguelike.util.TextFormat; import net.minecraft.init.Items; import net.minecraft.item.ItemStack; public class ItemSpecialty extends ItemBase { private Equipment type; private Quality quality; public ItemSpecialty(int weight, int level){ super(weight, level); } public ItemSpecialty(int weight, int level, Equipment type, Quality q){ super(weight, level); this.type = type; this.quality = q; } public ItemSpecialty(int weight, int level, Quality q){ super(weight, level); this.quality = q; } @Override public ItemStack get(Random rand){ if(this.type == null && quality != null){ return getRandomItem(Equipment.values()[rand.nextInt(Equipment.values().length)], rand, this.quality); } if(this.type == null || quality == null){ return getRandomItem(rand, this.level); } return getRandomItem(this.type, rand, this.quality); } public static ItemStack getRandomItem(Random rand, int level){ return getRandomItem(Equipment.values()[rand.nextInt(Equipment.values().length)], rand, level); } public static ItemStack getRandomItem(Equipment type, Random rand, int level){ return getRandomItem(type, rand, Quality.get(rand, level, type)); } public static ItemStack getRandomItem(Equipment type, Random rand, Quality quality){ switch(type){ case SWORD: return getSword(rand, quality); case BOW: return getBow(rand, quality); case HELMET: return getHelmet(rand, quality); case CHEST: return getChest(rand, quality); case LEGS: return getLegs(rand, quality); case FEET: return getBoots(rand, quality); case PICK: return getPick(rand, quality); case AXE: return getAxe(rand, quality); case SHOVEL: return getShovel(rand, quality); default: return null; } } public static ItemStack getRandomArmour(Random rand, Quality quality){ switch(rand.nextInt(4)){ case 0: return getRandomItem(Equipment.HELMET, rand, quality); case 1: return getRandomItem(Equipment.CHEST, rand, quality); case 2: return getRandomItem(Equipment.LEGS, rand, quality); case 3: return getRandomItem(Equipment.FEET, rand, quality); default: return null; } } public static ItemStack getRandomTool(Random rand, Quality quality){ switch(rand.nextInt(3)){ case 0: return getRandomItem(Equipment.PICK, rand, quality); case 1: return getRandomItem(Equipment.AXE, rand, quality); case 2: return getRandomItem(Equipment.SHOVEL, rand, quality); default: return null; } } private static ItemStack getShovel(Random rand, Quality quality){ ItemStack item; if(quality == Quality.DIAMOND){ item = new ItemStack(Items.DIAMOND_SHOVEL); item.addEnchantment(Enchant.getEnchant(Enchant.EFFICIENCY), 3 + rand.nextInt(3)); item.addEnchantment(Enchant.getEnchant(Enchant.UNBREAKING), getUnbreakingLevel(quality, rand)); Loot.setItemName(item, "Soul Spade"); return item; } else { item = new ItemStack(Items.IRON_SHOVEL); item.addEnchantment(Enchant.getEnchant(Enchant.EFFICIENCY), 1 + rand.nextInt(2)); item.addEnchantment(Enchant.getEnchant(Enchant.UNBREAKING), getUnbreakingLevel(quality, rand)); Loot.setItemName(item, "Grave Spade"); return item; } } private static ItemStack getAxe(Random rand, Quality quality){ ItemStack item; if(quality == Quality.DIAMOND){ item = new ItemStack(Items.DIAMOND_AXE); item.addEnchantment(Enchant.getEnchant(Enchant.EFFICIENCY), 3 + rand.nextInt(3)); item.addEnchantment(Enchant.getEnchant(Enchant.UNBREAKING), getUnbreakingLevel(quality, rand)); Loot.setItemName(item, "Crystal Head Axe"); return item; } else { item = new ItemStack(Items.IRON_AXE); item.addEnchantment(Enchant.getEnchant(Enchant.EFFICIENCY), 1 + rand.nextInt(2)); item.addEnchantment(Enchant.getEnchant(Enchant.UNBREAKING), getUnbreakingLevel(quality, rand)); Loot.setItemName(item, "Woodland Hatchet"); return item; } } private static ItemStack getPick(Random rand, Quality quality){ ItemStack item; if(quality == Quality.DIAMOND){ item = new ItemStack(Items.DIAMOND_PICKAXE); item.addEnchantment(Enchant.getEnchant(Enchant.EFFICIENCY), 3 + rand.nextInt(3)); item.addEnchantment(Enchant.getEnchant(Enchant.UNBREAKING), getUnbreakingLevel(quality, rand)); if(rand.nextInt(10) == 0){ item.addEnchantment(Enchant.getEnchant(Enchant.SILKTOUCH), 1); Loot.setItemName(item, "Crystal Pick of Precision"); return item; } if(rand.nextInt(10) == 0){ item.addEnchantment(Enchant.getEnchant(Enchant.FORTUNE), 2 + rand.nextInt(2)); Loot.setItemName(item, "Crystal Pick of Prospecting"); return item; } if(rand.nextInt(5) == 0){ item.addEnchantment(Enchant.getEnchant(Enchant.MENDING), 1); } Loot.setItemName(item, "Crystal Pick"); return item; } else { item = new ItemStack(Items.IRON_PICKAXE); item.addEnchantment(Enchant.getEnchant(Enchant.EFFICIENCY), 1 + rand.nextInt(2)); item.addEnchantment(Enchant.getEnchant(Enchant.UNBREAKING), getUnbreakingLevel(quality, rand)); if(rand.nextInt(10) == 0){ item.addEnchantment(Enchant.getEnchant(Enchant.SILKTOUCH), 1); Loot.setItemName(item, "Case Hardened Pick of Precision"); return item; } if(rand.nextInt(10) == 0){ item.addEnchantment(Enchant.getEnchant(Enchant.FORTUNE), 1 + rand.nextInt(3)); Loot.setItemName(item, "Case Hardened Pick of Prospecting"); return item; } if(rand.nextInt(5) == 0){ item.addEnchantment(Enchant.getEnchant(Enchant.MENDING), 1); } Loot.setItemName(item, "Case Hardened Pick"); return item; } } private static ItemStack getSword(Random rand, Quality quality){ ItemStack item; if (quality == Quality.DIAMOND){ item = new ItemStack(Items.DIAMOND_SWORD); item.addEnchantment(Enchant.getEnchant(Enchant.SHARPNESS), 3 + rand.nextInt(3)); if(rand.nextInt(10) == 0){ item.addEnchantment(Enchant.getEnchant(Enchant.LOOTING), 2 + rand.nextInt(2)); item.addEnchantment(Enchant.getEnchant(Enchant.UNBREAKING), getUnbreakingLevel(quality, rand)); Loot.setItemName(item, "Eldritch Blade of Plundering"); Loot.setItemLore(item, "The loot taker", TextFormat.DARKGREEN); return item; } if(rand.nextInt(10) == 0){ item.addEnchantment(Enchant.getEnchant(Enchant.FIREASPECT), 2 + rand.nextInt(2)); item.addEnchantment(Enchant.getEnchant(Enchant.UNBREAKING), getUnbreakingLevel(quality, rand)); Loot.setItemName(item, "Eldritch Blade of the Inferno"); Loot.setItemLore(item, "From the fiery depths", TextFormat.DARKGREEN); return item; } item.addEnchantment(Enchant.getEnchant(Enchant.UNBREAKING), quality == Quality.DIAMOND ? 3 : 1 + rand.nextInt(2)); item.addEnchantment(Enchant.getEnchant(Enchant.MENDING), 1); Loot.setItemName(item, "Eldritch Blade"); Loot.setItemLore(item, "Rune Etched", TextFormat.DARKGREEN); return item; } else { item = new ItemStack(Items.IRON_SWORD); if(rand.nextBoolean()){ item.addEnchantment(Enchant.getEnchant(Enchant.SHARPNESS), 1); } item.addEnchantment(Enchant.getEnchant(Enchant.UNBREAKING), 3); item.addEnchantment(Enchant.getEnchant(Enchant.MENDING), 1); Loot.setItemName(item, "Tempered Blade"); Loot.setItemLore(item, "Highly Durable", TextFormat.DARKGREEN); return item; } } private static ItemStack getBow(Random rand, Quality quality){ ItemStack item = new ItemStack(Items.BOW); switch(quality){ case WOOD: case STONE: item.addEnchantment(Enchant.getEnchant(Enchant.POWER), 1 + rand.nextInt(3)); item.addEnchantment(Enchant.getEnchant(Enchant.UNBREAKING), 1); Loot.setItemName(item, "Yew Longbow"); Loot.setItemLore(item, "Superior craftsmanship", TextFormat.DARKGREEN); return item; case IRON: item.addEnchantment(Enchant.getEnchant(Enchant.POWER), 1 + rand.nextInt(3)); item.addEnchantment(Enchant.getEnchant(Enchant.UNBREAKING), 1 + rand.nextInt(3)); Loot.setItemName(item, "Laminated Bow"); Loot.setItemLore(item, "Highly polished", TextFormat.DARKGREEN); return item; case GOLD: item.addEnchantment(Enchant.getEnchant(Enchant.POWER), 3 + rand.nextInt(3)); if(rand.nextBoolean()){ item.addEnchantment(Enchant.getEnchant(Enchant.INFINITY), 1); } item.addEnchantment(Enchant.getEnchant(Enchant.UNBREAKING), 1 + rand.nextInt(3)); Loot.setItemName(item, "Recurve Bow"); Loot.setItemLore(item, "Beautifully crafted", TextFormat.DARKGREEN); return item; case DIAMOND: item.addEnchantment(Enchant.getEnchant(Enchant.POWER), 3 + rand.nextInt(3)); item.addEnchantment(Enchant.getEnchant(Enchant.FLAME), 1); item.addEnchantment(Enchant.getEnchant(Enchant.INFINITY), 1); item.addEnchantment(Enchant.getEnchant(Enchant.UNBREAKING), getUnbreakingLevel(quality, rand)); item.addEnchantment(Enchant.getEnchant(Enchant.MENDING), 1); Loot.setItemName(item, "Eldritch Bow"); Loot.setItemLore(item, "Warm to the touch", TextFormat.DARKGREEN); return item; default: return null; } } private static ItemStack getHelmet(Random rand, Quality quality){ ItemStack item; String canonical = ""; switch(quality){ case WOOD: item = new ItemStack(Items.LEATHER_HELMET); ItemArmour.dyeArmor(item, rand.nextInt(256), rand.nextInt(255), rand.nextInt(255)); canonical = "Bonnet"; break; case STONE: item = new ItemStack(Items.CHAINMAIL_HELMET); canonical = "Coif"; break; case IRON: case GOLD: item = new ItemStack(Items.IRON_HELMET); canonical = "Sallet"; break; case DIAMOND: item = new ItemStack(Items.DIAMOND_HELMET); canonical = "Helm"; break; default: item = new ItemStack(Items.LEATHER_HELMET); } String suffix = ""; if(rand.nextInt(20) == 0){ item.addEnchantment(Enchant.getEnchant(Enchant.PROTECTION), getProtectionLevel(quality, rand)); item.addEnchantment(Enchant.getEnchant(Enchant.RESPIRATION), 3); item.addEnchantment(Enchant.getEnchant(Enchant.AQUAAFFINITY), 1); suffix = "of Diving"; } else if(rand.nextInt(3) == 0){ item.addEnchantment(Enchant.getEnchant(Enchant.PROJECTILEPROTECTION), getProtectionLevel(quality, rand)); suffix = "of Deflection"; } else { item.addEnchantment(Enchant.getEnchant(Enchant.PROTECTION), getProtectionLevel(quality, rand)); suffix = "of Defense"; } item.addEnchantment(Enchant.getEnchant(Enchant.UNBREAKING), getUnbreakingLevel(quality, rand)); if(rand.nextInt(10) == 0){ item.addEnchantment(Enchant.getEnchant(Enchant.MENDING), 1); } String name = getArmourPrefix(quality) + " " + canonical + " " + suffix; Loot.setItemName(item, name); return item; } private static ItemStack getBoots(Random rand, Quality quality){ ItemStack item; String canonical = ""; switch(quality){ case WOOD: item = new ItemStack(Items.LEATHER_BOOTS); ItemArmour.dyeArmor(item, rand.nextInt(256), rand.nextInt(255), rand.nextInt(255)); canonical = "Shoes"; break; case STONE: item = new ItemStack(Items.CHAINMAIL_BOOTS); canonical = "Greaves"; break; case IRON: case GOLD: item = new ItemStack(Items.IRON_BOOTS); canonical = "Sabatons"; break; case DIAMOND: item = new ItemStack(Items.DIAMOND_BOOTS); canonical = "Boots"; break; default: item = new ItemStack(Items.LEATHER_BOOTS); canonical = "Shoes"; } String suffix = ""; if(rand.nextInt(10) == 0){ item.addEnchantment(Enchant.getEnchant(Enchant.BLASTPROTECTION), getProtectionLevel(quality, rand)); suffix = "of Warding"; } else if(rand.nextInt(5) == 0){ item.addEnchantment(Enchant.getEnchant(Enchant.PROTECTION), getProtectionLevel(quality, rand)); item.addEnchantment(Enchant.getEnchant(Enchant.FEATHERFALLING), quality == Quality.DIAMOND ? 4 : 1 + rand.nextInt(3)); suffix = "of Lightness"; } else if(rand.nextInt(3) == 0){ item.addEnchantment(Enchant.getEnchant(Enchant.PROJECTILEPROTECTION), getProtectionLevel(quality, rand)); suffix = "of Deflection"; } else { item.addEnchantment(Enchant.getEnchant(Enchant.PROTECTION), getProtectionLevel(quality, rand)); suffix = "of Defense"; } item.addEnchantment(Enchant.getEnchant(Enchant.UNBREAKING), getUnbreakingLevel(quality, rand)); if(rand.nextInt(10) == 0){ item.addEnchantment(Enchant.getEnchant(Enchant.MENDING), 1); } String name = getArmourPrefix(quality) + " " + canonical + " " + suffix; Loot.setItemName(item, name); return item; } private static ItemStack getLegs(Random rand, Quality quality){ ItemStack item; String canonical = ""; switch(quality){ case WOOD: item = new ItemStack(Items.LEATHER_LEGGINGS); ItemArmour.dyeArmor(item, rand.nextInt(256), rand.nextInt(255), rand.nextInt(255)); canonical = "Pantaloons"; break; case STONE: item = new ItemStack(Items.CHAINMAIL_LEGGINGS); canonical = "Chausses"; break; case IRON: case GOLD: item = new ItemStack(Items.IRON_LEGGINGS); canonical = "Leg-plates"; break; case DIAMOND: item = new ItemStack(Items.DIAMOND_LEGGINGS); canonical = "Leggings"; break; default: item = new ItemStack(Items.LEATHER_LEGGINGS); } String suffix = ""; if(rand.nextInt(10) == 0){ item.addEnchantment(Enchant.getEnchant(Enchant.FIREPROTECTION), getProtectionLevel(quality, rand)); suffix = "of Warding"; } else if(rand.nextInt(10) == 0){ item.addEnchantment(Enchant.getEnchant(Enchant.BLASTPROTECTION), getProtectionLevel(quality, rand)); suffix = "of Integrity"; } else if(rand.nextInt(3) == 0){ item.addEnchantment(Enchant.getEnchant(Enchant.PROJECTILEPROTECTION), getProtectionLevel(quality, rand)); suffix = "of Deflection"; } else { item.addEnchantment(Enchant.getEnchant(Enchant.PROTECTION), getProtectionLevel(quality, rand)); suffix = "of Defense"; } item.addEnchantment(Enchant.getEnchant(Enchant.UNBREAKING), getUnbreakingLevel(quality, rand)); if(rand.nextInt(10) == 0){ item.addEnchantment(Enchant.getEnchant(Enchant.MENDING), 1); } String name = getArmourPrefix(quality) + " " + canonical + " " + suffix; Loot.setItemName(item, name); return item; } private static ItemStack getChest(Random rand, Quality quality){ ItemStack item; String canonical = ""; switch(quality){ case WOOD: item = new ItemStack(Items.LEATHER_CHESTPLATE); ItemArmour.dyeArmor(item, rand.nextInt(256), rand.nextInt(255), rand.nextInt(255)); canonical = "Tunic"; break; case STONE: item = new ItemStack(Items.CHAINMAIL_CHESTPLATE); canonical = "Hauberk"; break; case IRON: case GOLD: item = new ItemStack(Items.IRON_CHESTPLATE); canonical = "Cuirass"; break; case DIAMOND: item = new ItemStack(Items.DIAMOND_CHESTPLATE); canonical = "Plate"; break; default: item = new ItemStack(Items.LEATHER_CHESTPLATE); canonical = "Tunic"; } String suffix = ""; if(rand.nextInt(10) == 0){ item.addEnchantment(Enchant.getEnchant(Enchant.FIREPROTECTION), getProtectionLevel(quality, rand)); suffix = "of Flamewarding"; } else if(rand.nextInt(10) == 0){ item.addEnchantment(Enchant.getEnchant(Enchant.BLASTPROTECTION), getProtectionLevel(quality, rand)); suffix = "of Integrity"; } else if(rand.nextInt(3) == 0){ item.addEnchantment(Enchant.getEnchant(Enchant.PROJECTILEPROTECTION), getProtectionLevel(quality, rand)); suffix = "of Deflection"; } else { item.addEnchantment(Enchant.getEnchant(Enchant.PROTECTION), getProtectionLevel(quality, rand)); suffix = "of Defense"; } item.addEnchantment(Enchant.getEnchant(Enchant.UNBREAKING), getUnbreakingLevel(quality, rand)); if(rand.nextInt(10) == 0){ item.addEnchantment(Enchant.getEnchant(Enchant.MENDING), 1); } String name = getArmourPrefix(quality) + " " + canonical + " " + suffix; Loot.setItemName(item, name); return item; } private static int getUnbreakingLevel(Quality quality, Random rand){ return quality == Quality.DIAMOND ? 3 : 1 + rand.nextInt(2); } private static int getProtectionLevel(Quality quality, Random rand){ int value = 1; switch(quality){ case WOOD: if(rand.nextInt(3) == 0){ value++; } break; case STONE: if(rand.nextBoolean()){ value++; } break; case IRON: case GOLD: value += rand.nextInt(3); break; case DIAMOND: value += 2 + rand.nextInt(2); break; } return value; } private static String getArmourPrefix(Quality quality){ switch(quality){ case WOOD: return "Surplus"; case STONE: return "Riveted"; case IRON: return "Gothic"; case GOLD: return "Jewelled"; case DIAMOND: return "Crystal"; default: return "Strange"; } } @Override public ItemStack getLootItem(Random rand, int level) { Quality q; switch(level){ case 0: q = Quality.WOOD; break; case 1: q = Quality.STONE; break; case 2: q = Quality.IRON; break; case 3: q = Quality.GOLD; break; case 4: q = Quality.DIAMOND; break; default: q = Quality.WOOD; break; } return getRandomItem(Equipment.values()[rand.nextInt(Equipment.values().length)], rand, q); } }