From 65d951d50c4eb98e730ed2f3a039f386b3fec6a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20N=C3=BCcke?= Date: Thu, 16 Jan 2014 18:04:29 +0100 Subject: [PATCH] added cpu slot to computer cases, computer cases now also require a cpu to define the number of components they support --- assets/opencomputers/lang/de_DE.lang | 2 +- assets/opencomputers/lang/en_US.lang | 2 +- li/cil/oc/common/container/Case.scala | 4 +- .../common/inventory/ComponentInventory.scala | 10 +---- li/cil/oc/common/item/CPU.scala | 2 +- li/cil/oc/common/tileentity/Case.scala | 38 +++++++++++++++++-- 6 files changed, 41 insertions(+), 17 deletions(-) diff --git a/assets/opencomputers/lang/de_DE.lang b/assets/opencomputers/lang/de_DE.lang index f94dbc03a..42bfe2c60 100644 --- a/assets/opencomputers/lang/de_DE.lang +++ b/assets/opencomputers/lang/de_DE.lang @@ -102,7 +102,7 @@ oc:tooltip.Case=Das Computergehäuse ist der essentielle Grundbaustein für eine oc:tooltip.Charger=Lädt Roboter mit Energie aus Kondensatoren auf. Die Ladegeschwindigkeit hängt vom eingehenden §fRedstonesignal§7 ab, wobei kein Signal "nicht laden" und ein Signal mit maximaler Stärke "schnellstmöglich laden" heißt. oc:tooltip.CircuitBoard=Mühsam ernährt sich das Eichhörnchen. Wenn es groß wird, wird es mal eine gedruckte Leiterplatte. oc:tooltip.ControlUnit=Klingt wichtig, ist es auch. Man baut daraus immerhin CPUs. Wie könnte es da nicht wichtig sein. -oc:tooltip.CPU=Kernstück eines jeden Computers. Die Taktrate hat einen leichten Schatten, aber was kann man von einer Taschensonnenuhr schon erwarten? +oc:tooltip.CPU=Kernstück eines jeden Computers. Die Taktrate hat einen leichten Schatten, aber was kann man von einer Taschensonnenuhr schon erwarten?[nl] Unterstützte Komponenten: §f%s§7. oc:tooltip.CuttingWire=Wird gebraucht, um Tonblöcke in Leiterplattenform zu bekommen. Vermutlich das ineffizienteste Werkzeug in der Geschichte der Menschheit, da es nach einer Verwendung kaputt geht. oc:tooltip.Disk=Sehr einfaches Speichermedium, das verwendet werden kann, um Disketten und Festplatten bauen. oc:tooltip.DiskDrive.CC=ComputerCraft-Disketten werden §aunterstützt§7. diff --git a/assets/opencomputers/lang/en_US.lang b/assets/opencomputers/lang/en_US.lang index 07435a1b3..5c99c5611 100644 --- a/assets/opencomputers/lang/en_US.lang +++ b/assets/opencomputers/lang/en_US.lang @@ -102,7 +102,7 @@ oc:tooltip.Case=The Computer Case is the basic building block for computers and oc:tooltip.Charger=Transfers energy from capacitors into adjacent robots. The transfer rate depends on the incoming §fredstone signal§7, where no signal means don't charge robots, and maximum strength means charge at full speed. oc:tooltip.CircuitBoard=Now we're getting somewhere. Can be etched to obtain a printed circuit board. oc:tooltip.ControlUnit=This is the unit that... controls... stuff. You need it to build a CPU. So yeah, totally important. -oc:tooltip.CPU=An essential component of all computers. The clock rate is a bit unreliable, but what do you expect when it runs on a pocket sundial? +oc:tooltip.CPU=An essential component of all computers. The clock rate is a bit unreliable, but what do you expect when it runs on a pocket sundial?[nl] Supported components: §f%s§7. oc:tooltip.CuttingWire=Used to cut clay blocks into circuit board shape. Breaks after one use, which probably makes it the most inefficient tool ever. oc:tooltip.Disk=Primitive medium that can be used to build persistent storage devices. oc:tooltip.DiskDrive.CC=ComputerCraft floppies are §asupported§7. diff --git a/li/cil/oc/common/container/Case.scala b/li/cil/oc/common/container/Case.scala index fdd58871d..08b9fbdd3 100644 --- a/li/cil/oc/common/container/Case.scala +++ b/li/cil/oc/common/container/Case.scala @@ -10,7 +10,7 @@ class Case(playerInventory: InventoryPlayer, computer: tileentity.Case) extends } for (i <- 0 to (if (computer.tier == 0) 0 else 1)) { - addSlotToContainer(120, 16 + i * slotSize, api.driver.Slot.Memory, computer.maxComponentTierForSlot(getInventory.size)) + addSlotToContainer(120, 16 + (i + 1) * slotSize, api.driver.Slot.Memory, computer.maxComponentTierForSlot(getInventory.size)) } for (i <- 0 to (if (computer.tier == 0) 0 else 1)) { @@ -21,6 +21,8 @@ class Case(playerInventory: InventoryPlayer, computer: tileentity.Case) extends addSlotToContainer(142, 16 + 2 * slotSize, api.driver.Slot.Disk) } + addSlotToContainer(120, 16, api.driver.Slot.Processor, computer.tier) + // Show the player's inventory. addPlayerInventorySlots(8, 84) diff --git a/li/cil/oc/common/inventory/ComponentInventory.scala b/li/cil/oc/common/inventory/ComponentInventory.scala index 03af36e43..1d2d11a2f 100644 --- a/li/cil/oc/common/inventory/ComponentInventory.scala +++ b/li/cil/oc/common/inventory/ComponentInventory.scala @@ -1,8 +1,8 @@ package li.cil.oc.common.inventory import li.cil.oc.api.driver.{Item => ItemDriver} +import li.cil.oc.api.network import li.cil.oc.api.network.{Node, ManagedEnvironment} -import li.cil.oc.api.{network, driver} import li.cil.oc.server.driver.Registry import li.cil.oc.server.driver.item.Item import net.minecraft.item.ItemStack @@ -20,14 +20,6 @@ trait ComponentInventory extends Inventory with network.Environment { // ----------------------------------------------------------------------- // - def installedMemory = items.foldLeft(0)((sum, stack) => sum + (stack match { - case Some(item) => Registry.itemDriverFor(item) match { - case Some(driver: driver.Memory) => driver.amount(item) - case _ => 0 - } - case _ => 0 - })) - def updateComponents() { if (updatingComponents.length > 0) { for (component <- updatingComponents) { diff --git a/li/cil/oc/common/item/CPU.scala b/li/cil/oc/common/item/CPU.scala index 3b0eff935..a971f1e8a 100644 --- a/li/cil/oc/common/item/CPU.scala +++ b/li/cil/oc/common/item/CPU.scala @@ -15,7 +15,7 @@ class CPU(val parent: Delegator, val tier: Int) extends Delegate { override def rarity = Array(EnumRarity.common, EnumRarity.uncommon, EnumRarity.rare).apply(tier max 0 min 2) override def tooltipLines(stack: ItemStack, player: EntityPlayer, tooltip: util.List[String], advanced: Boolean) { - tooltip.addAll(Tooltip.get(baseName)) + tooltip.addAll(Tooltip.get(baseName, Settings.componentCountByTier(tier))) super.tooltipLines(stack, player, tooltip, advanced) } diff --git a/li/cil/oc/common/tileentity/Case.scala b/li/cil/oc/common/tileentity/Case.scala index a90924d12..9efa51686 100644 --- a/li/cil/oc/common/tileentity/Case.scala +++ b/li/cil/oc/common/tileentity/Case.scala @@ -1,6 +1,7 @@ package li.cil.oc.common.tileentity import li.cil.oc.Settings +import li.cil.oc.api.driver import li.cil.oc.api.driver.Slot import li.cil.oc.server.driver.Registry import net.minecraft.entity.player.EntityPlayer @@ -10,13 +11,32 @@ import net.minecraft.nbt.NBTTagCompound class Case(var tier: Int, isRemote: Boolean) extends Computer(isRemote) { def this() = this(0, false) - def maxComponents = Settings.componentCountByTier(tier) + var maxComponents = 0 + + def recomputeMaxComponents() { + maxComponents = items.foldLeft(0)((sum, stack) => sum + (stack match { + case Some(item) => Registry.itemDriverFor(item) match { + case Some(driver: driver.Processor) => driver.supportedComponents(item) + case _ => 0 + } + case _ => 0 + })) + } + + def installedMemory = items.foldLeft(0)((sum, stack) => sum + (stack match { + case Some(item) => Registry.itemDriverFor(item) match { + case Some(driver: driver.Memory) => driver.amount(item) + case _ => 0 + } + case _ => 0 + })) // ----------------------------------------------------------------------- // override def readFromNBT(nbt: NBTTagCompound) { tier = nbt.getByte(Settings.namespace + "tier") max 0 min 2 super.readFromNBT(nbt) + recomputeMaxComponents() } override def writeToNBT(nbt: NBTTagCompound) { @@ -26,12 +46,17 @@ class Case(var tier: Int, isRemote: Boolean) extends Computer(isRemote) { // ----------------------------------------------------------------------- // + override def onInventoryChanged() { + super.onInventoryChanged() + recomputeMaxComponents() + } + def getInvName = Settings.namespace + "container.Case" def getSizeInventory = tier match { - case 0 => 4 - case 1 => 6 - case 2 => 8 + case 0 => 5 + case 1 => 7 + case 2 => 9 case _ => 0 } @@ -48,6 +73,7 @@ class Case(var tier: Int, isRemote: Boolean) extends Computer(isRemote) { case (0 | 1, Some(driver)) => driver.slot(stack) == Slot.Card && driver.tier(stack) <= maxComponentTierForSlot(slot) case (2, Some(driver)) => driver.slot(stack) == Slot.Memory && driver.tier(stack) <= maxComponentTierForSlot(slot) case (3, Some(driver)) => driver.slot(stack) == Slot.HardDiskDrive && driver.tier(stack) <= maxComponentTierForSlot(slot) + case (4, Some(driver)) => driver.slot(stack) == Slot.Processor && driver.tier(stack) <= maxComponentTierForSlot(slot) case _ => false // Invalid slot. } case 1 => (slot, Registry.itemDriverFor(stack)) match { @@ -55,6 +81,7 @@ class Case(var tier: Int, isRemote: Boolean) extends Computer(isRemote) { case (0 | 1, Some(driver)) => driver.slot(stack) == Slot.Card && driver.tier(stack) <= maxComponentTierForSlot(slot) case (2 | 3, Some(driver)) => driver.slot(stack) == Slot.Memory && driver.tier(stack) <= maxComponentTierForSlot(slot) case (4 | 5, Some(driver)) => driver.slot(stack) == Slot.HardDiskDrive && driver.tier(stack) <= maxComponentTierForSlot(slot) + case (6, Some(driver)) => driver.slot(stack) == Slot.Processor && driver.tier(stack) <= maxComponentTierForSlot(slot) case _ => false // Invalid slot. } case 2 => (slot, Registry.itemDriverFor(stack)) match { @@ -63,6 +90,7 @@ class Case(var tier: Int, isRemote: Boolean) extends Computer(isRemote) { case (3 | 4, Some(driver)) => driver.slot(stack) == Slot.Memory && driver.tier(stack) <= maxComponentTierForSlot(slot) case (5 | 6, Some(driver)) => driver.slot(stack) == Slot.HardDiskDrive && driver.tier(stack) <= maxComponentTierForSlot(slot) case (7, Some(driver)) => driver.slot(stack) == Slot.Disk + case (8, Some(driver)) => driver.slot(stack) == Slot.Processor && driver.tier(stack) <= maxComponentTierForSlot(slot) case _ => false // Invalid slot. } case _ => false @@ -76,6 +104,7 @@ class Case(var tier: Int, isRemote: Boolean) extends Computer(isRemote) { case (2 | 3) => 1 case 4 => 1 case 5 => 0 + case 6 => 1 case _ => -1 // Invalid slot. } case 2 => slot match { @@ -85,6 +114,7 @@ class Case(var tier: Int, isRemote: Boolean) extends Computer(isRemote) { case 5 => 2 case 6 => 1 case 7 => 0 + case 8 => 2 case _ => -1 // Invalid slot. } case _ => -1