diff --git a/src/main/java/com/github/technus/tectech/loader/recipe/Godforge.java b/src/main/java/com/github/technus/tectech/loader/recipe/Godforge.java index ca5f719aa..28d686769 100644 --- a/src/main/java/com/github/technus/tectech/loader/recipe/Godforge.java +++ b/src/main/java/com/github/technus/tectech/loader/recipe/Godforge.java @@ -1,11 +1,13 @@ package com.github.technus.tectech.loader.recipe; +import static com.github.technus.tectech.util.GodforgeMath.getRandomIntInRange; import static gregtech.api.enums.Mods.GTPlusPlus; import static gregtech.api.util.GT_RecipeBuilder.SECONDS; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; +import java.util.List; import net.minecraft.item.ItemStack; import net.minecraftforge.fluids.FluidStack; @@ -13,7 +15,9 @@ import com.github.technus.tectech.recipe.TT_recipeAdder; import gregtech.api.enums.Materials; +import gregtech.api.enums.MaterialsUEVplus; import gregtech.api.enums.TierEU; +import gregtech.api.util.GT_Utility; import gtPlusPlus.core.material.ELEMENT; public class Godforge implements Runnable { @@ -23,7 +27,11 @@ public class Godforge implements Runnable { public static final HashMap exoticModulePlasmaItemMap = new HashMap<>(); public static final HashMap exoticModulePlasmaFluidMap = new HashMap<>(); public static final HashMap exoticModuleMagmatterItemMap = new HashMap<>(); - public static final HashMap exoticModuleMagmatterFluidMap = new HashMap<>(); + public static final List quarkGluonFluidItemsForNEI = new ArrayList<>(); + public static final List quarkGluonItemsForNEI = new ArrayList<>(); + public static final List magmatterTimeFluidItemsForNEI = new ArrayList<>(); + public static final List magmatterSpaceFluidItemsForNEI = new ArrayList<>(); + public static final List magmatterItemsForNEI = new ArrayList<>(); @Override public void run() { @@ -34,9 +42,75 @@ public void run() { // Fusion tier 1-3 { // Single step - ItemStack[] solids_t0_1step = { Materials.Aluminium.getDust(1), Materials.Iron.getDust(1) }; + ItemStack[] solids_t0_1step = { Materials.Aluminium.getDust(1), Materials.Iron.getDust(1), + Materials.Calcium.getDust(1), Materials.Sulfur.getDust(1), Materials.Zinc.getDust(1), + Materials.Niobium.getDust(1), Materials.Tin.getDust(1), Materials.Titanium.getDust(1), + Materials.Nickel.getDust(1), Materials.Silver.getDust(1), Materials.Americium.getDust(1), + Materials.Antimony.getDust(1), Materials.Ardite.getDust(1), Materials.Arsenic.getDust(1), + Materials.Barium.getDust(1), Materials.Beryllium.getDust(1), Materials.Caesium.getDust(1), + Materials.Cadmium.getDust(1), Materials.Carbon.getDust(1), Materials.Cerium.getDust(1), + Materials.Cobalt.getDust(1), Materials.Copper.getDust(1), Materials.Desh.getDust(1), + Materials.Dysprosium.getDust(1), Materials.Erbium.getDust(1), Materials.Europium.getDust(1), + Materials.Gadolinium.getDust(1), Materials.Gallium.getDust(1), Materials.Gold.getDust(1), + Materials.Holmium.getDust(1), Materials.Indium.getDust(1), Materials.Lanthanum.getDust(1), + Materials.Lithium.getDust(1), Materials.Lutetium.getDust(1), Materials.Magnesium.getDust(1), + Materials.Manganese.getDust(1), Materials.MeteoricIron.getDust(1), + Materials.Molybdenum.getDust(1), Materials.Neodymium.getDust(1), + Materials.Oriharukon.getDust(1), Materials.Palladium.getDust(1), + Materials.Phosphorus.getDust(1), Materials.Potassium.getDust(1), + Materials.Praseodymium.getDust(1), Materials.Promethium.getDust(1), + Materials.Rubidium.getDust(1), Materials.Samarium.getDust(1), Materials.Silicon.getDust(1), + Materials.Sodium.getDust(1), Materials.Strontium.getDust(1), Materials.Tantalum.getDust(1), + Materials.Tellurium.getDust(1), Materials.Terbium.getDust(1), Materials.Thulium.getDust(1), + Materials.Tungsten.getDust(1), Materials.Uranium.getDust(1), + Materials.Uranium235.getDust(1), Materials.Vanadium.getDust(1), + Materials.Ytterbium.getDust(1), Materials.Yttrium.getDust(1), + ELEMENT.getInstance().ZIRCONIUM.getDust(1), ELEMENT.getInstance().THORIUM232.getDust(1), + ELEMENT.getInstance().GERMANIUM.getDust(1), ELEMENT.getInstance().THALLIUM.getDust(1), + ELEMENT.getInstance().RUTHENIUM.getDust(1), ELEMENT.getInstance().RHENIUM.getDust(1), + ELEMENT.getInstance().RHODIUM.getDust(1), ELEMENT.getInstance().IODINE.getDust(1), + ELEMENT.getInstance().HAFNIUM.getDust(1), ELEMENT.getInstance().CURIUM.getDust(1) }; FluidStack[] solid_plasmas_t0_1step = { Materials.Aluminium.getPlasma(144), - Materials.Iron.getPlasma(144) }; + Materials.Iron.getPlasma(144), Materials.Calcium.getPlasma(144), + Materials.Sulfur.getPlasma(144), Materials.Zinc.getPlasma(144), + Materials.Niobium.getPlasma(144), Materials.Tin.getPlasma(144), + Materials.Titanium.getPlasma(144), Materials.Nickel.getPlasma(144), + Materials.Silver.getPlasma(144), Materials.Americium.getPlasma(144), + Materials.Antimony.getPlasma(144), Materials.Ardite.getPlasma(144), + Materials.Arsenic.getPlasma(144), Materials.Barium.getPlasma(144), + Materials.Beryllium.getPlasma(144), Materials.Caesium.getPlasma(144), + Materials.Cadmium.getPlasma(144), Materials.Carbon.getPlasma(144), + Materials.Cerium.getPlasma(144), Materials.Cobalt.getPlasma(144), + Materials.Copper.getPlasma(144), Materials.Desh.getPlasma(144), + Materials.Dysprosium.getPlasma(144), Materials.Erbium.getPlasma(144), + Materials.Europium.getPlasma(144), Materials.Gadolinium.getPlasma(144), + Materials.Gallium.getPlasma(144), Materials.Gold.getPlasma(144), + Materials.Holmium.getPlasma(144), Materials.Indium.getPlasma(144), + Materials.Lanthanum.getPlasma(144), Materials.Lithium.getPlasma(144), + Materials.Lutetium.getPlasma(144), Materials.Magnesium.getPlasma(144), + Materials.Manganese.getPlasma(144), Materials.MeteoricIron.getPlasma(144), + Materials.Molybdenum.getPlasma(144), Materials.Neodymium.getPlasma(144), + Materials.Oriharukon.getPlasma(144), Materials.Palladium.getPlasma(144), + Materials.Phosphorus.getPlasma(144), Materials.Potassium.getPlasma(144), + Materials.Praseodymium.getPlasma(144), Materials.Promethium.getPlasma(144), + Materials.Rubidium.getPlasma(144), Materials.Samarium.getPlasma(144), + Materials.Silicon.getPlasma(144), Materials.Sodium.getPlasma(144), + Materials.Strontium.getPlasma(144), Materials.Tantalum.getPlasma(144), + Materials.Tellurium.getPlasma(144), Materials.Terbium.getPlasma(144), + Materials.Thulium.getPlasma(144), Materials.Tungsten.getPlasma(144), + Materials.Uranium.getPlasma(144), Materials.Uranium235.getPlasma(144), + Materials.Vanadium.getPlasma(144), Materials.Ytterbium.getPlasma(144), + Materials.Yttrium.getPlasma(144), + new FluidStack(ELEMENT.getInstance().ZIRCONIUM.getPlasma(), 144), + new FluidStack(ELEMENT.getInstance().THORIUM232.getPlasma(), 144), + new FluidStack(ELEMENT.getInstance().GERMANIUM.getPlasma(), 144), + new FluidStack(ELEMENT.getInstance().THALLIUM.getPlasma(), 144), + new FluidStack(ELEMENT.getInstance().RUTHENIUM.getPlasma(), 144), + new FluidStack(ELEMENT.getInstance().RHENIUM.getPlasma(), 144), + new FluidStack(ELEMENT.getInstance().RHODIUM.getPlasma(), 144), + new FluidStack(ELEMENT.getInstance().IODINE.getPlasma(), 144), + new FluidStack(ELEMENT.getInstance().HAFNIUM.getPlasma(), 144), + new FluidStack(ELEMENT.getInstance().CURIUM.getPlasma(), 144) }; for (int i = 0; i < solids_t0_1step.length; i++) { TT_recipeAdder.addFOGPlasmaRecipe( @@ -50,16 +124,30 @@ public void run() { // Multi-step ItemStack[] solids_t0_xstep = { Materials.Force.getDust(1), Materials.Bismuth.getDust(1), - ELEMENT.STANDALONE.ADVANCED_NITINOL.getDust(1) }; + ELEMENT.STANDALONE.ADVANCED_NITINOL.getDust(1), Materials.Boron.getDust(1), + ELEMENT.STANDALONE.ASTRAL_TITANIUM.getDust(1), ELEMENT.STANDALONE.RUNITE.getDust(1), + ELEMENT.STANDALONE.CELESTIAL_TUNGSTEN.getDust(1), Materials.Iridium.getDust(1), + Materials.Naquadah.getDust(1), Materials.Osmium.getDust(1), Materials.Platinum.getDust(1), + Materials.Plutonium.getDust(1), ELEMENT.getInstance().CALIFORNIUM.getDust(1), + Materials.Chrome.getDust(1) }; FluidStack[] solid_plasmas_t0_xstep = { new FluidStack(ELEMENT.STANDALONE.FORCE.getPlasma(), 144), Materials.Bismuth.getPlasma(144), - new FluidStack(ELEMENT.STANDALONE.ADVANCED_NITINOL.getPlasma(), 144) }; + new FluidStack(ELEMENT.STANDALONE.ADVANCED_NITINOL.getPlasma(), 144), + Materials.Boron.getPlasma(144), + new FluidStack(ELEMENT.STANDALONE.ASTRAL_TITANIUM.getPlasma(), 144), + new FluidStack(ELEMENT.STANDALONE.RUNITE.getPlasma(), 144), + new FluidStack(ELEMENT.STANDALONE.CELESTIAL_TUNGSTEN.getPlasma(), 144), + Materials.Iridium.getPlasma(144), Materials.Naquadah.getPlasma(144), + Materials.Osmium.getPlasma(144), Materials.Platinum.getPlasma(144), + Materials.Plutonium.getPlasma(144), + new FluidStack(ELEMENT.getInstance().CALIFORNIUM.getPlasma(), 144), + Materials.Chrome.getPlasma(144), }; for (int i = 0; i < solids_t0_xstep.length; i++) { TT_recipeAdder.addFOGPlasmaRecipe( new ItemStack[] { solids_t0_xstep[i] }, new FluidStack[] { solid_plasmas_t0_xstep[i] }, - 1 * SECONDS, + 3 * SECONDS, (int) TierEU.RECIPE_MAX, true, 0); @@ -68,14 +156,16 @@ public void run() { // Fusion tier 4-5 { // Single step - ItemStack[] solids_t1_1step = { Materials.Lead.getDust(1) }; - FluidStack[] solid_plasmas_t1_1step = { Materials.Lead.getPlasma(144) }; + ItemStack[] solids_t1_1step = { Materials.Lead.getDust(1), Materials.Plutonium241.getDust(1), + Materials.Thorium.getDust(1) }; + FluidStack[] solid_plasmas_t1_1step = { Materials.Lead.getPlasma(144), + Materials.Plutonium241.getPlasma(144), Materials.Thorium.getPlasma(144) }; for (int i = 0; i < solids_t1_1step.length; i++) { TT_recipeAdder.addFOGPlasmaRecipe( new ItemStack[] { solids_t1_1step[i] }, new FluidStack[] { solid_plasmas_t1_1step[i] }, - 1 * SECONDS, + 5 * SECONDS, (int) TierEU.RECIPE_MAX, false, 1); @@ -92,7 +182,7 @@ public void run() { TT_recipeAdder.addFOGPlasmaRecipe( new ItemStack[] { solids_t1_xstep[i] }, new FluidStack[] { solid_plasmas_t1_xstep[i] }, - 1 * SECONDS, + 7 * SECONDS, (int) TierEU.RECIPE_MAX, true, 1); @@ -101,15 +191,21 @@ public void run() { // Exotic Plasmas { // Single step - ItemStack[] solids_t2_1step = { ELEMENT.STANDALONE.RHUGNOR.getDust(1) }; - FluidStack[] solid_plasmas_t2_1step = { - new FluidStack(ELEMENT.STANDALONE.RHUGNOR.getPlasma(), 144) }; + ItemStack[] solids_t2_1step = { ELEMENT.STANDALONE.RHUGNOR.getDust(1), + ELEMENT.STANDALONE.DRAGON_METAL.getDust(1), ELEMENT.STANDALONE.CHRONOMATIC_GLASS.getDust(1), + Materials.CosmicNeutronium.getDust(1), Materials.Draconium.getDust(1), + Materials.DraconiumAwakened.getDust(1), Materials.Ichorium.getDust(1) }; + FluidStack[] solid_plasmas_t2_1step = { new FluidStack(ELEMENT.STANDALONE.RHUGNOR.getPlasma(), 144), + new FluidStack(ELEMENT.STANDALONE.DRAGON_METAL.getPlasma(), 144), + new FluidStack(ELEMENT.STANDALONE.CHRONOMATIC_GLASS.getPlasma(), 144), + Materials.CosmicNeutronium.getPlasma(144), Materials.Draconium.getPlasma(144), + Materials.DraconiumAwakened.getPlasma(144), Materials.Ichorium.getPlasma(144) }; for (int i = 0; i < solids_t2_1step.length; i++) { TT_recipeAdder.addFOGPlasmaRecipe( new ItemStack[] { solids_t2_1step[i] }, new FluidStack[] { solid_plasmas_t2_1step[i] }, - 1 * SECONDS, + 15 * SECONDS, (int) TierEU.RECIPE_MAX, false, 2); @@ -117,15 +213,17 @@ public void run() { // Multi-step ItemStack[] solids_t2_xstep = { ELEMENT.STANDALONE.HYPOGEN.getDust(1), - Materials.Tritanium.getDust(1) }; + Materials.Tritanium.getDust(1), Materials.Flerovium.getDust(1), + Materials.Neutronium.getDust(1), }; FluidStack[] solid_plasmas_t2_xstep = { new FluidStack(ELEMENT.STANDALONE.HYPOGEN.getPlasma(), 144), - Materials.Tritanium.getPlasma(144) }; + Materials.Tritanium.getPlasma(144), Materials.Flerovium.getPlasma(144), + Materials.Neutronium.getPlasma(144), }; for (int i = 0; i < solids_t2_xstep.length; i++) { TT_recipeAdder.addFOGPlasmaRecipe( new ItemStack[] { solids_t2_xstep[i] }, new FluidStack[] { solid_plasmas_t2_xstep[i] }, - 1 * SECONDS, + 25 * SECONDS, (int) TierEU.RECIPE_MAX, true, 2); @@ -140,8 +238,17 @@ public void run() { // Fusion tier 1-3 { // Single step - FluidStack[] fluids_t0_1step = { Materials.Helium.getGas(1000) }; - FluidStack[] fluid_plasmas_t0_1step = { Materials.Helium.getPlasma(1000) }; + FluidStack[] fluids_t0_1step = { Materials.Helium.getGas(1000), Materials.Nitrogen.getGas(1000), + Materials.Argon.getGas(1000), Materials.Chlorine.getGas(1000), + Materials.Deuterium.getGas(1000), Materials.Fluorine.getGas(1000), + Materials.Hydrogen.getGas(1000), Materials.Radon.getGas(1000), + Materials.Tritium.getGas(1000), Materials.Mercury.getFluid(1000) }; + FluidStack[] fluid_plasmas_t0_1step = { Materials.Helium.getPlasma(1000), + Materials.Nitrogen.getPlasma(1000), Materials.Argon.getPlasma(1000), + Materials.Chlorine.getPlasma(1000), Materials.Deuterium.getPlasma(1000), + Materials.Fluorine.getPlasma(1000), Materials.Hydrogen.getPlasma(1000), + Materials.Radon.getPlasma(1000), Materials.Tritium.getPlasma(1000), + Materials.Mercury.getPlasma(1000) }; for (int i = 0; i < fluids_t0_1step.length; i++) { TT_recipeAdder.addFOGPlasmaRecipe( @@ -154,15 +261,20 @@ public void run() { } // Multi-step - FluidStack[] fluids_t0_xstep = { ELEMENT.getInstance().NEON.getFluidStack(1000) }; + FluidStack[] fluids_t0_xstep = { ELEMENT.getInstance().NEON.getFluidStack(1000), + Materials.Oxygen.getGas(1000), ELEMENT.getInstance().KRYPTON.getFluidStack(1000), + ELEMENT.getInstance().XENON.getFluidStack(1000) }; FluidStack[] fluid_plasmas_t0_xstep = { - new FluidStack(ELEMENT.getInstance().NEON.getPlasma(), 1000) }; + new FluidStack(ELEMENT.getInstance().NEON.getPlasma(), 1000), + Materials.Oxygen.getPlasma(1000), + new FluidStack(ELEMENT.getInstance().KRYPTON.getPlasma(), 1000), + new FluidStack(ELEMENT.getInstance().XENON.getPlasma(), 1000) }; for (int i = 0; i < fluids_t0_xstep.length; i++) { TT_recipeAdder.addFOGPlasmaRecipe( new FluidStack[] { fluids_t0_xstep[i] }, new FluidStack[] { fluid_plasmas_t0_xstep[i] }, - 1 * SECONDS, + 3 * SECONDS, (int) TierEU.RECIPE_MAX, true, 0); @@ -185,11 +297,17 @@ public void run() { // Exotic module fake recipes { TT_recipeAdder.addFOGExoticFakeRecipe( - new Object[] { Materials.Iron.getDust(1), Materials.Bismuth.getDust(1), - Materials.Tritanium.getDust(1) }, - new Object[] { Materials.Helium.getGas(1000), ELEMENT.getInstance().NEON.getFluidStack(1000), - ELEMENT.getInstance().XENON.getFluidStack(1000) }, - new FluidStack[] { Materials.Titanium.getMolten(1000) }, + new ItemStack[] { Materials.Iron.getDust(1) }, + new FluidStack[] { Materials.Iron.getMolten(1) }, + new FluidStack[] { MaterialsUEVplus.QuarkGluonPlasma.getFluid(1000) }, + 10 * SECONDS, + (int) TierEU.RECIPE_MAX, + 1); + + TT_recipeAdder.addFOGExoticFakeRecipe( + new ItemStack[] { Materials.Iron.getDust(1) }, + new FluidStack[] { Materials.Iron.getMolten(1), Materials.Bismuth.getMolten(1) }, + new FluidStack[] { MaterialsUEVplus.MagMatter.getMolten(144) }, 10 * SECONDS, (int) TierEU.RECIPE_MAX, 1); @@ -280,8 +398,7 @@ public void run() { Materials.Vanadium, Materials.Ytterbium, Materials.Yttrium, - Materials.Zinc, - Materials.Flerovium)); + Materials.Zinc)); plasmaGTWeightList.addAll( Arrays.asList( @@ -365,8 +482,7 @@ public void run() { 6000 /* Vanadium */, 2000 /* Ytterbium */, 6000 /* Yttrium */, - 6000 /* Zinc */, - 1000 /* Flerovium */ )); + 6000 /* Zinc */)); // GT++ materials if (GTPlusPlus.isModLoaded()) { @@ -405,24 +521,41 @@ public void run() { } } - // Magmatter maps - exoticModuleMagmatterItemMap.putAll(exoticModulePlasmaItemMap); - exoticModuleMagmatterFluidMap.putAll(exoticModulePlasmaFluidMap); - + // Magmatter map // GT materials exoticModuleMagmatterItemMap.put(Materials.CosmicNeutronium.getDustTiny(1), 100000); exoticModuleMagmatterItemMap.put(Materials.Draconium.getDustTiny(1), 100000); exoticModuleMagmatterItemMap.put(Materials.DraconiumAwakened.getDustTiny(1), 100000); exoticModuleMagmatterItemMap.put(Materials.Ichorium.getDustTiny(1), 100000); exoticModuleMagmatterItemMap.put(Materials.Neutronium.getDustTiny(1), 100000); + exoticModuleMagmatterItemMap.put(Materials.Flerovium.getDustTiny(1), 100000); // GT++ materials if (GTPlusPlus.isModLoaded()) { exoticModuleMagmatterItemMap.put(ELEMENT.STANDALONE.CELESTIAL_TUNGSTEN.getTinyDust(1), 100000); - exoticModuleMagmatterFluidMap.put(ELEMENT.STANDALONE.HYPOGEN.getFluidStack(1), 100000); - exoticModuleMagmatterFluidMap.put(ELEMENT.STANDALONE.RHUGNOR.getFluidStack(1), 100000); - exoticModuleMagmatterFluidMap.put(ELEMENT.STANDALONE.CHRONOMATIC_GLASS.getFluidStack(1), 100000); - exoticModuleMagmatterFluidMap.put(ELEMENT.STANDALONE.DRAGON_METAL.getFluidStack(1), 100000); + exoticModuleMagmatterItemMap.put(ELEMENT.STANDALONE.HYPOGEN.getTinyDust(1), 100000); + exoticModuleMagmatterItemMap.put(ELEMENT.STANDALONE.RHUGNOR.getTinyDust(1), 100000); + exoticModuleMagmatterItemMap.put(ELEMENT.STANDALONE.CHRONOMATIC_GLASS.getTinyDust(1), 100000); + exoticModuleMagmatterItemMap.put(ELEMENT.STANDALONE.DRAGON_METAL.getTinyDust(1), 100000); + } + + // For NEI + for (FluidStack fluid : exoticModulePlasmaFluidMap.keySet()) { + fluid.amount = getRandomIntInRange(1, 64); + quarkGluonFluidItemsForNEI.add(GT_Utility.getFluidDisplayStack(fluid, true)); + } + for (ItemStack item : exoticModulePlasmaItemMap.keySet()) { + item.stackSize = getRandomIntInRange(1, 64); + quarkGluonItemsForNEI.add(item); + } + for (int i = 0; i < 21; i++) { + magmatterTimeFluidItemsForNEI.add( + GT_Utility.getFluidDisplayStack(MaterialsUEVplus.Time.getMolten(getRandomIntInRange(1, 50)), true)); + magmatterSpaceFluidItemsForNEI.add( + GT_Utility.getFluidDisplayStack( + MaterialsUEVplus.Space.getMolten(getRandomIntInRange(51, 100)), + true)); } + magmatterItemsForNEI.addAll(exoticModuleMagmatterItemMap.keySet()); } } diff --git a/src/main/java/com/github/technus/tectech/loader/thing/MachineLoader.java b/src/main/java/com/github/technus/tectech/loader/thing/MachineLoader.java index ee4f8dbfd..b40de4fe3 100644 --- a/src/main/java/com/github/technus/tectech/loader/thing/MachineLoader.java +++ b/src/main/java/com/github/technus/tectech/loader/thing/MachineLoader.java @@ -2041,19 +2041,25 @@ public void run() { new GT_MetaTileEntity_EM_ForgeOfGods(15411, "multimachine.em.forge_of_gods", "Forge of the Gods") .getStackForm(1L)); Machine_Multi_SmeltingModule.set( - new GT_MetaTileEntity_EM_SmeltingModule(15412, "multimachine.em.smelting_module", "Smelting Module") - .getStackForm(1L)); + new GT_MetaTileEntity_EM_SmeltingModule( + 15412, + "multimachine.em.smelting_module", + "Helioflare Power Forge").getStackForm(1L)); Machine_Multi_MoltenModule.set( - new GT_MetaTileEntity_EM_MoltenModule(15413, "multimachine.em.molten_module", "Molten Module") - .getStackForm(1L)); + new GT_MetaTileEntity_EM_MoltenModule( + 15413, + "multimachine.em.molten_module", + "Helioflux Melting Core").getStackForm(1L)); Machine_Multi_PlasmaModule.set( - new GT_MetaTileEntity_EM_PlasmaModule(15414, "multimachine.em.plasma_module", "Plasma Module") - .getStackForm(1L)); + new GT_MetaTileEntity_EM_PlasmaModule( + 15414, + "multimachine.em.plasma_module", + "Heliothermal Plasma Fabricator").getStackForm(1L)); Machine_Multi_QuarkGluonPlasmaModule.set( new GT_MetaTileEntity_EM_ExoticModule( 15415, "multimachine.em.exotic_module", - "Exotic Matter Module").getStackForm(1L)); + "Heliofusion Exoticizer").getStackForm(1L)); } // =================================================================================================== diff --git a/src/main/java/com/github/technus/tectech/recipe/GodforgeExoticFrontend.java b/src/main/java/com/github/technus/tectech/recipe/GodforgeExoticFrontend.java index 1f19fc00c..50f0738fa 100644 --- a/src/main/java/com/github/technus/tectech/recipe/GodforgeExoticFrontend.java +++ b/src/main/java/com/github/technus/tectech/recipe/GodforgeExoticFrontend.java @@ -1,5 +1,10 @@ package com.github.technus.tectech.recipe; +import static com.github.technus.tectech.loader.recipe.Godforge.magmatterItemsForNEI; +import static com.github.technus.tectech.loader.recipe.Godforge.magmatterSpaceFluidItemsForNEI; +import static com.github.technus.tectech.loader.recipe.Godforge.magmatterTimeFluidItemsForNEI; +import static com.github.technus.tectech.loader.recipe.Godforge.quarkGluonFluidItemsForNEI; +import static com.github.technus.tectech.loader.recipe.Godforge.quarkGluonItemsForNEI; import static gregtech.api.util.GT_Utility.trans; import java.util.Collections; @@ -7,13 +12,19 @@ import javax.annotation.ParametersAreNonnullByDefault; +import com.github.technus.tectech.thing.gui.TecTechUITextures; import com.gtnewhorizons.modularui.api.math.Pos2d; +import com.gtnewhorizons.modularui.api.screen.ModularWindow; +import com.gtnewhorizons.modularui.common.widget.DrawableWidget; +import codechicken.nei.PositionedStack; +import gregtech.api.enums.MaterialsUEVplus; import gregtech.api.recipe.BasicUIPropertiesBuilder; import gregtech.api.recipe.NEIRecipePropertiesBuilder; import gregtech.api.recipe.RecipeMapFrontend; import gregtech.api.util.GT_Utility; import gregtech.api.util.MethodsReturnNonnullByDefault; +import gregtech.nei.GT_NEI_DefaultHandler; import gregtech.nei.RecipeDisplayInfo; @ParametersAreNonnullByDefault @@ -25,6 +36,25 @@ public GodforgeExoticFrontend(BasicUIPropertiesBuilder uiPropertiesBuilder, super(uiPropertiesBuilder, neiPropertiesBuilder); } + @Override + public void addGregTechLogo(ModularWindow.Builder builder, Pos2d windowOffset) { + builder.widget( + new DrawableWidget().setDrawable(TecTechUITextures.PICTURE_GODFORGE_LOGO).setSize(18, 18) + .setPos(new Pos2d(151, 63).add(windowOffset))); + } + + @Override + public void drawNEIOverlays(GT_NEI_DefaultHandler.CachedDefaultRecipe neiCachedRecipe) { + if (neiCachedRecipe.mRecipe.mFluidOutputs[0].equals(MaterialsUEVplus.QuarkGluonPlasma.getFluid(1000))) { + neiCachedRecipe.mInputs.set(0, new PositionedStack(quarkGluonItemsForNEI, 48, 23, true)); + neiCachedRecipe.mInputs.set(1, new PositionedStack(quarkGluonFluidItemsForNEI, 48, 52, true)); + } else { + neiCachedRecipe.mInputs.set(0, new PositionedStack(magmatterItemsForNEI, 48, 23, true)); + neiCachedRecipe.mInputs.set(1, new PositionedStack(magmatterSpaceFluidItemsForNEI, 30, 52, true)); + neiCachedRecipe.mInputs.set(2, new PositionedStack(magmatterTimeFluidItemsForNEI, 48, 52, true)); + } + } + @Override public List getItemInputPositions(int itemInputCount) { return Collections.singletonList(new Pos2d(52, 33)); diff --git a/src/main/java/com/github/technus/tectech/recipe/GodforgePlasmaFrontend.java b/src/main/java/com/github/technus/tectech/recipe/GodforgePlasmaFrontend.java index bf8fcc5e8..e96bd19bc 100644 --- a/src/main/java/com/github/technus/tectech/recipe/GodforgePlasmaFrontend.java +++ b/src/main/java/com/github/technus/tectech/recipe/GodforgePlasmaFrontend.java @@ -8,7 +8,10 @@ import javax.annotation.ParametersAreNonnullByDefault; +import com.github.technus.tectech.thing.gui.TecTechUITextures; import com.gtnewhorizons.modularui.api.math.Pos2d; +import com.gtnewhorizons.modularui.api.screen.ModularWindow; +import com.gtnewhorizons.modularui.common.widget.DrawableWidget; import gregtech.api.recipe.BasicUIPropertiesBuilder; import gregtech.api.recipe.NEIRecipePropertiesBuilder; @@ -26,6 +29,13 @@ public GodforgePlasmaFrontend(BasicUIPropertiesBuilder uiPropertiesBuilder, super(uiPropertiesBuilder, neiPropertiesBuilder); } + @Override + public void addGregTechLogo(ModularWindow.Builder builder, Pos2d windowOffset) { + builder.widget( + new DrawableWidget().setDrawable(TecTechUITextures.PICTURE_GODFORGE_LOGO).setSize(18, 18) + .setPos(new Pos2d(151, 63).add(windowOffset))); + } + @Override public List getItemInputPositions(int itemInputCount) { return Collections.singletonList(new Pos2d(52, 33)); diff --git a/src/main/java/com/github/technus/tectech/recipe/TT_recipeAdder.java b/src/main/java/com/github/technus/tectech/recipe/TT_recipeAdder.java index a12a64579..59881af67 100644 --- a/src/main/java/com/github/technus/tectech/recipe/TT_recipeAdder.java +++ b/src/main/java/com/github/technus/tectech/recipe/TT_recipeAdder.java @@ -266,51 +266,19 @@ public static boolean addFOGPlasmaRecipe(FluidStack[] fluidInputs, FluidStack[] return true; } - public static boolean addFOGExoticFakeRecipe(Object[] itemInputs, Object[] fluidInputs, FluidStack[] fluidOutputs, - int machineDuration, int machineEUt, int recipeTier) { - - if (itemInputs == null) { - itemInputs = nullItem; - } - - if (fluidInputs == null) { - fluidInputs = nullFluid; - } - - ItemStack[] inputItems = new ItemStack[itemInputs.length]; - ItemStack[][] itemAlts = new ItemStack[itemInputs.length][]; - for (int i = 0; i < itemInputs.length; i++) { - Object obj = itemInputs[i]; - if (obj instanceof ItemStack) { - inputItems[i] = (ItemStack) obj; - itemAlts[i] = null; - } else if (obj instanceof ItemStack[]stacks) { - if (stacks.length > 0) { - inputItems[i] = stacks[0]; - itemAlts[i] = Arrays.copyOf(stacks, stacks.length); - } - } - } - - FluidStack[] inputFluids = new FluidStack[fluidInputs.length]; - for (int i = 0; i < fluidInputs.length; i++) { - Object obj = fluidInputs[i]; - if (obj instanceof FluidStack[]stacks) { - inputFluids[i] = stacks[0]; - } - } + public static boolean addFOGExoticFakeRecipe(ItemStack[] itemInputs, FluidStack[] fluidInputs, + FluidStack[] fluidOutputs, int machineDuration, int machineEUt, int recipeTier) { TecTechRecipeMaps.godforgeExoticMatterRecipes.addFakeRecipe( false, - inputItems, + itemInputs, null, null, - inputFluids, + fluidInputs, fluidOutputs, machineDuration, machineEUt, recipeTier, - itemAlts, false); return true; } diff --git a/src/main/java/com/github/technus/tectech/recipe/TecTechRecipeMaps.java b/src/main/java/com/github/technus/tectech/recipe/TecTechRecipeMaps.java index a115f0cc9..858c71549 100644 --- a/src/main/java/com/github/technus/tectech/recipe/TecTechRecipeMaps.java +++ b/src/main/java/com/github/technus/tectech/recipe/TecTechRecipeMaps.java @@ -48,11 +48,11 @@ public static void init() {} .neiHandlerInfo(builder -> builder.setDisplayStack(CustomItemList.Machine_Multi_Research.get(1))).build(); public static final RecipeMap godforgePlasmaRecipes = RecipeMapBuilder.of("gt.recipe.fog_plasma") - .maxIO(1, 1, 1, 1).progressBar(TecTechUITextures.OVERLAY_BUTTON_ARROW_BLUE_UP, ProgressBar.Direction.RIGHT) - .progressBarPos(86, 44).neiTransferRect(86, 44, 20, 20).frontend(GodforgePlasmaFrontend::new).build(); + .maxIO(1, 1, 1, 1).progressBar(TecTechUITextures.PROGRESSBAR_GODFORGE_PLASMA, ProgressBar.Direction.RIGHT) + .progressBarPos(78, 33).neiTransferRect(78, 33, 20, 20).frontend(GodforgePlasmaFrontend::new).build(); public static final RecipeMap godforgeExoticMatterRecipes = RecipeMapBuilder - .of("gt.recipe.fog_exotic").maxIO(1, 1, 1, 1) - .progressBar(TecTechUITextures.OVERLAY_BUTTON_ARROW_BLUE_UP, ProgressBar.Direction.RIGHT) - .progressBarPos(86, 44).neiTransferRect(86, 44, 20, 20).frontend(GodforgeExoticFrontend::new).build(); + .of("gt.recipe.fog_exotic").maxIO(1, 1, 2, 1) + .progressBar(TecTechUITextures.PROGRESSBAR_GODFORGE_PLASMA, ProgressBar.Direction.RIGHT) + .progressBarPos(78, 33).neiTransferRect(78, 33, 20, 20).frontend(GodforgeExoticFrontend::new).build(); } diff --git a/src/main/java/com/github/technus/tectech/thing/gui/TecTechUITextures.java b/src/main/java/com/github/technus/tectech/thing/gui/TecTechUITextures.java index 9c475345b..befb880db 100644 --- a/src/main/java/com/github/technus/tectech/thing/gui/TecTechUITextures.java +++ b/src/main/java/com/github/technus/tectech/thing/gui/TecTechUITextures.java @@ -22,6 +22,8 @@ public class TecTechUITextures { public static final UITexture BACKGROUND_GLOW_PURPLE = UITexture.fullImage(MODID, "gui/background/purple_glow"); public static final UITexture BACKGROUND_GLOW_BLUE = UITexture.fullImage(MODID, "gui/background/blue_glow"); public static final UITexture BACKGROUND_GLOW_GREEN = UITexture.fullImage(MODID, "gui/background/green_glow"); + public static final UITexture BACKGROUND_GLOW_WHITE = UITexture.fullImage(MODID, "gui/background/white_glow"); + public static final UITexture BACKGROUND_SPACE = UITexture.fullImage(MODID, "gui/background/space"); public static final UITexture BUTTON_STANDARD_16x16 = UITexture.fullImage(MODID, "gui/button/standard_16x16"); public static final UITexture BUTTON_STANDARD_LIGHT_16x16 = UITexture @@ -69,6 +71,12 @@ public class TecTechUITextures { .fullImage(MODID, "gui/overlay_button/parametrizer_if"); public static final UITexture OVERLAY_BUTTON_ARROW_BLUE_UP = UITexture .fullImage(MODID, "gui/overlay_button/arrow_blue_up"); + public static final UITexture OVERLAY_BUTTON_BATTERY_ON = UITexture + .fullImage(MODID, "gui/overlay_button/battery_on"); + public static final UITexture OVERLAY_BUTTON_BATTERY_OFF = UITexture + .fullImage(MODID, "gui/overlay_button/battery_off"); + public static final UITexture OVERLAY_BUTTON_FLAG = UITexture.fullImage(MODID, "gui/overlay_button/flag"); + public static final UITexture OVERLAY_CYCLIC_BLUE = UITexture.fullImage(MODID, "gui/overlay_button/cyclic_blue"); public static final UITexture OVERLAY_SLOT_RACK = UITexture.fullImage(MODID, "gui/overlay_slot/rack"); public static final UITexture OVERLAY_SLOT_MESH = UITexture.fullImage(MODID, "gui/overlay_slot/mesh"); @@ -79,10 +87,31 @@ public class TecTechUITextures { .fullImage(MODID, "gui/progressbar/research_station_2"); public static final UITexture PROGRESSBAR_RESEARCH_STATION_3 = UITexture .fullImage(MODID, "gui/progressbar/research_station_3"); + public static final UITexture PROGRESSBAR_GODFORGE_PLASMA = UITexture + .fullImage(MODID, "gui/progressbar/godforge_plasma"); + public static final UITexture PROGRESSBAR_GODFORGE_MILESTONE_BACKGROUND = UITexture + .fullImage(MODID, "gui/progressbar/godforge_progressbar_background"); + public static final UITexture PROGRESSBAR_GODFORGE_MILESTONE_BLUE = UITexture + .fullImage(MODID, "gui/progressbar/godforge_progressbar_blue"); + public static final UITexture PROGRESSBAR_GODFORGE_MILESTONE_RED = UITexture + .fullImage(MODID, "gui/progressbar/godforge_progressbar_red"); + public static final UITexture PROGRESSBAR_GODFORGE_MILESTONE_PURPLE = UITexture + .fullImage(MODID, "gui/progressbar/godforge_progressbar_purple"); + public static final UITexture PROGRESSBAR_GODFORGE_MILESTONE_RAINBOW = UITexture + .fullImage(MODID, "gui/progressbar/godforge_progressbar_rainbow"); + public static final UITexture PROGRESSBAR_GODFORGE_MILESTONE_BLUE_INVERTED = UITexture + .fullImage(MODID, "gui/progressbar/godforge_progressbar_blue_inverted"); + public static final UITexture PROGRESSBAR_GODFORGE_MILESTONE_RED_INVERTED = UITexture + .fullImage(MODID, "gui/progressbar/godforge_progressbar_red_inverted"); + public static final UITexture PROGRESSBAR_GODFORGE_MILESTONE_PURPLE_INVERTED = UITexture + .fullImage(MODID, "gui/progressbar/godforge_progressbar_purple_inverted"); + public static final UITexture PROGRESSBAR_GODFORGE_MILESTONE_RAINBOW_INVERTED = UITexture + .fullImage(MODID, "gui/progressbar/godforge_progressbar_rainbow_inverted"); public static final UITexture PICTURE_TECTECH_LOGO = UITexture.fullImage(MODID, "gui/picture/tectech_logo"); public static final UITexture PICTURE_TECTECH_LOGO_DARK = UITexture .fullImage(MODID, "gui/picture/tectech_logo_dark"); + public static final UITexture PICTURE_GODFORGE_LOGO = UITexture.fullImage(MODID, "gui/picture/gorge_logo"); public static final UITexture PICTURE_RACK_LARGE = UITexture.fullImage(MODID, "gui/picture/rack_large"); public static final UITexture PICTURE_HEAT_SINK = UITexture.fullImage(MODID, "gui/picture/heat_sink"); public static final UITexture PICTURE_UNCERTAINTY_MONITOR = UITexture @@ -123,4 +152,25 @@ public class TecTechUITextures { public static final UITexture PICTURE_UPGRADE_CONNECTOR_SWITCH = UITexture .fullImage(MODID, "gui/picture/connector_switch"); public static final UITexture SLOT_OUTLINE_GREEN = UITexture.fullImage(MODID, "gui/picture/green_selector"); + public static final UITexture PICTURE_GODFORGE_MILESTONE_CHARGE = UITexture + .fullImage(MODID, "gui/picture/milestone_charge"); + public static final UITexture PICTURE_GODFORGE_MILESTONE_CONVERSION = UITexture + .fullImage(MODID, "gui/picture/milestone_conversion"); + public static final UITexture PICTURE_GODFORGE_MILESTONE_CATALYST = UITexture + .fullImage(MODID, "gui/picture/milestone_catalyst"); + public static final UITexture PICTURE_GODFORGE_MILESTONE_COMPOSITION = UITexture + .fullImage(MODID, "gui/picture/milestone_composition"); + public static final UITexture PICTURE_GODFORGE_MILESTONE_CHARGE_GLOW = UITexture + .fullImage(MODID, "gui/picture/milestone_charge_glow"); + public static final UITexture PICTURE_GODFORGE_MILESTONE_CONVERSION_GLOW = UITexture + .fullImage(MODID, "gui/picture/milestone_conversion_glow"); + public static final UITexture PICTURE_GODFORGE_MILESTONE_CATALYST_GLOW = UITexture + .fullImage(MODID, "gui/picture/milestone_catalyst_glow"); + public static final UITexture PICTURE_GODFORGE_MILESTONE_COMPOSITION_GLOW = UITexture + .fullImage(MODID, "gui/picture/milestone_composition_glow"); + public static final UITexture PICTURE_OVERLAY_BLUE = UITexture.fullImage(MODID, "gui/picture/overlay_blue"); + public static final UITexture PICTURE_OVERLAY_ORANGE = UITexture.fullImage(MODID, "gui/picture/overlay_orange"); + public static final UITexture PICTURE_OVERLAY_GREEN = UITexture.fullImage(MODID, "gui/picture/overlay_green"); + public static final UITexture PICTURE_OVERLAY_PURPLE = UITexture.fullImage(MODID, "gui/picture/overlay_purple"); + } diff --git a/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/ForgeOfGodsRingsStructureString.java b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/ForgeOfGodsRingsStructureString.java new file mode 100644 index 000000000..878a8e539 --- /dev/null +++ b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/ForgeOfGodsRingsStructureString.java @@ -0,0 +1,5101 @@ +package com.github.technus.tectech.thing.metaTileEntity.multi; + +public abstract class ForgeOfGodsRingsStructureString { + + public static final String[][] SECOND_RING = { { + + " BBBBBBB ", + " BBCCCCCCCBB ", + " BBCC CCBB ", + " BBEC CEBB ", + " BEEC CEEB ", + " EEC CEE ", + " EC CE ", + " EC CCCCC CE ", + " C C C C ", + " C C C C ", + " C C C C ", + " C C C C ", + " C C C C ", + " C C C C ", + " C C C C ", + " EC CCCCC CE ", + " EC CE ", + " EEC CEE ", + " BEEC CEEB ", + " BBEC CEBB ", + " BBCC CCBB ", + " BBCCCCCCCBB ", + " BBBBBBB " }, + { " BBBBBBB ", + " BBCCCCCCCBB ", + " BBCC D CCBB ", + " BBEC D CEBB ", + " BBBEEC DD CEEBBB ", + " EEEEC D CEEEE ", + " EEEC DD CEEE ", + " EEEC CCCCC CEEE ", + " EEC CHHHHHC CEE ", + " EEC CHHHHHHHC CEE ", + " EEC CHHHHHHHC CEE ", + " EEC CHHHHHHHC CEE ", + " EEC CHHHHHHHC CEE ", + " EEC CHHHHHHHC CEE ", + " EEC CHHHHHC CEE ", + " EEEC CCCCC CEEE ", + " EEEC DD CEEE ", + " EEEEC D CEEEE ", + " BBBEEC DD CEEBBB ", + " BBEC D CEBB ", + " BBCC D CCBB ", + " BBCCCCCCCBB ", + " BBBBBBB " }, + { " BBBBBBB ", + " BBCCCCCCCBB ", + " BBCC CCBB ", + " BBEC CEBB ", + " BBBEEC CEEBBB ", + " BBBBEEEEC CEEEEBBBB ", + " EEEEEEEC CEEEEEEE ", + " EEEEEEEC CCCCC CEEEEEEE ", + " EEEEEEC C C CEEEEEE ", + " EEEEEEC C C CEEEEEE ", + " EEEEEEC C C CEEEEEE ", + " EEEEEEC C C CEEEEEE ", + " EEEEEEC C C CEEEEEE ", + " EEEEEEC C C CEEEEEE ", + " EEEEEEC C C CEEEEEE ", + " EEEEEEEC CCCCC CEEEEEEE ", + " EEEEEEEC CEEEEEEE ", + " BBBBEEEEC CEEEEBBBB ", + " BBBEEC CEEBBB ", + " BBEC CEBB ", + " BBCC CCBB ", + " BBCCCCCCCBB ", + " BBBBBBB " }, + { " ", + " ", + " ", + " ", + " BBB BBB ", + " BBBBEEE EEEBBBB ", + " BBBEEEEEEE EEEEEEEBBB ", + " EEEEEEEEEE EEEEEEEEEE ", + " EEEEEEEEEE EEEEEEEEEE ", + " EEEEEEEKKK KKKEEEEEEE ", + " EEEEEEEKKK KKKEEEEEEE ", + " EEEEEEEKKK KKKEEEEEEE ", + " EEEEEEEKKK KKKEEEEEEE ", + " EEEEEEEKKK KKKEEEEEEE ", + " EEEEEEEEEE EEEEEEEEEE ", + " EEEEEEEEEE EEEEEEEEEE ", + " BBBEEEEEEE EEEEEEEBBB ", + " BBBBEEE EEEBBBB ", + " BBB BBB ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " BBBBBEEEE EEEEBBBBB ", + " EEEEEEEEE EEEEEEEEE ", + " EEEEEEEEE EEEEEEEEE ", + " EEEEEKKKK KKKKEEEEE ", + " EEEEEKKKK KKKKEEEEE ", + " EEEEEKKKK KKKKEEEEE ", + " EEEEEKKKK KKKKEEEEE ", + " EEEEEKKKK KKKKEEEEE ", + " EEEEEEEEE EEEEEEEEE ", + " EEEEEEEEE EEEEEEEEE ", + " BBBBBEEEE EEEEBBBBB ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " BBBBB BBBBB ", + " BBBEEEEE EEEEEBBB ", + " EEEEEEEE EEEEEEEE ", + " EEEEEEEE EEEEEEEE ", + " EEEEEEKK KKEEEEEE ", + " EEEEEEKK KKEEEEEE ", + " EEEEEEKK KKEEEEEE ", + " EEEEEEEE EEEEEEEE ", + " EEEEEEEE EEEEEEEE ", + " BBBEEEEE EEEEEBBB ", + " BBBBB BBBBB ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " BBBBBEEE EEEBBBBB ", + " EEEEEEEE EEEEEEEE ", + " EEEEEEEE EEEEEEEE ", + " EEEEEKKK KKKEEEEE ", + " EEEEEKKK KKKEEEEE ", + " EEEEEKKK KKKEEEEE ", + " EEEEEEEE EEEEEEEE ", + " EEEEEEEE EEEEEEEE ", + " BBBBBEEE EEEBBBBB ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBBBB BBBBBB ", + " EEEEEE EEEEEE ", + " EEEEEE EEEEEE ", + " EEEEEE EEEEEE ", + " EEEEKK KKEEEE ", + " EEEEEE EEEEEE ", + " EEEEEE EEEEEE ", + " EEEEEE EEEEEE ", + " BBBBBB BBBBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " BBEEEE EEEEBB ", + " EEEEEE EEEEEE ", + " EEEEEE EEEEEE ", + " EEEEKK KKEEEE ", + " EEEEEE EEEEEE ", + " EEEEEE EEEEEE ", + " BBEEEE EEEEBB ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BB BB ", + " BBBBEE EEBBBB ", + " EEEEEE EEEEEE ", + " EEEEEE EEEEEE ", + " EEEEKK KKEEEE ", + " EEEEEE EEEEEE ", + " EEEEEE EEEEEE ", + " BBBBEE EEBBBB ", + " BB BB ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBBB BBBBB ", + " EEEEE EEEEE ", + " EEEEE EEEEE ", + " EEEEK KEEEE ", + " EEEEE EEEEE ", + " EEEEE EEEEE ", + " BBBBB BBBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBBB BBBBB ", + " EEEEE EEEEE ", + " EEEEE EEEEE ", + " EEEKK KKEEE ", + " EEEEE EEEEE ", + " EEEEE EEEEE ", + " BBBBB BBBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " BEEEE EEEEB ", + " EEEEE EEEEE ", + " EEEEK KEEEE ", + " EEEEE EEEEE ", + " BEEEE EEEEB ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " BBEEE EEEBB ", + " EEEEE EEEEE ", + " EEEEK KEEEE ", + " EEEEE EEEEE ", + " BBEEE EEEBB ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " B B ", + " BBBBE EBBBB ", + " EEEEE EEEEE ", + " EEEKK KKEEE ", + " EEEEE EEEEE ", + " BBBBE EBBBB ", + " B B ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEK KEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEK KEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEK KEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEK KEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEK KEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEK KEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEK KEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEK KEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEK KEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEK KEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEK KEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEK KEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEK KEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEK KEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEK KEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEK KEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEK KEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEK KEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEK KEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEK KEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEK KEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEK KEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEK KEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEK KEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEK KEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEK KEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEK KEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEK KEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEK KEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEK KEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEK KEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEK KEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEK KEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + "BBB BBB", + "EEE EEE", + "EEK KEE", + "EEE EEE", + "BBB BBB", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + "BBB BBB", + "EEE EEE", + "EEK KEE", + "EEE EEE", + "BBB BBB", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + "BBB BBB", + "EEE EEE", + "EEK KEE", + "EEE EEE", + "BBB BBB", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + "BBB BBB", + "EEE EEE", + "EEK KEE", + "EEE EEE", + "BBB BBB", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + "BBB BBB", + "EEE EEE", + "EEK KEE", + "EEE EEE", + "BBB BBB", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + "BBB BBB", + "EEE EEE", + "EEK KEE", + "EEE EEE", + "BBB BBB", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + "BBB BBB", + "EEE EEE", + "EEK KEE", + "EEE EEE", + "BBB BBB", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + "BBB BBB", + "EEE EEE", + "EEK KEE", + "EEE EEE", + "BBB BBB", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + "BBB BBB", + "EEE EEE", + "EEK KEE", + "EEE EEE", + "BBB BBB", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + "BBB BBB", + "EEE EEE", + "EEK KEE", + "EEE EEE", + "BBB BBB", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + "BBB BBB", + "EEE EEE", + "EEK KEE", + "EEE EEE", + "BBB BBB", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + "BBB BBB", + "EEE EEE", + "EEK KEE", + "EEE EEE", + "BBB BBB", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + "BBB BBB", + "EEE EEE", + "EEK KEE", + "EEE EEE", + "BBB BBB", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + "BBB BBB", + "EEE EEE", + "EEK KEE", + "EEE EEE", + "BBB BBB", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + "BBB BBB", + "EEE EEE", + "EEK KEE", + "EEE EEE", + "BBB BBB", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEK KEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEK KEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEK KEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEK KEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEK KEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEK KEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEK KEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEK KEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEK KEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEK KEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEK KEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEK KEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEK KEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEK KEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEK KEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEK KEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEK KEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEK KEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEK KEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEK KEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEK KEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEK KEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEK KEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEK KEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEK KEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEK KEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEK KEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEK KEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEK KEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEK KEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEK KEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEK KEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEK KEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBBB BBBBB ", + " EEEEE EEEEE ", + " EEEKK KKEEE ", + " EEEEE EEEEE ", + " BBBBB BBBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBBB BBBBB ", + " EEEEE EEEEE ", + " EEEEK KEEEE ", + " EEEEE EEEEE ", + " BBBBB BBBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBBB BBBBB ", + " EEEEE EEEEE ", + " EEEEK KEEEE ", + " EEEEE EEEEE ", + " BBBBB BBBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBBB BBBBB ", + " EEEEE EEEEE ", + " EEEKK KKEEE ", + " EEEEE EEEEE ", + " BBBBB BBBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBBB BBBBB ", + " EEEEE EEEEE ", + " EEEEK KEEEE ", + " EEEEE EEEEE ", + " BBBBB BBBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBBBB BBBBBB ", + " EEEEEE EEEEEE ", + " EEEEKK KKEEEE ", + " EEEEEE EEEEEE ", + " BBBBBB BBBBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBBBB BBBBBB ", + " EEEEEE EEEEEE ", + " EEEEKK KKEEEE ", + " EEEEEE EEEEEE ", + " BBBBBB BBBBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBBBB BBBBBB ", + " EEEEEE EEEEEE ", + " EEEEKK KKEEEE ", + " EEEEEE EEEEEE ", + " BBBBBB BBBBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBBBBBB BBBBBBBB ", + " EEEEEEEE EEEEEEEE ", + " EEEEEKKK KKKEEEEE ", + " EEEEEEEE EEEEEEEE ", + " BBBBBBBB BBBBBBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBBBBBB BBBBBBBB ", + " EEEEEEEE EEEEEEEE ", + " EEEEEEKK KKEEEEEE ", + " EEEEEEEE EEEEEEEE ", + " BBBBBBBB BBBBBBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBBBBBBB BBBBBBBBB ", + " EEEEEEEEE EEEEEEEEE ", + " EEEEEKKKK KKKKEEEEE ", + " EEEEEEEEE EEEEEEEEE ", + " BBBBBBBBB BBBBBBBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBBBBBBBBBB BBBBBBBBBBBB ", + " EEEEEEEEEEEE EEEEEEEEEEEE ", + " EEEEEEEKKKKK KKKKKEEEEEEE ", + " EEEEEEEEEEEE EEEEEEEEEEEE ", + " BBBBBBBBBBBB BBBBBBBBBBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB ", + " EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE ", + " EEEEEEEEEKKKKKKKKKKKKKKKEEEEEEEEE ", + " EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE ", + " BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBBBBBBBBBBBBBBBBBBBBBBB ", + " EEEEEEEEEEEEEEEEEEEEEEEEE ", + " EEEEEEEEEEEEEEEEEEEEEEEEE ", + " EEEEEEEEEEEEEEEEEEEEEEEEE ", + " BBBBBBBBBBBBBBBBBBBBBBBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBBBBBBBBBBBBB ", + " EEEEEEEEEEEEEEE ", + " EEEEEEEEEEEEEEE ", + " EEEEEEEEEEEEEEE ", + " BBBBBBBBBBBBBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " } }; + + public static final String[][] THIRD_RING = { + { " BBBBBBB ", + " BBCCCCCCCBB ", + " BBCC CCBB ", + " BBCC CCBB ", + " BBBEC CEBBB ", + " EEEC CEEE ", + " EEC CEE ", + " EEC CCCCC CEE ", + " EC CC CC CE ", + " EC C C CE ", + " C C C C ", + " C C C C ", + " C C C C ", + " C C C C ", + " C C C C ", + " C C C C ", + " C C C C ", + " EC C C CE ", + " EC CC CC CE ", + " EEC CCCCC CEE ", + " EEC CEE ", + " EEEC CEEE ", + " BBBEC CEBBB ", + " BBCC CCBB ", + " BBCC CCBB ", + " BBCCCCCCCBB ", + " BBBBBBB " }, + { " BBBBBBB ", + " BBCCCCCCCBB ", + " BBCC CCBB ", + " BBCCD CCBB ", + " BBBEC DD CEBBB ", + " BBBEEEC D CEEEBBB ", + " EEEEEC DD CEEEEE ", + " EEEEEC DCCCCC CEEEEE ", + " EEEEC CCHHHHHCC CEEEE ", + " EEEEC CHHHHHHHHHC CEEEE ", + " EEEC CHHHHHHHHHC CEEE ", + " EEEC CHHHHHHHHHHHC CEEE ", + " EEEC CHHHHHHHHHHHC CEEE ", + " EEEC CHHHHHHHHHHHC CEEE ", + " EEEC CHHHHHHHHHHHC CEEE ", + " EEEC CHHHHHHHHHHHC CEEE ", + " EEEC CHHHHHHHHHC CEEE ", + " EEEEC CHHHHHHHHHC CEEEE ", + " EEEEC CCHHHHHCC CEEEE ", + " EEEEEC CCCCCD CEEEEE ", + " EEEEEC DD CEEEEE ", + " BBBEEEC D CEEEBBB ", + " BBBEC DD CEBBB ", + " BBCC DCCBB ", + " BBCC CCBB ", + " BBCCCCCCCBB ", + " BBBBBBB " }, + { " BBBBBBB ", + " BBCCCCCCCBB ", + " BBCC CCBB ", + " BBCC CCBB ", + " BBBEC CEBBB ", + " BBBBEEEC CEEEBBBB ", + " BEEEEEEC CEEEEEEB ", + " EEEEEEEC CCCCC CEEEEEEE ", + " EEEEEEC CC CC CEEEEEE ", + " EEEEEEC C C CEEEEEE ", + " EEEEEC C C CEEEEE ", + " EEEEEC C C CEEEEE ", + " EEEEEC C C CEEEEE ", + " EEEEEC C C CEEEEE ", + " EEEEEC C C CEEEEE ", + " EEEEEC C C CEEEEE ", + " EEEEEC C C CEEEEE ", + " EEEEEEC C C CEEEEEE ", + " EEEEEEC CC CC CEEEEEE ", + " EEEEEEEC CCCCC CEEEEEEE ", + " BEEEEEEC CEEEEEEB ", + " BBBBEEEC CEEEBBBB ", + " BBBEC CEBBB ", + " BBCC CCBB ", + " BBCC CCBB ", + " BBCCCCCCCBB ", + " BBBBBBB " }, + { " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " BBBBEEEE EEEEBBBB ", + " EEEEEEEE EEEEEEEE ", + " EEEEEEEE EEEEEEEE ", + " EEEEEEEE EEEEEEEE ", + " EEEEEEII IIEEEEEE ", + " EEEEEEII IIEEEEEE ", + " EEEEEEII IIEEEEEE ", + " EEEEEEII IIEEEEEE ", + " EEEEEEII IIEEEEEE ", + " EEEEEEII IIEEEEEE ", + " EEEEEEII IIEEEEEE ", + " EEEEEEEE EEEEEEEE ", + " EEEEEEEE EEEEEEEE ", + " EEEEEEEE EEEEEEEE ", + " BBBBEEEE EEEEBBBB ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " BB BB ", + " BBBBBEE EEBBBBB ", + " BEEEEEEE EEEEEEEB ", + " EEEEEEEE EEEEEEEE ", + " EEEEEEEE EEEEEEEE ", + " EEEEEIII IIIEEEEE ", + " EEEEEIII IIIEEEEE ", + " EEEEEIII IIIEEEEE ", + " EEEEEIII IIIEEEEE ", + " EEEEEIII IIIEEEEE ", + " EEEEEIII IIIEEEEE ", + " EEEEEIII IIIEEEEE ", + " EEEEEEEE EEEEEEEE ", + " EEEEEEEE EEEEEEEE ", + " BEEEEEEE EEEEEEEB ", + " BBBBBEE EEBBBBB ", + " BB BB ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " BBEEEE EEEEBB ", + " EEEEEE EEEEEE ", + " EEEEEE EEEEEE ", + " EEEEII IIEEEE ", + " EEEEII IIEEEE ", + " EEEEII IIEEEE ", + " EEEEII IIEEEE ", + " EEEEII IIEEEE ", + " EEEEII IIEEEE ", + " EEEEII IIEEEE ", + " EEEEEE EEEEEE ", + " EEEEEE EEEEEE ", + " BBEEEE EEEEBB ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " B B ", + " BBBBBE EBBBBB ", + " EEEEEE EEEEEE ", + " EEEEEE EEEEEE ", + " EEEEEE EEEEEE ", + " EEEEII IIEEEE ", + " EEEEII IIEEEE ", + " EEEEII IIEEEE ", + " EEEEII IIEEEE ", + " EEEEII IIEEEE ", + " EEEEEE EEEEEE ", + " EEEEEE EEEEEE ", + " EEEEEE EEEEEE ", + " BBBBBE EBBBBB ", + " B B ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBBBB BBBBBB ", + " EEEEEE EEEEEE ", + " EEEEEE EEEEEE ", + " EEEEEE EEEEEE ", + " EEEEII IIEEEE ", + " EEEEII IIEEEE ", + " EEEEII IIEEEE ", + " EEEEII IIEEEE ", + " EEEEII IIEEEE ", + " EEEEEE EEEEEE ", + " EEEEEE EEEEEE ", + " EEEEEE EEEEEE ", + " BBBBBB BBBBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBBB BBBBB ", + " EEEEE EEEEE ", + " EEEEE EEEEE ", + " EEEEE EEEEE ", + " EEEEI IEEEE ", + " EEEEI IEEEE ", + " EEEEI IEEEE ", + " EEEEI IEEEE ", + " EEEEI IEEEE ", + " EEEEE EEEEE ", + " EEEEE EEEEE ", + " EEEEE EEEEE ", + " BBBBB BBBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " BBEEE EEEBB ", + " EEEEE EEEEE ", + " EEEEE EEEEE ", + " EEEII IIEEE ", + " EEEII IIEEE ", + " EEEII IIEEE ", + " EEEII IIEEE ", + " EEEII IIEEE ", + " EEEEE EEEEE ", + " EEEEE EEEEE ", + " BBEEE EEEBB ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEE EEEE ", + " EEEE EEEE ", + " EEEI IEEE ", + " EEEI IEEE ", + " EEEI IEEE ", + " EEEE EEEE ", + " EEEE EEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBBB BBBBB ", + " EEEEE EEEEE ", + " EEEEE EEEEE ", + " EEEEE EEEEE ", + " EEEEI IEEEE ", + " EEEEI IEEEE ", + " EEEEI IEEEE ", + " EEEEE EEEEE ", + " EEEEE EEEEE ", + " EEEEE EEEEE ", + " BBBBB BBBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBBB BBBBB ", + " EEEEE EEEEE ", + " EEEEE EEEEE ", + " EEEEE EEEEE ", + " EEEEI IEEEE ", + " EEEEI IEEEE ", + " EEEEI IEEEE ", + " EEEEE EEEEE ", + " EEEEE EEEEE ", + " EEEEE EEEEE ", + " BBBBB BBBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBBB BBBBB ", + " EEEEE EEEEE ", + " EEEEE EEEEE ", + " EEEEE EEEEE ", + " EEEEI IEEEE ", + " EEEEI IEEEE ", + " EEEEI IEEEE ", + " EEEEE EEEEE ", + " EEEEE EEEEE ", + " EEEEE EEEEE ", + " BBBBB BBBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBBB BBBBB ", + " EEEEE EEEEE ", + " EEEEE EEEEE ", + " EEEEE EEEEE ", + " EEEEI IEEEE ", + " EEEEI IEEEE ", + " EEEEI IEEEE ", + " EEEEE EEEEE ", + " EEEEE EEEEE ", + " EEEEE EEEEE ", + " BBBBB BBBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " BEEE EEEB ", + " EEEE EEEE ", + " EEEE EEEE ", + " EEEI IEEE ", + " EEEI IEEE ", + " EEEI IEEE ", + " EEEE EEEE ", + " EEEE EEEE ", + " BEEE EEEB ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " B B ", + " BBBE EBBB ", + " EEEE EEEE ", + " EEEE EEEE ", + " EEEI IEEE ", + " EEEI IEEE ", + " EEEI IEEE ", + " EEEE EEEE ", + " EEEE EEEE ", + " BBBE EBBB ", + " B B ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEE EEEE ", + " EEEI EEEE ", + " EEEI IEEE ", + " EEEI EEEE ", + " EEEE EEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEE EEEE ", + " EEEE EEEE ", + " EEEI IEEE ", + " EEEE EEEE ", + " EEEE EEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEE EEEE ", + " EEEE EEEE ", + " EEEI IEEE ", + " EEEE EEEE ", + " EEEE EEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEE EEE ", + " EEE EEE ", + " EEI IEE ", + " EEE EEE ", + " EEE EEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEE EEEE ", + " EEEE EEEE ", + " EEEI IEEE ", + " EEEE EEEE ", + " EEEE EEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEE EEE ", + " EEI IEE ", + " EEE EEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEE EEE ", + " EEI IEE ", + " EEE EEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEE EEEE ", + " EEEI IEEE ", + " EEEE EEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEE EEE ", + " EEI IEE ", + " EEE EEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEE EEEE ", + " EEEI IEEE ", + " EEEE EEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEE EEE ", + " EEI IEE ", + " EEE EEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEE EEE ", + " EEI IEE ", + " EEE EEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEE EEE ", + " EEI IEE ", + " EEE EEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEE EEE ", + " EEI IEE ", + " EEE EEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEI IEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEI IEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEI IEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEI IEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEI IEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEI IEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEI IEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEI IEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEI IEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + "BBB BBB", + "EEE EEE", + "EEI IEE", + "EEE EEE", + "BBB BBB", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + "BBB BBB", + "EEE EEE", + "EEI IEE", + "EEE EEE", + "BBB BBB", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + "BBB BBB", + "EEE EEE", + "EEI IEE", + "EEE EEE", + "BBB BBB", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + "BBB BBB", + "EEE EEE", + "EEI IEE", + "EEE EEE", + "BBB BBB", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + "BBB BBB", + "EEE EEE", + "EEI IEE", + "EEE EEE", + "BBB BBB", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + "BBB BBB", + "EEE EEE", + "EEI IEE", + "EEE EEE", + "BBB BBB", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + "BBB BBB", + "EEE EEE", + "EEI IEE", + "EEE EEE", + "BBB BBB", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + "BBB BBB", + "EEE EEE", + "EEI IEE", + "EEE EEE", + "BBB BBB", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + "BBB BBB", + "EEE EEE", + "EEI IEE", + "EEE EEE", + "BBB BBB", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + "BBB BBB", + "EEE EEE", + "EEI IEE", + "EEE EEE", + "BBB BBB", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + "BBB BBB", + "EEE EEE", + "EEI IEE", + "EEE EEE", + "BBB BBB", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + "BBB BBB", + "EEE EEE", + "EEI IEE", + "EEE EEE", + "BBB BBB", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + "BBB BBB", + "EEE EEE", + "EEI IEE", + "EEE EEE", + "BBB BBB", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEI IEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEI IEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEI IEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEI IEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEI IEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEI IEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEI IEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEI IEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEI IEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEI IEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEI IEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEI IEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEI IEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEI IEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEI IEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEI IEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEI IEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEI IEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEI IEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEI IEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEI IEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEI IEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEI IEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEI IEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEI IEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBBB BBBBB ", + " EEEEE EEEEE ", + " EEEEI IEEEE ", + " EEEEE EEEEE ", + " BBBBB BBBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBBB BBBBB ", + " EEEEE EEEEE ", + " EEEEI IEEEE ", + " EEEEE EEEEE ", + " BBBBB BBBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBBB BBBBB ", + " EEEEE EEEEE ", + " EEEEI IEEEE ", + " EEEEE EEEEE ", + " BBBBB BBBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBBB BBBBB ", + " EEEEE EEEEE ", + " EEEEI IEEEE ", + " EEEEE EEEEE ", + " BBBBB BBBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEI IEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBBB BBBBB ", + " EEEEE EEEEE ", + " EEEII IIEEE ", + " EEEEE EEEEE ", + " BBBBB BBBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBBB BBBBB ", + " EEEEE EEEEE ", + " EEEEI IEEEE ", + " EEEEE EEEEE ", + " BBBBB BBBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBBBB BBBBBB ", + " EEEEEE EEEEEE ", + " EEEEII IIEEEE ", + " EEEEEE EEEEEE ", + " BBBBBB BBBBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBBBB BBBBBB ", + " EEEEEE EEEEEE ", + " EEEEII IIEEEE ", + " EEEEEE EEEEEE ", + " BBBBBB BBBBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBBBB BBBBBB ", + " EEEEEE EEEEEE ", + " EEEEII IIEEEE ", + " EEEEEE EEEEEE ", + " BBBBBB BBBBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBBBBBB BBBBBBBB ", + " EEEEEEEE EEEEEEEE ", + " EEEEEIII IIIEEEEE ", + " EEEEEEEE EEEEEEEE ", + " BBBBBBBB BBBBBBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBBBBBBB BBBBBBBBB ", + " EEEEEEEEE EEEEEEEEE ", + " EEEEEEIII IIIEEEEEE ", + " EEEEEEEEE EEEEEEEEE ", + " BBBBBBBBB BBBBBBBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBBBBBBBBB BBBBBBBBBBB ", + " EEEEEEEEEEE EEEEEEEEEEE ", + " EEEEEEIIIII IIIIIEEEEEE ", + " EEEEEEEEEEE EEEEEEEEEEE ", + " BBBBBBBBBBB BBBBBBBBBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB ", + " EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE ", + " EEEEEEEEEIIIIIIIIIIIIIEEEEEEEEE ", + " EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE ", + " BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBBBBBBBBBBBBBBBBBBBBB ", + " EEEEEEEEEEEEEEEEEEEEEEE ", + " EEEEEEEEEEEEEEEEEEEEEEE ", + " EEEEEEEEEEEEEEEEEEEEEEE ", + " BBBBBBBBBBBBBBBBBBBBBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBBBBBBBBBBB ", + " EEEEEEEEEEEEE ", + " EEEEEEEEEEEEE ", + " EEEEEEEEEEEEE ", + " BBBBBBBBBBBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " } }; + +} diff --git a/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/ForgeOfGodsStructureString.java b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/ForgeOfGodsStructureString.java new file mode 100644 index 000000000..0f9a15c60 --- /dev/null +++ b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/ForgeOfGodsStructureString.java @@ -0,0 +1,5429 @@ +package com.github.technus.tectech.thing.metaTileEntity.multi; + +public abstract class ForgeOfGodsStructureString { + + public static final String[][] MAIN_STRUCTURE = { { + " ", + " ", + " ", + " ", + " ", + " ", + " BB BB ", + " BB BB ", + " B DDD DDD B ", + " DDFD DFDD ", + " DDADD DDADD ", + " DFDD DDFD ", + " DDD DDD ", + " ", + " ", + " ", + " DDD DDD ", + " DFDD DDFD ", + " DDADD DDADD ", + " DDFD DFDD ", + " B DDD DDD B ", + " BB BB ", + " BB BB ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " BB BB ", + " BEEBBBBB BBBBBEEB ", + " BEEEECCCCBCCCCEEEEB ", + " BEEECEE CFC EECEEEB ", + " BECEEE CFC EEECEB ", + " BCEE CFC EECB ", + " BCEE CCCFC EECB ", + " BC CFFCCFC CB ", + " BCCCCFCCFCFCCCCCB ", + " BFFFCCF~FCCFFFB ", + " BCCCCCFCFCCFCCCCB ", + " BC CFCCFFC CB ", + " BCEE CFCCC EECB ", + " BCEE CFC EECB ", + " BECEEE CFC EEECEB ", + " BEEECEE CFC EECEEEB ", + " BEEEECCCCBCCCCEEEEB ", + " BEEBBBBB BBBBBEEB ", + " BB BB ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " BB BB ", + " BBEEBBB BBBEEBB ", + " BEEEEEEB BEEEEEEB ", + " BEEDDDDDBBBBBDDDDDEEB ", + " BEEDEE EEDEEB ", + " BEDE EDEB ", + " BED DEB ", + " BED DEB ", + " BB BB ", + " B B ", + " B B ", + " B B ", + " BB BB ", + " BED DEB ", + " BED DEB ", + " BEDE EDEB ", + " BEEDEE EEDEEB ", + " BEEDDDDDBBBBBDDDDDEEB ", + " BEEEEEEB BEEEEEEB ", + " BBEEBBB BBBEEBB ", + " BB BB ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " BBBB BBBB ", + " BEEEEB BEEEEB ", + " BEEDDBBB BBBDDEEB ", + " BED DEB ", + " BED DEB ", + " BB BB ", + " B B ", + " B B ", + " ", + " ", + " ", + " ", + " ", + " B B ", + " B B ", + " BB BB ", + " BED DEB ", + " BED DEB ", + " BEEDDBBB BBBDDEEB ", + " BEEEEB BEEEEB ", + " BBBB BBBB ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " BB BB ", + " BEEBB BBEEB ", + " BBB BEB ", + " B B ", + " B B ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " B B ", + " B B ", + " BEB BEB ", + " BEBBB BBEEB ", + " BB BB ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " BB BB ", + " B B ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " B B ", + " BB BB ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " B B ", + " B B ", + " B B ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB ", + " " }, + { " ", + " BEEEB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " B B ", + " E E ", + " E E ", + " E E ", + " B B ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BEEEB ", + " " }, + { " ", + " BEEEEEB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " B B ", + " E E ", + " E E ", + " E E ", + " E E ", + " E E ", + " B B ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BEEEEEB ", + " " }, + { " J ", + " BEEEEEB ", + " EEE EEE ", + " E E ", + " EE EE ", + " E E ", + " E E ", + " E E ", + " E E ", + " E E ", + " E E ", + " B B ", + " E E ", + " E E ", + " JE EJ ", + " E E ", + " E E ", + " B B ", + " E E ", + " E E ", + " E E ", + " E E ", + " E E ", + " E E ", + " EE EE ", + " E E ", + " EEE EEE ", + " BEEEEEB ", + " J " }, + { " ", + " BEEEEEB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " B B ", + " E E ", + " E E ", + " E E ", + " E E ", + " E E ", + " B B ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BEEEEEB ", + " " }, + { " ", + " BEEEB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " B B ", + " E E ", + " E E ", + " E E ", + " B B ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BEEEB ", + " " }, + { " ", + " BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " B B ", + " B B ", + " B B ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " B B ", + " B B ", + " B B ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB ", + " " }, + { " ", + " BEEEB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " B B ", + " E E ", + " E E ", + " E E ", + " B B ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BEEEB ", + " " }, + { " ", + " BEEEEEB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " B B ", + " E E ", + " E E ", + " E E ", + " E E ", + " E E ", + " B B ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BEEEEEB ", + " " }, + { " J ", + " BEEEEEB ", + " EEE EEE ", + " E E ", + " EE EE ", + " E E ", + " E E ", + " E E ", + " E E ", + " E E ", + " E E ", + " B B ", + " E E ", + " E E ", + " JE EJ ", + " E E ", + " E E ", + " B B ", + " E E ", + " E E ", + " E E ", + " E E ", + " E E ", + " E E ", + " EE EE ", + " E E ", + " EEE EEE ", + " BEEEEEB ", + " J " }, + { " ", + " BEEEEEB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " B B ", + " E E ", + " E E ", + " E E ", + " E E ", + " E E ", + " B B ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BEEEEEB ", + " " }, + { " ", + " BEEEB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " B B ", + " E E ", + " E E ", + " E E ", + " B B ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BEEEB ", + " " }, + { " ", + " BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " B B ", + " B B ", + " B B ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " B B ", + " B B ", + " B B ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB ", + " " }, + { " ", + " BEEEB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " B B ", + " E E ", + " E E ", + " E E ", + " B B ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BEEEB ", + " " }, + { " ", + " BEEEEEB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " B B ", + " E E ", + " E E ", + " E E ", + " E E ", + " E E ", + " B B ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BEEEEEB ", + " " }, + { " J ", + " BEEEEEB ", + " EEEE EEE ", + " E E ", + " EE EE ", + " E E ", + " E E ", + " E E ", + " E E ", + " E E ", + " E E ", + " B B ", + " E E ", + " E E ", + " JE EJ ", + " E E ", + " E E ", + " B B ", + " E E ", + " E E ", + " E E ", + " E E ", + " E E ", + " E E ", + " EE EE ", + " E E ", + " EEE EEE ", + " BEEEEEB ", + " J " }, + { " ", + " BEEEEEB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " B B ", + " E E ", + " E E ", + " E E ", + " E E ", + " E E ", + " B B ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BEEEEEB ", + " " }, + { " ", + " BEEEB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " B B ", + " E E ", + " E E ", + " E E ", + " B B ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BEEEB ", + " " }, + { " ", + " BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " B B ", + " B B ", + " B B ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " B B ", + " B B ", + " B B ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB ", + " " }, + { " ", + " BEEEB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " B B ", + " E E ", + " E E ", + " E E ", + " B B ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BEEEB ", + " " }, + { " ", + " BEEEEEB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " B B ", + " E E ", + " E E ", + " E E ", + " E E ", + " E E ", + " B B ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BEEEEEB ", + " " }, + { " J ", + " BEEEEEB ", + " EEE EEE ", + " E E ", + " EE EE ", + " E E ", + " E E ", + " E E ", + " E E ", + " E E ", + " E E ", + " B B ", + " E E ", + " E E ", + " JE EJ ", + " E E ", + " E E ", + " B B ", + " E E ", + " E E ", + " E E ", + " E E ", + " E E ", + " E E ", + " EE EE ", + " E E ", + " EEE EEE ", + " BEEEEEB ", + " J " }, + { " ", + " BEEEEEB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " B B ", + " E E ", + " E E ", + " E E ", + " E E ", + " E E ", + " B B ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BEEEEEB ", + " " }, + { " ", + " BEEEB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " B B ", + " E E ", + " E E ", + " E E ", + " B B ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BEEEB ", + " " }, + { " ", + " BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " B B ", + " B B ", + " B B ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " BBBBB ", + " BBCCCCCBB ", + " BBCC CCBB ", + " BBCC CCBB ", + " EEC CEE ", + " EC CE ", + " EC CE ", + " C CCC C ", + " C C C C ", + " C C C C ", + " C C C C ", + " C CCC C ", + " EC CE ", + " EC CE ", + " EEC CEE ", + " BBCC CCBB ", + " BBCC CCBB ", + " BBCCCCCBB ", + " BBBBB ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " BBBBB ", + " BBCCCCCBB ", + " BBCC CCBB ", + " BBCC CCBB ", + " BBBEEC CEEBBB ", + " BBEEEEC DDCEEEEBB ", + " EEEEEEC DDD CEEEEEE ", + " EEEEEC CCCDD CEEEEE ", + " EEEEEC CHHHC CEEEEE ", + " EEEEEC CHHHC CEEEEE ", + " EEEEEC CHHHC CEEEEE ", + " EEEEEC DDCCC CEEEEE ", + " EEEEEEC DDD CEEEEEE ", + " BBEEEECDD CEEEEBB ", + " BBBEEC CEEBBB ", + " BBCC CCBB ", + " BBCC CCBB ", + " BBCCCCCBB ", + " BBBBB ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " BBBBB ", + " BBCCCCCBB ", + " BBCC CCBB ", + " BBCC CCBB ", + " BBBEEC CEEBBB ", + " BBBBEEEEC CEEEEBBBB ", + " BBEEEEEEEEC CEEEEEEEEBB ", + " EEEEEEEEEC CCC CEEEEEEEEE ", + " EEEEEEEEEC C C CEEEEEEEEE ", + " EEEEEEEEEC C C CEEEEEEEEE ", + " EEEEEEEEEC C C CEEEEEEEEE ", + " EEEEEEEEEC CCC CEEEEEEEEE ", + " BBEEEEEEEEC CEEEEEEEEBB ", + " BBBBEEEEC CEEEEBBBB ", + " BBBEEC CEEBBB ", + " BBCC CCBB ", + " BBCC CCBB ", + " BBCCCCCBB ", + " BBBBB ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " BBBBEEEE EEEEBBBB ", + " BBBBBEEEEEEEE EEEEEEEEBBBBB ", + " EEEEEEEEEEEEE EEEEEEEEEEEEE ", + " EEEEEEEEEGGGG GGGGEEEEEEEEE ", + " EEEEEEEGGGGGG GGGGGGEEEEEEE ", + " EEEEEEEEEGGGG GGGGEEEEEEEEE ", + " EEEEEEEEEEEEE EEEEEEEEEEEEE ", + " BBBBBEEEEEEEE EEEEEEEEBBBBB ", + " BBBBEEEE EEEEBBBB ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BB BB ", + " BBBBBEE EEBBBBB ", + " BBBEEEEEEE EEEEEEEBBB ", + " EEEEEEEEEE EEEEEEEEEE ", + " EEEEEEGGGG GGGGEEEEEE ", + " EEEEEEEEEE EEEEEEEEEE ", + " BBBEEEEEEE EEEEEEEBBB ", + " BBBBBEE EEBBBBB ", + " BB BB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " BBBBBEEE EEEBBBBB ", + " EEEEEEEE EEEEEEEE ", + " EEEEEGGG GGGEEEEE ", + " EEEEEEEE EEEEEEEE ", + " BBBBBEEE EEEBBBBB ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBBBBB BBBBBBB ", + " EEEEEEE EEEEEEE ", + " EEEEEGG GGEEEEE ", + " EEEEEEE EEEEEEE ", + " BBBBBBB BBBBBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBBBBB BBBBBBB ", + " EEEEEEE EEEEEEE ", + " EEEEGGG GGGEEEE ", + " EEEEEEE EEEEEEE ", + " BBBBBBB BBBBBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBBBB BBBBBB ", + " EEEEEE EEEEEE ", + " EEEEGG GGEEEE ", + " EEEEEE EEEEEE ", + " BBBBBB BBBBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBBBBB BBBBBB ", + " EEEEEE EEEEEE ", + " EEEEGG GGEEEE ", + " EEEEEE EEEEEE ", + " BBBBBB BBBBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBBB BBBBB ", + " EEEEE EEEEE ", + " EEEEG GEEEE ", + " EEEEE EEEEE ", + " BBBBB BBBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBBBB BBBBBB ", + " EEEEEE EEEEEE ", + " EEEEGG GGEEEE ", + " EEEEEE EEEEEE ", + " BBBBBB BBBBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBBB BBBBB ", + " EEEEE EEEEE ", + " EEEGG GGEEE ", + " EEEEE EEEEE ", + " BBBBB BBBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBBB BBBBB ", + " EEEEE EEEEE ", + " EEEEG GEEEE ", + " EEEEE EEEEE ", + " BBBBB BBBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBBB BBBBB ", + " EEEEE EEEEE ", + " EEEEG GEEEE ", + " EEEEE EEEEE ", + " BBBBB BBBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBBB BBBBB ", + " EEEEE EEEEE ", + " EEEGG GGEEE ", + " EEEEE EEEEE ", + " BBBBB BBBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEG GEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEG GEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEG GEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEG GEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEG GEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEG GEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEG GEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEG GEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEG GEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEG GEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEG GEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEG GEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEG GEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEG GEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEG GEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEG GEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEG GEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEG GEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEG GEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEG GEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEG GEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEG GEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEG GEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEG GEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEG GEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEG GEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEG GEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEG GEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEG GEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEG GEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEG GEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEG GEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEG GEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEG GEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEG GEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEG GEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEG GEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEG GEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEG GEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEG GEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + "BBB BBB", + "EEE EEE", + "EEG GEE", + "EEE EEE", + "BBB BBB", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + "BBB BBB", + "EEE EEE", + "EEG GEE", + "EEE EEE", + "BBB BBB", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + "BBB BBB", + "EEE EEE", + "EEG GEE", + "EEE EEE", + "BBB BBB", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + "BBB BBB", + "EEE EEE", + "EEG GEE", + "EEE EEE", + "BBB BBB", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + "BBB BBB", + "EEE EEE", + "EEG GEE", + "EEE EEE", + "BBB BBB", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + "BBB BBB", + "EEE EEE", + "EEG GEE", + "EEE EEE", + "BBB BBB", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + "BBB BBB", + "EEE EEE", + "EEG GEE", + "EEE EEE", + "BBB BBB", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + "BBB BBB", + "EEE EEE", + "EEG GEE", + "EEE EEE", + "BBB BBB", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + "BBB BBB", + "EEE EEE", + "EEG GEE", + "EEE EEE", + "BBB BBB", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + "BBB BBB", + "EEE EEE", + "EEG GEE", + "EEE EEE", + "BBB BBB", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + "BBB BBB", + "EEE EEE", + "EEG GEE", + "EEE EEE", + "BBB BBB", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + "BBB BBB", + "EEE EEE", + "EEG GEE", + "EEE EEE", + "BBB BBB", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + "BBB BBB", + "EEE EEE", + "EEG GEE", + "EEE EEE", + "BBB BBB", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + "BBB BBB", + "EEE EEE", + "EEG GEE", + "EEE EEE", + "BBB BBB", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + "BBB BBB", + "EEE EEE", + "EEG GEE", + "EEE EEE", + "BBB BBB", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEG GEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEG GEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEG GEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEG GEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEG GEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEG GEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEG GEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEG GEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEG GEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEG GEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEG GEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEG GEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEG GEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEG GEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEG GEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEG GEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEG GEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEG GEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEG GEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEG GEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEG GEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEG GEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEG GEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEG GEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEG GEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEG GEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEG GEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEG GEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEG GEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEG GEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEG GEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEG GEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEG GEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEG GEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEG GEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEG GEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEG GEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEG GEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEG GEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEG GEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBBB BBBBB ", + " EEEEE EEEEE ", + " EEEGG GGEEE ", + " EEEEE EEEEE ", + " BBBBB BBBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBBB BBBBB ", + " EEEEE EEEEE ", + " EEEEG GEEEE ", + " EEEEE EEEEE ", + " BBBBB BBBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBBB BBBBB ", + " EEEEE EEEEE ", + " EEEEG GEEEE ", + " EEEEE EEEEE ", + " BBBBB BBBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBBB BBBBB ", + " EEEEE EEEEE ", + " EEEGG GGEEE ", + " EEEEE EEEEE ", + " BBBBB BBBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBBBB BBBBBB ", + " EEEEEE EEEEEE ", + " EEEEGG GGEEEE ", + " EEEEEE EEEEEE ", + " BBBBBB BBBBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBBB BBBBB ", + " EEEEE EEEEE ", + " EEEEG GEEEE ", + " EEEEE EEEEE ", + " BBBBB BBBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBBBB BBBBBB ", + " EEEEEE EEEEEE ", + " EEEEGG GGEEEE ", + " EEEEEE EEEEEE ", + " BBBBBB BBBBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBBBB BBBBBB ", + " EEEEEE EEEEEE ", + " EEEEGG GGEEEE ", + " EEEEEE EEEEEE ", + " BBBBBB BBBBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBBBBB BBBBBBB ", + " EEEEEEE EEEEEEE ", + " EEEEGGG GGGEEEE ", + " EEEEEEE EEEEEEE ", + " BBBBBBB BBBBBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBBBBB BBBBBBB ", + " EEEEEEE EEEEEEE ", + " EEEEEGG GGEEEEE ", + " EEEEEEE EEEEEEE ", + " BBBBBBB BBBBBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBBBBBB BBBBBBBB ", + " EEEEEEEE EEEEEEEE ", + " EEEEEGGG GGGEEEEE ", + " EEEEEEEE EEEEEEEE ", + " BBBBBBBB BBBBBBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBBBBBBBB BBBBBBBBBB ", + " EEEEEEEEEE EEEEEEEEEE ", + " EEEEEEGGGG GGGGEEEEEE ", + " EEEEEEEEEE EEEEEEEEEE ", + " BBBBBBBBBB BBBBBBBBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBBBBBBBBBBB BBBBBBBBBBBBB ", + " EEEEEEEEEEEEE EEEEEEEEEEEEE ", + " EEEEEEEGGGGGG GGGGGGEEEEEEE ", + " EEEEEEEEEEEEE EEEEEEEEEEEEE ", + " BBBBBBBBBBBBB BBBBBBBBBBBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB ", + " EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE ", + " EEEEEEEEEEGGGGGGGGGGGGGGGEEEEEEEEEE ", + " EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE ", + " BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBBBBBBBBBBBBBBBBBBBBBBBBB ", + " EEEEEEEEEEEEEEEEEEEEEEEEEEE ", + " EEEEEEEEEEEEEEEEEEEEEEEEEEE ", + " EEEEEEEEEEEEEEEEEEEEEEEEEEE ", + " BBBBBBBBBBBBBBBBBBBBBBBBBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBBBBBBBBBBBBB ", + " EEEEEEEEEEEEEEE ", + " EEEEEEEEEEEEEEE ", + " EEEEEEEEEEEEEEE ", + " BBBBBBBBBBBBBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " } }; +} diff --git a/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/ForgeofGodsStructureString.java b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/ForgeofGodsStructureString.java deleted file mode 100644 index 7dde3ab5b..000000000 --- a/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/ForgeofGodsStructureString.java +++ /dev/null @@ -1,2933 +0,0 @@ -package com.github.technus.tectech.thing.metaTileEntity.multi; - -public abstract class ForgeofGodsStructureString { - - @SuppressWarnings("SpellCheckingInspection") - public static final String[][] godForge = { - { " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " CC ", - " CCCC ", - " CCC ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " " }, - { " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " C ", - " CCCCCC ", - " CCCCCCC ", - " CCCDDCCC ", - " CC DDDCC ", - " CCCDDDCC ", - " CCCCCCC ", - " CCCCCC ", - " CCCC ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " " }, - { " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " CCCC ", - " CCCC CCC ", - " CCCDDDD CC ", - " CCDDDDDD C ", - " CCDDDDDDDCC ", - " C DDDDDDDC ", - " CCDDDDDDDCC ", - " CCDDDDDDCC ", - " C DDDD C ", - " CC DD CC ", - " CCCCCC ", - " CC ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " " }, - { " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " CCC ", - " CC CCC ", - " CC DDDDDCC ", - " C DDDDDDDCC ", - " C DDDDDDDDCC ", - " CCDDDDDDDD C ", - " CCDDDDDDDDCC ", - " CCDDDDDDDDC ", - " C DDDDDDDC ", - " CCDDDDDDDC ", - " CCDDDDD C ", - " C DDDDC ", - " CC CC ", - " CCCC ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " CCC ", - " CCCC ", - " CCCCCC ", - " CCCCCCC ", - " CCCCCCC ", - " CCCCCCC ", - " CCCCCCC ", - " CCCC ", - " ", - " ", - " ", - " ", - " ", - " " }, - { " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " CCCCCCC ", - " CCDDDDDCC ", - " C DDDDDDDCC ", - " CDDDDDDDD CC ", - " CCDDDDDDDD C ", - " CCDDDDDDDDCC ", - " CCDDDDDDDDCC ", - " CC DDDDDD C ", - " CCDDDDDDDCC ", - " C DDDDDD C ", - " CCDDDDDD C ", - " CDDDDDDC ", - " C DDDDCC ", - " CC DDCC ", - " CCCC ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " CCC ", - " CCCC ", - " CCCCCC ", - " CCCCCCCC ", - " CCCCCCCC ", - " CCCDDDCCCC ", - " CCCDDDDCCC ", - " CCDDDDDDCCC ", - " CCDDDDDD CCC ", - " CC DDDDDDCCCC ", - " CCCDDDDDDDCCCC ", - " CCC DDDDDDCCCCC ", - " CCCC DDDCCCCCC ", - " CCCCCCCCCCCC ", - " CCCCCCCCC ", - " ", - " ", - " ", - " " }, - { " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " CCCC ", - " C DDDCCC ", - " CDDDDDD C ", - " C DDDDDDDCC ", - " C DDDDDDDCC ", - " CC DDDDDDCCC ", - " CCCC DDCCCCC ", - " CCCCCCCCCC ", - " CCCCCCCCC ", - " CC DDD CC ", - " CCDDDDD C ", - " CCDDDDDDC ", - " C DDDDDDC ", - " C DDDDDC ", - " CCDDDD C ", - " C DDCC ", - " CCCC ", - " ", - " ", - " ", - " ", - " ", - " C ", - " CCCC ", - " CCCCCC ", - " CCCCCCC ", - " CCCDD CC ", - " CCDDDDCC ", - " CCDDDDD CC ", - " CCDDDDDDD C ", - " CCDDDDDDD CC ", - " C DDDDDDDD C ", - " CDDDDDDDDDDCC ", - " CCDDDDDDDDDD CC ", - " CCDDDDDDDDDDD CC ", - " CCDDDDDDDDDDDD CCC ", - " C DDDDDDDDDDDD CCC ", - " C DDDDDDDDDDDDD CCC ", - " CC DDDDDDDDDDDDDCCCC ", - " CC DDDDDDDDDDDCCCC ", - " CCC DDDDDDD CCCC ", - " CCCCCCCCCCCC ", - " CCCCC ", - " ", - " " }, - { " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " CCCCCC ", - " CDDDDDCC ", - " CDDDDDD C ", - " C DDDDDD C ", - " CCDDDDDDCC ", - " CCCC CCCC ", - " CCCCC ", - " ", - " ", - " CCCCCC ", - " CCCC CC ", - " CCDDD C ", - " CCDDDDDC ", - " CDDDDDDC ", - " CDDDDDC ", - " CDDDD C ", - " C DDCC ", - " CCCC ", - " ", - " C ", - " CCCCC ", - " CCCCCC ", - " CCC CCC ", - " CCDDDDCC ", - " CCDDDDD C ", - " CDDDDDD C ", - " C DDDDDD C ", - " CCDDDDDDDDC ", - " CDDDDDDDDDCC ", - " C DDDDDDDDD C ", - " C DDDDDDDDDDCC ", - " CDDDDDDDDDDD C ", - " CDDDDDDDDDDDDCC ", - " CDDDDDDDDDDDDDCC ", - " CCDDDDDDDDDDDDDDCCC ", - " CDDDDDDDDDDDDDDD CCC ", - " C DDDDDDDDDDDDDDDD CCCC ", - " CCDDDDDDDDDDDDDDDDDDCCCC ", - " C DDDDDDDDDDDDDDDDDDCCC ", - " CCDDDDDDDDDDDDDDDDDCCCC ", - " CC DDDDDDDDDDDDDDCCCC ", - " CCC DDDDDDDDDDCCCC ", - " CCCCCC CCCCC ", - " CC ", - " " }, - { " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " CCCC ", - " C DD CC ", - " CCDDDDD C ", - " CDDDDDD C ", - " C DDDDD CC ", - " CCCDD CCC ", - " CCCCC ", - " ", - " ", - " ", - " ", - " C ", - " CCCCC ", - " C DDDC ", - " CDDDDDC ", - " C DDDDDC ", - " CDDDDDC ", - " CDDDDC ", - " CCCC CCD C ", - " CCCCC CC ", - " CCC CC ", - " C DDD C ", - " CDDDDD C ", - " CDDDDDD C ", - " C DDDDDD C ", - " C DDDDDDD C ", - " CDDDDDDDD C ", - " CDDDDDDDDD C ", - " CDDDDDDDDD C ", - " C DDDDDDDDD C ", - " CDDDDDDDDDDDC ", - " CDDDDDDDDDDDCC ", - " C DDDDDDDDDDDDCC ", - " C DDDDDDDDDDDD CC ", - " CDDDDDDDDDDDDDDDCC ", - " C DDDDDDDDDDDDDDDCCC ", - " C DDDDDDDDDDDDDDDDDCCCCC ", - " CCDDDDDDDDDDDDDDDDDDDD CCCC ", - " CDDDDDDDDDDDDDDDDDDDDDD CCCC ", - " CCDDDDDDDDDDDDDDDDDDDDDDCCCC ", - " CCDDDDDDDDDDDDDDDDDDDDDCCC ", - " CCDDDDDDDDDDDDDDDDDDDCCC ", - " CCDDDDDDDDDDDDDDD CCC ", - " CCCCDDDDDDDDD CCC ", - " CCCCCCCCCCC ", - " " }, - { " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " CCCC ", - " C DDDCC ", - " CDDDDD C ", - " CDDDDDDCC ", - " CCDDDDDCC ", - " CCCCCC ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " CCCCC ", - " CCDDDC ", - " CCC C DDDDC ", - " CCCCC CDDDDDC ", - " CCCCCC CDDDDDC ", - " C DDDCC CDDDDC ", - " CDDDDDC CCCCC ", - " CDDDDDDC ", - " CDDDDDD C ", - " CDDDDDDD C ", - " CDDDDDDDDC ", - " C DDDDDDDDC ", - " CDDDDDDDDDC ", - " CDDDDDDDDDDC ", - " CDDDDDDDDDDC ", - " CDDDDDDDDDDDC ", - " CDDDDDDDDDDDC ", - " C DDDDDDDDDDDCC ", - " CDDDDDDDDDDDD C ", - " CDDDDDDDDDDDDDCC ", - " CDDDDDDDDDDDDDDCC ", - " CDDDDDDDDDDDDDDDCCC ", - " CDDDDDDDDDDDDDDDD CCC ", - " C DDDDDDDDDDDDDDDDDDCCCCCCCC ", - " CCDDDDDDDDDDDDDDDDDDDDDDD CCCCC ", - " CDDDDDDDDDDDDDDDDDDDDDDDDDD CCC ", - " CCDDDDDDDDDDDDDDDDDDDDDDDDDDCCC ", - " C DDDDDDDDDDDDDDDDDDDDDDDDCC ", - " CCCDDDDDDDDDDDDDDDDDDDDD CC ", - " CCDDDDDDDDDDDDDDDDDD CC ", - " CCCDDDDDDDDDDDDD CC ", - " CCCCCCC CCCCCC ", - " C " }, - { " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " CCCCC ", - " CDDDDDC ", - " CDDDDD C ", - " CDDDDDDC ", - " CDDDDCC ", - " CCCCC ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " CCCC ", - " CCCCCC CCCC ", - " CCDD C CCDDDC ", - " C DDD C C DDDDC ", - " CDDDDD C CDDDD C ", - " CDDDDDDC CDDDDDC ", - " CDDDDDDDC CDDDCB ", - " CDDDDDDD C CCCCB ", - " CDDDDDDDDC BB ", - " CDDDDDDDDDC ", - " CDDDDDDDD C ", - " CDDDDDDDDDC ", - " C DDDDDDDDDC ", - " CDDDDDDDDDDC ", - " C DDDDDDDDDDC ", - " CDDDDDDDDDD C ", - " CDDDDDDDDDD C ", - " C DDDDDDDDDDDC ", - " CDDDDDDDDDDDDCC ", - " CDDDDDDDDDDDD C ", - " CDDDDDDDDDDDDDCC ", - " CDDDDDDDDDDDDDDCCC ", - " C DDDDDDDDDDDDDDDCCCCC ", - " C DDDDDDDDDDDDDDDDDDDCCCCCCCCCCCCC ", - " CCDDDDDDDDDDDDDDDDDDDDDDDDDDDD CCC ", - " C DDDDDDDDDDDDDDDDDDDDDDDDDDDDDCCC ", - " CCDDDDDDDDDDDDDDDDDDDDDDDDDDDD CC ", - " CCDDDDDDDDDDDDDDDDDDDDDDDDDDCC ", - " CCDDDDDDDDDDDDDDDDDDDDDDD CC ", - " CC DDDDDDDDDDDDDDDDDDD CC ", - " CCC DDDDDDDDDDDDDD CC ", - " CCCCCDDDDDDDCCCC ", - " CCCCCCC " }, - { " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " BBCCCCC ", - " BC DDDDC ", - " BCDDDDD C ", - " C DDDD C ", - " CCDD C ", - " CCC ", - " ", - " ", - " ", - " ", - " C ", - " CCCCC ", - " CCCCC ", - " CCDDD C ", - " C DDDD C ", - " CDDDDDDC CCCC ", - " CDDDDDD C C DDDC ", - " CDDDDDDDC CDDDDDC ", - " CDDDDDDDDC CDDDDC ", - " CDDDDDDDDC CDDDDCB ", - " CDDDDDDDDDC C D CB ", - " CDDDDDDDDC CCCBB ", - " CDDDDDDDDDC ", - " CDDDDDDDDD C ", - " CDDDDDDDDDC ", - " CDDDDDDDDDDC ", - " CDDDDDDDDD C ", - " CDDDDDDDDDD C ", - " CDDDDDDDDDDC ", - " CDDDDDDDDDDC ", - " C DDDDDDDDDDCC ", - " C DDDDDDDDDD C ", - " C DDDDDDDDDD CC ", - " C DDDDDDDDDDD C ", - " C DDDDDDDDDDDDCCC ", - " CCDDDDDDDDDDDDDDCCCCC CCC ", - " C DDDDDDDDDDDDDDDD CCCCCCCCCCCC CCCC ", - " CCDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDCCC ", - " C DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDCC ", - " CCDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDCC ", - " CCDDDDDDDDDDDDDDDDDDDDDDDDDDDCC ", - " CCDDDDDDDDDDDDDDDDDDDDDDDD C ", - " CC DDDDDDDDDDDDDDDDDDDD C ", - " CCC DDDDDDDDDDDDDDDCCC ", - " CCCCCDDDDDDD CCC ", - " CCCCCCCC " }, - { " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " BB C ", - " BBCCDCCC ", - " BC DDDD C ", - " CDDDDDDC ", - " CDDDD C ", - " CCC CC ", - " C ", - " ", - " ", - " CC ", - " CCCCC ", - " CCC CC ", - " C DDD C ", - " CDDDDDC ", - " CDDDDDDC ", - " C DDDDDDC ", - " C DDDDDDDC CCC ", - " C DDDDDDDC C D C ", - " CDDDDDDD C CDDDDC ", - " CDDDDDDDDC CDDDDC ", - " CDDDDDDDDC CDDDDDC ", - " CDDDDDDDDDC CDDDCB ", - " CDDDDDDDDDC CCCCBB ", - " CDDDDDDDDDC B ", - " CDDDDDDDDDC ", - " CDDDDDDDDDC ", - " CDDDDDDDDD C ", - " CDDDDDDDDDC ", - " C DDDDDDDD C ", - " C DDDDDDDD C ", - " CDDDDDDDDDCC ", - " CDDDDDDDDDCC ", - " CDDDDDDDDDCC ", - " C DDDDDDDDCC ", - " C DDDDDDDDCCC ", - " CCDDDDDDDD CCC ", - " CC DDDDDDDDDCCCCC CCCCCCCCCCC ", - " CCDDDDDDDDDDD CCCCCCCCCCCCDDDDDDDDDCCC ", - " CCCDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDCC ", - " CC DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDCC ", - " CC DDDDDDDDDDDDDDDDDDDDDDDDDDDD C ", - " CCCDDDDDDDDDDDDDDDDDDDDDDDDDDDCC ", - " CCCDDDDDDDDDDDDDDDDDDDDDDDDCC ", - " CCC DDDDDDDDDDDDDDDDDDD C ", - " CCC DDDDDDDDDDDDDDCCC ", - " CCCCCDDDDDDCCCC ", - " CCCCCC " }, - { " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " BB CC ", - " BBCCDDCC ", - " BCDDDD C ", - " CDDDDDC ", - " CDDDD C ", - " CCCCC ", - " ", - " CCC ", - " CCCCC ", - " CC DCC ", - " C DDD C ", - " CDDDDDC ", - " C DDDDD C ", - " CDDDDDDDC ", - " CDDDDDDDC ", - " CDDDDDDDDC ", - " CDDDDDDDDC ", - " CDDDDDDDDC CCCC ", - " CDDDDDDDDDC CDDDC ", - " C DDDDDDDDC C DDDDC ", - " CDDDDDDDDC CDDDDC ", - " CDDDDDDDDDC CDDDDC ", - " C DDDDDDDDC CDD CB ", - " CDDDDDDDDC CCCBBB ", - " CDDDDDDDDDC BB ", - " CDDDDDDDDC ", - " C DDDDDDD C ", - " C DDDDDDDC ", - " CDDDDDDD C ", - " CDDDDDDDCC ", - " C DDDDDCC ", - " C DDDDDCC ", - " CCDDDDCCC ", - " CCC DCCCC ", - " CCCCCCCCC ", - " CCCCCCCCC CCCCCCCCC ", - " CCCCCCCCCC CCCC DDDDDDCCC ", - " CCCCCCCCCCCCCC CCCCCCCCDDDDDDDDDDDDCC ", - " CCCCCCCCCCCCCCC DDDDDDDDDDDDDDDDDDC ", - " CCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDD C ", - " CCCCCDDDDDDDDDDDDDDDDDDDDDDDDDDC ", - " CCCCDDDDDDDDDDDDDDDDDDDDDDDD C ", - " CCC DDDDDDDDDDDDDDDDDDDDDCC ", - " CCC DDDDDDDDDDDDDDDDDCC ", - " CCC DDDDDDDDDDDDDCC ", - " CCCCCC CCCCCC ", - " CC " }, - { " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " BB ", - " BBB CCC ", - " BBBC D C ", - " CDDDDDC ", - " CDDDDDC ", - " C DDDDC ", - " CCC CCCCC ", - " CCCCC ", - " CC D CC ", - " C DDD C ", - " C DDDDDC ", - " CDDDDDD C ", - " CDDDDDDDC ", - " CDDDDDDDC ", - " CDDDDDDDC ", - " CDDDDDDDDC ", - " CDDDDDDDDC ", - " CDDDDDDDDC ", - " CDDDDDDDDC ", - " CDDDDDDDDC CCCC ", - " C DDDDDDDDC CDDD C ", - " CDDDDDDDDC CDDDDC ", - " CDDDDDDDDC CDDDDC ", - " CDDDDDDD C CDDDC ", - " CDDDDDDDDC CCCCC B ", - " CDDDDDDDC BBB ", - " C DDDDDDCC B ", - " C DDDDDCC ", - " C DDDDCC ", - " CCDDDCCC ", - " CCCCCCC ", - " CCCCCC ", - " CCCCCC ", - " CCCC ", - " CC CC ", - " CCCCCCCC ", - " CCCDDDDDDCC ", - " CCCCDDDDDDDDD C ", - " CCC DDDDDDDDDDDD C ", - " CCCCCDDDDDDDDDDDDDDDDCC ", - " CCCCCCCCDDDDDDDDDDDDDDDDDDDC ", - " CCCCCCCDDDDDDDDDDDDDDDDDDDDC ", - " CCCCCDDDDDDDDDDDDDDDDDDDDCC ", - " CCCCCDDDDDDDDDDDDDDDDDDC ", - " CCCCDDDDDDDDDDDDDDDCC ", - " CCCC DDDDDDDDDCCC ", - " CCCCCCCCCCC ", - " " }, - { " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " B ", - " BB ", - " BBB CC ", - " CCDDCC ", - " CDDDDC ", - " CC CDDDDC ", - " CCCC CDDDDC ", - " C D CC CCCC ", - " C DDDDC ", - " CDDDDDC ", - " CDDDDDD C ", - " CDDDDDDDC ", - " CDDDDDDDC ", - " CDDDDDDDC ", - "C DDDDDDDC ", - "CDDDDDDDDC ", - " CDDDDDDDDC ", - " CDDDDDDDDC ", - " CDDDDDDDDC ", - " CDDDDDDDDC ", - " CDDDDDDDDC CC ", - " CDDDDDDDC CDDCC ", - " CDDDDDDDC CDDDDC ", - " CDDDDDD C CDDDDC ", - " CDDDDDD C CDDDC ", - " CDDDDD C C DDC BB ", - " CCDDDDCC CCC BB ", - " CC DDCC BB ", - " CCCCCC ", - " CCCCC ", - " CCC ", - " ", - " ", - " ", - " CCC ", - " CCC CCC ", - " CCCDDDDD CC ", - " CCDDDDDDDDDCC ", - " CCCDDDDDDDDDDDCC ", - " CC DDDDDDDDDDDDDC ", - " CCCDDDDDDDDDDDDDDD C ", - " CCC DDDDDDDDDDDDDDDDC ", - " CCCCDDDDDDDDDDDDDDDDDC ", - " CCCCDDDDDDDDDDDDDDDDDC ", - " CCC DDDDDDDDDDDDDDCC ", - " CCC DDDDDDDDDDDCC ", - " CCC DDDDCCCC ", - " CCCCCC ", - " " }, - { " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " BB ", - " BBB ", - " BBB C ", - " C CCDCC ", - " CCCCC CDDDD C ", - " CC CC CDDDDDC ", - " CCDDDDCC C DDD C ", - " CDDDDD C CCCCC ", - " C DDDDDDC ", - " CDDDDDDDC ", - " CDDDDDDDC ", - " CDDDDDDDC ", - "CDDDDDDDDC ", - "CDDDDDDDDC ", - "CDDDDDDDDC ", - "CDDDDDDDDC ", - " CDDDDDDDC ", - " CDDDDDDD C ", - " CDDDDDDD C ", - " CDDDDDDD C ", - " CDDDDDD C ", - " CDDDDDD C CCCC ", - " CDDDDD C CDDDC ", - " C DDDDCC CDDDDC ", - " CCDD CC CDDDDC ", - " CCCCCC CDDDC ", - " CCCC CCCC BB ", - " CCC BB ", - " BB ", - " ", - " ", - " ", - " ", - " CCCCC ", - " CC CCC ", - " CCDDDDDDCC ", - " CCDDDDDDDD C ", - " CCDDDDDDDDDD C ", - " CCDDDDDDDDDDDD C ", - " CC DDDDDDDDDDDDDC ", - " C DDDDDDDDDDDDDD C ", - " CC DDDDDDDDDDDDDD C ", - " CCCDDDDDDDDDDDDDD C ", - " CCC DDDDDDDDDDDDDCC ", - " CCCCDDDDDDDDDDDCC ", - " CCCC DDDDDD CC ", - " CCCCCCCCCC ", - " ", - " " }, - { " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " B ", - " BBBB ", - " BBBB ", - " CCCC CC ", - " CC CCC C CC ", - " C DDD C CDDDDC ", - " C DDDDDC CDDDDC ", - " CDDDDDDC CDDDDC ", - " CDDDDDDDC CCCCC ", - " CDDDDDDDC ", - " CDDDDDDDC ", - " CDDDDDDDC ", - "CDDDDDDDDC ", - "CDDDDDDDDC ", - "CDDDDDDDDC ", - "CDDDDDDDDC ", - " CDDDDDDDC ", - " CDDDDDDDC ", - " CDDDDDDDC ", - " C DDDDDDC ", - " CDDDDDDC ", - " C DDDD C ", - " C DDDCC CCC ", - " CCC CCC C DDC ", - " CCCCC CDDDDC ", - " CCC CDDDDC ", - " CDDDDC ", - " CDDC ", - " CC BB ", - " BBB ", - " BBB ", - " ", - " ", - " CCCCCC ", - " CC DDDCC ", - " CC DDDDDDC ", - " C DDDDDDDDC ", - " CCDDDDDDDDDDC ", - " C DDDDDDDDDD C ", - " CCDDDDDDDDDDDDC ", - " C DDDDDDDDDDDD C ", - " CC DDDDDDDDDDDDDC ", - " CCCDDDDDDDDDDDDDC ", - " CCDDDDDDDDDDDDDC ", - " CCCDDDDDDDDDDDCC ", - " CCCDDDDDDDDCC ", - " CCCCCCCCCC ", - " ", - " ", - " " }, - { " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " B ", - " BB ", - " CCC BBB ", - " CCCCC BBB ", - " C DDDCC CCCCCC ", - " CDDDDD C CCCCC CCCCCC ", - " C DDDDDDC CDDD C CCCCCCCC ", - " CDDDDDDDC CDDDDDC CCCCCC ", - " CDDDDDDDDC C DDD C CCCCC ", - " CDDDDDDDDC CCDCC CCCC ", - " CDDDDDDDDC C CCCC ", - " CDDDDDDDDC CCC ", - " CDDDDDDDDC C ", - "CDDDDDDDDC ", - "C DDDDDDDC ", - " CDDDDDDDC ", - " CDDDDDDDC ", - " CDDDDDDDC ", - " CDDDDDD C ", - " CDDDDD C ", - " C DDDDC ", - " C DDCC ", - " CCCCCC ", - " CCCC ", - " C CCCC ", - " CDDD C ", - " CDDDDC ", - " CDDDDC ", - " C DD C ", - " CCCC B ", - " BBB ", - " BBB ", - " BCCC ", - " CCCCCC ", - " CCDDDD C ", - " CDDDDDDDCC ", - " CCDDDDDDDDC ", - " C DDDDDDDDDC ", - " CDDDDDDDDDDDC ", - " CCDDDDDDDDDDD C ", - " C DDDDDDDDDDDDC ", - " CCDDDDDDDDDDDDC ", - " CCDDDDDDDDDDDDC ", - " CCDDDDDDDDDDDC ", - " CCCDDDDDDDDD C ", - " CCCDDDDDDD CC ", - " CCCC CCCC ", - " CCCC ", - " ", - " ", - " " }, - { " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " C BB ", - " CCCCCBB ", - " C DDCCBB ", - " CDDDDDCC ", - " CDDDDDD C CAAAFCC ", - " C DDDDDD C CCCC CCCC DDDDCCC ", - " CDDDDDDD C C DDDC CCCCCC DDDDD CC ", - " CDDDDDDDC CDDDDC CCCCCCCCCDDDD C ", - " CDDDDDDDDC CDDDDC CCDDD C ", - " CDDDDDDDDC CDDCC C DD C ", - " CDDDDDDDDC CC C DD C ", - " CDDDDDDDDC C DDC ", - " CDDDDDDDDC CCDCC ", - " CDDDDDDDC CCCC ", - " CDDDDDDDC CCC ", - " CDDDDDDDC CCC ", - " CDDDDDD C CC ", - " C DDDDDC CC ", - " C DDD C ", - " CC D CC ", - " CCCCC ", - " CCC ", - " ", - " ", - " CCCC ", - " C DD C ", - " CDDDDC ", - " CDDDDC ", - " CDDDDC ", - " CCCC ", - " BBC ", - " BCCCCC ", - " CC DDCC ", - " C DDDDDCC ", - " CDDDDDDDCC ", - " CCDDDDDDDDC ", - " C DDDDDDDDDC ", - " C DDDDDDDDDDC ", - " C DDDDDDDDDD C ", - " C DDDDDDDDDDDC ", - " CCDDDDDDDDDDDC ", - " CDDDDDDDDDDD C ", - " CCDDDDDDDDDD C ", - " CCDDDDDDDDDCC ", - " CCDDDDDDDCC ", - " CCCC CCC ", - " CCCC ", - " ", - " ", - " ", - " " }, - { " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " CCCC ", - " CC CCCB ", - " C DDDDCB ", - " CDDDDDDCC ", - " CDDDDDDD C ", - " CDDDDDDDC CCAAAACC ", - " CDDDDDDDDC CCCC CCDDDDDDDDCCC ", - " CDDDDDDDDC CDDD C C DDDDDDDDDDD C ", - " CDDDDDDDDDC CDDDDC CCC CCCEEEECDDDDCC ", - " CDDDDDDDDDC CDDDDC CCCCC EEEEE DD C ", - " CDDDDDDDDC C DDC CC EE DD C ", - " CDDDDDDDDC CCC EE DD C ", - " CDDDDDDDDC E DDC ", - " CDDDDDDDC EDDDC ", - " CDDDDDDDC ECDDC ", - " C DDDDD C EDDDC ", - " CDDDDDC CDDC ", - " C DDD C CDDC ", - " CCC CC C DC ", - " CCCCC CCC ", - " CCC CCC ", - " CCC ", - " CC ", - " ", - " ", - " CC ", - " C C ", - " CDDDDC ", - " CDDDDC ", - " CDDDDC ", - " CDDC CCCC ", - " CC CC CCC ", - " C DDD C ", - " CDDDDDDC ", - " CCDDDDDDDC ", - " CDDDDDDDDC ", - " CDDDDDDDDDC ", - " CDDDDDDDDDDC ", - " CDDDDDDDDDDC ", - " CDDDDDDDDDDDC ", - " C DDDDDDDDDDC ", - " CDDDDDDDDDD C ", - " CCDDDDDDDDD C ", - " CCDDDDDDDDCC ", - " CCDDDDDD C ", - " CCCC CCC ", - " CCCC ", - " ", - " ", - " ", - " ", - " " }, - { " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " C ", - " CCCCCC ", - " C DDDCC ", - " C DDDDDCC ", - " C DDDDDDCC ", - " CDDDDDDDC ", - " CDDDDDDDDC ", - " C DDDDDDDDC CCAAAAC ", - " CDDDDDDDDDC CCC CCCDDDCCCCCC ", - " CDDDDDDDDC CDDDCB C DDDDDCCCCCCCC ", - " CDDDDDDDDC CDDDDC BBCDDDDCCECC CCCCCCC ", - " CDDDDDDDDDC CDDDDC CDDDCEEE CCCC ", - " CDDDDDDDDC CDDDC CC CE CCCC ", - " CDDDDDDDDC CCC CCCC CCCC ", - " C DDDDDDC CC CCCC ", - " C DDDDDDC CCCC ", - " CDDDDDC CCDC ", - " C DDD C ECD C ", - " CC CC ECDDC ", - " CCCCC EEDDC ", - " C EDDC ", - " EDDC ", - " CDDC ", - " C DCB ", - " C DCBB ", - " CCCC BB ", - " CCC BB ", - " CC BB ", - " CCCC ", - " C DDDC ", - " CDDDDC CCC ", - " CDDDDC CCCCCC ", - " C DD C C DDDCC ", - " CCCC C DDDDDC ", - " C DDDDDDC ", - " C DDDDDDDC ", - " C DDDDDDDDC ", - " CDDDDDDDDDC ", - " CDDDDDDDDDDC ", - " CDDDDDDDDDDC ", - " C DDDDDDDDDDC ", - " CDDDDDDDDDDC ", - " C DDDDDDDDDC ", - " C DDDDDDDD C ", - " C DDDDDDDCC ", - " CCDDDDD C ", - " CCCC CCC ", - " CCC ", - " ", - " ", - " ", - " ", - " ", - " " }, - { " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " CCCC ", - " CC CCCC ", - " CCDDDDDCC ", - " C DDDDDDCC ", - " CDDDDDDD C ", - " CDDDDDDDDC ", - " C DDDDDDDDC ", - " CDDDDDDDDDC ", - " CDDDDDDDDC CCCCCC ", - " CDDDDDDDDDC CCC BB CCCCC ", - " CDDDDDDDD C CDD CBBBBBBCCCCCCC ", - " CDDDDDDDDC CDDDDCBBBBCCDDDCC ", - " CDDDDDDD C CDDDDC C DDDCC ", - " CDDDDDDDC CDDDC CDDDEE ", - " CDDDDDD C CCCC CDDDEE ", - " CDDDDD C CD CE ", - " CCDDDDC CCCC ", - " CC CCC CCC C ", - " CCCCC CC CC ", - " C CC ", - " CCC ", - " CCC ", - " ECDC ", - " E DCB ", - " EDDCB ", - " EEDDCBB ", - " ECDDCBB ", - " C D C BB ", - " CDDC BBB ", - " CCCC BCC CC ", - " CCCC CCDDC CCCCC ", - " CCC CDDDDC CC D CC ", - " CDDDDC C DDDD C ", - " CDDDDC C DDDDDDC ", - " CCCC CDDDDDDDC ", - " CDDDDDDDDC ", - " CDDDDDDDDDC ", - " CDDDDDDDDDC ", - " CDDDDDDDDDC ", - " C DDDDDDDDDC ", - " CDDDDDDDDDC ", - " C DDDDDDDDDC ", - " CDDDDDDDDDC ", - " CCDDDDDDDDC ", - " CCDDDDDDDC ", - " CCCDDDDCC ", - " CCCCCC ", - " C ", - " ", - " ", - " ", - " ", - " ", - " ", - " " }, - { " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " CCCCC ", - " CC DD CC ", - " C DDDDD C ", - " CDDDDDDD C ", - " CDDDDDDDD C ", - " C DDDDDDDD C ", - " CDDDDDDDDDC ", - " C DDDDDDDDDC ", - " CDDDDDDDDDC ", - " CDDDDDDDDDC ", - " CDDDDDDDDC C ", - " CDDDDDDDD C CCDCCB ", - " CDDDDDDDDC CDDDDCB CCCC ", - " C DDDDDDC CDDDDC CCCC ", - " C DDDDD C CDDDDC CDDC ", - " CDDDD C C DC CDD C ", - " CC CC CC CDDDE ", - " CCCC CDDCE ", - " C C DDE ", - " C DCE ", - " CCCC ", - " CCC ", - " CCC ", - " C C ", - " CCC ", - " CCC ", - " CCCC ", - " ECD C ", - " EDD C C ", - " ECDDC CCCC ", - " EDDDC CC CC CC ", - " C DDC CD C C DDDDC ", - " CDDC CDDDDC C DDDDD C ", - " CCCC CDDDDC CDDDDDD C ", - " CCCC CDDDDC CDDDDDDDDC ", - " CCDCC C DDDDDDDDC ", - " C CDDDDDDDDC ", - " CDDDDDDDDDC ", - " CDDDDDDDDDC ", - " CDDDDDDDDD C ", - " CDDDDDDDDDC ", - " C DDDDDDDD C ", - " C DDDDDDDDC ", - " C DDDDDDDC ", - " C DDDDD C ", - " CC DD CC ", - " CCCCC ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " " }, - { " ", - " ", - " ", - " ", - " ", - " ", - " ", - " C ", - " CCCCCC ", - " CCDDDDCCC ", - " CDDDDDDDCC ", - " CDDDDDDDDCC ", - " CDDDDDDDDDC ", - " CDDDDDDDDD C ", - " CDDDDDDDDDC ", - " CDDDDDDDDD C ", - " CDDDDDDDDDC ", - " CDDDDDDDDDC ", - " CDDDDDDDDDC ", - " CDDDDDDDDC ", - " CDDDDDDDC CCCC ", - " CDDDDDD C CDDDDC ", - " C DDDD C CDDDDC ", - " CC D CC CDDDDC CCC ", - " CCCCC CDDCC CCCC ", - " CC CCB CCCC ", - " BB CDDC ", - " BB C DCC ", - " B CDDCE ", - " BBCDDEE ", - " BCDDE ", - " CD E ", - " CDCE ", - " CCC ", - " CCC ", - " CC C ", - " CC CC CCCCC ", - " C CCC CCC CC ", - " CCCC CDDDDCC ", - " EC DC C DDDDDC ", - " EEDDDC CCCC C DDDDDDC ", - " EEDDDC CDDDC CDDDDDDDC ", - " CCDDD C CDDDDC C DDDDDDDC ", - " CCDDDCCBBBBCDDDDC CDDDDDDDDC ", - " CCCCCCCBBB BC DDC C DDDDDDDDC ", - " CCCCC CCC CDDDDDDDDDC ", - " CDDDDDDDDC ", - " CDDDDDDDDDC ", - " CDDDDDDDD C ", - " CDDDDDDDDC ", - " C DDDDDDDC ", - " CCDDDDDD C ", - " CCDDDDDCC ", - " CCCC CC ", - " CCCC ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " " }, - { " ", - " ", - " ", - " ", - " ", - " ", - " CCC ", - " CCC CCCC ", - " C DDDDDCC ", - " CCDDDDDDD C ", - " C DDDDDDDD C ", - " CDDDDDDDDD C ", - " CDDDDDDDDDDC ", - " CDDDDDDDDDD C ", - " CDDDDDDDDDDC ", - " CDDDDDDDDDDC ", - " CDDDDDDDDDC ", - " CDDDDDDDD C ", - " CDDDDDDD C ", - " CDDDDDD C ", - " CDDDDD C CCCC ", - " CCDDD C C DD C ", - " CCCCCC CDDDDC ", - " CCC CDDDDC ", - " CDDD C ", - " CCCC ", - " BBB CC ", - " BBB CCC ", - " BBCCCC ", - " BBCD C ", - " BCD C ", - " CDDC ", - " CDDE ", - " CDDE C ", - " CDDEE CCCCC ", - " CDDCE CC CC ", - " C DCE C DDD C ", - " CDCC CDDDDDC ", - " CCCC CDDDDDD C ", - " CCCC CC CDDDDDD C ", - " CCCC CCCC CCC CDDDDDDDDC ", - " CCCC EC CC CDDDC CDDDDDDDDC ", - " CCCC EEECDDDC CDDDDC CDDDDDDDDDC ", - " CCCCCCC CCECCDDDDCBBBBCDDDDC CDDDDDDDDC ", - " CCCCCCCCDDDDD CBBBBBBCDDDC CDDDDDDDDC ", - " CCCCCCDDDCCC CCC CDDDDDDDDDC ", - " CCCCCC CDDDDDDDD C ", - " CDDDDDDDDC ", - " CDDDDDDDC ", - " CCDDDDDD C ", - " CCDDDDD C ", - " CCDDD C ", - " CCCCCC ", - " C ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " " }, - { " ", - " ", - " ", - " ", - " ", - " CCCC ", - " CCC CCCC ", - " C DDDDDDCC ", - " CCDDDDDDDDCC ", - " C DDDDDDDDDCC ", - " C DDDDDDDDDDC ", - " CDDDDDDDDDD C ", - " CDDDDDDDDDDDC ", - " CDDDDDDDDDDC ", - " CDDDDDDDDDDC ", - " CDDDDDDDDDC ", - " CDDDDDDDDC ", - " CDDDDDDDCC ", - " CDDDDDDC ", - " C DDD C ", - " CCC CC CC ", - " CCCC CDDC ", - " CDDDDC ", - " CDDDDC ", - " CDDDDC ", - " C C ", - " CC ", - " ", - " ", - " CC ", - " CCC ", - " CCC CCC ", - " CCC CCCCC ", - " CD C CC CCC ", - " CDDC C DDD C ", - " CDDC CDDDDDC ", - " CDDDE C DDDDD C ", - " CDDCE CDDDDDDDC ", - " CDDDE CDDDDDDDC ", - " CDD E CDDDDDDDDC ", - " C DD EE CCC CDDDDDDDDC ", - " C DD EE CC CDD C CDDDDDDDDC ", - " C DD EEEEE CCCCC CDDDDC CDDDDDDDDDC ", - " CCDDDDCEEEECCC CCC CDDDDC CDDDDDDDDDC ", - " C DDDDDDDDDDD C C DDDC CDDDDDDDDC ", - " CCCDDDDDDDDCC CCCC CDDDDDDDDC ", - " CCCCCCCC CDDDDDDDC ", - " C DDDDDDDC ", - " CCDDDDDDC ", - " CDDDD C ", - " CCC CC ", - " CCCC ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " " }, - { " ", - " ", - " ", - " ", - " CCCC ", - " CCC CCCC ", - " CCDDDDDDDCC ", - " CCDDDDDDDDDCC ", - " C DDDDDDDDDDCC ", - " C DDDDDDDDDDDC ", - " CDDDDDDDDDDDCC ", - " CDDDDDDDDDDD C ", - " C DDDDDDDDDD C ", - " CDDDDDDDDDD C ", - " CDDDDDDDDD C ", - " CDDDDDDDDCC ", - " CCDDDDDDDC ", - " CCDDDDD C ", - " CCDD CCB ", - " CCCCC ", - " C ", - " CCCC ", - " CDDDDC ", - " CDDDDC ", - " CDDDDC ", - " C DD C ", - " CCCC ", - " ", - " ", - " CCC ", - " CCCCC ", - " CC D CC ", - " C DDD C ", - " CC CDDDDD C ", - " CC C DDDDDDC ", - " CCC CDDDDDDDC ", - " CCC CDDDDDDDC ", - " CCCC CDDDDDDDC ", - " CCDCC CDDDDDDDDC ", - " CDD C CDDDDDDDDC ", - " C DD C CC CDDDDDDDDC ", - " C DD C CCDDC CDDDDDDDDC ", - " C DDDCC CDDDDC CDDDDDDDDC ", - " C DDDDCCCCCCCCC CDDDDC BCDDDDDDDC ", - " CC DDDDD CCCCCC CDDD C BC DDDDDDDC ", - " CCCDDDD CCCC CCCC BC DDDDDD C ", - " CCCCCC C DDDDDDC ", - " CCDDDDDC ", - " CCDD C ", - " CCCCC ", - " C ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " " }, - { " ", - " ", - " ", - " CCCC ", - " CCCC CCCC ", - " CC DDDDDDDCCC ", - " C DDDDDDDDDCCC ", - " CDDDDDDDDDDDCC ", - " CDDDDDDDDDDDDCC ", - " CDDDDDDDDDDDDCC ", - " CDDDDDDDDDDDD C ", - " C DDDDDDDDDDDCC ", - " CDDDDDDDDDDDC ", - " CDDDDDDDDD C ", - " CDDDDDDDDCC ", - " CCDDDDDDDC ", - " C DDDDCC ", - " CCCCCCB ", - " CCCBBB ", - " ", - " ", - " CCCC ", - " C DD C ", - " CDDDDC ", - " CDDDDC ", - " C DDDC ", - " CCCC C ", - " CCCC ", - " CCCCCC ", - " CCDD C ", - " CDDDD C ", - " C DDDDDC ", - " C DDDDDDC ", - " CDDDDDDDC ", - " CDDDDDDDC ", - " CDDDDDDDC ", - " CDDDDDDD C", - " CDDDDDDDDC", - " C CDDDDDDDDC ", - " CCC CDDDDDDDDC ", - " CCCC C CDDDDDDDDC ", - " CCCC CCDCC CDDDDDDDDC ", - " CCCCC C DDD C CDDDDDDDDC ", - " CCCCCC CDDDDDC BBCDDDDDDDC ", - " CCCCCCCC C DDDC BBCDDDDDD C ", - " CCCCCC CCCCC BC DDDDDC ", - " CCDDD C ", - " CCCCC ", - " CCC ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " " }, - { " ", - " ", - " ", - " CCCCCCCCCC ", - " CCDDDDDDDDCCC ", - " CCDDDDDDDDDDDCCC ", - " CDDDDDDDDDDDDDCC ", - " CDDDDDDDDDDDDDCCC ", - " CDDDDDDDDDDDDD CC ", - " C DDDDDDDDDDDD C ", - " CDDDDDDDDDDDDCC ", - " C DDDDDDDDDD C ", - " CDDDDDDDDDDCC ", - " CDDDDDDDD C ", - " CDDDDDD CC ", - " CCDDD CC ", - " CCCCCC ", - " BB ", - " BBB ", - " B ", - " ", - " CC ", - " CDDC ", - " CDDDDC ", - " CDDDDC CCC ", - " CDDDDC CCCCC ", - " CDD C CCC CCC ", - " CCC CCDDD C ", - " C DDDD C ", - " CDDDDDDC ", - " CDDDDDD C ", - " CDDDDDDDC ", - " CDDDDDDDC ", - " CDDDDDDDC ", - " CDDDDDDDDC", - " CDDDDDDDDC", - " CDDDDDDDDC", - " CDDDDDDDDC", - " CDDDDDDDC ", - " CDDDDDDDC ", - " CDDDDDDDC ", - " CCCCC CDDDDDDDC ", - " CDDDDC CDDDDDDC ", - " CDDDDC BB CDDDDD C ", - " CDDDDC BB C DDD C ", - " CC C CCC CC ", - " CC CCCC ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " " }, - { " ", - " ", - " CCCCCCCCCC ", - " CC DDDDDD CCCC ", - " CCDDDDDDDDDDDCCCC ", - " CCDDDDDDDDDDDDD CCC ", - " C DDDDDDDDDDDDDDCCC ", - " C DDDDDDDDDDDDDD CC ", - " C DDDDDDDDDDDDDD C ", - " CDDDDDDDDDDDDD CC ", - " C DDDDDDDDDDDDCC ", - " C DDDDDDDDDDCC ", - " C DDDDDDDDCC ", - " CCDDDDDDCC ", - " CCC CC ", - " CCCCC ", - " ", - " BB ", - " BBB ", - " B ", - " ", - " CCC ", - " CCCC CCCC ", - " CDDDC CCCCCC ", - " CDDDDC CC DDCC ", - " CDDDDC CCDDDD C ", - " CDDDC C DDDDDC ", - " CCCC C DDDDDDC ", - " C DDDDDDC ", - " C DDDDDDDC ", - " C DDDDDDDC ", - " C DDDDDDDC ", - " CDDDDDDDC ", - " CDDDDDDDDC", - " CDDDDDDDDC", - " CDDDDDDDDC", - " CDDDDDDDDC", - " CDDDDDDDC ", - " CDDDDDDDC ", - " CDDDDDDDC ", - " CDDDDDD C ", - " CCCCC C DDDDDC ", - " C DDD C CCDDDDCC ", - " CDDDDDC BB CC CC ", - " C DDDDC BB CCCCC ", - " CCDCC C ", - " C ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " " }, - { " ", - " CCCCCC ", - " CCCCDDDD CCC ", - " CCDDDDDDDDDDD CCC ", - " CCDDDDDDDDDDDDDD CCC ", - " CDDDDDDDDDDDDDDDDDCCCC ", - " CDDDDDDDDDDDDDDDDDCCCC ", - " CDDDDDDDDDDDDDDDD CCC ", - " C DDDDDDDDDDDDDDDCCC ", - " CDDDDDDDDDDDDD CC ", - " CCDDDDDDDDDDDCCC ", - " CCDDDDDDDDDCC ", - " CC DDDDDCCC ", - " CCC CCC ", - " CCC ", - " ", - " ", - " ", - " BBB CCC ", - " BB CCCCC ", - " CCCCCC ", - " CCDD CC ", - " CCC CCDDDDCC ", - " CDD C C DDDDDC ", - " CDDDC C DDDDDDC ", - " CDDDDC C DDDDDDC ", - " CDDDDC CDDDDDDDC ", - " CCDDC CDDDDDDDC ", - " CC CDDDDDDDDC ", - " CDDDDDDDDC ", - " CDDDDDDDDC ", - " CDDDDDDDDC ", - " CDDDDDDDDC ", - " CDDDDDDDDC", - " CDDDDDDD C", - " CDDDDDDDC ", - " CDDDDDDDC ", - " CDDDDDDDC ", - " C DDDDDDC ", - " CDDDDDC ", - " CDDDD C ", - " CCCC CC D C ", - " CDDDDC CCCC ", - " CDDDDC BB CC ", - " CDDDDC BB ", - " CCDDCC ", - " CC ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " " }, - { " ", - " CCCCCCCCCCC ", - " CCCDDDDDDDDD CCCC ", - " CCDDDDDDDDDDDDDDDCCCC ", - " CDDDDDDDDDDDDDDDDDDCCCCC ", - " CCDDDDDDDDDDDDDDDDDDDDCCCCC ", - " CDDDDDDDDDDDDDDDDDDDDCCCCCCC ", - " CDDDDDDDDDDDDDDDDDDDCCCCCCCC ", - " CCDDDDDDDDDDDDDDDDCCCCC ", - " C DDDDDDDDDDDD CCC ", - " C DDDDDDDDDCCCC ", - " CCDDDDDDCCC ", - " CCCCCCCC ", - " CC CC ", - " CCCC ", - " CCCCCC ", - " CCCCCC ", - " CCCCCCC ", - " BB CCCDDDCC ", - " BB CCDDDD C ", - " BBB CCDDDDD C ", - " B CCDDDDDD C ", - " CDDDDDDDC ", - " CCCCC CDDDDDDDDC ", - " CDDDC C DDDDDDDC ", - " CDDDDC CDDDDDDDDC ", - " CDDDDC CDDDDDDDDC ", - " C DDDC CDDDDDDDD C ", - " CCCC CDDDDDDDDC ", - " CDDDDDDDDC ", - " CDDDDDDDDC ", - " CDDDDDDDDC ", - " CDDDDDDDDC ", - " CDDDDDDDC ", - " CDDDDDDDC ", - " CDDDDDDDC ", - " C DDDDDDC ", - " CDDDDD C ", - " C DDD C ", - " CC D CC ", - " CCCCC ", - " CCCCC CCC ", - " CDDDD C B ", - " CDDDDDCBBBB ", - " CDDDDDC BB ", - " C D C ", - " CCC ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " " }, - { " CC ", - " CCCCCC CCCCCC ", - " CCDDDDDDDDDDDDD CCC ", - " CCDDDDDDDDDDDDDDDDD CCC ", - " CCDDDDDDDDDDDDDDDDDDDDD CCC ", - " C DDDDDDDDDDDDDDDDDDDDDDDDCCCC ", - " CDDDDDDDDDDDDDDDDDDDDDDDDDDCCCCC ", - " C DDDDDDDDDDDDDDDDDDDDDDDDDCCCCCCCC ", - " CDDDDDDDDDDDDDDDDDD CCCCCCCCCCCCCCC ", - " CCDDDDDDDDDDDDCCCCCCCC CCCCCCCCCCCCCC ", - " CCCDDDDDD CCCC CCCCCCCCCC ", - " CCCCCCCCC CCCCCCCCC ", - " CCCCCCCCC ", - " CCCCD CCC ", - " CCCDDDDCC ", - " CCDDDDD C ", - " CCDDDDD C ", - " CCDDDDDDDC ", - " C DDDDDDDC ", - " BB CDDDDDDD C ", - " BBB C DDDDDDD C ", - " BBB CDDDDDDDDC ", - " CDDDDDDDDDC ", - " CCC CDDDDDDDDC ", - " C DDC CDDDDDDDD C ", - " CDDDDC CDDDDDDDDDC ", - " CDDDDC CDDDDDDDDC ", - " CDDDD C CDDDDDDDD C ", - " CDDDC CDDDDDDDDDC ", - " CCCC CDDDDDDDDC ", - " CDDDDDDDDC ", - " CDDDDDDDDC ", - " CDDDDDDDC ", - " CDDDDDDDC ", - " C DDDDD C ", - " CDDDDDC ", - " C DDD C ", - " CCD CC ", - " CCCCC ", - " CCC ", - " ", - " CCCCC ", - " C DDDDCBBB ", - " CDDDDDCBBBB ", - " C DDDDCBBB ", - " CCDDCC ", - " CC ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " " }, - { " CCCCCC ", - " CCCCDDDDDDCCCCC ", - " CCCDDDDDDDDDDDDDD CCC ", - " C DDDDDDDDDDDDDDDDDDD CCC ", - " CCDDDDDDDDDDDDDDDDDDDDDDDDCCC ", - " CCDDDDDDDDDDDDDDDDDDDDDDDDDDDCCC ", - " C DDDDDDDDDDDDDDDDDDDDDDDDDDDD CC ", - " CCDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD CC ", - " CCDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDCCC ", - " CCCDDDDDDDDDCCCCCCCCCCCC DDDDDDDDDDDCC ", - " CCCCCCCCCCC CCCCCDDDDDDDDD CC ", - " CCC DDDDDDDDCC ", - " CCCDDDDDDDD C ", - " CCDDDDDDDD C ", - " CCDDDDDDDDDC ", - " CCDDDDDDDDDC ", - " CCDDDDDDDDDC ", - " C DDDDDDDD C ", - " C DDDDDDDD C ", - " CDDDDDDDDDC ", - " BB C DDDDDDDDDC ", - " BBB CDDDDDDDDDC ", - " BBB CDDDDDDDDDC ", - " B CDDDDDDDDDC ", - " CCCC CDDDDDDDDDC ", - " CDDDC CDDDDDDDDDC ", - " CDDDDDC CDDDDDDDDC ", - " CDDDDC CDDDDDDDDC ", - " CDDDDC C DDDDDDDC ", - " C D C CDDDDDDD C ", - " CCC CDDDDDDD C ", - " CDDDDDD C ", - " CDDDDDDC ", - " CDDDDDC ", - " C DDD C ", - " CC CCC ", - " CCCCC ", - " CC ", - " ", - " ", - " C ", - " CC CCC ", - " C DDDDCBBB ", - " CDDDDDDCBB ", - " C DDDD CB ", - " CCCDCC ", - " C ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " " }, - { " CCCC~CCC G ", - " CCC DDDDDDDCCCCC ", - " CCCDDDDDDDDDDDDDDD CCC ", - " C DDDDDDDDDDDDDDDDDDDD CC ", - " C DDDDDDDDDDDDDDDDDDDDDDDDCC ", - " CCDDDDDDDDDDDDDDDDDDDDDDDDDDDCC ", - " CCDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDCC ", - " CCDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD C ", - " CCCDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDCC ", - " CCCC CCCCCCCCCCCC DDDDDDDDDDDDDDDD C ", - " CCC CCCCCDDDDDDDDDDDDDDCC ", - " CCCDDDDDDDDDDDD C ", - " C DDDDDDDDDDD C ", - " CC DDDDDDDDDD C ", - " C DDDDDDDDDD C ", - " CCDDDDDDDDDD C ", - " CDDDDDDDDDDC ", - " CDDDDDDDDDDC ", - " C DDDDDDDDDDC ", - " C DDDDDDDDDC ", - " CDDDDDDDDDDC ", - " BBB CDDDDDDDDDC ", - " BBB C DDDDDDDDDC ", - " BBB CDDDDDDDDDC ", - " CCC CDDDDDDDDC ", - " C D C CDDDDDDDDDC ", - " CDDDDC CDDDDDDDDC ", - " CDDDDC CDDDDDDDDC ", - " CDDDDDC CDDDDDDDC ", - " CDDD C C DDDDDDC ", - " CCCC CDDDDDDC ", - " C DDDD C ", - " C DDDCC ", - " CCCCC ", - " CCCCC ", - " C ", - " ", - " ", - " ", - " ", - " CCC ", - " C DDCC ", - " C DDDD CB ", - " C DDDDDCBB ", - " CDDDD CB ", - " CCCCC ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " " }, - { " CCCCCCC ", - " CCCCDDDDDDDCCCCC ", - " CC DDDDDDDDDDDDDD CCC ", - " CC DDDDDDDDDDDDDDDDDDD CC ", - " CC DDDDDDDDDDDDDDDDDDDDDDDCC ", - " CCDDDDDDDDDDDDDDDDDDDDDDDDDDCC ", - " CC DDDDDDDDDDDDDDDDDDDDDDDDDDDDCC ", - " CCCDDDDDDDDDDDDDDDDDDDDDDDDDDDDD C ", - " CCC DDDDDDDDDDDDDDDDDDDDDDDDDDDDCC ", - " CCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDD C ", - " CCCCCDDDDDDDDDDDDDDD C ", - " CCCDDDDDDDDDDDDDDC ", - " CCDDDDDDDDDDDDDC ", - " C DDDDDDDDDDDDC ", - " CCDDDDDDDDDDDDC ", - " CDDDDDDDDDDD C ", - " C DDDDDDDDDDC ", - " C DDDDDDDDDDC ", - " CDDDDDDDDDD C ", - " CDDDDDDDDDDC ", - " CDDDDDDDDD C ", - " CDDDDDDDDDC ", - " BB C DDDDDDDDC ", - " BB CDDDDDDDDDC ", - " BB CDDDDDDDDC ", - " BCCCC C DDDDDDDC ", - " BCDDDC CDDDDDDDC ", - " CDDDDDC CDDDDDDC ", - " C DDDDC C DDDDDC ", - " CDDDD C C DDD C ", - " CDDDCC C DDCC ", - " CCCC CCCCCC ", - " CCCC ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " CCCCC ", - " CCDDDDC ", - " CDDDDDDC ", - " C DDDDDC ", - " CDDDDDC ", - " CCCCC ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " " }, - { " C ", - " CCCCCC CCCCCCC ", - " CC DDDDDDDDDDDDDCCC ", - " CC DDDDDDDDDDDDDDDDDDCC ", - " CC DDDDDDDDDDDDDDDDDDDDDCCC ", - " CCDDDDDDDDDDDDDDDDDDDDDDDD C ", - " CCCDDDDDDDDDDDDDDDDDDDDDDDDDDCC ", - " CCC DDDDDDDDDDDDDDDDDDDDDDDDDDC ", - " CCCCC DDDDDDDDDDDDDDDDDDDDDDDCC ", - " CCCCCCCCDDDDDDDDDDDDDDDDDD C ", - " CCC DDDDDDDDDDDDDDDDC ", - " CCCDDDDDDDDDDDDDDDC ", - " CCDDDDDDDDDDDDDDC ", - " CCDDDDDDDDDDDDDC ", - " C DDDDDDDDDDDDC ", - " CCDDDDDDDDDDD C ", - " CDDDDDDDDDDDC ", - " CDDDDDDDDDDDC ", - " CDDDDDDDDDDC ", - " CDDDDDDDDDDC ", - " CDDDDDDDDDC ", - " CDDDDDDDD C ", - " CDDDDDDDDC ", - " C DDDDDDDC ", - " B C DDDDDDC ", - " BBB CDDDDDDC ", - " BCCCCC CDDDDDC ", - " CDDDDC CCDDD C ", - " CDDDDDC CCCCCC ", - " CDDDDDC CCCCC ", - " CDDDD C CCC ", - " CDDDCC ", - " CCCCC ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " CCCCCC ", - " CCDDDDDCC ", - " CCDDDDDDC ", - " C DDDDDC ", - " CCDDD C ", - " CCCC ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " " }, - { " ", - " CCCCCCCCCCC ", - " CCC DDDDDDDDDCCCC ", - " CCC DDDDDDDDDDDDDDDCC ", - " CCCDDDDDDDDDDDDDDDDDDDCC ", - " CCCDDDDDDDDDDDDDDDDDDDDDCC ", - " CCCCDDDDDDDDDDDDDDDDDDDDDDCC ", - " CCCC DDDDDDDDDDDDDDDDDDDDDDC ", - " CCCC DDDDDDDDDDDDDDDDDDDDCC ", - " CCCCCDDDDDDDDDDDDDDDDD C ", - " CCCDDDDDDDDDDDDDDD C ", - " CCDDDDDDDDDDDDDDDC ", - " CC DDDDDDDDDDDD C ", - " CCDDDDDDDDDDDD C ", - " CCDDDDDDDDDDDC ", - " CDDDDDDDDDDDC ", - " C DDDDDDDDD C ", - " C DDDDDDDDDC ", - " C DDDDDDDDDC ", - " C DDDDDDDDC ", - " C DDDDDDD C ", - " C DDDDDD C ", - " C DDDDDDC ", - " C DDDDDC ", - " C DDD C ", - " CC CCC ", - " BBCC CCCCC ", - " BC DCC CCCC ", - " CDDDDC ", - " CDDDDDC ", - " CDDDDD C ", - " CDDDDDC ", - " CDDD C ", - " CCCCC ", - " C ", - " ", - " ", - " ", - " ", - " CCCCC ", - " CCC DDCCC ", - " CC DDDDD C ", - " C DDDDDDC ", - " C DDDDDCC ", - " CC DD C ", - " CCCC ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " " }, - { " ", - " CC ", - " CCCCC CCCCCC ", - " CCCCDDDDDDDDDD CCC ", - " CCCCDDDDDDDDDDDDDD CC ", - " CCCCDDDDDDDDDDDDDDDDDCC ", - " CCCDDDDDDDDDDDDDDDDDD C ", - " CCCCDDDDDDDDDDDDDDDDDDCC ", - " CCCC DDDDDDDDDDDDDDDD C ", - " CCC DDDDDDDDDDDDDDDC ", - " CCCDDDDDDDDDDDDDDCC ", - " CCDDDDDDDDDDDDDC ", - " CCDDDDDDDDDDDDC ", - " C DDDDDDDDDDDC ", - " CCDDDDDDDDDD C ", - " C DDDDDDDDD C ", - " CCDDDDDDDDDC ", - " CDDDDDDDDCC ", - " C DDDDDD C ", - " C DDDDDDC ", - " C DDDDDCC ", - " CCDDDDCC ", - " CCC CCC ", - " CCCCCC ", - " CCCCC ", - " C ", - " ", - " CCCC ", - " CCDD C ", - " C DDDDC ", - " CDDDDDC ", - " CDDDDDDC ", - " CDDDDDCC ", - " C DDDCC ", - " CC CCCC ", - " CCCCCC ", - " ", - " ", - " CCCCC ", - " CCCC CCCC ", - " CCDDDDDDCC ", - " C DDDDDD C ", - " C DDDDDDC ", - " CCDDDDDC ", - " CCCCCC ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " " }, - { " ", - " ", - " CCCCC ", - " CCCCCCCCCCCC ", - " CCCC DDDDDDD CCC ", - " CCCCDDDDDDDDDDD CC ", - " CCCCDDDDDDDDDDDDD CC ", - " CCC DDDDDDDDDDDDD C ", - " CCC DDDDDDDDDDDD C ", - " CCC DDDDDDDDDDDDCC ", - " CC DDDDDDDDDDDCC ", - " CC DDDDDDDDDDCC ", - " CCDDDDDDDDDDC ", - " C DDDDDDDD C ", - " CC DDDDDDDCC ", - " C DDDDDDDCC ", - " CC DDDDDCC ", - " CCDDDDCC ", - " CC DDCCC ", - " CCCCCCC ", - " CCCCCC ", - " CCCC ", - " C ", - " ", - " ", - " ", - " ", - " ", - " CCCC ", - " CCDD C ", - " C DDDDCC ", - " CDDDDD C ", - " CDDDDDD C ", - " CDDDDDDCC ", - " C DDDDDCC ", - " CC DDD CC ", - " CCCCCCCCC ", - " CCCCCCCCCC ", - " CCCCCDD CCCC ", - " CCCDDDDDD CC ", - " CCDDDDDDD C ", - " CCDDDDDDD C ", - " C DDDDDDC ", - " CCCDDD C ", - " CCCC ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " " }, - { " ", - " ", - " ", - " ", - " CCCCCCCCC ", - " CCCCCCCCCCCC ", - " CCCCCCDDD CCCC ", - " CCCCCDDDDDD CCC ", - " CCCCDDDDDDDCCC ", - " CCCCDDDDDD CC ", - " CCC DDDDDDCC ", - " CCCDDDDDDCC ", - " CCCDDDDCCC ", - " CCCCDDDCCC ", - " CCCCCCCC ", - " CCCCCCCC ", - " CCCCCC ", - " CCCC ", - " CCC ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " CCCC ", - " CCDD CC ", - " CCDDDD C ", - " CDDDDDDC ", - " C DDDDDDCC ", - " C DDDDDD C ", - " CCDDDDDDDCC ", - " C DDDDDD CC ", - " CCDDDDDDDDCC ", - " CCDDDDDDDDCC ", - " C DDDDDDDDCC ", - " CC DDDDDDDDC ", - " CCDDDDDDD C ", - " CCDDDDDCC ", - " CCCCCCC ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " " }, - { " ", - " ", - " ", - " ", - " ", - " ", - " CCCC ", - " CCCCCCC ", - " CCCCCCC ", - " CCCCCCC ", - " CCCCCCC ", - " CCCCCC ", - " CCCC ", - " CCC ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " CCCC ", - " CC CC ", - " CDDDD C ", - " C DDDDDCC ", - " CDDDDDDDCC ", - " CDDDDDDD C ", - " CDDDDDDDDCC ", - " CCDDDDDDDDCC ", - " C DDDDDDDDCC ", - " CCDDDDDDDD C ", - " CCDDDDDDD C ", - " CCDDDDD CC ", - " CCC CC ", - " CCC ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " " }, - { " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " CC ", - " CCCCCC ", - " CC DD CC ", - " C DDDD C ", - " CCDDDDDDCC ", - " CCDDDDDDDCC ", - " CDDDDDDD C ", - " CCDDDDDDDCC ", - " C DDDDDDCC ", - " CC DDDDCCC ", - " CCC CCCC ", - " CCCC ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " " }, - { " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " CCCC ", - " CCCCCC ", - " CCCCCCC ", - " CCDDDCCC ", - " CCDDD CC ", - " CCCDDCCC ", - " CCCCCCC ", - " CCCCCC ", - " C ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " " }, - { " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " CCC ", - " CCCC ", - " CC ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", } }; - -} diff --git a/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/GT_MetaTileEntity_EM_ForgeOfGods.java b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/GT_MetaTileEntity_EM_ForgeOfGods.java index 360383956..fb19a3b45 100644 --- a/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/GT_MetaTileEntity_EM_ForgeOfGods.java +++ b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/GT_MetaTileEntity_EM_ForgeOfGods.java @@ -1,27 +1,31 @@ package com.github.technus.tectech.thing.metaTileEntity.multi; -import static com.github.technus.tectech.thing.casing.GT_Block_CasingsTT.texturePage; +import static com.github.technus.tectech.thing.casing.TT_Container_Casings.GodforgeCasings; import static com.github.technus.tectech.thing.casing.TT_Container_Casings.forgeOfGodsRenderBlock; -import static com.github.technus.tectech.thing.casing.TT_Container_Casings.sBlockCasingsBA0; -import static com.github.technus.tectech.thing.casing.TT_Container_Casings.sBlockCasingsTT; +import static com.github.technus.tectech.util.GodforgeMath.allowModuleConnection; +import static com.github.technus.tectech.util.GodforgeMath.calculateEnergyDiscountForModules; import static com.github.technus.tectech.util.GodforgeMath.calculateFuelConsumption; import static com.github.technus.tectech.util.GodforgeMath.calculateMaxFuelFactor; import static com.github.technus.tectech.util.GodforgeMath.calculateMaxHeatForModules; -import static com.github.technus.tectech.util.GodforgeMath.calucateMaxParallelForModules; -import static com.github.technus.tectech.util.GodforgeMath.calucateSpeedBonusForModules; +import static com.github.technus.tectech.util.GodforgeMath.calculateMaxParallelForModules; +import static com.github.technus.tectech.util.GodforgeMath.calculateProcessingVoltageForModules; +import static com.github.technus.tectech.util.GodforgeMath.calculateSpeedBonusForModules; +import static com.github.technus.tectech.util.GodforgeMath.calculateStartupFuelConsumption; +import static com.github.technus.tectech.util.GodforgeMath.queryMilestoneStats; +import static com.github.technus.tectech.util.GodforgeMath.setMiscModuleParameters; +import static com.github.technus.tectech.util.TT_Utility.toExponentForm; import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock; -import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlocksTiered; -import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose; -import static gregtech.api.enums.GT_HatchElement.InputBus; -import static gregtech.api.enums.GT_HatchElement.InputHatch; -import static gregtech.api.enums.GT_HatchElement.OutputBus; -import static gregtech.api.enums.GT_HatchElement.OutputHatch; +import static gregtech.api.enums.Mods.Avaritia; import static gregtech.api.metatileentity.BaseTileEntity.TOOLTIP_DELAY; +import static gregtech.api.util.GT_ModHandler.getModItem; import static gregtech.api.util.GT_RecipeBuilder.SECONDS; -import static gregtech.api.util.GT_StructureUtility.buildHatchAdder; import static gregtech.api.util.GT_Utility.formatNumbers; +import static java.lang.Math.floor; +import static java.lang.Math.log; +import static java.lang.Math.max; import static net.minecraft.util.StatCollector.translateToLocal; +import java.math.BigInteger; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; @@ -29,7 +33,6 @@ import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.init.Blocks; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; @@ -37,45 +40,58 @@ import net.minecraftforge.common.util.ForgeDirection; import net.minecraftforge.fluids.FluidStack; -import org.apache.commons.lang3.tuple.Pair; - import com.github.technus.tectech.TecTech; +import com.github.technus.tectech.thing.CustomItemList; +import com.github.technus.tectech.thing.block.GodforgeGlassBlock; import com.github.technus.tectech.thing.block.TileForgeOfGods; -import com.github.technus.tectech.thing.casing.TT_Container_Casings; import com.github.technus.tectech.thing.gui.TecTechUITextures; import com.github.technus.tectech.thing.metaTileEntity.multi.base.GT_MetaTileEntity_MultiblockBase_EM; import com.github.technus.tectech.thing.metaTileEntity.multi.base.render.TT_RenderedExtendedFacingTexture; import com.github.technus.tectech.thing.metaTileEntity.multi.godforge_modules.GT_MetaTileEntity_EM_BaseModule; +import com.github.technus.tectech.thing.metaTileEntity.multi.godforge_modules.GT_MetaTileEntity_EM_ExoticModule; +import com.github.technus.tectech.thing.metaTileEntity.multi.godforge_modules.GT_MetaTileEntity_EM_MoltenModule; +import com.github.technus.tectech.thing.metaTileEntity.multi.godforge_modules.GT_MetaTileEntity_EM_PlasmaModule; +import com.github.technus.tectech.thing.metaTileEntity.multi.godforge_modules.GT_MetaTileEntity_EM_SmeltingModule; import com.github.technus.tectech.util.CommonValues; -import com.google.common.collect.ImmutableList; +import com.google.common.math.LongMath; import com.gtnewhorizon.structurelib.alignment.constructable.IConstructable; import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable; -import com.gtnewhorizon.structurelib.structure.IItemSource; import com.gtnewhorizon.structurelib.structure.IStructureDefinition; +import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment; +import com.gtnewhorizons.modularui.api.ModularUITextures; import com.gtnewhorizons.modularui.api.drawable.IDrawable; +import com.gtnewhorizons.modularui.api.drawable.ItemDrawable; import com.gtnewhorizons.modularui.api.drawable.Text; import com.gtnewhorizons.modularui.api.drawable.UITexture; +import com.gtnewhorizons.modularui.api.forge.ItemStackHandler; import com.gtnewhorizons.modularui.api.math.Alignment; import com.gtnewhorizons.modularui.api.math.Color; +import com.gtnewhorizons.modularui.api.math.MainAxisAlignment; import com.gtnewhorizons.modularui.api.math.Pos2d; import com.gtnewhorizons.modularui.api.math.Size; import com.gtnewhorizons.modularui.api.screen.ModularWindow; import com.gtnewhorizons.modularui.api.screen.UIBuildContext; import com.gtnewhorizons.modularui.api.widget.IWidgetBuilder; +import com.gtnewhorizons.modularui.api.widget.Interactable; import com.gtnewhorizons.modularui.api.widget.Widget; import com.gtnewhorizons.modularui.common.widget.ButtonWidget; import com.gtnewhorizons.modularui.common.widget.DrawableWidget; +import com.gtnewhorizons.modularui.common.widget.DynamicPositionedColumn; import com.gtnewhorizons.modularui.common.widget.FakeSyncWidget; import com.gtnewhorizons.modularui.common.widget.FluidNameHolderWidget; import com.gtnewhorizons.modularui.common.widget.MultiChildWidget; +import com.gtnewhorizons.modularui.common.widget.ProgressBar; import com.gtnewhorizons.modularui.common.widget.Scrollable; +import com.gtnewhorizons.modularui.common.widget.SlotGroup; import com.gtnewhorizons.modularui.common.widget.TextWidget; import com.gtnewhorizons.modularui.common.widget.textfield.NumericWidget; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; -import gregtech.api.GregTech_API; +import gregtech.api.enums.ItemList; +import gregtech.api.enums.Materials; import gregtech.api.enums.MaterialsUEVplus; +import gregtech.api.enums.OrePrefixes; import gregtech.api.enums.Textures; import gregtech.api.gui.modularui.GT_UITextures; import gregtech.api.interfaces.IHatchElement; @@ -85,36 +101,99 @@ import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Input; import gregtech.api.util.GT_HatchElementBuilder; import gregtech.api.util.GT_Multiblock_Tooltip_Builder; +import gregtech.api.util.GT_OreDictUnificator; import gregtech.api.util.IGT_HatchAdder; public class GT_MetaTileEntity_EM_ForgeOfGods extends GT_MetaTileEntity_MultiblockBase_EM implements IConstructable, ISurvivalConstructable { - private static Textures.BlockIcons.CustomIcon ScreenOFF; private static Textures.BlockIcons.CustomIcon ScreenON; private int fuelConsumptionFactor = 1; private int selectedFuelType = 0; - private long fuelConsumption = 0; private int internalBattery = 0; + private int maxBatteryCharge = 100; + private int gravitonShardsAvailable = 0; + private int gravitonShardsSpent = 0; + private int ringAmount = 1; + private int stellarFuelAmount = 0; + private int neededStartupFuel = 0; + private long fuelConsumption = 0; + private long totalRecipesProcessed = 0; + private long totalFuelConsumed = 0; + private float totalExtensionsBuilt = 0; + private float powerMilestonePercentage = 0; + private float recipeMilestonePercentage = 0; + private float fuelMilestonePercentage = 0; + private float structureMilestonePercentage = 0; + private float invertedPowerMilestonePercentage = 0; + private float invertedRecipeMilestonePercentage = 0; + private float invertedFuelMilestonePercentage = 0; + private float invertedStructureMilestonePercentage = 0; + private BigInteger totalPowerConsumed = BigInteger.ZERO; + private boolean batteryCharging = false; + private boolean inversion = false; public ArrayList moduleHatches = new ArrayList<>(); + protected ItemStackHandler inputSlotHandler = new ItemStackHandler(16); - private static int spacetimeCompressionFieldMetadata = -1; - private int solenoidCoilMetadata = -1; private static final int FUEL_CONFIG_WINDOW_ID = 9; private static final int UPGRADE_TREE_WINDOW_ID = 10; private static final int INDIVIDUAL_UPGRADE_WINDOW_ID = 11; + private static final int BATTERY_CONFIG_WINDOW_ID = 12; + private static final int MILESTONE_WINDOW_ID = 13; + private static final int INDIVIDUAL_MILESTONE_WINDOW_ID = 14; + private static final int MANUAL_INSERTION_WINDOW_ID = 15; + private static final int TEXTURE_INDEX = 960; private static final int[] FIRST_SPLIT_UPGRADES = new int[] { 12, 13, 14 }; - private static final int[] RING_UPGRADES = new int[] { 26, 29 }; + private static final long POWER_MILESTONE_CONSTANT = LongMath.pow(10, 15); + private static final long RECIPE_MILESTONE_CONSTANT = LongMath.pow(10, 7); + private static final long FUEL_MILESTONE_CONSTANT = 10_000; + private static final long RECIPE_MILESTONE_T7_CONSTANT = RECIPE_MILESTONE_CONSTANT * LongMath.pow(6, 6); + private static final long FUEL_MILESTONE_T7_CONSTANT = FUEL_MILESTONE_CONSTANT * LongMath.pow(3, 6); + private static final BigInteger POWER_MILESTONE_T7_CONSTANT = BigInteger.valueOf(POWER_MILESTONE_CONSTANT) + .multiply(BigInteger.valueOf(LongMath.pow(9, 6))); + private static final double POWER_LOG_CONSTANT = Math.log(9); + private static final double RECIPE_LOG_CONSTANT = Math.log(6); + private static final double FUEL_LOG_CONSTANT = Math.log(3); protected static final String STRUCTURE_PIECE_MAIN = "main"; + protected static final String STRUCTURE_PIECE_SECOND_RING = "second_ring"; + protected static final String STRUCTURE_PIECE_THIRD_RING = "third_ring"; + private static final String TOOLTIP_BAR = EnumChatFormatting.BLUE + "--------------------------------------------"; + private static final ItemStack STELLAR_FUEL = Avaritia.isModLoaded() ? getModItem(Avaritia.ID, "Resource", 1, 8) + : GT_OreDictUnificator.get(OrePrefixes.block, Materials.CosmicNeutronium, 1); - private Boolean debugMode = true; + private final boolean debugMode = true; - public int survivalConstruct(ItemStack stackSize, int elementBudget, IItemSource source, EntityPlayerMP actor) { + public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) { if (mMachine) return -1; - int realBudget = elementBudget >= 200 ? elementBudget : Math.min(200, elementBudget * 5); // 200 blocks max per - // placement. - return survivialBuildPiece(STRUCTURE_PIECE_MAIN, stackSize, 31, 34, 0, realBudget, source, actor, false, true); + int realBudget = elementBudget >= 1000 ? elementBudget : Math.min(1000, elementBudget * 5); + // 1000 blocks max per placement. + int built = survivialBuildPiece(STRUCTURE_PIECE_MAIN, stackSize, 63, 20, 1, realBudget, env, false, true); + if (isUpgradeActive(26) && stackSize.stackSize > 1) { + built += survivialBuildPiece( + STRUCTURE_PIECE_SECOND_RING, + stackSize, + 55, + 11, + -67, + realBudget, + env, + false, + true); + } + if (isUpgradeActive(29) && stackSize.stackSize > 2) { + built += survivialBuildPiece( + STRUCTURE_PIECE_THIRD_RING, + stackSize, + 47, + 13, + -76, + realBudget, + env, + false, + true); + } + return built; } @Override @@ -124,53 +203,19 @@ public IStructureDefinition getStructure_EM() public static final IStructureDefinition STRUCTURE_DEFINITION = IStructureDefinition .builder() - .addShape("main", transpose(ForgeofGodsStructureString.godForge)) - + .addShape(STRUCTURE_PIECE_MAIN, ForgeOfGodsStructureString.MAIN_STRUCTURE) + .addShape(STRUCTURE_PIECE_SECOND_RING, ForgeOfGodsRingsStructureString.SECOND_RING) + .addShape(STRUCTURE_PIECE_THIRD_RING, ForgeOfGodsRingsStructureString.THIRD_RING) + .addElement('A', classicHatches(TEXTURE_INDEX + 3, 1, GodforgeCasings, 3)) + .addElement('B', ofBlock(GodforgeCasings, 0)).addElement('C', ofBlock(GodforgeCasings, 1)) + .addElement('D', ofBlock(GodforgeCasings, 2)).addElement('E', ofBlock(GodforgeCasings, 3)) + .addElement('F', ofBlock(GodforgeCasings, 4)).addElement('G', ofBlock(GodforgeCasings, 5)) + .addElement('H', ofBlock(GodforgeGlassBlock.INSTANCE, 0)).addElement('I', ofBlock(GodforgeCasings, 7)) .addElement( - 'A', - buildHatchAdder(GT_MetaTileEntity_EM_ForgeOfGods.class) - .atLeast(InputHatch, OutputHatch, InputBus, OutputBus).casingIndex(texturePage << 7).dot(1) - .buildAndChain(sBlockCasingsBA0, 12)) - .addElement('B', ofBlock(sBlockCasingsTT, 11)).addElement('C', ofBlock(sBlockCasingsTT, 12)) - .addElement( - 'D', - ofBlocksTiered( - (block, meta) -> block == GregTech_API.sSolenoidCoilCasings ? meta : -1, - ImmutableList.of( - Pair.of(GregTech_API.sSolenoidCoilCasings, 7), - Pair.of(GregTech_API.sSolenoidCoilCasings, 8), - Pair.of(GregTech_API.sSolenoidCoilCasings, 9), - Pair.of(GregTech_API.sSolenoidCoilCasings, 10)), - -1, - (t, meta) -> t.solenoidCoilMetadata = meta, - t -> t.solenoidCoilMetadata)) - .addElement( - 'E', - ofBlocksTiered( - (block, meta) -> block == TT_Container_Casings.SpacetimeCompressionFieldGenerators ? meta - : -1, - ImmutableList.of( - Pair.of(TT_Container_Casings.SpacetimeCompressionFieldGenerators, 0), - Pair.of(TT_Container_Casings.SpacetimeCompressionFieldGenerators, 1), - Pair.of(TT_Container_Casings.SpacetimeCompressionFieldGenerators, 2), - Pair.of(TT_Container_Casings.SpacetimeCompressionFieldGenerators, 3), - Pair.of(TT_Container_Casings.SpacetimeCompressionFieldGenerators, 4), - Pair.of(TT_Container_Casings.SpacetimeCompressionFieldGenerators, 5), - Pair.of(TT_Container_Casings.SpacetimeCompressionFieldGenerators, 6), - Pair.of(TT_Container_Casings.SpacetimeCompressionFieldGenerators, 7), - Pair.of(TT_Container_Casings.SpacetimeCompressionFieldGenerators, 8)), - -1, - (t, meta) -> spacetimeCompressionFieldMetadata = meta, - t -> spacetimeCompressionFieldMetadata)) - .addElement( - 'F', - buildHatchAdder(GT_MetaTileEntity_EM_ForgeOfGods.class).atLeast(InputHatch) - .casingIndex(texturePage << 7).dot(2).buildAndChain(sBlockCasingsBA0, 12)) - .addElement( - 'G', + 'J', GT_HatchElementBuilder.builder().atLeast(moduleElement.Module) - .casingIndex(texturePage << 7).dot(3).buildAndChain(sBlockCasingsBA0, 12)) - .build(); + .casingIndex(TEXTURE_INDEX).dot(3).buildAndChain(GodforgeCasings, 0)) + .addElement('K', ofBlock(GodforgeCasings, 6)).build(); public GT_MetaTileEntity_EM_ForgeOfGods(int aID, String aName, String aNameRegional) { super(aID, aName, aNameRegional); @@ -188,8 +233,7 @@ public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { @Override @SideOnly(Side.CLIENT) public void registerIcons(IIconRegister aBlockIconRegister) { - ScreenOFF = new Textures.BlockIcons.CustomIcon("iconsets/EM_BHG"); - ScreenON = new Textures.BlockIcons.CustomIcon("iconsets/EM_BHG_ACTIVE"); + ScreenON = new Textures.BlockIcons.CustomIcon("iconsets/GODFORGE_CONTROLLER"); super.registerIcons(aBlockIconRegister); } @@ -197,15 +241,21 @@ public void registerIcons(IIconRegister aBlockIconRegister) { public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection facing, int colorIndex, boolean aActive, boolean aRedstone) { if (side == facing) { - return new ITexture[] { Textures.BlockIcons.casingTexturePages[texturePage][12], - new TT_RenderedExtendedFacingTexture(aActive ? ScreenON : ScreenOFF) }; + return new ITexture[] { Textures.BlockIcons.getCasingTextureForId(TEXTURE_INDEX + 1), + new TT_RenderedExtendedFacingTexture(ScreenON) }; } - return new ITexture[] { Textures.BlockIcons.casingTexturePages[texturePage][12] }; + return new ITexture[] { Textures.BlockIcons.getCasingTextureForId(TEXTURE_INDEX + 1) }; } @Override public void construct(ItemStack stackSize, boolean hintsOnly) { - structureBuild_EM(STRUCTURE_PIECE_MAIN, 31, 34, 0, stackSize, hintsOnly); + structureBuild_EM(STRUCTURE_PIECE_MAIN, 63, 14, 1, stackSize, hintsOnly); + if (isUpgradeActive(26) && stackSize.stackSize > 1) { + buildPiece(STRUCTURE_PIECE_SECOND_RING, stackSize, hintsOnly, 55, 11, -67); + } + if (isUpgradeActive(29) && stackSize.stackSize > 2) { + buildPiece(STRUCTURE_PIECE_THIRD_RING, stackSize, hintsOnly, 47, 13, -76); + } } private final ArrayList validFuelList = new ArrayList<>() { @@ -220,11 +270,10 @@ public void construct(ItemStack stackSize, boolean hintsOnly) { @Override public boolean checkMachine_EM(IGregTechTileEntity iGregTechTileEntity, ItemStack itemStack) { - spacetimeCompressionFieldMetadata = -1; moduleHatches.clear(); // Check structure of multi. - if (!structureCheck_EM(STRUCTURE_PIECE_MAIN, 31, 34, 0)) { + if (!structureCheck_EM(STRUCTURE_PIECE_MAIN, 63, 14, 1)) { return false; } @@ -248,6 +297,13 @@ public boolean checkMachine_EM(IGregTechTileEntity iGregTechTileEntity, ItemStac return false; } + if (isUpgradeActive(26) && checkPiece(STRUCTURE_PIECE_SECOND_RING, 55, 11, -67)) { + ringAmount = 2; + if (isUpgradeActive(29) && checkPiece(STRUCTURE_PIECE_THIRD_RING, 47, 13, -76)) { + ringAmount = 3; + } + } + mHardHammer = true; mSoftHammer = true; mScrewdriver = true; @@ -263,46 +319,92 @@ public boolean checkMachine_EM(IGregTechTileEntity iGregTechTileEntity, ItemStac public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { super.onPostTick(aBaseMetaTileEntity, aTick); if (aBaseMetaTileEntity.isServerSide()) { - if (getBaseMetaTileEntity().isAllowedToWork()) { - ticker++; - // Check and drain fuel - if (ticker % SECONDS == 0) { - ticker = 0; - FluidStack fluidInHatch = mInputHatches.get(0).getFluid(); - - fuelConsumption = (long) calculateFuelConsumption(this); - if (fluidInHatch != null && fluidInHatch.isFluidEqual(validFuelList.get(selectedFuelType))) { - FluidStack fluidNeeded = new FluidStack( - validFuelList.get(selectedFuelType), - (int) fuelConsumption); - FluidStack fluidReal = mInputHatches.get(0).drain(fluidNeeded.amount, true); - if (fluidReal == null || fluidReal.amount < fluidNeeded.amount) { - reduceBattery(1); - } else { - increaseBattery(1); + ticker++; + // Check and drain fuel + if (ticker % (5 * SECONDS) == 0) { + ticker = 0; + FluidStack fluidInHatch = null; + if (mInputHatches != null && mInputHatches.size() != 0) { + fluidInHatch = mInputHatches.get(0).getFluid(); + } + int maxModuleCount = 8; + + if (upgrades[26]) { + maxModuleCount += 4; + } + if (upgrades[29]) { + maxModuleCount += 4; + } + if (getBaseMetaTileEntity().isAllowedToWork()) { + if (internalBattery == 0) { + + for (ItemStack itemStack : mInputBusses.get(0).getRealInventory()) { + if (itemStack != null && itemStack.isItemEqual(STELLAR_FUEL)) { + stellarFuelAmount += itemStack.stackSize; + itemStack.stackSize = 0; + } + } + neededStartupFuel = calculateStartupFuelConsumption(this); + if (stellarFuelAmount >= neededStartupFuel) { + stellarFuelAmount -= neededStartupFuel; + increaseBattery(neededStartupFuel); } } else { - reduceBattery(1); + fuelConsumption = (long) calculateFuelConsumption(this) * 5 * (batteryCharging ? 2 : 1); + if (fluidInHatch != null && fluidInHatch.isFluidEqual(validFuelList.get(selectedFuelType))) { + FluidStack fluidNeeded = new FluidStack( + validFuelList.get(selectedFuelType), + (int) fuelConsumption); + FluidStack fluidReal = mInputHatches.get(0).drain(fluidNeeded.amount, true); + if (fluidReal == null || fluidReal.amount < fluidNeeded.amount) { + reduceBattery(fuelConsumptionFactor); + } else { + totalFuelConsumed += getFuelFactor(); + if (batteryCharging) { + increaseBattery(fuelConsumptionFactor); + } + } + } else { + reduceBattery(fuelConsumptionFactor); + } } - // Do module calculations and checks - if (moduleHatches.size() > 0 && internalBattery > 0) { - for (GT_MetaTileEntity_EM_BaseModule module : moduleHatches) { + } else { + reduceBattery(fuelConsumptionFactor); + } + + determineCompositionMilestoneLevel(); + checkInversionStatus(); + determineMilestoneProgress(); + if (!debugMode) { + determineGravitonShardAmount(); + } + + // Do module calculations and checks + if (moduleHatches.size() > 0 && internalBattery > 0 && moduleHatches.size() <= maxModuleCount) { + for (GT_MetaTileEntity_EM_BaseModule module : moduleHatches) { + if (allowModuleConnection(module, this)) { module.connect(); - module.setHeat(calculateMaxHeatForModules(module, this)); - module.setSpeedBonus(calucateSpeedBonusForModules(module, this)); - module.setMaxParallel(calucateMaxParallelForModules(module, this)); + calculateMaxHeatForModules(module, this); + calculateSpeedBonusForModules(module, this); + calculateMaxParallelForModules(module, this); + calculateEnergyDiscountForModules(module, this); + setMiscModuleParameters(module, this); + queryMilestoneStats(module, this); + if (!upgrades[28]) { + calculateProcessingVoltageForModules(module, this); + } + } else { + module.disconnect(); } } - } - } else { - if (moduleHatches.size() > 0) { + } else if (moduleHatches.size() > maxModuleCount) { for (GT_MetaTileEntity_EM_BaseModule module : moduleHatches) { module.disconnect(); } } + if (mEfficiency < 0) mEfficiency = 0; + fixAllMaintenance(); } - if (mEfficiency < 0) mEfficiency = 0; - fixAllMaintenance(); } } @@ -376,11 +478,11 @@ private void createRenderBlock() { @Override public String[] getInfoData() { ArrayList str = new ArrayList<>(Arrays.asList(super.getInfoData())); - str.add("Output Buses:" + formatNumbers(mOutputBusses.size())); - str.add("Output Hatches:" + formatNumbers(mOutputHatches.size())); - str.add("Input Buses:" + formatNumbers(mInputBusses.size())); - str.add("Input Hatches:" + formatNumbers(mInputHatches.size())); - str.add("Max Parallel:" + formatNumbers(Math.pow(4, spacetimeCompressionFieldMetadata + 1))); + str.add(TOOLTIP_BAR); + str.add("Number of Rings: " + EnumChatFormatting.GOLD + ringAmount); + str.add("Total Upgrades Unlocked: " + EnumChatFormatting.GOLD + getTotalActiveUpgrades()); + str.add("Connected Modules: " + EnumChatFormatting.GOLD + moduleHatches.size()); + str.add(TOOLTIP_BAR); return str.toArray(new String[0]); } @@ -413,7 +515,7 @@ public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildCont if (doesBindPlayerInventory()) { builder.widget( new DrawableWidget().setDrawable(TecTechUITextures.BACKGROUND_SCREEN_BLUE).setPos(4, 4) - .setSize(190, 91)); + .setSize(190, 85)); } else { builder.widget( new DrawableWidget().setDrawable(TecTechUITextures.BACKGROUND_SCREEN_BLUE_NO_INVENTORY).setPos(4, 4) @@ -422,6 +524,10 @@ public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildCont buildContext.addSyncedWindow(UPGRADE_TREE_WINDOW_ID, this::createUpgradeTreeWindow); buildContext.addSyncedWindow(INDIVIDUAL_UPGRADE_WINDOW_ID, this::createIndividualUpgradeWindow); buildContext.addSyncedWindow(FUEL_CONFIG_WINDOW_ID, this::createFuelConfigWindow); + buildContext.addSyncedWindow(BATTERY_CONFIG_WINDOW_ID, this::createBatteryWindow); + buildContext.addSyncedWindow(MILESTONE_WINDOW_ID, this::createMilestoneWindow); + buildContext.addSyncedWindow(INDIVIDUAL_MILESTONE_WINDOW_ID, this::createIndividualMilestoneWindow); + buildContext.addSyncedWindow(MANUAL_INSERTION_WINDOW_ID, this::createManualInsertionWindow); builder.widget( new ButtonWidget().setOnClick( (clickData, widget) -> { @@ -431,33 +537,61 @@ public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildCont button.add(TecTechUITextures.BUTTON_CELESTIAL_32x32); button.add(TecTechUITextures.OVERLAY_BUTTON_ARROW_BLUE_UP); return button.toArray(new IDrawable[0]); - }).addTooltip("Path of Celestial Transcendence").setPos(174, 167)) + }).addTooltip("Path of Celestial Transcendence").setPos(174, 167) + .setTooltipShowUpDelay(TOOLTIP_DELAY)) .widget( new DrawableWidget().setDrawable(TecTechUITextures.PICTURE_HEAT_SINK_SMALL).setPos(174, 183) .setSize(16, 6)) + .widget(new ButtonWidget().setOnClick((clickData, widget) -> { + if (!widget.isClient()) { + widget.getContext().openSyncedWindow(FUEL_CONFIG_WINDOW_ID); + } + }).setSize(16, 16).setBackground(() -> { + List button = new ArrayList<>(); + button.add(TecTechUITextures.BUTTON_CELESTIAL_32x32); + button.add(TecTechUITextures.OVERLAY_BUTTON_HEAT_ON); + return button.toArray(new IDrawable[0]); + }).addTooltip(translateToLocal("fog.button.fuelconfig.tooltip")).setPos(174, 110) + .setTooltipShowUpDelay(TOOLTIP_DELAY)) .widget( - new ButtonWidget().setOnClick( - (clickData, widget) -> { - if (!widget.isClient()) widget.getContext().openSyncedWindow(FUEL_CONFIG_WINDOW_ID); - }).setSize(16, 16).setBackground(() -> { - List button = new ArrayList<>(); - button.add(TecTechUITextures.BUTTON_CELESTIAL_32x32); - button.add(TecTechUITextures.OVERLAY_BUTTON_HEAT_ON); - return button.toArray(new IDrawable[0]); - }).addTooltip(translateToLocal("fog.button.fuelconfig.tooltip")).setPos(174, 129)) - .widget( - TextWidget.dynamicText(this::storedFuel).setDefaultColor(EnumChatFormatting.WHITE).setPos(3, 5) - .setSize(74, 34)); - - Widget powerSwitchButton = createPowerSwitchButton(); - builder.widget(powerSwitchButton) + TextWidget.dynamicText(this::storedFuel).setDefaultColor(EnumChatFormatting.WHITE).setPos(6, 8) + .setSize(74, 34)) + .widget(createPowerSwitchButton()).widget(createBatteryButton(builder)) .widget(new FakeSyncWidget.BooleanSyncer(() -> getBaseMetaTileEntity().isAllowedToWork(), val -> { if (val) { getBaseMetaTileEntity().enableWorking(); } else { getBaseMetaTileEntity().disableWorking(); } - })); + })).widget(new ButtonWidget().setOnClick((clickData, widget) -> { + if (!widget.isClient()) { + checkMachine_EM(this.getBaseMetaTileEntity(), null); + } + }).setSize(16, 16).setBackground(() -> { + List button = new ArrayList<>(); + button.add(TecTechUITextures.BUTTON_CELESTIAL_32x32); + button.add(TecTechUITextures.OVERLAY_CYCLIC_BLUE); + return button.toArray(new IDrawable[0]); + }).addTooltip(translateToLocal("fog.button.structurecheck.tooltip")).setPos(8, 91) + .setTooltipShowUpDelay(TOOLTIP_DELAY)) + .widget(new ButtonWidget().setOnClick((clickData, widget) -> { + if (!widget.isClient()) { + widget.getContext().openSyncedWindow(MILESTONE_WINDOW_ID); + } + }).setSize(16, 16).setBackground(() -> { + List button = new ArrayList<>(); + button.add(TecTechUITextures.BUTTON_CELESTIAL_32x32); + button.add(TecTechUITextures.OVERLAY_BUTTON_FLAG); + return button.toArray(new IDrawable[0]); + }).addTooltip(translateToLocal("fog.button.milestones.tooltip")).setTooltipShowUpDelay(TOOLTIP_DELAY) + .setPos(174, 91)); + } + + @Override + public void addGregTechLogo(ModularWindow.Builder builder) { + builder.widget( + new DrawableWidget().setDrawable(TecTechUITextures.PICTURE_GODFORGE_LOGO).setSize(18, 18) + .setPos(172, 67)); } @Override @@ -483,6 +617,57 @@ protected ButtonWidget createPowerSwitchButton() { return (ButtonWidget) button; } + protected Widget createBatteryButton(IWidgetBuilder builder) { + Widget button = new ButtonWidget().setOnClick((clickData, widget) -> { + TecTech.proxy.playSound(getBaseMetaTileEntity(), "fx_click"); + if (clickData.mouseButton == 0) { + batteryCharging = !batteryCharging; + } else if (clickData.mouseButton == 1 && !widget.isClient() && upgrades[8]) { + widget.getContext().openSyncedWindow(BATTERY_CONFIG_WINDOW_ID); + } + }).setPlayClickSound(false).setBackground(() -> { + List ret = new ArrayList<>(); + ret.add(TecTechUITextures.BUTTON_CELESTIAL_32x32); + if (batteryCharging) { + ret.add(TecTechUITextures.OVERLAY_BUTTON_BATTERY_ON); + } else { + ret.add(TecTechUITextures.OVERLAY_BUTTON_BATTERY_OFF); + } + return ret.toArray(new IDrawable[0]); + }).setPos(174, 129).setSize(16, 16); + button.addTooltip(translateToLocal("fog.button.battery.tooltip.01")) + .addTooltip(EnumChatFormatting.GRAY + translateToLocal("fog.button.battery.tooltip.02")) + .setTooltipShowUpDelay(TOOLTIP_DELAY).attachSyncer( + new FakeSyncWidget.BooleanSyncer(() -> batteryCharging, val -> batteryCharging = val), + builder); + return button; + } + + protected ModularWindow createBatteryWindow(final EntityPlayer player) { + final int WIDTH = 78; + final int HEIGHT = 52; + final int PARENT_WIDTH = getGUIWidth(); + final int PARENT_HEIGHT = getGUIHeight(); + ModularWindow.Builder builder = ModularWindow.builder(WIDTH, HEIGHT); + builder.setBackground(GT_UITextures.BACKGROUND_SINGLEBLOCK_DEFAULT); + builder.setGuiTint(getGUIColorization()); + builder.setDraggable(true); + builder.setPos( + (size, window) -> Alignment.Center.getAlignedPos(size, new Size(PARENT_WIDTH, PARENT_HEIGHT)).add( + Alignment.BottomRight + .getAlignedPos(new Size(PARENT_WIDTH, PARENT_HEIGHT), new Size(WIDTH, HEIGHT)) + .add(WIDTH - 3, 0).subtract(0, 10))); + builder.widget( + TextWidget.localised("gt.blockmachines.multimachine.FOG.batteryinfo").setPos(3, 4).setSize(74, 20)) + .widget( + new NumericWidget().setSetter(val -> maxBatteryCharge = (int) val) + .setGetter(() -> maxBatteryCharge).setBounds(1, Integer.MAX_VALUE).setDefaultValue(100) + .setScrollValues(1, 4, 64).setTextAlignment(Alignment.Center) + .setTextColor(Color.WHITE.normal).setSize(70, 18).setPos(4, 25) + .setBackground(GT_UITextures.BACKGROUND_TEXT_FIELD)); + return builder.build(); + } + protected ModularWindow createFuelConfigWindow(final EntityPlayer player) { final int WIDTH = 78; final int HEIGHT = 130; @@ -502,16 +687,16 @@ protected ModularWindow createFuelConfigWindow(final EntityPlayer player) { new NumericWidget().setSetter(val -> fuelConsumptionFactor = (int) val) .setGetter(() -> fuelConsumptionFactor).setBounds(1, calculateMaxFuelFactor(this)) .setDefaultValue(1).setScrollValues(1, 4, 64).setTextAlignment(Alignment.Center) - .setTextColor(Color.WHITE.normal).setSize(70, 18).setPos(3, 35) + .setTextColor(Color.WHITE.normal).setSize(70, 18).setPos(4, 35) .setBackground(GT_UITextures.BACKGROUND_TEXT_FIELD)) .widget( - new DrawableWidget().setDrawable(GT_UITextures.PICTURE_INFORMATION).setPos(65, 25) - .setSize(4, 10) + new DrawableWidget().setDrawable(ModularUITextures.ICON_INFO).setPos(64, 24).setSize(10, 10) .addTooltip(translateToLocal("gt.blockmachines.multimachine.FOG.fuelinfo.0")) .addTooltip(translateToLocal("gt.blockmachines.multimachine.FOG.fuelinfo.1")) .addTooltip(translateToLocal("gt.blockmachines.multimachine.FOG.fuelinfo.2")) .addTooltip(translateToLocal("gt.blockmachines.multimachine.FOG.fuelinfo.3")) - .addTooltip(translateToLocal("gt.blockmachines.multimachine.FOG.fuelinfo.4"))) + .addTooltip(translateToLocal("gt.blockmachines.multimachine.FOG.fuelinfo.4")) + .setTooltipShowUpDelay(TOOLTIP_DELAY)) .widget( TextWidget.localised("gt.blockmachines.multimachine.FOG.fueltype").setPos(3, 57) .setSize(74, 24)) @@ -533,7 +718,7 @@ public void buildTooltip(List tooltip) { addFluidNameInfo(tooltip, fluid); addAdditionalFluidInfo(tooltip, fluid); } - }.setPos(1, 1).setSize(16, 16)) + }.setTooltipShowUpDelay(TOOLTIP_DELAY).setPos(1, 1).setSize(16, 16)) .addChild(new ButtonWidget().setOnClick((clickData, widget) -> { TecTech.proxy.playSound(getBaseMetaTileEntity(), "fx_click"); selectedFuelType = 0; @@ -561,7 +746,7 @@ public void buildTooltip(List tooltip) { addFluidNameInfo(tooltip, fluid); addAdditionalFluidInfo(tooltip, fluid); } - }.setPos(1, 1).setSize(16, 16)) + }.setTooltipShowUpDelay(TOOLTIP_DELAY).setPos(1, 1).setSize(16, 16)) .addChild(new ButtonWidget().setOnClick((clickData, widget) -> { TecTech.proxy.playSound(getBaseMetaTileEntity(), "fx_click"); selectedFuelType = 1; @@ -588,7 +773,7 @@ public void buildTooltip(List tooltip) { addFluidNameInfo(tooltip, fluid); addAdditionalFluidInfo(tooltip, fluid); } - }.setPos(1, 1).setSize(16, 16)) + }.setTooltipShowUpDelay(TOOLTIP_DELAY).setPos(1, 1).setSize(16, 16)) .addChild(new ButtonWidget().setOnClick((clickData, widget) -> { TecTech.proxy.playSound(getBaseMetaTileEntity(), "fx_click"); selectedFuelType = 2; @@ -605,8 +790,181 @@ public void buildTooltip(List tooltip) { return builder.build(); } + private final int[] milestoneProgress = new int[] { 0, 0, 0, 0 }; + + protected ModularWindow createMilestoneWindow(final EntityPlayer player) { + final int WIDTH = 400; + final int HEIGHT = 300; + ModularWindow.Builder builder = ModularWindow.builder(WIDTH, HEIGHT); + builder.setBackground(TecTechUITextures.BACKGROUND_SPACE); + builder.setGuiTint(getGUIColorization()); + builder.setDraggable(true); + builder.widget(createMilestoneButton(0, 80, 100, new Pos2d(62, 24))); + builder.widget(createMilestoneButton(1, 70, 98, new Pos2d(263, 25))); + builder.widget(createMilestoneButton(2, 100, 100, new Pos2d(52, 169))); + builder.widget(createMilestoneButton(3, 100, 100, new Pos2d(248, 169))); + builder.widget( + TextWidget.localised("gt.blockmachines.multimachine.FOG.powermilestone") + .setDefaultColor(EnumChatFormatting.GOLD).setPos(77, 45).setSize(50, 30)); + builder.widget( + TextWidget.localised("gt.blockmachines.multimachine.FOG.recipemilestone") + .setDefaultColor(EnumChatFormatting.GOLD).setPos(268, 45).setSize(60, 30)); + builder.widget( + TextWidget.localised("gt.blockmachines.multimachine.FOG.fuelmilestone") + .setDefaultColor(EnumChatFormatting.GOLD).setPos(77, 190).setSize(50, 30)); + builder.widget( + TextWidget.localised("gt.blockmachines.multimachine.FOG.purchasablemilestone") + .setDefaultColor(EnumChatFormatting.GOLD).setPos(268, 190).setSize(60, 30)); + builder.widget( + new DrawableWidget().setDrawable(TecTechUITextures.PROGRESSBAR_GODFORGE_MILESTONE_BACKGROUND) + .setPos(37, 70).setSize(130, 7)) + .widget( + new DrawableWidget().setDrawable(TecTechUITextures.PROGRESSBAR_GODFORGE_MILESTONE_BACKGROUND) + .setPos(233, 70).setSize(130, 7)) + .widget( + new DrawableWidget().setDrawable(TecTechUITextures.PROGRESSBAR_GODFORGE_MILESTONE_BACKGROUND) + .setPos(37, 215).setSize(130, 7)) + .widget( + new DrawableWidget().setDrawable(TecTechUITextures.PROGRESSBAR_GODFORGE_MILESTONE_BACKGROUND) + .setPos(233, 215).setSize(130, 7)); + builder.widget( + new ProgressBar().setProgress(() -> powerMilestonePercentage).setDirection(ProgressBar.Direction.RIGHT) + .setTexture(TecTechUITextures.PROGRESSBAR_GODFORGE_MILESTONE_RED, 130).setSynced(true, false) + .setSize(130, 7).setPos(37, 70).addTooltip(milestoneProgressText(0, false)) + .setTooltipShowUpDelay(TOOLTIP_DELAY)) + .widget( + new ProgressBar().setProgress(() -> recipeMilestonePercentage) + .setDirection(ProgressBar.Direction.RIGHT) + .setTexture(TecTechUITextures.PROGRESSBAR_GODFORGE_MILESTONE_PURPLE, 130) + .setSynced(true, false).setSize(130, 7).setPos(233, 70) + .addTooltip(milestoneProgressText(1, false)).setTooltipShowUpDelay(TOOLTIP_DELAY)) + .widget( + new ProgressBar().setProgress(() -> fuelMilestonePercentage) + .setDirection(ProgressBar.Direction.RIGHT) + .setTexture(TecTechUITextures.PROGRESSBAR_GODFORGE_MILESTONE_BLUE, 130) + .setSynced(true, false).setSize(130, 7).setPos(37, 215) + .addTooltip(milestoneProgressText(2, false)).setTooltipShowUpDelay(TOOLTIP_DELAY)) + .widget( + new ProgressBar().setProgress(() -> structureMilestonePercentage) + .setDirection(ProgressBar.Direction.RIGHT) + .setTexture(TecTechUITextures.PROGRESSBAR_GODFORGE_MILESTONE_RAINBOW, 130) + .setSynced(true, false).setSize(130, 7).setPos(233, 215) + .addTooltip(milestoneProgressText(3, false)).setTooltipShowUpDelay(TOOLTIP_DELAY)) + .widget( + new ProgressBar().setProgress(() -> invertedPowerMilestonePercentage) + .setDirection(ProgressBar.Direction.LEFT) + .setTexture(TecTechUITextures.PROGRESSBAR_GODFORGE_MILESTONE_RED_INVERTED, 130) + .setSynced(true, false).setSize(130, 7).setPos(37, 70) + .addTooltip(milestoneProgressText(0, false)).setTooltipShowUpDelay(TOOLTIP_DELAY)) + .widget( + new ProgressBar().setProgress(() -> invertedRecipeMilestonePercentage) + .setDirection(ProgressBar.Direction.LEFT) + .setTexture(TecTechUITextures.PROGRESSBAR_GODFORGE_MILESTONE_PURPLE_INVERTED, 130) + .setSynced(true, false).setSize(130, 7).setPos(233, 70) + .addTooltip(milestoneProgressText(1, false)).setTooltipShowUpDelay(TOOLTIP_DELAY)) + .widget( + new ProgressBar().setProgress(() -> invertedFuelMilestonePercentage) + .setDirection(ProgressBar.Direction.LEFT) + .setTexture(TecTechUITextures.PROGRESSBAR_GODFORGE_MILESTONE_BLUE_INVERTED, 130) + .setSynced(true, false).setSize(130, 7).setPos(37, 215) + .addTooltip(milestoneProgressText(2, false)).setTooltipShowUpDelay(TOOLTIP_DELAY)) + .widget( + new ProgressBar().setProgress(() -> invertedStructureMilestonePercentage) + .setDirection(ProgressBar.Direction.LEFT) + .setTexture(TecTechUITextures.PROGRESSBAR_GODFORGE_MILESTONE_RAINBOW_INVERTED, 130) + .setSynced(true, false).setSize(130, 7).setPos(233, 215) + .addTooltip(milestoneProgressText(3, false)).setTooltipShowUpDelay(TOOLTIP_DELAY)) + .widget(ButtonWidget.closeWindowButton(true).setPos(382, 6)); + return builder.build(); + } + + protected ModularWindow createIndividualMilestoneWindow(final EntityPlayer player) { + final int WIDTH = 150; + final int HEIGHT = 150; + int symbol_width; + int symbol_height; + String milestoneType; + ModularWindow.Builder builder = ModularWindow.builder(WIDTH, HEIGHT); + UITexture symbol; + switch (currentMilestoneID) { + case 1 -> { + symbol = TecTechUITextures.PICTURE_GODFORGE_MILESTONE_CONVERSION; + symbol_width = 54; + symbol_height = 75; + milestoneType = "recipe"; + } + case 2 -> { + symbol = TecTechUITextures.PICTURE_GODFORGE_MILESTONE_CATALYST; + symbol_width = 75; + symbol_height = 75; + milestoneType = "fuel"; + } + case 3 -> { + symbol = TecTechUITextures.PICTURE_GODFORGE_MILESTONE_COMPOSITION; + symbol_width = 75; + symbol_height = 75; + milestoneType = "purchasable"; + } + default -> { + symbol = TecTechUITextures.PICTURE_GODFORGE_MILESTONE_CHARGE; + symbol_width = 60; + symbol_height = 75; + milestoneType = "power"; + } + } + + builder.setBackground(TecTechUITextures.BACKGROUND_GLOW_WHITE); + builder.setDraggable(true); + builder.widget(ButtonWidget.closeWindowButton(true).setPos(134, 4)) + .widget( + new DrawableWidget().setDrawable(symbol).setSize(symbol_width, symbol_height) + .setPos((WIDTH - symbol_width) / 2, (HEIGHT - symbol_height) / 2)) + .widget( + TextWidget.localised("gt.blockmachines.multimachine.FOG." + milestoneType + "milestone") + .setDefaultColor(EnumChatFormatting.GOLD).setTextAlignment(Alignment.Center) + .setPos(0, 8).setSize(150, 15)) + .widget( + TextWidget.dynamicText(this::inversionStatusText).setDefaultColor(EnumChatFormatting.AQUA) + .setTextAlignment(Alignment.Center).setScale(0.8f).setPos(0, 120).setSize(150, 15)) + .widget( + TextWidget.dynamicText(() -> totalMilestoneProgress(currentMilestoneID)).setScale(0.7f) + .setDefaultColor(EnumChatFormatting.WHITE).setTextAlignment(Alignment.Center) + .setPos(5, 30).setSize(140, 30)) + .widget( + TextWidget.dynamicText(() -> currentMilestone(currentMilestoneID)).setScale(0.7f) + .setDefaultColor(EnumChatFormatting.WHITE).setTextAlignment(Alignment.Center) + .setPos(5, 50).setSize(140, 30)) + .widget( + TextWidget.dynamicText(() -> milestoneProgressText(currentMilestoneID, true)).setScale(0.7f) + .setDefaultColor(EnumChatFormatting.WHITE).setSize(140, 30).setPos(5, 70)) + .widget( + TextWidget.dynamicText(() -> gravitonShardAmountText(currentMilestoneID)).setScale(0.7f) + .setDefaultColor(EnumChatFormatting.WHITE).setSize(140, 30).setPos(5, 90)); + + return builder.build(); + } + + private int currentMilestoneID = 0; + + private Widget createMilestoneButton(int milestoneID, int width, int height, Pos2d pos) { + return new ButtonWidget().setOnClick((clickData, widget) -> { + currentMilestoneID = milestoneID; + if (!widget.isClient()) { + widget.getContext().openSyncedWindow(INDIVIDUAL_MILESTONE_WINDOW_ID); + } + }).setSize(width, height).setBackground(() -> switch (milestoneID) { + case 1 -> new IDrawable[] { TecTechUITextures.PICTURE_GODFORGE_MILESTONE_CONVERSION_GLOW }; + case 2 -> new IDrawable[] { TecTechUITextures.PICTURE_GODFORGE_MILESTONE_CATALYST_GLOW }; + case 3 -> new IDrawable[] { TecTechUITextures.PICTURE_GODFORGE_MILESTONE_COMPOSITION_GLOW }; + default -> new IDrawable[] { TecTechUITextures.PICTURE_GODFORGE_MILESTONE_CHARGE_GLOW }; + }).addTooltip(translateToLocal("gt.blockmachines.multimachine.FOG.milestoneinfo")).setPos(pos) + .setTooltipShowUpDelay(TOOLTIP_DELAY); + } + private int currentUpgradeID = 0; private int currentColorCode = 0; + private int currentMilestoneBG = 0; + private int gravitonShardCost = 0; private int[] prereqUpgrades = new int[] {}; private int[] followupUpgrades = new int[] {}; private boolean allPrereqRequired = false; @@ -618,309 +976,380 @@ protected ModularWindow createUpgradeTreeWindow(final EntityPlayer player) { final int PARENT_WIDTH = 300; final int PARENT_HEIGHT = 1000; ModularWindow.Builder builder = ModularWindow.builder(PARENT_WIDTH, PARENT_HEIGHT); - scrollable.widget( - createUpgradeBox(0, 0, new int[] {}, false, new int[] { 1 }, false, new Pos2d(126, 56), scrollable)) + scrollable + .widget( + createUpgradeBox( + 0, + 0, + 3, + new int[] {}, + false, + new int[] { 1 }, + false, + 0, + new Pos2d(126, 56), + scrollable)) .widget( createUpgradeBox( 1, 0, + 1, new int[] { 0 }, false, new int[] { 2, 3 }, false, + 1, new Pos2d(126, 116), scrollable)) .widget( createUpgradeBox( 2, 0, + 2, new int[] { 1 }, false, new int[] { 4, 5 }, false, + 1, new Pos2d(96, 176), scrollable)) .widget( createUpgradeBox( 3, 0, + 2, new int[] { 1 }, false, new int[] { 5, 6 }, false, + 1, new Pos2d(156, 176), scrollable)) .widget( createUpgradeBox( 4, 0, + 0, new int[] { 2 }, false, new int[] { 8 }, false, + 1, new Pos2d(66, 236), scrollable)) .widget( createUpgradeBox( 5, 0, + 3, new int[] { 2, 3 }, false, new int[] { 7 }, false, + 1, new Pos2d(126, 236), scrollable)) .widget( createUpgradeBox( 6, 0, + 1, new int[] { 3 }, false, new int[] { 10 }, false, + 1, new Pos2d(186, 236), scrollable)) .widget( createUpgradeBox( 7, 0, + 3, new int[] { 5 }, false, new int[] { 8, 9, 10 }, false, + 2, new Pos2d(126, 296), scrollable)) .widget( createUpgradeBox( 8, 0, + 0, new int[] { 4, 7 }, true, new int[] { 11 }, false, + 2, new Pos2d(56, 356), scrollable)) .widget( createUpgradeBox( 9, 0, + 2, new int[] { 7 }, false, new int[] {}, false, + 2, new Pos2d(126, 356), scrollable)) .widget( createUpgradeBox( 10, 0, + 1, new int[] { 6, 7 }, true, new int[] { 11 }, false, + 2, new Pos2d(196, 356), scrollable)) .widget( createUpgradeBox( 11, 0, + 3, new int[] { 8, 10 }, false, new int[] { 12, 13, 14 }, false, + 2, new Pos2d(126, 416), scrollable)) .widget( createUpgradeBox( 12, 1, + 2, new int[] { 11 }, false, new int[] { 17 }, true, + 3, new Pos2d(66, 476), scrollable)) .widget( createUpgradeBox( 13, 2, + 1, new int[] { 11 }, false, new int[] { 18 }, true, + 3, new Pos2d(126, 476), scrollable)) .widget( createUpgradeBox( 14, 3, + 0, new int[] { 11 }, false, new int[] { 15, 19 }, true, + 3, new Pos2d(186, 476), scrollable)) .widget( createUpgradeBox( 15, 3, + 1, new int[] { 14 }, false, new int[] {}, false, + 4, new Pos2d(246, 496), scrollable)) .widget( createUpgradeBox( 16, 1, + 1, new int[] { 17 }, false, new int[] {}, false, + 4, new Pos2d(6, 556), scrollable)) .widget( createUpgradeBox( 17, 1, + 0, new int[] { 12 }, false, new int[] { 16, 20 }, false, + 3, new Pos2d(66, 536), scrollable)) .widget( createUpgradeBox( 18, 2, + 1, new int[] { 13 }, false, new int[] { 21 }, false, + 3, new Pos2d(126, 536), scrollable)) .widget( createUpgradeBox( 19, 3, + 0, new int[] { 14 }, false, new int[] { 22 }, false, + 3, new Pos2d(186, 536), scrollable)) .widget( createUpgradeBox( 20, 1, + 0, new int[] { 17 }, false, new int[] { 23 }, false, + 3, new Pos2d(66, 596), scrollable)) .widget( createUpgradeBox( 21, 2, + 1, new int[] { 18 }, false, new int[] { 23 }, false, + 3, new Pos2d(126, 596), scrollable)) .widget( createUpgradeBox( 22, 3, + 1, new int[] { 19 }, false, new int[] { 23 }, false, + 3, new Pos2d(186, 596), scrollable)) .widget( createUpgradeBox( 23, 0, + 0, new int[] { 20, 21, 22 }, false, new int[] { 24 }, false, + 4, new Pos2d(126, 656), scrollable)) .widget( createUpgradeBox( 24, 0, + 1, new int[] { 23 }, false, new int[] { 25 }, false, + 5, new Pos2d(126, 718), scrollable)) .widget( createUpgradeBox( 25, 0, + 1, new int[] { 24 }, false, new int[] { 26 }, false, + 6, new Pos2d(36, 758), scrollable)) .widget( createUpgradeBox( 26, 0, + 3, new int[] { 25 }, false, new int[] { 27 }, false, + 7, new Pos2d(36, 848), scrollable)) .widget( createUpgradeBox( 27, 0, + 2, new int[] { 26 }, false, new int[] { 28 }, false, + 8, new Pos2d(126, 888), scrollable)) .widget( createUpgradeBox( 28, 0, + 0, new int[] { 27 }, false, new int[] { 29 }, false, + 9, new Pos2d(216, 848), scrollable)) .widget( createUpgradeBox( 29, 0, + 3, new int[] { 28 }, false, new int[] { 30 }, false, + 10, new Pos2d(216, 758), scrollable)) .widget( createUpgradeBox( 30, 0, + 3, new int[] { 29 }, false, new int[] {}, false, + 12, new Pos2d(126, 798), scrollable)) - .widget(new TextWidget("").setPos(0, 1000)); + .widget(new TextWidget("").setPos(0, 945)); builder.widget( new DrawableWidget().setDrawable(TecTechUITextures.BACKGROUND_STAR).setPos(0, 350).setSize(300, 300)) @@ -932,36 +1361,132 @@ protected ModularWindow createUpgradeTreeWindow(final EntityPlayer player) { .addChild( new ButtonWidget().setOnClick((clickData, widget) -> upgrades = new boolean[31]) .setSize(40, 15).setBackground(GT_UITextures.BUTTON_STANDARD) - .addTooltip(translateToLocal("fog.debug.resetbutton.tooltip"))) + .addTooltip(translateToLocal("fog.debug.resetbutton.tooltip")) + .setTooltipShowUpDelay(TOOLTIP_DELAY)) .addChild( new TextWidget(translateToLocal("fog.debug.resetbutton.text")) .setTextAlignment(Alignment.Center).setScale(0.57f).setMaxWidth(36) .setPos(3, 3)) + .addChild( + new NumericWidget().setSetter(val -> gravitonShardsAvailable = (int) val) + .setGetter(() -> gravitonShardsAvailable).setBounds(0, 112) + .setDefaultValue(0).setScrollValues(1, 4, 64) + .setTextAlignment(Alignment.Center).setTextColor(Color.WHITE.normal) + .setSize(25, 18).setPos(4, 16) + .addTooltip(translateToLocal("fog.debug.gravitonshardsetter.tooltip")) + .setTooltipShowUpDelay(TOOLTIP_DELAY) + .setBackground(GT_UITextures.BACKGROUND_TEXT_FIELD)) + .addChild( + new ButtonWidget().setOnClick((clickData, widget) -> Arrays.fill(upgrades, true)) + .setSize(40, 15).setBackground(GT_UITextures.BUTTON_STANDARD) + .addTooltip(translateToLocal("fog.debug.unlockall.text")) + .setTooltipShowUpDelay(TOOLTIP_DELAY).setPos(0, 35)) + .addChild( + new TextWidget(translateToLocal("fog.debug.unlockall.text")) + .setTextAlignment(Alignment.Center).setScale(0.57f).setMaxWidth(36) + .setPos(3, 38)) .setPos(4, 354)); + } return builder.build(); } protected ModularWindow createIndividualUpgradeWindow(final EntityPlayer player) { - UITexture background = switch (currentColorCode) { - case 1 -> TecTechUITextures.BACKGROUND_GLOW_PURPLE; - case 2 -> TecTechUITextures.BACKGROUND_GLOW_ORANGE; - case 3 -> TecTechUITextures.BACKGROUND_GLOW_GREEN; - default -> TecTechUITextures.BACKGROUND_GLOW_BLUE; - }; - ModularWindow.Builder builder = ModularWindow.builder(200, 200).setBackground(background) - .widget(ButtonWidget.closeWindowButton(true).setPos(185, 3)) + UITexture background; + UITexture overlay; + UITexture milestoneSymbol; + float widthRatio; + switch (currentColorCode) { + case 1 -> { + background = TecTechUITextures.BACKGROUND_GLOW_PURPLE; + overlay = TecTechUITextures.PICTURE_OVERLAY_PURPLE; + } + case 2 -> { + background = TecTechUITextures.BACKGROUND_GLOW_ORANGE; + overlay = TecTechUITextures.PICTURE_OVERLAY_ORANGE; + } + case 3 -> { + background = TecTechUITextures.BACKGROUND_GLOW_GREEN; + overlay = TecTechUITextures.PICTURE_OVERLAY_GREEN; + } + default -> { + background = TecTechUITextures.BACKGROUND_GLOW_BLUE; + overlay = TecTechUITextures.PICTURE_OVERLAY_BLUE; + } + } + switch (currentMilestoneBG) { + case 1 -> { + milestoneSymbol = TecTechUITextures.PICTURE_GODFORGE_MILESTONE_CONVERSION; + widthRatio = 0.72f; + } + case 2 -> { + milestoneSymbol = TecTechUITextures.PICTURE_GODFORGE_MILESTONE_CATALYST; + widthRatio = 1f; + } + case 3 -> { + milestoneSymbol = TecTechUITextures.PICTURE_GODFORGE_MILESTONE_COMPOSITION; + widthRatio = 1f; + } + default -> { + milestoneSymbol = TecTechUITextures.PICTURE_GODFORGE_MILESTONE_CHARGE; + widthRatio = 0.8f; + } + } + int WIDTH = 250; + int HEIGHT = 250; + int LORE_POS = 110; + if (currentUpgradeID == 0) { + WIDTH = 300; + HEIGHT = 300; + LORE_POS = 85; + } + ModularWindow.Builder builder = ModularWindow.builder(WIDTH, HEIGHT).setBackground(background) + .widget(ButtonWidget.closeWindowButton(true).setPos(WIDTH - 15, 3)) + .widget( + new DrawableWidget().setDrawable(milestoneSymbol) + .setPos((int) ((1 - widthRatio / 2) * WIDTH / 2), HEIGHT / 4) + .setSize((int) (WIDTH / 2 * widthRatio), HEIGHT / 2)) + .widget( + new DrawableWidget().setDrawable(overlay).setPos(WIDTH / 4, HEIGHT / 4) + .setSize(WIDTH / 2, HEIGHT / 2)) .widget( new MultiChildWidget() + .addChild( + new TextWidget(translateToLocal("fog.upgrade.tt." + (currentUpgradeID))) + .setTextAlignment(Alignment.Center) + .setDefaultColor(EnumChatFormatting.GOLD).setSize(WIDTH - 15, 30) + .setPos(9, 5)) .addChild( new TextWidget(translateToLocal("fog.upgrade.text." + (currentUpgradeID))) - .setTextAlignment(Alignment.Center).setMaxWidth(185) - .setDefaultColor(0x9c9c9c).setPos(9, 35)) + .setTextAlignment(Alignment.CenterLeft).setDefaultColor(0x9c9c9c) + .setSize(WIDTH - 15, LORE_POS - 30).setPos(9, 30)) + .addChild( + new TextWidget( + EnumChatFormatting.ITALIC + + translateToLocal("fog.upgrade.lore." + (currentUpgradeID))) + .setTextAlignment(Alignment.Center) + .setDefaultColor(0x9c9c9c) + .setSize(WIDTH - 15, (int) (HEIGHT * 0.9) - LORE_POS) + .setPos(9, LORE_POS)) .addChild( - new TextWidget(translateToLocal("fog.upgrade.lore." + (currentUpgradeID))) - .setTextAlignment(Alignment.Center).setMaxWidth(185) - .setDefaultColor(0x9c9c9c).setPos(9, 110)) - .setSize(200, 200)) + new TextWidget( + translateToLocal("gt.blockmachines.multimachine.FOG.shardcost") + " " + + EnumChatFormatting.BLUE + + gravitonShardCost).setTextAlignment(Alignment.Center) + .setScale(0.7f).setMaxWidth(70) + .setDefaultColor(0x9c9c9c).setPos(11, HEIGHT - 25)) + .addChild( + new TextWidget( + translateToLocal("gt.blockmachines.multimachine.FOG.availableshards")) + .setTextAlignment(Alignment.Center).setScale(0.7f) + .setMaxWidth(90).setDefaultColor(0x9c9c9c) + .setPos(WIDTH - 87, HEIGHT - 25)) + .addChild( + TextWidget.dynamicText(this::gravitonShardAmount) + .setTextAlignment(Alignment.Center).setScale(0.7f).setMaxWidth(90) + .setDefaultColor(0x9c9c9c).setPos(WIDTH - 27, HEIGHT - 18))) + .setSize(WIDTH, HEIGHT) + .widget(new MultiChildWidget().addChild(new ButtonWidget().setOnClick((clickData, widget) -> { int unlockedPrereqUpgrades = 0; int unlockedFollowupUpgrades = 0; @@ -973,7 +1498,10 @@ protected ModularWindow createIndividualUpgradeWindow(final EntityPlayer player) } } if (allPrereqRequired) { - if (unlockedPrereqUpgrades == prereqUpgrades.length) { + if (unlockedPrereqUpgrades == prereqUpgrades.length + && gravitonShardsAvailable >= gravitonShardCost) { + gravitonShardsAvailable -= gravitonShardCost; + gravitonShardsSpent += gravitonShardCost; upgrades[currentUpgradeID] = true; } } else if (unlockedPrereqUpgrades > 0 || prereqUpgrades.length == 0) { @@ -983,13 +1511,11 @@ protected ModularWindow createIndividualUpgradeWindow(final EntityPlayer player) unlockedSplitUpgrades++; } } - for (int maxSplitUpgrades : RING_UPGRADES) { - if (upgrades[maxSplitUpgrades]) { - unlockedSplitUpgrades--; - } - } + unlockedSplitUpgrades -= (ringAmount - 1); } - if (unlockedSplitUpgrades <= 0) { + if (unlockedSplitUpgrades <= 0 && gravitonShardsAvailable >= gravitonShardCost) { + gravitonShardsAvailable -= gravitonShardCost; + gravitonShardsSpent += gravitonShardCost; upgrades[currentUpgradeID] = true; } } @@ -1000,6 +1526,8 @@ protected ModularWindow createIndividualUpgradeWindow(final EntityPlayer player) } } if (unlockedFollowupUpgrades == 0) { + gravitonShardsAvailable += gravitonShardCost; + gravitonShardsSpent -= gravitonShardCost; upgrades[currentUpgradeID] = false; } } @@ -1009,11 +1537,18 @@ protected ModularWindow createIndividualUpgradeWindow(final EntityPlayer player) } else { return new IDrawable[] { GT_UITextures.BUTTON_STANDARD }; } - }).addTooltip(translateToLocal("fog.upgrade.confirm"))) + }).addTooltip(translateToLocal("fog.upgrade.confirm")).setTooltipShowUpDelay(TOOLTIP_DELAY)) .addChild( new TextWidget(translateToLocal("fog.upgrade.confirm")) .setTextAlignment(Alignment.Center).setScale(0.7f).setMaxWidth(36).setPos(3, 5)) - .setPos(79, 177)); + .addChild(new ButtonWidget().setOnClick((clickData, widget) -> { + if (!widget.isClient()) { + widget.getContext().openSyncedWindow(MANUAL_INSERTION_WINDOW_ID); + widget.getContext().closeWindow(INDIVIDUAL_UPGRADE_WINDOW_ID); + widget.getContext().closeWindow(UPGRADE_TREE_WINDOW_ID); + } + }).setBackground(TecTechUITextures.BUTTON_CELESTIAL_32x32).setPos(50, 50)) + .setPos(WIDTH / 2 - 21, (int) (HEIGHT * 0.9))); return builder.build(); } @@ -1021,19 +1556,24 @@ protected ModularWindow createIndividualUpgradeWindow(final EntityPlayer player) * @param upgradeID ID of the upgrade * @param colorCode Number deciding which colored background to use, 0 for blue, 1 for purple, 2 for * orange and 3 for green + * @param milestone Number deciding which milestone symbol to display in the background, 0 for charge, + * 1 for conversion, 2 for catalyst and 3 for composition * @param prerequisiteUpgradeIDs IDs of the prior upgrades directly connected to the current one * @param requireAllPrerequisites Decides how many connected prerequisite upgrades have to be unlocked to be able to * unlock this one. True means ALL, False means AT LEAST ONE * @param followingUpgradeIDs IDs of the following upgrades directly connected to the current one * @param isStartOfSplit Whether this upgrade is one of the initial split upgrades + * @param shardCost How many graviton shards are needed to unlock this upgrade * @param pos Position of the upgrade inside the scrollableWidget */ - private Widget createUpgradeBox(int upgradeID, int colorCode, int[] prerequisiteUpgradeIDs, - boolean requireAllPrerequisites, int[] followingUpgradeIDs, boolean isStartOfSplit, Pos2d pos, - IWidgetBuilder builder) { + private Widget createUpgradeBox(int upgradeID, int colorCode, int milestone, int[] prerequisiteUpgradeIDs, + boolean requireAllPrerequisites, int[] followingUpgradeIDs, boolean isStartOfSplit, int shardCost, + Pos2d pos, IWidgetBuilder builder) { return new MultiChildWidget().addChild(new ButtonWidget().setOnClick((clickData, widget) -> { currentUpgradeID = upgradeID; currentColorCode = colorCode; + currentMilestoneBG = milestone; + gravitonShardCost = shardCost; prereqUpgrades = prerequisiteUpgradeIDs; allPrereqRequired = requireAllPrerequisites; followupUpgrades = followingUpgradeIDs; @@ -1045,7 +1585,7 @@ private Widget createUpgradeBox(int upgradeID, int colorCode, int[] prerequisite } else { return new IDrawable[] { GT_UITextures.BUTTON_STANDARD }; } - }).addTooltip(translateToLocal("fog.upgrade.tt." + upgradeID))) + }).addTooltip(translateToLocal("fog.upgrade.tt." + upgradeID)).setTooltipShowUpDelay(TOOLTIP_DELAY)) .addChild( new TextWidget(translateToLocal("fog.upgrade.tt." + upgradeID)) .setTextAlignment(Alignment.Center).setScale(0.57f).setMaxWidth(36).setPos(3, 3)) @@ -1054,6 +1594,64 @@ private Widget createUpgradeBox(int upgradeID, int colorCode, int[] prerequisite builder); } + List inputs = new ArrayList<>( + Arrays.asList( + ItemList.Electric_Motor_UMV.get(13L), + ItemList.Electric_Pump_UXV.get(32L), + ItemList.Electric_Piston_UXV.get(32L), + ItemList.Robot_Arm_UXV.get(32L), + ItemList.Superconducting_Magnet_Solenoid_UIV.get(48L), + ItemList.NaquadriaSupersolid.get(32L), + CustomItemList.astralArrayFabricator.get(36L), + CustomItemList.Machine_Multi_EyeOfHarmony.get(2L))); + + protected ModularWindow createManualInsertionWindow(final EntityPlayer player) { + final int WIDTH = 189; + final int HEIGHT = 84; + final int PARENT_WIDTH = getGUIWidth(); + final int PARENT_HEIGHT = getGUIHeight(); + final MultiChildWidget columns = new MultiChildWidget(); + final DynamicPositionedColumn column1 = new DynamicPositionedColumn(); + final DynamicPositionedColumn column2 = new DynamicPositionedColumn(); + final DynamicPositionedColumn column3 = new DynamicPositionedColumn(); + List columnList = Arrays.asList(column1, column2, column3); + ModularWindow.Builder builder = ModularWindow.builder(WIDTH, HEIGHT); + builder.setBackground(GT_UITextures.BACKGROUND_SINGLEBLOCK_DEFAULT); + builder.setGuiTint(getGUIColorization()); + builder.setDraggable(true); + builder.setPos( + (size, window) -> Alignment.Center.getAlignedPos(size, new Size(PARENT_WIDTH, PARENT_HEIGHT)) + .add( + Alignment.TopRight + .getAlignedPos(new Size(PARENT_WIDTH, PARENT_HEIGHT), new Size(WIDTH, HEIGHT))) + .subtract(5, 0).add(0, 4)); + builder.widget( + SlotGroup.ofItemHandler(inputSlotHandler, 4).startFromSlot(0).endAtSlot(15).phantom(false) + .background(getGUITextureSet().getItemSlot()).build().setPos(111, 6)); + for (int i = 0; i < inputs.size(); i++) { + int index = i; + int cleanDiv4 = index / 4; + builder.widget( + new DrawableWidget().setDrawable(GT_UITextures.BUTTON_STANDARD_PRESSED) + .setPos(6 + cleanDiv4 * 36, 6 + index % 4 * 18).setSize(18, 18)); + columnList.get(cleanDiv4) + .addChild(new ItemDrawable().setItem(inputs.get(index)).asWidget().dynamicTooltip(() -> { + List tooltip = new ArrayList<>(); + tooltip.add(inputs.get(index) != null ? inputs.get(index).getDisplayName() : ""); + return tooltip; + }).setSize(16, 16)); + } + + columns.addChild( + column1.setSpace(2).setAlignment(MainAxisAlignment.SPACE_BETWEEN).setSize(34, 72).setPos(1, 1)); + columns.addChild( + column2.setSpace(2).setAlignment(MainAxisAlignment.SPACE_BETWEEN).setSize(34, 72).setPos(37, 1)); + columns.addChild( + column3.setSpace(2).setAlignment(MainAxisAlignment.SPACE_BETWEEN).setSize(34, 72).setPos(73, 1)); + builder.widget(columns.setSize(72, 72).setPos(6, 6)); + return builder.build(); + } + @Override public GT_Multiblock_Tooltip_Builder createTooltip() { final GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder(); @@ -1080,23 +1678,27 @@ public String[] getStructureDescription(ItemStack stackSize) { return new String[] { "Forge of Gods multiblock" }; } - public Integer getFuelType() { + public int getFuelType() { return selectedFuelType; } - private void setFuelType(Integer fuelType) { + private void setFuelType(int fuelType) { selectedFuelType = fuelType; } - public Integer getFuelFactor() { + public int getFuelFactor() { return fuelConsumptionFactor; } - public Boolean isUpgradeActive(Integer upgradeID) { + public boolean isUpgradeActive(int upgradeID) { return upgrades[upgradeID]; } - public Integer getTotalActiveUpgrades() { + public int getRingAmount() { + return ringAmount; + } + + public int getTotalActiveUpgrades() { int totalUpgrades = 0; for (boolean upgrade : upgrades) { if (upgrade) { @@ -1107,43 +1709,419 @@ public Integer getTotalActiveUpgrades() { } private Text fuelUsage() { - return new Text(fuelConsumption + " L/s"); + return new Text(fuelConsumption + " L/5s"); + } + + private Text gravitonShardAmount() { + EnumChatFormatting enoughGravitonShards = EnumChatFormatting.RED; + if (gravitonShardsAvailable >= gravitonShardCost) { + enoughGravitonShards = EnumChatFormatting.GREEN; + } + return new Text(enoughGravitonShards + Integer.toString(gravitonShardsAvailable)); + } private Text storedFuel() { + if (internalBattery == 0) { + return new Text( + translateToLocal("gt.blockmachines.multimachine.FOG.storedstartupfuel") + " " + + stellarFuelAmount + + "/" + + neededStartupFuel); + } + return new Text( + translateToLocal("gt.blockmachines.multimachine.FOG.storedfuel") + " " + + internalBattery + + "/" + + maxBatteryCharge); + } + + private void checkInversionStatus() { + int inversionChecker = 0; + for (int progress : milestoneProgress) { + if (progress < 7) { + break; + } + inversionChecker++; + } + inversion = inversionChecker == 4; + } + + private Text inversionStatusText() { + String inversionStatus = ""; + if (inversion) { + inversionStatus = EnumChatFormatting.BOLD + translateToLocal("gt.blockmachines.multimachine.FOG.inversion"); + } + return new Text(inversionStatus); + } + + private void determineCompositionMilestoneLevel() { + int[] uniqueModuleCount = new int[5]; + int smelting = 0; + int molten = 0; + int plasma = 0; + int exotic = 0; + int exoticMagmatter = 0; + for (GT_MetaTileEntity_EM_BaseModule module : moduleHatches) { + if (module instanceof GT_MetaTileEntity_EM_SmeltingModule) { + uniqueModuleCount[0] = 1; + smelting++; + continue; + } + if (module instanceof GT_MetaTileEntity_EM_MoltenModule) { + uniqueModuleCount[1] = 1; + molten++; + continue; + } + if (module instanceof GT_MetaTileEntity_EM_PlasmaModule) { + uniqueModuleCount[2] = 1; + plasma++; + continue; + } + if (module instanceof GT_MetaTileEntity_EM_ExoticModule) { + if (!((GT_MetaTileEntity_EM_ExoticModule) module).isMagmatterModeOn()) { + uniqueModuleCount[3] = 1; + exotic++; + } else { + uniqueModuleCount[4] = 1; + exoticMagmatter++; + } + } + + } + totalExtensionsBuilt = Arrays.stream(uniqueModuleCount).sum() + ringAmount - 1; + if (inversion) { + totalExtensionsBuilt += (smelting - 1 + + (molten - 1) * 2 + + (plasma - 1) * 3 + + (exotic - 1) * 4 + + (exoticMagmatter - 1) * 5) / 5f; + } + milestoneProgress[3] = (int) Math.floor(totalExtensionsBuilt); + } + + private void determineMilestoneProgress() { + int closestRelevantSeven; + float rawProgress; + float actualProgress; + if (milestoneProgress[0] < 7) { + powerMilestonePercentage = (float) max( + (log((totalPowerConsumed.divide(BigInteger.valueOf(POWER_MILESTONE_CONSTANT))).longValue()) + / POWER_LOG_CONSTANT + 1), + 0) / 7; + milestoneProgress[0] = (int) floor(powerMilestonePercentage * 7); + } + if (inversion) { + rawProgress = (totalPowerConsumed.divide(POWER_MILESTONE_T7_CONSTANT).floatValue() - 1) / 7; + closestRelevantSeven = (int) floor(rawProgress); + actualProgress = rawProgress - closestRelevantSeven; + milestoneProgress[0] = 7 + (int) floor(rawProgress * 7); + if (closestRelevantSeven % 2 == 0) { + invertedPowerMilestonePercentage = actualProgress; + powerMilestonePercentage = 1 - invertedPowerMilestonePercentage; + } else { + powerMilestonePercentage = actualProgress; + invertedPowerMilestonePercentage = 1 - powerMilestonePercentage; + } + } + + if (milestoneProgress[1] < 7) { + recipeMilestonePercentage = (float) max( + (log(totalRecipesProcessed * 1f / RECIPE_MILESTONE_CONSTANT) / RECIPE_LOG_CONSTANT + 1), + 0) / 7; + milestoneProgress[1] = (int) floor(recipeMilestonePercentage * 7); + } + if (inversion) { + rawProgress = (((float) totalRecipesProcessed / RECIPE_MILESTONE_T7_CONSTANT) - 1) / 7; + closestRelevantSeven = (int) floor(rawProgress); + actualProgress = rawProgress - closestRelevantSeven; + milestoneProgress[1] = 7 + (int) floor(rawProgress * 7); + if (closestRelevantSeven % 2 == 0) { + invertedRecipeMilestonePercentage = actualProgress; + recipeMilestonePercentage = 1 - invertedRecipeMilestonePercentage; + } else { + recipeMilestonePercentage = actualProgress; + invertedRecipeMilestonePercentage = 1 - recipeMilestonePercentage; + } + } + if (milestoneProgress[2] < 7) { + fuelMilestonePercentage = (float) max( + (log(totalFuelConsumed * 1f / FUEL_MILESTONE_CONSTANT) / FUEL_LOG_CONSTANT + 1), + 0) / 7; + milestoneProgress[2] = (int) floor(fuelMilestonePercentage * 7); + } + if (inversion) { + rawProgress = (((float) totalFuelConsumed / FUEL_MILESTONE_T7_CONSTANT) - 1) / 7; + closestRelevantSeven = (int) floor(rawProgress); + actualProgress = rawProgress - closestRelevantSeven; + milestoneProgress[2] = 7 + (int) floor(rawProgress * 7); + if ((closestRelevantSeven % 2) == 0) { + invertedFuelMilestonePercentage = actualProgress; + fuelMilestonePercentage = 1 - invertedFuelMilestonePercentage; + } else { + fuelMilestonePercentage = actualProgress; + invertedFuelMilestonePercentage = 1 - fuelMilestonePercentage; + } + } + + if (milestoneProgress[3] < 7) { + structureMilestonePercentage = totalExtensionsBuilt / 7f; + } + if (inversion) { + rawProgress = (totalExtensionsBuilt - 7) / 7f; + closestRelevantSeven = (int) floor(rawProgress); + actualProgress = rawProgress - closestRelevantSeven; + if ((closestRelevantSeven % 2) == 0) { + invertedStructureMilestonePercentage = actualProgress; + structureMilestonePercentage = 1 - invertedStructureMilestonePercentage; + } else { + structureMilestonePercentage = actualProgress; + invertedStructureMilestonePercentage = 1 - structureMilestonePercentage; + } + } + } + + private void determineGravitonShardAmount() { + int sum = 0; + for (int progress : milestoneProgress) { + if (!inversion) { + progress = Math.min(progress, 7); + } + sum += progress * (progress + 1) / 2; + } + gravitonShardsAvailable = sum - gravitonShardsSpent; + } + + private Text gravitonShardAmountText(int milestoneID) { + int sum; + int progress = milestoneProgress[milestoneID]; + if (!inversion) { + progress = Math.min(progress, 7); + } + sum = progress * (progress + 1) / 2; return new Text( - translateToLocal("gt.blockmachines.multimachine.FOG.storedfuel") + " " + internalBattery + "/100"); + translateToLocal("gt.blockmachines.multimachine.FOG.shardgain") + ": " + EnumChatFormatting.GRAY + sum); + } + + private Text totalMilestoneProgress(int milestoneID) { + long progress; + BigInteger bigProgress; + String suffix; + boolean shift = Interactable.hasShiftDown(); + switch (milestoneID) { + case 1 -> { + suffix = translateToLocal("gt.blockmachines.multimachine.FOG.recipes"); + progress = totalRecipesProcessed; + } + case 2 -> { + suffix = translateToLocal("gt.blockmachines.multimachine.FOG.fuel"); + progress = totalFuelConsumed; + } + case 3 -> { + suffix = translateToLocal("gt.blockmachines.multimachine.FOG.extensions"); + progress = milestoneProgress[3]; + } + default -> { + suffix = translateToLocal("gt.blockmachines.multimachine.FOG.power"); + bigProgress = totalPowerConsumed; + if (!shift && (totalPowerConsumed.compareTo(BigInteger.valueOf(1_000L)) > 0)) { + return new Text( + translateToLocal("gt.blockmachines.multimachine.FOG.totalprogress") + ": " + + EnumChatFormatting.GRAY + + toExponentForm(bigProgress) + + " " + + suffix); + } else { + return new Text( + translateToLocal("gt.blockmachines.multimachine.FOG.totalprogress") + ": " + + EnumChatFormatting.GRAY + + bigProgress + + " " + + suffix); + } + } + } + if (!shift) { + return new Text( + translateToLocal("gt.blockmachines.multimachine.FOG.totalprogress") + ": " + + EnumChatFormatting.GRAY + + formatNumbers(progress) + + " " + + suffix); + } else { + return new Text( + translateToLocal("gt.blockmachines.multimachine.FOG.totalprogress") + ": " + + EnumChatFormatting.GRAY + + progress + + " " + + suffix); + } + + } + + private Text currentMilestone(int milestoneID) { + return new Text( + translateToLocal("gt.blockmachines.multimachine.FOG.milestoneprogress") + ": " + + EnumChatFormatting.GRAY + + milestoneProgress[milestoneID]); + } + + private Text milestoneProgressText(int milestoneID, boolean formatting) { + long max; + BigInteger bigMax; + String suffix; + String progressText = translateToLocal("gt.blockmachines.multimachine.FOG.progress"); + Text done = new Text(translateToLocal("gt.blockmachines.multimachine.FOG.milestonecomplete")); + if (Interactable.hasShiftDown()) { + formatting = false; + done = new Text( + translateToLocal("gt.blockmachines.multimachine.FOG.milestonecomplete") + + EnumChatFormatting.DARK_RED + + "?"); + } + switch (milestoneID) { + case 0: + if (milestoneProgress[0] < 7 || inversion) { + suffix = translateToLocal("gt.blockmachines.multimachine.FOG.power"); + if (inversion) { + bigMax = POWER_MILESTONE_T7_CONSTANT.multiply(BigInteger.valueOf(milestoneProgress[0] - 5)); + } else { + bigMax = BigInteger.valueOf(LongMath.pow(9, milestoneProgress[0])) + .multiply(BigInteger.valueOf(LongMath.pow(10, 15))); + } + if (formatting && (totalPowerConsumed.compareTo(BigInteger.valueOf(1_000L)) > 0)) { + return new Text( + progressText + ": " + EnumChatFormatting.GRAY + toExponentForm(bigMax) + " " + suffix); + } else { + return new Text(progressText + ": " + EnumChatFormatting.GRAY + bigMax + " " + suffix); + } + } else { + return done; + } + case 1: + if (milestoneProgress[1] < 7 || inversion) { + suffix = translateToLocal("gt.blockmachines.multimachine.FOG.recipes"); + if (inversion) { + max = RECIPE_MILESTONE_T7_CONSTANT * (milestoneProgress[1] - 5); + } else { + max = LongMath.pow(6, milestoneProgress[1]) * LongMath.pow(10, 7); + } + break; + } else { + return done; + } + case 2: + if (milestoneProgress[2] < 7 || inversion) { + suffix = translateToLocal("gt.blockmachines.multimachine.FOG.fuel"); + if (inversion) { + max = FUEL_MILESTONE_T7_CONSTANT * (milestoneProgress[2] - 5); + } else { + max = LongMath.pow(3, milestoneProgress[2]) * LongMath.pow(10, 4); + } + break; + } else { + return done; + } + case 3: + if (milestoneProgress[3] < 7 || inversion) { + suffix = translateToLocal("gt.blockmachines.multimachine.FOG.extensions"); + max = milestoneProgress[3] + 1; + break; + } else { + return done; + } + default: + return new Text("Error"); + } + if (formatting) { + return new Text(progressText + ": " + EnumChatFormatting.GRAY + formatNumbers(max) + " " + suffix); + } else { + return new Text(progressText + ": " + EnumChatFormatting.GRAY + max + " " + suffix); + } } - private void increaseBattery(Integer amount) { - if ((internalBattery + amount) <= 100) { + private void increaseBattery(int amount) { + if ((internalBattery + amount) <= maxBatteryCharge) { internalBattery += amount; + } else { + batteryCharging = false; } } - private void reduceBattery(Integer amount) { - internalBattery -= amount; - if (internalBattery <= 0) { + public void reduceBattery(int amount) { + if (internalBattery - amount <= 0) { internalBattery = 0; if (moduleHatches.size() > 0) { for (GT_MetaTileEntity_EM_BaseModule module : moduleHatches) { module.disconnect(); } } - + } else { + internalBattery -= amount; + totalFuelConsumed += amount; } + + } + + public int getBatteryCharge() { + return internalBattery; + } + + public int getMaxBatteryCharge() { + return maxBatteryCharge; + } + + public void addTotalPowerConsumed(BigInteger amount) { + totalPowerConsumed = totalPowerConsumed.add(amount); + } + + public void addTotalRecipesProcessed(long amount) { + totalRecipesProcessed += amount; } @Override protected void setHatchRecipeMap(GT_MetaTileEntity_Hatch_Input hatch) {} + @Override + public void setItemNBT(NBTTagCompound NBT) { + NBT.setInteger("selectedFuelType", selectedFuelType); + NBT.setInteger("fuelConsumptionFactor", fuelConsumptionFactor); + NBT.setInteger("internalBattery", internalBattery); + NBT.setBoolean("batteryCharging", batteryCharging); + NBT.setInteger("batterySize", maxBatteryCharge); + NBT.setInteger("gravitonShardsAvailable", gravitonShardsAvailable); + NBT.setInteger("gravitonShardsSpent", gravitonShardsSpent); + NBT.setByteArray("totalPowerConsumed", totalPowerConsumed.toByteArray()); + NBT.setLong("totalRecipesProcessed", totalRecipesProcessed); + NBT.setLong("totalFuelConsumed", totalFuelConsumed); + NBT.setInteger("starFuelStored", stellarFuelAmount); + + // Store booleanArray of all upgrades + NBTTagCompound upgradeBooleanArrayNBTTag = new NBTTagCompound(); + + int upgradeIndex = 0; + for (Boolean upgrade : upgrades) { + upgradeBooleanArrayNBTTag.setBoolean("upgrade" + upgradeIndex, upgrade); + upgradeIndex++; + } + + NBT.setTag("upgrades", upgradeBooleanArrayNBTTag); + super.saveNBTData(NBT); + } + @Override public void saveNBTData(NBTTagCompound NBT) { - NBT.setInteger("spacetimeCompressionTier", spacetimeCompressionFieldMetadata + 1); - NBT.setInteger("solenoidCoilTier", solenoidCoilMetadata - 7); NBT.setInteger("selectedFuelType", selectedFuelType); NBT.setInteger("fuelConsumptionFactor", fuelConsumptionFactor); NBT.setInteger("internalBattery", internalBattery); + NBT.setBoolean("batteryCharging", batteryCharging); + NBT.setInteger("batterySize", maxBatteryCharge); + NBT.setInteger("gravitonShardsAvailable", gravitonShardsAvailable); + NBT.setInteger("gravitonShardsSpent", gravitonShardsSpent); + NBT.setByteArray("totalPowerConsumed", totalPowerConsumed.toByteArray()); + NBT.setLong("totalRecipesProcessed", totalRecipesProcessed); + NBT.setLong("totalFuelConsumed", totalFuelConsumed); + NBT.setInteger("starFuelStored", stellarFuelAmount); // Store booleanArray of all upgrades NBTTagCompound upgradeBooleanArrayNBTTag = new NBTTagCompound(); @@ -1160,11 +2138,17 @@ public void saveNBTData(NBTTagCompound NBT) { @Override public void loadNBTData(NBTTagCompound NBT) { - spacetimeCompressionFieldMetadata = NBT.getInteger("spacetimeCompressionTier") - 1; - solenoidCoilMetadata = NBT.getInteger("solenoidCoilTier") + 7; selectedFuelType = NBT.getInteger("selectedFuelType"); fuelConsumptionFactor = NBT.getInteger("fuelConsumptionFactor"); internalBattery = NBT.getInteger("internalBattery"); + batteryCharging = NBT.getBoolean("batteryCharging"); + maxBatteryCharge = NBT.getInteger("batterySize"); + gravitonShardsAvailable = NBT.getInteger("gravitonShardsAvailable"); + gravitonShardsSpent = NBT.getInteger("gravitonShardsSpent"); + totalPowerConsumed = new BigInteger(NBT.getByteArray("totalPowerConsumed")); + totalRecipesProcessed = NBT.getLong("totalRecipesProcessed"); + totalFuelConsumed = NBT.getLong("totalFuelConsumed"); + stellarFuelAmount = NBT.getInteger("starFuelStored"); NBTTagCompound tempBooleanTag = NBT.getCompoundTag("upgrades"); diff --git a/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/godforge_modules/GT_MetaTileEntity_EM_BaseModule.java b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/godforge_modules/GT_MetaTileEntity_EM_BaseModule.java index 40ef264d2..a824848fc 100644 --- a/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/godforge_modules/GT_MetaTileEntity_EM_BaseModule.java +++ b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/godforge_modules/GT_MetaTileEntity_EM_BaseModule.java @@ -1,27 +1,50 @@ package com.github.technus.tectech.thing.metaTileEntity.multi.godforge_modules; -import static com.github.technus.tectech.thing.casing.GT_Block_CasingsTT.texturePage; +import static com.github.technus.tectech.thing.casing.TT_Container_Casings.GodforgeCasings; +import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock; +import static gregtech.api.metatileentity.BaseTileEntity.TOOLTIP_DELAY; import static gregtech.common.misc.WirelessNetworkManager.addEUToGlobalEnergyMap; import static gregtech.common.misc.WirelessNetworkManager.processInitialSettings; +import static net.minecraft.util.StatCollector.translateToLocal; +import java.math.BigInteger; +import java.util.ArrayList; +import java.util.List; import java.util.UUID; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.EnumChatFormatting; import net.minecraftforge.common.util.ForgeDirection; -import com.github.technus.tectech.thing.casing.TT_Container_Casings; +import com.github.technus.tectech.thing.gui.TecTechUITextures; import com.github.technus.tectech.thing.metaTileEntity.multi.base.GT_MetaTileEntity_MultiblockBase_EM; import com.github.technus.tectech.thing.metaTileEntity.multi.base.render.TT_RenderedExtendedFacingTexture; import com.gtnewhorizon.structurelib.structure.IStructureDefinition; import com.gtnewhorizon.structurelib.structure.StructureDefinition; -import com.gtnewhorizon.structurelib.structure.StructureUtility; +import com.gtnewhorizons.modularui.api.drawable.IDrawable; +import com.gtnewhorizons.modularui.api.drawable.Text; +import com.gtnewhorizons.modularui.api.drawable.UITexture; +import com.gtnewhorizons.modularui.api.math.Alignment; +import com.gtnewhorizons.modularui.api.math.Color; +import com.gtnewhorizons.modularui.api.math.Size; import com.gtnewhorizons.modularui.api.screen.ModularWindow; import com.gtnewhorizons.modularui.api.screen.UIBuildContext; +import com.gtnewhorizons.modularui.api.widget.IWidgetBuilder; +import com.gtnewhorizons.modularui.api.widget.Widget; +import com.gtnewhorizons.modularui.common.widget.ButtonWidget; import com.gtnewhorizons.modularui.common.widget.DrawableWidget; import com.gtnewhorizons.modularui.common.widget.DynamicPositionedColumn; +import com.gtnewhorizons.modularui.common.widget.FakeSyncWidget; import com.gtnewhorizons.modularui.common.widget.SlotWidget; +import com.gtnewhorizons.modularui.common.widget.TextWidget; +import com.gtnewhorizons.modularui.common.widget.textfield.NumericWidget; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import gregtech.api.GregTech_API; import gregtech.api.enums.Textures; import gregtech.api.gui.modularui.GT_UITextures; import gregtech.api.interfaces.ITexture; @@ -35,28 +58,55 @@ public class GT_MetaTileEntity_EM_BaseModule extends GT_MetaTileEntity_Multibloc protected final int tier = getTier(); protected boolean isConnected = false; + protected double overclockTimeFactor = 2d; protected boolean isUpgrade83Unlocked = false; + protected boolean isMultiStepPlasmaCapable = false; + protected boolean isMagmatterCapable = false; + private boolean isVoltageConfigUnlocked = false; protected UUID userUUID; protected int machineHeat = 0; + protected int overclockHeat = 0; protected int maximumParallel = 0; + protected int plasmaTier = 0; protected float processingSpeedBonus = 0; + protected float energyDiscount = 0; + protected long processingVoltage = 2_000_000_000; + protected BigInteger powerTally = BigInteger.ZERO; + protected long recipeTally = 0; + private static Textures.BlockIcons.CustomIcon ScreenON; + private static Textures.BlockIcons.CustomIcon ScreenOFF; private static final String STRUCTURE_PIECE_MAIN = "main"; + private static final int VOLTAGE_WINDOW_ID = 9; + private static final int TEXTURE_INDEX = 960; private static final IStructureDefinition STRUCTURE_DEFINITION = StructureDefinition .builder() .addShape( STRUCTURE_PIECE_MAIN, - StructureUtility.transpose( - new String[][] { { "H", "H" }, { "~", "H" }, { "H", "H" }, { "H", "H" }, { "H", "H" } })) + new String[][] { { " ", " BBB ", " BBBBB ", " BB~BB ", " BBBBB ", " BBB ", " " }, + { " CCC ", " CFFFC ", "CFFFFFC", "CFFFFFC", "CFFFFFC", " CFFFC ", " CCC " }, + { " ", " ", " E ", " EAE ", " E ", " ", " " }, + { " ", " ", " E ", " EAE ", " E ", " ", " " }, + { " ", " ", " E ", " EAE ", " E ", " ", " " }, + { " ", " ", " E ", " EAE ", " E ", " ", " " }, + { " ", " ", " ", " D ", " ", " ", " " }, + { " ", " ", " ", " D ", " ", " ", " " }, + { " ", " ", " ", " D ", " ", " ", " " }, + { " ", " ", " ", " D ", " ", " ", " " }, + { " ", " ", " ", " D ", " ", " ", " " }, + { " ", " ", " ", " G ", " ", " ", " " } }) + .addElement('A', ofBlock(GregTech_API.sSolenoidCoilCasings, 9)) .addElement( - 'H', + 'B', GT_StructureUtility.ofHatchAdderOptional( GT_MetaTileEntity_EM_BaseModule::addClassicToMachineList, - texturePage << 7, + TEXTURE_INDEX, 1, - TT_Container_Casings.sBlockCasingsBA0, - 12)) - .build(); + GodforgeCasings, + 0)) + .addElement('C', ofBlock(GodforgeCasings, 0)).addElement('D', ofBlock(GodforgeCasings, 1)) + .addElement('E', ofBlock(GodforgeCasings, 2)).addElement('F', ofBlock(GodforgeCasings, 3)) + .addElement('G', ofBlock(GodforgeCasings, 4)).build(); public GT_MetaTileEntity_EM_BaseModule(int aID, String aName, String aNameRegional) { super(aID, aName, aNameRegional); @@ -106,32 +156,112 @@ public void disconnect() { isConnected = false; } - public void setHeat(Integer heat) { + public void setHeat(int heat) { machineHeat = heat; } - public Integer getHeat() { + public int getHeat() { return machineHeat; } - public void setMaxParallel(Integer parallel) { + public void setHeatForOC(int heat) { + overclockHeat = heat; + } + + public int getHeatForOC() { + return overclockHeat; + } + + public void setMaxParallel(int parallel) { maximumParallel = parallel; } - public Integer getMaxParallel() { + public int getMaxParallel() { return maximumParallel; } - public void setSpeedBonus(Float bonus) { + public void setSpeedBonus(float bonus) { processingSpeedBonus = bonus; } - public Float getSpeedBonus() { + public float getSpeedBonus() { return processingSpeedBonus; } - public void setUpgrade83(Boolean upgrade) { - isUpgrade83Unlocked = upgrade; + public void setEnergyDiscount(float discount) { + energyDiscount = discount; + } + + public float getEnergyDiscount() { + return energyDiscount; + } + + public void setUpgrade83(boolean unlocked) { + isUpgrade83Unlocked = unlocked; + } + + public void setOverclockTimeFactor(double factor) { + overclockTimeFactor = factor; + } + + public double getOverclockTimeFactor() { + return overclockTimeFactor; + } + + public void setMultiStepPlasma(boolean isCapable) { + isMultiStepPlasmaCapable = isCapable; + } + + public void setProcessingVoltage(long Voltage) { + processingVoltage = Voltage; + } + + public long getProcessingVoltage() { + return processingVoltage; + } + + public void setMagmatterCapable(boolean isCapable) { + isMagmatterCapable = isCapable; + } + + public float getHeatEnergyDiscount() { + return isUpgrade83Unlocked ? 0.92f : 0.95f; + } + + public void setPlasmaTier(int tier) { + plasmaTier = tier; + } + + public int getPlasmaTier() { + return plasmaTier; + } + + public void setVoltageConfig(boolean unlocked) { + isVoltageConfigUnlocked = unlocked; + } + + public void setPowerTally(BigInteger amount) { + powerTally = amount; + } + + public BigInteger getPowerTally() { + return powerTally; + } + + public void addToPowerTally(BigInteger amount) { + powerTally = powerTally.add(amount); + } + + public void setRecipeTally(long amount) { + recipeTally = amount; + } + + public long getRecipeTally() { + return recipeTally; + } + + public void addToRecipeTally(long amount) { + recipeTally += amount; } protected void fixAllIssues() { @@ -159,13 +289,13 @@ public IStructureDefinition getSt @Override public void construct(ItemStack stackSize, boolean hintsOnly) { - structureBuild_EM(STRUCTURE_PIECE_MAIN, 0, 1, 0, stackSize, hintsOnly); + structureBuild_EM(STRUCTURE_PIECE_MAIN, 3, 3, 0, stackSize, hintsOnly); } @Override public boolean checkMachine_EM(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) { fixAllIssues(); - return structureCheck_EM(STRUCTURE_PIECE_MAIN, 0, 1, 0); + return structureCheck_EM(STRUCTURE_PIECE_MAIN, 3, 3, 0); } @Override @@ -188,13 +318,80 @@ public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildCont drawTexts(screenElements, inventorySlot); builder.widget(screenElements); + buildContext.addSyncedWindow(VOLTAGE_WINDOW_ID, this::createVoltageWindow); + + builder.widget( + TextWidget.dynamicText(this::connectionStatus).setDefaultColor(EnumChatFormatting.BLACK).setPos(75, 94) + .setSize(100, 10)); + builder.widget(createPowerSwitchButton(builder)).widget(createVoidExcessButton(builder)) .widget(createInputSeparationButton(builder)).widget(createBatchModeButton(builder)) - .widget(createLockToSingleRecipeButton(builder)); + .widget(createLockToSingleRecipeButton(builder)).widget(createVoltageButton(builder)); + } + + protected Widget createVoltageButton(IWidgetBuilder builder) { + Widget button = new ButtonWidget().setOnClick((clickData, widget) -> { + if (isVoltageConfigUnlocked) { + if (!widget.isClient()) { + widget.getContext().openSyncedWindow(VOLTAGE_WINDOW_ID); + } + } + }).setPlayClickSound(isVoltageConfigUnlocked).setBackground(() -> { + List ret = new ArrayList<>(); + ret.add(GT_UITextures.BUTTON_STANDARD); + if (isVoltageConfigUnlocked) { + ret.add(TecTechUITextures.OVERLAY_BUTTON_POWER_PASS_ON); + } else { + ret.add(TecTechUITextures.OVERLAY_BUTTON_POWER_PASS_DISABLED); + } + return ret.toArray(new IDrawable[0]); + }).addTooltip(translateToLocal("fog.button.voltageconfig.tooltip.01")).setTooltipShowUpDelay(TOOLTIP_DELAY) + .setPos(174, 129).setSize(16, 16).attachSyncer( + new FakeSyncWidget.BooleanSyncer( + () -> isVoltageConfigUnlocked, + val -> isVoltageConfigUnlocked = val), + builder); + if (!isVoltageConfigUnlocked) { + button.addTooltip(EnumChatFormatting.GRAY + translateToLocal("fog.button.voltageconfig.tooltip.02")); + } + return button; + } + + protected ModularWindow createVoltageWindow(final EntityPlayer player) { + final int WIDTH = 158; + final int HEIGHT = 52; + final int PARENT_WIDTH = getGUIWidth(); + final int PARENT_HEIGHT = getGUIHeight(); + ModularWindow.Builder builder = ModularWindow.builder(WIDTH, HEIGHT); + builder.setBackground(GT_UITextures.BACKGROUND_SINGLEBLOCK_DEFAULT); + builder.setGuiTint(getGUIColorization()); + builder.setDraggable(true); + builder.setPos( + (size, window) -> Alignment.Center.getAlignedPos(size, new Size(PARENT_WIDTH, PARENT_HEIGHT)).add( + Alignment.BottomRight + .getAlignedPos(new Size(PARENT_WIDTH, PARENT_HEIGHT), new Size(WIDTH, HEIGHT)) + .add(WIDTH - 3, 0).subtract(0, 10))); + builder.widget( + TextWidget.localised("gt.blockmachines.multimachine.FOG.voltageinfo").setPos(3, 4).setSize(150, 20)) + .widget( + new NumericWidget().setSetter(val -> processingVoltage = (long) val) + .setGetter(() -> processingVoltage).setBounds(2_000_000_000, Long.MAX_VALUE) + .setDefaultValue(2_000_000_000).setScrollValues(1, 4, 64) + .setTextAlignment(Alignment.Center).setTextColor(Color.WHITE.normal).setSize(150, 18) + .setPos(4, 25).setBackground(GT_UITextures.BACKGROUND_TEXT_FIELD).attachSyncer( + new FakeSyncWidget.LongSyncer( + this::getProcessingVoltage, + this::setProcessingVoltage), + builder)); + return builder.build(); } @Override - public void addGregTechLogo(ModularWindow.Builder builder) {} + public void addGregTechLogo(ModularWindow.Builder builder) { + builder.widget( + new DrawableWidget().setDrawable(TecTechUITextures.PICTURE_GODFORGE_LOGO).setSize(18, 18) + .setPos(172, 67)); + } @Override public boolean supportsInputSeparation() { @@ -226,27 +423,50 @@ public boolean willExplodeInRain() { return false; } + private Text connectionStatus() { + String status = EnumChatFormatting.RED + + translateToLocal("gt.blockmachines.multimachine.FOG.modulestatus.false"); + if (isConnected) { + status = EnumChatFormatting.GREEN + translateToLocal("gt.blockmachines.multimachine.FOG.modulestatus.true"); + } + return new Text(translateToLocal("gt.blockmachines.multimachine.FOG.modulestatus") + " " + status); + } + @Override public void saveNBTData(NBTTagCompound NBT) { NBT.setBoolean("isConnected", isConnected); + NBT.setBoolean("isVoltageConfigUnlocked", isVoltageConfigUnlocked); + NBT.setLong("processingVoltage", processingVoltage); + NBT.setLong("recipeTally", recipeTally); + NBT.setByteArray("powerTally", powerTally.toByteArray()); super.saveNBTData(NBT); } @Override public void loadNBTData(final NBTTagCompound NBT) { isConnected = NBT.getBoolean("isConnected"); + isVoltageConfigUnlocked = NBT.getBoolean("isVoltageConfigUnlocked"); + processingVoltage = NBT.getLong("processingVoltage"); + recipeTally = NBT.getLong("recipeTally"); + powerTally = new BigInteger(NBT.getByteArray("powerTally")); super.loadNBTData(NBT); } + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister aBlockIconRegister) { + ScreenON = new Textures.BlockIcons.CustomIcon("iconsets/GODFORGE_MODULE_ACTIVE"); + ScreenOFF = new Textures.BlockIcons.CustomIcon("iconsets/SCREEN_OFF"); + super.registerIcons(aBlockIconRegister); + } + @Override public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection facing, int colorIndex, boolean aActive, boolean aRedstone) { if (side == facing) { - return new ITexture[] { Textures.BlockIcons.getCasingTextureForId(texturePage << 7), - new TT_RenderedExtendedFacingTexture( - aActive ? GT_MetaTileEntity_MultiblockBase_EM.ScreenON - : GT_MetaTileEntity_MultiblockBase_EM.ScreenOFF) }; + return new ITexture[] { Textures.BlockIcons.getCasingTextureForId(TEXTURE_INDEX), + new TT_RenderedExtendedFacingTexture(aActive ? ScreenON : ScreenOFF) }; } - return new ITexture[] { Textures.BlockIcons.getCasingTextureForId(texturePage << 7) }; + return new ITexture[] { Textures.BlockIcons.getCasingTextureForId(TEXTURE_INDEX) }; } } diff --git a/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/godforge_modules/GT_MetaTileEntity_EM_ExoticModule.java b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/godforge_modules/GT_MetaTileEntity_EM_ExoticModule.java index 0950ed47e..d9f60c7bf 100644 --- a/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/godforge_modules/GT_MetaTileEntity_EM_ExoticModule.java +++ b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/godforge_modules/GT_MetaTileEntity_EM_ExoticModule.java @@ -1,11 +1,9 @@ package com.github.technus.tectech.thing.metaTileEntity.multi.godforge_modules; -import static com.github.technus.tectech.loader.recipe.Godforge.exoticModuleMagmatterFluidMap; import static com.github.technus.tectech.loader.recipe.Godforge.exoticModuleMagmatterItemMap; import static com.github.technus.tectech.loader.recipe.Godforge.exoticModulePlasmaFluidMap; import static com.github.technus.tectech.loader.recipe.Godforge.exoticModulePlasmaItemMap; import static com.github.technus.tectech.recipe.TecTechRecipeMaps.godforgeExoticMatterRecipes; -import static com.github.technus.tectech.thing.casing.GT_Block_CasingsTT.texturePage; import static com.github.technus.tectech.util.GodforgeMath.getRandomIntInRange; import static gregtech.api.metatileentity.BaseTileEntity.TOOLTIP_DELAY; import static gregtech.api.util.GT_RecipeBuilder.INGOTS; @@ -32,7 +30,7 @@ import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; -import net.minecraftforge.common.util.ForgeDirection; +import net.minecraft.util.EnumChatFormatting; import net.minecraftforge.fluids.FluidRegistry; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.oredict.OreDictionary; @@ -40,8 +38,6 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import com.github.technus.tectech.thing.metaTileEntity.multi.base.GT_MetaTileEntity_MultiblockBase_EM; -import com.github.technus.tectech.thing.metaTileEntity.multi.base.render.TT_RenderedExtendedFacingTexture; import com.github.technus.tectech.util.CommonValues; import com.gtnewhorizons.modularui.api.drawable.IDrawable; import com.gtnewhorizons.modularui.api.drawable.UITexture; @@ -53,10 +49,8 @@ import com.gtnewhorizons.modularui.common.widget.FakeSyncWidget; import gregtech.api.enums.MaterialsUEVplus; -import gregtech.api.enums.Textures; import gregtech.api.enums.TierEU; import gregtech.api.gui.modularui.GT_UITextures; -import gregtech.api.interfaces.ITexture; import gregtech.api.interfaces.metatileentity.IMetaTileEntity; import gregtech.api.interfaces.tileentity.IGregTechTileEntity; import gregtech.api.logic.ProcessingLogic; @@ -75,11 +69,10 @@ public class GT_MetaTileEntity_EM_ExoticModule extends GT_MetaTileEntity_EM_Base private int numberOfFluids = 0; private int numberOfItems = 0; - private int currentParallel = 0; private long wirelessEUt = 0; private long EUt = 0; + private long actualParallel = 0; private boolean recipeInProgress = false; - private boolean magmatterCapable = true; private boolean magmatterMode = false; private FluidStack[] randomizedFluidInput = new FluidStack[] {}; private ItemStack[] randomizedItemInput = new ItemStack[] {}; @@ -112,37 +105,47 @@ protected ProcessingLogic createProcessingLogic() { @Override protected Stream findRecipeMatches(@Nullable RecipeMap map) { if (!recipeInProgress) { - HashMap fluidMap = exoticModulePlasmaFluidMap; - HashMap itemMap = exoticModulePlasmaItemMap; - FluidStack outputFluid = MaterialsUEVplus.QuarkGluonPlasma.getFluid(1000); - - if (magmatterMode) { - fluidMap = exoticModuleMagmatterFluidMap; - itemMap = exoticModuleMagmatterItemMap; - outputFluid = MaterialsUEVplus.MagMatter.getMolten(144); - } - + actualParallel = getMaxParallel(); + FluidStack outputFluid = MaterialsUEVplus.QuarkGluonPlasma.getFluid(1000 * actualParallel); tempRecipeMap = emptyRecipeMap; - numberOfFluids = getRandomIntInRange(0, NUMBER_OF_INPUTS); - numberOfItems = NUMBER_OF_INPUTS - numberOfFluids; - randomizedFluidInput = getRandomFluidInputs(fluidMap, numberOfFluids); - randomizedItemInput = getRandomItemInputs(itemMap, numberOfItems); - - if (numberOfFluids != 0) { - for (FluidStack fluidStack : randomizedFluidInput) { - fluidStack.amount = 1000 * getRandomIntInRange(1, 64); + if (magmatterMode) { + randomizedItemInput = getRandomItemInputs(exoticModuleMagmatterItemMap, 1); + numberOfItems = 1; + numberOfFluids = 2; + int timeAmount = getRandomIntInRange(1, 50); + int spaceAmount = getRandomIntInRange(51, 100); + randomizedFluidInput = new FluidStack[] { MaterialsUEVplus.Time.getMolten(timeAmount * 1000L), + MaterialsUEVplus.Space.getMolten(spaceAmount * 1000L) }; + inputPlasmas = new ArrayList<>( + Arrays.asList( + convertItemToPlasma( + randomizedItemInput, + (spaceAmount - timeAmount) * actualParallel))); + inputPlasmas.add(MaterialsUEVplus.Time.getMolten(timeAmount * actualParallel)); + inputPlasmas.add(MaterialsUEVplus.Space.getMolten(spaceAmount * actualParallel)); + outputFluid = MaterialsUEVplus.MagMatter.getMolten(144 * actualParallel); + } else { + numberOfFluids = getRandomIntInRange(0, NUMBER_OF_INPUTS); + numberOfItems = NUMBER_OF_INPUTS - numberOfFluids; + randomizedFluidInput = getRandomFluidInputs(exoticModulePlasmaFluidMap, numberOfFluids); + randomizedItemInput = getRandomItemInputs(exoticModulePlasmaItemMap, numberOfItems); + + if (numberOfFluids != 0) { + for (FluidStack fluidStack : randomizedFluidInput) { + fluidStack.amount = 1000 * getRandomIntInRange(1, 64); + } } - } - if (numberOfItems != 0) { - for (ItemStack itemStack : randomizedItemInput) { - itemStack.stackSize = getRandomIntInRange(1, 64); + if (numberOfItems != 0) { + for (ItemStack itemStack : randomizedItemInput) { + itemStack.stackSize = getRandomIntInRange(1, 64); + } } - } - - inputPlasmas = new ArrayList<>(Arrays.asList(convertItemToPlasma(randomizedItemInput, 1))); - inputPlasmas.addAll(Arrays.asList(convertFluidToPlasma(randomizedFluidInput, 1))); + inputPlasmas = new ArrayList<>( + Arrays.asList(convertItemToPlasma(randomizedItemInput, actualParallel))); + inputPlasmas.addAll(Arrays.asList(convertFluidToPlasma(randomizedFluidInput, actualParallel))); + } plasmaRecipe = new GT_Recipe( false, null, @@ -151,7 +154,7 @@ protected Stream findRecipeMatches(@Nullable RecipeMap map) { null, inputPlasmas.toArray(new FluidStack[0]), new FluidStack[] { outputFluid }, - 10 * SECONDS, + 10 * SECONDS * (int) actualParallel, (int) TierEU.RECIPE_MAX, 0); @@ -175,14 +178,30 @@ protected CheckRecipeResult validateRecipe(@Nonnull GT_Recipe recipe) { for (FluidStack fluidStack : randomizedFluidInput) { dumpFluid( mOutputHatches, - new FluidStack(fluidStack.getFluid(), fluidStack.amount / 1000), + new FluidStack( + fluidStack.getFluid(), + (int) (fluidStack.amount / 1000 * actualParallel)), false); } } if (numberOfItems != 0) { + long multiplier = actualParallel; + if (magmatterMode) { + multiplier = 1; + } for (ItemStack itemStack : randomizedItemInput) { - addOutput(itemStack); + int stacksize = (int) (itemStack.stackSize * multiplier); + ItemStack tmpItem = itemStack.copy(); + // split itemStacks > 64 + while (stacksize >= 64) { + tmpItem.stackSize = 64; + addOutput(tmpItem); + stacksize -= 64; + } + tmpItem.stackSize = stacksize; + addOutput(tmpItem); + } } @@ -201,7 +220,8 @@ protected CheckRecipeResult onRecipeStart(@Nonnull GT_Recipe recipe) { if (!addEUToGlobalEnergyMap(userUUID, -calculatedEut * duration)) { return CheckRecipeResultRegistry.insufficientPower(wirelessEUt * recipe.mDuration); } - currentParallel = calculatedParallels; + addToPowerTally(BigInteger.valueOf(calculatedEut).multiply(BigInteger.valueOf(duration))); + addToRecipeTally(calculatedParallels); EUt = calculatedEut; setCalculatedEut(0); tempRecipeMap = emptyRecipeMap; @@ -212,7 +232,8 @@ protected CheckRecipeResult onRecipeStart(@Nonnull GT_Recipe recipe) { @Nonnull @Override protected GT_OverclockCalculator createOverclockCalculator(@Nonnull GT_Recipe recipe) { - return super.createOverclockCalculator(recipe).setEUt(TierEU.MAX).setNoOverclock(true); + return super.createOverclockCalculator(recipe).setEUt(getProcessingVoltage()) + .setDurationDecreasePerOC(getOverclockTimeFactor()); } }; @@ -223,18 +244,8 @@ protected void setProcessingLogicPower(ProcessingLogic logic) { logic.setAvailableVoltage(Long.MAX_VALUE); logic.setAvailableAmperage(Integer.MAX_VALUE); logic.setAmperageOC(false); - } - - @Override - public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection facing, - int colorIndex, boolean aActive, boolean aRedstone) { - if (side == facing) { - return new ITexture[] { Textures.BlockIcons.getCasingTextureForId(texturePage << 7), - new TT_RenderedExtendedFacingTexture( - aActive ? GT_MetaTileEntity_MultiblockBase_EM.ScreenON - : GT_MetaTileEntity_MultiblockBase_EM.ScreenOFF) }; - } - return new ITexture[] { Textures.BlockIcons.getCasingTextureForId(texturePage << 7) }; + logic.setSpeedBonus(getSpeedBonus()); + logic.setEuModifier(getEnergyDiscount()); } @Override @@ -423,40 +434,42 @@ public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildCont protected ButtonWidget magmatterSwitch(IWidgetBuilder builder) { Widget button = new ButtonWidget().setOnClick((clickData, widget) -> { - if (magmatterCapable) { + if (isMagmatterCapable) { magmatterMode = !magmatterMode; } - }).setPlayClickSound(isMagmatterModeOn()).setBackground(() -> { + }).setPlayClickSound(isMagmatterCapable).setBackground(() -> { List ret = new ArrayList<>(); if (isMagmatterModeOn()) { ret.add(GT_UITextures.BUTTON_STANDARD_PRESSED); - if (magmatterCapable) { + if (isMagmatterCapable) { ret.add(GT_UITextures.OVERLAY_BUTTON_CHECKMARK); } else { ret.add(GT_UITextures.OVERLAY_BUTTON_DISABLE); } } else { ret.add(GT_UITextures.BUTTON_STANDARD); - if (magmatterCapable) { + if (isMagmatterCapable) { ret.add(GT_UITextures.OVERLAY_BUTTON_CROSS); } else { ret.add(GT_UITextures.OVERLAY_BUTTON_DISABLE); } } - if (!magmatterCapable) { + if (!isMagmatterCapable) { ret.add(GT_UITextures.OVERLAY_BUTTON_DISABLE); } return ret.toArray(new IDrawable[0]); }).attachSyncer(new FakeSyncWidget.BooleanSyncer(this::isMagmatterModeOn, this::setMagmatterMode), builder) .addTooltip(translateToLocal("fog.button.magmattermode.tooltip.01")) - .setTooltipShowUpDelay(TOOLTIP_DELAY).setPos(174, 91).setSize(16, 16); - if (!magmatterCapable) { - button.addTooltip(translateToLocal("fog.button.magmattermode.tooltip.02")); + .setTooltipShowUpDelay(TOOLTIP_DELAY).setPos(174, 91).setSize(16, 16).attachSyncer( + new FakeSyncWidget.BooleanSyncer(() -> isMagmatterCapable, this::setMagmatterCapable), + builder); + if (!isMagmatterCapable) { + button.addTooltip(EnumChatFormatting.GRAY + translateToLocal("fog.button.magmattermode.tooltip.02")); } return (ButtonWidget) button; } - private boolean isMagmatterModeOn() { + public boolean isMagmatterModeOn() { return magmatterMode; } @@ -467,13 +480,10 @@ private void setMagmatterMode(boolean enabled) { @Override public GT_Multiblock_Tooltip_Builder createTooltip() { final GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder(); - tt.addMachineType("Quark Gluon Plasma Module") // Machine Type: - .addInfo("Controller block of the Quark Gluon Plasma Module") // Controller + tt.addMachineType("Exotic Matter Producer").addInfo("Controller block of the Quark Gluon Plasma Module") .addInfo("Uses a Star to to turn Items into Quark Gluon Plasma").addSeparator() - .beginStructureBlock(1, 4, 2, false).addEnergyHatch("Any Infinite Spacetime Casing", 1) // Energy Hatch: - // Any - .addMaintenanceHatch("Any Infinite Spacetime Casing", 1) // Maintenance - .toolTipFinisher(CommonValues.TEC_MARK_EM); + .beginStructureBlock(1, 4, 2, false).addEnergyHatch("Any Infinite Spacetime Casing", 1) + .addMaintenanceHatch("Any Infinite Spacetime Casing", 1).toolTipFinisher(CommonValues.GODFORGE_MARK); return tt; } @@ -491,7 +501,10 @@ public String[] getInfoData() { + " s"); str.add("Currently using: " + RED + formatNumbers(EUt) + RESET + " EU/t"); str.add(YELLOW + "Max Parallel: " + RESET + formatNumbers(getMaxParallel())); - str.add(YELLOW + "Current Parallel: " + RESET + formatNumbers(currentParallel)); + str.add(YELLOW + "Current Parallel: " + RESET + formatNumbers(getMaxParallel())); + str.add(YELLOW + "Recipe time multiplier: " + RESET + formatNumbers(getSpeedBonus())); + str.add(YELLOW + "Energy multiplier: " + RESET + formatNumbers(getEnergyDiscount())); + str.add(YELLOW + "Recipe time divisor per non-perfect OC: " + RESET + formatNumbers(getOverclockTimeFactor())); return str.toArray(new String[0]); } diff --git a/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/godforge_modules/GT_MetaTileEntity_EM_MoltenModule.java b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/godforge_modules/GT_MetaTileEntity_EM_MoltenModule.java index a9e8c411d..77fb548a3 100644 --- a/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/godforge_modules/GT_MetaTileEntity_EM_MoltenModule.java +++ b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/godforge_modules/GT_MetaTileEntity_EM_MoltenModule.java @@ -1,6 +1,5 @@ package com.github.technus.tectech.thing.metaTileEntity.multi.godforge_modules; -import static com.github.technus.tectech.thing.casing.GT_Block_CasingsTT.texturePage; import static gregtech.api.util.GT_OreDictUnificator.getAssociation; import static gregtech.api.util.GT_ParallelHelper.addFluidsLong; import static gregtech.api.util.GT_ParallelHelper.addItemsLong; @@ -20,21 +19,15 @@ import javax.annotation.Nonnull; import net.minecraft.item.ItemStack; -import net.minecraftforge.common.util.ForgeDirection; import net.minecraftforge.fluids.FluidRegistry; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.oredict.OreDictionary; import org.jetbrains.annotations.NotNull; -import com.github.technus.tectech.thing.metaTileEntity.multi.base.GT_MetaTileEntity_MultiblockBase_EM; -import com.github.technus.tectech.thing.metaTileEntity.multi.base.render.TT_RenderedExtendedFacingTexture; import com.github.technus.tectech.util.CommonValues; import gregtech.api.enums.Materials; -import gregtech.api.enums.Textures; -import gregtech.api.enums.TierEU; -import gregtech.api.interfaces.ITexture; import gregtech.api.interfaces.metatileentity.IMetaTileEntity; import gregtech.api.interfaces.tileentity.IGregTechTileEntity; import gregtech.api.logic.ProcessingLogic; @@ -105,7 +98,7 @@ protected CheckRecipeResult validateRecipe(@Nonnull GT_Recipe recipe) { // substring 8 because ingotHot is 8 characters long String strippedOreDict = dict.substring(8); meltableItems[i] = FluidRegistry - .getFluidStack("molten." + strippedOreDict.toLowerCase(), (int) (INGOTS)); + .getFluidStack("molten." + strippedOreDict.toLowerCase(), INGOTS); } } @@ -115,8 +108,10 @@ protected CheckRecipeResult validateRecipe(@Nonnull GT_Recipe recipe) { @Nonnull @Override protected GT_OverclockCalculator createOverclockCalculator(@Nonnull GT_Recipe recipe) { - return super.createOverclockCalculator(recipe).setEUt(TierEU.MAX).setRecipeHeat(recipe.mSpecialValue) - .setHeatOC(true).setHeatDiscount(true).setMachineHeat(getHeat()); + return super.createOverclockCalculator(recipe).setEUt(getProcessingVoltage()) + .setRecipeHeat(recipe.mSpecialValue).setHeatOC(true).setHeatDiscount(true) + .setMachineHeat(getHeatForOC()).setHeatDiscountMultiplier(getHeatEnergyDiscount()) + .setDurationDecreasePerOC(getOverclockTimeFactor()); } @@ -126,6 +121,8 @@ protected CheckRecipeResult onRecipeStart(@Nonnull GT_Recipe recipe) { if (!addEUToGlobalEnergyMap(userUUID, -calculatedEut * duration)) { return CheckRecipeResultRegistry.insufficientPower(calculatedEut * duration); } + addToPowerTally(BigInteger.valueOf(calculatedEut).multiply(BigInteger.valueOf(duration))); + addToRecipeTally(calculatedParallels); currentParallel = calculatedParallels; EUt = calculatedEut; setCalculatedEut(0); @@ -180,18 +177,7 @@ protected void setProcessingLogicPower(ProcessingLogic logic) { logic.setAmperageOC(false); logic.setMaxParallel(getMaxParallel()); logic.setSpeedBonus(getSpeedBonus()); - } - - @Override - public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection facing, - int colorIndex, boolean aActive, boolean aRedstone) { - if (side == facing) { - return new ITexture[] { Textures.BlockIcons.getCasingTextureForId(texturePage << 7), - new TT_RenderedExtendedFacingTexture( - aActive ? GT_MetaTileEntity_MultiblockBase_EM.ScreenON - : GT_MetaTileEntity_MultiblockBase_EM.ScreenOFF) }; - } - return new ITexture[] { Textures.BlockIcons.getCasingTextureForId(texturePage << 7) }; + logic.setEuModifier(getEnergyDiscount()); } @Override @@ -210,19 +196,20 @@ public String[] getInfoData() { str.add(YELLOW + "Max Parallel: " + RESET + formatNumbers(getMaxParallel())); str.add(YELLOW + "Current Parallel: " + RESET + formatNumbers(currentParallel)); str.add(YELLOW + "Heat Capacity: " + RESET + formatNumbers(getHeat())); + str.add(YELLOW + "Effective Heat Capacity: " + RESET + formatNumbers(getHeatForOC())); str.add(YELLOW + "Recipe time multiplier: " + RESET + formatNumbers(getSpeedBonus())); + str.add(YELLOW + "Energy multiplier: " + RESET + formatNumbers(getEnergyDiscount())); + str.add(YELLOW + "Recipe time divisor per non-perfect OC: " + RESET + formatNumbers(getOverclockTimeFactor())); return str.toArray(new String[0]); } @Override public GT_Multiblock_Tooltip_Builder createTooltip() { final GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder(); - tt.addMachineType("Molten Module") // Machine Type: - .addInfo("Controller block of the Molten Module") // Controller + tt.addMachineType("Blast Furnace").addInfo("Controller block of the Molten Module") .addInfo("Uses a Star to to melt Metals").addSeparator().beginStructureBlock(1, 4, 2, false) - .addEnergyHatch("Any Infinite Spacetime Casing", 1) // Energy Hatch: Any - .addMaintenanceHatch("Any Infinite Spacetime Casing", 1) // Maintenance - .toolTipFinisher(CommonValues.TEC_MARK_EM); + .addEnergyHatch("Any Infinite Spacetime Casing", 1) + .addMaintenanceHatch("Any Infinite Spacetime Casing", 1).toolTipFinisher(CommonValues.GODFORGE_MARK); return tt; } diff --git a/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/godforge_modules/GT_MetaTileEntity_EM_PlasmaModule.java b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/godforge_modules/GT_MetaTileEntity_EM_PlasmaModule.java index 299dbb4fc..94eb49ea2 100644 --- a/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/godforge_modules/GT_MetaTileEntity_EM_PlasmaModule.java +++ b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/godforge_modules/GT_MetaTileEntity_EM_PlasmaModule.java @@ -1,7 +1,6 @@ package com.github.technus.tectech.thing.metaTileEntity.multi.godforge_modules; import static com.github.technus.tectech.recipe.TecTechRecipeMaps.godforgePlasmaRecipes; -import static com.github.technus.tectech.thing.casing.GT_Block_CasingsTT.texturePage; import static gregtech.api.metatileentity.BaseTileEntity.TOOLTIP_DELAY; import static gregtech.api.util.GT_Utility.formatNumbers; import static gregtech.common.misc.WirelessNetworkManager.addEUToGlobalEnergyMap; @@ -17,12 +16,8 @@ import javax.annotation.Nonnull; -import net.minecraftforge.common.util.ForgeDirection; - import org.jetbrains.annotations.NotNull; -import com.github.technus.tectech.thing.metaTileEntity.multi.base.GT_MetaTileEntity_MultiblockBase_EM; -import com.github.technus.tectech.thing.metaTileEntity.multi.base.render.TT_RenderedExtendedFacingTexture; import com.github.technus.tectech.util.CommonValues; import com.gtnewhorizons.modularui.api.drawable.IDrawable; import com.gtnewhorizons.modularui.api.math.Alignment; @@ -36,10 +31,7 @@ import com.gtnewhorizons.modularui.common.widget.textfield.TextFieldWidget; import gregtech.api.enums.SoundResource; -import gregtech.api.enums.Textures; -import gregtech.api.enums.TierEU; import gregtech.api.gui.modularui.GT_UITextures; -import gregtech.api.interfaces.ITexture; import gregtech.api.interfaces.metatileentity.IMetaTileEntity; import gregtech.api.interfaces.tileentity.IGregTechTileEntity; import gregtech.api.logic.ProcessingLogic; @@ -56,9 +48,7 @@ public class GT_MetaTileEntity_EM_PlasmaModule extends GT_MetaTileEntity_EM_Base private long EUt = 0; private int currentParallel = 0; - private boolean multiStep = false; private boolean debug = true; - private int fusionTier = 0; private int inputMaxParallel = 0; public GT_MetaTileEntity_EM_PlasmaModule(int aID, String aName, String aNameRegional) { @@ -87,8 +77,8 @@ protected CheckRecipeResult validateRecipe(@Nonnull GT_Recipe recipe) { if (getUserEU(userUUID).compareTo(BigInteger.valueOf(wirelessEUt * recipe.mDuration)) < 0) { return CheckRecipeResultRegistry.insufficientPower(wirelessEUt * recipe.mDuration); } - if (recipe.mSpecialValue > fusionTier - || Objects.equals(recipe.mSpecialItems.toString(), "true") && !multiStep) { + if (recipe.mSpecialValue > getPlasmaTier() + || Objects.equals(recipe.mSpecialItems.toString(), "true") && !isMultiStepPlasmaCapable) { return SimpleCheckRecipeResult.ofFailure("missing_upgrades"); } return CheckRecipeResultRegistry.SUCCESSFUL; @@ -101,6 +91,8 @@ protected CheckRecipeResult onRecipeStart(@Nonnull GT_Recipe recipe) { if (!addEUToGlobalEnergyMap(userUUID, -calculatedEut * duration)) { return CheckRecipeResultRegistry.insufficientPower(wirelessEUt * recipe.mDuration); } + addToPowerTally(BigInteger.valueOf(calculatedEut).multiply(BigInteger.valueOf(duration))); + addToRecipeTally(calculatedParallels); currentParallel = calculatedParallels; EUt = calculatedEut; setCalculatedEut(0); @@ -110,7 +102,8 @@ protected CheckRecipeResult onRecipeStart(@Nonnull GT_Recipe recipe) { @Nonnull @Override protected GT_OverclockCalculator createOverclockCalculator(@Nonnull GT_Recipe recipe) { - return super.createOverclockCalculator(recipe).setEUt(TierEU.MAX); + return super.createOverclockCalculator(recipe).setEUt(getProcessingVoltage()) + .setDurationDecreasePerOC(getOverclockTimeFactor()); } }; } @@ -122,6 +115,7 @@ protected void setProcessingLogicPower(ProcessingLogic logic) { logic.setAmperageOC(false); logic.setMaxParallel(getMaxParallel()); logic.setSpeedBonus(getSpeedBonus()); + logic.setEuModifier(getEnergyDiscount()); } @Override @@ -133,12 +127,13 @@ public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildCont } protected Widget createTestButton(IWidgetBuilder builder) { - return new ButtonWidget().setOnClick((clickData, widget) -> { multiStep = !multiStep; }) + return new ButtonWidget() + .setOnClick((clickData, widget) -> isMultiStepPlasmaCapable = !isMultiStepPlasmaCapable) .setPlayClickSoundResource( () -> isAllowedToWork() ? SoundResource.GUI_BUTTON_UP.resourceLocation : SoundResource.GUI_BUTTON_DOWN.resourceLocation) .setBackground(() -> { - if (multiStep) { + if (isMultiStepPlasmaCapable) { return new IDrawable[] { GT_UITextures.BUTTON_STANDARD_PRESSED, GT_UITextures.OVERLAY_BUTTON_POWER_SWITCH_ON }; } else { @@ -153,7 +148,7 @@ protected Widget createTestButton(IWidgetBuilder builder) { } protected Widget createTestButton2() { - return new TextFieldWidget().setSetterInt(val -> fusionTier = val).setGetterInt(() -> fusionTier) + return new TextFieldWidget().setSetterInt(this::setPlasmaTier).setGetterInt(this::getPlasmaTier) .setNumbers(0, 2).setTextAlignment(Alignment.Center).setTextColor(Color.WHITE.normal).setPos(3, 18) .addTooltip("fusion tier").setTooltipShowUpDelay(TOOLTIP_DELAY).setSize(16, 16).setPos(174, 80) .setBackground(GT_UITextures.BACKGROUND_TEXT_FIELD); @@ -166,18 +161,6 @@ protected Widget createTestButton3() { .setPos(174, 60).setBackground(GT_UITextures.BACKGROUND_TEXT_FIELD); } - @Override - public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection facing, - int colorIndex, boolean aActive, boolean aRedstone) { - if (side == facing) { - return new ITexture[] { Textures.BlockIcons.getCasingTextureForId(texturePage << 7), - new TT_RenderedExtendedFacingTexture( - aActive ? GT_MetaTileEntity_MultiblockBase_EM.ScreenON - : GT_MetaTileEntity_MultiblockBase_EM.ScreenOFF) }; - } - return new ITexture[] { Textures.BlockIcons.getCasingTextureForId(texturePage << 7) }; - } - @Override public RecipeMap getRecipeMap() { return godforgePlasmaRecipes; @@ -199,18 +182,18 @@ public String[] getInfoData() { str.add(YELLOW + "Max Parallel: " + RESET + formatNumbers(getMaxParallel())); str.add(YELLOW + "Current Parallel: " + RESET + formatNumbers(currentParallel)); str.add(YELLOW + "Recipe time multiplier: " + RESET + formatNumbers(getSpeedBonus())); + str.add(YELLOW + "Energy multiplier: " + RESET + formatNumbers(getEnergyDiscount())); + str.add(YELLOW + "Recipe time divisor per non-perfect OC: " + RESET + formatNumbers(getOverclockTimeFactor())); return str.toArray(new String[0]); } @Override public GT_Multiblock_Tooltip_Builder createTooltip() { final GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder(); - tt.addMachineType("Plasma Module") // Machine Type: - .addInfo("Controller block of the Plasma Module") // Controller + tt.addMachineType("Plasma Fabricator").addInfo("Controller block of the Plasma Module") .addInfo("Uses a Star to to turn Metals into Plasma").addSeparator().beginStructureBlock(1, 4, 2, false) - .addEnergyHatch("Any Infinite Spacetime Casing", 1) // Energy Hatch: Any - .addMaintenanceHatch("Any Infinite Spacetime Casing", 1) // Maintenance - .toolTipFinisher(CommonValues.TEC_MARK_EM); + .addEnergyHatch("Any Infinite Spacetime Casing", 1) + .addMaintenanceHatch("Any Infinite Spacetime Casing", 1).toolTipFinisher(CommonValues.GODFORGE_MARK); return tt; } diff --git a/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/godforge_modules/GT_MetaTileEntity_EM_SmeltingModule.java b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/godforge_modules/GT_MetaTileEntity_EM_SmeltingModule.java index cfd6839ce..831d04f6f 100644 --- a/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/godforge_modules/GT_MetaTileEntity_EM_SmeltingModule.java +++ b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/godforge_modules/GT_MetaTileEntity_EM_SmeltingModule.java @@ -1,6 +1,5 @@ package com.github.technus.tectech.thing.metaTileEntity.multi.godforge_modules; -import static com.github.technus.tectech.thing.casing.GT_Block_CasingsTT.texturePage; import static gregtech.api.metatileentity.BaseTileEntity.TOOLTIP_DELAY; import static gregtech.api.util.GT_Utility.formatNumbers; import static gregtech.common.misc.WirelessNetworkManager.addEUToGlobalEnergyMap; @@ -16,18 +15,13 @@ import java.util.Arrays; import java.util.Collection; import java.util.List; -import java.util.stream.Stream; import javax.annotation.Nonnull; -import javax.annotation.Nullable; import net.minecraft.nbt.NBTTagCompound; -import net.minecraftforge.common.util.ForgeDirection; import org.jetbrains.annotations.NotNull; -import com.github.technus.tectech.thing.metaTileEntity.multi.base.GT_MetaTileEntity_MultiblockBase_EM; -import com.github.technus.tectech.thing.metaTileEntity.multi.base.render.TT_RenderedExtendedFacingTexture; import com.github.technus.tectech.util.CommonValues; import com.gtnewhorizons.modularui.api.drawable.IDrawable; import com.gtnewhorizons.modularui.api.drawable.UITexture; @@ -38,10 +32,7 @@ import com.gtnewhorizons.modularui.common.widget.ButtonWidget; import com.gtnewhorizons.modularui.common.widget.FakeSyncWidget; -import gregtech.api.enums.Textures; -import gregtech.api.enums.TierEU; import gregtech.api.gui.modularui.GT_UITextures; -import gregtech.api.interfaces.ITexture; import gregtech.api.interfaces.metatileentity.IMetaTileEntity; import gregtech.api.interfaces.tileentity.IGregTechTileEntity; import gregtech.api.logic.ProcessingLogic; @@ -75,7 +66,7 @@ public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { @Override public RecipeMap getRecipeMap() { - return null; + return furnaceMode ? RecipeMaps.furnaceRecipes : RecipeMaps.blastFurnaceRecipes; } @Nonnull @@ -84,27 +75,12 @@ public Collection> getAvailableRecipeMaps() { return Arrays.asList(RecipeMaps.blastFurnaceRecipes, RecipeMaps.furnaceRecipes); } - private static RecipeMap getRecipeMap(boolean furnaceMode) { - if (furnaceMode) { - return RecipeMaps.furnaceRecipes; - } else { - return RecipeMaps.blastFurnaceRecipes; - } - } - long wirelessEUt = 0; @Override protected ProcessingLogic createProcessingLogic() { return new ProcessingLogic() { - @Nonnull - @Override - protected Stream findRecipeMatches(@Nullable RecipeMap map) { - RecipeMap recipes = getRecipeMap(furnaceMode); - return super.findRecipeMatches(recipes); - } - @NotNull @Override protected CheckRecipeResult validateRecipe(@Nonnull GT_Recipe recipe) { @@ -126,6 +102,10 @@ protected CheckRecipeResult onRecipeStart(@Nonnull GT_Recipe recipe) { if (!addEUToGlobalEnergyMap(userUUID, -calculatedEut * duration)) { return CheckRecipeResultRegistry.insufficientPower(calculatedEut * duration); } + addToPowerTally(BigInteger.valueOf(calculatedEut).multiply(BigInteger.valueOf(duration))); + if (!furnaceMode) { + addToRecipeTally(calculatedParallels); + } currentParallel = calculatedParallels; EUt = calculatedEut; setCalculatedEut(0); @@ -135,8 +115,10 @@ protected CheckRecipeResult onRecipeStart(@Nonnull GT_Recipe recipe) { @Nonnull @Override protected GT_OverclockCalculator createOverclockCalculator(@Nonnull GT_Recipe recipe) { - return super.createOverclockCalculator(recipe).setEUt(TierEU.MAX).setRecipeHeat(recipe.mSpecialValue) - .setHeatOC(true).setHeatDiscount(true).setMachineHeat(getHeat()); + return super.createOverclockCalculator(recipe).setEUt(getProcessingVoltage()) + .setRecipeHeat(recipe.mSpecialValue).setHeatOC(true).setHeatDiscount(true) + .setMachineHeat(getHeatForOC()).setHeatDiscountMultiplier(getHeatEnergyDiscount()) + .setDurationDecreasePerOC(getOverclockTimeFactor()); } }; } @@ -148,18 +130,7 @@ protected void setProcessingLogicPower(ProcessingLogic logic) { logic.setAmperageOC(false); logic.setMaxParallel(getMaxParallel()); logic.setSpeedBonus(getSpeedBonus()); - } - - @Override - public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection facing, - int colorIndex, boolean aActive, boolean aRedstone) { - if (side == facing) { - return new ITexture[] { Textures.BlockIcons.getCasingTextureForId(texturePage << 7), - new TT_RenderedExtendedFacingTexture( - aActive ? GT_MetaTileEntity_MultiblockBase_EM.ScreenON - : GT_MetaTileEntity_MultiblockBase_EM.ScreenOFF) }; - } - return new ITexture[] { Textures.BlockIcons.getCasingTextureForId(texturePage << 7) }; + logic.setEuModifier(getEnergyDiscount()); } @Override @@ -171,7 +142,7 @@ public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildCont protected ButtonWidget furnaceSwitch(IWidgetBuilder builder) { Widget button = new ButtonWidget().setOnClick((clickData, widget) -> furnaceMode = !furnaceMode) - .setPlayClickSound(isFurnaceModeOn()).setBackground(() -> { + .setPlayClickSound(true).setBackground(() -> { List ret = new ArrayList<>(); if (isFurnaceModeOn()) { ret.add(GT_UITextures.BUTTON_STANDARD_PRESSED); @@ -224,19 +195,20 @@ public String[] getInfoData() { str.add(YELLOW + "Max Parallel: " + RESET + formatNumbers(getMaxParallel())); str.add(YELLOW + "Current Parallel: " + RESET + formatNumbers(currentParallel)); str.add(YELLOW + "Heat Capacity: " + RESET + formatNumbers(getHeat())); + str.add(YELLOW + "Effective Heat Capacity: " + RESET + formatNumbers(getHeatForOC())); str.add(YELLOW + "Recipe time multiplier: " + RESET + formatNumbers(getSpeedBonus())); + str.add(YELLOW + "Energy multiplier: " + RESET + formatNumbers(getEnergyDiscount())); + str.add(YELLOW + "Recipe time divisor per non-perfect OC: " + RESET + formatNumbers(getOverclockTimeFactor())); return str.toArray(new String[0]); } @Override public GT_Multiblock_Tooltip_Builder createTooltip() { final GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder(); - tt.addMachineType("Smelting Module") // Machine Type: - .addInfo("Controller block of the Smelting Module") // Controller + tt.addMachineType("Blast Furnace, Furnace").addInfo("Controller block of the Smelting Module") .addInfo("Uses a Star to Smelt Metals").addSeparator().beginStructureBlock(1, 4, 2, false) - .addEnergyHatch("Any Infinite Spacetime Casing", 1) // Energy Hatch: Any - .addMaintenanceHatch("Any Infinite Spacetime Casing", 1) // Maintenance - .toolTipFinisher(CommonValues.TEC_MARK_EM); + .addEnergyHatch("Any Infinite Spacetime Casing", 1) + .addMaintenanceHatch("Any Infinite Spacetime Casing", 1).toolTipFinisher(CommonValues.GODFORGE_MARK); return tt; } diff --git a/src/main/java/com/github/technus/tectech/util/GodforgeMath.java b/src/main/java/com/github/technus/tectech/util/GodforgeMath.java index f5c7c660b..ea6301759 100644 --- a/src/main/java/com/github/technus/tectech/util/GodforgeMath.java +++ b/src/main/java/com/github/technus/tectech/util/GodforgeMath.java @@ -1,7 +1,10 @@ package com.github.technus.tectech.util; +import java.math.BigInteger; + import com.github.technus.tectech.thing.metaTileEntity.multi.GT_MetaTileEntity_EM_ForgeOfGods; import com.github.technus.tectech.thing.metaTileEntity.multi.godforge_modules.GT_MetaTileEntity_EM_BaseModule; +import com.github.technus.tectech.thing.metaTileEntity.multi.godforge_modules.GT_MetaTileEntity_EM_ExoticModule; import com.github.technus.tectech.thing.metaTileEntity.multi.godforge_modules.GT_MetaTileEntity_EM_MoltenModule; import com.github.technus.tectech.thing.metaTileEntity.multi.godforge_modules.GT_MetaTileEntity_EM_PlasmaModule; import com.github.technus.tectech.thing.metaTileEntity.multi.godforge_modules.GT_MetaTileEntity_EM_SmeltingModule; @@ -26,24 +29,35 @@ public static double calculateFuelConsumption(GT_MetaTileEntity_EM_ForgeOfGods g } else return Math.max(godforge.getFuelFactor() / 25 * upgradeFactor, 1); } - public static int calculateMaxFuelFactor(GT_MetaTileEntity_EM_ForgeOfGods godforge) { - - if (godforge.isUpgradeActive(27)) { - return Integer.MAX_VALUE; - } + public static int calculateStartupFuelConsumption(GT_MetaTileEntity_EM_ForgeOfGods godforge) { + return (int) Math.max(godforge.getFuelFactor() * 25 * Math.pow(1.2, godforge.getFuelFactor()), 1); + } + public static int calculateMaxFuelFactor(GT_MetaTileEntity_EM_ForgeOfGods godforge) { int fuelCap = 5; - if (godforge.isUpgradeActive(9)) { - fuelCap += godforge.getTotalActiveUpgrades(); + if (godforge.isUpgradeActive(27)) { + fuelCap = Integer.MAX_VALUE; + } else { + if (godforge.isUpgradeActive(9)) { + fuelCap += godforge.getTotalActiveUpgrades(); + } + if (godforge.isUpgradeActive(3)) { + fuelCap *= 1.2; + } } + return Math.max(fuelCap, 1); + } - if (godforge.isUpgradeActive(3)) { - fuelCap *= 1.2; + public static int calculateEffectiveFuelFactor(GT_MetaTileEntity_EM_ForgeOfGods godforge) { + int fuelFactor = godforge.getFuelFactor(); + if (fuelFactor <= 43) { + return fuelFactor; + } else { + return 43 + (int) Math.floor(Math.pow((fuelFactor - 43), 0.4)); } - return fuelCap; } - public static int calculateMaxHeatForModules(GT_MetaTileEntity_EM_BaseModule module, + public static void calculateMaxHeatForModules(GT_MetaTileEntity_EM_BaseModule module, GT_MetaTileEntity_EM_ForgeOfGods godforge) { double logBase = 1.5; int baseHeat = 12601; @@ -54,10 +68,35 @@ public static int calculateMaxHeatForModules(GT_MetaTileEntity_EM_BaseModule mod logBase = 1.18; } } - return baseHeat + (int) (Math.log(godforge.getFuelFactor()) / Math.log(logBase) * 1000); + int recipeHeat = baseHeat + (int) (Math.log(godforge.getFuelFactor()) / Math.log(logBase) * 1000); + module.setHeatForOC(calculateOverclockHeat(module, godforge, recipeHeat)); + module.setHeat(recipeHeat); } - public static float calucateSpeedBonusForModules(GT_MetaTileEntity_EM_BaseModule module, + public static int calculateOverclockHeat(GT_MetaTileEntity_EM_BaseModule module, + GT_MetaTileEntity_EM_ForgeOfGods godforge, Integer recipeHeat) { + int actualHeat; + double exponent; + if (godforge.isUpgradeActive(20)) { + if (module instanceof GT_MetaTileEntity_EM_SmeltingModule) { + exponent = 0.85; + } else { + exponent = 0.8; + } + if (recipeHeat > 30000) { + actualHeat = (int) Math.floor(30000 + Math.pow(recipeHeat - 30000, exponent)); + } else { + actualHeat = recipeHeat; + } + } else if (godforge.isUpgradeActive(17)) { + actualHeat = Math.min(recipeHeat, 30000); + } else { + actualHeat = Math.min(recipeHeat, 15000); + } + return actualHeat; + } + + public static void calculateSpeedBonusForModules(GT_MetaTileEntity_EM_BaseModule module, GT_MetaTileEntity_EM_ForgeOfGods godforge) { double speedBonus = 1; @@ -72,19 +111,19 @@ public static float calucateSpeedBonusForModules(GT_MetaTileEntity_EM_BaseModule speedBonus /= Math.pow(module.getMaxParallel(), 0.012); } } - return (float) speedBonus; - } - public static int calculateEffectiveFuelFactor(GT_MetaTileEntity_EM_ForgeOfGods godforge) { - int fuelFactor = godforge.getFuelFactor(); - if (fuelFactor <= 43) { - return fuelFactor; - } else { - return 43 + (int) Math.floor(Math.pow((fuelFactor - 43), 0.4)); + if (module instanceof GT_MetaTileEntity_EM_ExoticModule) { + if (godforge.isUpgradeActive(25)) { + speedBonus = Math.sqrt(speedBonus); + } else { + speedBonus = 1; + } } + + module.setSpeedBonus((float) speedBonus); } - public static int calucateMaxParallelForModules(GT_MetaTileEntity_EM_BaseModule module, + public static void calculateMaxParallelForModules(GT_MetaTileEntity_EM_BaseModule module, GT_MetaTileEntity_EM_ForgeOfGods godforge) { int baseParallel = 0; float fuelFactorMultiplier = 1; @@ -102,6 +141,9 @@ public static int calucateMaxParallelForModules(GT_MetaTileEntity_EM_BaseModule if (module instanceof GT_MetaTileEntity_EM_PlasmaModule) { baseParallel = 256; } + if (module instanceof GT_MetaTileEntity_EM_ExoticModule) { + baseParallel = 36; + } if (module instanceof GT_MetaTileEntity_EM_MoltenModule || (module instanceof GT_MetaTileEntity_EM_SmeltingModule && godforge.isUpgradeActive(16))) { @@ -140,6 +182,127 @@ public static int calucateMaxParallelForModules(GT_MetaTileEntity_EM_BaseModule } } - return (int) (baseParallel * node53 * fuelFactorMultiplier * heatMultiplier * upgradeAmountMultiplier); + int maxParallel = (int) (baseParallel * node53 + * fuelFactorMultiplier + * heatMultiplier + * upgradeAmountMultiplier); + + if (module instanceof GT_MetaTileEntity_EM_ExoticModule) { + if (godforge.isUpgradeActive(25)) { + maxParallel = (int) Math.max(9 * Math.floor(Math.sqrt(maxParallel) / 9), 36); + } else { + maxParallel = baseParallel; + } + } + + module.setMaxParallel(maxParallel); + } + + public static void calculateEnergyDiscountForModules(GT_MetaTileEntity_EM_BaseModule module, + GT_MetaTileEntity_EM_ForgeOfGods godforge) { + double fillRatioDiscount = 1; + double maxBatteryDiscount = 1; + + if (godforge.isUpgradeActive(8)) { + maxBatteryDiscount = 1 - (1 - Math.pow(1.001, -0.01 * godforge.getMaxBatteryCharge())) / 20; + } + + if (godforge.isUpgradeActive(19)) { + double fillRatioMinusZeroPointFive = (double) godforge.getBatteryCharge() / godforge.getMaxBatteryCharge() + - 0.5; + if (module instanceof GT_MetaTileEntity_EM_PlasmaModule) { + fillRatioDiscount = 1 - (Math.pow(fillRatioMinusZeroPointFive, 2) * (-0.6) + 0.15); + } else { + fillRatioDiscount = 1 - (Math.pow(fillRatioMinusZeroPointFive, 2) * (-0.6) + 0.15) * 2 / 3; + } + } + + if (module instanceof GT_MetaTileEntity_EM_ExoticModule) { + if (!godforge.isUpgradeActive(25)) { + fillRatioDiscount = 1; + maxBatteryDiscount = 1; + } else { + fillRatioDiscount = Math.sqrt(fillRatioDiscount); + maxBatteryDiscount = Math.sqrt(maxBatteryDiscount); + } + } + + module.setEnergyDiscount((float) (fillRatioDiscount * maxBatteryDiscount)); + } + + public static void calculateProcessingVoltageForModules(GT_MetaTileEntity_EM_BaseModule module, + GT_MetaTileEntity_EM_ForgeOfGods godforge) { + long voltage = Integer.MAX_VALUE; + + if (godforge.isUpgradeActive(4)) { + voltage += calculateEffectiveFuelFactor(godforge) * 100_000_000L; + } + + if (godforge.isUpgradeActive(23)) { + voltage *= Math.pow(4, godforge.getRingAmount()); + } + + module.setProcessingVoltage(voltage); + } + + public static void setMiscModuleParameters(GT_MetaTileEntity_EM_BaseModule module, + GT_MetaTileEntity_EM_ForgeOfGods godforge) { + int plasmaTier = 0; + double overclockTimeFactor = 2; + + if (godforge.isUpgradeActive(30)) { + plasmaTier = 2; + } else if (godforge.isUpgradeActive(24)) { + plasmaTier = 1; + } + + if (godforge.isUpgradeActive(14)) { + if (module instanceof GT_MetaTileEntity_EM_PlasmaModule) { + overclockTimeFactor = 2.3; + } else { + overclockTimeFactor = 2.15; + } + if (module instanceof GT_MetaTileEntity_EM_ExoticModule) { + if (godforge.isUpgradeActive(25)) { + overclockTimeFactor = 2 + Math.pow(overclockTimeFactor - 2, 2); + } else { + overclockTimeFactor = 2; + } + } + } + + module.setUpgrade83(godforge.isUpgradeActive(19)); + module.setMultiStepPlasma(godforge.isUpgradeActive(15)); + module.setPlasmaTier(plasmaTier); + module.setMagmatterCapable(godforge.isUpgradeActive(30)); + module.setVoltageConfig(godforge.isUpgradeActive(28)); + module.setOverclockTimeFactor(overclockTimeFactor); + } + + public static boolean allowModuleConnection(GT_MetaTileEntity_EM_BaseModule module, + GT_MetaTileEntity_EM_ForgeOfGods godforge) { + + if (module instanceof GT_MetaTileEntity_EM_MoltenModule && godforge.isUpgradeActive(5)) { + return true; + } + + if (module instanceof GT_MetaTileEntity_EM_PlasmaModule && godforge.isUpgradeActive(7)) { + return true; + } + + if (module instanceof GT_MetaTileEntity_EM_ExoticModule && godforge.isUpgradeActive(11)) { + return true; + } + + return module instanceof GT_MetaTileEntity_EM_SmeltingModule; + } + + public static void queryMilestoneStats(GT_MetaTileEntity_EM_BaseModule module, + GT_MetaTileEntity_EM_ForgeOfGods godforge) { + godforge.addTotalPowerConsumed(module.getPowerTally()); + module.setPowerTally(BigInteger.ZERO); + godforge.addTotalRecipesProcessed(module.getRecipeTally()); + module.setRecipeTally(0); + } } diff --git a/src/main/java/com/github/technus/tectech/util/TT_Utility.java b/src/main/java/com/github/technus/tectech/util/TT_Utility.java index edd4a2895..1656f865e 100644 --- a/src/main/java/com/github/technus/tectech/util/TT_Utility.java +++ b/src/main/java/com/github/technus/tectech/util/TT_Utility.java @@ -59,6 +59,14 @@ public static String toStandardForm(BigInteger number) { } + public static String toExponentForm(BigInteger number) { + BigInteger abs = number.abs(); + String strNum = abs.toString(); + int exponent = strNum.length() - 1; + return (number.signum() == -1 ? "-" : "") + strNum.charAt(0) + "." + strNum.substring(1, 3) + "e" + exponent; + + } + public static int bitStringToInt(String bits) { if (bits == null) { return 0; diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/GODFORGE_CONTROLLER.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/GODFORGE_CONTROLLER.png new file mode 100644 index 000000000..3266b1aec Binary files /dev/null and b/src/main/resources/assets/gregtech/textures/blocks/iconsets/GODFORGE_CONTROLLER.png differ diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/GODFORGE_CONTROLLER.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/GODFORGE_CONTROLLER.png.mcmeta new file mode 100644 index 000000000..7ab8340b0 --- /dev/null +++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/GODFORGE_CONTROLLER.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation":{ + "frametime":16 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/GODFORGE_MODULE_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/GODFORGE_MODULE_ACTIVE.png new file mode 100644 index 000000000..115885808 Binary files /dev/null and b/src/main/resources/assets/gregtech/textures/blocks/iconsets/GODFORGE_MODULE_ACTIVE.png differ diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/GODFORGE_MODULE_ACTIVE.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/GODFORGE_MODULE_ACTIVE.png.mcmeta new file mode 100644 index 000000000..0dab81071 --- /dev/null +++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/GODFORGE_MODULE_ACTIVE.png.mcmeta @@ -0,0 +1 @@ +{"animation": {"frametime": 3}} \ No newline at end of file diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/SCREEN_OFF.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/SCREEN_OFF.png new file mode 100644 index 000000000..af85482d1 Binary files /dev/null and b/src/main/resources/assets/gregtech/textures/blocks/iconsets/SCREEN_OFF.png differ diff --git a/src/main/resources/assets/tectech/lang/en_US.lang b/src/main/resources/assets/tectech/lang/en_US.lang index 38fec9632..44c600d28 100644 --- a/src/main/resources/assets/tectech/lang/en_US.lang +++ b/src/main/resources/assets/tectech/lang/en_US.lang @@ -905,77 +905,85 @@ fog.upgrade.tt.28=upgrade 151 fog.upgrade.tt.29=upgrade 161 fog.upgrade.tt.30=upgrade end -fog.upgrade.lore.0=*insert lore here* upgrade start -fog.upgrade.lore.1=*insert lore here* upgrade 11 -fog.upgrade.lore.2=*insert lore here* upgrade 21 -fog.upgrade.lore.3=*insert lore here* upgrade 22 -fog.upgrade.lore.4=*insert lore here* upgrade 31 -fog.upgrade.lore.5=*insert lore here* upgrade 32 -fog.upgrade.lore.6=*insert lore here* upgrade 33 -fog.upgrade.lore.7=*insert lore here* upgrade 41 -fog.upgrade.lore.8=*insert lore here* upgrade 51 -fog.upgrade.lore.9=*insert lore here* upgrade 52 -fog.upgrade.lore.10=*insert lore here* upgrade 53 -fog.upgrade.lore.11=*insert lore here* upgrade 61 -fog.upgrade.lore.12=*insert lore here* upgrade 71 -fog.upgrade.lore.13=*insert lore here* upgrade 72 -fog.upgrade.lore.14=*insert lore here* upgrade 73 -fog.upgrade.lore.15=*insert lore here* upgrade 74 -fog.upgrade.lore.16=*insert lore here* upgrade 80 -fog.upgrade.lore.17=*insert lore here* upgrade 81 -fog.upgrade.lore.18=*insert lore here* upgrade 82 -fog.upgrade.lore.19=*insert lore here* upgrade 83 -fog.upgrade.lore.20=*insert lore here* upgrade 91 -fog.upgrade.lore.21=*insert lore here* upgrade 92 -fog.upgrade.lore.22=*insert lore here* upgrade 93 -fog.upgrade.lore.23=*insert lore here* upgrade 101 -fog.upgrade.lore.24=*insert lore here* upgrade 111 -fog.upgrade.lore.25=*insert lore here* upgrade 121 -fog.upgrade.lore.26=*insert lore here* upgrade 131 -fog.upgrade.lore.27=*insert lore here* upgrade 141 -fog.upgrade.lore.28=*insert lore here* upgrade 151 -fog.upgrade.lore.29=*insert lore here* upgrade 161 +fog.upgrade.lore.0=The Forge of the Gods is an immensely powerful structure constructed around a stabilized neutron star – it is so advanced that its full capabilities are not yet understood. However, through continued use one can slowly upgrade and expand the range of abilities of the Forge, and learn the power hidden in the most extreme parts of the universe: graviton shards. This esoteric material can only be found where conventional matter and degenerate neutronium crust matter on the surface of a neutron star meet. At this point in space, gravitons are far more common and irradiate this material mixture to create highly unstable graviton shards, which can be used to internally upgrade the Forge. While these shards cannot yet exist outside the extreme conditions of the Forge, with continued research and utilization it may be possible to eventually isolate and extract them outside the Forge – but for what purpose? +fog.upgrade.lore.1=The first major upgrade of the Forge of the Gods has allowed for greater processing speeds as the heat increases, thanks to the space warping effects of graviton shards. This is the first of many applications of the shards, which will be discovered through continuous use of the Forge. +fog.upgrade.lore.2=Graviton shards warp the surface area of fuels used in the Forge, increasing efficiency as more material can be processed per unit of fuel. Graviton shards will prove crucial for further efficiency increases to offset the ever-increasing demands of the Forge. +fog.upgrade.lore.3=Through use of graviton shards, the space within the Forge’s fuel chambers can be increased, allowing for greater quantities of fuel to be burned, thus reaching higher temperatures. Don’t forget to reserve fuel to keep the star at the centre of the Forge alive. +fog.upgrade.lore.4=Graviton shards not only affect matter, but also energy: depending on the fuel burn rate, the Forge may now accept more energy input, allowing for greater processing capacity. What other properties do these Graviton shards hold? +fog.upgrade.lore.5=As usage of the Forge continues, more data on graviton shards is gathered. It has been found that they can stabilize the outputs of the Forge, allowing for the direct extraction of molten material while it is still close to the heart of the star. +fog.upgrade.lore.6=As stellar fuel consumption continues to increase the size and energy of the star, the amount of material that can be processed at once also increases. Graviton shards facilitate the manipulation of increased quantities of materials near the star in the core of the Forge. +fog.upgrade.lore.7=As understanding of graviton shards continues to improve, better control over the materials they manipulate can be achieved. Graviton shards provide an alternative to electromagnetic containment of plasma using spacetime manipulation instead, allowing the Forge to directly output processed materials as plasma. +fog.upgrade.lore.8=Adding graviton shards to the Forge’s internal energy storage allows for greater quantities of energy stored in a smaller area. By increasing energy density to relativistic levels, the Forge can be run more efficiently and store essentially infinite energy. +fog.upgrade.lore.9=Simply adding more graviton shards to the fuel chamber continues to amplify the ability for the Forge to consume increased quantities of stellar fuel. It even benefits from graviton shards invested in different parts of the Forge entirely – it seems shards exhibit quantum entanglement-like properties. +fog.upgrade.lore.10=Increasing the concentration of graviton shards near the material processing regions of the Forge warps spacetime so significantly that it doubles the material input and processing possible. As the Forge’s capabilities increase, the amount of graviton shard data collected increases too, allowing for further expansion. +fog.upgrade.lore.11=Using large quantities of graviton shards creates regions of space so extreme that exotic forms of matter can exist with far greater stability than usual. Unfortunately, this region is so extreme that it is essentially spatially disconnected from the rest of the Forge, unable to utilize existing upgrades to the structure and its other modules. +fog.upgrade.lore.12=Graviton shards can further compress stellar fuel, increasing its ability to fuel the star at the centre of the Forge through higher energy fusion reactions than usually possible in a natural star. As a result, greater heat is produced, increasing processing efficiency of the Forge. +fog.upgrade.lore.13=Increasing the concentration of graviton shards in the fuel chamber allows for a further increase in material processing capacity, so long as the Forge receives enough stellar fuel to maintain the unnaturally powerful state of the star. +fog.upgrade.lore.14=Utilising the unique energy-manipulating properties of graviton shards, electricity can be more efficiently utilised within the Forge. This sort of improvement is not possible with conventional matter, but also would not be possible outside the extreme environments near the star in the Forge. +fog.upgrade.lore.15=Similar to the Quantum Force Transformer, the quantum-mechanical properties of graviton shards facilitate the ability for the Forge to complete a complex series of nuclear fusion processes in a single event by directly manipulating the subatomic particles of the materials themselves. +fog.upgrade.lore.16=Another instance of the entanglement-like effects of graviton shards, the simple Power Forge module now also exhibits the improvements made to the Melting Core module of the Forge. This allows for greater efficiency in both processing and allocation of the precious few graviton shards that can be obtained. +fog.upgrade.lore.17=Typical smelting techniques become too inefficient at extreme temperatures. Graviton shards allow for new methods of processing that can better take advantage of the abundant heat available within the Forge, such as manipulating spacetime to better transfer heat to the processed materials than regular matter ever could. +fog.upgrade.lore.18=As the heat available within the Forge continues to increase, it becomes possible for more material to be processed as it requires less proximity to the star’s surface. Graviton shards facilitate the manipulation of increased material quantities across larger regions of space within the Forge. +fog.upgrade.lore.19=Continual improvements to energy storage density using graviton shards improves both the efficiency of the Forge and improvements to heat utilisation for processing. Reaching this threshold of energy density allows the extreme spacetime bending to transfer the heat of the star more directly to the processed materials, increasing the effectiveness of heat in the smelting process. +fog.upgrade.lore.20=Normally increasing heat indefinitely has extreme diminishing returns when processing materials, but graviton shards allow for heat to more acutely affect input materials by manipulating them ever closer to the star at the centre of the Forge. At such levels of heat, the bonds between atoms are broken, allowing for the most quick and pure processing possible. +fog.upgrade.lore.21=Using the entanglement-like properties of graviton shards, it is possible to utilize the increasingly extreme differences in spacetime between regions of the Forge to improve the processing capacity of the molten module. As space becomes more warped, more material can be moved closer to the star, increasing production capacity. +fog.upgrade.lore.22=Returning to the first upgrade of the Forge with the myriad discoveries about the graviton shards allows it to run much faster than previously possible. As a result of excessive spacetime manipulation, greater heat and larger quantities of material paradoxically result in faster processing times as larger surface areas of the processed material are available to the Forge. +fog.upgrade.lore.23=The stress of maintaining such a large structure around such a gravitationally dense object as a neutron star is alleviated through graviton shards. A larger Forge allows for more machinery and better electricity utilisation, effectively increasing processing capabilities. +fog.upgrade.lore.24=Improvements in understanding of the gravitational containment effects of graviton shards allow the Forge to process and handle more exotic and unstable plasma. With this, a new age of fusion processing and power is possible. +fog.upgrade.lore.25=Further utilisation of the quantum entanglement-like properties of graviton shards allows the effects of other module upgrades to also apply to the exotic module. However, because of the extreme nature of spacetime within this module and the materials it handles, these benefits are reduced as per the inverse square law. +fog.upgrade.lore.26=As additional rings are placed closer to the star at the centre of the Forge, the gravitational stress drastically increases on the structure. Graviton shards alleviate these stresses and also allow for upgrades made in other similar modules to apply to the new ring’s modules through the use of localized spacetime bridges. +fog.upgrade.lore.27=A huge development in the capabilities of the Forge has been achieved with the use of large quantities of graviton shards – the ability to indefinitely feed the star with stellar fuel. Obviously, this has diminishing returns but the processing potential is immense thanks to extreme gravitational distortion containing the star regardless of its energy level. +fog.upgrade.lore.28=The usage of graviton shards in electrical systems to create localised miniature energy wormholes has allowed for such efficient power transfer that effectively unlimited electricity may be utilized by the Forge. More power means faster processing, quicker material movement, and better utilization of graviton shard related upgrades. +fog.upgrade.lore.29=The final structural upgrade to the Forge required the most advanced understanding of graviton shards and their applications in extreme environments. With this, the last 4 module slots of the Forge of the Gods are available to construct, completing the single greatest structure in human history. The power of the sun in the palm of your hand. fog.upgrade.lore.30=*insert lore here* upgrade end -fog.upgrade.text.0=Unlocks a recipe time reduction multiplier based on the current heat the multi is running at. This bonus is calculated via following formula: Multiplier = 1/(Heat^0.01) -fog.upgrade.text.1=*insert text here* upgrade 11 -fog.upgrade.text.2=*insert text here* upgrade 21 -fog.upgrade.text.3=*insert text here* upgrade 22 -fog.upgrade.text.4=*insert text here* upgrade 31 -fog.upgrade.text.5=*insert text here* upgrade 32 -fog.upgrade.text.6=*insert text here* upgrade 33 -fog.upgrade.text.7=*insert text here* upgrade 41 -fog.upgrade.text.8=*insert text here* upgrade 51 -fog.upgrade.text.9=*insert text here* upgrade 52 -fog.upgrade.text.10=*insert text here* upgrade 53 -fog.upgrade.text.11=*insert text here* upgrade 61 -fog.upgrade.text.12=*insert text here* upgrade 71 -fog.upgrade.text.13=*insert text here* upgrade 72 -fog.upgrade.text.14=*insert text here* upgrade 73 -fog.upgrade.text.15=*insert text here* upgrade 74 -fog.upgrade.text.16=*insert text here* upgrade 80 -fog.upgrade.text.17=*insert text here* upgrade 81 -fog.upgrade.text.18=*insert text here* upgrade 82 -fog.upgrade.text.19=*insert text here* upgrade 83 -fog.upgrade.text.20=*insert text here* upgrade 91 -fog.upgrade.text.21=*insert text here* upgrade 92 -fog.upgrade.text.22=*insert text here* upgrade 93 -fog.upgrade.text.23=*insert text here* upgrade 101 -fog.upgrade.text.24=*insert text here* upgrade 111 -fog.upgrade.text.25=*insert text here* upgrade 121 -fog.upgrade.text.26=*insert text here* upgrade 131 -fog.upgrade.text.27=*insert text here* upgrade 141 -fog.upgrade.text.28=*insert text here* upgrade 151 -fog.upgrade.text.29=*insert text here* upgrade 161 +fog.upgrade.text.0=Unlocks the base functionality of the Forge of the Gods, meaning 8 module slots, 1 ring and the Helioflare Power Forge module. +fog.upgrade.text.1=Unlocks a recipe time reduction multiplier based on the current heat the multi is running at. This bonus is calculated via following formula: Multiplier = 1 / (Heat^0.01) +fog.upgrade.text.2=Increases fuel efficiency by multiplying the actual fuel consumption by 0.8 +fog.upgrade.text.3=Multiplies the maximum fuel consumption by 1.2 +fog.upgrade.text.4=Increases the base processing voltage of the multi by: Stellar Fuel Units/sec * 10^8 EU/t +fog.upgrade.text.5=Unlocks the Helioflux Melting Core module. +fog.upgrade.text.6=Unlocks a multiplier to maximum parallel based on fuel consumption rate. This bonus is calculated via this formula: Multiplier = 1 + (Stellar Fuel Units/sec) / 15 +fog.upgrade.text.7=Unlocks the Heliothermal Plasma Fabricator module and basic element -> plasma processing (1 step plasmas, T3 fusion maximum). +fog.upgrade.text.8=Unlocks a configuration window for maximum battery size and increases the limit to max int. Furthermore, an energy discount multiplier is unlocked that scales with battery size (capped to 0.05, or 5%). The discount is calculated as follows: Discount = (1 - 1.05^(-0.05 * Max Battery Capacity)) / 20 +fog.upgrade.text.9=Increases maximum fuel consumption by 1 Stellar Fuel Unit/sec for every purchased upgrade. +fog.upgrade.text.10=Adds a x2 multiplier to maximum parallel. +fog.upgrade.text.11=Unlocks the Heliofusion Exoticizer module and quark gluon plasma creation. At this point this module is not affected by any other multipliers or bonuses from other upgrades. +fog.upgrade.text.12=Improves the fuel consumption -> heat conversion formula. Improved formula: Heat = log1.2(Stellar Fuel Units/sec) * 1000 + 12601 +fog.upgrade.text.13=Improves the formula of N33 to: Multiplier = 1 + (Stellar Fuel Units/sec) / 5 +fog.upgrade.text.14=Improves the OC formula from 4/2 OCs to 4/2.3 OCs. +fog.upgrade.text.15=Allows the Heliothermal Plasma Fabricator to process multi step plasmas. Tier restriction still applies. +fog.upgrade.text.16=Allows the Helioflare Power Forge to receive the full benefits of the Helioflux Melting Core upgrade path. +fog.upgrade.text.17=Increases the cap of EBF heat bonuses to 30,000K. +fog.upgrade.text.18=Unlocks a multiplier to maximum parallel based on current heat. This bonus is calculated via this formula: Multiplier = 1 + Heat / 15000 +fog.upgrade.text.19=Improves the EBF energy reduction heat bonus from 5% to 8% and adds an energy discount based on the fill level of the internal battery. This bonus is calculated via this formula: Discount = (Current fill level / Max Capacity - 0.5)^2 * (-0,6) + 0,15 +fog.upgrade.text.20=EBF heat bonuses are granted above 30,000K, but the heat value used in heat bonus calculations is determined by this formula: Actual Heat = 30000 + (Current Heat - 30000)^0.85 +fog.upgrade.text.21=Unlocks a multiplier to maximum parallel based on total amount of purchased upgrades. This bonus is calculated via this formula: Multiplier = 1 + Upgrade Amount / 5 +fog.upgrade.text.22=Improves N11 based on current maximum parallel. Improved Formula: Multiplier = (1 / Heat^0.01) / (Parallel^0.02) +fog.upgrade.text.23=Increases maximum processing voltage by 1 per active ring. +fog.upgrade.text.24=Allows the Heliothermal Plasma Fabricator to process up to T5 plasmas. +fog.upgrade.text.25=Allows the Heliofusion Exoticizer to be affected by other upgrade benefits, but those benefits are square rooted first. The overclock bonus is adjusted via the following formula: OC Factor = 2 + (Base OC Factor - 2)^2 +fog.upgrade.text.26=Allows construction of the second ring and adds 4 module slots. +fog.upgrade.text.27=Uncaps maximum fuel consumption, but fuel consumption used in bonus calculations scales according to this formula: Actual FC = Current Max FC + (Current FC - Current Max FC)^0.75, where FC refers to fuel consumption and max FC refers to the max fuel consumption without this upgrade. +fog.upgrade.text.28=Uncaps maximum processing voltage. Voltage can be set in each module's GUI. +fog.upgrade.text.29=Allows construction of the third ring and adds 4 module slots. fog.upgrade.text.30=*insert text here* upgrade end fog.debug.resetbutton.text=Reset fog.debug.resetbutton.tooltip=Resets all upgrades to zero +fog.debug.unlockall.text=Unlock all upgrades +fog.debug.gravitonshardsetter.tooltip=Set the amount of availabe graviton shards fog.button.fuelconfig.tooltip=Fuel Configuration Menu fog.button.furnacemode.tooltip=Toggle Furnace Mode fog.button.magmattermode.tooltip.01=Toggle Magmatter Mode -fog.button.magmattermode.tooltip.02=Magmatter Mode Locked, missing upgrade +fog.button.magmattermode.tooltip.02=Magmatter Mode locked, missing upgrade +fog.button.battery.tooltip.01=Toggle Battery Charging +fog.button.battery.tooltip.02=Right click to open configuration menu (if unlocked) +fog.button.voltageconfig.tooltip.01=Open voltage config +fog.button.voltageconfig.tooltip.02=Voltage config locked, missing upgrade +fog.button.structurecheck.tooltip=Refresh module connection status +fog.button.milestones.tooltip=Milestone Overview achievement.gt.blockmachines.multimachine.em.forge_of_gods=Forge of the Gods @@ -1001,6 +1009,29 @@ gt.blockmachines.multimachine.FOG.fuelusage=Fuel Usage gt.blockmachines.multimachine.FOG.plasmamultistep=Multi-Step plasma gt.blockmachines.multimachine.FOG.plasmarecipetier=Fusion Tier gt.blockmachines.multimachine.FOG.storedfuel=Stored fuel amount: +gt.blockmachines.multimachine.FOG.storedstartupfuel=Star Fuel amount: +gt.blockmachines.multimachine.FOG.batteryinfo=Set battery size +gt.blockmachines.multimachine.FOG.shardcost=Graviton Shard cost: +gt.blockmachines.multimachine.FOG.availableshards=Available Graviton Shards: +gt.blockmachines.multimachine.FOG.modulestatus=Status: +gt.blockmachines.multimachine.FOG.modulestatus.true=Connected +gt.blockmachines.multimachine.FOG.modulestatus.false=Disconnected +gt.blockmachines.multimachine.FOG.voltageinfo=Set processing voltage +gt.blockmachines.multimachine.FOG.totalprogress=Total Progress +gt.blockmachines.multimachine.FOG.milestoneprogress=Current Milestone Level +gt.blockmachines.multimachine.FOG.progress=Next Milestone at +gt.blockmachines.multimachine.FOG.milestonecomplete=Milestone Complete +gt.blockmachines.multimachine.FOG.milestoneinfo=View Milestone Progress +gt.blockmachines.multimachine.FOG.inversion=Inversion Active +gt.blockmachines.multimachine.FOG.powermilestone=Charge +gt.blockmachines.multimachine.FOG.recipemilestone=Conversion +gt.blockmachines.multimachine.FOG.fuelmilestone=Catalyst +gt.blockmachines.multimachine.FOG.purchasablemilestone=Composition +gt.blockmachines.multimachine.FOG.power=EU Consumed +gt.blockmachines.multimachine.FOG.recipes=Recipes Processed +gt.blockmachines.multimachine.FOG.fuel=Fuel Units Consumed +gt.blockmachines.multimachine.FOG.extensions=Extensions Built +gt.blockmachines.multimachine.FOG.shardgain=Graviton Shards gained # Optical Circuits achievement.gt.metaitem.03.32155=Optical Assembly @@ -1133,6 +1164,9 @@ GT5U.gui.text.waiting_for_inputs=§7Waiting for inputs # RecipeMaps gt.recipe.eyeofharmony=Eye of Harmony gt.recipe.researchStation=Research Station +gt.recipe.fog_plasma=Heliothermal Plasma Fabricator +gt.recipe.fog_exotic=Heliofusion Exoticizer + # NEI tt.nei.eoh.total_items=Total Items: %s diff --git a/src/main/resources/assets/tectech/textures/gui/background/space.png b/src/main/resources/assets/tectech/textures/gui/background/space.png new file mode 100644 index 000000000..4ecf8caa0 Binary files /dev/null and b/src/main/resources/assets/tectech/textures/gui/background/space.png differ diff --git a/src/main/resources/assets/tectech/textures/gui/background/white_glow.png b/src/main/resources/assets/tectech/textures/gui/background/white_glow.png new file mode 100644 index 000000000..79df16e73 Binary files /dev/null and b/src/main/resources/assets/tectech/textures/gui/background/white_glow.png differ diff --git a/src/main/resources/assets/tectech/textures/gui/overlay_button/battery_off.png b/src/main/resources/assets/tectech/textures/gui/overlay_button/battery_off.png new file mode 100644 index 000000000..ce3e3ed11 Binary files /dev/null and b/src/main/resources/assets/tectech/textures/gui/overlay_button/battery_off.png differ diff --git a/src/main/resources/assets/tectech/textures/gui/overlay_button/battery_on.png b/src/main/resources/assets/tectech/textures/gui/overlay_button/battery_on.png new file mode 100644 index 000000000..75832441e Binary files /dev/null and b/src/main/resources/assets/tectech/textures/gui/overlay_button/battery_on.png differ diff --git a/src/main/resources/assets/tectech/textures/gui/overlay_button/cyclic_blue.png b/src/main/resources/assets/tectech/textures/gui/overlay_button/cyclic_blue.png new file mode 100644 index 000000000..07c606ec1 Binary files /dev/null and b/src/main/resources/assets/tectech/textures/gui/overlay_button/cyclic_blue.png differ diff --git a/src/main/resources/assets/tectech/textures/gui/overlay_button/flag.png b/src/main/resources/assets/tectech/textures/gui/overlay_button/flag.png new file mode 100644 index 000000000..48bcca969 Binary files /dev/null and b/src/main/resources/assets/tectech/textures/gui/overlay_button/flag.png differ diff --git a/src/main/resources/assets/tectech/textures/gui/picture/gorge_logo.png b/src/main/resources/assets/tectech/textures/gui/picture/gorge_logo.png new file mode 100644 index 000000000..cdc6b609a Binary files /dev/null and b/src/main/resources/assets/tectech/textures/gui/picture/gorge_logo.png differ diff --git a/src/main/resources/assets/tectech/textures/gui/picture/milestone_catalyst.png b/src/main/resources/assets/tectech/textures/gui/picture/milestone_catalyst.png new file mode 100644 index 000000000..708589844 Binary files /dev/null and b/src/main/resources/assets/tectech/textures/gui/picture/milestone_catalyst.png differ diff --git a/src/main/resources/assets/tectech/textures/gui/picture/milestone_catalyst_glow.png b/src/main/resources/assets/tectech/textures/gui/picture/milestone_catalyst_glow.png new file mode 100644 index 000000000..678727039 Binary files /dev/null and b/src/main/resources/assets/tectech/textures/gui/picture/milestone_catalyst_glow.png differ diff --git a/src/main/resources/assets/tectech/textures/gui/picture/milestone_charge.png b/src/main/resources/assets/tectech/textures/gui/picture/milestone_charge.png new file mode 100644 index 000000000..5fec5cdde Binary files /dev/null and b/src/main/resources/assets/tectech/textures/gui/picture/milestone_charge.png differ diff --git a/src/main/resources/assets/tectech/textures/gui/picture/milestone_charge_glow.png b/src/main/resources/assets/tectech/textures/gui/picture/milestone_charge_glow.png new file mode 100644 index 000000000..148c8c920 Binary files /dev/null and b/src/main/resources/assets/tectech/textures/gui/picture/milestone_charge_glow.png differ diff --git a/src/main/resources/assets/tectech/textures/gui/picture/milestone_composition.png b/src/main/resources/assets/tectech/textures/gui/picture/milestone_composition.png new file mode 100644 index 000000000..5a2f01134 Binary files /dev/null and b/src/main/resources/assets/tectech/textures/gui/picture/milestone_composition.png differ diff --git a/src/main/resources/assets/tectech/textures/gui/picture/milestone_composition_glow.png b/src/main/resources/assets/tectech/textures/gui/picture/milestone_composition_glow.png new file mode 100644 index 000000000..a37e194cb Binary files /dev/null and b/src/main/resources/assets/tectech/textures/gui/picture/milestone_composition_glow.png differ diff --git a/src/main/resources/assets/tectech/textures/gui/picture/milestone_conversion.png b/src/main/resources/assets/tectech/textures/gui/picture/milestone_conversion.png new file mode 100644 index 000000000..2ecf6e061 Binary files /dev/null and b/src/main/resources/assets/tectech/textures/gui/picture/milestone_conversion.png differ diff --git a/src/main/resources/assets/tectech/textures/gui/picture/milestone_conversion_glow.png b/src/main/resources/assets/tectech/textures/gui/picture/milestone_conversion_glow.png new file mode 100644 index 000000000..952c00a52 Binary files /dev/null and b/src/main/resources/assets/tectech/textures/gui/picture/milestone_conversion_glow.png differ diff --git a/src/main/resources/assets/tectech/textures/gui/picture/overlay_blue.png b/src/main/resources/assets/tectech/textures/gui/picture/overlay_blue.png new file mode 100644 index 000000000..8e2bb24af Binary files /dev/null and b/src/main/resources/assets/tectech/textures/gui/picture/overlay_blue.png differ diff --git a/src/main/resources/assets/tectech/textures/gui/picture/overlay_green.png b/src/main/resources/assets/tectech/textures/gui/picture/overlay_green.png new file mode 100644 index 000000000..e49c9d70c Binary files /dev/null and b/src/main/resources/assets/tectech/textures/gui/picture/overlay_green.png differ diff --git a/src/main/resources/assets/tectech/textures/gui/picture/overlay_orange.png b/src/main/resources/assets/tectech/textures/gui/picture/overlay_orange.png new file mode 100644 index 000000000..bbfc03392 Binary files /dev/null and b/src/main/resources/assets/tectech/textures/gui/picture/overlay_orange.png differ diff --git a/src/main/resources/assets/tectech/textures/gui/picture/overlay_purple.png b/src/main/resources/assets/tectech/textures/gui/picture/overlay_purple.png new file mode 100644 index 000000000..e189df603 Binary files /dev/null and b/src/main/resources/assets/tectech/textures/gui/picture/overlay_purple.png differ diff --git a/src/main/resources/assets/tectech/textures/gui/progressbar/godforge_plasma.png b/src/main/resources/assets/tectech/textures/gui/progressbar/godforge_plasma.png new file mode 100644 index 000000000..60e831ab7 Binary files /dev/null and b/src/main/resources/assets/tectech/textures/gui/progressbar/godforge_plasma.png differ diff --git a/src/main/resources/assets/tectech/textures/gui/progressbar/godforge_progressbar_background.png b/src/main/resources/assets/tectech/textures/gui/progressbar/godforge_progressbar_background.png new file mode 100644 index 000000000..6c61bd82f Binary files /dev/null and b/src/main/resources/assets/tectech/textures/gui/progressbar/godforge_progressbar_background.png differ diff --git a/src/main/resources/assets/tectech/textures/gui/progressbar/godforge_progressbar_blue.png b/src/main/resources/assets/tectech/textures/gui/progressbar/godforge_progressbar_blue.png new file mode 100644 index 000000000..b3dcc01f2 Binary files /dev/null and b/src/main/resources/assets/tectech/textures/gui/progressbar/godforge_progressbar_blue.png differ diff --git a/src/main/resources/assets/tectech/textures/gui/progressbar/godforge_progressbar_blue_inverted.png b/src/main/resources/assets/tectech/textures/gui/progressbar/godforge_progressbar_blue_inverted.png new file mode 100644 index 000000000..7e24ef4e7 Binary files /dev/null and b/src/main/resources/assets/tectech/textures/gui/progressbar/godforge_progressbar_blue_inverted.png differ diff --git a/src/main/resources/assets/tectech/textures/gui/progressbar/godforge_progressbar_purple.png b/src/main/resources/assets/tectech/textures/gui/progressbar/godforge_progressbar_purple.png new file mode 100644 index 000000000..526576713 Binary files /dev/null and b/src/main/resources/assets/tectech/textures/gui/progressbar/godforge_progressbar_purple.png differ diff --git a/src/main/resources/assets/tectech/textures/gui/progressbar/godforge_progressbar_purple_inverted.png b/src/main/resources/assets/tectech/textures/gui/progressbar/godforge_progressbar_purple_inverted.png new file mode 100644 index 000000000..cf0925e42 Binary files /dev/null and b/src/main/resources/assets/tectech/textures/gui/progressbar/godforge_progressbar_purple_inverted.png differ diff --git a/src/main/resources/assets/tectech/textures/gui/progressbar/godforge_progressbar_rainbow.png b/src/main/resources/assets/tectech/textures/gui/progressbar/godforge_progressbar_rainbow.png new file mode 100644 index 000000000..a09d6c94b Binary files /dev/null and b/src/main/resources/assets/tectech/textures/gui/progressbar/godforge_progressbar_rainbow.png differ diff --git a/src/main/resources/assets/tectech/textures/gui/progressbar/godforge_progressbar_rainbow_inverted.png b/src/main/resources/assets/tectech/textures/gui/progressbar/godforge_progressbar_rainbow_inverted.png new file mode 100644 index 000000000..dde5ea73c Binary files /dev/null and b/src/main/resources/assets/tectech/textures/gui/progressbar/godforge_progressbar_rainbow_inverted.png differ diff --git a/src/main/resources/assets/tectech/textures/gui/progressbar/godforge_progressbar_red.png b/src/main/resources/assets/tectech/textures/gui/progressbar/godforge_progressbar_red.png new file mode 100644 index 000000000..a13093b3f Binary files /dev/null and b/src/main/resources/assets/tectech/textures/gui/progressbar/godforge_progressbar_red.png differ diff --git a/src/main/resources/assets/tectech/textures/gui/progressbar/godforge_progressbar_red_inverted.png b/src/main/resources/assets/tectech/textures/gui/progressbar/godforge_progressbar_red_inverted.png new file mode 100644 index 000000000..1945e452d Binary files /dev/null and b/src/main/resources/assets/tectech/textures/gui/progressbar/godforge_progressbar_red_inverted.png differ