blob: 1fd7c6a93984681543329499197a8f2288fc11d2 [file] [log] [blame] [raw]
package li.cil.oc.common
import li.cil.oc.Constants
import li.cil.oc.OpenComputers
import li.cil.oc.api.detail.ItemInfo
import li.cil.oc.common.init.Items
import net.minecraft.entity.player.EntityPlayer
import net.minecraft.item.ItemStack
import net.minecraft.stats.StatBase
import net.minecraft.stats.{Achievement => MCAchievement}
import net.minecraftforge.common.AchievementPage
import scala.collection.mutable
object Achievement {
val All = mutable.ArrayBuffer.empty[MCAchievement]
val CraftingMap = mutable.Map.empty[ItemInfo, MCAchievement]
val CustomCraftingMap = mutable.Map.empty[ItemStack, MCAchievement]
val AssemblingMap = mutable.Map.empty[ItemInfo, MCAchievement]
val Transistor = newAchievement("transistor").
at(2, 0).
whenCrafting(Constants.ItemName.Transistor).
add()
val Disassembler = newAchievement("disassembler").
at(2, 2).
whenCrafting(Constants.BlockName.Disassembler).
withParent(Transistor).
add()
val Microchip = newAchievement("chip").
at(4, 0).
withParent(Transistor).
whenCrafting(Constants.ItemName.ChipTier1).
whenCrafting(Constants.ItemName.ChipTier2).
whenCrafting(Constants.ItemName.ChipTier3).
add()
val Capacitor = newAchievement("capacitor").
at(6, -1).
withParent(Microchip).
whenCrafting(Constants.BlockName.Capacitor).
add()
val Assembler = newAchievement("assembler").
at(8, -2).
withParent(Capacitor).
whenCrafting(Constants.BlockName.Assembler).
add()
val Microcontroller = newAchievement("microcontroller").
at(10, -2).
withParent(Assembler).
whenAssembling(Constants.BlockName.Microcontroller).
add()
val Robot = newAchievement("robot").
at(10, -3).
withParent(Assembler).
whenAssembling(Constants.BlockName.Robot).
add()
val Drone = newAchievement("drone").
at(10, -4).
withParent(Assembler).
whenAssembling(Constants.ItemName.Drone).
add()
val Tablet = newAchievement("tablet").
at(10, -5).
withParent(Assembler).
whenAssembling(Constants.ItemName.Tablet).
add()
val Charger = newAchievement("charger").
at(8, -1).
withParent(Capacitor).
whenCrafting(Constants.BlockName.Charger).
add()
val CPU = newAchievement("cpu").
at(6, 0).
withParent(Microchip).
whenCrafting(Constants.ItemName.CPUTier1).
whenCrafting(Constants.ItemName.CPUTier2).
whenCrafting(Constants.ItemName.CPUTier3).
add()
val MotionSensor = newAchievement("motionSensor").
at(8, 0).
withParent(CPU).
whenCrafting(Constants.BlockName.MotionSensor).
add()
val Geolyzer = newAchievement("geolyzer").
at(8, 1).
withParent(CPU).
whenCrafting(Constants.BlockName.Geolyzer).
add()
val RedstoneIO = newAchievement("redstoneIO").
at(8, 2).
withParent(CPU).
whenCrafting(Constants.BlockName.Redstone).
add()
val EEPROM = newAchievement("eeprom").
at(6, 3).
withParent(Microchip).
whenCrafting(Constants.ItemName.EEPROM).
add()
val Memory = newAchievement("ram").
at(6, 4).
withParent(Microchip).
whenCrafting(Constants.ItemName.RAMTier1).
whenCrafting(Constants.ItemName.RAMTier2).
whenCrafting(Constants.ItemName.RAMTier3).
whenCrafting(Constants.ItemName.RAMTier4).
whenCrafting(Constants.ItemName.RAMTier5).
whenCrafting(Constants.ItemName.RAMTier6).
add()
val HDD = newAchievement("hdd").
at(6, 5).
withParent(Microchip).
whenCrafting(Constants.ItemName.HDDTier1).
whenCrafting(Constants.ItemName.HDDTier2).
whenCrafting(Constants.ItemName.HDDTier3).
add()
val Case = newAchievement("case").
at(6, 6).
withParent(Microchip).
whenCrafting(Constants.BlockName.CaseTier1).
whenCrafting(Constants.BlockName.CaseTier2).
whenCrafting(Constants.BlockName.CaseTier3).
add()
val Rack = newAchievement("rack").
at(8, 6).
withParent(Case).
whenCrafting(Constants.BlockName.ServerRack).
add()
val Server = newAchievement("server").
at(10, 6).
withParent(Rack).
whenCrafting(Constants.ItemName.ServerTier1).
whenCrafting(Constants.ItemName.ServerTier2).
whenCrafting(Constants.ItemName.ServerTier3).
add()
val Screen = newAchievement("screen").
at(6, 7).
withParent(Microchip).
whenCrafting(Constants.BlockName.ScreenTier1).
whenCrafting(Constants.BlockName.ScreenTier2).
whenCrafting(Constants.BlockName.ScreenTier3).
add()
val Keyboard = newAchievement("keyboard").
at(8, 7).
withParent(Screen).
whenCrafting(Constants.BlockName.Keyboard).
add()
val Hologram = newAchievement("hologram").
at(8, 8).
withParent(Screen).
whenCrafting(Constants.BlockName.HologramTier1).
whenCrafting(Constants.BlockName.HologramTier2).
add()
val DiskDrive = newAchievement("diskDrive").
at(6, 9).
withParent(Microchip).
whenCrafting(Constants.BlockName.DiskDrive).
add()
val Floppy = newAchievement("floppy").
at(8, 9).
withParent(DiskDrive).
whenCrafting(Constants.ItemName.Floppy).
add()
val OpenOS = newAchievement("openOS").
at(10, 9).
withParent(Floppy).
whenCrafting(Items.createOpenOS()).
add()
val Raid = newAchievement("raid").
at(8, 10).
withParent(DiskDrive).
whenCrafting(Constants.BlockName.Raid).
add()
val Card = newAchievement("card").
at(0, -2).
whenCrafting(Constants.ItemName.Card).
add()
val RedstoneCard = newAchievement("redstoneCard").
at(-2, -4).
withParent(Card).
whenCrafting(Constants.ItemName.RedstoneCardTier1).
whenCrafting(Constants.ItemName.RedstoneCardTier2).
add()
val GraphicsCard = newAchievement("graphicsCard").
at(0, -5).
withParent(Card).
whenCrafting(Constants.ItemName.GraphicsCardTier1).
whenCrafting(Constants.ItemName.GraphicsCardTier2).
whenCrafting(Constants.ItemName.GraphicsCardTier3).
add()
val NetworkCard = newAchievement("networkCard").
at(2, -4).
withParent(Card).
whenCrafting(Constants.ItemName.NetworkCard).
add()
val WirelessNetworkCard = newAchievement("wirelessNetworkCard").
at(2, -6).
withParent(NetworkCard).
whenCrafting(Constants.ItemName.WirelessNetworkCard).
add()
val Cable = newAchievement("cable").
at(-2, 0).
whenCrafting(Constants.BlockName.Cable).
add()
val PowerDistributor = newAchievement("powerDistributor").
at(-4, -1).
withParent(Cable).
whenCrafting(Constants.BlockName.PowerDistributor).
add()
val Switch = newAchievement("switch").
at(-4, 0).
withParent(Cable).
whenCrafting(Constants.BlockName.Switch).
whenCrafting(Constants.BlockName.AccessPoint).
add()
val Adapter = newAchievement("adapter").
at(-4, 1).
withParent(Cable).
whenCrafting(Constants.BlockName.Adapter).
add()
def init() {
// Missing @Override causes ambiguity, so cast is required; still a virtual call,
// so Achievement.registerStat is still the method that's really being called.
All.foreach(_.asInstanceOf[StatBase].registerStat())
AchievementPage.registerAchievementPage(new AchievementPage(OpenComputers.Name, All: _*))
}
def onAssemble(stack: ItemStack, player: EntityPlayer): Unit = {
AssemblingMap.get(Items.get(stack)).foreach(player.addStat(_, 1))
}
def onCraft(stack: ItemStack, player: EntityPlayer): Unit = {
CraftingMap.get(Items.get(stack)).foreach(player.addStat(_, 1))
CustomCraftingMap.find(entry => ItemStack.areItemStacksEqual(stack, entry._1)).foreach(entry => player.addStat(entry._2, 1))
}
private def newAchievement(name: String) = new AchievementBuilder(name)
private class AchievementBuilder(val name: String) {
var x = 0
var y = 0
var stack = stackFromName(name)
var parent: Option[MCAchievement] = None
var crafting = mutable.Set.empty[String]
var customCrafting = mutable.Set.empty[ItemStack]
var assembling = mutable.Set.empty[String]
def at(x: Int, y: Int): AchievementBuilder = {
this.x = x
this.y = y
this
}
def withIconOf(stack: ItemStack): AchievementBuilder = {
this.stack = Option(stack)
this
}
def withParent(parent: MCAchievement): AchievementBuilder = {
this.parent = Option(parent)
this
}
def whenCrafting(name: String): AchievementBuilder = {
crafting += name
if (stack.isEmpty) stack = stackFromName(name)
this
}
def whenCrafting(stack: ItemStack): AchievementBuilder = {
customCrafting += stack
if (this.stack.isEmpty) this.stack = Option(stack)
this
}
def whenAssembling(name: String): AchievementBuilder = {
assembling += name
if (stack.isEmpty) stack = stackFromName(name)
this
}
def add(): MCAchievement = {
val achievement = new MCAchievement("oc." + name, "oc." + name, x, y, stack.orNull, parent.orNull)
if (parent.isEmpty) {
achievement.asInstanceOf[StatBase].initIndependentStat()
}
for (requirement <- crafting) {
val descriptor = Items.get(requirement)
if (descriptor != null) {
Achievement.CraftingMap += descriptor -> achievement
}
}
for (requirement <- customCrafting) {
if (requirement != null) {
Achievement.CustomCraftingMap += requirement -> achievement
}
}
for (requirement <- assembling) {
val descriptor = Items.get(requirement)
if (descriptor != null) {
Achievement.AssemblingMap += descriptor -> achievement
}
}
Achievement.All += achievement
achievement
}
private def stackFromName(name: String) = Option(Items.get(name)).map(_.createItemStack(1))
}
}