diff --git a/src/main/resources/assets/opencomputers/lang/de_DE.lang b/src/main/resources/assets/opencomputers/lang/de_DE.lang index 5216d4f50..2bf07739c 100644 --- a/src/main/resources/assets/opencomputers/lang/de_DE.lang +++ b/src/main/resources/assets/opencomputers/lang/de_DE.lang @@ -9,6 +9,7 @@ oc:tile.Capacitor.name=Kondensator oc:tile.Case0.name=Computergehäuse (Stufe 1) oc:tile.Case1.name=Computergehäuse (Stufe 2) oc:tile.Case2.name=Computergehäuse (Stufe 3) +oc:tile.Case3.name=Computergehäuse (Creative) oc:tile.Charger.name=Ladestation oc:tile.DiskDrive.name=Diskettenlaufwerk oc:tile.Keyboard.name=Tastatur @@ -51,10 +52,11 @@ oc:item.InternetCard.name=Internetkarte oc:item.Interweb.name=Interweb oc:item.IronNugget.name=Eisennugget oc:item.Memory0.name=Speicher (Stufe 1) -oc:item.Memory1.name=Speicher (Stufe 2) -oc:item.Memory2.name=Speicher (Stufe 2.5) -oc:item.Memory3.name=Speicher (Stufe 3) -oc:item.Memory4.name=Speicher (Stufe 3.5) +oc:item.Memory1.name=Speicher (Stufe 1.5) +oc:item.Memory2.name=Speicher (Stufe 2) +oc:item.Memory3.name=Speicher (Stufe 2.5) +oc:item.Memory4.name=Speicher (Stufe 3) +oc:item.Memory5.name=Speicher (Stufe 3.5) oc:item.Microchip0.name=Microchip (Stufe 1) oc:item.Microchip1.name=Microchip (Stufe 2) oc:item.Microchip2.name=Microchip (Stufe 3) diff --git a/src/main/resources/assets/opencomputers/lang/en_US.lang b/src/main/resources/assets/opencomputers/lang/en_US.lang index 07d666009..026e5a023 100644 --- a/src/main/resources/assets/opencomputers/lang/en_US.lang +++ b/src/main/resources/assets/opencomputers/lang/en_US.lang @@ -9,6 +9,7 @@ oc:tile.Capacitor.name=Capacitor oc:tile.Case0.name=Computer Case (Tier 1) oc:tile.Case1.name=Computer Case (Tier 2) oc:tile.Case2.name=Computer Case (Tier 3) +oc:tile.Case3.name=Computer Case (Creative) oc:tile.Charger.name=Charger oc:tile.DiskDrive.name=Disk Drive oc:tile.Keyboard.name=Keyboard @@ -51,10 +52,11 @@ oc:item.InternetCard.name=Internet Card oc:item.Interweb.name=Interweb oc:item.IronNugget.name=Iron Nugget oc:item.Memory0.name=Memory (Tier 1) -oc:item.Memory1.name=Memory (Tier 2) -oc:item.Memory2.name=Memory (Tier 2.5) -oc:item.Memory3.name=Memory (Tier 3) -oc:item.Memory4.name=Memory (Tier 3.5) +oc:item.Memory1.name=Memory (Tier 1.5) +oc:item.Memory2.name=Memory (Tier 2) +oc:item.Memory3.name=Memory (Tier 2.5) +oc:item.Memory4.name=Memory (Tier 3) +oc:item.Memory5.name=Memory (Tier 3.5) oc:item.Microchip0.name=Microchip (Tier 1) oc:item.Microchip1.name=Microchip (Tier 2) oc:item.Microchip2.name=Microchip (Tier 3) diff --git a/src/main/resources/assets/opencomputers/lang/fr_FR.lang b/src/main/resources/assets/opencomputers/lang/fr_FR.lang index 058e747b9..e4e68e8f8 100644 --- a/src/main/resources/assets/opencomputers/lang/fr_FR.lang +++ b/src/main/resources/assets/opencomputers/lang/fr_FR.lang @@ -41,10 +41,11 @@ oc:item.HardDiskDrive1.name=Disque dur (Niveau 2) oc:item.HardDiskDrive2.name=Disque dur (Niveau 3) oc:item.IronNugget.name=Pépite de fer oc:item.Memory0.name=Mémoire (Niveau 1) -oc:item.Memory1.name=Mémoire (Niveau 2) -oc:item.Memory2.name=Mémoire (Niveau 2.5) -oc:item.Memory3.name=Mémoire (Niveau 3) -oc:item.Memory4.name=Mémoire (Niveau 3.5) +oc:item.Memory1.name=Mémoire (Niveau 1.5) +oc:item.Memory2.name=Mémoire (Niveau 2) +oc:item.Memory3.name=Mémoire (Niveau 2.5) +oc:item.Memory4.name=Mémoire (Niveau 3) +oc:item.Memory5.name=Mémoire (Niveau 3.5) oc:item.Microchip0.name=Puce électronique (Niveau 1) oc:item.Microchip1.name=Puce électronique (Niveau 2) oc:item.Microchip2.name=Puce électronique (Niveau 3) diff --git a/src/main/resources/assets/opencomputers/lang/ru_RU.lang b/src/main/resources/assets/opencomputers/lang/ru_RU.lang index e67e76cab..a1ecfbf88 100644 --- a/src/main/resources/assets/opencomputers/lang/ru_RU.lang +++ b/src/main/resources/assets/opencomputers/lang/ru_RU.lang @@ -51,10 +51,11 @@ oc:item.InternetCard.name=Интернет-плата oc:item.Interweb.name=Интерсеть oc:item.IronNugget.name=Железный самородок oc:item.Memory0.name=ОЗУ (Ур. 1) -oc:item.Memory1.name=ОЗУ (Ур. 2) -oc:item.Memory2.name=ОЗУ (Ур. 2.5) -oc:item.Memory3.name=ОЗУ (Ур. 3) -oc:item.Memory4.name=ОЗУ (Ур. 3.5) +oc:item.Memory1.name=ОЗУ (Ур. 1.5) +oc:item.Memory2.name=ОЗУ (Ур. 2) +oc:item.Memory3.name=ОЗУ (Ур. 2.5) +oc:item.Memory4.name=ОЗУ (Ур. 3) +oc:item.Memory5.name=ОЗУ (Ур. 3.5) oc:item.Microchip0.name=Микрочип (Ур. 1) oc:item.Microchip1.name=Микрочип (Ур. 2) oc:item.Microchip2.name=Микрочип (Ур. 3) diff --git a/src/main/resources/assets/opencomputers/lang/zh_TW.lang b/src/main/resources/assets/opencomputers/lang/zh_TW.lang index 87ddb695e..6fe88ee43 100644 --- a/src/main/resources/assets/opencomputers/lang/zh_TW.lang +++ b/src/main/resources/assets/opencomputers/lang/zh_TW.lang @@ -48,10 +48,11 @@ oc:item.HardDiskDrive2.name=硬碟機 (3級) oc:item.InternetCard.name=上網卡 oc:item.IronNugget.name=鐵粒 oc:item.Memory0.name=記憶卡 (1級) -oc:item.Memory1.name=記憶卡 (2級) -oc:item.Memory2.name=記憶卡 (2.5級) -oc:item.Memory3.name=記憶卡 (3級) -oc:item.Memory4.name=記憶卡 (3.5級) +oc:item.Memory1.name=記憶卡 (1.5級) +oc:item.Memory2.name=記憶卡 (2級) +oc:item.Memory3.name=記憶卡 (2.5級) +oc:item.Memory4.name=記憶卡 (3級) +oc:item.Memory5.name=記憶卡 (3.5級) oc:item.Microchip0.name=微晶片 (1級) oc:item.Microchip1.name=微晶片 (2級) oc:item.Microchip2.name=微晶片 (3級) diff --git a/src/main/resources/assets/opencomputers/lua/rom/bin/resolution.lua b/src/main/resources/assets/opencomputers/lua/rom/bin/resolution.lua index 528981221..65e405b37 100644 --- a/src/main/resources/assets/opencomputers/lua/rom/bin/resolution.lua +++ b/src/main/resources/assets/opencomputers/lua/rom/bin/resolution.lua @@ -23,7 +23,9 @@ end local result, reason = component.gpu.setResolution(w, h) if not result then - io.stderr:write(reason) + if reason then -- otherwise we didn't change anything + io.stderr:write(reason) + end return end term.clear() \ No newline at end of file diff --git a/src/main/resources/assets/opencomputers/recipes/default.recipes b/src/main/resources/assets/opencomputers/recipes/default.recipes index 9fdfb4b45..b4625b6d3 100644 --- a/src/main/resources/assets/opencomputers/recipes/default.recipes +++ b/src/main/resources/assets/opencomputers/recipes/default.recipes @@ -13,17 +13,17 @@ terminal { } server1 { - input: [[obsidian, "oc:craftingRAMTier3", obsidian] + input: [[obsidian, "oc:craftingRAMTier4", obsidian] ["oc:circuitTier1", "oc:circuitTier2", "oc:circuitTier1"] [obsidian, "oc:craftingCircuitBoardPrinted", obsidian]] } server2 { - input: [[obsidian, "oc:craftingRAMTier4", obsidian] + input: [[obsidian, "oc:craftingRAMTier5", obsidian] ["oc:circuitTier2", "oc:circuitTier3", "oc:circuitTier2"] [obsidian, "oc:craftingCircuitBoardPrinted", obsidian]] } server3 { - input: [[obsidian, "oc:craftingRAMTier5", obsidian] + input: [[obsidian, "oc:craftingRAMTier6", obsidian] ["oc:circuitTier3", "oc:circuitTier3", "oc:circuitTier3"] [obsidian, "oc:craftingCircuitBoardPrinted", obsidian]] } @@ -33,18 +33,22 @@ ram1 { ["", "oc:craftingCircuitBoardPrinted", ""]] } ram2 { - input: [["oc:circuitTier2", "", "oc:circuitTier2"] + input: [["oc:circuitTier1", "oc:circuitTier1", "oc:circuitTier1"] ["", "oc:craftingCircuitBoardPrinted", ""]] } ram3 { - input: [["oc:circuitTier2", "oc:circuitTier2", "oc:circuitTier2"] + input: [["oc:circuitTier2", "", "oc:circuitTier2"] ["", "oc:craftingCircuitBoardPrinted", ""]] } ram4 { - input: [["oc:circuitTier3", "", "oc:circuitTier3"] + input: [["oc:circuitTier2", "oc:circuitTier2", "oc:circuitTier2"] ["", "oc:craftingCircuitBoardPrinted", ""]] } ram5 { + input: [["oc:circuitTier3", "", "oc:circuitTier3"] + ["", "oc:craftingCircuitBoardPrinted", ""]] +} +ram6 { input: [["oc:circuitTier3", "oc:circuitTier3", "oc:circuitTier3"] ["", "oc:craftingCircuitBoardPrinted", ""]] } @@ -79,11 +83,11 @@ graphicsCard1 { ["", "oc:craftingCard", ""]] } graphicsCard2 { - input: [["oc:circuitTier2", "oc:craftingALU", "oc:craftingRAMTier2"] + input: [["oc:circuitTier2", "oc:craftingALU", "oc:craftingRAMTier3"] ["", "oc:craftingCard", ""]] } graphicsCard3 { - input: [["oc:circuitTier3", "oc:craftingALU", "oc:craftingRAMTier4"] + input: [["oc:circuitTier3", "oc:craftingALU", "oc:craftingRAMTier5"] ["", "oc:craftingCard", ""]] } internetCard { diff --git a/src/main/resources/assets/opencomputers/recipes/gregtech.recipes b/src/main/resources/assets/opencomputers/recipes/gregtech.recipes index 98c76932f..55a4d3b54 100644 --- a/src/main/resources/assets/opencomputers/recipes/gregtech.recipes +++ b/src/main/resources/assets/opencomputers/recipes/gregtech.recipes @@ -9,8 +9,18 @@ analyzer { [screwAluminium, craftingToolScrewdriver, screwAluminium]] } -server { - input: [["oc:circuitTier3", "oc:craftingRAMTier4", "oc:circuitTier3"] +server1 { + input: [["oc:circuitTier1", "oc:craftingRAMTier4", "oc:circuitTier1"] + ["oc:circuitTier1", "oc:craftingCaseTier1", "oc:circuitTier2"] + [craftingToolScrewdriver, "oc:craftingCircuitBoardPrinted", craftingToolWrench]] +} +server2 { + input: [["oc:circuitTier2", "oc:craftingRAMTier5", "oc:circuitTier2"] + ["oc:circuitTier3", "oc:craftingCaseTier2", "oc:circuitTier3"] + [craftingToolScrewdriver, "oc:craftingCircuitBoardPrinted", craftingToolWrench]] +} +server3 { + input: [["oc:circuitTier3", "oc:craftingRAMTier6", "oc:circuitTier3"] ["oc:circuitTier3", "oc:craftingCaseTier3", "oc:circuitTier3"] [craftingToolScrewdriver, "oc:craftingCircuitBoardPrinted", craftingToolWrench]] } @@ -23,9 +33,9 @@ ram1 { time: 250 } ram2 { - input: [["oc:circuitTier2", "oc:circuitTier2", "oc:circuitTier2"] - ["oc:craftingRAMTier1", "oc:craftingCircuitBoardPrinted", "oc:craftingRAMTier1"] - [Dataorb, craftingToolWrench, Dataorb]] + input: [["oc:circuitTier1", "oc:circuitTier1", "oc:circuitTier1"] + ["", "oc:craftingRAMTier1", ""] + ["", craftingToolWrench, ""]] } ram3 { input: [["oc:circuitTier2", "oc:circuitTier2", "oc:circuitTier2"] @@ -33,7 +43,7 @@ ram3 { [Dataorb, craftingToolWrench, Dataorb]] } ram4 { - input: [["oc:circuitTier3", "oc:circuitTier3", "oc:circuitTier3"] + input: [["oc:circuitTier2", "oc:circuitTier2", "oc:circuitTier2"] ["oc:craftingRAMTier3", "oc:craftingCircuitBoardPrinted", "oc:craftingRAMTier3"] [Dataorb, craftingToolWrench, Dataorb]] } @@ -42,6 +52,11 @@ ram5 { ["oc:craftingRAMTier4", "oc:craftingCircuitBoardPrinted", "oc:craftingRAMTier4"] [Dataorb, craftingToolWrench, Dataorb]] } +ram6 { + input: [["oc:circuitTier3", "oc:circuitTier3", "oc:circuitTier3"] + ["oc:craftingRAMTier5", "oc:craftingCircuitBoardPrinted", "oc:craftingRAMTier5"] + [Dataorb, craftingToolWrench, Dataorb]] +} floppy { input: [[screwAluminium, lever, screwAluminium] @@ -174,12 +189,12 @@ cpu0 { } cpu1 { input: [["oc:circuitTier2", plateStainlessSteel, "oc:circuitTier2"] - ["oc:craftingRAMTier2", "oc:craftingCPUTier1", "oc:craftingRAMTier2"] + ["oc:craftingRAMTier3", "oc:craftingCPUTier1", "oc:craftingRAMTier3"] ["oc:circuitTier2", craftingToolScrewdriver, "oc:circuitTier2"]] } cpu2 { input: [["oc:circuitTier3", plateTitanium, "oc:circuitTier3"] - ["oc:craftingRAMTier4", "oc:craftingCPUTier2", "oc:craftingRAMTier4"] + ["oc:craftingRAMTier5", "oc:craftingCPUTier2", "oc:craftingRAMTier5"] ["oc:circuitTier3", craftingToolScrewdriver, "oc:circuitTier3"]] } cu { diff --git a/src/main/resources/assets/opencomputers/recipes/hardmode.recipes b/src/main/resources/assets/opencomputers/recipes/hardmode.recipes index eeb8ffe6d..66ac1b83e 100644 --- a/src/main/resources/assets/opencomputers/recipes/hardmode.recipes +++ b/src/main/resources/assets/opencomputers/recipes/hardmode.recipes @@ -15,17 +15,17 @@ terminal { } server1 { - input: [["oc:circuitTier1", "oc:craftingRAMTier3", "oc:circuitTier1"] + input: [["oc:circuitTier1", "oc:craftingRAMTier4", "oc:circuitTier1"] ["oc:circuitTier2", "oc:craftingCaseTier1", "oc:circuitTier2"] ["oc:craftingCircuitBoardPrinted", "oc:craftingCircuitBoardPrinted", "oc:craftingCircuitBoardPrinted"]] } server2 { - input: [["oc:circuitTier2", "oc:craftingRAMTier4", "oc:circuitTier2"] + input: [["oc:circuitTier2", "oc:craftingRAMTier5", "oc:circuitTier2"] ["oc:circuitTier3", "oc:craftingCaseTier2", "oc:circuitTier3"] ["oc:craftingCircuitBoardPrinted", "oc:craftingCircuitBoardPrinted", "oc:craftingCircuitBoardPrinted"]] } server3 { - input: [["oc:circuitTier3", "oc:craftingRAMTier5", "oc:circuitTier3"] + input: [["oc:circuitTier3", "oc:craftingRAMTier6", "oc:circuitTier3"] ["oc:circuitTier3", "oc:craftingCaseTier3", "oc:circuitTier3"] ["oc:craftingCircuitBoardPrinted", "oc:craftingCircuitBoardPrinted", "oc:craftingCircuitBoardPrinted"]] } @@ -36,20 +36,24 @@ ram1 { } ram2 { input: [["oc:circuitTier2", "oc:circuitTier2", "oc:circuitTier2"] - ["oc:craftingRAMTier1", "oc:craftingCircuitBoardPrinted", "oc:craftingRAMTier1"]] + ["", "oc:craftingRAMTier1", ""]] } ram3 { input: [["oc:circuitTier2", "oc:circuitTier2", "oc:circuitTier2"] ["oc:craftingRAMTier2", "oc:craftingCircuitBoardPrinted", "oc:craftingRAMTier2"]] } ram4 { - input: [["oc:circuitTier3", "oc:circuitTier3", "oc:circuitTier3"] + input: [["oc:circuitTier2", "oc:circuitTier2", "oc:circuitTier2"] ["oc:craftingRAMTier3", "oc:craftingCircuitBoardPrinted", "oc:craftingRAMTier3"]] } ram5 { input: [["oc:circuitTier3", "oc:circuitTier3", "oc:circuitTier3"] ["oc:craftingRAMTier4", "oc:craftingCircuitBoardPrinted", "oc:craftingRAMTier4"]] } +ram6 { + input: [["oc:circuitTier3", "oc:circuitTier3", "oc:circuitTier3"] + ["oc:craftingRAMTier5", "oc:craftingCircuitBoardPrinted", "oc:craftingRAMTier5"]] +} floppy { input: [[nuggetIron, lever, nuggetIron] @@ -81,11 +85,11 @@ graphicsCard1 { ["", "oc:craftingCard", ""]] } graphicsCard2 { - input: [["oc:circuitTier2", "oc:circuitTier2", "oc:craftingRAMTier2"] + input: [["oc:circuitTier2", "oc:circuitTier2", "oc:craftingRAMTier3"] ["", "oc:craftingGPUTier1", ""]] } graphicsCard3 { - input: [["oc:circuitTier3", "oc:circuitTier3", "oc:craftingRAMTier4"] + input: [["oc:circuitTier3", "oc:circuitTier3", "oc:craftingRAMTier5"] ["", "oc:craftingGPUTier2", ""]] } internetCard { @@ -193,14 +197,14 @@ cpu0 { [nuggetIron, "oc:craftingALU", nuggetIron]] } cpu1 { - input: [[nuggetGold, "oc:craftingRAMTier2", nuggetGold] + input: [[nuggetGold, "oc:craftingRAMTier3", nuggetGold] ["oc:circuitTier2", "oc:craftingCPUTier1", "oc:circuitTier2"] - [nuggetGold, "oc:craftingRAMTier2", nuggetGold]] + [nuggetGold, "oc:craftingRAMTier3", nuggetGold]] } cpu2 { - input: [[diamond, "oc:craftingRAMTier4", diamond] + input: [[diamond, "oc:craftingRAMTier5", diamond] ["oc:circuitTier3", "oc:craftingCPUTier2", "oc:circuitTier3"] - [diamond, "oc:craftingRAMTier4", diamond]] + [diamond, "oc:craftingRAMTier5", diamond]] } cu { input: [[nuggetGold, torchRedstoneActive, nuggetGold] diff --git a/src/main/resources/assets/opencomputers/textures/items/memory0.png b/src/main/resources/assets/opencomputers/textures/items/memory0.png index 4158e553e..7f372124d 100644 Binary files a/src/main/resources/assets/opencomputers/textures/items/memory0.png and b/src/main/resources/assets/opencomputers/textures/items/memory0.png differ diff --git a/src/main/resources/assets/opencomputers/textures/items/memory1.png b/src/main/resources/assets/opencomputers/textures/items/memory1.png index d61e552f2..53efb704d 100644 Binary files a/src/main/resources/assets/opencomputers/textures/items/memory1.png and b/src/main/resources/assets/opencomputers/textures/items/memory1.png differ diff --git a/src/main/resources/assets/opencomputers/textures/items/memory2.png b/src/main/resources/assets/opencomputers/textures/items/memory2.png index 1163de4c4..d1522c9b5 100644 Binary files a/src/main/resources/assets/opencomputers/textures/items/memory2.png and b/src/main/resources/assets/opencomputers/textures/items/memory2.png differ diff --git a/src/main/resources/assets/opencomputers/textures/items/memory3.png b/src/main/resources/assets/opencomputers/textures/items/memory3.png index 290f1349b..84bbc73f6 100644 Binary files a/src/main/resources/assets/opencomputers/textures/items/memory3.png and b/src/main/resources/assets/opencomputers/textures/items/memory3.png differ diff --git a/src/main/resources/assets/opencomputers/textures/items/memory4.png b/src/main/resources/assets/opencomputers/textures/items/memory4.png index 41f2411c8..a732b1716 100644 Binary files a/src/main/resources/assets/opencomputers/textures/items/memory4.png and b/src/main/resources/assets/opencomputers/textures/items/memory4.png differ diff --git a/src/main/resources/assets/opencomputers/textures/items/memory5.png b/src/main/resources/assets/opencomputers/textures/items/memory5.png new file mode 100644 index 000000000..2a851fa24 Binary files /dev/null and b/src/main/resources/assets/opencomputers/textures/items/memory5.png differ diff --git a/src/main/resources/reference.conf b/src/main/resources/reference.conf index 8f4b889ff..99d0e9996 100644 --- a/src/main/resources/reference.conf +++ b/src/main/resources/reference.conf @@ -96,12 +96,13 @@ opencomputers { # run in a low-priority worker thread, this should be barely noticeable. activeGC: true - # The sizes of the five levels of RAM, in kilobytes. This list must - # contain exactly five entries, or it will be ignored. Note that while - # there are five levels of RAM, they still fall into the three tiers of - # items (level 1 = tier 1, level 2, 3 = tier 2, level 4, 5 = tier 3). + # The sizes of the six levels of RAM, in kilobytes. This list must + # contain exactly six entries, or it will be ignored. Note that while + # there are six levels of RAM, they still fall into the three tiers of + # items (level 1, 2 = tier 1, level 3, 4 = tier 2, level 5, 6 = tier 3). ramSizes: [ 64 + 96 128 256 512 diff --git a/src/main/scala/li/cil/oc/Blocks.scala b/src/main/scala/li/cil/oc/Blocks.scala index 7301c3f01..98fa327be 100644 --- a/src/main/scala/li/cil/oc/Blocks.scala +++ b/src/main/scala/li/cil/oc/Blocks.scala @@ -17,7 +17,7 @@ object Blocks { var cable: Cable = _ var capacitor: Capacitor = _ var charger: Charger = _ - var case1, case2, case3: Case = _ + var case1, case2, case3, case4: Case = _ var diskDrive: DiskDrive = _ var keyboard: Keyboard = _ var keyboardDeprecated: KeyboardDeprecated = _ @@ -108,6 +108,9 @@ object Blocks { hologram = Recipes.addBlockDelegate(new Hologram(blockSpecial), "hologram") wirelessRouter = Recipes.addBlockDelegate(new WirelessRouter(blockSimple), "wirelessRouter") + // v1.2.6 + case4 = new Case.TierCreative(blockSimpleWithRedstone) + // Initialize API. api.Blocks.AccessPoint = wirelessRouter.createItemStack() api.Blocks.Adapter = adapter.createItemStack() diff --git a/src/main/scala/li/cil/oc/Items.scala b/src/main/scala/li/cil/oc/Items.scala index a736bf739..33fe693d5 100644 --- a/src/main/scala/li/cil/oc/Items.scala +++ b/src/main/scala/li/cil/oc/Items.scala @@ -21,7 +21,7 @@ object Items { // ----------------------------------------------------------------------- // // Memory - var ram1, ram2, ram3, ram4, ram5: item.Memory = _ + var ram1, ram2, ram3, ram4, ram5, ram6: item.Memory = _ // ----------------------------------------------------------------------- // // Storage @@ -78,8 +78,8 @@ object Items { analyzer = Recipes.addItemDelegate(new item.Analyzer(multi), "analyzer") ram1 = Recipes.addItemDelegate(new item.Memory(multi, 0), "ram1") - ram2 = Recipes.addItemDelegate(new item.Memory(multi, 1), "ram2") ram3 = Recipes.addItemDelegate(new item.Memory(multi, 2), "ram3") + ram4 = Recipes.addItemDelegate(new item.Memory(multi, 3), "ram4") floppyDisk = Recipes.addItemDelegate(new item.FloppyDisk(multi), "floppy") hdd1 = Recipes.addItemDelegate(new item.HardDiskDrive(multi, 0), "hdd1") @@ -129,8 +129,8 @@ object Items { Recipes.addItemDelegate(abstractBus, "abstractBusCard") } - ram4 = Recipes.addItemDelegate(new item.Memory(multi, 3), "ram4") ram5 = Recipes.addItemDelegate(new item.Memory(multi, 4), "ram5") + ram6 = Recipes.addItemDelegate(new item.Memory(multi, 5), "ram6") // v1.2.0 server3 = Recipes.addItemDelegate(new item.Server(multi, 2), "server3") @@ -149,6 +149,7 @@ object Items { // v1.2.6 interweb = Recipes.addItemDelegate(new item.Interweb(multi), "interweb") upgradeAngel = Recipes.addItemDelegate(new item.UpgradeAngel(multi), "angelUpgrade") + ram2 = Recipes.addItemDelegate(new item.Memory(multi, 1), "ram2") // Initialize API. api.Items.AbstractBusCard = abstractBus.createItemStack() @@ -210,6 +211,7 @@ object Items { register("oc:craftingRAMTier3", ram3.createItemStack()) register("oc:craftingRAMTier4", ram4.createItemStack()) register("oc:craftingRAMTier5", ram5.createItemStack()) + register("oc:craftingRAMTier6", ram6.createItemStack()) register("oc:craftingHDDTier1", hdd1.createItemStack()) register("oc:craftingHDDTier2", hdd2.createItemStack()) diff --git a/src/main/scala/li/cil/oc/Settings.scala b/src/main/scala/li/cil/oc/Settings.scala index 338021d0e..fe3ac9730 100644 --- a/src/main/scala/li/cil/oc/Settings.scala +++ b/src/main/scala/li/cil/oc/Settings.scala @@ -1,7 +1,6 @@ package li.cil.oc import com.typesafe.config.{ConfigRenderOptions, Config, ConfigFactory} -import cpw.mods.fml.common.ModAPIManager import java.io._ import java.util.logging.Level import li.cil.oc.util.PackedColor @@ -34,11 +33,14 @@ class Settings(config: Config) { case Array(tier1, tier2, tier3) => // For compatibility with older config files. Array(tier1: Int, tier2: Int, tier3: Int, tier3 * 2: Int, tier3 * 4: Int) - case Array(tier1, tier2, tier3, tier4, tier5) => - Array(tier1: Int, tier2: Int, tier3: Int, tier4: Int, tier5: Int) + case Array(tier1, tier3, tier4, tier5, tier6) => + // For compatibility with older config files. + Array(tier1: Int, (tier1: Int) * 3 / 2, tier3: Int, tier4: Int, tier5: Int, tier6: Int) + case Array(tier1, tier2, tier3, tier4, tier5, tier6) => + Array(tier1: Int, tier2: Int, tier3: Int, tier4: Int, tier5: Int, tier6: Int) case _ => OpenComputers.log.warning("Bad number of RAM sizes, ignoring.") - Array(64, 128, 256, 512, 1024) + Array(64, 96, 128, 256, 512, 1024) } val ramScaleFor64Bit = config.getDouble("computer.ramScaleFor64Bit") max 1 val cpuComponentSupport = Array(config.getIntList("computer.cpuComponentCount"): _*) match { diff --git a/src/main/scala/li/cil/oc/common/block/Case.scala b/src/main/scala/li/cil/oc/common/block/Case.scala index ff47ff378..10d28f181 100644 --- a/src/main/scala/li/cil/oc/common/block/Case.scala +++ b/src/main/scala/li/cil/oc/common/block/Case.scala @@ -22,7 +22,7 @@ abstract class Case(val parent: SimpleDelegator) extends RedstoneAware with Simp def tier: Int - override def rarity = Array(EnumRarity.common, EnumRarity.uncommon, EnumRarity.rare).apply(tier) + override def rarity = Array(EnumRarity.common, EnumRarity.uncommon, EnumRarity.rare, EnumRarity.epic).apply(tier) @SideOnly(Side.CLIENT) override def color = Color.byTier(tier) @@ -31,7 +31,8 @@ abstract class Case(val parent: SimpleDelegator) extends RedstoneAware with Simp val slots = tier match { case 0 => "2/1/1" case 1 => "2/2/2" - case 2 => "3/2/3" + case 2 | 3 => "3/2/3" + case _ => "0/0/0" } tooltip.addAll(Tooltip.get("Case", slots)) } @@ -119,4 +120,8 @@ object Case { def tier = 2 } + class TierCreative(parent: SimpleDelegator) extends Case(parent) { + def tier = 3 + } + } diff --git a/src/main/scala/li/cil/oc/common/component/Buffer.scala b/src/main/scala/li/cil/oc/common/component/Buffer.scala index 9bb573863..30e2fed12 100644 --- a/src/main/scala/li/cil/oc/common/component/Buffer.scala +++ b/src/main/scala/li/cil/oc/common/component/Buffer.scala @@ -71,7 +71,7 @@ class Buffer(val owner: Buffer.Owner) extends api.network.Environment { def resolution_=(value: (Int, Int)) = { val (w, h) = value val (mw, mh) = maxResolution - if (w < 1 || w > mw || h < 1 || h > mh) + if (w < 1 || h < 1 || w > mw || h > mw || h * w > mw * mh) throw new IllegalArgumentException("unsupported resolution") if (buffer.size = value) { if (node != null) { diff --git a/src/main/scala/li/cil/oc/common/container/Case.scala b/src/main/scala/li/cil/oc/common/container/Case.scala index 1895fc247..8d2e4eb05 100644 --- a/src/main/scala/li/cil/oc/common/container/Case.scala +++ b/src/main/scala/li/cil/oc/common/container/Case.scala @@ -5,7 +5,7 @@ import li.cil.oc.common.tileentity import net.minecraft.entity.player.{EntityPlayer, InventoryPlayer} class Case(playerInventory: InventoryPlayer, computer: tileentity.Case) extends Player(playerInventory, computer) { - for (i <- 0 to (if (computer.tier == 2) 2 else 1)) { + for (i <- 0 to (if (computer.tier >= 2) 2 else 1)) { addSlotToContainer(98, 16 + i * slotSize, api.driver.Slot.Card, computer.maxComponentTierForSlot(getInventory.size)) } @@ -17,11 +17,11 @@ class Case(playerInventory: InventoryPlayer, computer: tileentity.Case) extends addSlotToContainer(142, 16 + i * slotSize, api.driver.Slot.HardDiskDrive, computer.maxComponentTierForSlot(getInventory.size)) } - if (computer.tier == 2) { + if (computer.tier >= 2) { addSlotToContainer(142, 16 + 2 * slotSize, api.driver.Slot.Disk) } - addSlotToContainer(120, 16, api.driver.Slot.Processor, computer.tier) + addSlotToContainer(120, 16, api.driver.Slot.Processor, computer.maxComponentTierForSlot(getInventory.size)) if (computer.tier == 0) { addSlotToContainer(120, 16 + 2 * slotSize, api.driver.Slot.Memory, computer.maxComponentTierForSlot(getInventory.size)) diff --git a/src/main/scala/li/cil/oc/common/item/Memory.scala b/src/main/scala/li/cil/oc/common/item/Memory.scala index 2f0f47c1b..b867fad76 100644 --- a/src/main/scala/li/cil/oc/common/item/Memory.scala +++ b/src/main/scala/li/cil/oc/common/item/Memory.scala @@ -14,7 +14,7 @@ class Memory(val parent: Delegator, val tier: Int) extends Delegate { val kiloBytes = Settings.get.ramSizes(tier) - override def rarity = Array(EnumRarity.common, EnumRarity.uncommon, EnumRarity.uncommon, EnumRarity.rare, EnumRarity.rare).apply(tier max 0 min 4) + override def rarity = Array(EnumRarity.common, EnumRarity.common, EnumRarity.uncommon, EnumRarity.uncommon, EnumRarity.rare, EnumRarity.rare).apply(tier max 0 min Settings.get.ramSizes.length) override def displayName(stack: ItemStack) = Some(parent.internalGetItemStackDisplayName(stack) + " (%dKB)".format(kiloBytes)) diff --git a/src/main/scala/li/cil/oc/common/tileentity/Case.scala b/src/main/scala/li/cil/oc/common/tileentity/Case.scala index a8171bae0..94da8a9ca 100644 --- a/src/main/scala/li/cil/oc/common/tileentity/Case.scala +++ b/src/main/scala/li/cil/oc/common/tileentity/Case.scala @@ -52,10 +52,18 @@ class Case(var tier: Int, val isRemote: Boolean) extends traits.PowerAcceptor wi case _ => false } + override def updateEntity() { + if (tier == 3 && isServer && world.getWorldTime % Settings.get.tickFrequency == 0) { + // Creative case, make it generate power. + node.asInstanceOf[Connector].changeBuffer(Double.PositiveInfinity) + } + super.updateEntity() + } + // ----------------------------------------------------------------------- // override def readFromNBT(nbt: NBTTagCompound) { - tier = nbt.getByte(Settings.namespace + "tier") max 0 min 2 + tier = nbt.getByte(Settings.namespace + "tier") max 0 min 3 color = Color.byTier(tier) super.readFromNBT(nbt) recomputeMaxComponents() @@ -79,6 +87,7 @@ class Case(var tier: Int, val isRemote: Boolean) extends traits.PowerAcceptor wi case 0 => 6 case 1 => 7 case 2 => 9 + case 3 => 9 case _ => 0 } @@ -114,6 +123,16 @@ class Case(var tier: Int, val isRemote: Boolean) extends traits.PowerAcceptor wi 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 3 => (slot, Registry.itemDriverFor(stack)) match { + case (_, None) => false // Invalid item. + case (0 | 1 | 2, Some(driver)) => driver.slot(stack) == Slot.Card + case (3 | 4, Some(driver)) => driver.slot(stack) == Slot.Memory + case (5 | 6, Some(driver)) => driver.slot(stack) == Slot.HardDiskDrive + case (7, Some(driver)) => driver.slot(stack) == Slot.Disk + case (8, Some(driver)) => driver.slot(stack) == Slot.Processor + case _ => false // Invalid slot. } case _ => false } @@ -139,6 +158,7 @@ class Case(var tier: Int, val isRemote: Boolean) extends traits.PowerAcceptor wi case 8 => 2 case _ => -1 // Invalid slot. } + case 3 => 2 case _ => -1 } } \ No newline at end of file diff --git a/src/main/scala/li/cil/oc/common/tileentity/Hologram.scala b/src/main/scala/li/cil/oc/common/tileentity/Hologram.scala index a65e03627..066a9c6d2 100644 --- a/src/main/scala/li/cil/oc/common/tileentity/Hologram.scala +++ b/src/main/scala/li/cil/oc/common/tileentity/Hologram.scala @@ -82,19 +82,13 @@ class Hologram extends traits.Environment with SidedEnvironment with Analyzable @Callback(direct = true, doc = """function(x:number, z:number):number -- Returns the bit mask representing the specified column.""") def get(computer: Context, args: Arguments): Array[AnyRef] = this.synchronized { - val x = args.checkInteger(0) - 1 - if (x < 0 || x >= width) throw new ArrayIndexOutOfBoundsException() - val z = args.checkInteger(1) - 1 - if (z < 0 || z >= width) throw new ArrayIndexOutOfBoundsException() + val (x, z) = checkCoordinates(args) result(volume(x + z * width)) } @Callback(direct = true, limit = 256, doc = """function(x:number, z:number, value:number) -- Set the bit mask for the specified column.""") def set(computer: Context, args: Arguments): Array[AnyRef] = this.synchronized { - val x = args.checkInteger(0) - 1 - if (x < 0 || x >= width) throw new ArrayIndexOutOfBoundsException() - val z = args.checkInteger(1) - 1 - if (z < 0 || z >= width) throw new ArrayIndexOutOfBoundsException() + val (x, z) = checkCoordinates(args) val value = args.checkDouble(2).longValue.intValue volume(x + z * width) = value setDirty(x, z) @@ -103,10 +97,7 @@ class Hologram extends traits.Environment with SidedEnvironment with Analyzable @Callback(direct = true, limit = 128, doc = """function(x:number, z:number, height:number) -- Fills a column to the specified height.""") def fill(computer: Context, args: Arguments): Array[AnyRef] = this.synchronized { - val x = args.checkInteger(0) - 1 - if (x < 0 || x >= width) throw new ArrayIndexOutOfBoundsException() - val z = args.checkInteger(1) - 1 - if (z < 0 || z >= width) throw new ArrayIndexOutOfBoundsException() + val (x, z) = checkCoordinates(args) val height = math.min(32, math.max(0, args.checkInteger(2))) // Bit shifts in the JVM only use the lowest five bits... so we have to // manually check the height, to avoid the shift being a no-op. @@ -115,6 +106,58 @@ class Hologram extends traits.Environment with SidedEnvironment with Analyzable null } + @Callback(doc = """function(x:number, z:number, sx:number, sz:number, tx:number, tz:number) -- Copies an area of columns by the specified translation.""") + def copy(computer: Context, args: Arguments): Array[AnyRef] = this.synchronized { + val (x, z) = checkCoordinates(args) + val w = args.checkInteger(2) + val h = args.checkInteger(3) + val tx = args.checkInteger(4) + val tz = args.checkInteger(5) + + // Anything to do at all? + if (w <= 0 || h <= 0) return null + if (tx == 0 && tz == 0) return null + // Loop over the target rectangle, starting from the directions away from + // the source rectangle and copy the data. This way we ensure we don't + // overwrite anything we still need to copy. + val (dx0, dx1) = (math.max(0, math.min(width - 1, x + tx + w - 1)), math.max(0, math.min(width, x + tx))) match { + case dx if tx > 0 => dx + case dx => dx.swap + } + val (dz0, dz1) = (math.max(0, math.min(width - 1, z + tz + h - 1)), math.max(0, math.min(width, z + tz))) match { + case dz if tz > 0 => dz + case dz => dz.swap + } + val (sx, sz) = (if (tx > 0) -1 else 1, if (tz > 0) -1 else 1) + // Copy values to destination rectangle if there source is valid. + for (nz <- dz0 to dz1 by sz) { + nz - tz match { + case oz if oz >= 0 && oz < width => + for (nx <- dx0 to dx1 by sx) { + nx - tx match { + case ox if ox >= 0 && ox < width => + volume(nz * width + nx) = volume(oz * width + ox) + case _ => /* Got no source column. */ + } + } + case _ => /* Got no source row. */ + } + } + + // Mark target rectangle dirty. + setDirty(math.min(dx0, dx1), math.min(dz0, dz1)) + setDirty(math.max(dx0, dx1), math.max(dz0, dz1)) + + // The reasoning here is: it'd take 18 ticks to do the whole are with fills, + // so make this slightly more efficient (15 ticks - 0.75 seconds). Make it + // 'free' if it's less than 0.25 seconds, i.e. for small copies. + val area = (math.max(dx0, dx1) - math.min(dx0, dx1)) * (math.max(dz0, dz1) - math.min(dz0, dz1)) + val relativeArea = math.max(0, area / (width * width).toFloat - 0.25) + computer.pause(relativeArea) + + null + } + @Callback(doc = """function():number -- Returns the render scale of the hologram.""") def getScale(computer: Context, args: Arguments): Array[AnyRef] = { result(scale) @@ -127,6 +170,14 @@ class Hologram extends traits.Environment with SidedEnvironment with Analyzable null } + private def checkCoordinates(args: Arguments) = { + val x = args.checkInteger(0) - 1 + if (x < 0 || x >= width) throw new ArrayIndexOutOfBoundsException() + val z = args.checkInteger(1) - 1 + if (z < 0 || z >= width) throw new ArrayIndexOutOfBoundsException() + (x, z) + } + // ----------------------------------------------------------------------- // override def updateEntity() { diff --git a/src/main/scala/li/cil/oc/common/tileentity/Robot.scala b/src/main/scala/li/cil/oc/common/tileentity/Robot.scala index 92009daca..f442965c6 100644 --- a/src/main/scala/li/cil/oc/common/tileentity/Robot.scala +++ b/src/main/scala/li/cil/oc/common/tileentity/Robot.scala @@ -545,7 +545,7 @@ class Robot(val isRemote: Boolean) extends traits.Computer with traits.TextBuffe // ----------------------------------------------------------------------- // - override def installedMemory = 96 * 1024 + override def installedMemory = Settings.get.ramSizes(1) * 1024 override def tier = 0 diff --git a/src/main/scala/li/cil/oc/server/component/GraphicsCard.scala b/src/main/scala/li/cil/oc/server/component/GraphicsCard.scala index 0a919c5d1..76e810fa1 100644 --- a/src/main/scala/li/cil/oc/server/component/GraphicsCard.scala +++ b/src/main/scala/li/cil/oc/server/component/GraphicsCard.scala @@ -123,8 +123,11 @@ abstract class GraphicsCard extends ManagedComponent { val w = args.checkInteger(0) val h = args.checkInteger(1) val (mw, mh) = maxResolution - if (w > 0 && h > 0 && w <= mw && h <= mh) screen(s => result(s.resolution = (w, h))) - else throw new IllegalArgumentException("unsupported resolution") + // Even though the buffer itself checks this again, we need this here for + // the minimum of screen and GPU resolution. + if (w < 1 || h < 1 || w > mw || h > mw || h * w > mw * mh) + throw new IllegalArgumentException("unsupported resolution") + screen(s => result(s.resolution = (w, h))) } @Callback(direct = true) diff --git a/src/main/scala/li/cil/oc/server/driver/item/Memory.scala b/src/main/scala/li/cil/oc/server/driver/item/Memory.scala index 6f9d4ff55..bc123ef5b 100644 --- a/src/main/scala/li/cil/oc/server/driver/item/Memory.scala +++ b/src/main/scala/li/cil/oc/server/driver/item/Memory.scala @@ -13,7 +13,7 @@ object Memory extends Item with driver.Memory { case _ => 0 } - override def worksWith(stack: ItemStack) = isOneOf(stack, Items.ram1, Items.ram2, Items.ram3, Items.ram4, Items.ram5) + override def worksWith(stack: ItemStack) = isOneOf(stack, Items.ram1, Items.ram2, Items.ram3, Items.ram4, Items.ram5, Items.ram6) override def createEnvironment(stack: ItemStack, container: MCTileEntity) = null @@ -21,7 +21,7 @@ object Memory extends Item with driver.Memory { override def tier(stack: ItemStack) = Items.multi.subItem(stack) match { - case Some(memory: item.Memory) => (memory.tier + 1) / 2 + case Some(memory: item.Memory) => memory.tier / 2 case _ => 0 } } diff --git a/src/main/scala/li/cil/oc/util/Color.scala b/src/main/scala/li/cil/oc/util/Color.scala index 1a97b70d9..7e1bb435e 100644 --- a/src/main/scala/li/cil/oc/util/Color.scala +++ b/src/main/scala/li/cil/oc/util/Color.scala @@ -47,7 +47,7 @@ object Color { "dyeOrange" -> Orange, "dyeWhite" -> White) - val byTier = Array(LightGray, Yellow, Cyan) + val byTier = Array(LightGray, Yellow, Cyan, Magenta) def isDye(stack: ItemStack) = byOreName.contains(OreDictionary.getOreName(OreDictionary.getOreID(stack))) diff --git a/src/main/scala/li/cil/oc/util/ItemCosts.scala b/src/main/scala/li/cil/oc/util/ItemCosts.scala index f4bdd97f3..0fb70b493 100644 --- a/src/main/scala/li/cil/oc/util/ItemCosts.scala +++ b/src/main/scala/li/cil/oc/util/ItemCosts.scala @@ -115,5 +115,10 @@ object ItemCosts { accumulate(what) } - def fuzzyEquals(stack1: ItemStack, stack2: ItemStack) = stack1.isItemEqual(stack2) || (stack1.getItem == stack2.getItem && (stack1.getItemDamage == OreDictionary.WILDCARD_VALUE || stack2.getItemDamage == OreDictionary.WILDCARD_VALUE)) + // In case you'd like to use this class for your items and your items use + // NBT data in the item stack to differentiate them uncomment the last part. + // We don't use this in OC because the NBT of items can change dynamically, + // for example by components being assigned an address, which will break the + // equals check. + private def fuzzyEquals(stack1: ItemStack, stack2: ItemStack) = stack1.isItemEqual(stack2) || (stack1.getItem == stack2.getItem && (stack1.getItemDamage == OreDictionary.WILDCARD_VALUE || stack2.getItemDamage == OreDictionary.WILDCARD_VALUE)) && ItemStack.areItemStackTagsEqual(stack1, stack2) } diff --git a/src/main/scala/li/cil/oc/util/TextBuffer.scala b/src/main/scala/li/cil/oc/util/TextBuffer.scala index 9aa40cd51..07b13c41b 100644 --- a/src/main/scala/li/cil/oc/util/TextBuffer.scala +++ b/src/main/scala/li/cil/oc/util/TextBuffer.scala @@ -135,11 +135,11 @@ class TextBuffer(var width: Int, var height: Int, initialDepth: PackedColor.Dept // Loop over the target rectangle, starting from the directions away from // the source rectangle and copy the data. This way we ensure we don't // overwrite anything we still need to copy. - val (dx0, dx1) = (math.max(col + tx + w - 1, math.min(0, width - 1)), math.max(col + tx, math.min(0, width))) match { + val (dx0, dx1) = (math.max(0, math.min(width - 1, col + tx + w - 1)), math.max(0, math.min(width, col + tx))) match { case dx if tx > 0 => dx case dx => dx.swap } - val (dy0, dy1) = (math.max(row + ty + h - 1, math.min(0, height - 1)), math.max(row + ty, math.min(0, height))) match { + val (dy0, dy1) = (math.max(0, math.min(height - 1, row + ty + h - 1)), math.max(0, math.min(height, row + ty))) match { case dy if ty > 0 => dy case dy => dy.swap }