From e41a0889c5f498252691180b143c97b570b2fc6b Mon Sep 17 00:00:00 2001 From: Maya <10861407+serenibyss@users.noreply.github.com> Date: Thu, 28 Nov 2024 12:01:03 -0600 Subject: Godforge hangover (#3396) Co-authored-by: GDCloud Co-authored-by: GDCloud <93287602+GDCloudstrike@users.noreply.github.com> Co-authored-by: Martin Robertz --- .../gregtech/api/gui/modularui/GTUITextures.java | 1 + .../java/gregtech/api/util/GTRecipeConstants.java | 6 + .../tectech/loader/recipe/BaseRecipeLoader.java | 1 + src/main/java/tectech/loader/recipe/Godforge.java | 220 +- .../recipe/GodforgeUpgradeCostFrontend.java | 74 + .../java/tectech/recipe/TecTechRecipeMaps.java | 12 + .../tectech/thing/block/RenderForgeOfGods.java | 4 +- .../tectech/thing/block/TileEntityForgeOfGods.java | 2 +- .../java/tectech/thing/gui/TecTechUITextures.java | 3 + .../godforge/ForgeOfGodsRingsStructureString.java | 5105 ------------------ .../multi/godforge/ForgeOfGodsStructureString.java | 5435 -------------------- .../multi/godforge/ForgeOfGodsUI.java | 549 -- .../multi/godforge/MTEBaseModule.java | 1 + .../multi/godforge/MTEExoticModule.java | 178 +- .../multi/godforge/MTEForgeOfGods.java | 2368 +++------ .../multi/godforge/MTEMoltenModule.java | 10 +- .../multi/godforge/MTEPlasmaModule.java | 10 +- .../multi/godforge/MTESmeltingModule.java | 12 +- .../multi/godforge/color/ForgeOfGodsStarColor.java | 29 +- .../structure/ForgeOfGodsRingsStructureString.java | 5105 ++++++++++++++++++ .../structure/ForgeOfGodsStructureString.java | 5435 ++++++++++++++++++++ .../multi/godforge/upgrade/ForgeOfGodsUpgrade.java | 475 ++ .../multi/godforge/upgrade/UpgradeStorage.java | 285 + .../multi/godforge/util/ForgeOfGodsUI.java | 908 ++++ .../multi/godforge/util/GodforgeMath.java | 298 ++ .../multi/godforge/util/MilestoneFormatter.java | 47 + .../multi/godforge/util/MilestoneIcon.java | 46 + .../multi/godforge/util/UpgradeColor.java | 72 + src/main/java/tectech/util/GodforgeMath.java | 296 -- 29 files changed, 13884 insertions(+), 13103 deletions(-) create mode 100644 src/main/java/tectech/recipe/GodforgeUpgradeCostFrontend.java delete mode 100644 src/main/java/tectech/thing/metaTileEntity/multi/godforge/ForgeOfGodsRingsStructureString.java delete mode 100644 src/main/java/tectech/thing/metaTileEntity/multi/godforge/ForgeOfGodsStructureString.java delete mode 100644 src/main/java/tectech/thing/metaTileEntity/multi/godforge/ForgeOfGodsUI.java create mode 100644 src/main/java/tectech/thing/metaTileEntity/multi/godforge/structure/ForgeOfGodsRingsStructureString.java create mode 100644 src/main/java/tectech/thing/metaTileEntity/multi/godforge/structure/ForgeOfGodsStructureString.java create mode 100644 src/main/java/tectech/thing/metaTileEntity/multi/godforge/upgrade/ForgeOfGodsUpgrade.java create mode 100644 src/main/java/tectech/thing/metaTileEntity/multi/godforge/upgrade/UpgradeStorage.java create mode 100644 src/main/java/tectech/thing/metaTileEntity/multi/godforge/util/ForgeOfGodsUI.java create mode 100644 src/main/java/tectech/thing/metaTileEntity/multi/godforge/util/GodforgeMath.java create mode 100644 src/main/java/tectech/thing/metaTileEntity/multi/godforge/util/MilestoneFormatter.java create mode 100644 src/main/java/tectech/thing/metaTileEntity/multi/godforge/util/MilestoneIcon.java create mode 100644 src/main/java/tectech/thing/metaTileEntity/multi/godforge/util/UpgradeColor.java delete mode 100644 src/main/java/tectech/util/GodforgeMath.java (limited to 'src/main/java') diff --git a/src/main/java/gregtech/api/gui/modularui/GTUITextures.java b/src/main/java/gregtech/api/gui/modularui/GTUITextures.java index 2e0fc114d9..499f043af1 100644 --- a/src/main/java/gregtech/api/gui/modularui/GTUITextures.java +++ b/src/main/java/gregtech/api/gui/modularui/GTUITextures.java @@ -537,6 +537,7 @@ public class GTUITextures { public static final UITexture PICTURE_SLOTS_HOLO_3BY3 = UITexture .fullImage(GregTech.ID, "gui/picture/slots_holo_3by3"); public static final UITexture PICTURE_ARROW_DOUBLE = UITexture.fullImage(GregTech.ID, "gui/picture/arrow_double"); + public static final UITexture PICTURE_ARROW_GRAY = UITexture.fullImage(GregTech.ID, "gui/picture/arrow_gray"); public static final UITexture PICTURE_SUPER_BUFFER = UITexture.fullImage(GregTech.ID, "gui/picture/super_buffer"); public static final UITexture PICTURE_SQUARE_LIGHT_GRAY = UITexture .fullImage(GregTech.ID, "gui/picture/square_light_gray"); diff --git a/src/main/java/gregtech/api/util/GTRecipeConstants.java b/src/main/java/gregtech/api/util/GTRecipeConstants.java index 883f1060ac..f0e4cacd65 100644 --- a/src/main/java/gregtech/api/util/GTRecipeConstants.java +++ b/src/main/java/gregtech/api/util/GTRecipeConstants.java @@ -129,6 +129,12 @@ public class GTRecipeConstants { public static final RecipeMetadataKey FOG_PLASMA_MULTISTEP = SimpleRecipeMetadataKey .create(Boolean.class, "fog_plasma_multistep"); + /** + * FOG Shortened upgrade name. + */ + public static final RecipeMetadataKey FOG_UPGRADE_NAME_SHORT = SimpleRecipeMetadataKey + .create(String.class, "fog_plasma_upgrade_name_short"); + /** * DEFC Casing tier. */ diff --git a/src/main/java/tectech/loader/recipe/BaseRecipeLoader.java b/src/main/java/tectech/loader/recipe/BaseRecipeLoader.java index 180e8514f4..445dd9c069 100644 --- a/src/main/java/tectech/loader/recipe/BaseRecipeLoader.java +++ b/src/main/java/tectech/loader/recipe/BaseRecipeLoader.java @@ -46,5 +46,6 @@ public class BaseRecipeLoader { } else { Godforge.runDevEnvironmentRecipes(); } + Godforge.addFakeUpgradeCostRecipes(); } } diff --git a/src/main/java/tectech/loader/recipe/Godforge.java b/src/main/java/tectech/loader/recipe/Godforge.java index 981f6b139a..51be5b9e7f 100644 --- a/src/main/java/tectech/loader/recipe/Godforge.java +++ b/src/main/java/tectech/loader/recipe/Godforge.java @@ -11,9 +11,10 @@ import static gregtech.api.util.GTRecipeConstants.COIL_HEAT; import static gregtech.api.util.GTRecipeConstants.FOG_EXOTIC_TIER; import static gregtech.api.util.GTRecipeConstants.FOG_PLASMA_MULTISTEP; import static gregtech.api.util.GTRecipeConstants.FOG_PLASMA_TIER; +import static gregtech.api.util.GTRecipeConstants.FOG_UPGRADE_NAME_SHORT; import static tectech.recipe.TecTechRecipeMaps.godforgeExoticMatterRecipes; import static tectech.recipe.TecTechRecipeMaps.godforgePlasmaRecipes; -import static tectech.util.GodforgeMath.getRandomIntInRange; +import static tectech.thing.metaTileEntity.multi.godforge.util.GodforgeMath.getRandomIntInRange; import java.util.ArrayList; import java.util.Arrays; @@ -26,6 +27,8 @@ import net.minecraftforge.fluids.FluidRegistry; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.oredict.OreDictionary; +import org.apache.commons.lang3.ArrayUtils; + import goodgenerator.items.GGMaterial; import goodgenerator.util.ItemRefer; import gregtech.api.enums.GTValues; @@ -47,6 +50,7 @@ import it.unimi.dsi.fastutil.ints.IntArrayList; import it.unimi.dsi.fastutil.ints.IntList; import tectech.recipe.TecTechRecipeMaps; import tectech.thing.CustomItemList; +import tectech.thing.metaTileEntity.multi.godforge.upgrade.ForgeOfGodsUpgrade; public class Godforge implements Runnable { @@ -55,7 +59,6 @@ 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 godforgeUpgradeMats = new HashMap<>(); public static final List quarkGluonFluidItemsForNEI = new ArrayList<>(); public static final List quarkGluonItemsForNEI = new ArrayList<>(); public static final List magmatterTimeFluidItemsForNEI = new ArrayList<>(); @@ -688,83 +691,154 @@ public class Godforge implements Runnable { // Godforge upgrade materials if (EternalSingularity.isModLoaded() && GalaxySpace.isModLoaded()) { - godforgeUpgradeMats.put( - 0, - new ItemStack[] { GTOreDictUnificator.get(OrePrefixes.frameGt, Materials.SuperconductorUIVBase, 64), - ItemList.SuperconductorComposite.get(32), - GGMaterial.metastableOganesson.get(OrePrefixes.gearGt, 16), - getModItem(EternalSingularity.ID, "eternal_singularity", 8L), ItemList.Robot_Arm_UIV.get(64L), - ItemList.Field_Generator_UEV.get(64L) }); - - godforgeUpgradeMats.put( - 5, - new ItemStack[] { GregtechItemList.Mega_AlloyBlastSmelter.get(16L), - ItemList.Casing_Coil_Hypogen.get(64L), - CustomItemList.Godforge_HarmonicPhononTransmissionConduit.get(32L), - getModItem(EternalSingularity.ID, "eternal_singularity", 16L), - ItemRefer.Field_Restriction_Coil_T3.get(48), ItemList.Robot_Arm_UIV.get(64L), - ItemList.Field_Generator_UEV.get(64L) }); - - godforgeUpgradeMats.put( - 7, - new ItemStack[] { CustomItemList.Godforge_StellarEnergySiphonCasing.get(8), - GregtechItemList.FusionComputer_UV3.get(8), GregtechItemList.Casing_Fusion_Internal2.get(64), - getModItem(GalaxySpace.ID, "item.DysonSwarmParts", 64, 3), MaterialsAlloy.QUANTUM.getPlateDense(48), - MaterialsElements.STANDALONE.RHUGNOR.getGear(32), - getModItem(EternalSingularity.ID, "eternal_singularity", 16L), ItemList.Robot_Arm_UIV.get(64L), - ItemList.Field_Generator_UEV.get(64L) }); - - godforgeUpgradeMats.put( - 11, - new ItemStack[] { CustomItemList.Godforge_StellarEnergySiphonCasing.get(16), - ItemRefer.Compact_Fusion_MK5.get(2), ItemRefer.Compact_Fusion_Coil_T4.get(64), - CustomItemList.Godforge_HarmonicPhononTransmissionConduit.get(16), - ItemList.Machine_Multi_TranscendentPlasmaMixer.get(4), - MaterialsElements.STANDALONE.RHUGNOR.getGear(64), - GTOreDictUnificator.get(OrePrefixes.gearGt, Materials.Ichorium, 64), - getModItem(EternalSingularity.ID, "eternal_singularity", 32L), ItemList.Robot_Arm_UIV.get(64L), - ItemList.Field_Generator_UEV.get(64L) }); - - godforgeUpgradeMats.put( - 26, - new ItemStack[] { GTOreDictUnificator.get(OrePrefixes.frameGt, MaterialsUEVplus.SpaceTime, 64), - GTOreDictUnificator.get(OrePrefixes.frameGt, Materials.SuperconductorUMVBase, 64), - MaterialsElements.STANDALONE.HYPOGEN.getFrameBox(64), - MaterialsElements.STANDALONE.DRAGON_METAL.getFrameBox(64), - CustomItemList.EOH_Reinforced_Spatial_Casing.get(64), - CustomItemList.EOH_Infinite_Energy_Casing.get(8), ItemList.ZPM6.get(2), - ItemList.Field_Generator_UMV.get(32) }); - - godforgeUpgradeMats.put( - 29, - new ItemStack[] { GTOreDictUnificator.get(OrePrefixes.frameGt, MaterialsUEVplus.WhiteDwarfMatter, 64), - GTOreDictUnificator.get(OrePrefixes.frameGt, MaterialsUEVplus.BlackDwarfMatter, 64), - GTOreDictUnificator.get(OrePrefixes.frameGt, MaterialsUEVplus.Eternity, 16), - GTOreDictUnificator.get(OrePrefixes.frameGt, MaterialsUEVplus.Universium, 2), - CustomItemList.EOH_Infinite_Energy_Casing.get(64), - CustomItemList.StabilisationFieldGeneratorTier5.get(16), ItemList.ZPM6.get(6), - ItemList.Field_Generator_UMV.get(64) }); - - godforgeUpgradeMats.put( - 30, - new ItemStack[] { CustomItemList.Machine_Multi_QuarkGluonPlasmaModule.get(32), - CustomItemList.Godforge_StellarEnergySiphonCasing.get(64), - CustomItemList.StabilisationFieldGeneratorTier6.get(48), - ItemList.Transdimensional_Alignment_Matrix.get(8), ItemList.ZPM6.get(16), - ItemList.Robot_Arm_UMV.get(64), ItemList.Conveyor_Module_UMV.get(64) }); + ForgeOfGodsUpgrade.START.addExtraCost( + GTOreDictUnificator.get(OrePrefixes.frameGt, Materials.SuperconductorUIVBase, 64), + ItemList.SuperconductorComposite.get(32), + GGMaterial.metastableOganesson.get(OrePrefixes.gearGt, 16), + getModItem(EternalSingularity.ID, "eternal_singularity", 8L), + ItemList.Robot_Arm_UIV.get(64L), + ItemList.Field_Generator_UEV.get(64L)); + + ForgeOfGodsUpgrade.FDIM.addExtraCost( + GregtechItemList.Mega_AlloyBlastSmelter.get(16L), + ItemList.Casing_Coil_Hypogen.get(64L), + CustomItemList.Godforge_HarmonicPhononTransmissionConduit.get(32L), + getModItem(EternalSingularity.ID, "eternal_singularity", 16L), + ItemRefer.Field_Restriction_Coil_T3.get(48), + ItemList.Robot_Arm_UIV.get(64L), + ItemList.Field_Generator_UEV.get(64L)); + + ForgeOfGodsUpgrade.GPCI.addExtraCost( + CustomItemList.Godforge_StellarEnergySiphonCasing.get(8), + GregtechItemList.FusionComputer_UV3.get(8), + GregtechItemList.Casing_Fusion_Internal2.get(64), + getModItem(GalaxySpace.ID, "item.DysonSwarmParts", 64, 3), + MaterialsAlloy.QUANTUM.getPlateDense(48), + MaterialsElements.STANDALONE.RHUGNOR.getGear(32), + getModItem(EternalSingularity.ID, "eternal_singularity", 16L), + ItemList.Robot_Arm_UIV.get(64L), + ItemList.Field_Generator_UEV.get(64L)); + + ForgeOfGodsUpgrade.QGPIU.addExtraCost( + CustomItemList.Godforge_StellarEnergySiphonCasing.get(16), + ItemRefer.Compact_Fusion_MK5.get(2), + ItemRefer.Compact_Fusion_Coil_T4.get(64), + CustomItemList.Godforge_HarmonicPhononTransmissionConduit.get(16), + ItemList.Machine_Multi_TranscendentPlasmaMixer.get(4), + MaterialsElements.STANDALONE.RHUGNOR.getGear(64), + GTOreDictUnificator.get(OrePrefixes.gearGt, Materials.Ichorium, 64), + getModItem(EternalSingularity.ID, "eternal_singularity", 32L), + ItemList.Robot_Arm_UIV.get(64L), + ItemList.Field_Generator_UEV.get(64L)); + + ForgeOfGodsUpgrade.CD.addExtraCost( + GTOreDictUnificator.get(OrePrefixes.frameGt, MaterialsUEVplus.SpaceTime, 64), + GTOreDictUnificator.get(OrePrefixes.frameGt, Materials.SuperconductorUMVBase, 64), + MaterialsElements.STANDALONE.HYPOGEN.getFrameBox(64), + MaterialsElements.STANDALONE.DRAGON_METAL.getFrameBox(64), + CustomItemList.EOH_Reinforced_Spatial_Casing.get(64), + CustomItemList.EOH_Infinite_Energy_Casing.get(8), + ItemList.ZPM6.get(2), + ItemList.Field_Generator_UMV.get(32)); + + ForgeOfGodsUpgrade.EE.addExtraCost( + GTOreDictUnificator.get(OrePrefixes.frameGt, MaterialsUEVplus.WhiteDwarfMatter, 64), + GTOreDictUnificator.get(OrePrefixes.frameGt, MaterialsUEVplus.BlackDwarfMatter, 64), + GTOreDictUnificator.get(OrePrefixes.frameGt, MaterialsUEVplus.Eternity, 16), + GTOreDictUnificator.get(OrePrefixes.frameGt, MaterialsUEVplus.Universium, 2), + CustomItemList.EOH_Infinite_Energy_Casing.get(64), + CustomItemList.StabilisationFieldGeneratorTier5.get(16), + ItemList.ZPM6.get(6), + ItemList.Field_Generator_UMV.get(64)); + + ForgeOfGodsUpgrade.END.addExtraCost( + CustomItemList.Machine_Multi_QuarkGluonPlasmaModule.get(32), + CustomItemList.Godforge_StellarEnergySiphonCasing.get(64), + CustomItemList.StabilisationFieldGeneratorTier6.get(48), + ItemList.Transdimensional_Alignment_Matrix.get(8), + ItemList.ZPM6.get(16), + ItemList.Robot_Arm_UMV.get(64), + ItemList.Conveyor_Module_UMV.get(64)); } } public static void runDevEnvironmentRecipes() { // put something in here to not crash the game in dev environment when opening the manual insertion window - godforgeUpgradeMats.put(0, new ItemStack[] { new ItemStack(Blocks.cobblestone, 4) }); - godforgeUpgradeMats.put(5, new ItemStack[] { new ItemStack(Blocks.cobblestone, 8) }); - godforgeUpgradeMats.put(7, new ItemStack[] { new ItemStack(Blocks.cobblestone, 12) }); - godforgeUpgradeMats.put(11, new ItemStack[] { new ItemStack(Blocks.cobblestone, 16) }); - godforgeUpgradeMats.put(26, new ItemStack[] { new ItemStack(Blocks.cobblestone, 32) }); - godforgeUpgradeMats.put(29, new ItemStack[] { new ItemStack(Blocks.cobblestone, 48) }); - godforgeUpgradeMats.put(30, new ItemStack[] { new ItemStack(Blocks.cobblestone, 64) }); + ForgeOfGodsUpgrade.START.addExtraCost( + new ItemStack(Blocks.cobblestone, 4), + new ItemStack(Blocks.dirt, 12), + new ItemStack(Blocks.diamond_block, 8), + new ItemStack(Blocks.gold_block, 32)); + ForgeOfGodsUpgrade.FDIM.addExtraCost(new ItemStack(Blocks.cobblestone, 8)); + ForgeOfGodsUpgrade.GPCI.addExtraCost(new ItemStack(Blocks.cobblestone, 12)); + ForgeOfGodsUpgrade.QGPIU.addExtraCost(new ItemStack(Blocks.cobblestone, 16)); + ForgeOfGodsUpgrade.CD.addExtraCost(new ItemStack(Blocks.cobblestone, 32)); + ForgeOfGodsUpgrade.EE.addExtraCost(new ItemStack(Blocks.cobblestone, 48)); + ForgeOfGodsUpgrade.END.addExtraCost(new ItemStack(Blocks.cobblestone, 64)); + } + + public static void addFakeUpgradeCostRecipes() { + GTValues.RA.stdBuilder() + .itemInputs(ArrayUtils.addAll(ForgeOfGodsUpgrade.START.getExtraCost())) + .itemOutputs( + CustomItemList.Godforge_GravitonFlowModulatorTier1.get(1), + CustomItemList.Machine_Multi_SmeltingModule.get(1)) + .duration(1) + .eut(1) + .metadata(FOG_UPGRADE_NAME_SHORT, ForgeOfGodsUpgrade.START.getShortNameText()) + .fake() + .addTo(TecTechRecipeMaps.godforgeFakeUpgradeCostRecipes); + GTValues.RA.stdBuilder() + .itemInputs(ArrayUtils.addAll(ForgeOfGodsUpgrade.FDIM.getExtraCost())) + .itemOutputs(CustomItemList.Machine_Multi_MoltenModule.get(1)) + .duration(1) + .eut(1) + .metadata(FOG_UPGRADE_NAME_SHORT, ForgeOfGodsUpgrade.FDIM.getShortNameText()) + .fake() + .addTo(TecTechRecipeMaps.godforgeFakeUpgradeCostRecipes); + GTValues.RA.stdBuilder() + .itemInputs(ArrayUtils.addAll(ForgeOfGodsUpgrade.GPCI.getExtraCost())) + .itemOutputs(CustomItemList.Machine_Multi_PlasmaModule.get(1)) + .duration(1) + .eut(1) + .metadata(FOG_UPGRADE_NAME_SHORT, ForgeOfGodsUpgrade.GPCI.getShortNameText()) + .fake() + .addTo(TecTechRecipeMaps.godforgeFakeUpgradeCostRecipes); + GTValues.RA.stdBuilder() + .itemInputs(ArrayUtils.addAll(ForgeOfGodsUpgrade.QGPIU.getExtraCost())) + .itemOutputs(CustomItemList.Machine_Multi_QuarkGluonPlasmaModule.get(1)) + .fluidOutputs(MaterialsUEVplus.QuarkGluonPlasma.getFluid(1000)) + .duration(1) + .eut(1) + .metadata(FOG_UPGRADE_NAME_SHORT, ForgeOfGodsUpgrade.QGPIU.getShortNameText()) + .fake() + .addTo(TecTechRecipeMaps.godforgeFakeUpgradeCostRecipes); + GTValues.RA.stdBuilder() + .itemInputs(ArrayUtils.addAll(ForgeOfGodsUpgrade.CD.getExtraCost())) + .itemOutputs(CustomItemList.Godforge_GravitonFlowModulatorTier2.get(1)) + .duration(1) + .eut(1) + .metadata(FOG_UPGRADE_NAME_SHORT, ForgeOfGodsUpgrade.CD.getShortNameText()) + .fake() + .addTo(TecTechRecipeMaps.godforgeFakeUpgradeCostRecipes); + GTValues.RA.stdBuilder() + .itemInputs(ArrayUtils.addAll(ForgeOfGodsUpgrade.EE.getExtraCost())) + .itemOutputs(CustomItemList.Godforge_GravitonFlowModulatorTier3.get(1)) + .duration(1) + .eut(1) + .metadata(FOG_UPGRADE_NAME_SHORT, ForgeOfGodsUpgrade.EE.getShortNameText()) + .fake() + .addTo(TecTechRecipeMaps.godforgeFakeUpgradeCostRecipes); + GTValues.RA.stdBuilder() + .itemInputs(ArrayUtils.addAll(ForgeOfGodsUpgrade.END.getExtraCost())) + .itemOutputs(MaterialsUEVplus.GravitonShard.getGems(1)) + .fluidOutputs(MaterialsUEVplus.MagMatter.getMolten(576), Materials.Neutronium.getPlasma(1000)) + .duration(1) + .eut(1) + .metadata(FOG_UPGRADE_NAME_SHORT, ForgeOfGodsUpgrade.END.getShortNameText()) + .fake() + .addTo(TecTechRecipeMaps.godforgeFakeUpgradeCostRecipes); } public static void initMoltenModuleRecipes() { diff --git a/src/main/java/tectech/recipe/GodforgeUpgradeCostFrontend.java b/src/main/java/tectech/recipe/GodforgeUpgradeCostFrontend.java new file mode 100644 index 0000000000..aa81856171 --- /dev/null +++ b/src/main/java/tectech/recipe/GodforgeUpgradeCostFrontend.java @@ -0,0 +1,74 @@ +package tectech.recipe; + +import static gregtech.api.util.GTRecipeConstants.FOG_UPGRADE_NAME_SHORT; + +import java.util.List; + +import javax.annotation.ParametersAreNonnullByDefault; + +import net.minecraft.client.Minecraft; +import net.minecraft.util.EnumChatFormatting; + +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; +import gregtech.api.recipe.RecipeMapFrontend; +import gregtech.api.util.MethodsReturnNonnullByDefault; +import gregtech.common.gui.modularui.UIHelper; +import gregtech.nei.RecipeDisplayInfo; +import tectech.thing.gui.TecTechUITextures; + +@ParametersAreNonnullByDefault +@MethodsReturnNonnullByDefault +public class GodforgeUpgradeCostFrontend extends RecipeMapFrontend { + + public GodforgeUpgradeCostFrontend(BasicUIPropertiesBuilder uiPropertiesBuilder, + NEIRecipePropertiesBuilder neiPropertiesBuilder) { + 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 UIHelper.getGridPositions(itemInputCount, 8, 17, 4); + } + + @Override + public List getItemOutputPositions(int itemOutputCount) { + return UIHelper.getGridPositions(itemOutputCount, 116, 26, 1); + } + + @Override + public List getFluidOutputPositions(int fluidOutputCount) { + return UIHelper.getGridPositions(fluidOutputCount, 134, 26, 1); + } + + @Override + protected void drawDurationInfo(RecipeDisplayInfo recipeInfo) {} + + @Override + protected void drawEnergyInfo(RecipeDisplayInfo recipeInfo) {} + + @Override + protected void drawSpecialInfo(RecipeDisplayInfo recipeInfo) { + String upgradeName = recipeInfo.recipe.getMetadataOrDefault(FOG_UPGRADE_NAME_SHORT, ""); + int width = Minecraft.getMinecraft().fontRenderer.getStringWidth(upgradeName); + if (width % 2 == 1) width -= 1; + int xOffset = 18 - width / 2 - 1; + recipeInfo.drawText(" ", 83, -76); + recipeInfo.drawText( + EnumChatFormatting.BLUE.toString() + EnumChatFormatting.UNDERLINE + EnumChatFormatting.BOLD + upgradeName, + 110 + xOffset, + 0); + } +} diff --git a/src/main/java/tectech/recipe/TecTechRecipeMaps.java b/src/main/java/tectech/recipe/TecTechRecipeMaps.java index d4908df5b7..de98a2c274 100644 --- a/src/main/java/tectech/recipe/TecTechRecipeMaps.java +++ b/src/main/java/tectech/recipe/TecTechRecipeMaps.java @@ -85,4 +85,16 @@ public class TecTechRecipeMaps { .logoPos(151, 63) .build(); + public static final RecipeMap godforgeFakeUpgradeCostRecipes = RecipeMapBuilder + .of("gt.recipe.upgrade_costs") + .maxIO(12, 2, 0, 2) + .addSpecialTexture(83, 38, 30, 13, GTUITextures.PICTURE_ARROW_GRAY) + .dontUseProgressBar() + .neiTransferRect(83, 38, 30, 13) + .frontend(GodforgeUpgradeCostFrontend::new) + .neiHandlerInfo( + builder -> builder.setDisplayStack(CustomItemList.Machine_Multi_ForgeOfGods.get(1)) + .setHeight(100)) + .build(); + } diff --git a/src/main/java/tectech/thing/block/RenderForgeOfGods.java b/src/main/java/tectech/thing/block/RenderForgeOfGods.java index 9091434490..af67c97d44 100644 --- a/src/main/java/tectech/thing/block/RenderForgeOfGods.java +++ b/src/main/java/tectech/thing/block/RenderForgeOfGods.java @@ -28,8 +28,8 @@ import com.gtnewhorizon.gtnhlib.client.renderer.shader.ShaderProgram; import com.gtnewhorizon.gtnhlib.client.renderer.vbo.VertexBuffer; import tectech.Reference; -import tectech.thing.metaTileEntity.multi.godforge.ForgeOfGodsRingsStructureString; -import tectech.thing.metaTileEntity.multi.godforge.ForgeOfGodsStructureString; +import tectech.thing.metaTileEntity.multi.godforge.structure.ForgeOfGodsRingsStructureString; +import tectech.thing.metaTileEntity.multi.godforge.structure.ForgeOfGodsStructureString; import tectech.util.StructureVBO; import tectech.util.TextureUpdateRequester; diff --git a/src/main/java/tectech/thing/block/TileEntityForgeOfGods.java b/src/main/java/tectech/thing/block/TileEntityForgeOfGods.java index a8a8992a63..0e18b08667 100644 --- a/src/main/java/tectech/thing/block/TileEntityForgeOfGods.java +++ b/src/main/java/tectech/thing/block/TileEntityForgeOfGods.java @@ -200,7 +200,7 @@ public class TileEntityForgeOfGods extends TileEntity { cycleStep = 0; } else { // update interp values to the next set, reset cycleStep then interpolate - cycleStep = -255; + cycleStep -= 255; cycleStarColors(); interpolateColors(); } diff --git a/src/main/java/tectech/thing/gui/TecTechUITextures.java b/src/main/java/tectech/thing/gui/TecTechUITextures.java index 89fb7c5b11..f8e6bbe59b 100644 --- a/src/main/java/tectech/thing/gui/TecTechUITextures.java +++ b/src/main/java/tectech/thing/gui/TecTechUITextures.java @@ -123,6 +123,8 @@ public class TecTechUITextures { .fullImage(MODID, "gui/overlay_button/furnace_mode_on"); public static final UITexture OVERLAY_BUTTON_FURNACE_MODE_OFF = UITexture .fullImage(MODID, "gui/overlay_button/furnace_mode_off"); + public static final UITexture OVERLAY_BUTTON_STATISTICS = UITexture + .fullImage(MODID, "gui/overlay_button/statistics"); public static final UITexture OVERLAY_CYCLIC_BLUE = UITexture.fullImage(MODID, "gui/overlay_button/cyclic_blue"); public static final UITexture OVERLAY_EJECTION_LOCKED = UITexture .fullImage(MODID, "gui/overlay_button/eject_disabled"); @@ -226,6 +228,7 @@ public class TecTechUITextures { .fullImage(MODID, "gui/picture/connector_red_opaque"); public static final UITexture SLOT_OUTLINE_GREEN = UITexture.fullImage(MODID, "gui/picture/green_selector"); public static final UITexture UNSELECTED_OPTION = UITexture.fullImage(MODID, "gui/picture/unselected_option"); + public static final UITexture GREEN_CHECKMARK_11x9 = UITexture.fullImage(MODID, "gui/picture/green_checkmark"); public static final UITexture PICTURE_GODFORGE_MILESTONE_CHARGE = UITexture .fullImage(MODID, "gui/picture/milestone_charge"); public static final UITexture PICTURE_GODFORGE_MILESTONE_CONVERSION = UITexture diff --git a/src/main/java/tectech/thing/metaTileEntity/multi/godforge/ForgeOfGodsRingsStructureString.java b/src/main/java/tectech/thing/metaTileEntity/multi/godforge/ForgeOfGodsRingsStructureString.java deleted file mode 100644 index fcff5c7026..0000000000 --- a/src/main/java/tectech/thing/metaTileEntity/multi/godforge/ForgeOfGodsRingsStructureString.java +++ /dev/null @@ -1,5105 +0,0 @@ -package tectech.thing.metaTileEntity.multi.godforge; - -import static tectech.util.TTUtility.replaceLetters; - -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 ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " " } }; - public static final String[][] SECOND_RING_AIR = replaceLetters(SECOND_RING, "L"); - public static final String[][] THIRD_RING_AIR = replaceLetters(THIRD_RING, "L"); - -} diff --git a/src/main/java/tectech/thing/metaTileEntity/multi/godforge/ForgeOfGodsStructureString.java b/src/main/java/tectech/thing/metaTileEntity/multi/godforge/ForgeOfGodsStructureString.java deleted file mode 100644 index 1780be0079..0000000000 --- a/src/main/java/tectech/thing/metaTileEntity/multi/godforge/ForgeOfGodsStructureString.java +++ /dev/null @@ -1,5435 +0,0 @@ -package tectech.thing.metaTileEntity.multi.godforge; - -import static tectech.util.TTUtility.appendStringArrays; -import static tectech.util.TTUtility.replaceLetters; - -public abstract class ForgeOfGodsStructureString { - - public static final String[][] BEAM_SHAFT = { { - " ", - " ", - " ", - " ", - " ", - " ", - " 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 ", - " 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 ", - " " }, - { " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " " }, - { " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " " }, - { " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " " }, - { " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " " }, - { " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " " }, - { " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " " } }; - public static final String[][] FIRST_RING = { { - " ", - " ", - " ", - " ", - " ", - " 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 ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " " } }; - public static final String[][] MAIN_STRUCTURE = appendStringArrays(BEAM_SHAFT, FIRST_RING); - public static final String[][] FIRST_RING_AIR = replaceLetters(FIRST_RING, "L"); -} diff --git a/src/main/java/tectech/thing/metaTileEntity/multi/godforge/ForgeOfGodsUI.java b/src/main/java/tectech/thing/metaTileEntity/multi/godforge/ForgeOfGodsUI.java deleted file mode 100644 index a63ba81d7e..0000000000 --- a/src/main/java/tectech/thing/metaTileEntity/multi/godforge/ForgeOfGodsUI.java +++ /dev/null @@ -1,549 +0,0 @@ -package tectech.thing.metaTileEntity.multi.godforge; - -import static gregtech.api.metatileentity.BaseTileEntity.TOOLTIP_DELAY; -import static net.minecraft.util.StatCollector.translateToLocal; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Set; -import java.util.function.BiConsumer; -import java.util.function.Consumer; -import java.util.function.DoubleConsumer; -import java.util.function.DoubleSupplier; -import java.util.function.Supplier; - -import net.minecraft.util.EnumChatFormatting; -import net.minecraft.util.StatCollector; - -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.Size; -import com.gtnewhorizons.modularui.api.screen.ModularUIContext; -import com.gtnewhorizons.modularui.api.screen.ModularWindow; -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.DynamicTextWidget; -import com.gtnewhorizons.modularui.common.widget.FakeSyncWidget; -import com.gtnewhorizons.modularui.common.widget.MultiChildWidget; -import com.gtnewhorizons.modularui.common.widget.Scrollable; -import com.gtnewhorizons.modularui.common.widget.SliderWidget; -import com.gtnewhorizons.modularui.common.widget.TextWidget; -import com.gtnewhorizons.modularui.common.widget.textfield.NumericWidget; - -import gregtech.api.enums.VoidingMode; -import gregtech.api.gui.modularui.GTUITextures; -import gregtech.api.interfaces.modularui.IControllerWithOptionalFeatures; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import tectech.TecTech; -import tectech.thing.gui.TecTechUITextures; -import tectech.thing.metaTileEntity.multi.godforge.color.ForgeOfGodsStarColor; - -/** - * Holds UI element builders and other conveniences shared between the primary Forge of the Gods and its modules. - */ -public class ForgeOfGodsUI { - - // ARGB representations of the 4 colors used in the color selector (red, green, blue, gold) - public static final int RED_ARGB = 0xFFFF5555; - public static final int GREEN_ARGB = 0xFF55FF55; - public static final int BLUE_ARGB = 0xFF0000AA; - public static final int GOLD_ARGB = 0xFFFFAA00; - - public static ButtonWidget createPowerSwitchButton(final IGregTechTileEntity tileEntity) { - Widget button = new ButtonWidget().setOnClick((clickData, widget) -> { - TecTech.proxy.playSound(tileEntity, "fx_click"); - if (tileEntity.isAllowedToWork()) { - tileEntity.disableWorking(); - } else { - tileEntity.enableWorking(); - } - }) - .setPlayClickSound(false) - .setBackground(() -> { - List ret = new ArrayList<>(); - ret.add(TecTechUITextures.BUTTON_CELESTIAL_32x32); - if (tileEntity.isAllowedToWork()) { - ret.add(TecTechUITextures.OVERLAY_BUTTON_POWER_SWITCH_ON); - } else { - ret.add(TecTechUITextures.OVERLAY_BUTTON_POWER_SWITCH_DISABLED); - } - return ret.toArray(new IDrawable[0]); - }) - .setPos(174, 148) - .setSize(16, 16); - button.addTooltip("Power Switch") - .setTooltipShowUpDelay(TOOLTIP_DELAY); - return (ButtonWidget) button; - } - - public static ButtonWidget createInputSeparationButton(final IGregTechTileEntity tileEntity, - final IControllerWithOptionalFeatures mte, IWidgetBuilder builder) { - Widget button = new ButtonWidget().setOnClick((clickData, widget) -> { - TecTech.proxy.playSound(tileEntity, "fx_click"); - mte.setInputSeparation(!mte.isInputSeparationEnabled()); - }) - .setPlayClickSound(false) - .setBackground(() -> { - List ret = new ArrayList<>(); - ret.add(TecTechUITextures.BUTTON_CELESTIAL_32x32); - if (mte.isInputSeparationEnabled()) { - ret.add(TecTechUITextures.OVERLAY_BUTTON_INPUT_SEPARATION); - } else { - ret.add(TecTechUITextures.OVERLAY_BUTTON_INPUT_SEPARATION_OFF); - } - return ret.toArray(new IDrawable[0]); - }) - .attachSyncer( - new FakeSyncWidget.BooleanSyncer(mte::isInputSeparationEnabled, mte::setInputSeparation), - builder) - .addTooltip(StatCollector.translateToLocal("GT5U.gui.button.input_separation")) - .setTooltipShowUpDelay(TOOLTIP_DELAY) - .setPos(mte.getInputSeparationButtonPos()) - .setSize(16, 16); - return (ButtonWidget) button; - } - - public static ButtonWidget createBatchModeButton(final IGregTechTileEntity tileEntity, - final IControllerWithOptionalFeatures mte, IWidgetBuilder builder) { - Widget button = new ButtonWidget().setOnClick((clickData, widget) -> { - TecTech.proxy.playSound(tileEntity, "fx_click"); - mte.setBatchMode(!mte.isBatchModeEnabled()); - }) - .setPlayClickSound(false) - .setBackground(() -> { - List ret = new ArrayList<>(); - ret.add(TecTechUITextures.BUTTON_CELESTIAL_32x32); - if (mte.isBatchModeEnabled()) { - ret.add(TecTechUITextures.OVERLAY_BUTTON_BATCH_MODE); - } else { - ret.add(TecTechUITextures.OVERLAY_BUTTON_BATCH_MODE_OFF); - } - return ret.toArray(new IDrawable[0]); - }) - .attachSyncer(new FakeSyncWidget.BooleanSyncer(mte::isBatchModeEnabled, mte::setBatchMode), builder) - .addTooltip(StatCollector.translateToLocal("GT5U.gui.button.batch_mode")) - .setTooltipShowUpDelay(TOOLTIP_DELAY) - .setPos(mte.getBatchModeButtonPos()) - .setSize(16, 16); - return (ButtonWidget) button; - } - - public static ButtonWidget createLockToSingleRecipeButton(final IGregTechTileEntity tileEntity, - final IControllerWithOptionalFeatures mte, IWidgetBuilder builder) { - Widget button = new ButtonWidget().setOnClick((clickData, widget) -> { - TecTech.proxy.playSound(tileEntity, "fx_click"); - mte.setRecipeLocking(!mte.isRecipeLockingEnabled()); - }) - .setPlayClickSound(false) - .setBackground(() -> { - List ret = new ArrayList<>(); - ret.add(TecTechUITextures.BUTTON_CELESTIAL_32x32); - if (mte.isRecipeLockingEnabled()) { - ret.add(TecTechUITextures.OVERLAY_BUTTON_RECIPE_LOCKED); - } else { - ret.add(TecTechUITextures.OVERLAY_BUTTON_RECIPE_UNLOCKED); - } - return ret.toArray(new IDrawable[0]); - }) - .attachSyncer(new FakeSyncWidget.BooleanSyncer(mte::isRecipeLockingEnabled, mte::setRecipeLocking), builder) - .addTooltip(StatCollector.translateToLocal("GT5U.gui.button.lock_recipe")) - .setTooltipShowUpDelay(TOOLTIP_DELAY) - .setPos(mte.getRecipeLockingButtonPos()) - .setSize(16, 16); - return (ButtonWidget) button; - } - - public static ButtonWidget createStructureUpdateButton(final IGregTechTileEntity tileEntity, - final IControllerWithOptionalFeatures mte, IWidgetBuilder builder) { - Widget button = new ButtonWidget().setOnClick((clickData, widget) -> { - TecTech.proxy.playSound(tileEntity, "fx_click"); - if (mte.getStructureUpdateTime() <= -20) { - mte.setStructureUpdateTime(1); - } - }) - .setPlayClickSound(false) - .setBackground(() -> { - List ret = new ArrayList<>(); - ret.add(TecTechUITextures.BUTTON_CELESTIAL_32x32); - if (mte.getStructureUpdateTime() > -20) { - ret.add(TecTechUITextures.OVERLAY_BUTTON_STRUCTURE_CHECK); - } else { - ret.add(TecTechUITextures.OVERLAY_BUTTON_STRUCTURE_CHECK_OFF); - } - return ret.toArray(new IDrawable[0]); - }) - .attachSyncer( - new FakeSyncWidget.IntegerSyncer(mte::getStructureUpdateTime, mte::setStructureUpdateTime), - builder) - .addTooltip(StatCollector.translateToLocal("GT5U.gui.button.structure_update")) - .setTooltipShowUpDelay(TOOLTIP_DELAY) - .setPos(mte.getStructureUpdateButtonPos()) - .setSize(16, 16); - return (ButtonWidget) button; - } - - public static ButtonWidget createVoidExcessButton(final IGregTechTileEntity tileEntity, - final IControllerWithOptionalFeatures mte, IWidgetBuilder builder) { - Widget button = new ButtonWidget().setOnClick((clickData, widget) -> { - TecTech.proxy.playSound(tileEntity, "fx_click"); - Set allowed = mte.getAllowedVoidingModes(); - switch (clickData.mouseButton) { - case 0 -> mte.setVoidingMode( - mte.getVoidingMode() - .nextInCollection(allowed)); - case 1 -> mte.setVoidingMode( - mte.getVoidingMode() - .previousInCollection(allowed)); - } - widget.notifyTooltipChange(); - }) - .setPlayClickSound(false) - .setBackground(() -> { - List ret = new ArrayList<>(); - ret.add(TecTechUITextures.BUTTON_CELESTIAL_32x32); - switch (mte.getVoidingMode()) { - case VOID_NONE -> ret.add(TecTechUITextures.OVERLAY_BUTTON_VOIDING_OFF); - case VOID_ITEM -> ret.add(TecTechUITextures.OVERLAY_BUTTON_VOIDING_ITEMS); - case VOID_FLUID -> ret.add(TecTechUITextures.OVERLAY_BUTTON_VOIDING_FLUIDS); - case VOID_ALL -> ret.add(TecTechUITextures.OVERLAY_BUTTON_VOIDING_BOTH); - } - return ret.toArray(new IDrawable[0]); - }) - .attachSyncer( - new FakeSyncWidget.IntegerSyncer( - () -> mte.getVoidingMode() - .ordinal(), - val -> mte.setVoidingMode(VoidingMode.fromOrdinal(val))), - builder) - .dynamicTooltip( - () -> Arrays.asList( - StatCollector.translateToLocal("GT5U.gui.button.voiding_mode"), - StatCollector.translateToLocal( - mte.getVoidingMode() - .getTransKey()))) - .setTooltipShowUpDelay(TOOLTIP_DELAY) - .setPos(mte.getVoidingModeButtonPos()) - .setSize(16, 16); - return (ButtonWidget) button; - } - - public static ModularWindow createGeneralInfoWindow(Supplier inversionGetter, - Consumer inversionSetter) { - final Scrollable scrollable = new Scrollable().setVerticalScroll(); - final int WIDTH = 300; - final int HEIGHT = 300; - ModularWindow.Builder builder = ModularWindow.builder(WIDTH, HEIGHT); - - builder.setDraggable(true); - scrollable.widget( - new TextWidget(EnumChatFormatting.BOLD + translateToLocal("gt.blockmachines.multimachine.FOG.introduction")) - .setDefaultColor(EnumChatFormatting.DARK_PURPLE) - .setTextAlignment(Alignment.TopCenter) - .setPos(7, 13) - .setSize(280, 15)) - .widget( - new TextWidget(translateToLocal("gt.blockmachines.multimachine.FOG.introductioninfotext")) - .setDefaultColor(EnumChatFormatting.GOLD) - .setTextAlignment(Alignment.CenterLeft) - .setPos(7, 30) - .setSize(280, 50)) - .widget( - new TextWidget( - EnumChatFormatting.BOLD + translateToLocal("gt.blockmachines.multimachine.FOG.tableofcontents")) - .setDefaultColor(EnumChatFormatting.AQUA) - .setTextAlignment(Alignment.CenterLeft) - .setPos(7, 80) - .setSize(150, 15)) - .widget( - new ButtonWidget().setOnClick((clickData, widget) -> scrollable.setVerticalScrollOffset(150)) - .setBackground( - new Text(EnumChatFormatting.BOLD + translateToLocal("gt.blockmachines.multimachine.FOG.fuel")) - .alignment(Alignment.CenterLeft) - .color(0x55ffff)) - .setPos(7, 95) - .setSize(150, 15)) - .widget( - new ButtonWidget().setOnClick((clickData, widget) -> scrollable.setVerticalScrollOffset(434)) - .setBackground( - new Text( - EnumChatFormatting.BOLD + translateToLocal("gt.blockmachines.multimachine.FOG.modules")) - .alignment(Alignment.CenterLeft) - .color(0x55ffff)) - .setPos(7, 110) - .setSize(150, 15)) - .widget( - new ButtonWidget().setOnClick((clickData, widget) -> scrollable.setVerticalScrollOffset(1088)) - .setBackground( - new Text( - EnumChatFormatting.BOLD + translateToLocal("gt.blockmachines.multimachine.FOG.upgrades")) - .alignment(Alignment.CenterLeft) - .color(0x55ffff)) - .setPos(7, 125) - .setSize(150, 15)) - .widget( - new ButtonWidget().setOnClick((clickData, widget) -> scrollable.setVerticalScrollOffset(1412)) - .setBackground( - new Text( - EnumChatFormatting.BOLD + translateToLocal("gt.blockmachines.multimachine.FOG.milestones")) - .alignment(Alignment.CenterLeft) - .color(0x55ffff)) - .setPos(7, 140) - .setSize(150, 15)) - .widget( - TextWidget.dynamicText(() -> inversionInfoText(inversionGetter.get())) - .setDefaultColor(EnumChatFormatting.WHITE) - .setTextAlignment(Alignment.CenterLeft) - .setPos(7, 155) - .setSize(150, 15)) - .widget(new ButtonWidget().setOnClick((clickData, widget) -> { - if (inversionGetter.get()) { - scrollable.setVerticalScrollOffset(1766); - } - }) - .setPlayClickSound(inversionGetter.get()) - .setPos(7, 155) - .setSize(150, 15) - .attachSyncer(new FakeSyncWidget.BooleanSyncer(inversionGetter, inversionSetter), scrollable)) - .widget( - new TextWidget( - EnumChatFormatting.BOLD + "§N" + translateToLocal("gt.blockmachines.multimachine.FOG.fuel")) - .setDefaultColor(EnumChatFormatting.DARK_PURPLE) - .setTextAlignment(Alignment.TopCenter) - .setPos(127, 160) - .setSize(40, 15)) - .widget( - new TextWidget(translateToLocal("gt.blockmachines.multimachine.FOG.fuelinfotext")) - .setDefaultColor(EnumChatFormatting.GOLD) - .setTextAlignment(Alignment.CenterLeft) - .setPos(7, 177) - .setSize(280, 250)) - .widget( - new TextWidget( - EnumChatFormatting.BOLD + "§N" + translateToLocal("gt.blockmachines.multimachine.FOG.modules")) - .setDefaultColor(EnumChatFormatting.DARK_PURPLE) - .setTextAlignment(Alignment.TopCenter) - .setPos(7, 440) - .setSize(280, 15)) - .widget( - new TextWidget(translateToLocal("gt.blockmachines.multimachine.FOG.moduleinfotext")) - .setDefaultColor(EnumChatFormatting.GOLD) - .setTextAlignment(Alignment.CenterLeft) - .setPos(7, 461) - .setSize(280, 620)) - .widget( - new TextWidget( - EnumChatFormatting.BOLD + "§N" + translateToLocal("gt.blockmachines.multimachine.FOG.upgrades")) - .setDefaultColor(EnumChatFormatting.DARK_PURPLE) - .setTextAlignment(Alignment.TopCenter) - .setPos(7, 1098) - .setSize(280, 15)) - .widget( - new TextWidget(translateToLocal("gt.blockmachines.multimachine.FOG.upgradeinfotext")) - .setDefaultColor(EnumChatFormatting.GOLD) - .setTextAlignment(Alignment.CenterLeft) - .setPos(7, 1115) - .setSize(280, 290)) - .widget( - new TextWidget( - EnumChatFormatting.BOLD + "§N" + translateToLocal("gt.blockmachines.multimachine.FOG.milestones")) - .setDefaultColor(EnumChatFormatting.DARK_PURPLE) - .setTextAlignment(Alignment.TopCenter) - .setPos(7, 1422) - .setSize(280, 15)) - .widget( - new TextWidget(translateToLocal("gt.blockmachines.multimachine.FOG.milestoneinfotext")) - .setDefaultColor(EnumChatFormatting.GOLD) - .setTextAlignment(Alignment.CenterLeft) - .setPos(7, 1439) - .setSize(280, 320)) - .widget( - TextWidget.dynamicText(() -> inversionHeaderText(inversionGetter.get())) - .setDefaultColor(EnumChatFormatting.WHITE) - .setTextAlignment(Alignment.TopCenter) - .setPos(7, 1776) - .setSize(280, 15)) - .widget( - TextWidget.dynamicText(() -> inversionInfoText(inversionGetter.get())) - .setDefaultColor(EnumChatFormatting.GOLD) - .setTextAlignment(Alignment.CenterLeft) - .setPos(7, 1793) - .setSize(280, 160)) - .widget( - new TextWidget("").setPos(7, 1965) - .setSize(10, 10)); - - builder.widget( - new DrawableWidget().setDrawable(TecTechUITextures.BACKGROUND_GLOW_WHITE) - .setPos(0, 0) - .setSize(300, 300)) - .widget( - scrollable.setSize(292, 292) - .setPos(4, 4)) - .widget( - ButtonWidget.closeWindowButton(true) - .setPos(284, 4)); - - return builder.build(); - } - - private static Text inversionHeaderText(boolean inversion) { - return inversion - ? new Text( - EnumChatFormatting.BOLD + "§k2" - + EnumChatFormatting.RESET - + EnumChatFormatting.WHITE - + EnumChatFormatting.BOLD - + translateToLocal("gt.blockmachines.multimachine.FOG.inversion") - + EnumChatFormatting.BOLD - + "§k2") - : new Text(""); - } - - private static Text inversionInfoText(boolean inversion) { - return inversion ? new Text(translateToLocal("gt.blockmachines.multimachine.FOG.inversioninfotext")) - : new Text(""); - } - - public static void reopenWindow(Widget widget, int windowId) { - if (!widget.isClient()) { - ModularUIContext ctx = widget.getContext(); - if (ctx.isWindowOpen(windowId)) { - ctx.closeWindow(windowId); - } - ctx.openSyncedWindow(windowId); - } - } - - public enum StarColorRGBM { - - RED(EnumChatFormatting.RED, RED_ARGB, 0, 255, ForgeOfGodsStarColor.DEFAULT_RED), - GREEN(EnumChatFormatting.GREEN, GREEN_ARGB, 0, 255, ForgeOfGodsStarColor.DEFAULT_GREEN), - BLUE(EnumChatFormatting.DARK_BLUE, BLUE_ARGB, 0, 255, ForgeOfGodsStarColor.DEFAULT_BLUE), - GAMMA(EnumChatFormatting.GOLD, GOLD_ARGB, 0, 100, ForgeOfGodsStarColor.DEFAULT_GAMMA); - - private final String title; - private final EnumChatFormatting mcColor; - private final int muiColor; - private final float lowerBound, upperBound; - private final float defaultValue; - - StarColorRGBM(EnumChatFormatting mcColor, int muiColor, float lower, float upper, float defaultVal) { - this.title = "fog.cosmetics.color." + name().toLowerCase(); - this.mcColor = mcColor; - this.muiColor = muiColor; - this.lowerBound = lower; - this.upperBound = upper; - this.defaultValue = defaultVal; - } - - public String tooltip(float value) { - if (this == GAMMA) { - return String.format("%s%s: %.1f", mcColor, translateToLocal(title), value); - } - return String.format("%s%s: %d", mcColor, translateToLocal(title), (int) value); - } - } - - public static Widget createStarColorRGBMGroup(StarColorRGBM color, DoubleConsumer setter, DoubleSupplier getter) { - MultiChildWidget widget = new MultiChildWidget(); - widget.setSize(184, 16); - - // Title - widget.addChild( - new TextWidget(translateToLocal(color.title)).setDefaultColor(color.mcColor) - .setTextAlignment(Alignment.CenterLeft) - .setPos(0, 0) - .setSize(32, 16)); - - // Color slider - widget.addChild(new SliderWidget().setSetter(val -> { - int aux = (int) (val * 10); - setter.accept(aux / 10d); - }) - .setGetter(() -> (float) getter.getAsDouble()) - .setBounds(color.lowerBound, color.upperBound) - .setHandleSize(new Size(4, 0)) - .dynamicTooltip(() -> { - List ret = new ArrayList<>(); - ret.add(color.tooltip((float) getter.getAsDouble())); - return ret; - }) - .setUpdateTooltipEveryTick(true) - .setSize(118, 8) - .setPos(32, 4)); - - // Color manual text box - Widget numberEntry = new NumericWidget().setSetter(setter) - .setGetter(getter) - .setBounds(color.lowerBound, color.upperBound) - .setDefaultValue(color.defaultValue) - .setTextAlignment(Alignment.Center) - .setTextColor(color.muiColor) - .setSize(32, 16) - .setPos(152, 0) - .setTooltipShowUpDelay(TOOLTIP_DELAY) - .setBackground(GTUITextures.BACKGROUND_TEXT_FIELD); - - if (color == StarColorRGBM.GAMMA) { - numberEntry.addTooltip(translateToLocal("fog.cosmetics.onlydecimals")); - ((NumericWidget) numberEntry).setIntegerOnly(false); - } else { - numberEntry.addTooltip(translateToLocal("fog.cosmetics.onlyintegers")); - } - - return widget.addChild(numberEntry); - } - - public static Widget createStarColorButton(String text, String tooltip, - BiConsumer onClick) { - MultiChildWidget widget = new MultiChildWidget(); - widget.setSize(35, 15); - - widget.addChild( - new ButtonWidget().setOnClick(onClick) - .setSize(35, 15) - .setBackground(GTUITextures.BUTTON_STANDARD) - .addTooltip(translateToLocal(tooltip)) - .setTooltipShowUpDelay(TOOLTIP_DELAY) - .setPos(0, 0)); - - widget.addChild( - TextWidget.localised(text) - .setTextAlignment(Alignment.Center) - .setPos(0, 0) - .setSize(35, 15)); - - return widget; - } - - public static Widget createStarColorButton(Supplier text, Supplier tooltip, - BiConsumer onClick) { - MultiChildWidget widget = new MultiChildWidget(); - widget.setSize(35, 15); - - widget.addChild( - new ButtonWidget().setOnClick(onClick) - .setSize(35, 15) - .setBackground(GTUITextures.BUTTON_STANDARD) - .dynamicTooltip(() -> { - List ret = new ArrayList<>(); - ret.add(translateToLocal(tooltip.get())); - return ret; - }) - .setUpdateTooltipEveryTick(true) - .setTooltipShowUpDelay(TOOLTIP_DELAY) - .setPos(0, 0)); - - widget.addChild( - new DynamicTextWidget(() -> new Text(translateToLocal(text.get()))).setTextAlignment(Alignment.Center) - .setPos(0, 0) - .setSize(35, 15)); - - return widget; - } -} diff --git a/src/main/java/tectech/thing/metaTileEntity/multi/godforge/MTEBaseModule.java b/src/main/java/tectech/thing/metaTileEntity/multi/godforge/MTEBaseModule.java index 8b432d2ce8..85cc5b11b5 100644 --- a/src/main/java/tectech/thing/metaTileEntity/multi/godforge/MTEBaseModule.java +++ b/src/main/java/tectech/thing/metaTileEntity/multi/godforge/MTEBaseModule.java @@ -57,6 +57,7 @@ import gregtech.api.util.GTStructureUtility; import tectech.TecTech; import tectech.thing.gui.TecTechUITextures; import tectech.thing.metaTileEntity.multi.base.TTMultiblockBase; +import tectech.thing.metaTileEntity.multi.godforge.util.ForgeOfGodsUI; public class MTEBaseModule extends TTMultiblockBase { diff --git a/src/main/java/tectech/thing/metaTileEntity/multi/godforge/MTEExoticModule.java b/src/main/java/tectech/thing/metaTileEntity/multi/godforge/MTEExoticModule.java index d30f9402d9..e14a40f863 100644 --- a/src/main/java/tectech/thing/metaTileEntity/multi/godforge/MTEExoticModule.java +++ b/src/main/java/tectech/thing/metaTileEntity/multi/godforge/MTEExoticModule.java @@ -1,5 +1,6 @@ package tectech.thing.metaTileEntity.multi.godforge; +import static gregtech.api.enums.Mods.NewHorizonsCoreMod; import static gregtech.api.metatileentity.BaseTileEntity.TOOLTIP_DELAY; import static gregtech.api.util.GTRecipeBuilder.INGOTS; import static gregtech.api.util.GTRecipeBuilder.SECONDS; @@ -22,8 +23,6 @@ import java.util.List; import java.util.Map; import java.util.stream.Stream; -import javax.annotation.Nonnull; - import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; @@ -42,6 +41,8 @@ import com.gtnewhorizons.modularui.api.drawable.IDrawable; import com.gtnewhorizons.modularui.api.drawable.ItemDrawable; import com.gtnewhorizons.modularui.api.fluids.FluidTanksHandler; import com.gtnewhorizons.modularui.api.fluids.IFluidTanksHandler; +import com.gtnewhorizons.modularui.api.forge.IItemHandlerModifiable; +import com.gtnewhorizons.modularui.api.forge.ItemStackHandler; import com.gtnewhorizons.modularui.api.math.Alignment; import com.gtnewhorizons.modularui.api.math.Pos2d; import com.gtnewhorizons.modularui.api.math.Size; @@ -53,6 +54,7 @@ import com.gtnewhorizons.modularui.common.widget.ButtonWidget; import com.gtnewhorizons.modularui.common.widget.DrawableWidget; import com.gtnewhorizons.modularui.common.widget.FakeSyncWidget; import com.gtnewhorizons.modularui.common.widget.FluidSlotWidget; +import com.gtnewhorizons.modularui.common.widget.SlotWidget; import com.gtnewhorizons.modularui.common.widget.TextWidget; import gregtech.api.enums.MaterialsUEVplus; @@ -69,13 +71,15 @@ import gregtech.api.recipe.check.SimpleCheckRecipeResult; import gregtech.api.util.GTOreDictUnificator; import gregtech.api.util.GTRecipe; import gregtech.api.util.GTStreamUtil; +import gregtech.api.util.GTUtility; import gregtech.api.util.MultiblockTooltipBuilder; import gregtech.api.util.OverclockCalculator; import tectech.TecTech; import tectech.recipe.TecTechRecipeMaps; import tectech.thing.CustomItemList; import tectech.thing.gui.TecTechUITextures; -import tectech.util.GodforgeMath; +import tectech.thing.metaTileEntity.multi.godforge.util.ForgeOfGodsUI; +import tectech.thing.metaTileEntity.multi.godforge.util.GodforgeMath; public class MTEExoticModule extends MTEBaseModule { @@ -93,6 +97,7 @@ public class MTEExoticModule extends MTEBaseModule { private BigInteger powerForRecipe = BigInteger.ZERO; private static final int NUMBER_OF_INPUTS = 7; private static final int INPUT_LIST_WINDOW_ID = 11; + private static final int POSSIBLE_INPUTS_WINDOW_ID = 12; public MTEExoticModule(int aID, String aName, String aNameRegional) { super(aID, aName, aNameRegional); @@ -126,7 +131,7 @@ public class MTEExoticModule extends MTEBaseModule { @NotNull @Override - protected CheckRecipeResult validateRecipe(@Nonnull GTRecipe recipe) { + protected CheckRecipeResult validateRecipe(@NotNull GTRecipe recipe) { if (!recipeInProgress || recipeRegenerated) { powerForRecipe = BigInteger.valueOf(getProcessingVoltage()) .multiply(BigInteger.valueOf(recipe.mDuration * actualParallel)); @@ -155,7 +160,8 @@ public class MTEExoticModule extends MTEBaseModule { } for (FluidStack stack : recipe.mFluidInputs) { - if (!ArrayUtils.contains(inputFluids, stack)) { + if (!ArrayUtils.contains(inputFluids, stack) + || inputFluids[ArrayUtils.indexOf(inputFluids, stack)].amount != stack.amount) { return SimpleCheckRecipeResult.ofFailure("waiting_for_inputs"); } } @@ -164,7 +170,7 @@ public class MTEExoticModule extends MTEBaseModule { @NotNull @Override - protected CheckRecipeResult onRecipeStart(@Nonnull GTRecipe recipe) { + protected CheckRecipeResult onRecipeStart(@NotNull GTRecipe recipe) { EUt = calculatedEut; powerForRecipe = BigInteger.valueOf(EUt) .multiply(BigInteger.valueOf(duration * actualParallel)); @@ -181,9 +187,9 @@ public class MTEExoticModule extends MTEBaseModule { return CheckRecipeResultRegistry.SUCCESSFUL; } - @Nonnull + @NotNull @Override - protected OverclockCalculator createOverclockCalculator(@Nonnull GTRecipe recipe) { + protected OverclockCalculator createOverclockCalculator(@NotNull GTRecipe recipe) { return super.createOverclockCalculator(recipe).setEUt(getProcessingVoltage()) .setDurationDecreasePerOC(getOverclockTimeFactor()); } @@ -369,7 +375,7 @@ public class MTEExoticModule extends MTEBaseModule { @Override public boolean supportsBatchMode() { - return false; + return true; } @Override @@ -465,6 +471,7 @@ public class MTEExoticModule extends MTEBaseModule { .setTooltipShowUpDelay(TOOLTIP_DELAY)); super.addUIWidgets(builder, buildContext); buildContext.addSyncedWindow(INPUT_LIST_WINDOW_ID, this::createInputListWindow); + buildContext.addSyncedWindow(POSSIBLE_INPUTS_WINDOW_ID, this::createPossibleInputsWindow); builder.widget(createMagmatterSwitch(builder)); builder.widget(createExpectedInputsButton()); builder.widget( @@ -548,6 +555,10 @@ public class MTEExoticModule extends MTEBaseModule { builder, (widget, val) -> widget.notifyTooltipChange())); + if (NewHorizonsCoreMod.isModLoaded()) { + builder.widget(createPossibleInputsButton()); + } + return builder.build(); } @@ -563,6 +574,155 @@ public class MTEExoticModule extends MTEBaseModule { .setPos(8, 69); } + protected ModularWindow createPossibleInputsWindow(final EntityPlayer player) { + final int WIDTH = 300; + final int HEIGHT = 143; + ModularWindow.Builder builder = ModularWindow.builder(WIDTH, HEIGHT); + builder.setBackground(GTUITextures.BACKGROUND_SINGLEBLOCK_DEFAULT); + builder.setGuiTint(getGUIColorization()); + builder.setDraggable(true); + builder.widget( + ButtonWidget.closeWindowButton(true) + .setPos(284, 4)); + + int QGPItemMapSize = exoticModulePlasmaItemMap.size(); + int QGPFluidMapSize = exoticModulePlasmaFluidMap.size(); + + IItemHandlerModifiable QGPItemHandler = new ItemStackHandler(QGPItemMapSize); + IFluidTanksHandler QGPFluidHandler = new FluidTanksHandler(QGPFluidMapSize, 128000); + + List> itemEntryList = new ArrayList<>(exoticModulePlasmaItemMap.entrySet()); + List> fluidEntryList = new ArrayList<>(exoticModulePlasmaFluidMap.entrySet()); + + int slotYQGP = 0; + + for (int i = 0; i < QGPItemMapSize + QGPFluidMapSize; i++) { + + int slotXQGP = 6 + i % 16 * 18; + slotYQGP = 17 + i / 16 * 18; + + if (i < QGPItemMapSize) { + QGPItemHandler.setStackInSlot( + i, + GTUtility.copyAmount( + 1, + itemEntryList.get(i) + .getKey())); + builder.widget( + new DrawableWidget().setDrawable(GTUITextures.BUTTON_STANDARD_PRESSED) + .setPos(slotXQGP, slotYQGP) + .setSize(18, 18)); + builder.widget( + new SlotWidget(QGPItemHandler, i).setAccess(false, false) + .setRenderStackSize(false) + .disableInteraction() + .setPos(slotXQGP, slotYQGP) + .setSize(18, 18)); + } else { + QGPFluidHandler.setFluidInTank( + i - QGPItemMapSize, + fluidEntryList.get(i - QGPItemMapSize) + .getKey() + .getFluid(), + 1); + builder.widget( + new DrawableWidget().setDrawable(ModularUITextures.FLUID_SLOT) + .setSize(18, 18) + .setPos(slotXQGP, slotYQGP)) + .widget( + new FluidSlotWidget(QGPFluidHandler, i - QGPItemMapSize).setInteraction(false, false) + .setSize(18, 18) + .setPos(slotXQGP, slotYQGP)); + } + } + + int magMatterItemMapSize = exoticModuleMagmatterItemMap.size(); + + IItemHandlerModifiable magMatterItemHandler = new ItemStackHandler(magMatterItemMapSize); + IFluidTanksHandler magMatterFluidHandler = new FluidTanksHandler(2, 128000); + magMatterFluidHandler.setFluidInTank( + 0, + MaterialsUEVplus.Space.getMolten(1) + .getFluid(), + 1); + magMatterFluidHandler.setFluidInTank( + 1, + MaterialsUEVplus.Time.getMolten(1) + .getFluid(), + 1); + + List> magMatteritemEntryList = new ArrayList<>( + exoticModuleMagmatterItemMap.entrySet()); + + int slotXMagmatter; + int slotYMagmatter; + + for (int i = 0; i < magMatterItemMapSize + 2; i++) { + slotXMagmatter = 6 + i % 16 * 18; + slotYMagmatter = slotYQGP + 30 + i / 16 * 18; + + if (i < magMatterItemMapSize) { + magMatterItemHandler.setStackInSlot( + i, + GTUtility.copyAmount( + 1, + magMatteritemEntryList.get(i) + .getKey())); + builder.widget( + new DrawableWidget().setDrawable(GTUITextures.BUTTON_STANDARD_PRESSED) + .setPos(slotXMagmatter, slotYMagmatter) + .setSize(18, 18)); + builder.widget( + new SlotWidget(magMatterItemHandler, i).setAccess(false, false) + .setRenderStackSize(false) + .disableInteraction() + .setPos(slotXMagmatter, slotYMagmatter) + .setSize(18, 18)); + } else { + builder.widget( + new DrawableWidget().setDrawable(ModularUITextures.FLUID_SLOT) + .setSize(18, 18) + .setPos(slotXMagmatter, slotYMagmatter)) + .widget( + new FluidSlotWidget(magMatterFluidHandler, i - magMatterItemMapSize) + .setInteraction(false, false) + .setSize(18, 18) + .setPos(slotXMagmatter, slotYMagmatter)); + } + } + + builder.widget( + new TextWidget(translateToLocal("gt.blockmachines.multimachine.FOG.possibleinputsqgp")) + .setDefaultColor(EnumChatFormatting.BLACK) + .setTextAlignment(Alignment.Center) + .setSize(300, 9) + .setPos(0, 6)); + + builder.widget( + new TextWidget(translateToLocal("gt.blockmachines.multimachine.FOG.possibleinputsmagmatter")) + .setDefaultColor(EnumChatFormatting.BLACK) + .setTextAlignment(Alignment.Center) + .setSize(300, 9) + .setPos(0, slotYQGP + 21)); + + return builder.build(); + } + + private Widget createPossibleInputsButton() { + return new ButtonWidget().setOnClick((clickData, widget) -> { + if (!widget.isClient()) { + widget.getContext() + .openSyncedWindow(POSSIBLE_INPUTS_WINDOW_ID); + } + }) + .setPlayClickSound(true) + .setBackground(ModularUITextures.ICON_INFO) + .addTooltip(translateToLocal("fog.button.possibleexoticinputs.tooltip")) + .setTooltipShowUpDelay(TOOLTIP_DELAY) + .setSize(16, 16) + .setPos(79, 37); + } + protected ButtonWidget createMagmatterSwitch(IWidgetBuilder builder) { Widget button = new ButtonWidget().setOnClick((clickData, widget) -> { if (isMagmatterCapable) { diff --git a/src/main/java/tectech/thing/metaTileEntity/multi/godforge/MTEForgeOfGods.java b/src/main/java/tectech/thing/metaTileEntity/multi/godforge/MTEForgeOfGods.java index c7d52215c9..a5f833d830 100644 --- a/src/main/java/tectech/thing/metaTileEntity/multi/godforge/MTEForgeOfGods.java +++ b/src/main/java/tectech/thing/metaTileEntity/multi/godforge/MTEForgeOfGods.java @@ -1,6 +1,9 @@ package tectech.thing.metaTileEntity.multi.godforge; import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock; +import static gregtech.api.enums.HatchElement.InputBus; +import static gregtech.api.enums.HatchElement.InputHatch; +import static gregtech.api.enums.HatchElement.OutputBus; import static gregtech.api.enums.Mods.Avaritia; import static gregtech.api.metatileentity.BaseTileEntity.TOOLTIP_DELAY; import static gregtech.api.util.GTModHandler.getModItem; @@ -11,21 +14,20 @@ 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 static tectech.loader.recipe.Godforge.godforgeUpgradeMats; import static tectech.thing.casing.TTCasingsContainer.GodforgeCasings; import static tectech.thing.casing.TTCasingsContainer.forgeOfGodsRenderBlock; -import static tectech.util.GodforgeMath.allowModuleConnection; -import static tectech.util.GodforgeMath.calculateEnergyDiscountForModules; -import static tectech.util.GodforgeMath.calculateFuelConsumption; -import static tectech.util.GodforgeMath.calculateMaxFuelFactor; -import static tectech.util.GodforgeMath.calculateMaxHeatForModules; -import static tectech.util.GodforgeMath.calculateMaxParallelForModules; -import static tectech.util.GodforgeMath.calculateProcessingVoltageForModules; -import static tectech.util.GodforgeMath.calculateSpeedBonusForModules; -import static tectech.util.GodforgeMath.calculateStartupFuelConsumption; -import static tectech.util.GodforgeMath.queryMilestoneStats; -import static tectech.util.GodforgeMath.setMiscModuleParameters; -import static tectech.util.TTUtility.toExponentForm; +import static tectech.thing.metaTileEntity.multi.godforge.upgrade.ForgeOfGodsUpgrade.*; +import static tectech.thing.metaTileEntity.multi.godforge.util.GodforgeMath.allowModuleConnection; +import static tectech.thing.metaTileEntity.multi.godforge.util.GodforgeMath.calculateEnergyDiscountForModules; +import static tectech.thing.metaTileEntity.multi.godforge.util.GodforgeMath.calculateFuelConsumption; +import static tectech.thing.metaTileEntity.multi.godforge.util.GodforgeMath.calculateMaxFuelFactor; +import static tectech.thing.metaTileEntity.multi.godforge.util.GodforgeMath.calculateMaxHeatForModules; +import static tectech.thing.metaTileEntity.multi.godforge.util.GodforgeMath.calculateMaxParallelForModules; +import static tectech.thing.metaTileEntity.multi.godforge.util.GodforgeMath.calculateProcessingVoltageForModules; +import static tectech.thing.metaTileEntity.multi.godforge.util.GodforgeMath.calculateSpeedBonusForModules; +import static tectech.thing.metaTileEntity.multi.godforge.util.GodforgeMath.calculateStartupFuelConsumption; +import static tectech.thing.metaTileEntity.multi.godforge.util.GodforgeMath.queryMilestoneStats; +import static tectech.thing.metaTileEntity.multi.godforge.util.GodforgeMath.setMiscModuleParameters; import java.awt.Desktop; import java.awt.Toolkit; @@ -36,7 +38,6 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; -import java.util.Objects; import java.util.function.Function; import javax.annotation.Nullable; @@ -46,8 +47,9 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.network.PacketBuffer; import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ChatComponentText; +import net.minecraft.util.ChunkCoordinates; import net.minecraft.util.EnumChatFormatting; import net.minecraft.util.MathHelper; import net.minecraftforge.common.util.ForgeDirection; @@ -55,7 +57,6 @@ import net.minecraftforge.fluids.FluidStack; import com.google.common.collect.ImmutableList; import com.google.common.math.LongMath; -import com.google.common.primitives.Booleans; import com.gtnewhorizon.structurelib.alignment.constructable.IConstructable; import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable; import com.gtnewhorizon.structurelib.structure.IStructureDefinition; @@ -65,22 +66,17 @@ 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.drawable.shapes.Rectangle; -import com.gtnewhorizons.modularui.api.forge.IItemHandlerModifiable; 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.ModularUIContext; 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.DynamicPositionedRow; import com.gtnewhorizons.modularui.common.widget.DynamicTextWidget; import com.gtnewhorizons.modularui.common.widget.FakeSyncWidget; import com.gtnewhorizons.modularui.common.widget.FluidNameHolderWidget; @@ -88,7 +84,6 @@ 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.SlotWidget; import com.gtnewhorizons.modularui.common.widget.TextWidget; import com.gtnewhorizons.modularui.common.widget.textfield.NumericWidget; import com.gtnewhorizons.modularui.common.widget.textfield.TextFieldWidget; @@ -109,6 +104,7 @@ import gregtech.api.interfaces.metatileentity.IMetaTileEntity; import gregtech.api.interfaces.tileentity.IGregTechTileEntity; import gregtech.api.metatileentity.implementations.MTEHatchInput; import gregtech.api.metatileentity.implementations.MTEHatchInputBus; +import gregtech.api.recipe.RecipeMap; import gregtech.api.render.TextureFactory; import gregtech.api.util.GTOreDictUnificator; import gregtech.api.util.HatchElementBuilder; @@ -118,57 +114,80 @@ import gregtech.common.tileentities.machines.MTEHatchInputBusME; import gregtech.common.tileentities.machines.MTEHatchOutputBusME; import tectech.TecTech; import tectech.loader.ConfigHandler; +import tectech.recipe.TecTechRecipeMaps; import tectech.thing.block.BlockGodforgeGlass; import tectech.thing.block.TileEntityForgeOfGods; import tectech.thing.gui.TecTechUITextures; import tectech.thing.metaTileEntity.multi.base.TTMultiblockBase; -import tectech.thing.metaTileEntity.multi.godforge.ForgeOfGodsUI.StarColorRGBM; import tectech.thing.metaTileEntity.multi.godforge.color.ForgeOfGodsStarColor; import tectech.thing.metaTileEntity.multi.godforge.color.StarColorSetting; import tectech.thing.metaTileEntity.multi.godforge.color.StarColorStorage; +import tectech.thing.metaTileEntity.multi.godforge.structure.ForgeOfGodsRingsStructureString; +import tectech.thing.metaTileEntity.multi.godforge.structure.ForgeOfGodsStructureString; +import tectech.thing.metaTileEntity.multi.godforge.upgrade.ForgeOfGodsUpgrade; +import tectech.thing.metaTileEntity.multi.godforge.upgrade.UpgradeStorage; +import tectech.thing.metaTileEntity.multi.godforge.util.ForgeOfGodsUI; +import tectech.thing.metaTileEntity.multi.godforge.util.ForgeOfGodsUI.StarColorRGBM; +import tectech.thing.metaTileEntity.multi.godforge.util.MilestoneFormatter; +import tectech.thing.metaTileEntity.multi.godforge.util.MilestoneIcon; +import tectech.thing.metaTileEntity.multi.godforge.util.UpgradeColor; public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable, ISurvivalConstructable { + // Field default values for non-zero value defaults for item NBT checks + private static final int DEFAULT_FUEL_CONSUMPTION_FACTOR = 1; + private static final int DEFAULT_MAX_BATTERY_CHARGE = 100; + private static final int DEFAULT_RING_AMOUNT = 1; + private static final int DEFAULT_ROTATION_SPEED = 5; + private static final int DEFAULT_STAR_SIZE = 20; + private static final String DEFAULT_STAR_COLOR = ForgeOfGodsStarColor.DEFAULT.getName(); + private static final MilestoneFormatter DEFAULT_FORMATTING_MODE = MilestoneFormatter.COMMA; + private static final BigInteger DEFAULT_TOTAL_POWER = BigInteger.ZERO; + private static Textures.BlockIcons.CustomIcon ScreenON; - private int fuelConsumptionFactor = 1; - private int selectedFuelType = 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; - private boolean gravitonShardEjection = false; - private FormattingMode formattingMode = FormattingMode.NONE; - private boolean isRenderActive = false; - private boolean secretUpgrade = false; + private int fuelConsumptionFactor = DEFAULT_FUEL_CONSUMPTION_FACTOR; + private int selectedFuelType; + private int internalBattery; + private int maxBatteryCharge = DEFAULT_MAX_BATTERY_CHARGE; + private int gravitonShardsAvailable; + private int gravitonShardsSpent; + private int ringAmount = DEFAULT_RING_AMOUNT; + private int stellarFuelAmount; + private int neededStartupFuel; + private long fuelConsumption; + private long totalRecipesProcessed; + private long totalFuelConsumed; + private float totalExtensionsBuilt; + private float powerMilestonePercentage; + private float recipeMilestonePercentage; + private float fuelMilestonePercentage; + private float structureMilestonePercentage; + private float invertedPowerMilestonePercentage; + private float invertedRecipeMilestonePercentage; + private float invertedFuelMilestonePercentage; + private float invertedStructureMilestonePercentage; + private BigInteger totalPowerConsumed = DEFAULT_TOTAL_POWER; + private boolean batteryCharging; + private boolean inversion; + private boolean gravitonShardEjection; + private MilestoneFormatter formattingMode = DEFAULT_FORMATTING_MODE; + private boolean isRenderActive; + private boolean secretUpgrade; + private boolean isRendererDisabled; private final ItemStack[] storedUpgradeWindowItems = new ItemStack[16]; public ArrayList moduleHatches = new ArrayList<>(); protected ItemStackHandler inputSlotHandler = new ItemStackHandler(16); + private final UpgradeStorage upgrades = new UpgradeStorage(); + private ForgeOfGodsUpgrade currentUpgradeWindow; + // Star cosmetics fields // actual star cosmetics private final StarColorStorage starColors = new StarColorStorage(); - private String selectedStarColor = ForgeOfGodsStarColor.DEFAULT.getName(); - private int rotationSpeed = 5; - private int starSize = 20; + private String selectedStarColor = DEFAULT_STAR_COLOR; + private int rotationSpeed = DEFAULT_ROTATION_SPEED; + private int starSize = DEFAULT_STAR_SIZE; // editing star color private ForgeOfGodsStarColor newStarColor = starColors.newTemplateColor(); private int starColorR, starColorG, starColorB; @@ -189,9 +208,8 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable, private static final int STAR_COSMETICS_WINDOW_ID = 18; private static final int STAR_CUSTOM_COLOR_WINDOW_ID = 19; private static final int STAR_CUSTOM_COLOR_IMPORT_WINDOW_ID = 20; + private static final int STATISTICS_WINDOW_ID = 21; private static final int TEXTURE_INDEX = 960; - private static final int[] FIRST_SPLIT_UPGRADES = new int[] { 12, 13, 14 }; - private static final Integer[] UPGRADE_MATERIAL_ID_CONVERSION = { 0, 5, 7, 11, 26, 29, 30 }; 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; @@ -307,7 +325,13 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable, .addShape(STRUCTURE_PIECE_SECOND_RING_AIR, ForgeOfGodsRingsStructureString.SECOND_RING_AIR) .addShape(STRUCTURE_PIECE_THIRD_RING, ForgeOfGodsRingsStructureString.THIRD_RING) .addShape(STRUCTURE_PIECE_THIRD_RING_AIR, ForgeOfGodsRingsStructureString.THIRD_RING_AIR) - .addElement('A', classicHatches(TEXTURE_INDEX + 3, 1, GodforgeCasings, 3)) + .addElement( + 'A', + HatchElementBuilder.builder() + .atLeast(InputBus, InputHatch, OutputBus) + .casingIndex(TEXTURE_INDEX + 3) + .dot(1) + .buildAndChain(GodforgeCasings, 3)) .addElement('B', ofBlock(GodforgeCasings, 0)) .addElement('C', ofBlock(GodforgeCasings, 1)) .addElement('D', ofBlock(GodforgeCasings, 2)) @@ -400,7 +424,7 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable, return false; } - if (internalBattery != 0 && !isRenderActive) { + if (internalBattery != 0 && !isRenderActive && !isRendererDisabled) { createRenderer(); } // Check there is 1 input bus @@ -434,7 +458,7 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable, return false; } - if (isUpgradeActive(26)) { + if (isUpgradeActive(CD)) { if (checkPiece(STRUCTURE_PIECE_SECOND_RING, 55, 11, -67)) { ringAmount = 2; destroySecondRing(); @@ -454,7 +478,7 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable, } } - if (isUpgradeActive(29)) { + if (isUpgradeActive(EE)) { if (checkPiece(STRUCTURE_PIECE_THIRD_RING, 47, 13, -76)) { ringAmount = 3; destroyThirdRing(); @@ -487,21 +511,19 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable, startRecipeProcessing(); int maxModuleCount = 8; - if (upgrades[26]) { + if (isUpgradeActive(CD)) { maxModuleCount += 4; } - if (upgrades[29]) { + if (isUpgradeActive(EE)) { maxModuleCount += 4; } - boolean isFinalUpgradeUnlocked = upgrades[30]; - if (!mInputBusses.isEmpty()) { - if (internalBattery == 0 || isFinalUpgradeUnlocked) { + if (internalBattery == 0 || isUpgradeActive(END)) { MTEHatchInputBus inputBus = mInputBusses.get(0); ItemStack[] inputBusInventory = inputBus.getRealInventory(); ItemStack itemToAbsorb = STELLAR_FUEL; - if (isFinalUpgradeUnlocked && internalBattery != 0) { + if (isUpgradeActive(END) && internalBattery != 0) { itemToAbsorb = GTOreDictUnificator.get(OrePrefixes.gem, MaterialsUEVplus.GravitonShard, 1); } if (inputBusInventory != null) { @@ -531,7 +553,7 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable, if (stellarFuelAmount >= neededStartupFuel) { stellarFuelAmount -= neededStartupFuel; increaseBattery(neededStartupFuel); - createRenderer(); + if (!isRendererDisabled) createRenderer(); } } } @@ -547,7 +569,7 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable, if (!ConfigHandler.debug.DEBUG_MODE) { determineGravitonShardAmount(); } - if (upgrades[30] && gravitonShardEjection) { + if (isUpgradeActive(END) && gravitonShardEjection) { ejectGravitonShards(); } @@ -562,7 +584,7 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable, calculateEnergyDiscountForModules(module, this); setMiscModuleParameters(module, this); queryMilestoneStats(module, this); - if (!upgrades[28]) { + if (!isUpgradeActive(TBF)) { calculateProcessingVoltageForModules(module, this); } } else { @@ -651,19 +673,10 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable, } private TileEntityForgeOfGods getRenderer() { - IGregTechTileEntity gregTechTileEntity = this.getBaseMetaTileEntity(); - - int x = gregTechTileEntity.getXCoord(); - int y = gregTechTileEntity.getYCoord(); - int z = gregTechTileEntity.getZCoord(); - - double xOffset = 122 * getExtendedFacing().getRelativeBackInWorld().offsetX; - double zOffset = 122 * getExtendedFacing().getRelativeBackInWorld().offsetZ; - double yOffset = 122 * getExtendedFacing().getRelativeBackInWorld().offsetY; - + ChunkCoordinates renderPos = getRenderPos(); TileEntity tile = this.getBaseMetaTileEntity() .getWorld() - .getTileEntity((int) (x + xOffset), (int) (y + yOffset), (int) (z + zOffset)); + .getTileEntity(renderPos.posX, renderPos.posY, renderPos.posZ); if (tile instanceof TileEntityForgeOfGods forgeTile) { return forgeTile; @@ -684,26 +697,17 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable, } private void createRenderer() { - - IGregTechTileEntity gregTechTileEntity = this.getBaseMetaTileEntity(); - - int x = gregTechTileEntity.getXCoord(); - int y = gregTechTileEntity.getYCoord(); - int z = gregTechTileEntity.getZCoord(); - - double xOffset = 122 * getExtendedFacing().getRelativeBackInWorld().offsetX; - double zOffset = 122 * getExtendedFacing().getRelativeBackInWorld().offsetZ; - double yOffset = 122 * getExtendedFacing().getRelativeBackInWorld().offsetY; + ChunkCoordinates renderPos = getRenderPos(); this.getBaseMetaTileEntity() .getWorld() - .setBlock((int) (x + xOffset), (int) (y + yOffset), (int) (z + zOffset), Blocks.air); + .setBlock(renderPos.posX, renderPos.posY, renderPos.posZ, Blocks.air); this.getBaseMetaTileEntity() .getWorld() - .setBlock((int) (x + xOffset), (int) (y + yOffset), (int) (z + zOffset), forgeOfGodsRenderBlock); + .setBlock(renderPos.posX, renderPos.posY, renderPos.posZ, forgeOfGodsRenderBlock); TileEntityForgeOfGods rendererTileEntity = (TileEntityForgeOfGods) this.getBaseMetaTileEntity() .getWorld() - .getTileEntity((int) (x + xOffset), (int) (y + yOffset), (int) (z + zOffset)); + .getTileEntity(renderPos.posX, renderPos.posY, renderPos.posZ); switch (ringAmount) { case 2 -> { @@ -715,9 +719,7 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable, destroySecondRing(); destroyThirdRing(); } - default -> { - destroyFirstRing(); - } + default -> destroyFirstRing(); } rendererTileEntity.setRenderRotation(getRotation(), getDirection()); @@ -727,20 +729,10 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable, } private void destroyRenderer() { - - IGregTechTileEntity gregTechTileEntity = this.getBaseMetaTileEntity(); - - int x = gregTechTileEntity.getXCoord(); - int y = gregTechTileEntity.getYCoord(); - int z = gregTechTileEntity.getZCoord(); - - double xOffset = 122 * getExtendedFacing().getRelativeBackInWorld().offsetX; - double zOffset = 122 * getExtendedFacing().getRelativeBackInWorld().offsetZ; - double yOffset = 122 * getExtendedFacing().getRelativeBackInWorld().offsetY; - + ChunkCoordinates renderPos = getRenderPos(); this.getBaseMetaTileEntity() .getWorld() - .setBlock((int) (x + xOffset), (int) (y + yOffset), (int) (z + zOffset), Blocks.air); + .setBlock(renderPos.posX, renderPos.posY, renderPos.posZ, Blocks.air); switch (ringAmount) { case 2 -> { @@ -752,14 +744,23 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable, buildSecondRing(); buildThirdRing(); } - default -> { - buildFirstRing(); - } + default -> buildFirstRing(); } isRenderActive = false; } + private ChunkCoordinates getRenderPos() { + IGregTechTileEntity gregTechTileEntity = this.getBaseMetaTileEntity(); + int x = gregTechTileEntity.getXCoord(); + int y = gregTechTileEntity.getYCoord(); + int z = gregTechTileEntity.getZCoord(); + double xOffset = 122 * getExtendedFacing().getRelativeBackInWorld().offsetX; + double yOffset = 122 * getExtendedFacing().getRelativeBackInWorld().offsetY; + double zOffset = 122 * getExtendedFacing().getRelativeBackInWorld().offsetZ; + return new ChunkCoordinates((int) (x + xOffset), (int) (y + yOffset), (int) (z + zOffset)); + } + private void destroyFirstRing() { buildPiece(STRUCTURE_PIECE_FIRST_RING_AIR, null, false, 63, 14, -59); } @@ -786,15 +787,15 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable, @Override public final void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) { - if (!ConfigHandler.debug.DEBUG_MODE) return; - if (isRenderActive) { - destroyRenderer(); - isRenderActive = false; + if (isRendererDisabled) { + isRendererDisabled = false; + // let the renderer automatically rebuild itself as needed through normal logic } else { - ringAmount = 3; - createRenderer(); - isRenderActive = true; + isRendererDisabled = true; + if (isRenderActive) destroyRenderer(); } + aPlayer.addChatMessage( + new ChatComponentText("Animations are now " + (isRendererDisabled ? "disabled" : "enabled") + ".")); } @Override @@ -840,6 +841,7 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable, buildContext.addSyncedWindow(STAR_COSMETICS_WINDOW_ID, this::createStarCosmeticsWindow); buildContext.addSyncedWindow(STAR_CUSTOM_COLOR_WINDOW_ID, this::createStarCustomColorWindow); buildContext.addSyncedWindow(STAR_CUSTOM_COLOR_IMPORT_WINDOW_ID, this::createStarColorImportWindow); + buildContext.addSyncedWindow(STATISTICS_WINDOW_ID, this::createStatisticsWindow); builder.widget( new DrawableWidget().setDrawable(TecTechUITextures.BACKGROUND_SCREEN_BLUE) @@ -858,7 +860,7 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable, button.add(TecTechUITextures.OVERLAY_BUTTON_ARROW_BLUE_UP); return button.toArray(new IDrawable[0]); }) - .addTooltip("Path of Celestial Transcendence") + .addTooltip(translateToLocal("fog.button.upgradetree.tooltip")) .setPos(174, 167) .setTooltipShowUpDelay(TOOLTIP_DELAY)) .widget( @@ -882,11 +884,15 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable, .setPos(174, 110) .setTooltipShowUpDelay(TOOLTIP_DELAY)) .widget( - TextWidget.dynamicText(this::storedFuel) + TextWidget.dynamicText(this::storedFuelHeaderText) .setDefaultColor(EnumChatFormatting.WHITE) .setPos(6, 8) - .setSize(74, 34)) - .widget(createPowerSwitchButton()) + .setSize(185, 10)) + .widget( + TextWidget.dynamicText(this::storedFuel) + .setDefaultColor(EnumChatFormatting.WHITE) + .setPos(6, 20) + .setSize(185, 10)) .widget(createBatteryButton(builder)) .widget(createEjectionSwitch(builder)) .widget(new FakeSyncWidget.BooleanSyncer(() -> getBaseMetaTileEntity().isAllowedToWork(), val -> { @@ -955,7 +961,6 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable, if (!widget.isClient()) widget.getContext() .openSyncedWindow(STAR_COSMETICS_WINDOW_ID); }) - .setSize(16, 16) .addTooltip(translateToLocal("fog.button.color.tooltip")) .setBackground(() -> { List button = new ArrayList<>(); @@ -963,8 +968,25 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable, button.add(TecTechUITextures.OVERLAY_BUTTON_RAINBOW_SPIRAL); return button.toArray(new IDrawable[0]); }) - .setPos(152, 91) - .setTooltipShowUpDelay(TOOLTIP_DELAY)); + .setPos(174, 148) + .setSize(16, 16) + .setTooltipShowUpDelay(TOOLTIP_DELAY)) + .widget(new ButtonWidget().setOnClick((clickData, widget) -> { + if (!widget.isClient()) { + widget.getContext() + .openSyncedWindow(STATISTICS_WINDOW_ID); + } + }) + .addTooltip(translateToLocal("fog.button.statistics.tooltip")) + .setBackground(() -> { + List button = new ArrayList<>(); + button.add(TecTechUITextures.BUTTON_CELESTIAL_32x32); + button.add(TecTechUITextures.OVERLAY_BUTTON_STATISTICS); + return button.toArray(new IDrawable[0]); + }) + .setPos(26, 91) + .setSize(16, 16) + .setTooltipShowUpDelay(TOOLTIP_DELAY)); } @Override @@ -975,42 +997,24 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable, .setPos(172, 67)); } - @Override - protected ButtonWidget createPowerSwitchButton() { - return ForgeOfGodsUI.createPowerSwitchButton(getBaseMetaTileEntity()); - } - protected ButtonWidget createEjectionSwitch(IWidgetBuilder builder) { Widget button = new ButtonWidget().setOnClick((clickData, widget) -> { - if (upgrades[30]) { - gravitonShardEjection = !gravitonShardEjection; - } + TecTech.proxy.playSound(getBaseMetaTileEntity(), "fx_click"); + gravitonShardEjection = !gravitonShardEjection; }) - .setPlayClickSound(upgrades[30]) - .setBackground(() -> { - List ret = new ArrayList<>(); - if (!upgrades[30]) { - return ret.toArray(new IDrawable[0]); - } - if (gravitonShardEjection) { - ret.add(TecTechUITextures.BUTTON_CELESTIAL_32x32); - ret.add(TecTechUITextures.OVERLAY_EJECTION_ON); - } else { - ret.add(TecTechUITextures.BUTTON_CELESTIAL_32x32); - ret.add(TecTechUITextures.OVERLAY_EJECTION_LOCKED); - } - return ret.toArray(new IDrawable[0]); - }) + .setBackground( + () -> new UITexture[] { TecTechUITextures.BUTTON_CELESTIAL_32x32, + gravitonShardEjection ? TecTechUITextures.OVERLAY_EJECTION_ON + : TecTechUITextures.OVERLAY_EJECTION_LOCKED }) + .addTooltip(translateToLocal("fog.button.ejection.tooltip")) + .setTooltipShowUpDelay(TOOLTIP_DELAY) .attachSyncer( new FakeSyncWidget.BooleanSyncer(() -> gravitonShardEjection, val -> gravitonShardEjection = val), builder) - .setPos(26, 91) + .setPos(44, 91) .setSize(16, 16) - .attachSyncer(new FakeSyncWidget.BooleanSyncer(() -> upgrades[30], val -> upgrades[30] = val), builder); - if (upgrades[30]) { - button.addTooltip(translateToLocal("fog.button.ejection.tooltip")); - button.setTooltipShowUpDelay(TOOLTIP_DELAY); - } + .setEnabled($ -> isUpgradeActive(END)) + .attachSyncer(upgrades.getSyncer(END), builder); return (ButtonWidget) button; } @@ -1019,7 +1023,7 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable, TecTech.proxy.playSound(getBaseMetaTileEntity(), "fx_click"); if (clickData.mouseButton == 0) { batteryCharging = !batteryCharging; - } else if (clickData.mouseButton == 1 && !widget.isClient() && upgrades[8]) { + } else if (clickData.mouseButton == 1 && !widget.isClient() && isUpgradeActive(REC)) { widget.getContext() .openSyncedWindow(BATTERY_CONFIG_WINDOW_ID); } @@ -1080,53 +1084,63 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable, } protected ModularWindow createFuelConfigWindow(final EntityPlayer player) { - final int WIDTH = 78; - final int HEIGHT = 130; - final int PARENT_WIDTH = getGUIWidth(); - final int PARENT_HEIGHT = getGUIHeight(); - ModularWindow.Builder builder = ModularWindow.builder(WIDTH, HEIGHT); + final int w = 78; + final int h = 130; + final int parentW = getGUIWidth(); + final int parentH = getGUIHeight(); + + ModularWindow.Builder builder = ModularWindow.builder(w, h); builder.setBackground(GTUITextures.BACKGROUND_SINGLEBLOCK_DEFAULT); builder.setGuiTint(getGUIColorization()); builder.setDraggable(true); builder.setPos( - (size, window) -> Alignment.Center.getAlignedPos(size, new Size(PARENT_WIDTH, PARENT_HEIGHT)) + (size, window) -> Alignment.Center.getAlignedPos(size, new Size(parentW, parentH)) .add( - Alignment.TopRight.getAlignedPos(new Size(PARENT_WIDTH, PARENT_HEIGHT), new Size(WIDTH, HEIGHT)) - .add(WIDTH - 3, 0))); + Alignment.TopRight.getAlignedPos(new Size(parentW, parentH), new Size(w, h)) + .add(w - 3, 0))); + + // Window header builder.widget( TextWidget.localised("gt.blockmachines.multimachine.FOG.fuelconsumption") .setPos(3, 2) - .setSize(74, 34)) - .widget( - 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(4, 35) - .setBackground(GTUITextures.BACKGROUND_TEXT_FIELD) - .attachSyncer( - new FakeSyncWidget.ListSyncer<>( - () -> Booleans.asList(upgrades), - val -> upgrades = Booleans.toArray(val), - PacketBuffer::writeBoolean, - PacketBuffer::readBoolean), - builder, - (widget, val) -> ((NumericWidget) widget).setMaxValue(calculateMaxFuelFactor(this)))) - .widget( - 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.5")) - .setTooltipShowUpDelay(TOOLTIP_DELAY)) + .setSize(74, 34)); + + // Fuel factor textbox + NumericWidget fuelFactor = new NumericWidget(); + fuelFactor.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(4, 35) + .setBackground(GTUITextures.BACKGROUND_TEXT_FIELD); + builder.widget(fuelFactor); + + // Syncers for max fuel factor + builder.widget( + upgrades.getSyncer(CFCE) + .setOnClientUpdate($ -> fuelFactor.setMaxValue(calculateMaxFuelFactor(this)))); + builder.widget( + upgrades.getSyncer(GEM) + .setOnClientUpdate($ -> fuelFactor.setMaxValue(calculateMaxFuelFactor(this)))); + builder.widget( + upgrades.getSyncer(TSE) + .setOnClientUpdate($ -> fuelFactor.setMaxValue(calculateMaxFuelFactor(this)))); + + builder.widget( + 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.5")) + .setTooltipShowUpDelay(TOOLTIP_DELAY)) .widget( TextWidget.localised("gt.blockmachines.multimachine.FOG.fueltype") .setPos(3, 57) @@ -1204,8 +1218,7 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable, }) .setSize(18, 18)) .setPos(29, 82) - .setSize(18, 18) - .attachSyncer(new FakeSyncWidget.IntegerSyncer(this::getFuelType, this::setFuelType), builder)) + .setSize(18, 18)) .widget( new MultiChildWidget().addChild( new FluidNameHolderWidget( @@ -1354,8 +1367,7 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable, if (!widget.isClient()) { widget.getWindow() .closeWindow(); - widget.getContext() - .closeWindow(INDIVIDUAL_MILESTONE_WINDOW_ID); + ForgeOfGodsUI.closeWindow(widget, INDIVIDUAL_MILESTONE_WINDOW_ID); } }) .setPos(382, 6)); @@ -1363,52 +1375,24 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable, } 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"; - } - } + final int w = 150; + final int h = 150; + final MilestoneIcon icon = MilestoneIcon.VALUES[currentMilestoneID]; + final Size iconSize = icon.getSize(); + ModularWindow.Builder builder = ModularWindow.builder(w, h); 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)) + new DrawableWidget().setDrawable(icon.getSymbol()) + .setSize(iconSize) + .setPos((w - iconSize.width) / 2, (h - iconSize.height) / 2)) .widget( - TextWidget.localised("gt.blockmachines.multimachine.FOG." + milestoneType + "milestone") - .setDefaultColor(EnumChatFormatting.GOLD) + new TextWidget(icon.getNameText()).setDefaultColor(EnumChatFormatting.GOLD) .setTextAlignment(Alignment.Center) .setPos(0, 8) .setSize(150, 15)) @@ -1459,8 +1443,8 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable, .attachSyncer( new FakeSyncWidget.ByteSyncer( () -> (byte) formattingMode.ordinal(), - val -> formattingMode = FormattingMode.VALUES[MathHelper - .clamp_int(val, 0, FormattingMode.VALUES.length - 1)]), + val -> formattingMode = MilestoneFormatter.VALUES[MathHelper + .clamp_int(val, 0, MilestoneFormatter.VALUES.length - 1)]), builder)); return builder.build(); @@ -1485,490 +1469,79 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable, .setTooltipShowUpDelay(TOOLTIP_DELAY); } - private int currentUpgradeID = 0; - private int currentColorCode = 0; - private int currentMilestoneBG = 0; - private int gravitonShardCost = 0; - private final int[][] prereqUpgrades = new int[31][]; - private int[] followupUpgrades = new int[] {}; - private boolean isUpradeSplitStart = false; - private boolean doesCurrentUpgradeRequireExtraMats = false; - private final boolean[] allPrereqRequired = new boolean[31]; - private boolean[] upgrades = new boolean[31]; - private boolean[] materialPaidUpgrades = new boolean[7]; - protected ModularWindow createUpgradeTreeWindow(final EntityPlayer player) { - final Scrollable scrollable = new Scrollable().setVerticalScroll(); - final int PARENT_WIDTH = 300; - final int PARENT_HEIGHT = 300; - ModularWindow.Builder builder = ModularWindow.builder(PARENT_WIDTH, PARENT_HEIGHT); - - scrollable.widget(createUpgradeConnectorLine(new Pos2d(143, 71), 45, 0, 0, 0, 1)) - .widget(createUpgradeConnectorLine(new Pos2d(124, 124), 60, 27, 0, 1, 2)) - .widget(createUpgradeConnectorLine(new Pos2d(162, 124), 60, 333, 0, 1, 3)) - .widget(createUpgradeConnectorLine(new Pos2d(94, 184), 60, 27, 0, 2, 4)) - .widget(createUpgradeConnectorLine(new Pos2d(130, 184), 60, 336, 0, 2, 5)) - .widget(createUpgradeConnectorLine(new Pos2d(156, 184), 60, 24, 0, 3, 5)) - .widget(createUpgradeConnectorLine(new Pos2d(192, 184), 60, 333, 0, 3, 6)) - .widget(createUpgradeConnectorLine(new Pos2d(143, 251), 45, 0, 0, 5, 7)) - .widget(createUpgradeConnectorLine(new Pos2d(143, 311), 45, 0, 0, 7, 9)) - .widget(createUpgradeConnectorLine(new Pos2d(78, 250), 110, 5, 4, 4, 8)) - .widget(createUpgradeConnectorLine(new Pos2d(110, 290), 80, 40, 4, 7, 8)) - .widget(createUpgradeConnectorLine(new Pos2d(208, 250), 110, 355, 4, 6, 10)) - .widget(createUpgradeConnectorLine(new Pos2d(176, 290), 80, 320, 4, 7, 10)) - .widget(createUpgradeConnectorLine(new Pos2d(100, 355), 80, 313, 0, 8, 11)) - .widget(createUpgradeConnectorLine(new Pos2d(186, 355), 80, 47, 0, 10, 11)) - .widget(createUpgradeConnectorLine(new Pos2d(143, 430), 48, 0, 2, 11, 13)) - .widget(createUpgradeConnectorLine(new Pos2d(143, 490), 48, 0, 2, 13, 18)) - .widget(createUpgradeConnectorLine(new Pos2d(143, 550), 48, 0, 2, 18, 21)) - .widget(createUpgradeConnectorLine(new Pos2d(143, 610), 48, 0, 2, 21, 23)) - .widget(createUpgradeConnectorLine(new Pos2d(110, 410), 80, 40, 1, 11, 12)) - .widget(createUpgradeConnectorLine(new Pos2d(83, 490), 48, 0, 1, 12, 17)) - .widget(createUpgradeConnectorLine(new Pos2d(83, 550), 48, 0, 1, 17, 20)) - .widget(createUpgradeConnectorLine(new Pos2d(101, 590), 80, 320, 1, 20, 23)) - .widget(createUpgradeConnectorLine(new Pos2d(53, 536), 35, 45, 1, 17, 16)) - .widget(createUpgradeConnectorLine(new Pos2d(176, 410), 80, 320, 3, 11, 14)) - .widget(createUpgradeConnectorLine(new Pos2d(203, 490), 48, 0, 3, 14, 19)) - .widget(createUpgradeConnectorLine(new Pos2d(203, 550), 48, 0, 3, 19, 22)) - .widget(createUpgradeConnectorLine(new Pos2d(185, 590), 80, 40, 3, 22, 23)) - .widget(createUpgradeConnectorLine(new Pos2d(233, 476), 35, 315, 3, 14, 15)) - .widget(createUpgradeConnectorLine(new Pos2d(143, 670), 48, 0, 0, 23, 24)) - .widget(createUpgradeConnectorLine(new Pos2d(101, 707), 75, 62.3f, 0, 24, 25)) - .widget(createUpgradeConnectorLine(new Pos2d(53, 772), 78, 0, 0, 25, 26)) - .widget(createUpgradeConnectorLine(new Pos2d(95, 837), 75, 297.7f, 0, 26, 27)) - .widget(createUpgradeConnectorLine(new Pos2d(191, 837), 75, 62.3f, 0, 27, 28)) - .widget(createUpgradeConnectorLine(new Pos2d(233, 772), 78, 0, 0, 28, 29)) - .widget(createUpgradeConnectorLine(new Pos2d(191, 747), 75, 62.3f, 0, 29, 30)); + ModularWindow.Builder builder = ModularWindow.builder(300, 300); + Scrollable scrollable = new Scrollable().setVerticalScroll(); + // spotless:off scrollable - .widget( - createUpgradeBox( - 0, - 0, - 3, - new int[] {}, - false, - new int[] { 1 }, - false, - true, - 0, - new Pos2d(126, 56), - scrollable)) - .widget( - createUpgradeBox( - 1, - 0, - 1, - new int[] { 0 }, - false, - new int[] { 2, 3 }, - false, - false, - 1, - new Pos2d(126, 116), - scrollable)) - .widget( - createUpgradeBox( - 2, - 0, - 2, - new int[] { 1 }, - false, - new int[] { 4, 5 }, - false, - false, - 1, - new Pos2d(96, 176), - scrollable)) - .widget( - createUpgradeBox( - 3, - 0, - 2, - new int[] { 1 }, - false, - new int[] { 5, 6 }, - false, - false, - 1, - new Pos2d(156, 176), - scrollable)) - .widget( - createUpgradeBox( - 4, - 0, - 0, - new int[] { 2 }, - false, - new int[] { 8 }, - false, - false, - 1, - new Pos2d(66, 236), - scrollable)) - .widget( - createUpgradeBox( - 5, - 0, - 3, - new int[] { 2, 3 }, - false, - new int[] { 7 }, - false, - true, - 1, - new Pos2d(126, 236), - scrollable)) - .widget( - createUpgradeBox( - 6, - 0, - 1, - new int[] { 3 }, - false, - new int[] { 10 }, - false, - false, - 1, - new Pos2d(186, 236), - scrollable)) - .widget( - createUpgradeBox( - 7, - 0, - 3, - new int[] { 5 }, - false, - new int[] { 8, 9, 10 }, - false, - true, - 2, - new Pos2d(126, 296), - scrollable)) - .widget( - createUpgradeBox( - 8, - 4, - 0, - new int[] { 4, 7 }, - true, - new int[] { 11 }, - false, - false, - 2, - new Pos2d(56, 356), - scrollable)) - .widget( - createUpgradeBox( - 9, - 0, - 2, - new int[] { 7 }, - false, - new int[] {}, - false, - false, - 2, - new Pos2d(126, 356), - scrollable)) - .widget( - createUpgradeBox( - 10, - 4, - 1, - new int[] { 6, 7 }, - true, - new int[] { 11 }, - false, - false, - 2, - new Pos2d(196, 356), - scrollable)) - .widget( - createUpgradeBox( - 11, - 0, - 3, - new int[] { 8, 10 }, - false, - new int[] { 12, 13, 14 }, - false, - true, - 2, - new Pos2d(126, 416), - scrollable)) - .widget( - createUpgradeBox( - 12, - 1, - 2, - new int[] { 11 }, - false, - new int[] { 17 }, - true, - false, - 3, - new Pos2d(66, 476), - scrollable)) - .widget( - createUpgradeBox( - 13, - 2, - 1, - new int[] { 11 }, - false, - new int[] { 18 }, - true, - false, - 3, - new Pos2d(126, 476), - scrollable)) - .widget( - createUpgradeBox( - 14, - 3, - 0, - new int[] { 11 }, - false, - new int[] { 15, 19 }, - true, - false, - 3, - new Pos2d(186, 476), - scrollable)) - .widget( - createUpgradeBox( - 15, - 3, - 1, - new int[] { 14 }, - false, - new int[] {}, - false, - false, - 4, - new Pos2d(246, 496), - scrollable)) - .widget( - createUpgradeBox( - 16, - 1, - 1, - new int[] { 17 }, - false, - new int[] {}, - false, - false, - 4, - new Pos2d(6, 556), - scrollable)) - .widget( - createUpgradeBox( - 17, - 1, - 0, - new int[] { 12 }, - false, - new int[] { 16, 20 }, - false, - false, - 3, - new Pos2d(66, 536), - scrollable)) - .widget( - createUpgradeBox( - 18, - 2, - 1, - new int[] { 13 }, - false, - new int[] { 21 }, - false, - false, - 3, - new Pos2d(126, 536), - scrollable)) - .widget( - createUpgradeBox( - 19, - 3, - 0, - new int[] { 14 }, - false, - new int[] { 22 }, - false, - false, - 3, - new Pos2d(186, 536), - scrollable)) - .widget( - createUpgradeBox( - 20, - 1, - 0, - new int[] { 17 }, - false, - new int[] { 23 }, - false, - false, - 3, - new Pos2d(66, 596), - scrollable)) - .widget( - createUpgradeBox( - 21, - 2, - 1, - new int[] { 18 }, - false, - new int[] { 23 }, - false, - false, - 3, - new Pos2d(126, 596), - scrollable)) - .widget( - createUpgradeBox( - 22, - 3, - 1, - new int[] { 19 }, - false, - new int[] { 23 }, - false, - false, - 3, - new Pos2d(186, 596), - scrollable)) - .widget( - createUpgradeBox( - 23, - 0, - 0, - new int[] { 20, 21, 22 }, - false, - new int[] { 24 }, - false, - false, - 4, - new Pos2d(126, 656), - scrollable)) - .widget( - createUpgradeBox( - 24, - 0, - 1, - new int[] { 23 }, - false, - new int[] { 25 }, - false, - false, - 5, - new Pos2d(126, 718), - scrollable)) - .widget( - createUpgradeBox( - 25, - 0, - 1, - new int[] { 24 }, - false, - new int[] { 26 }, - false, - false, - 6, - new Pos2d(36, 758), - scrollable)) - .widget( - createUpgradeBox( - 26, - 0, - 3, - new int[] { 25 }, - false, - new int[] { 27 }, - false, - true, - 7, - new Pos2d(36, 848), - scrollable)) - .widget( - createUpgradeBox( - 27, - 0, - 2, - new int[] { 26 }, - false, - new int[] { 28 }, - false, - false, - 8, - new Pos2d(126, 888), - scrollable)) - .widget( - createUpgradeBox( - 28, - 0, - 0, - new int[] { 27 }, - false, - new int[] { 29 }, - false, - false, - 9, - new Pos2d(216, 848), - scrollable)) - .widget( - createUpgradeBox( - 29, - 0, - 3, - new int[] { 28 }, - false, - new int[] { 30 }, - false, - true, - 10, - new Pos2d(216, 758), - scrollable)) - .widget( - createUpgradeBox( - 30, - 0, - 3, - new int[] { 29 }, - false, - new int[] {}, - false, - true, - 12, - new Pos2d(126, 798), - scrollable)) - .widget( - new MultiChildWidget().addChild( - new ButtonWidget().setOnClick(((clickData, widget) -> secretUpgrade = !secretUpgrade)) - .setSize(40, 15) - .setBackground(() -> { - if (secretUpgrade) { - return new IDrawable[] { TecTechUITextures.BUTTON_SPACE_PRESSED_32x16 }; - } - return new IDrawable[0]; - }) - .addTooltip(translateToLocal("fog.upgrade.tt.secret")) - .setTooltipShowUpDelay(20)) - .addChild( - new TextWidget(translateToLocal("fog.upgrade.tt.short.secret")).setScale(0.8f) - .setDefaultColor(EnumChatFormatting.GOLD) - .setTextAlignment(Alignment.Center) - .setSize(34, 9) - .setPos(3, 4) - .setEnabled((widget -> secretUpgrade))) - .addChild( - new DrawableWidget().setDrawable(TecTechUITextures.PICTURE_UPGRADE_CONNECTOR_BLUE_OPAQUE) - .setEnabled(widget -> secretUpgrade) - .setPos(40, 4) - .setSize(20, 6)) - .setPos(new Pos2d(66, 56))) + .widget(createUpgradeConnectorLine(new Pos2d(143, 71), 45, 0, UpgradeColor.BLUE, START, IGCC)) + .widget(createUpgradeConnectorLine(new Pos2d(124, 124), 60, 27, UpgradeColor.BLUE, IGCC, STEM)) + .widget(createUpgradeConnectorLine(new Pos2d(162, 124), 60, 333, UpgradeColor.BLUE, IGCC, CFCE)) + .widget(createUpgradeConnectorLine(new Pos2d(94, 184), 60, 27, UpgradeColor.BLUE, STEM, GISS)) + .widget(createUpgradeConnectorLine(new Pos2d(130, 184), 60, 336, UpgradeColor.BLUE, STEM, FDIM)) + .widget(createUpgradeConnectorLine(new Pos2d(156, 184), 60, 24, UpgradeColor.BLUE, CFCE, FDIM)) + .widget(createUpgradeConnectorLine(new Pos2d(192, 184), 60, 333, UpgradeColor.BLUE, CFCE, SA)) + .widget(createUpgradeConnectorLine(new Pos2d(143, 251), 45, 0, UpgradeColor.BLUE, FDIM, GPCI)) + .widget(createUpgradeConnectorLine(new Pos2d(143, 311), 45, 0, UpgradeColor.BLUE, GPCI, GEM)) + .widget(createUpgradeConnectorLine(new Pos2d(78, 250), 110, 5, UpgradeColor.RED, GISS, REC)) + .widget(createUpgradeConnectorLine(new Pos2d(110, 290), 80, 40, UpgradeColor.RED, GPCI, REC)) + .widget(createUpgradeConnectorLine(new Pos2d(208, 250), 110, 355, UpgradeColor.RED, SA, CTCDD)) + .widget(createUpgradeConnectorLine(new Pos2d(176, 290), 80, 320, UpgradeColor.RED, GPCI, CTCDD)) + .widget(createUpgradeConnectorLine(new Pos2d(100, 355), 80, 313, UpgradeColor.BLUE, REC, QGPIU)) + .widget(createUpgradeConnectorLine(new Pos2d(186, 355), 80, 47, UpgradeColor.BLUE, CTCDD, QGPIU)) + .widget(createUpgradeConnectorLine(new Pos2d(143, 430), 48, 0, UpgradeColor.ORANGE, QGPIU, TCT)) + .widget(createUpgradeConnectorLine(new Pos2d(143, 490), 48, 0, UpgradeColor.ORANGE, TCT, EPEC)) + .widget(createUpgradeConnectorLine(new Pos2d(143, 550), 48, 0, UpgradeColor.ORANGE, EPEC, POS)) + .widget(createUpgradeConnectorLine(new Pos2d(143, 610), 48, 0, UpgradeColor.ORANGE, POS, NGMS)) + .widget(createUpgradeConnectorLine(new Pos2d(110, 410), 80, 40, UpgradeColor.PURPLE, QGPIU, SEFCP)) + .widget(createUpgradeConnectorLine(new Pos2d(83, 490), 48, 0, UpgradeColor.PURPLE, SEFCP, CNTI)) + .widget(createUpgradeConnectorLine(new Pos2d(83, 550), 48, 0, UpgradeColor.PURPLE, CNTI, NDPE)) + .widget(createUpgradeConnectorLine(new Pos2d(101, 590), 80, 320, UpgradeColor.PURPLE, NDPE, NGMS)) + .widget(createUpgradeConnectorLine(new Pos2d(53, 536), 35, 45, UpgradeColor.PURPLE, CNTI, DOP)) + .widget(createUpgradeConnectorLine(new Pos2d(176, 410), 80, 320, UpgradeColor.GREEN, QGPIU, GGEBE)) + .widget(createUpgradeConnectorLine(new Pos2d(203, 490), 48, 0, UpgradeColor.GREEN, GGEBE, IMKG)) + .widget(createUpgradeConnectorLine(new Pos2d(203, 550), 48, 0, UpgradeColor.GREEN, IMKG, DOR)) + .widget(createUpgradeConnectorLine(new Pos2d(185, 590), 80, 40, UpgradeColor.GREEN, DOR, NGMS)) + .widget(createUpgradeConnectorLine(new Pos2d(233, 476), 35, 315, UpgradeColor.GREEN, GGEBE, TPTP)) + .widget(createUpgradeConnectorLine(new Pos2d(143, 670), 48, 0, UpgradeColor.BLUE, NGMS, SEDS)) + .widget(createUpgradeConnectorLine(new Pos2d(101, 707), 75, 62.3f, UpgradeColor.BLUE, SEDS, PA)) + .widget(createUpgradeConnectorLine(new Pos2d(53, 772), 78, 0, UpgradeColor.BLUE, PA, CD)) + .widget(createUpgradeConnectorLine(new Pos2d(95, 837), 75, 297.7f, UpgradeColor.BLUE, CD, TSE)) + .widget(createUpgradeConnectorLine(new Pos2d(191, 837), 75, 62.3f, UpgradeColor.BLUE, TSE, TBF)) + .widget(createUpgradeConnectorLine(new Pos2d(233, 772), 78, 0, UpgradeColor.BLUE, TBF, EE)) + .widget(createUpgradeConnectorLine(new Pos2d(191, 747), 75, 62.3f, UpgradeColor.BLUE, EE, END)); + // spotless:on + + for (ForgeOfGodsUpgrade upgrade : upgrades.getAllUpgrades()) { + scrollable.widget(createUpgradeBox(upgrade, scrollable)); + } + + scrollable.widget( + new MultiChildWidget().addChild( + new ButtonWidget().setOnClick(((clickData, widget) -> secretUpgrade = !secretUpgrade)) + .setSize(40, 15) + .setBackground(() -> { + if (secretUpgrade) { + return new IDrawable[] { TecTechUITextures.BUTTON_SPACE_PRESSED_32x16 }; + } + return new IDrawable[0]; + }) + .addTooltip(translateToLocal("fog.upgrade.tt.secret")) + .setTooltipShowUpDelay(20)) + .addChild( + new TextWidget(translateToLocal("fog.upgrade.tt.short.secret")).setScale(0.8f) + .setDefaultColor(EnumChatFormatting.GOLD) + .setTextAlignment(Alignment.Center) + .setSize(34, 9) + .setPos(3, 4) + .setEnabled((widget -> secretUpgrade))) + .addChild( + new DrawableWidget().setDrawable(TecTechUITextures.PICTURE_UPGRADE_CONNECTOR_BLUE_OPAQUE) + .setEnabled(widget -> secretUpgrade) + .setPos(40, 4) + .setSize(20, 6)) + .setPos(new Pos2d(66, 56))) .widget(new TextWidget("").setPos(0, 945)); builder.widget( @@ -1984,440 +1557,178 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable, if (!widget.isClient()) { widget.getWindow() .closeWindow(); - widget.getContext() - .closeWindow(INDIVIDUAL_UPGRADE_WINDOW_ID); + ForgeOfGodsUI.closeWindow(widget, INDIVIDUAL_UPGRADE_WINDOW_ID); } }) .setPos(282, 4)); if (ConfigHandler.debug.DEBUG_MODE) { - builder.widget(new MultiChildWidget().addChild(new ButtonWidget().setOnClick((clickData, widget) -> { - upgrades = new boolean[31]; - materialPaidUpgrades = new boolean[7]; - }) - .setSize(40, 15) - .setBackground(GTUITextures.BUTTON_STANDARD) - .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(GTUITextures.BACKGROUND_TEXT_FIELD)) - .addChild( - new ButtonWidget().setOnClick((clickData, widget) -> Arrays.fill(upgrades, true)) - .setSize(40, 15) - .setBackground(GTUITextures.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, 4)); - - } - return builder.build(); - } - - protected ModularWindow createIndividualUpgradeWindow(final EntityPlayer player) { - 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; - } - case 4 -> { - background = TecTechUITextures.BACKGROUND_GLOW_RED; - overlay = TecTechUITextures.PICTURE_OVERLAY_RED; - } - 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 || currentUpgradeID == 30) { - 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( + builder.widget( new MultiChildWidget() .addChild( - new TextWidget(translateToLocal("fog.upgrade.tt." + (currentUpgradeID))) - .setTextAlignment(Alignment.Center) - .setDefaultColor(EnumChatFormatting.GOLD) - .setSize(WIDTH - 15, 30) - .setPos(9, 5)) + new ButtonWidget().setOnClick((clickData, widget) -> upgrades.resetAll()) + .setSize(40, 15) + .setBackground(GTUITextures.BUTTON_STANDARD) + .addTooltip(translateToLocal("fog.debug.resetbutton.tooltip")) + .setTooltipShowUpDelay(TOOLTIP_DELAY)) .addChild( - new TextWidget(translateToLocal("fog.upgrade.text." + (currentUpgradeID))) + new TextWidget(translateToLocal("fog.debug.resetbutton.text")) .setTextAlignment(Alignment.Center) - .setDefaultColor(EnumChatFormatting.WHITE) - .setSize(WIDTH - 15, LORE_POS - 30) - .setPos(9, 30)) - .addChild( - new TextWidget( - EnumChatFormatting.ITALIC + translateToLocal("fog.upgrade.lore." + (currentUpgradeID))) - .setTextAlignment(Alignment.Center) - .setDefaultColor(0xbbbdbd) - .setSize(WIDTH - 15, (int) (HEIGHT * 0.9) - LORE_POS) - .setPos(9, LORE_POS)) + .setScale(0.57f) + .setMaxWidth(36) + .setPos(3, 3)) .addChild( - 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")) + new NumericWidget().setSetter(val -> gravitonShardsAvailable = (int) val) + .setGetter(() -> gravitonShardsAvailable) + .setBounds(0, 112) + .setDefaultValue(0) + .setScrollValues(1, 4, 64) .setTextAlignment(Alignment.Center) - .setScale(0.7f) - .setMaxWidth(90) - .setDefaultColor(0x9c9c9c) - .setPos(WIDTH - 87, HEIGHT - 25)) + .setTextColor(Color.WHITE.normal) + .setSize(25, 18) + .setPos(4, 16) + .addTooltip(translateToLocal("fog.debug.gravitonshardsetter.tooltip")) + .setTooltipShowUpDelay(TOOLTIP_DELAY) + .setBackground(GTUITextures.BACKGROUND_TEXT_FIELD)) .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) -> { - if (!upgrades[currentUpgradeID]) { - completeUpgrade(); - } else { - respecUpgrade(); - } - }) - .setSize(40, 15) - .setBackground(() -> { - if (upgrades[currentUpgradeID]) { - return new IDrawable[] { GTUITextures.BUTTON_STANDARD_PRESSED }; - } else { - return new IDrawable[] { GTUITextures.BUTTON_STANDARD }; - } - }) - .dynamicTooltip(this::constructionStatus) - .setTooltipShowUpDelay(TOOLTIP_DELAY)) - .addChild( - TextWidget.dynamicText(this::constructionStatusText) - .setTextAlignment(Alignment.Center) - .setScale(0.7f) - .setMaxWidth(36) - .setPos(3, 5)) - .setPos(WIDTH / 2 - 21, (int) (HEIGHT * 0.9))); - if (Arrays.asList(UPGRADE_MATERIAL_ID_CONVERSION) - .contains(currentUpgradeID)) { - builder.widget(createMaterialInputButton(currentUpgradeID, WIDTH / 2 - 40, (int) (HEIGHT * 0.9), builder)); + new ButtonWidget().setOnClick((clickData, widget) -> upgrades.unlockAll()) + .setSize(40, 15) + .setBackground(GTUITextures.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, 4)); + } return builder.build(); } - private void completeUpgrade() { - int unlockedPrereqUpgrades = 0; - int unlockedSplitUpgrades = 0; - if (!upgrades[currentUpgradeID]) { - for (int prereqUpgrade : prereqUpgrades[currentUpgradeID]) { - if (upgrades[prereqUpgrade]) { - unlockedPrereqUpgrades++; - } - } - if (!doesCurrentUpgradeRequireExtraMats - || materialPaidUpgrades[Arrays.asList(UPGRADE_MATERIAL_ID_CONVERSION) - .indexOf(currentUpgradeID)]) { - if (allPrereqRequired[currentUpgradeID]) { - if (unlockedPrereqUpgrades == prereqUpgrades[currentUpgradeID].length - && gravitonShardsAvailable >= gravitonShardCost) { - gravitonShardsAvailable -= gravitonShardCost; - gravitonShardsSpent += gravitonShardCost; - upgrades[currentUpgradeID] = true; - } - } else if (unlockedPrereqUpgrades > 0 || prereqUpgrades[currentUpgradeID].length == 0) { - if (isUpradeSplitStart) { - for (int splitUpgrade : FIRST_SPLIT_UPGRADES) { - if (upgrades[splitUpgrade]) { - unlockedSplitUpgrades++; - } - } - unlockedSplitUpgrades -= (ringAmount - 1); - } - if (unlockedSplitUpgrades <= 0 && gravitonShardsAvailable >= gravitonShardCost) { - gravitonShardsAvailable -= gravitonShardCost; - gravitonShardsSpent += gravitonShardCost; - upgrades[currentUpgradeID] = true; - } - } - } - } - } + protected ModularWindow createIndividualUpgradeWindow(final EntityPlayer player) { + ForgeOfGodsUpgrade upgrade = currentUpgradeWindow; - private void respecUpgrade() { - int unlockedFollowupUpgrades = 0; - int unlockedNeighboringUpgrades = 0; - boolean doesFollowupRequireAllPrereqs = false; - boolean canFollowupSpareAConnection = true; + ModularWindow.Builder builder = ModularWindow.builder(upgrade.getWindowSize()); + builder.setBackground(upgrade.getBackground()); - for (int followupUpgrade : followupUpgrades) { - if (upgrades[followupUpgrade]) { - unlockedFollowupUpgrades++; - if (allPrereqRequired[followupUpgrade]) { - doesFollowupRequireAllPrereqs = true; - } - int[] currentPrereqs = prereqUpgrades[followupUpgrade]; - for (int prereqUpgrade : currentPrereqs) { - if (upgrades[prereqUpgrade]) { - unlockedNeighboringUpgrades++; - } - } - if (unlockedNeighboringUpgrades <= 1) { - canFollowupSpareAConnection = false; - } - } + // Syncers + builder.widget( + new FakeSyncWidget.IntegerSyncer(() -> gravitonShardsAvailable, val -> gravitonShardsAvailable = val)); + builder.widget(upgrades.getSyncer(upgrade)); - unlockedNeighboringUpgrades = 0; + builder.widget( + ForgeOfGodsUI.getIndividualUpgradeGroup( + upgrade, + () -> gravitonShardsAvailable, + () -> completeUpgrade(upgrade), + () -> respecUpgrade(upgrade), + () -> isUpgradeActive(upgrade))); + + if (upgrade.hasExtraCost()) { + builder.widget( + ForgeOfGodsUI + .createMaterialInputButton(upgrade, () -> upgrades.isCostPaid(upgrade), (clickData, widget) -> { + ForgeOfGodsUI.reopenWindow(widget, MANUAL_INSERTION_WINDOW_ID); + ForgeOfGodsUI.closeWindow(widget, INDIVIDUAL_UPGRADE_WINDOW_ID); + ForgeOfGodsUI.closeWindow(widget, UPGRADE_TREE_WINDOW_ID); + })); } - if (!doesFollowupRequireAllPrereqs && followupUpgrades.length > 0 && canFollowupSpareAConnection) { - unlockedFollowupUpgrades = 0; - } + return builder.build(); + } - if (unlockedFollowupUpgrades == 0) { - gravitonShardsAvailable += gravitonShardCost; - gravitonShardsSpent -= gravitonShardCost; - upgrades[currentUpgradeID] = false; + // todo ringAmount is not client synced, causing a UI desync when unlocking split upgrades + private void completeUpgrade(ForgeOfGodsUpgrade upgrade) { + if (isUpgradeActive(upgrade)) return; + if (!upgrades.checkPrerequisites(upgrade)) return; + if (!upgrades.checkSplit(upgrade, ringAmount)) return; + if (!upgrades.checkCost(upgrade, gravitonShardsAvailable)) return; - if (currentUpgradeID == 30) { - gravitonShardEjection = false; - } - } + upgrades.unlockUpgrade(upgrade); + gravitonShardsAvailable -= upgrade.getShardCost(); + gravitonShardsSpent += upgrade.getShardCost(); } - private Widget createMaterialInputButton(int upgradeID, int xCoord, int yCoord, IWidgetBuilder builder) { - return new ButtonWidget().setOnClick((clickData, widget) -> { - if (!widget.isClient() && doesCurrentUpgradeRequireExtraMats) { - ModularUIContext ctx = widget.getContext(); - ctx.openSyncedWindow(MANUAL_INSERTION_WINDOW_ID); - ctx.closeWindow(INDIVIDUAL_UPGRADE_WINDOW_ID); - ctx.closeWindow(UPGRADE_TREE_WINDOW_ID); - } - }) - .setPlayClickSound(doesCurrentUpgradeRequireExtraMats) - .setBackground(() -> { - if (doesCurrentUpgradeRequireExtraMats) { - if (materialPaidUpgrades[Arrays.asList(UPGRADE_MATERIAL_ID_CONVERSION) - .indexOf(upgradeID)]) { - return new IDrawable[] { TecTechUITextures.BUTTON_BOXED_CHECKMARK_18x18 }; - } else { - return new IDrawable[] { TecTechUITextures.BUTTON_BOXED_EXCLAMATION_POINT_18x18 }; - } - } else { - return new IDrawable[] { GTUITextures.TRANSPARENT }; - } - }) - .setPos(xCoord, yCoord) - .setSize(15, 15) - .dynamicTooltip(this::upgradeMaterialRequirements) - .addTooltip(EnumChatFormatting.GRAY + translateToLocal("fog.button.materialrequirements.tooltip.clickhere")) - .attachSyncer( - new FakeSyncWidget.BooleanSyncer( - () -> materialPaidUpgrades[Arrays.asList(UPGRADE_MATERIAL_ID_CONVERSION) - .indexOf(upgradeID)], - val -> materialPaidUpgrades[Arrays.asList(UPGRADE_MATERIAL_ID_CONVERSION) - .indexOf(upgradeID)] = val), - builder); + private void respecUpgrade(ForgeOfGodsUpgrade upgrade) { + if (!isUpgradeActive(upgrade)) return; + if (!upgrades.checkDependents(upgrade)) return; + + upgrades.respecUpgrade(upgrade); + gravitonShardsAvailable += upgrade.getShardCost(); + gravitonShardsSpent -= upgrade.getShardCost(); + + if (upgrade == END) { + gravitonShardEjection = false; + } } - /** - * @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 requiresExtraMaterials Whether this upgrade requires materials other than graviton shards to unlock - * @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 milestone, int[] prerequisiteUpgradeIDs, - boolean requireAllPrerequisites, int[] followingUpgradeIDs, boolean isStartOfSplit, - boolean requiresExtraMaterials, int shardCost, Pos2d pos, IWidgetBuilder builder) { - prereqUpgrades[upgradeID] = prerequisiteUpgradeIDs; - allPrereqRequired[upgradeID] = requireAllPrerequisites; + private Widget createUpgradeBox(ForgeOfGodsUpgrade upgrade, IWidgetBuilder builder) { return new MultiChildWidget().addChild(new ButtonWidget().setOnClick((clickData, widget) -> { - currentUpgradeID = upgradeID; - currentColorCode = colorCode; - currentMilestoneBG = milestone; - gravitonShardCost = shardCost; - followupUpgrades = followingUpgradeIDs; - isUpradeSplitStart = isStartOfSplit; - doesCurrentUpgradeRequireExtraMats = requiresExtraMaterials; + currentUpgradeWindow = upgrade; if (clickData.mouseButton == 0) { if (clickData.shift) { - if (!doesCurrentUpgradeRequireExtraMats - || materialPaidUpgrades[Arrays.asList(UPGRADE_MATERIAL_ID_CONVERSION) - .indexOf(currentUpgradeID)]) { - completeUpgrade(); - } else if (!widget.isClient()) { - ModularUIContext ctx = widget.getContext(); - ctx.openSyncedWindow(MANUAL_INSERTION_WINDOW_ID); - ctx.closeWindow(INDIVIDUAL_UPGRADE_WINDOW_ID); - ctx.closeWindow(UPGRADE_TREE_WINDOW_ID); + if (!upgrade.hasExtraCost() || upgrades.isCostPaid(upgrade)) { + completeUpgrade(upgrade); + } else { + ForgeOfGodsUI.reopenWindow(widget, MANUAL_INSERTION_WINDOW_ID); + ForgeOfGodsUI.closeWindow(widget, INDIVIDUAL_UPGRADE_WINDOW_ID); + ForgeOfGodsUI.closeWindow(widget, UPGRADE_TREE_WINDOW_ID); } } else { ForgeOfGodsUI.reopenWindow(widget, INDIVIDUAL_UPGRADE_WINDOW_ID); } } else if (clickData.mouseButton == 1) { - respecUpgrade(); + respecUpgrade(upgrade); } }) .setSize(40, 15) .setBackground(() -> { - if (upgrades[upgradeID]) { + if (isUpgradeActive(upgrade)) { return new IDrawable[] { TecTechUITextures.BUTTON_SPACE_PRESSED_32x16 }; } else { return new IDrawable[] { TecTechUITextures.BUTTON_SPACE_32x16 }; } }) - .addTooltip(translateToLocal("fog.upgrade.tt." + upgradeID)) + .addTooltip(upgrade.getNameText()) .setTooltipShowUpDelay(TOOLTIP_DELAY)) .addChild( - new TextWidget(translateToLocal("fog.upgrade.tt.short." + upgradeID)).setScale(0.8f) + new TextWidget(upgrade.getShortNameText()).setScale(0.8f) .setDefaultColor(EnumChatFormatting.GOLD) .setTextAlignment(Alignment.Center) .setSize(34, 9) .setPos(3, 4)) - .setPos(pos) - .attachSyncer( - new FakeSyncWidget.BooleanSyncer(() -> upgrades[upgradeID], val -> upgrades[upgradeID] = val), - builder); + .setPos(upgrade.getTreePos()) + .attachSyncer(upgrades.getSyncer(upgrade), builder); } - private Widget createUpgradeConnectorLine(Pos2d pos, int length, float rotationAngle, int colorCode, - int startUpgradeID, int endUpgradeID) { - return new DrawableWidget() - .setDrawable( - () -> (upgrades[startUpgradeID] && upgrades[endUpgradeID]) - ? coloredLine(colorCode, true).withRotationDegree(rotationAngle) - : coloredLine(colorCode, false).withRotationDegree(rotationAngle)) + private Widget createUpgradeConnectorLine(Pos2d pos, int length, float rotationAngle, UpgradeColor color, + ForgeOfGodsUpgrade startUpgrade, ForgeOfGodsUpgrade endUpgrade) { + return new DrawableWidget().setDrawable(() -> { + UITexture texture = color.getConnector(); + if (isUpgradeActive(startUpgrade) && isUpgradeActive(endUpgrade)) { + texture = color.getOpaqueConnector(); + } + return texture.withRotationDegree(rotationAngle); + }) .setPos(pos) .setSize(6, length); } - private IDrawable coloredLine(int colorCode, boolean opaque) { - IDrawable line; - switch (colorCode) { - case 1 -> { - line = opaque ? TecTechUITextures.PICTURE_UPGRADE_CONNECTOR_PURPLE_OPAQUE - : TecTechUITextures.PICTURE_UPGRADE_CONNECTOR_PURPLE; - } - case 2 -> { - line = opaque ? TecTechUITextures.PICTURE_UPGRADE_CONNECTOR_ORANGE_OPAQUE - : TecTechUITextures.PICTURE_UPGRADE_CONNECTOR_ORANGE; - } - case 3 -> { - line = opaque ? TecTechUITextures.PICTURE_UPGRADE_CONNECTOR_GREEN_OPAQUE - : TecTechUITextures.PICTURE_UPGRADE_CONNECTOR_GREEN; - } - case 4 -> { - line = opaque ? TecTechUITextures.PICTURE_UPGRADE_CONNECTOR_RED_OPAQUE - : TecTechUITextures.PICTURE_UPGRADE_CONNECTOR_RED; - } - default -> { - line = opaque ? TecTechUITextures.PICTURE_UPGRADE_CONNECTOR_BLUE_OPAQUE - : TecTechUITextures.PICTURE_UPGRADE_CONNECTOR_BLUE; - } - } - return line; - } - protected ModularWindow createManualInsertionWindow(final EntityPlayer player) { - ItemStack[] inputs = godforgeUpgradeMats.get(currentUpgradeID); + ForgeOfGodsUpgrade upgrade = currentUpgradeWindow; + ItemStack[] inputs = upgrade.getExtraCost(); final int WIDTH = 189; final int HEIGHT = 106; 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(); - final DynamicPositionedColumn column4 = new DynamicPositionedColumn(); - final DynamicPositionedColumn column5 = new DynamicPositionedColumn(); - final DynamicPositionedColumn column6 = new DynamicPositionedColumn(); for (int i = 0; i < 16; i++) { inputSlotHandler.insertItem(i, storedUpgradeWindowItems[i], false); storedUpgradeWindowItems[i] = null; } - List columnList = Arrays.asList(column1, column2, column3, column4, column5, column6); ModularWindow.Builder builder = ModularWindow.builder(WIDTH, HEIGHT); builder.setBackground(GTUITextures.BACKGROUND_SINGLEBLOCK_DEFAULT); builder.setGuiTint(getGUIColorization()); @@ -2427,6 +1738,7 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable, .add(Alignment.TopRight.getAlignedPos(new Size(PARENT_WIDTH, PARENT_HEIGHT), new Size(WIDTH, HEIGHT))) .subtract(5, 0) .add(0, 4)); + builder.widget(upgrades.getSyncer(upgrade)); builder.widget( SlotGroup.ofItemHandler(inputSlotHandler, 4) .startFromSlot(0) @@ -2439,10 +1751,8 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable, if (!widget.isClient()) { widget.getWindow() .closeWindow(); - widget.getContext() - .openSyncedWindow(UPGRADE_TREE_WINDOW_ID); - widget.getContext() - .openSyncedWindow(INDIVIDUAL_UPGRADE_WINDOW_ID); + ForgeOfGodsUI.reopenWindow(widget, UPGRADE_TREE_WINDOW_ID); + ForgeOfGodsUI.reopenWindow(widget, INDIVIDUAL_UPGRADE_WINDOW_ID); } }) .setBackground(ModularUITextures.VANILLA_BACKGROUND, new Text("x")) @@ -2450,26 +1760,8 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable, .setSize(10, 10)); builder.widget(new MultiChildWidget().addChild(new ButtonWidget().setOnClick((clickData, widget) -> { if (!widget.isClient()) { - ArrayList list = new ArrayList<>(inputSlotHandler.getStacks()); - list.removeIf(Objects::isNull); - int foundInputs = 0; - int[] foundInputIndices = new int[inputs.length]; - for (ItemStack inputStack : list) { - for (ItemStack requiredStack : inputs) { - if (ItemStack.areItemStacksEqual(requiredStack, inputStack)) { - foundInputIndices[foundInputs] = inputSlotHandler.getStacks() - .indexOf(inputStack); - foundInputs++; - } - } - } - if (foundInputs == inputs.length) { - for (int index : foundInputIndices) { - inputSlotHandler.extractItem(index, inputSlotHandler.getStackInSlot(index).stackSize, false); - } - materialPaidUpgrades[Arrays.asList(UPGRADE_MATERIAL_ID_CONVERSION) - .indexOf(currentUpgradeID)] = true; - } + upgrades.payCost(upgrade, inputSlotHandler); + ForgeOfGodsUI.reopenWindow(widget, MANUAL_INSERTION_WINDOW_ID); } }) .setPlayClickSound(true) @@ -2484,59 +1776,17 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable, .setPos(5, 82) .setSize(179, 16)); - IItemHandlerModifiable upgradeMatsHandler = new ItemStackHandler(12); - int uniqueItems = inputs.length; for (int i = 0; i < 12; i++) { - int cleanDiv4 = i / 4; - if (i < uniqueItems) { - ItemStack stack = inputs[i]; - if (stack != null) { - upgradeMatsHandler.setStackInSlot(i, stack.copy()); - } - builder.widget( - new DrawableWidget().setDrawable(GTUITextures.BUTTON_STANDARD_PRESSED) - .setPos(5 + cleanDiv4 * 36, 6 + i % 4 * 18) - .setSize(18, 18)); - columnList.get(cleanDiv4) - .addChild( - new SlotWidget(upgradeMatsHandler, i).setAccess(false, false) - .setRenderStackSize(false) - .disableInteraction()); - columnList.get(cleanDiv4 + 3) - .addChild( - new TextWidget("x" + inputs[i].stackSize).setTextAlignment(Alignment.CenterLeft) - .setScale(0.8f) - .setSize(18, 8)); - } else { - builder.widget( - new DrawableWidget().setDrawable(GTUITextures.BUTTON_STANDARD_DISABLED) - .setPos(5 + cleanDiv4 * 36, 6 + i % 4 * 18) - .setSize(18, 18)); - } - } - - int counter = 0; - for (DynamicPositionedColumn column : columnList) { - int spacing = 0; - int xCord = counter * 36; - int yCord = 0; - if (counter > 2) { - spacing = 10; - xCord = 19 + (counter - 3) * 36; - yCord = 5; + final int ii = i; + ItemStack stack = null; + if (i < inputs.length) { + stack = inputs[i]; } - columns.addChild( - column.setSpace(spacing) - .setAlignment(MainAxisAlignment.SPACE_BETWEEN) - .setSize(16, 72) - .setPos(xCord, yCord)); - counter++; + Widget costWidget = ForgeOfGodsUI.createExtraCostWidget(stack, () -> upgrades.getPaidCosts(upgrade)[ii]); + costWidget.setPos(5 + (36 * (i / 4)), 6 + (18 * (i % 4))); + builder.widget(costWidget); } - builder.widget( - columns.setSize(108, 72) - .setPos(5, 6)); - return builder.build(); } @@ -2545,119 +1795,7 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable, } protected ModularWindow createSpecialThanksWindow(final EntityPlayer player) { - final int WIDTH = 200; - final int HEIGHT = 200; - ModularWindow.Builder builder = ModularWindow.builder(WIDTH, HEIGHT); - - builder.setBackground(TecTechUITextures.BACKGROUND_GLOW_RAINBOW); - builder.setDraggable(true); - builder.widget( - ButtonWidget.closeWindowButton(true) - .setPos(184, 4)) - .widget( - new DrawableWidget().setDrawable(TecTechUITextures.PICTURE_GODFORGE_THANKS) - .setPos(50, 50) - .setSize(100, 100)) - .widget( - new TextWidget(translateToLocal("gt.blockmachines.multimachine.FOG.contributors")) - .setDefaultColor(EnumChatFormatting.GOLD) - .setTextAlignment(Alignment.Center) - .setScale(1f) - .setPos(0, 5) - .setSize(200, 15)) - .widget( - new TextWidget( - EnumChatFormatting.UNDERLINE + translateToLocal("gt.blockmachines.multimachine.FOG.lead")) - .setScale(0.8f) - .setDefaultColor(EnumChatFormatting.GOLD) - .setTextAlignment(Alignment.CenterLeft) - .setPos(7, 30) - .setSize(60, 10)) - .widget( - new TextWidget(translateToLocal("gt.blockmachines.multimachine.FOG.cloud")).setScale(0.8f) - .setDefaultColor(EnumChatFormatting.AQUA) - .setTextAlignment(Alignment.CenterLeft) - .setPos(7, 40) - .setSize(60, 10)) - .widget( - new TextWidget( - EnumChatFormatting.UNDERLINE + translateToLocal("gt.blockmachines.multimachine.FOG.programming")) - .setScale(0.8f) - .setDefaultColor(EnumChatFormatting.GOLD) - .setTextAlignment(Alignment.CenterLeft) - .setPos(7, 55) - .setSize(60, 10)) - .widget( - new TextWidget( - translateToLocal("gt.blockmachines.multimachine.FOG.serenibyss") + " " - + EnumChatFormatting.DARK_AQUA - + translateToLocal("gt.blockmachines.multimachine.FOG.teg")).setScale(0.8f) - .setTextAlignment(Alignment.CenterLeft) - .setPos(7, 67) - .setSize(60, 10)) - .widget( - new TextWidget( - EnumChatFormatting.UNDERLINE + translateToLocal("gt.blockmachines.multimachine.FOG.textures")) - .setScale(0.8f) - .setDefaultColor(EnumChatFormatting.GOLD) - .setTextAlignment(Alignment.CenterLeft) - .setPos(7, 85) - .setSize(100, 10)) - .widget( - new TextWidget(translateToLocal("gt.blockmachines.multimachine.FOG.ant")).setScale(0.8f) - .setDefaultColor(EnumChatFormatting.GREEN) - .setTextAlignment(Alignment.CenterLeft) - .setPos(7, 95) - .setSize(60, 10)) - .widget( - new TextWidget( - EnumChatFormatting.UNDERLINE + translateToLocal("gt.blockmachines.multimachine.FOG.rendering")) - .setScale(0.8f) - .setDefaultColor(EnumChatFormatting.GOLD) - .setTextAlignment(Alignment.CenterLeft) - .setPos(7, 110) - .setSize(100, 10)) - .widget( - new TextWidget(translateToLocal("gt.blockmachines.multimachine.FOG.bucket")).setScale(0.8f) - .setDefaultColor(EnumChatFormatting.WHITE) - .setTextAlignment(Alignment.CenterLeft) - .setPos(7, 120) - .setSize(60, 10)) - .widget( - new TextWidget( - EnumChatFormatting.UNDERLINE + translateToLocal("gt.blockmachines.multimachine.FOG.lore")) - .setScale(0.8f) - .setDefaultColor(EnumChatFormatting.GOLD) - .setTextAlignment(Alignment.CenterLeft) - .setPos(7, 135) - .setSize(100, 10)) - .widget( - delenoName().setSpace(-1) - .setAlignment(MainAxisAlignment.SPACE_BETWEEN) - .setPos(7, 145) - .setSize(60, 10)) - .widget( - new TextWidget( - EnumChatFormatting.UNDERLINE + translateToLocal("gt.blockmachines.multimachine.FOG.playtesting")) - .setScale(0.8f) - .setDefaultColor(EnumChatFormatting.GOLD) - .setTextAlignment(Alignment.CenterLeft) - .setPos(7, 160) - .setSize(100, 10)) - .widget( - new TextWidget(translateToLocal("gt.blockmachines.multimachine.FOG.misi")).setScale(0.8f) - .setDefaultColor(0xffc26f) - .setTextAlignment(Alignment.CenterLeft) - .setPos(7, 170) - .setSize(60, 10)) - .widget( - new TextWidget(EnumChatFormatting.ITALIC + translateToLocal("gt.blockmachines.multimachine.FOG.thanks")) - .setScale(0.8f) - .setDefaultColor(0xbbbdbd) - .setTextAlignment(Alignment.Center) - .setPos(90, 140) - .setSize(100, 60)); - return builder.build(); + return ForgeOfGodsUI.createSpecialThanksWindow(); } protected ModularWindow createStarCosmeticsWindow(final EntityPlayer player) { @@ -2669,8 +1807,6 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable, // Syncers builder.widget(new FakeSyncWidget.StringSyncer(() -> selectedStarColor, val -> selectedStarColor = val)); - builder.widget(new FakeSyncWidget.IntegerSyncer(() -> rotationSpeed, val -> rotationSpeed = val)); - builder.widget(new FakeSyncWidget.IntegerSyncer(() -> starSize, val -> starSize = val)); builder.widget(new FakeSyncWidget.IntegerSyncer(() -> editingStarIndex, val -> editingStarIndex = val)); builder.widget(starColors.getSyncer()); @@ -2740,50 +1876,73 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable, builder.widget(newPreset); - // Miscellaneous options not related to color settings - builder - .widget( - new TextWidget(EnumChatFormatting.UNDERLINE + translateToLocal("fog.cosmetics.misc")) - .setDefaultColor(EnumChatFormatting.GOLD) - .setTextAlignment(Alignment.CenterLeft) - .setPos(120, 25) - .setSize(80, 10)) - .widget( - TextWidget.localised("fog.cosmetics.spin") - .setDefaultColor(EnumChatFormatting.GOLD) - .setTextAlignment(Alignment.CenterLeft) - .setPos(120, 45) - .setSize(60, 18)) - .widget( - new NumericWidget().setSetter(val -> rotationSpeed = (int) val) - .setGetter(() -> rotationSpeed) - .setBounds(0, 100) - .setDefaultValue(5) - .setTextAlignment(Alignment.Center) - .setTextColor(Color.WHITE.normal) - .setSize(35, 18) - .setPos(155, 45) - .addTooltip(translateToLocal("fog.cosmetics.onlyintegers")) - .setTooltipShowUpDelay(TOOLTIP_DELAY) - .setBackground(GTUITextures.BACKGROUND_TEXT_FIELD)) - .widget( - TextWidget.localised("fog.cosmetics.size") - .setDefaultColor(EnumChatFormatting.GOLD) - .setTextAlignment(Alignment.CenterLeft) - .setPos(120, 65) - .setSize(60, 18)) - .widget( - new NumericWidget().setSetter(val -> starSize = (int) val) - .setGetter(() -> starSize) - .setBounds(1, 40) - .setDefaultValue(20) - .setTextAlignment(Alignment.Center) - .setTextColor(Color.WHITE.normal) - .setSize(35, 18) - .setPos(155, 65) - .addTooltip(translateToLocal("fog.cosmetics.onlyintegers")) - .setTooltipShowUpDelay(TOOLTIP_DELAY) - .setBackground(GTUITextures.BACKGROUND_TEXT_FIELD)); + // Misc Section + + // Header + builder.widget( + new TextWidget(EnumChatFormatting.UNDERLINE + translateToLocal("fog.cosmetics.misc")) + .setDefaultColor(EnumChatFormatting.GOLD) + .setTextAlignment(Alignment.CenterLeft) + .setPos(120, 25) + .setSize(80, 10)); + + // Spin Textbox + builder.widget( + TextWidget.localised("fog.cosmetics.spin") + .setDefaultColor(EnumChatFormatting.GOLD) + .setTextAlignment(Alignment.CenterLeft) + .setPos(120, 45) + .setSize(60, 18)); + + NumericWidget rotationWidget = new NumericWidget(); + rotationWidget.setGetter(() -> rotationSpeed) + .setSetter(val -> { + if (rotationSpeed != (int) val) { + rotationSpeed = (int) val; + if (!rotationWidget.isClient()) { + updateRenderer(); + } + } + }) + .setBounds(0, 100) + .setDefaultValue(5) + .setTextAlignment(Alignment.Center) + .setTextColor(Color.WHITE.normal) + .setSize(35, 18) + .setPos(155, 45) + .addTooltip(translateToLocal("fog.cosmetics.onlyintegers")) + .setTooltipShowUpDelay(TOOLTIP_DELAY) + .setBackground(GTUITextures.BACKGROUND_TEXT_FIELD); + builder.widget(rotationWidget); + + // Size Textbox + builder.widget( + TextWidget.localised("fog.cosmetics.size") + .setDefaultColor(EnumChatFormatting.GOLD) + .setTextAlignment(Alignment.CenterLeft) + .setPos(120, 65) + .setSize(60, 18)); + + NumericWidget spinWidget = new NumericWidget(); + spinWidget.setGetter(() -> starSize) + .setSetter(val -> { + if (starSize != (int) val) { + starSize = (int) val; + if (!spinWidget.isClient()) { + updateRenderer(); + } + } + }) + .setBounds(1, 40) + .setDefaultValue(20) + .setTextAlignment(Alignment.Center) + .setTextColor(Color.WHITE.normal) + .setSize(35, 18) + .setPos(155, 65) + .addTooltip(translateToLocal("fog.cosmetics.onlyintegers")) + .setTooltipShowUpDelay(TOOLTIP_DELAY) + .setBackground(GTUITextures.BACKGROUND_TEXT_FIELD); + builder.widget(spinWidget); return builder.build(); } @@ -3315,18 +2474,199 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable, } } - private DynamicPositionedRow delenoName() { - DynamicPositionedRow nameRow = new DynamicPositionedRow(); - String deleno = translateToLocal("gt.blockmachines.multimachine.FOG.deleno"); - int[] colors = new int[] { 0xffffff, 0xf6fff5, 0xecffec, 0xe3ffe2, 0xd9ffd9, 0xd0ffcf }; + protected ModularWindow createStatisticsWindow(final EntityPlayer player) { + final int WIDTH = 300; + final int HEIGHT = 300; + ModularWindow.Builder builder = ModularWindow.builder(WIDTH, HEIGHT); + builder.setBackground(TecTechUITextures.BACKGROUND_GLOW_WHITE); + builder.setDraggable(true); - for (int i = 0; i < 6; i++) { - nameRow.addChild( - new TextWidget(Character.toString(deleno.charAt(i))).setDefaultColor(colors[i]) - .setScale(0.8f) - .setTextAlignment(Alignment.CenterLeft)); + builder + .widget( + new TextWidget(translateToLocal("gt.blockmachines.multimachine.FOG.modulestats")) + .setDefaultColor(EnumChatFormatting.GOLD) + .setTextAlignment(Alignment.Center) + .setScale(1f) + .setPos(0, 8) + .setSize(300, 15)) + .widget( + new TextWidget(translateToLocal("gt.blockmachines.multimachine.FOG.heat")).setScale(0.8f) + .setDefaultColor(EnumChatFormatting.GOLD) + .setTextAlignment(Alignment.Center) + .setPos(12, 56) + .setSize(69, 30) + .addTooltip(translateToLocal("fog.text.tooltip.heat")) + .setTooltipShowUpDelay(TOOLTIP_DELAY)) + .widget( + new TextWidget(translateToLocal("gt.blockmachines.multimachine.FOG.effectiveheat")).setScale(0.8f) + .setDefaultColor(EnumChatFormatting.GOLD) + .setTextAlignment(Alignment.Center) + .setPos(12, 86) + .setSize(69, 30) + .addTooltip(translateToLocal("fog.text.tooltip.effectiveheat")) + .setTooltipShowUpDelay(TOOLTIP_DELAY)) + .widget( + new TextWidget(translateToLocal("gt.blockmachines.multimachine.FOG.parallel")).setScale(0.8f) + .setDefaultColor(EnumChatFormatting.GOLD) + .setTextAlignment(Alignment.Center) + .setPos(12, 116) + .setSize(69, 30) + .addTooltip(translateToLocal("fog.text.tooltip.parallel")) + .setTooltipShowUpDelay(TOOLTIP_DELAY)) + .widget( + new TextWidget(translateToLocal("gt.blockmachines.multimachine.FOG.speedbonus")).setScale(0.8f) + .setDefaultColor(EnumChatFormatting.GOLD) + .setTextAlignment(Alignment.Center) + .setPos(12, 146) + .setSize(69, 30) + .addTooltip(translateToLocal("fog.text.tooltip.speedbonus")) + .setTooltipShowUpDelay(TOOLTIP_DELAY)) + .widget( + new TextWidget(translateToLocal("gt.blockmachines.multimachine.FOG.energydiscount")).setScale(0.8f) + .setDefaultColor(EnumChatFormatting.GOLD) + .setTextAlignment(Alignment.Center) + .setPos(12, 176) + .setSize(69, 30) + .addTooltip(translateToLocal("fog.text.tooltip.energydiscount")) + .setTooltipShowUpDelay(TOOLTIP_DELAY)) + .widget( + new TextWidget(translateToLocal("gt.blockmachines.multimachine.FOG.ocdivisor")).setScale(0.8f) + .setDefaultColor(EnumChatFormatting.GOLD) + .setTextAlignment(Alignment.Center) + .setPos(12, 206) + .setSize(69, 30) + .addTooltip(translateToLocal("fog.text.tooltip.ocdivisor")) + .setTooltipShowUpDelay(TOOLTIP_DELAY)) + .widget( + new TextWidget(translateToLocal("gt.blockmachines.multimachine.FOG.powerforge")).setScale(0.8f) + .setDefaultColor(EnumChatFormatting.GOLD) + .setTextAlignment(Alignment.Center) + .setPos(88, 40) + .setSize(40, 10)) + .widget( + new TextWidget(translateToLocal("gt.blockmachines.multimachine.FOG.meltingcore")).setScale(0.8f) + .setDefaultColor(EnumChatFormatting.GOLD) + .setTextAlignment(Alignment.Center) + .setPos(141, 40) + .setSize(40, 10)) + .widget( + new TextWidget(translateToLocal("gt.blockmachines.multimachine.FOG.plasmafab")).setScale(0.8f) + .setDefaultColor(EnumChatFormatting.GOLD) + .setTextAlignment(Alignment.Center) + .setPos(193, 40) + .setSize(44, 10)) + .widget( + new TextWidget(translateToLocal("gt.blockmachines.multimachine.FOG.exoticizer")).setScale(0.8f) + .setDefaultColor(EnumChatFormatting.GOLD) + .setTextAlignment(Alignment.Center) + .setPos(246, 43) + .setSize(40, 10)); + + // Vertical grid lines + for (int i = 0; i < 4; i++) { + builder.widget( + new DrawableWidget().setDrawable(new Rectangle().setColor(Color.rgb(190, 200, 0))) + .setSize(1, 197) + .setPos(81 + 53 * i, 38)); } - return nameRow; + + // Horizontal grid lines + for (int i = 0; i < 7; i++) { + builder.widget( + new DrawableWidget().setDrawable(new Rectangle().setColor(Color.rgb(0, 170, 170))) + .setSize(276, 1) + .setPos(12, 55 + 30 * i)); + } + + MTESmeltingModule smelting = new MTESmeltingModule("smelting"); + MTEMoltenModule molten = new MTEMoltenModule("molten"); + MTEPlasmaModule plasma = new MTEPlasmaModule("plasma"); + MTEExoticModule exotic = new MTEExoticModule("exotic"); + + builder.widget( + new FakeSyncWidget.ByteSyncer( + () -> (byte) formattingMode.ordinal(), + val -> formattingMode = MilestoneFormatter.VALUES[MathHelper + .clamp_int(val, 0, MilestoneFormatter.VALUES.length - 1)])); + builder + .widget(new FakeSyncWidget.IntegerSyncer(() -> fuelConsumptionFactor, val -> fuelConsumptionFactor = val)); + builder.widget(upgrades.getFullSyncer()); + + for (int i = 0; i < 24; i++) { + MTEBaseModule module; + switch (i % 4) { + case 1 -> { + module = molten; + } + case 2 -> { + module = plasma; + } + case 3 -> { + module = exotic; + } + default -> { + module = smelting; + } + } + + int cleanDiv4 = i / 4; + String relevantInfo; + switch (cleanDiv4) { + case 1 -> { + calculateMaxHeatForModules(module, this); + relevantInfo = String.valueOf(formattingMode.format(module.getHeatForOC())); + } + case 2 -> { + calculateMaxParallelForModules(module, this); + relevantInfo = String.valueOf(formattingMode.format(module.getMaxParallel())); + } + case 3 -> { + calculateSpeedBonusForModules(module, this); + relevantInfo = String.valueOf(formatNumbers(module.getSpeedBonus())); + } + case 4 -> { + calculateEnergyDiscountForModules(module, this); + relevantInfo = String.valueOf(formatNumbers(module.getEnergyDiscount())); + } + case 5 -> { + setMiscModuleParameters(module, this); + relevantInfo = String.valueOf(formatNumbers(module.getOverclockTimeFactor())); + } + default -> { + calculateMaxHeatForModules(module, this); + relevantInfo = String.valueOf(formattingMode.format(module.getHeat())); + } + } + + builder.widget( + new MultiChildWidget().addChild( + new ButtonWidget().setOnClick((clickData, widget) -> {}) + .setSize(53, 30)) + .addChild( + new DynamicTextWidget(() -> new Text(relevantInfo)).setScale(1f) + .setDefaultColor(EnumChatFormatting.GREEN) + .setTextAlignment(Alignment.Center) + .setSize(53, 30)) + .setPos(81 + (i % 4) * 53, 55 + (i / 4 * 30))); + } + + builder.widget( + ButtonWidget.closeWindowButton(true) + .setPos(284, 4)) + .widget(new ButtonWidget().setOnClick((clickData, widget) -> { + TecTech.proxy.playSound(getBaseMetaTileEntity(), "fx_click"); + if (clickData.mouseButton == 0) { + formattingMode = formattingMode.cycle(); + ForgeOfGodsUI.reopenWindow(widget, STATISTICS_WINDOW_ID); + } + }) + .setSize(20, 20) + .addTooltip(translateToLocal("fog.button.formatting.tooltip")) + .setBackground(TecTechUITextures.OVERLAY_CYCLIC_BLUE) + .setPos(8, 272) + .setTooltipShowUpDelay(TOOLTIP_DELAY)); + + return builder.build(); } @Override @@ -3368,101 +2708,16 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable, + "Clicking on the logo in the controller gui opens an extensive information window,") .addInfo("explaining everything there is to know about this multiblock.") .beginStructureBlock(127, 29, 186, false) + .addStructureInfo("Total blocks needed for the structure with " + getRingText("1", "2", "3") + "rings:") .addStructureInfo( - "Total blocks needed for the structure with " + EnumChatFormatting.DARK_PURPLE - + "1" - + EnumChatFormatting.GRAY - + "/" - + EnumChatFormatting.DARK_GREEN - + "2" - + EnumChatFormatting.GRAY - + "/" - + EnumChatFormatting.AQUA - + "3" - + EnumChatFormatting.GRAY - + " rings:") - .addStructureInfo( - EnumChatFormatting.DARK_PURPLE + "3943" - + EnumChatFormatting.GRAY - + "/" - + EnumChatFormatting.DARK_GREEN - + "7279" - + EnumChatFormatting.GRAY - + "/" - + EnumChatFormatting.AQUA - + "11005" - + EnumChatFormatting.GRAY - + " Transcendentally Amplified Magnetic Confinement Casing") - .addStructureInfo( - EnumChatFormatting.DARK_PURPLE + "2819" - + EnumChatFormatting.GRAY - + "/" - + EnumChatFormatting.DARK_GREEN - + "4831" - + EnumChatFormatting.GRAY - + "/" - + EnumChatFormatting.AQUA - + "6567" - + EnumChatFormatting.GRAY - + " Singularity Reinforced Stellar Shielding Casing") + getRingText("3943", "7279", "11005") + "Transcendentally Amplified Magnetic Confinement Casing") + .addStructureInfo(getRingText("2819", "4831", "6567") + "Singularity Reinforced Stellar Shielding Casing") + .addStructureInfo(getRingText("272", "512", "824") + "Celestial Matter Guidance Casing") + .addStructureInfo(getRingText("130", "144", "158") + "Boundless Gravitationally Severed Structure Casing") + .addStructureInfo(getRingText("9", "54", "155") + "Spatially Transcendent Gravitational Lens Block") .addStructureInfo( - EnumChatFormatting.DARK_PURPLE + "272" - + EnumChatFormatting.GRAY - + "/" - + EnumChatFormatting.DARK_GREEN - + "512" - + EnumChatFormatting.GRAY - + "/" - + EnumChatFormatting.AQUA - + "824" - + EnumChatFormatting.GRAY - + " Celestial Matter Guidance Casing") - .addStructureInfo( - EnumChatFormatting.DARK_PURPLE + "130" - + EnumChatFormatting.GRAY - + "/" - + EnumChatFormatting.DARK_GREEN - + "144" - + EnumChatFormatting.GRAY - + "/" - + EnumChatFormatting.AQUA - + "158" - + EnumChatFormatting.GRAY - + " Boundless Gravitationally Severed Structure Casing") - .addStructureInfo( - EnumChatFormatting.DARK_PURPLE + "9" - + EnumChatFormatting.GRAY - + "/" - + EnumChatFormatting.DARK_GREEN - + "54" - + EnumChatFormatting.GRAY - + "/" - + EnumChatFormatting.AQUA - + "155" - + EnumChatFormatting.GRAY - + " Spatially Transcendent Gravitational Lens Block") - .addStructureInfo( - EnumChatFormatting.DARK_PURPLE + "345" - + EnumChatFormatting.GRAY - + "/" - + EnumChatFormatting.DARK_GREEN - + "357" - + EnumChatFormatting.GRAY - + "/" - + EnumChatFormatting.AQUA - + "397" - + EnumChatFormatting.DARK_PURPLE - + " Remote" - + EnumChatFormatting.GRAY - + "/" - + EnumChatFormatting.DARK_GREEN - + "Medial" - + EnumChatFormatting.GRAY - + "/" - + EnumChatFormatting.AQUA - + "Central" - + EnumChatFormatting.GRAY - + " Graviton Flow Modulator") + getRingText("345", "357", "397") + getRingText("Remote", "Medial", "Central") + + "Graviton Flow Modulator") .addStructureInfo( EnumChatFormatting.GOLD + "36" + EnumChatFormatting.GRAY + " Stellar Energy Siphon Casing") .addStructureInfoSeparator() @@ -3473,6 +2728,20 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable, return tt; } + private static String getRingText(String oneRing, String twoRings, String threeRings) { + return EnumChatFormatting.DARK_PURPLE + oneRing + + EnumChatFormatting.GRAY + + "/" + + EnumChatFormatting.DARK_GREEN + + twoRings + + EnumChatFormatting.GRAY + + "/" + + EnumChatFormatting.AQUA + + threeRings + + EnumChatFormatting.GRAY + + " "; + } + @Override public boolean energyFlowOnRunningTick(ItemStack aStack, boolean allowProduction) { return true; @@ -3497,8 +2766,8 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable, return fuelConsumptionFactor; } - public boolean isUpgradeActive(int upgradeID) { - return upgrades[upgradeID]; + public boolean isUpgradeActive(ForgeOfGodsUpgrade upgrade) { + return upgrades.isUpgradeActive(upgrade); } public int getRingAmount() { @@ -3506,41 +2775,25 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable, } public int getTotalActiveUpgrades() { - int totalUpgrades = 0; - for (boolean upgrade : upgrades) { - if (upgrade) { - totalUpgrades++; - } - } - return totalUpgrades; + return upgrades.getTotalActiveUpgrades(); } private Text fuelUsage() { return new Text(fuelConsumption + " L/5s"); } - private Text gravitonShardAmount() { - EnumChatFormatting enoughGravitonShards = EnumChatFormatting.RED; - if (gravitonShardsAvailable >= gravitonShardCost) { - enoughGravitonShards = EnumChatFormatting.GREEN; + private Text storedFuel() { + if (internalBattery == 0) { + return new Text(stellarFuelAmount + "/" + neededStartupFuel); } - return new Text(enoughGravitonShards + Integer.toString(gravitonShardsAvailable)); - + return new Text(internalBattery + "/" + maxBatteryCharge); } - private Text storedFuel() { + private Text storedFuelHeaderText() { if (internalBattery == 0) { - return new Text( - translateToLocal("gt.blockmachines.multimachine.FOG.storedstartupfuel") + " " - + stellarFuelAmount - + "/" - + neededStartupFuel); + return new Text(translateToLocal("gt.blockmachines.multimachine.FOG.storedstartupfuel")); } - return new Text( - translateToLocal("gt.blockmachines.multimachine.FOG.storedfuel") + " " - + internalBattery - + "/" - + maxBatteryCharge); + return new Text(translateToLocal("gt.blockmachines.multimachine.FOG.storedfuel")); } private void checkInversionStatus() { @@ -3730,47 +2983,6 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable, translateToLocal("gt.blockmachines.multimachine.FOG.shardgain") + ": " + EnumChatFormatting.GRAY + sum); } - private enum FormattingMode { - - NONE, - COMMA, - EXPONENT; - - static final FormattingMode[] VALUES = values(); - - FormattingMode cycle() { - return switch (this) { - case NONE -> COMMA; - case COMMA -> EXPONENT; - case EXPONENT -> NONE; - }; - } - - String format(Number number) { - return switch (this) { - case NONE -> number.toString(); - case COMMA -> { - if (number instanceof BigInteger bi) yield formatNumbers(bi); - else yield formatNumbers(number.longValue()); - } - case EXPONENT -> { - if (number instanceof BigInteger bi) { - if (bi.compareTo(BigInteger.valueOf(1_000L)) > 0) { - yield toExponentForm(bi); - } - yield bi.toString(); - } else { - long value = number.longValue(); - if (value > 1_000L) { - yield toExponentForm(value); - } - yield Long.toString(value); - } - } - }; - } - } - private Text totalMilestoneProgress(int milestoneID) { Number progress; String suffix; @@ -3815,7 +3027,7 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable, String progressText = translateToLocal("gt.blockmachines.multimachine.FOG.progress"); Text done = new Text( translateToLocal("gt.blockmachines.multimachine.FOG.milestonecomplete") - + (formattingMode != FormattingMode.NONE ? EnumChatFormatting.DARK_RED + "?" : "")); + + (formattingMode != DEFAULT_FORMATTING_MODE ? EnumChatFormatting.DARK_RED + "?" : "")); if (milestoneProgress[milestoneID] >= 7 && !inversion) { return done; @@ -3856,26 +3068,6 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable, return new Text(progressText + ": " + EnumChatFormatting.GRAY + formattingMode.format(max) + " " + suffix); } - private Text constructionStatusText() { - return upgrades[currentUpgradeID] ? new Text(translateToLocal("fog.upgrade.respec")) - : new Text(translateToLocal("fog.upgrade.confirm")); - } - - private List constructionStatus() { - if (upgrades[currentUpgradeID]) { - return ImmutableList.of(translateToLocal("fog.upgrade.respec")); - } - return ImmutableList.of(translateToLocal("fog.upgrade.confirm")); - } - - private List upgradeMaterialRequirements() { - if (materialPaidUpgrades[Arrays.asList(UPGRADE_MATERIAL_ID_CONVERSION) - .indexOf(currentUpgradeID)]) { - return ImmutableList.of(translateToLocal("fog.button.materialrequirementsmet.tooltip")); - } - return ImmutableList.of(translateToLocal("fog.button.materialrequirements.tooltip")); - } - private void increaseBattery(int amount) { if ((internalBattery + amount) <= maxBatteryCharge) { internalBattery += amount; @@ -3921,87 +3113,22 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable, protected void setHatchRecipeMap(MTEHatchInput 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); - NBT.setBoolean("gravitonShardEjection", gravitonShardEjection); - NBT.setBoolean("secretUpgrde", secretUpgrade); - - // Store booleanArrays of all upgrades - NBTTagCompound upgradeBooleanArrayNBTTag = new NBTTagCompound(); - - int upgradeIndex = 0; - for (Boolean upgrade : upgrades) { - upgradeBooleanArrayNBTTag.setBoolean("upgrade" + upgradeIndex, upgrade); - upgradeIndex++; - } - - NBT.setTag("upgrades", upgradeBooleanArrayNBTTag); - - NBTTagCompound upgradeMaterialBooleanArrayNBTTag = new NBTTagCompound(); - - int upgradeMaterialIndex = 0; - for (Boolean upgrade : materialPaidUpgrades) { - upgradeBooleanArrayNBTTag.setBoolean("upgradeMaterial" + upgradeMaterialIndex, upgrade); - upgradeMaterialIndex++; - } - - NBT.setTag("upgradeMaterials", upgradeMaterialBooleanArrayNBTTag); - - starColors.serializeToNBT(NBT); + public RecipeMap getRecipeMap() { + return TecTechRecipeMaps.godforgeFakeUpgradeCostRecipes; + } + @Override + public void setItemNBT(NBTTagCompound NBT) { + saveGeneralNBT(NBT, false); super.saveNBTData(NBT); } @Override public void saveNBTData(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); - NBT.setBoolean("gravitonShardEjection", gravitonShardEjection); - NBT.setInteger("ringAmount", ringAmount); - NBT.setBoolean("secretUpgrade", secretUpgrade); - - // 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); - - NBTTagCompound upgradeMaterialBooleanArrayNBTTag = new NBTTagCompound(); - - int upgradeMaterialIndex = 0; - for (boolean upgrade : materialPaidUpgrades) { - upgradeMaterialBooleanArrayNBTTag.setBoolean("upgradeMaterial" + upgradeMaterialIndex, upgrade); - upgradeMaterialIndex++; - } - - NBT.setTag("upgradeMaterials", upgradeMaterialBooleanArrayNBTTag); + saveGeneralNBT(NBT, true); + // Upgrade window stored items NBTTagCompound upgradeWindowStorageNBTTag = new NBTTagCompound(); - int storageIndex = 0; for (ItemStack itemStack : inputSlotHandler.getStacks()) { if (itemStack != null) { @@ -4011,69 +3138,96 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable, } storageIndex++; } - NBT.setTag("upgradeWindowStorage", upgradeWindowStorageNBTTag); // Renderer information NBT.setInteger("rotationSpeed", rotationSpeed); NBT.setInteger("starSize", starSize); NBT.setString("selectedStarColor", selectedStarColor); + NBT.setInteger("ringAmount", ringAmount); NBT.setBoolean("isRenderActive", isRenderActive); - - starColors.serializeToNBT(NBT); + NBT.setBoolean("isRendererDisabled", isRendererDisabled); super.saveNBTData(NBT); } + private void saveGeneralNBT(NBTTagCompound NBT, boolean force) { + if (force || selectedFuelType != 0) NBT.setInteger("selectedFuelType", selectedFuelType); + if (force || internalBattery != 0) NBT.setInteger("internalBattery", internalBattery); + if (force || batteryCharging) NBT.setBoolean("batteryCharging", batteryCharging); + if (force || gravitonShardsAvailable != 0) NBT.setInteger("gravitonShardsAvailable", gravitonShardsAvailable); + if (force || gravitonShardsSpent != 0) NBT.setInteger("gravitonShardsSpent", gravitonShardsSpent); + if (force || totalRecipesProcessed != 0) NBT.setLong("totalRecipesProcessed", totalRecipesProcessed); + if (force || totalFuelConsumed != 0) NBT.setLong("totalFuelConsumed", totalFuelConsumed); + if (force || stellarFuelAmount != 0) NBT.setInteger("starFuelStored", stellarFuelAmount); + if (force || gravitonShardEjection) NBT.setBoolean("gravitonShardEjection", gravitonShardEjection); + if (force || secretUpgrade) NBT.setBoolean("secretUpgrade", secretUpgrade); + + // Fields with non-zero defaults + if (force || fuelConsumptionFactor != DEFAULT_FUEL_CONSUMPTION_FACTOR) { + NBT.setInteger("fuelConsumptionFactor", fuelConsumptionFactor); + } + if (force || maxBatteryCharge != DEFAULT_MAX_BATTERY_CHARGE) { + NBT.setInteger("batterySize", maxBatteryCharge); + } + if (force || !DEFAULT_TOTAL_POWER.equals(totalPowerConsumed)) { + NBT.setByteArray("totalPowerConsumed", totalPowerConsumed.toByteArray()); + } + if (force || formattingMode != DEFAULT_FORMATTING_MODE) { + NBT.setInteger("formattingMode", formattingMode.ordinal()); + } + + upgrades.serializeToNBT(NBT, force); + starColors.serializeToNBT(NBT); + } + @Override public void loadNBTData(NBTTagCompound NBT) { 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"); gravitonShardEjection = NBT.getBoolean("gravitonShardEjection"); - ringAmount = NBT.getInteger("ringAmount"); secretUpgrade = NBT.getBoolean("secretUpgrade"); - NBTTagCompound tempBooleanTag = NBT.getCompoundTag("upgrades"); - - for (int upgradeIndex = 0; upgradeIndex < 31; upgradeIndex++) { - boolean upgrade = tempBooleanTag.getBoolean("upgrade" + upgradeIndex); - upgrades[upgradeIndex] = upgrade; + // Fields with non-zero defaults + if (NBT.hasKey("fuelConsumptionFactor")) { + fuelConsumptionFactor = NBT.getInteger("fuelConsumptionFactor"); } - - tempBooleanTag = NBT.getCompoundTag("upgradeMaterials"); - - for (int upgradeIndex = 0; upgradeIndex < 7; upgradeIndex++) { - boolean upgrade = tempBooleanTag.getBoolean("upgradeMaterial" + upgradeIndex); - materialPaidUpgrades[upgradeIndex] = upgrade; + if (NBT.hasKey("batterySize")) { + maxBatteryCharge = NBT.getInteger("batterySize"); + } + if (NBT.hasKey("totalPowerConsumed")) { + totalPowerConsumed = new BigInteger(NBT.getByteArray("totalPowerConsumed")); + } + if (NBT.hasKey("formattingMode")) { + int index = MathHelper.clamp_int(NBT.getInteger("formattingMode"), 0, MilestoneFormatter.VALUES.length); + formattingMode = MilestoneFormatter.VALUES[index]; } + // Stored items NBTTagCompound tempItemTag = NBT.getCompoundTag("upgradeWindowStorage"); - for (int index = 0; index < 16; index++) { - int stackSize = tempItemTag.getInteger(index + "stacksizeOfStoredUpgradeItems"); ItemStack itemStack = ItemStack.loadItemStackFromNBT(NBT.getCompoundTag(index + "storedUpgradeItem")); - if (itemStack != null) { storedUpgradeWindowItems[index] = itemStack.splitStack(stackSize); } } // Renderer information - rotationSpeed = NBT.getInteger("rotationSpeed"); - starSize = NBT.getInteger("starSize"); - selectedStarColor = NBT.getString("selectedStarColor"); + if (NBT.hasKey("rotationSpeed")) rotationSpeed = NBT.getInteger("rotationSpeed"); + if (NBT.hasKey("starSize")) starSize = NBT.getInteger("starSize"); + if (NBT.hasKey("selectedStarColor")) selectedStarColor = NBT.getString("selectedStarColor"); + if (NBT.hasKey("ringAmount")) ringAmount = NBT.getInteger("ringAmount"); isRenderActive = NBT.getBoolean("isRenderActive"); + isRendererDisabled = NBT.getBoolean("isRendererDisabled"); + upgrades.rebuildFromNBT(NBT); starColors.rebuildFromNBT(NBT); super.loadNBTData(NBT); diff --git a/src/main/java/tectech/thing/metaTileEntity/multi/godforge/MTEMoltenModule.java b/src/main/java/tectech/thing/metaTileEntity/multi/godforge/MTEMoltenModule.java index 51bfe51ac0..eace01bb6a 100644 --- a/src/main/java/tectech/thing/metaTileEntity/multi/godforge/MTEMoltenModule.java +++ b/src/main/java/tectech/thing/metaTileEntity/multi/godforge/MTEMoltenModule.java @@ -11,8 +11,6 @@ import static net.minecraft.util.EnumChatFormatting.YELLOW; import java.math.BigInteger; import java.util.ArrayList; -import javax.annotation.Nonnull; - import net.minecraft.util.EnumChatFormatting; import org.jetbrains.annotations.NotNull; @@ -54,7 +52,7 @@ public class MTEMoltenModule extends MTEBaseModule { @NotNull @Override - protected CheckRecipeResult validateRecipe(@Nonnull GTRecipe recipe) { + protected CheckRecipeResult validateRecipe(@NotNull GTRecipe recipe) { if (recipe.mSpecialValue > getHeat()) { return CheckRecipeResultRegistry.insufficientHeat(recipe.mSpecialValue); } @@ -70,9 +68,9 @@ public class MTEMoltenModule extends MTEBaseModule { return CheckRecipeResultRegistry.SUCCESSFUL; } - @Nonnull + @NotNull @Override - protected OverclockCalculator createOverclockCalculator(@Nonnull GTRecipe recipe) { + protected OverclockCalculator createOverclockCalculator(@NotNull GTRecipe recipe) { return super.createOverclockCalculator(recipe).setEUt(getProcessingVoltage()) .setRecipeHeat(recipe.mSpecialValue) .setHeatOC(true) @@ -85,7 +83,7 @@ public class MTEMoltenModule extends MTEBaseModule { @NotNull @Override - protected CheckRecipeResult onRecipeStart(@Nonnull GTRecipe recipe) { + protected CheckRecipeResult onRecipeStart(@NotNull GTRecipe recipe) { if (!addEUToGlobalEnergyMap(userUUID, -calculatedEut * duration)) { return CheckRecipeResultRegistry.insufficientPower(calculatedEut * duration); } diff --git a/src/main/java/tectech/thing/metaTileEntity/multi/godforge/MTEPlasmaModule.java b/src/main/java/tectech/thing/metaTileEntity/multi/godforge/MTEPlasmaModule.java index 29675ae5ce..05ae43e341 100644 --- a/src/main/java/tectech/thing/metaTileEntity/multi/godforge/MTEPlasmaModule.java +++ b/src/main/java/tectech/thing/metaTileEntity/multi/godforge/MTEPlasmaModule.java @@ -14,8 +14,6 @@ import static net.minecraft.util.EnumChatFormatting.YELLOW; import java.math.BigInteger; import java.util.ArrayList; -import javax.annotation.Nonnull; - import net.minecraft.entity.player.EntityPlayer; import net.minecraft.util.EnumChatFormatting; @@ -77,7 +75,7 @@ public class MTEPlasmaModule extends MTEBaseModule { @NotNull @Override - protected CheckRecipeResult validateRecipe(@Nonnull GTRecipe recipe) { + protected CheckRecipeResult validateRecipe(@NotNull GTRecipe recipe) { wirelessEUt = (long) recipe.mEUt * getMaxParallel(); if (getUserEU(userUUID).compareTo(BigInteger.valueOf(wirelessEUt * recipe.mDuration)) < 0) { return CheckRecipeResultRegistry.insufficientPower(wirelessEUt * recipe.mDuration); @@ -91,7 +89,7 @@ public class MTEPlasmaModule extends MTEBaseModule { @NotNull @Override - protected CheckRecipeResult onRecipeStart(@Nonnull GTRecipe recipe) { + protected CheckRecipeResult onRecipeStart(@NotNull GTRecipe recipe) { wirelessEUt = (long) recipe.mEUt * maxParallel; if (!addEUToGlobalEnergyMap(userUUID, -calculatedEut * duration)) { return CheckRecipeResultRegistry.insufficientPower(wirelessEUt * recipe.mDuration); @@ -106,9 +104,9 @@ public class MTEPlasmaModule extends MTEBaseModule { return CheckRecipeResultRegistry.SUCCESSFUL; } - @Nonnull + @NotNull @Override - protected OverclockCalculator createOverclockCalculator(@Nonnull GTRecipe recipe) { + protected OverclockCalculator createOverclockCalculator(@NotNull GTRecipe recipe) { return super.createOverclockCalculator(recipe).setEUt(getProcessingVoltage()) .setDurationDecreasePerOC(getOverclockTimeFactor()); } diff --git a/src/main/java/tectech/thing/metaTileEntity/multi/godforge/MTESmeltingModule.java b/src/main/java/tectech/thing/metaTileEntity/multi/godforge/MTESmeltingModule.java index ba8e5f2666..1e499b3507 100644 --- a/src/main/java/tectech/thing/metaTileEntity/multi/godforge/MTESmeltingModule.java +++ b/src/main/java/tectech/thing/metaTileEntity/multi/godforge/MTESmeltingModule.java @@ -17,8 +17,6 @@ import java.util.Collection; import java.util.Collections; import java.util.List; -import javax.annotation.Nonnull; - import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.EnumChatFormatting; @@ -70,7 +68,7 @@ public class MTESmeltingModule extends MTEBaseModule { return furnaceMode ? RecipeMaps.furnaceRecipes : RecipeMaps.blastFurnaceRecipes; } - @Nonnull + @NotNull @Override public Collection> getAvailableRecipeMaps() { return Arrays.asList(RecipeMaps.blastFurnaceRecipes, RecipeMaps.furnaceRecipes); @@ -89,7 +87,7 @@ public class MTESmeltingModule extends MTEBaseModule { @NotNull @Override - protected CheckRecipeResult validateRecipe(@Nonnull GTRecipe recipe) { + protected CheckRecipeResult validateRecipe(@NotNull GTRecipe recipe) { if (recipe.mSpecialValue > getHeat()) { return CheckRecipeResultRegistry.insufficientHeat(recipe.mSpecialValue); @@ -108,7 +106,7 @@ public class MTESmeltingModule extends MTEBaseModule { @NotNull @Override - protected CheckRecipeResult onRecipeStart(@Nonnull GTRecipe recipe) { + protected CheckRecipeResult onRecipeStart(@NotNull GTRecipe recipe) { if (!addEUToGlobalEnergyMap(userUUID, -calculatedEut * duration)) { return CheckRecipeResultRegistry.insufficientPower(calculatedEut * duration); } @@ -124,9 +122,9 @@ public class MTESmeltingModule extends MTEBaseModule { return CheckRecipeResultRegistry.SUCCESSFUL; } - @Nonnull + @NotNull @Override - protected OverclockCalculator createOverclockCalculator(@Nonnull GTRecipe recipe) { + protected OverclockCalculator createOverclockCalculator(@NotNull GTRecipe recipe) { return super.createOverclockCalculator(recipe).setEUt(getProcessingVoltage()) .setRecipeHeat(recipe.mSpecialValue) .setHeatOC(true) diff --git a/src/main/java/tectech/thing/metaTileEntity/multi/godforge/color/ForgeOfGodsStarColor.java b/src/main/java/tectech/thing/metaTileEntity/multi/godforge/color/ForgeOfGodsStarColor.java index 9593c1db95..900ef76f63 100644 --- a/src/main/java/tectech/thing/metaTileEntity/multi/godforge/color/ForgeOfGodsStarColor.java +++ b/src/main/java/tectech/thing/metaTileEntity/multi/godforge/color/ForgeOfGodsStarColor.java @@ -11,9 +11,9 @@ import net.minecraft.network.PacketBuffer; import org.jetbrains.annotations.Nullable; -import com.cleanroommc.modularui.utils.Color; import com.gtnewhorizons.modularui.api.drawable.IDrawable; import com.gtnewhorizons.modularui.api.drawable.shapes.Rectangle; +import com.gtnewhorizons.modularui.api.math.Color; import tectech.thing.gui.TecTechUITextures; @@ -29,6 +29,7 @@ public class ForgeOfGodsStarColor { public static final int DEFAULT_GREEN = 204; public static final int DEFAULT_BLUE = 255; public static final float DEFAULT_GAMMA = 3.0f; + public static final int DEFAULT_CYCLE_SPEED = 1; public static final ForgeOfGodsStarColor DEFAULT = new ForgeOfGodsStarColor("Default") .addColor(DEFAULT_RED, DEFAULT_GREEN, DEFAULT_BLUE, DEFAULT_GAMMA) @@ -43,15 +44,29 @@ public class ForgeOfGodsStarColor { .setCustomDrawable(TecTechUITextures.PICTURE_RAINBOW_SQUARE) .registerPreset(); - public static final ForgeOfGodsStarColor CLOUD_PICK = new ForgeOfGodsStarColor("Cloud's Pick") - .addColor(DEFAULT_RED, DEFAULT_GREEN, DEFAULT_BLUE, DEFAULT_GAMMA) // todo @cloud + public static final ForgeOfGodsStarColor CLOUDS_PICK = new ForgeOfGodsStarColor("Cloud's Pick") + .addColor(255, 255, 0, 0.8f) + .addColor(0, 0, 0, 0) + .addColor(0, 255, 255, 0.4f) + .addColor(0, 0, 0, 0) + .setCycleSpeed(1) + .setCustomDrawable( + new Rectangle() + .setColor(Color.rgb(255, 255, 0), Color.rgb(0, 0, 0), Color.rgb(0, 0, 0), Color.rgb(0, 255, 255))) .registerPreset(); - public static final ForgeOfGodsStarColor MAYA_PICK = new ForgeOfGodsStarColor("Maya's Pick") - .addColor(91, 206, 250, 3.0f) - .addColor(245, 169, 184, 3.0f) + public static final ForgeOfGodsStarColor MAYAS_PICK = new ForgeOfGodsStarColor("Maya's Pick") + .addColor(0, 0, 0, 0.0f) + .addColor(109, 201, 225, 1.0f) .addColor(255, 255, 255, 3.0f) + .addColor(255, 172, 210, 1.0f) .setCycleSpeed(1) + .setCustomDrawable( + new Rectangle().setColor( + Color.rgb(255, 172, 210), + Color.rgb(255, 255, 255), + Color.rgb(0, 0, 0), + Color.rgb(109, 201, 225))) .registerPreset(); public static List getDefaultColors() { @@ -68,7 +83,7 @@ public class ForgeOfGodsStarColor { // Star render settings private final List settings = new ArrayList<>(); - private int cycleSpeed = 1; + private int cycleSpeed = DEFAULT_CYCLE_SPEED; protected ForgeOfGodsStarColor(String name) { this(name, LATEST_VERSION); diff --git a/src/main/java/tectech/thing/metaTileEntity/multi/godforge/structure/ForgeOfGodsRingsStructureString.java b/src/main/java/tectech/thing/metaTileEntity/multi/godforge/structure/ForgeOfGodsRingsStructureString.java new file mode 100644 index 0000000000..116dc7b5ba --- /dev/null +++ b/src/main/java/tectech/thing/metaTileEntity/multi/godforge/structure/ForgeOfGodsRingsStructureString.java @@ -0,0 +1,5105 @@ +package tectech.thing.metaTileEntity.multi.godforge.structure; + +import static tectech.util.TTUtility.replaceLetters; + +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 ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " } }; + public static final String[][] SECOND_RING_AIR = replaceLetters(SECOND_RING, "L"); + public static final String[][] THIRD_RING_AIR = replaceLetters(THIRD_RING, "L"); + +} diff --git a/src/main/java/tectech/thing/metaTileEntity/multi/godforge/structure/ForgeOfGodsStructureString.java b/src/main/java/tectech/thing/metaTileEntity/multi/godforge/structure/ForgeOfGodsStructureString.java new file mode 100644 index 0000000000..277db1d1e1 --- /dev/null +++ b/src/main/java/tectech/thing/metaTileEntity/multi/godforge/structure/ForgeOfGodsStructureString.java @@ -0,0 +1,5435 @@ +package tectech.thing.metaTileEntity.multi.godforge.structure; + +import static tectech.util.TTUtility.appendStringArrays; +import static tectech.util.TTUtility.replaceLetters; + +public abstract class ForgeOfGodsStructureString { + + public static final String[][] BEAM_SHAFT = { { + " ", + " ", + " ", + " ", + " ", + " ", + " 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 ", + " 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 ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " } }; + public static final String[][] FIRST_RING = { { + " ", + " ", + " ", + " ", + " ", + " 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 ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " } }; + public static final String[][] MAIN_STRUCTURE = appendStringArrays(BEAM_SHAFT, FIRST_RING); + public static final String[][] FIRST_RING_AIR = replaceLetters(FIRST_RING, "L"); +} diff --git a/src/main/java/tectech/thing/metaTileEntity/multi/godforge/upgrade/ForgeOfGodsUpgrade.java b/src/main/java/tectech/thing/metaTileEntity/multi/godforge/upgrade/ForgeOfGodsUpgrade.java new file mode 100644 index 0000000000..05b5f491d7 --- /dev/null +++ b/src/main/java/tectech/thing/metaTileEntity/multi/godforge/upgrade/ForgeOfGodsUpgrade.java @@ -0,0 +1,475 @@ +package tectech.thing.metaTileEntity.multi.godforge.upgrade; + +import static tectech.thing.metaTileEntity.multi.godforge.upgrade.ForgeOfGodsUpgrade.BGWindowSize.*; +import static tectech.thing.metaTileEntity.multi.godforge.util.MilestoneIcon.*; +import static tectech.thing.metaTileEntity.multi.godforge.util.UpgradeColor.*; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.EnumMap; +import java.util.List; +import java.util.Set; +import java.util.function.UnaryOperator; + +import net.minecraft.item.ItemStack; +import net.minecraft.util.StatCollector; + +import com.google.common.collect.ImmutableSet; +import com.gtnewhorizons.modularui.api.drawable.UITexture; +import com.gtnewhorizons.modularui.api.math.Pos2d; +import com.gtnewhorizons.modularui.api.math.Size; + +import it.unimi.dsi.fastutil.objects.ObjectArrayList; +import it.unimi.dsi.fastutil.objects.ObjectList; +import tectech.thing.metaTileEntity.multi.godforge.util.MilestoneIcon; +import tectech.thing.metaTileEntity.multi.godforge.util.UpgradeColor; + +public enum ForgeOfGodsUpgrade { + + START, + IGCC, + STEM, + CFCE, + GISS, + FDIM, + SA, + GPCI, + REC, + GEM, + CTCDD, + QGPIU, + SEFCP, + TCT, + GGEBE, + TPTP, + DOP, + CNTI, + EPEC, + IMKG, + NDPE, + POS, + DOR, + NGMS, + SEDS, + PA, + CD, + TSE, + TBF, + EE, + END, + + ; + + public static final ForgeOfGodsUpgrade[] VALUES = values(); + + static final Set SPLIT_UPGRADES; + + static { + // Build upgrade data. Done here due to potential forward references + + // spotless:off + + START.build(b -> b + .background(BLUE, COMPOSITION) + .windowSize(LARGE) + .treePos(126, 56)); + + IGCC.build(b -> b + .prereqs(START) + .cost(1) + .background(BLUE, CONVERSION) + .treePos(126, 116)); + + STEM.build(b -> b + .prereqs(IGCC) + .cost(1) + .background(BLUE, CATALYST) + .treePos(96, 176)); + + CFCE.build(b -> b + .prereqs(IGCC) + .cost(1) + .background(BLUE, CATALYST) + .treePos(156, 176)); + + GISS.build(b -> b + .prereqs(STEM) + .cost(1) + .background(BLUE, CHARGE) + .treePos(66, 236)); + + FDIM.build(b -> b + .prereqs(STEM, CFCE) + .cost(1) + .background(BLUE, COMPOSITION) + .treePos(126, 236)); + + SA.build(b -> b + .prereqs(CFCE) + .cost(1) + .background(BLUE, CONVERSION) + .treePos(186, 236)); + + GPCI.build(b -> b + .prereqs(FDIM) + .cost(2) + .background(BLUE, COMPOSITION) + .treePos(126, 296)); + + REC.build(b -> b + .prereqs(GISS, FDIM) + .requireAllPrereqs() + .cost(2) + .background(RED, CHARGE) + .treePos(56, 356)); + + GEM.build(b -> b + .prereqs(GPCI) + .cost(2) + .background(BLUE, CATALYST) + .treePos(126, 356)); + + CTCDD.build(b -> b + .prereqs(GPCI, SA) + .requireAllPrereqs() + .cost(2) + .background(RED, CONVERSION) + .treePos(196, 356)); + + QGPIU.build(b -> b + .prereqs(REC, CTCDD) + .cost(2) + .background(BLUE, CATALYST) + .treePos(126, 416)); + + SEFCP.build(b -> b + .prereqs(QGPIU) + .cost(3) + .background(PURPLE, CATALYST) + .treePos(66, 476)); + + TCT.build(b -> b + .prereqs(QGPIU) + .cost(3) + .background(ORANGE, CONVERSION) + .treePos(126, 476)); + + GGEBE.build(b -> b + .prereqs(QGPIU) + .cost(3) + .background(GREEN, CHARGE) + .treePos(186, 476)); + + TPTP.build(b -> b + .prereqs(GGEBE) + .cost(4) + .background(GREEN, CONVERSION) + .treePos(246, 496)); + + DOP.build(b -> b + .prereqs(CNTI) + .cost(4) + .background(PURPLE, CONVERSION) + .treePos(6, 556)); + + CNTI.build(b -> b + .prereqs(SEFCP) + .cost(3) + .background(PURPLE, CHARGE) + .treePos(66, 536)); + + EPEC.build(b -> b + .prereqs(TCT) + .cost(3) + .background(ORANGE, CONVERSION) + .treePos(126, 536)); + + IMKG.build(b -> b + .prereqs(GGEBE) + .cost(3) + .background(GREEN, CHARGE) + .treePos(186, 536)); + + NDPE.build(b -> b + .prereqs(CNTI) + .cost(3) + .background(PURPLE, CHARGE) + .treePos(66, 596)); + + POS.build(b -> b + .prereqs(EPEC) + .cost(3) + .background(ORANGE, CONVERSION) + .treePos(126, 596)); + + DOR.build(b -> b + .prereqs(IMKG) + .cost(3) + .background(GREEN, CONVERSION) + .treePos(186, 596)); + + NGMS.build(b -> b + .prereqs(NDPE, POS, DOR) + .cost(4) + .background(BLUE, CHARGE) + .treePos(126, 656)); + + SEDS.build(b -> b + .prereqs(NGMS) + .cost(5) + .background(BLUE, CONVERSION) + .treePos(126, 718)); + + PA.build(b -> b + .prereqs(SEDS) + .cost(6) + .background(BLUE, CONVERSION) + .treePos(36, 758)); + + CD.build(b -> b + .prereqs(PA) + .cost(7) + .background(BLUE, COMPOSITION) + .treePos(36, 848)); + + TSE.build(b -> b + .prereqs(CD) + .cost(8) + .background(BLUE, CATALYST) + .treePos(126, 888)); + + TBF.build(b -> b + .prereqs(TSE) + .cost(9) + .background(BLUE, CHARGE) + .treePos(216, 848)); + + EE.build(b -> b + .prereqs(TBF) + .cost(10) + .background(BLUE, COMPOSITION) + .treePos(216, 758)); + + END.build(b -> b + .prereqs(EE) + .cost(12) + .background(BLUE, COMPOSITION) + .windowSize(LARGE) + .treePos(126, 798)); + + // spotless:on + + // Build split upgrade set + SPLIT_UPGRADES = ImmutableSet.of(SEFCP, TCT, GGEBE); + + // Build inverse dependents mapping + EnumMap> dependencies = new EnumMap<>(ForgeOfGodsUpgrade.class); + for (ForgeOfGodsUpgrade upgrade : VALUES) { + for (ForgeOfGodsUpgrade prerequisite : upgrade.prerequisites) { + dependencies.computeIfAbsent(prerequisite, $ -> new ArrayList<>()) + .add(upgrade); + } + } + for (var entry : dependencies.entrySet()) { + ForgeOfGodsUpgrade upgrade = entry.getKey(); + List deps = entry.getValue(); + if (deps != null) { + upgrade.dependents = deps.toArray(new ForgeOfGodsUpgrade[0]); + } + } + } + + // Static tree linking + private ForgeOfGodsUpgrade[] prerequisites; + private boolean requireAllPrerequisites; + + // Cost + private int shardCost; + private final List extraCost = new ArrayList<>(); + + // UI + private UpgradeColor color; + private MilestoneIcon icon; + private BGWindowSize windowSize; + private Pos2d treePos; + + // Pre-generated data + private ForgeOfGodsUpgrade[] dependents = new ForgeOfGodsUpgrade[0]; + private final String name; + private final String nameShort; + private final String bodyText; + private final String loreText; + + ForgeOfGodsUpgrade() { + this.name = "fog.upgrade.tt." + ordinal(); + this.nameShort = "fog.upgrade.tt.short." + ordinal(); + this.bodyText = "fog.upgrade.text." + ordinal(); + this.loreText = "fog.upgrade.lore." + ordinal(); + } + + private void build(UnaryOperator u) { + Builder b = u.apply(new Builder()); + + this.prerequisites = b.prerequisites != null ? b.prerequisites.toArray(new ForgeOfGodsUpgrade[0]) + : new ForgeOfGodsUpgrade[0]; + this.requireAllPrerequisites = b.requireAllPrerequisites; + this.shardCost = b.shardCost; + this.color = b.color; + this.icon = b.icon; + this.windowSize = b.windowSize; + this.treePos = b.treePos; + } + + public void addExtraCost(ItemStack... cost) { + if (extraCost.size() + cost.length > 12) { + throw new IllegalArgumentException("Too many inputs for Godforge upgrade cost, cannot be more than 12!"); + } + extraCost.addAll(Arrays.asList(cost)); + } + + public ForgeOfGodsUpgrade[] getPrerequisites() { + return prerequisites; + } + + public boolean requiresAllPrerequisites() { + return requireAllPrerequisites; + } + + public ForgeOfGodsUpgrade[] getDependents() { + return dependents; + } + + public int getShardCost() { + return shardCost; + } + + public boolean hasExtraCost() { + return !extraCost.isEmpty(); + } + + public ItemStack[] getExtraCost() { + return extraCost.toArray(new ItemStack[0]); + } + + public UITexture getBackground() { + return color.getBackground(); + } + + public UITexture getOverlay() { + return color.getOverlay(); + } + + public UITexture getSymbol() { + return icon.getSymbol(); + } + + public float getSymbolWidthRatio() { + return icon.getWidthRatio(); + } + + public Size getWindowSize() { + return windowSize.getWindowSize(); + } + + public int getLoreYPos() { + return windowSize.getLoreY(); + } + + public Pos2d getTreePos() { + return treePos; + } + + public String getNameText() { + return StatCollector.translateToLocal(name); + } + + public String getShortNameText() { + return StatCollector.translateToLocal(nameShort); + } + + public String getBodyText() { + return StatCollector.translateToLocal(bodyText); + } + + public String getLoreText() { + return StatCollector.translateToLocal(loreText); + } + + public static class Builder { + + // Tree linking + private ObjectList prerequisites; + private boolean requireAllPrerequisites; + + // Cost + private int shardCost; + + // UI + private UpgradeColor color = BLUE; + private MilestoneIcon icon = CHARGE; + private BGWindowSize windowSize = STANDARD; + private Pos2d treePos = new Pos2d(0, 0); + + private Builder() {} + + public Builder prereqs(ForgeOfGodsUpgrade... prereqs) { + if (this.prerequisites != null) { + throw new IllegalArgumentException("Cannot repeat calls to ForgeOfGodsUpgrade$Builder#prereqs"); + } + this.prerequisites = new ObjectArrayList<>(prereqs); + return this; + } + + public Builder requireAllPrereqs() { + this.requireAllPrerequisites = true; + return this; + } + + // Cost + public Builder cost(int shards) { + this.shardCost = shards; + return this; + } + + // UI + public Builder background(UpgradeColor color, MilestoneIcon icon) { + this.color = color; + this.icon = icon; + return this; + } + + public Builder windowSize(BGWindowSize windowSize) { + this.windowSize = windowSize; + return this; + } + + public Builder treePos(int x, int y) { + this.treePos = new Pos2d(x, y); + return this; + } + } + + enum BGWindowSize { + + STANDARD(250, 250, 110), + LARGE(300, 300, 85), + + ; + + private final Size size; + private final int loreY; + + BGWindowSize(int width, int height, int loreY) { + this.size = new Size(width, height); + this.loreY = loreY; + } + + public Size getWindowSize() { + return size; + } + + public int getLoreY() { + return loreY; + } + } +} diff --git a/src/main/java/tectech/thing/metaTileEntity/multi/godforge/upgrade/UpgradeStorage.java b/src/main/java/tectech/thing/metaTileEntity/multi/godforge/upgrade/UpgradeStorage.java new file mode 100644 index 0000000000..a473cc15ed --- /dev/null +++ b/src/main/java/tectech/thing/metaTileEntity/multi/godforge/upgrade/UpgradeStorage.java @@ -0,0 +1,285 @@ +package tectech.thing.metaTileEntity.multi.godforge.upgrade; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.EnumMap; +import java.util.stream.Stream; + +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.network.PacketBuffer; + +import com.gtnewhorizons.modularui.api.forge.ItemStackHandler; +import com.gtnewhorizons.modularui.common.widget.FakeSyncWidget; + +import gregtech.api.util.GTUtility; + +public class UpgradeStorage { + + private final EnumMap unlockedUpgrades = new EnumMap<>(ForgeOfGodsUpgrade.class); + + public UpgradeStorage() { + for (ForgeOfGodsUpgrade upgrade : ForgeOfGodsUpgrade.VALUES) { + unlockedUpgrades.put(upgrade, new UpgradeData()); + } + } + + /** Whether the passed upgrade is already unlocked (purchased). */ + public boolean isUpgradeActive(ForgeOfGodsUpgrade upgrade) { + return getData(upgrade).isActive(); + } + + public boolean isCostPaid(ForgeOfGodsUpgrade upgrade) { + return getData(upgrade).isCostPaid(); + } + + public short[] getPaidCosts(ForgeOfGodsUpgrade upgrade) { + return getData(upgrade).amountsPaid; + } + + /** Handles consuming items and updating state if successful. Does NOT handle graviton shards! */ + public void payCost(ForgeOfGodsUpgrade upgrade, ItemStackHandler handler) { + UpgradeData data = getData(upgrade); + + if (!upgrade.hasExtraCost()) { + data.costPaid = true; + return; + } + + ItemStack[] extraCost = upgrade.getExtraCost(); + for (int i = 0; i < handler.getSlots(); i++) { + ItemStack inputStack = handler.getStackInSlot(i); + if (inputStack == null) continue; + + for (int j = 0; j < extraCost.length; j++) { + ItemStack costStack = extraCost[j]; + int alreadyPaid = data.amountsPaid[j]; + if (alreadyPaid >= costStack.stackSize) continue; + + if (GTUtility.areStacksEqual(inputStack, costStack)) { + int maxExtract = costStack.stackSize - alreadyPaid; + ItemStack extractedStack = handler.extractItem(i, maxExtract, false); + if (extractedStack != null) { + data.amountsPaid[j] += extractedStack.stackSize; + } + } + } + } + + // Check if all costs are paid + for (int i = 0; i < extraCost.length; i++) { + ItemStack costStack = extraCost[i]; + if (costStack == null) continue; + if (data.amountsPaid[i] < costStack.stackSize) { + return; + } + } + data.costPaid = true; + } + + public void unlockUpgrade(ForgeOfGodsUpgrade upgrade) { + getData(upgrade).active = true; + } + + public void respecUpgrade(ForgeOfGodsUpgrade upgrade) { + getData(upgrade).active = false; + } + + /** + * Whether the passed upgrade can be unlocked, checking that the prerequisites are satisfied. + */ + public boolean checkPrerequisites(ForgeOfGodsUpgrade upgrade) { + ForgeOfGodsUpgrade[] prereqs = upgrade.getPrerequisites(); + if (prereqs.length == 0) return true; + + Stream prereqStream = Arrays.stream(prereqs) + .map(unlockedUpgrades::get); + + if (upgrade.requiresAllPrerequisites()) { + return prereqStream.allMatch(UpgradeData::isActive); + } + return prereqStream.anyMatch(UpgradeData::isActive); + } + + public boolean checkSplit(ForgeOfGodsUpgrade upgrade, int maxSplitUpgrades) { + if (ForgeOfGodsUpgrade.SPLIT_UPGRADES.contains(upgrade)) { + return ForgeOfGodsUpgrade.SPLIT_UPGRADES.stream() + .map(unlockedUpgrades::get) + .filter(UpgradeData::isActive) + .count() < maxSplitUpgrades; + } + return true; + } + + public boolean checkCost(ForgeOfGodsUpgrade upgrade, int availableShards) { + if (upgrade.getShardCost() > availableShards) return false; + return !upgrade.hasExtraCost() || isCostPaid(upgrade); + } + + /** @return true if any dependent upgrades are currently unlocked. */ + public boolean checkDependents(ForgeOfGodsUpgrade upgrade) { + for (ForgeOfGodsUpgrade dependent : upgrade.getDependents()) { + if (!isUpgradeActive(dependent)) continue; + + // Check failed, this dependent strictly requires the passed upgrade + if (dependent.requiresAllPrerequisites()) return false; + + // Check for some other prerequisite upgrade of the dependent to make sure that + // if the passed upgrade is removed, that upgrade is still valid + if (Arrays.stream(dependent.getPrerequisites()) + .map(unlockedUpgrades::get) + .filter(UpgradeData::isActive) + .count() <= 1) { + return false; + } + } + return true; + } + + private UpgradeData getData(ForgeOfGodsUpgrade upgrade) { + return unlockedUpgrades.computeIfAbsent(upgrade, $ -> new UpgradeData()); + } + + private boolean hasAnyProgress() { + if (isUpgradeActive(ForgeOfGodsUpgrade.START)) return true; + + // Check if any costs have been paid in any upgrades + for (var entry : unlockedUpgrades.entrySet()) { + ForgeOfGodsUpgrade upgrade = entry.getKey(); + if (upgrade.hasExtraCost()) { + UpgradeData data = entry.getValue(); + if (data.isCostPaid()) return true; + for (int i = 0; i < data.amountsPaid.length; i++) { + if (data.amountsPaid[i] != 0) return true; + } + } + } + + return false; + } + + public int getTotalActiveUpgrades() { + return (int) unlockedUpgrades.values() + .stream() + .map(UpgradeData::isActive) + .count(); + } + + public Collection getAllUpgrades() { + return unlockedUpgrades.keySet(); + } + + public void resetAll() { + for (UpgradeData data : unlockedUpgrades.values()) { + data.active = false; + data.costPaid = false; + } + } + + public void unlockAll() { + for (UpgradeData data : unlockedUpgrades.values()) { + data.active = true; + } + } + + public void serializeToNBT(NBTTagCompound NBT, boolean force) { + if (!force && !hasAnyProgress()) return; + + NBTTagCompound upgradeTag = new NBTTagCompound(); + for (ForgeOfGodsUpgrade upgrade : ForgeOfGodsUpgrade.VALUES) { + UpgradeData data = unlockedUpgrades.get(upgrade); + upgradeTag.setBoolean("upgrade" + upgrade.ordinal(), data.isActive()); + if (upgrade.hasExtraCost()) { + NBTTagCompound costTag = new NBTTagCompound(); + costTag.setBoolean("paid", data.isCostPaid()); + for (int i = 0; i < data.amountsPaid.length; i++) { + costTag.setShort("costPaid" + i, data.amountsPaid[i]); + } + upgradeTag.setTag("extraCost" + upgrade.ordinal(), costTag); + } + } + NBT.setTag("upgrades", upgradeTag); + } + + public void rebuildFromNBT(NBTTagCompound NBT) { + if (!NBT.hasKey("upgrades")) return; + + NBTTagCompound upgradeTag = NBT.getCompoundTag("upgrades"); + for (int i = 0; i < ForgeOfGodsUpgrade.VALUES.length; i++) { + ForgeOfGodsUpgrade upgrade = ForgeOfGodsUpgrade.VALUES[i]; + UpgradeData data = unlockedUpgrades.get(upgrade); + data.active = upgradeTag.getBoolean("upgrade" + upgrade.ordinal()); + if (upgrade.hasExtraCost() && upgradeTag.hasKey("extraCost" + upgrade.ordinal())) { + NBTTagCompound costTag = upgradeTag.getCompoundTag("extraCost" + upgrade.ordinal()); + data.costPaid = costTag.getBoolean("paid"); + for (int j = 0; j < data.amountsPaid.length; j++) { + data.amountsPaid[j] = costTag.getShort("costPaid" + j); + } + } + } + } + + /** Sync widget to sync a single upgrade. */ + public FakeSyncWidget getSyncer(ForgeOfGodsUpgrade upgrade) { + return new FakeSyncWidget<>( + () -> unlockedUpgrades.get(upgrade), + val -> unlockedUpgrades.put(upgrade, val), + UpgradeData::writeToBuffer, + UpgradeData::readFromBuffer); + } + + /** Sync widget to sync the full upgrade tree. */ + public FakeSyncWidget getFullSyncer() { + return new FakeSyncWidget.ListSyncer<>(() -> new ArrayList<>(unlockedUpgrades.values()), val -> { + for (int i = 0; i < val.size(); i++) { + unlockedUpgrades.put(ForgeOfGodsUpgrade.VALUES[i], val.get(i)); + } + }, UpgradeData::writeToBuffer, UpgradeData::readFromBuffer); + } + + private static class UpgradeData { + + private boolean active; + private boolean costPaid; + private final short[] amountsPaid = new short[12]; + + public boolean isActive() { + return active; + } + + public boolean isCostPaid() { + return costPaid; + } + + private static void writeToBuffer(PacketBuffer buf, UpgradeData data) { + buf.writeBoolean(data.isActive()); + buf.writeBoolean(data.isCostPaid()); + for (int i = 0; i < data.amountsPaid.length; i++) { + buf.writeShort(data.amountsPaid[i]); + } + } + + private static UpgradeData readFromBuffer(PacketBuffer buf) { + UpgradeData data = new UpgradeData(); + data.active = buf.readBoolean(); + data.costPaid = buf.readBoolean(); + for (int i = 0; i < data.amountsPaid.length; i++) { + data.amountsPaid[i] = buf.readShort(); + } + return data; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + UpgradeData that = (UpgradeData) o; + + if (active != that.active) return false; + if (costPaid != that.costPaid) return false; + return Arrays.equals(amountsPaid, that.amountsPaid); + } + } +} diff --git a/src/main/java/tectech/thing/metaTileEntity/multi/godforge/util/ForgeOfGodsUI.java b/src/main/java/tectech/thing/metaTileEntity/multi/godforge/util/ForgeOfGodsUI.java new file mode 100644 index 0000000000..d6f9be6633 --- /dev/null +++ b/src/main/java/tectech/thing/metaTileEntity/multi/godforge/util/ForgeOfGodsUI.java @@ -0,0 +1,908 @@ +package tectech.thing.metaTileEntity.multi.godforge.util; + +import static gregtech.api.metatileentity.BaseTileEntity.TOOLTIP_DELAY; +import static net.minecraft.util.StatCollector.translateToLocal; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Set; +import java.util.function.BiConsumer; +import java.util.function.Consumer; +import java.util.function.DoubleConsumer; +import java.util.function.DoubleSupplier; +import java.util.function.Supplier; + +import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.StatCollector; + +import com.google.common.collect.ImmutableList; +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.forge.ItemStackHandler; +import com.gtnewhorizons.modularui.api.math.Alignment; +import com.gtnewhorizons.modularui.api.math.MainAxisAlignment; +import com.gtnewhorizons.modularui.api.math.Size; +import com.gtnewhorizons.modularui.api.screen.ModularUIContext; +import com.gtnewhorizons.modularui.api.screen.ModularWindow; +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.DynamicPositionedRow; +import com.gtnewhorizons.modularui.common.widget.DynamicTextWidget; +import com.gtnewhorizons.modularui.common.widget.FakeSyncWidget; +import com.gtnewhorizons.modularui.common.widget.MultiChildWidget; +import com.gtnewhorizons.modularui.common.widget.Scrollable; +import com.gtnewhorizons.modularui.common.widget.SliderWidget; +import com.gtnewhorizons.modularui.common.widget.SlotWidget; +import com.gtnewhorizons.modularui.common.widget.TextWidget; +import com.gtnewhorizons.modularui.common.widget.textfield.NumericWidget; + +import codechicken.nei.recipe.GuiCraftingRecipe; +import codechicken.nei.recipe.GuiUsageRecipe; +import gregtech.api.enums.VoidingMode; +import gregtech.api.gui.modularui.GTUITextures; +import gregtech.api.interfaces.modularui.IControllerWithOptionalFeatures; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import tectech.TecTech; +import tectech.thing.gui.TecTechUITextures; +import tectech.thing.metaTileEntity.multi.godforge.color.ForgeOfGodsStarColor; +import tectech.thing.metaTileEntity.multi.godforge.upgrade.ForgeOfGodsUpgrade; + +/** + * Holds UI element builders and other conveniences shared between the primary Forge of the Gods and its modules. + */ +public class ForgeOfGodsUI { + + // ARGB representations of the 4 colors used in the color selector (red, green, blue, gold) + public static final int RED_ARGB = 0xFFFF5555; + public static final int GREEN_ARGB = 0xFF55FF55; + public static final int BLUE_ARGB = 0xFF0000AA; + public static final int GOLD_ARGB = 0xFFFFAA00; + + public static ButtonWidget createPowerSwitchButton(final IGregTechTileEntity tileEntity) { + Widget button = new ButtonWidget().setOnClick((clickData, widget) -> { + TecTech.proxy.playSound(tileEntity, "fx_click"); + if (tileEntity.isAllowedToWork()) { + tileEntity.disableWorking(); + } else { + tileEntity.enableWorking(); + } + }) + .setPlayClickSound(false) + .setBackground(() -> { + List ret = new ArrayList<>(); + ret.add(TecTechUITextures.BUTTON_CELESTIAL_32x32); + if (tileEntity.isAllowedToWork()) { + ret.add(TecTechUITextures.OVERLAY_BUTTON_POWER_SWITCH_ON); + } else { + ret.add(TecTechUITextures.OVERLAY_BUTTON_POWER_SWITCH_DISABLED); + } + return ret.toArray(new IDrawable[0]); + }) + .setPos(174, 148) + .setSize(16, 16); + button.addTooltip("Power Switch") + .setTooltipShowUpDelay(TOOLTIP_DELAY); + return (ButtonWidget) button; + } + + public static ButtonWidget createInputSeparationButton(final IGregTechTileEntity tileEntity, + final IControllerWithOptionalFeatures mte, IWidgetBuilder builder) { + Widget button = new ButtonWidget().setOnClick((clickData, widget) -> { + TecTech.proxy.playSound(tileEntity, "fx_click"); + mte.setInputSeparation(!mte.isInputSeparationEnabled()); + }) + .setPlayClickSound(false) + .setBackground(() -> { + List ret = new ArrayList<>(); + ret.add(TecTechUITextures.BUTTON_CELESTIAL_32x32); + if (mte.isInputSeparationEnabled()) { + ret.add(TecTechUITextures.OVERLAY_BUTTON_INPUT_SEPARATION); + } else { + ret.add(TecTechUITextures.OVERLAY_BUTTON_INPUT_SEPARATION_OFF); + } + return ret.toArray(new IDrawable[0]); + }) + .attachSyncer( + new FakeSyncWidget.BooleanSyncer(mte::isInputSeparationEnabled, mte::setInputSeparation), + builder) + .addTooltip(StatCollector.translateToLocal("GT5U.gui.button.input_separation")) + .setTooltipShowUpDelay(TOOLTIP_DELAY) + .setPos(mte.getInputSeparationButtonPos()) + .setSize(16, 16); + return (ButtonWidget) button; + } + + public static ButtonWidget createBatchModeButton(final IGregTechTileEntity tileEntity, + final IControllerWithOptionalFeatures mte, IWidgetBuilder builder) { + Widget button = new ButtonWidget().setOnClick((clickData, widget) -> { + TecTech.proxy.playSound(tileEntity, "fx_click"); + mte.setBatchMode(!mte.isBatchModeEnabled()); + }) + .setPlayClickSound(false) + .setBackground(() -> { + List ret = new ArrayList<>(); + ret.add(TecTechUITextures.BUTTON_CELESTIAL_32x32); + if (mte.isBatchModeEnabled()) { + ret.add(TecTechUITextures.OVERLAY_BUTTON_BATCH_MODE); + } else { + ret.add(TecTechUITextures.OVERLAY_BUTTON_BATCH_MODE_OFF); + } + return ret.toArray(new IDrawable[0]); + }) + .attachSyncer(new FakeSyncWidget.BooleanSyncer(mte::isBatchModeEnabled, mte::setBatchMode), builder) + .addTooltip(StatCollector.translateToLocal("GT5U.gui.button.batch_mode")) + .setTooltipShowUpDelay(TOOLTIP_DELAY) + .setPos(mte.getBatchModeButtonPos()) + .setSize(16, 16); + return (ButtonWidget) button; + } + + public static ButtonWidget createLockToSingleRecipeButton(final IGregTechTileEntity tileEntity, + final IControllerWithOptionalFeatures mte, IWidgetBuilder builder) { + Widget button = new ButtonWidget().setOnClick((clickData, widget) -> { + TecTech.proxy.playSound(tileEntity, "fx_click"); + mte.setRecipeLocking(!mte.isRecipeLockingEnabled()); + }) + .setPlayClickSound(false) + .setBackground(() -> { + List ret = new ArrayList<>(); + ret.add(TecTechUITextures.BUTTON_CELESTIAL_32x32); + if (mte.isRecipeLockingEnabled()) { + ret.add(TecTechUITextures.OVERLAY_BUTTON_RECIPE_LOCKED); + } else { + ret.add(TecTechUITextures.OVERLAY_BUTTON_RECIPE_UNLOCKED); + } + return ret.toArray(new IDrawable[0]); + }) + .attachSyncer(new FakeSyncWidget.BooleanSyncer(mte::isRecipeLockingEnabled, mte::setRecipeLocking), builder) + .addTooltip(StatCollector.translateToLocal("GT5U.gui.button.lock_recipe")) + .setTooltipShowUpDelay(TOOLTIP_DELAY) + .setPos(mte.getRecipeLockingButtonPos()) + .setSize(16, 16); + return (ButtonWidget) button; + } + + public static ButtonWidget createStructureUpdateButton(final IGregTechTileEntity tileEntity, + final IControllerWithOptionalFeatures mte, IWidgetBuilder builder) { + Widget button = new ButtonWidget().setOnClick((clickData, widget) -> { + TecTech.proxy.playSound(tileEntity, "fx_click"); + if (mte.getStructureUpdateTime() <= -20) { + mte.setStructureUpdateTime(1); + } + }) + .setPlayClickSound(false) + .setBackground(() -> { + List ret = new ArrayList<>(); + ret.add(TecTechUITextures.BUTTON_CELESTIAL_32x32); + if (mte.getStructureUpdateTime() > -20) { + ret.add(TecTechUITextures.OVERLAY_BUTTON_STRUCTURE_CHECK); + } else { + ret.add(TecTechUITextures.OVERLAY_BUTTON_STRUCTURE_CHECK_OFF); + } + return ret.toArray(new IDrawable[0]); + }) + .attachSyncer( + new FakeSyncWidget.IntegerSyncer(mte::getStructureUpdateTime, mte::setStructureUpdateTime), + builder) + .addTooltip(StatCollector.translateToLocal("GT5U.gui.button.structure_update")) + .setTooltipShowUpDelay(TOOLTIP_DELAY) + .setPos(mte.getStructureUpdateButtonPos()) + .setSize(16, 16); + return (ButtonWidget) button; + } + + public static ButtonWidget createVoidExcessButton(final IGregTechTileEntity tileEntity, + final IControllerWithOptionalFeatures mte, IWidgetBuilder builder) { + Widget button = new ButtonWidget().setOnClick((clickData, widget) -> { + TecTech.proxy.playSound(tileEntity, "fx_click"); + Set allowed = mte.getAllowedVoidingModes(); + switch (clickData.mouseButton) { + case 0 -> mte.setVoidingMode( + mte.getVoidingMode() + .nextInCollection(allowed)); + case 1 -> mte.setVoidingMode( + mte.getVoidingMode() + .previousInCollection(allowed)); + } + widget.notifyTooltipChange(); + }) + .setPlayClickSound(false) + .setBackground(() -> { + List ret = new ArrayList<>(); + ret.add(TecTechUITextures.BUTTON_CELESTIAL_32x32); + switch (mte.getVoidingMode()) { + case VOID_NONE -> ret.add(TecTechUITextures.OVERLAY_BUTTON_VOIDING_OFF); + case VOID_ITEM -> ret.add(TecTechUITextures.OVERLAY_BUTTON_VOIDING_ITEMS); + case VOID_FLUID -> ret.add(TecTechUITextures.OVERLAY_BUTTON_VOIDING_FLUIDS); + case VOID_ALL -> ret.add(TecTechUITextures.OVERLAY_BUTTON_VOIDING_BOTH); + } + return ret.toArray(new IDrawable[0]); + }) + .attachSyncer( + new FakeSyncWidget.IntegerSyncer( + () -> mte.getVoidingMode() + .ordinal(), + val -> mte.setVoidingMode(VoidingMode.fromOrdinal(val))), + builder) + .dynamicTooltip( + () -> Arrays.asList( + StatCollector.translateToLocal("GT5U.gui.button.voiding_mode"), + StatCollector.translateToLocal( + mte.getVoidingMode() + .getTransKey()))) + .setTooltipShowUpDelay(TOOLTIP_DELAY) + .setPos(mte.getVoidingModeButtonPos()) + .setSize(16, 16); + return (ButtonWidget) button; + } + + public static ModularWindow createGeneralInfoWindow(Supplier inversionGetter, + Consumer inversionSetter) { + final Scrollable scrollable = new Scrollable().setVerticalScroll(); + final int WIDTH = 300; + final int HEIGHT = 300; + ModularWindow.Builder builder = ModularWindow.builder(WIDTH, HEIGHT); + + builder.setDraggable(true); + scrollable.widget( + new TextWidget(EnumChatFormatting.BOLD + translateToLocal("gt.blockmachines.multimachine.FOG.introduction")) + .setDefaultColor(EnumChatFormatting.DARK_PURPLE) + .setTextAlignment(Alignment.TopCenter) + .setPos(7, 13) + .setSize(280, 15)) + .widget( + new TextWidget(translateToLocal("gt.blockmachines.multimachine.FOG.introductioninfotext")) + .setDefaultColor(EnumChatFormatting.GOLD) + .setTextAlignment(Alignment.CenterLeft) + .setPos(7, 30) + .setSize(280, 50)) + .widget( + new TextWidget( + EnumChatFormatting.BOLD + translateToLocal("gt.blockmachines.multimachine.FOG.tableofcontents")) + .setDefaultColor(EnumChatFormatting.AQUA) + .setTextAlignment(Alignment.CenterLeft) + .setPos(7, 80) + .setSize(150, 15)) + .widget( + new ButtonWidget().setOnClick((clickData, widget) -> scrollable.setVerticalScrollOffset(150)) + .setBackground( + new Text(EnumChatFormatting.BOLD + translateToLocal("gt.blockmachines.multimachine.FOG.fuel")) + .alignment(Alignment.CenterLeft) + .color(0x55ffff)) + .setPos(7, 95) + .setSize(150, 15)) + .widget( + new ButtonWidget().setOnClick((clickData, widget) -> scrollable.setVerticalScrollOffset(434)) + .setBackground( + new Text( + EnumChatFormatting.BOLD + translateToLocal("gt.blockmachines.multimachine.FOG.modules")) + .alignment(Alignment.CenterLeft) + .color(0x55ffff)) + .setPos(7, 110) + .setSize(150, 15)) + .widget( + new ButtonWidget().setOnClick((clickData, widget) -> scrollable.setVerticalScrollOffset(1088)) + .setBackground( + new Text( + EnumChatFormatting.BOLD + translateToLocal("gt.blockmachines.multimachine.FOG.upgrades")) + .alignment(Alignment.CenterLeft) + .color(0x55ffff)) + .setPos(7, 125) + .setSize(150, 15)) + .widget( + new ButtonWidget().setOnClick((clickData, widget) -> scrollable.setVerticalScrollOffset(1412)) + .setBackground( + new Text( + EnumChatFormatting.BOLD + translateToLocal("gt.blockmachines.multimachine.FOG.milestones")) + .alignment(Alignment.CenterLeft) + .color(0x55ffff)) + .setPos(7, 140) + .setSize(150, 15)) + .widget( + TextWidget.dynamicText(() -> inversionInfoText(inversionGetter.get())) + .setDefaultColor(EnumChatFormatting.WHITE) + .setTextAlignment(Alignment.CenterLeft) + .setPos(7, 155) + .setSize(150, 15)) + .widget(new ButtonWidget().setOnClick((clickData, widget) -> { + if (inversionGetter.get()) { + scrollable.setVerticalScrollOffset(1766); + } + }) + .setPlayClickSound(inversionGetter.get()) + .setPos(7, 155) + .setSize(150, 15) + .attachSyncer(new FakeSyncWidget.BooleanSyncer(inversionGetter, inversionSetter), scrollable)) + .widget( + new TextWidget( + EnumChatFormatting.BOLD + "§N" + translateToLocal("gt.blockmachines.multimachine.FOG.fuel")) + .setDefaultColor(EnumChatFormatting.DARK_PURPLE) + .setTextAlignment(Alignment.TopCenter) + .setPos(127, 160) + .setSize(40, 15)) + .widget( + new TextWidget(translateToLocal("gt.blockmachines.multimachine.FOG.fuelinfotext")) + .setDefaultColor(EnumChatFormatting.GOLD) + .setTextAlignment(Alignment.CenterLeft) + .setPos(7, 177) + .setSize(280, 250)) + .widget( + new TextWidget( + EnumChatFormatting.BOLD + "§N" + translateToLocal("gt.blockmachines.multimachine.FOG.modules")) + .setDefaultColor(EnumChatFormatting.DARK_PURPLE) + .setTextAlignment(Alignment.TopCenter) + .setPos(7, 440) + .setSize(280, 15)) + .widget( + new TextWidget(translateToLocal("gt.blockmachines.multimachine.FOG.moduleinfotext")) + .setDefaultColor(EnumChatFormatting.GOLD) + .setTextAlignment(Alignment.CenterLeft) + .setPos(7, 461) + .setSize(280, 620)) + .widget( + new TextWidget( + EnumChatFormatting.BOLD + "§N" + translateToLocal("gt.blockmachines.multimachine.FOG.upgrades")) + .setDefaultColor(EnumChatFormatting.DARK_PURPLE) + .setTextAlignment(Alignment.TopCenter) + .setPos(7, 1098) + .setSize(280, 15)) + .widget( + new TextWidget(translateToLocal("gt.blockmachines.multimachine.FOG.upgradeinfotext")) + .setDefaultColor(EnumChatFormatting.GOLD) + .setTextAlignment(Alignment.CenterLeft) + .setPos(7, 1115) + .setSize(280, 290)) + .widget( + new TextWidget( + EnumChatFormatting.BOLD + "§N" + translateToLocal("gt.blockmachines.multimachine.FOG.milestones")) + .setDefaultColor(EnumChatFormatting.DARK_PURPLE) + .setTextAlignment(Alignment.TopCenter) + .setPos(7, 1422) + .setSize(280, 15)) + .widget( + new TextWidget(translateToLocal("gt.blockmachines.multimachine.FOG.milestoneinfotext")) + .setDefaultColor(EnumChatFormatting.GOLD) + .setTextAlignment(Alignment.CenterLeft) + .setPos(7, 1439) + .setSize(280, 320)) + .widget( + TextWidget.dynamicText(() -> inversionHeaderText(inversionGetter.get())) + .setDefaultColor(EnumChatFormatting.WHITE) + .setTextAlignment(Alignment.TopCenter) + .setPos(7, 1776) + .setSize(280, 15)) + .widget( + TextWidget.dynamicText(() -> inversionInfoText(inversionGetter.get())) + .setDefaultColor(EnumChatFormatting.GOLD) + .setTextAlignment(Alignment.CenterLeft) + .setPos(7, 1793) + .setSize(280, 160)) + .widget( + new TextWidget("").setPos(7, 1965) + .setSize(10, 10)); + + builder.widget( + new DrawableWidget().setDrawable(TecTechUITextures.BACKGROUND_GLOW_WHITE) + .setPos(0, 0) + .setSize(300, 300)) + .widget( + scrollable.setSize(292, 292) + .setPos(4, 4)) + .widget( + ButtonWidget.closeWindowButton(true) + .setPos(284, 4)); + + return builder.build(); + } + + private static Text inversionHeaderText(boolean inversion) { + return inversion + ? new Text( + EnumChatFormatting.BOLD + "§k2" + + EnumChatFormatting.RESET + + EnumChatFormatting.WHITE + + EnumChatFormatting.BOLD + + translateToLocal("gt.blockmachines.multimachine.FOG.inversion") + + EnumChatFormatting.BOLD + + "§k2") + : new Text(""); + } + + private static Text inversionInfoText(boolean inversion) { + return inversion ? new Text(translateToLocal("gt.blockmachines.multimachine.FOG.inversioninfotext")) + : new Text(""); + } + + public static void reopenWindow(Widget widget, int windowId) { + if (!widget.isClient()) { + ModularUIContext ctx = widget.getContext(); + if (ctx.isWindowOpen(windowId)) { + ctx.closeWindow(windowId); + } + ctx.openSyncedWindow(windowId); + } + } + + public static void closeWindow(Widget widget, int windowId) { + if (!widget.isClient()) { + ModularUIContext ctx = widget.getContext(); + if (ctx.isWindowOpen(windowId)) { + ctx.closeWindow(windowId); + } + } + } + + public enum StarColorRGBM { + + RED(EnumChatFormatting.RED, RED_ARGB, 0, 255, ForgeOfGodsStarColor.DEFAULT_RED), + GREEN(EnumChatFormatting.GREEN, GREEN_ARGB, 0, 255, ForgeOfGodsStarColor.DEFAULT_GREEN), + BLUE(EnumChatFormatting.DARK_BLUE, BLUE_ARGB, 0, 255, ForgeOfGodsStarColor.DEFAULT_BLUE), + GAMMA(EnumChatFormatting.GOLD, GOLD_ARGB, 0, 100, ForgeOfGodsStarColor.DEFAULT_GAMMA); + + private final String title; + private final EnumChatFormatting mcColor; + private final int muiColor; + private final float lowerBound, upperBound; + private final float defaultValue; + + StarColorRGBM(EnumChatFormatting mcColor, int muiColor, float lower, float upper, float defaultVal) { + this.title = "fog.cosmetics.color." + name().toLowerCase(); + this.mcColor = mcColor; + this.muiColor = muiColor; + this.lowerBound = lower; + this.upperBound = upper; + this.defaultValue = defaultVal; + } + + public String tooltip(float value) { + if (this == GAMMA) { + return String.format("%s%s: %.1f", mcColor, translateToLocal(title), value); + } + return String.format("%s%s: %d", mcColor, translateToLocal(title), (int) value); + } + } + + public static Widget createStarColorRGBMGroup(StarColorRGBM color, DoubleConsumer setter, DoubleSupplier getter) { + MultiChildWidget widget = new MultiChildWidget(); + widget.setSize(184, 16); + + // Title + widget.addChild( + new TextWidget(translateToLocal(color.title)).setDefaultColor(color.mcColor) + .setTextAlignment(Alignment.CenterLeft) + .setPos(0, 0) + .setSize(32, 16)); + + // Color slider + widget.addChild(new SliderWidget().setSetter(val -> { + int aux = (int) (val * 10); + setter.accept(aux / 10d); + }) + .setGetter(() -> (float) getter.getAsDouble()) + .setBounds(color.lowerBound, color.upperBound) + .setHandleSize(new Size(4, 0)) + .dynamicTooltip(() -> { + List ret = new ArrayList<>(); + ret.add(color.tooltip((float) getter.getAsDouble())); + return ret; + }) + .setUpdateTooltipEveryTick(true) + .setSize(118, 8) + .setPos(32, 4)); + + // Color manual text box + Widget numberEntry = new NumericWidget().setSetter(setter) + .setGetter(getter) + .setBounds(color.lowerBound, color.upperBound) + .setDefaultValue(color.defaultValue) + .setTextAlignment(Alignment.Center) + .setTextColor(color.muiColor) + .setSize(32, 16) + .setPos(152, 0) + .setTooltipShowUpDelay(TOOLTIP_DELAY) + .setBackground(GTUITextures.BACKGROUND_TEXT_FIELD); + + if (color == StarColorRGBM.GAMMA) { + numberEntry.addTooltip(translateToLocal("fog.cosmetics.onlydecimals")); + ((NumericWidget) numberEntry).setIntegerOnly(false); + } else { + numberEntry.addTooltip(translateToLocal("fog.cosmetics.onlyintegers")); + } + + return widget.addChild(numberEntry); + } + + public static Widget createStarColorButton(String text, String tooltip, + BiConsumer onClick) { + MultiChildWidget widget = new MultiChildWidget(); + widget.setSize(35, 15); + + widget.addChild( + new ButtonWidget().setOnClick(onClick) + .setSize(35, 15) + .setBackground(GTUITextures.BUTTON_STANDARD) + .addTooltip(translateToLocal(tooltip)) + .setTooltipShowUpDelay(TOOLTIP_DELAY) + .setPos(0, 0)); + + widget.addChild( + TextWidget.localised(text) + .setTextAlignment(Alignment.Center) + .setPos(0, 0) + .setSize(35, 15)); + + return widget; + } + + public static Widget createStarColorButton(Supplier text, Supplier tooltip, + BiConsumer onClick) { + MultiChildWidget widget = new MultiChildWidget(); + widget.setSize(35, 15); + + widget.addChild( + new ButtonWidget().setOnClick(onClick) + .setSize(35, 15) + .setBackground(GTUITextures.BUTTON_STANDARD) + .dynamicTooltip(() -> { + List ret = new ArrayList<>(); + ret.add(translateToLocal(tooltip.get())); + return ret; + }) + .setUpdateTooltipEveryTick(true) + .setTooltipShowUpDelay(TOOLTIP_DELAY) + .setPos(0, 0)); + + widget.addChild( + new DynamicTextWidget(() -> new Text(translateToLocal(text.get()))).setTextAlignment(Alignment.Center) + .setPos(0, 0) + .setSize(35, 15)); + + return widget; + } + + public static Widget getIndividualUpgradeGroup(ForgeOfGodsUpgrade upgrade, Supplier shardGetter, + Runnable complete, Runnable respec, Supplier check) { + MultiChildWidget widget = new MultiChildWidget(); + widget.setSize(upgrade.getWindowSize()); + + Size windowSize = upgrade.getWindowSize(); + int w = windowSize.width; + int h = windowSize.height; + + // Close window button + widget.addChild( + ButtonWidget.closeWindowButton(true) + .setPos(w - 15, 3)); + + // Background symbol + widget.addChild( + new DrawableWidget().setDrawable(upgrade.getSymbol()) + .setPos((int) ((1 - upgrade.getSymbolWidthRatio() / 2) * w / 2), h / 4) + .setSize((int) (w / 2 * upgrade.getSymbolWidthRatio()), h / 2)); + + // Background overlay + widget.addChild( + new DrawableWidget().setDrawable(upgrade.getOverlay()) + .setPos(w / 4, h / 4) + .setSize(w / 2, h / 2)); + + // Upgrade name title + widget.addChild( + new TextWidget(upgrade.getNameText()).setTextAlignment(Alignment.Center) + .setDefaultColor(EnumChatFormatting.GOLD) + .setSize(w - 15, 30) + .setPos(9, 5)); + + // Upgrade body text + widget.addChild( + new TextWidget(upgrade.getBodyText()).setTextAlignment(Alignment.Center) + .setDefaultColor(EnumChatFormatting.WHITE) + .setSize(w - 15, upgrade.getLoreYPos() - 30) + .setPos(9, 30)); + + // Lore Text + widget.addChild( + new TextWidget(EnumChatFormatting.ITALIC + upgrade.getLoreText()).setTextAlignment(Alignment.Center) + .setDefaultColor(0xbbbdbd) + .setSize(w - 15, (int) (h * 0.9) - upgrade.getLoreYPos()) + .setPos(9, upgrade.getLoreYPos())); + + // Shard cost text + String costStr = " " + EnumChatFormatting.BLUE + upgrade.getShardCost(); + widget.addChild( + new TextWidget(translateToLocal("gt.blockmachines.multimachine.FOG.shardcost") + costStr) + .setTextAlignment(Alignment.Center) + .setScale(0.7f) + .setMaxWidth(70) + .setDefaultColor(0x9c9c9c) + .setPos(11, h - 25)); + + // Available shards text + widget.addChild( + new TextWidget(translateToLocal("gt.blockmachines.multimachine.FOG.availableshards")) + .setTextAlignment(Alignment.Center) + .setScale(0.7f) + .setMaxWidth(90) + .setDefaultColor(0x9c9c9c) + .setPos(w - 87, h - 25)); + + // Available shards amount + widget.addChild( + TextWidget.dynamicText(() -> getAvailableShardsText(upgrade, shardGetter)) + .setTextAlignment(Alignment.Center) + .setScale(0.7f) + .setMaxWidth(90) + .setDefaultColor(0x9c9c9c) + .setPos(w - 27, h - 18)); + + // Complete button group + MultiChildWidget completeGroup = new MultiChildWidget(); + completeGroup.setPos(w / 2 - 21, (int) (h * 0.9)); + + // Complete button + completeGroup.addChild(new ButtonWidget().setOnClick(($, $$) -> { + if (check.get()) { + respec.run(); + } else { + complete.run(); + } + }) + .setSize(40, 15) + .setBackground( + () -> new IDrawable[] { + check.get() ? GTUITextures.BUTTON_STANDARD_PRESSED : GTUITextures.BUTTON_STANDARD }) + .dynamicTooltip(() -> constructionStatusString(check)) + .setTooltipShowUpDelay(TOOLTIP_DELAY)); + + // Complete text overlay + completeGroup.addChild( + TextWidget.dynamicText(() -> constructionStatusText(check)) + .setTextAlignment(Alignment.Center) + .setScale(0.7f) + .setMaxWidth(36) + .setPos(3, 5)); + + widget.addChild(completeGroup); + + return widget; + } + + public static Widget createMaterialInputButton(ForgeOfGodsUpgrade upgrade, Supplier check, + BiConsumer clickAction) { + Size windowSize = upgrade.getWindowSize(); + int w = windowSize.width; + int h = windowSize.height; + + return new ButtonWidget().setOnClick(clickAction) + .setPlayClickSound(true) + .setBackground( + () -> new IDrawable[] { check.get() ? TecTechUITextures.BUTTON_BOXED_CHECKMARK_18x18 + : TecTechUITextures.BUTTON_BOXED_EXCLAMATION_POINT_18x18 }) + .setPos(w / 2 - 40, (int) (h * 0.9)) + .setSize(15, 15) + .dynamicTooltip(() -> upgradeMaterialRequirements(check)) + .addTooltip( + EnumChatFormatting.GRAY + translateToLocal("fog.button.materialrequirements.tooltip.clickhere")); + } + + private static Text getAvailableShardsText(ForgeOfGodsUpgrade upgrade, Supplier shardGetter) { + EnumChatFormatting enoughShards = EnumChatFormatting.RED; + if (shardGetter.get() >= upgrade.getShardCost()) { + enoughShards = EnumChatFormatting.GREEN; + } + return new Text(enoughShards + Integer.toString(shardGetter.get())); + } + + private static List constructionStatusString(Supplier check) { + if (check.get()) { + return ImmutableList.of(translateToLocal("fog.upgrade.respec")); + } + return ImmutableList.of(translateToLocal("fog.upgrade.confirm")); + } + + private static Text constructionStatusText(Supplier check) { + if (check.get()) { + return new Text(translateToLocal("fog.upgrade.respec")); + } + return new Text(translateToLocal("fog.upgrade.confirm")); + } + + private static List upgradeMaterialRequirements(Supplier check) { + if (check.get()) { + return ImmutableList.of(translateToLocal("fog.button.materialrequirementsmet.tooltip")); + } + return ImmutableList.of(translateToLocal("fog.button.materialrequirements.tooltip")); + } + + public static Widget createExtraCostWidget(final ItemStack costStack, Supplier paidAmount) { + MultiChildWidget widget = new MultiChildWidget(); + widget.setSize(36, 18); + + if (costStack == null) { + // Nothing to pay, so just create a simple disabled slot drawable + widget.addChild( + new DrawableWidget().setDrawable(GTUITextures.BUTTON_STANDARD_DISABLED) + .setSize(18, 18)); + return widget; + } + + // Item slot + ItemStackHandler handler = new ItemStackHandler(1); + ItemStack handlerStack = costStack.copy(); + handlerStack.stackSize = Math.max(1, handlerStack.stackSize - paidAmount.get()); + handler.setStackInSlot(0, handlerStack); + widget.addChild( + new SlotWidget(handler, 0).setAccess(false, false) + .setRenderStackSize(false) + .disableInteraction() + .setBackground(GTUITextures.BUTTON_STANDARD_PRESSED)) + .addChild(new ButtonWidget().setOnClick((clickData, w) -> { + if (widget.isClient()) { + if (clickData.mouseButton == 0) { + GuiCraftingRecipe.openRecipeGui("item", handlerStack.copy()); + } else if (clickData.mouseButton == 1) { + GuiUsageRecipe.openRecipeGui("item", handlerStack.copy()); + } + } + }) + .setSize(16, 16) + .setPos(1, 1)); + + // Progress text + widget.addChild(new DynamicTextWidget(() -> { + short paid = paidAmount.get(); + EnumChatFormatting color = EnumChatFormatting.YELLOW; + if (paid == 0) color = EnumChatFormatting.RED; + else if (paid == costStack.stackSize) color = EnumChatFormatting.GREEN; + return new Text(color + "x" + (costStack.stackSize - paid)); + }).setTextAlignment(Alignment.Center) + .setScale(0.8f) + .setPos(18, 5) + .setSize(18, 9) + .setEnabled(w -> paidAmount.get() < costStack.stackSize)); + + // Completed checkmark + widget.addChild( + new DrawableWidget().setDrawable(TecTechUITextures.GREEN_CHECKMARK_11x9) + .setPos(21, 5) + .setSize(11, 9) + .setEnabled(w -> paidAmount.get() >= costStack.stackSize)); + + return widget; + } + + public static ModularWindow createSpecialThanksWindow() { + final int WIDTH = 200; + final int HEIGHT = 200; + ModularWindow.Builder builder = ModularWindow.builder(WIDTH, HEIGHT); + + builder.setBackground(TecTechUITextures.BACKGROUND_GLOW_RAINBOW); + builder.setDraggable(true); + builder.widget( + ButtonWidget.closeWindowButton(true) + .setPos(184, 4)) + .widget( + new DrawableWidget().setDrawable(TecTechUITextures.PICTURE_GODFORGE_THANKS) + .setPos(50, 50) + .setSize(100, 100)) + .widget( + new TextWidget(translateToLocal("gt.blockmachines.multimachine.FOG.contributors")) + .setDefaultColor(EnumChatFormatting.GOLD) + .setTextAlignment(Alignment.Center) + .setScale(1f) + .setPos(0, 5) + .setSize(200, 15)) + .widget( + new TextWidget( + EnumChatFormatting.UNDERLINE + translateToLocal("gt.blockmachines.multimachine.FOG.lead")) + .setScale(0.8f) + .setDefaultColor(EnumChatFormatting.GOLD) + .setTextAlignment(Alignment.CenterLeft) + .setPos(7, 30) + .setSize(60, 10)) + .widget( + new TextWidget(translateToLocal("gt.blockmachines.multimachine.FOG.cloud")).setScale(0.8f) + .setDefaultColor(EnumChatFormatting.AQUA) + .setTextAlignment(Alignment.CenterLeft) + .setPos(7, 40) + .setSize(60, 10)) + .widget( + new TextWidget( + EnumChatFormatting.UNDERLINE + translateToLocal("gt.blockmachines.multimachine.FOG.programming")) + .setScale(0.8f) + .setDefaultColor(EnumChatFormatting.GOLD) + .setTextAlignment(Alignment.CenterLeft) + .setPos(7, 55) + .setSize(60, 10)) + .widget( + new TextWidget( + translateToLocal("gt.blockmachines.multimachine.FOG.serenibyss") + " " + + EnumChatFormatting.DARK_AQUA + + translateToLocal("gt.blockmachines.multimachine.FOG.teg")).setScale(0.8f) + .setTextAlignment(Alignment.CenterLeft) + .setPos(7, 67) + .setSize(60, 10)) + .widget( + new TextWidget( + EnumChatFormatting.UNDERLINE + translateToLocal("gt.blockmachines.multimachine.FOG.textures")) + .setScale(0.8f) + .setDefaultColor(EnumChatFormatting.GOLD) + .setTextAlignment(Alignment.CenterLeft) + .setPos(7, 85) + .setSize(100, 10)) + .widget( + new TextWidget(translateToLocal("gt.blockmachines.multimachine.FOG.ant")).setScale(0.8f) + .setDefaultColor(EnumChatFormatting.GREEN) + .setTextAlignment(Alignment.CenterLeft) + .setPos(7, 95) + .setSize(60, 10)) + .widget( + new TextWidget( + EnumChatFormatting.UNDERLINE + translateToLocal("gt.blockmachines.multimachine.FOG.rendering")) + .setScale(0.8f) + .setDefaultColor(EnumChatFormatting.GOLD) + .setTextAlignment(Alignment.CenterLeft) + .setPos(7, 110) + .setSize(100, 10)) + .widget( + new TextWidget(translateToLocal("gt.blockmachines.multimachine.FOG.bucket")).setScale(0.8f) + .setDefaultColor(EnumChatFormatting.WHITE) + .setTextAlignment(Alignment.CenterLeft) + .setPos(7, 120) + .setSize(60, 10)) + .widget( + new TextWidget( + EnumChatFormatting.UNDERLINE + translateToLocal("gt.blockmachines.multimachine.FOG.lore")) + .setScale(0.8f) + .setDefaultColor(EnumChatFormatting.GOLD) + .setTextAlignment(Alignment.CenterLeft) + .setPos(7, 135) + .setSize(100, 10)) + .widget( + delenoName().setSpace(-1) + .setAlignment(MainAxisAlignment.SPACE_BETWEEN) + .setPos(7, 145) + .setSize(60, 10)) + .widget( + new TextWidget( + EnumChatFormatting.UNDERLINE + translateToLocal("gt.blockmachines.multimachine.FOG.playtesting")) + .setScale(0.8f) + .setDefaultColor(EnumChatFormatting.GOLD) + .setTextAlignment(Alignment.CenterLeft) + .setPos(7, 160) + .setSize(100, 10)) + .widget( + new TextWidget(translateToLocal("gt.blockmachines.multimachine.FOG.misi")).setScale(0.8f) + .setDefaultColor(0xffc26f) + .setTextAlignment(Alignment.CenterLeft) + .setPos(7, 170) + .setSize(60, 10)) + .widget( + new TextWidget(EnumChatFormatting.ITALIC + translateToLocal("gt.blockmachines.multimachine.FOG.thanks")) + .setScale(0.8f) + .setDefaultColor(0xbbbdbd) + .setTextAlignment(Alignment.Center) + .setPos(90, 140) + .setSize(100, 60)); + return builder.build(); + } + + private static DynamicPositionedRow delenoName() { + DynamicPositionedRow nameRow = new DynamicPositionedRow(); + String deleno = translateToLocal("gt.blockmachines.multimachine.FOG.deleno"); + int[] colors = new int[] { 0xffffff, 0xf6fff5, 0xecffec, 0xe3ffe2, 0xd9ffd9, 0xd0ffcf }; + + for (int i = 0; i < 6; i++) { + nameRow.addChild( + new TextWidget(Character.toString(deleno.charAt(i))).setDefaultColor(colors[i]) + .setScale(0.8f) + .setTextAlignment(Alignment.CenterLeft)); + } + return nameRow; + } +} diff --git a/src/main/java/tectech/thing/metaTileEntity/multi/godforge/util/GodforgeMath.java b/src/main/java/tectech/thing/metaTileEntity/multi/godforge/util/GodforgeMath.java new file mode 100644 index 0000000000..e0f059167b --- /dev/null +++ b/src/main/java/tectech/thing/metaTileEntity/multi/godforge/util/GodforgeMath.java @@ -0,0 +1,298 @@ +package tectech.thing.metaTileEntity.multi.godforge.util; + +import static tectech.thing.metaTileEntity.multi.godforge.upgrade.ForgeOfGodsUpgrade.*; + +import java.math.BigInteger; + +import tectech.thing.metaTileEntity.multi.godforge.MTEBaseModule; +import tectech.thing.metaTileEntity.multi.godforge.MTEExoticModule; +import tectech.thing.metaTileEntity.multi.godforge.MTEForgeOfGods; +import tectech.thing.metaTileEntity.multi.godforge.MTEMoltenModule; +import tectech.thing.metaTileEntity.multi.godforge.MTEPlasmaModule; +import tectech.thing.metaTileEntity.multi.godforge.MTESmeltingModule; + +public class GodforgeMath { + + public static int getRandomIntInRange(int min, int max) { + return (int) (Math.random() * (max - min)) + min; + } + + public static double calculateFuelConsumption(MTEForgeOfGods godforge) { + double upgradeFactor = 1; + if (godforge.isUpgradeActive(STEM)) { + upgradeFactor = 0.8; + } + if (godforge.getFuelType() == 0) { + return godforge.getFuelFactor() * 300 * Math.pow(1.15, godforge.getFuelFactor()) * upgradeFactor; + } + if (godforge.getFuelType() == 1) { + return godforge.getFuelFactor() * 2 * Math.pow(1.08, godforge.getFuelFactor()) * upgradeFactor; + } else return godforge.getFuelFactor() / 25f * upgradeFactor; + } + + public static int calculateStartupFuelConsumption(MTEForgeOfGods godforge) { + return (int) Math.max(godforge.getFuelFactor() * 25 * Math.pow(1.2, godforge.getFuelFactor()), 1); + } + + public static int calculateMaxFuelFactor(MTEForgeOfGods godforge) { + int fuelCap = 5; + if (godforge.isUpgradeActive(TSE)) { + fuelCap = Integer.MAX_VALUE; + } else { + if (godforge.isUpgradeActive(GEM)) { + fuelCap += godforge.getTotalActiveUpgrades(); + } + if (godforge.isUpgradeActive(CFCE)) { + fuelCap *= 1.2; + } + } + return Math.max(fuelCap, 1); + } + + public static int calculateEffectiveFuelFactor(MTEForgeOfGods godforge) { + int fuelFactor = godforge.getFuelFactor(); + if (fuelFactor <= 43) { + return fuelFactor; + } else { + return 43 + (int) Math.floor(Math.pow((fuelFactor - 43), 0.4)); + } + } + + public static void calculateMaxHeatForModules(MTEBaseModule module, MTEForgeOfGods godforge) { + double logBase = 1.5; + int baseHeat = 12601; + if (godforge.isUpgradeActive(SEFCP)) { + if (module instanceof MTESmeltingModule) { + logBase = 1.12; + } else { + logBase = 1.18; + } + } + int recipeHeat = baseHeat + (int) (Math.log(godforge.getFuelFactor()) / Math.log(logBase) * 1000); + module.setHeatForOC(calculateOverclockHeat(module, godforge, recipeHeat)); + module.setHeat(recipeHeat); + } + + public static int calculateOverclockHeat(MTEBaseModule module, MTEForgeOfGods godforge, Integer recipeHeat) { + int actualHeat; + double exponent; + if (godforge.isUpgradeActive(NDPE)) { + if (module instanceof MTESmeltingModule) { + 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(CNTI)) { + actualHeat = Math.min(recipeHeat, 30000); + } else { + actualHeat = Math.min(recipeHeat, 15000); + } + return actualHeat; + } + + public static void calculateSpeedBonusForModules(MTEBaseModule module, MTEForgeOfGods godforge) { + double speedBonus = 1; + + if (godforge.isUpgradeActive(IGCC)) { + speedBonus = Math.pow(module.getHeat(), -0.01); + } + + if (godforge.isUpgradeActive(DOR)) { + if (module instanceof MTEPlasmaModule) { + speedBonus /= Math.pow(module.getMaxParallel(), 0.02); + } else { + speedBonus /= Math.pow(module.getMaxParallel(), 0.012); + } + } + + if (module instanceof MTEExoticModule) { + if (godforge.isUpgradeActive(PA)) { + speedBonus = Math.sqrt(speedBonus); + } else { + speedBonus = 1; + } + } + + module.setSpeedBonus(speedBonus); + } + + public static void calculateMaxParallelForModules(MTEBaseModule module, MTEForgeOfGods godforge) { + int baseParallel = 0; + float fuelFactorMultiplier = 1; + float heatMultiplier = 1; + float upgradeAmountMultiplier = 1; + int node53 = 1; + boolean isMoltenOrSmeltingWithUpgrade = false; + + if (module instanceof MTESmeltingModule) { + baseParallel = 1024; + } + if (module instanceof MTEMoltenModule) { + baseParallel = 512; + } + if (module instanceof MTEPlasmaModule) { + baseParallel = 384; + } + if (module instanceof MTEExoticModule) { + baseParallel = 64; + } + + if (module instanceof MTEMoltenModule + || (module instanceof MTESmeltingModule && godforge.isUpgradeActive(DOP))) { + isMoltenOrSmeltingWithUpgrade = true; + } + + if (godforge.isUpgradeActive(CTCDD)) { + node53 = 2; + } + + if (godforge.isUpgradeActive(SA)) { + fuelFactorMultiplier = 1 + calculateEffectiveFuelFactor(godforge) / 15f; + if (godforge.isUpgradeActive(TCT)) { + if (isMoltenOrSmeltingWithUpgrade) { + fuelFactorMultiplier *= 3; + } else { + fuelFactorMultiplier *= 2; + } + } + } + + if (godforge.isUpgradeActive(EPEC)) { + if (isMoltenOrSmeltingWithUpgrade) { + heatMultiplier = 1 + module.getHeat() / 15000f; + } else { + heatMultiplier = 1 + module.getHeat() / 25000f; + } + } + + if (godforge.isUpgradeActive(POS)) { + if (isMoltenOrSmeltingWithUpgrade) { + upgradeAmountMultiplier = 1 + godforge.getTotalActiveUpgrades() / 5f; + } else { + upgradeAmountMultiplier = 1 + godforge.getTotalActiveUpgrades() / 8f; + } + } + + float totalBonuses = node53 * fuelFactorMultiplier * heatMultiplier * upgradeAmountMultiplier; + + if (module instanceof MTEExoticModule) { + if (godforge.isUpgradeActive(PA)) { + totalBonuses = (float) Math.sqrt(totalBonuses); + } else { + totalBonuses = 1; + } + } + + int maxParallel = (int) (baseParallel * totalBonuses); + + module.setMaxParallel(maxParallel); + } + + public static void calculateEnergyDiscountForModules(MTEBaseModule module, MTEForgeOfGods godforge) { + double fillRatioDiscount = 1; + double maxBatteryDiscount = 1; + + if (godforge.isUpgradeActive(REC)) { + maxBatteryDiscount = 1 - (1 - Math.pow(1.05, -0.05 * godforge.getMaxBatteryCharge())) / 20; + } + + if (godforge.isUpgradeActive(IMKG)) { + double fillRatioMinusZeroPointFive = (double) godforge.getBatteryCharge() / godforge.getMaxBatteryCharge() + - 0.5; + if (module instanceof MTEPlasmaModule) { + 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 MTEExoticModule) { + if (godforge.isUpgradeActive(PA)) { + fillRatioDiscount = Math.sqrt(fillRatioDiscount); + maxBatteryDiscount = Math.sqrt(maxBatteryDiscount); + } else { + fillRatioDiscount = 1; + maxBatteryDiscount = 1; + } + } + + module.setEnergyDiscount((float) (fillRatioDiscount * maxBatteryDiscount)); + } + + public static void calculateProcessingVoltageForModules(MTEBaseModule module, MTEForgeOfGods godforge) { + long voltage = 2_000_000_000; + + if (godforge.isUpgradeActive(GISS)) { + voltage += calculateEffectiveFuelFactor(godforge) * 100_000_000L; + } + + if (godforge.isUpgradeActive(NGMS)) { + voltage *= Math.pow(4, godforge.getRingAmount()); + } + + module.setProcessingVoltage(voltage); + } + + public static void setMiscModuleParameters(MTEBaseModule module, MTEForgeOfGods godforge) { + int plasmaTier = 0; + double overclockTimeFactor = 2; + + if (godforge.isUpgradeActive(END)) { + plasmaTier = 2; + } else if (godforge.isUpgradeActive(SEDS)) { + plasmaTier = 1; + } + + if (godforge.isUpgradeActive(GGEBE)) { + if (module instanceof MTEPlasmaModule) { + overclockTimeFactor = 2.3; + } else { + overclockTimeFactor = 2.15; + } + if (module instanceof MTEExoticModule) { + if (godforge.isUpgradeActive(PA)) { + overclockTimeFactor = 2 + Math.pow(overclockTimeFactor - 2, 2); + } else { + overclockTimeFactor = 2; + } + } + } + + module.setUpgrade83(godforge.isUpgradeActive(IMKG)); + module.setMultiStepPlasma(godforge.isUpgradeActive(TPTP)); + module.setPlasmaTier(plasmaTier); + module.setMagmatterCapable(godforge.isUpgradeActive(END)); + module.setVoltageConfig(godforge.isUpgradeActive(TBF)); + module.setOverclockTimeFactor(overclockTimeFactor); + } + + public static boolean allowModuleConnection(MTEBaseModule module, MTEForgeOfGods godforge) { + + if (module instanceof MTEMoltenModule && godforge.isUpgradeActive(FDIM)) { + return true; + } + + if (module instanceof MTEPlasmaModule && godforge.isUpgradeActive(GPCI)) { + return true; + } + + if (module instanceof MTEExoticModule && godforge.isUpgradeActive(QGPIU)) { + return true; + } + + return module instanceof MTESmeltingModule; + } + + public static void queryMilestoneStats(MTEBaseModule module, MTEForgeOfGods godforge) { + godforge.addTotalPowerConsumed(module.getPowerTally()); + module.setPowerTally(BigInteger.ZERO); + godforge.addTotalRecipesProcessed(module.getRecipeTally()); + module.setRecipeTally(0); + module.setInversionConfig(godforge.isInversionAvailable()); + } +} diff --git a/src/main/java/tectech/thing/metaTileEntity/multi/godforge/util/MilestoneFormatter.java b/src/main/java/tectech/thing/metaTileEntity/multi/godforge/util/MilestoneFormatter.java new file mode 100644 index 0000000000..a1b4a9c968 --- /dev/null +++ b/src/main/java/tectech/thing/metaTileEntity/multi/godforge/util/MilestoneFormatter.java @@ -0,0 +1,47 @@ +package tectech.thing.metaTileEntity.multi.godforge.util; + +import static gregtech.api.util.GTUtility.formatNumbers; +import static tectech.util.TTUtility.toExponentForm; + +import java.math.BigInteger; + +public enum MilestoneFormatter { + + NONE, + COMMA, + EXPONENT; + + public static final MilestoneFormatter[] VALUES = values(); + + public MilestoneFormatter cycle() { + return switch (this) { + case NONE -> COMMA; + case COMMA -> EXPONENT; + case EXPONENT -> NONE; + }; + } + + public String format(Number number) { + return switch (this) { + case NONE -> number.toString(); + case COMMA -> { + if (number instanceof BigInteger bi) yield formatNumbers(bi); + else yield formatNumbers(number.longValue()); + } + case EXPONENT -> { + if (number instanceof BigInteger bi) { + if (bi.compareTo(BigInteger.valueOf(1_000L)) > 0) { + yield toExponentForm(bi); + } + yield bi.toString(); + } else { + long value = number.longValue(); + if (value > 1_000L) { + yield toExponentForm(value); + } + yield Long.toString(value); + } + } + }; + } +} diff --git a/src/main/java/tectech/thing/metaTileEntity/multi/godforge/util/MilestoneIcon.java b/src/main/java/tectech/thing/metaTileEntity/multi/godforge/util/MilestoneIcon.java new file mode 100644 index 0000000000..41af5b0e18 --- /dev/null +++ b/src/main/java/tectech/thing/metaTileEntity/multi/godforge/util/MilestoneIcon.java @@ -0,0 +1,46 @@ +package tectech.thing.metaTileEntity.multi.godforge.util; + +import net.minecraft.util.StatCollector; + +import com.gtnewhorizons.modularui.api.drawable.UITexture; +import com.gtnewhorizons.modularui.api.math.Size; + +import tectech.thing.gui.TecTechUITextures; + +public enum MilestoneIcon { + + CHARGE(TecTechUITextures.PICTURE_GODFORGE_MILESTONE_CHARGE, 60, 75, "power"), + CONVERSION(TecTechUITextures.PICTURE_GODFORGE_MILESTONE_CONVERSION, 54, 75, "recipe"), + CATALYST(TecTechUITextures.PICTURE_GODFORGE_MILESTONE_CATALYST, 75, 75, "fuel"), + COMPOSITION(TecTechUITextures.PICTURE_GODFORGE_MILESTONE_COMPOSITION, 75, 75, "purchasable"), + + ; + + public static final MilestoneIcon[] VALUES = values(); + + private final UITexture symbol; + private final Size size; + private final String name; + + MilestoneIcon(UITexture symbol, int width, int height, String shortName) { + this.symbol = symbol; + this.size = new Size(width, height); + this.name = "gt.blockmachines.multimachine.FOG." + shortName + "milestone"; + } + + public UITexture getSymbol() { + return symbol; + } + + public Size getSize() { + return size; + } + + public float getWidthRatio() { + return 1.0f * size.width / size.height; + } + + public String getNameText() { + return StatCollector.translateToLocal(name); + } +} diff --git a/src/main/java/tectech/thing/metaTileEntity/multi/godforge/util/UpgradeColor.java b/src/main/java/tectech/thing/metaTileEntity/multi/godforge/util/UpgradeColor.java new file mode 100644 index 0000000000..7bcab73f26 --- /dev/null +++ b/src/main/java/tectech/thing/metaTileEntity/multi/godforge/util/UpgradeColor.java @@ -0,0 +1,72 @@ +package tectech.thing.metaTileEntity.multi.godforge.util; + +import com.gtnewhorizons.modularui.api.drawable.UITexture; + +import tectech.thing.gui.TecTechUITextures; + +public enum UpgradeColor { + + // spotless:off + + BLUE( + TecTechUITextures.BACKGROUND_GLOW_BLUE, + TecTechUITextures.PICTURE_OVERLAY_BLUE, + TecTechUITextures.PICTURE_UPGRADE_CONNECTOR_BLUE_OPAQUE, + TecTechUITextures.PICTURE_UPGRADE_CONNECTOR_BLUE), + + PURPLE( + TecTechUITextures.BACKGROUND_GLOW_PURPLE, + TecTechUITextures.PICTURE_OVERLAY_PURPLE, + TecTechUITextures.PICTURE_UPGRADE_CONNECTOR_PURPLE_OPAQUE, + TecTechUITextures.PICTURE_UPGRADE_CONNECTOR_PURPLE), + + ORANGE( + TecTechUITextures.BACKGROUND_GLOW_ORANGE, + TecTechUITextures.PICTURE_OVERLAY_ORANGE, + TecTechUITextures.PICTURE_UPGRADE_CONNECTOR_ORANGE_OPAQUE, + TecTechUITextures.PICTURE_UPGRADE_CONNECTOR_ORANGE), + + GREEN( + TecTechUITextures.BACKGROUND_GLOW_GREEN, + TecTechUITextures.PICTURE_OVERLAY_GREEN, + TecTechUITextures.PICTURE_UPGRADE_CONNECTOR_GREEN_OPAQUE, + TecTechUITextures.PICTURE_UPGRADE_CONNECTOR_GREEN), + + RED( + TecTechUITextures.BACKGROUND_GLOW_RED, + TecTechUITextures.PICTURE_OVERLAY_RED, + TecTechUITextures.PICTURE_UPGRADE_CONNECTOR_RED_OPAQUE, + TecTechUITextures.PICTURE_UPGRADE_CONNECTOR_RED), + + ; + + // spotless:on + + private final UITexture background; + private final UITexture overlay; + private final UITexture opaqueConnector; + private final UITexture connector; + + UpgradeColor(UITexture background, UITexture overlay, UITexture opaqueConnector, UITexture connector) { + this.background = background; + this.overlay = overlay; + this.opaqueConnector = opaqueConnector; + this.connector = connector; + } + + public UITexture getBackground() { + return background; + } + + public UITexture getOverlay() { + return overlay; + } + + public UITexture getOpaqueConnector() { + return opaqueConnector; + } + + public UITexture getConnector() { + return connector; + } +} diff --git a/src/main/java/tectech/util/GodforgeMath.java b/src/main/java/tectech/util/GodforgeMath.java deleted file mode 100644 index d4d43f01cf..0000000000 --- a/src/main/java/tectech/util/GodforgeMath.java +++ /dev/null @@ -1,296 +0,0 @@ -package tectech.util; - -import java.math.BigInteger; - -import tectech.thing.metaTileEntity.multi.godforge.MTEBaseModule; -import tectech.thing.metaTileEntity.multi.godforge.MTEExoticModule; -import tectech.thing.metaTileEntity.multi.godforge.MTEForgeOfGods; -import tectech.thing.metaTileEntity.multi.godforge.MTEMoltenModule; -import tectech.thing.metaTileEntity.multi.godforge.MTEPlasmaModule; -import tectech.thing.metaTileEntity.multi.godforge.MTESmeltingModule; - -public class GodforgeMath { - - public static int getRandomIntInRange(int min, int max) { - return (int) (Math.random() * (max - min)) + min; - } - - public static double calculateFuelConsumption(MTEForgeOfGods godforge) { - double upgradeFactor = 1; - if (godforge.isUpgradeActive(2)) { - upgradeFactor = 0.8; - } - if (godforge.getFuelType() == 0) { - return godforge.getFuelFactor() * 300 * Math.pow(1.15, godforge.getFuelFactor()) * upgradeFactor; - } - if (godforge.getFuelType() == 1) { - return godforge.getFuelFactor() * 2 * Math.pow(1.08, godforge.getFuelFactor()) * upgradeFactor; - } else return godforge.getFuelFactor() / 25f * upgradeFactor; - } - - public static int calculateStartupFuelConsumption(MTEForgeOfGods godforge) { - return (int) Math.max(godforge.getFuelFactor() * 25 * Math.pow(1.2, godforge.getFuelFactor()), 1); - } - - public static int calculateMaxFuelFactor(MTEForgeOfGods godforge) { - int fuelCap = 5; - 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); - } - - public static int calculateEffectiveFuelFactor(MTEForgeOfGods godforge) { - int fuelFactor = godforge.getFuelFactor(); - if (fuelFactor <= 43) { - return fuelFactor; - } else { - return 43 + (int) Math.floor(Math.pow((fuelFactor - 43), 0.4)); - } - } - - public static void calculateMaxHeatForModules(MTEBaseModule module, MTEForgeOfGods godforge) { - double logBase = 1.5; - int baseHeat = 12601; - if (godforge.isUpgradeActive(12)) { - if (module instanceof MTESmeltingModule) { - logBase = 1.12; - } else { - logBase = 1.18; - } - } - int recipeHeat = baseHeat + (int) (Math.log(godforge.getFuelFactor()) / Math.log(logBase) * 1000); - module.setHeatForOC(calculateOverclockHeat(module, godforge, recipeHeat)); - module.setHeat(recipeHeat); - } - - public static int calculateOverclockHeat(MTEBaseModule module, MTEForgeOfGods godforge, Integer recipeHeat) { - int actualHeat; - double exponent; - if (godforge.isUpgradeActive(20)) { - if (module instanceof MTESmeltingModule) { - 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(MTEBaseModule module, MTEForgeOfGods godforge) { - double speedBonus = 1; - - if (godforge.isUpgradeActive(1)) { - speedBonus = Math.pow(module.getHeat(), -0.01); - } - - if (godforge.isUpgradeActive(22)) { - if (module instanceof MTEPlasmaModule) { - speedBonus /= Math.pow(module.getMaxParallel(), 0.02); - } else { - speedBonus /= Math.pow(module.getMaxParallel(), 0.012); - } - } - - if (module instanceof MTEExoticModule) { - if (godforge.isUpgradeActive(25)) { - speedBonus = Math.sqrt(speedBonus); - } else { - speedBonus = 1; - } - } - - module.setSpeedBonus(speedBonus); - } - - public static void calculateMaxParallelForModules(MTEBaseModule module, MTEForgeOfGods godforge) { - int baseParallel = 0; - float fuelFactorMultiplier = 1; - float heatMultiplier = 1; - float upgradeAmountMultiplier = 1; - int node53 = 1; - boolean isMoltenOrSmeltingWithUpgrade = false; - - if (module instanceof MTESmeltingModule) { - baseParallel = 1024; - } - if (module instanceof MTEMoltenModule) { - baseParallel = 512; - } - if (module instanceof MTEPlasmaModule) { - baseParallel = 384; - } - if (module instanceof MTEExoticModule) { - baseParallel = 64; - } - - if (module instanceof MTEMoltenModule - || (module instanceof MTESmeltingModule && godforge.isUpgradeActive(16))) { - isMoltenOrSmeltingWithUpgrade = true; - } - - if (godforge.isUpgradeActive(10)) { - node53 = 2; - } - - if (godforge.isUpgradeActive(6)) { - fuelFactorMultiplier = 1 + calculateEffectiveFuelFactor(godforge) / 15f; - if (godforge.isUpgradeActive(13)) { - if (isMoltenOrSmeltingWithUpgrade) { - fuelFactorMultiplier *= 3; - } else { - fuelFactorMultiplier *= 2; - } - } - } - - if (godforge.isUpgradeActive(18)) { - if (isMoltenOrSmeltingWithUpgrade) { - heatMultiplier = 1 + module.getHeat() / 15000f; - } else { - heatMultiplier = 1 + module.getHeat() / 25000f; - } - } - - if (godforge.isUpgradeActive(21)) { - if (isMoltenOrSmeltingWithUpgrade) { - upgradeAmountMultiplier = 1 + godforge.getTotalActiveUpgrades() / 5f; - } else { - upgradeAmountMultiplier = 1 + godforge.getTotalActiveUpgrades() / 8f; - } - } - - float totalBonuses = node53 * fuelFactorMultiplier * heatMultiplier * upgradeAmountMultiplier; - - if (module instanceof MTEExoticModule) { - if (godforge.isUpgradeActive(25)) { - totalBonuses = (float) Math.sqrt(totalBonuses); - } else { - totalBonuses = 1; - } - } - - int maxParallel = (int) (baseParallel * totalBonuses); - - module.setMaxParallel(maxParallel); - } - - public static void calculateEnergyDiscountForModules(MTEBaseModule module, MTEForgeOfGods godforge) { - double fillRatioDiscount = 1; - double maxBatteryDiscount = 1; - - if (godforge.isUpgradeActive(8)) { - maxBatteryDiscount = 1 - (1 - Math.pow(1.05, -0.05 * godforge.getMaxBatteryCharge())) / 20; - } - - if (godforge.isUpgradeActive(19)) { - double fillRatioMinusZeroPointFive = (double) godforge.getBatteryCharge() / godforge.getMaxBatteryCharge() - - 0.5; - if (module instanceof MTEPlasmaModule) { - 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 MTEExoticModule) { - if (godforge.isUpgradeActive(25)) { - fillRatioDiscount = Math.sqrt(fillRatioDiscount); - maxBatteryDiscount = Math.sqrt(maxBatteryDiscount); - } else { - fillRatioDiscount = 1; - maxBatteryDiscount = 1; - } - } - - module.setEnergyDiscount((float) (fillRatioDiscount * maxBatteryDiscount)); - } - - public static void calculateProcessingVoltageForModules(MTEBaseModule module, MTEForgeOfGods godforge) { - long voltage = 2_000_000_000; - - 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(MTEBaseModule module, MTEForgeOfGods 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 MTEPlasmaModule) { - overclockTimeFactor = 2.3; - } else { - overclockTimeFactor = 2.15; - } - if (module instanceof MTEExoticModule) { - 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(MTEBaseModule module, MTEForgeOfGods godforge) { - - if (module instanceof MTEMoltenModule && godforge.isUpgradeActive(5)) { - return true; - } - - if (module instanceof MTEPlasmaModule && godforge.isUpgradeActive(7)) { - return true; - } - - if (module instanceof MTEExoticModule && godforge.isUpgradeActive(11)) { - return true; - } - - return module instanceof MTESmeltingModule; - } - - public static void queryMilestoneStats(MTEBaseModule module, MTEForgeOfGods godforge) { - godforge.addTotalPowerConsumed(module.getPowerTally()); - module.setPowerTally(BigInteger.ZERO); - godforge.addTotalRecipesProcessed(module.getRecipeTally()); - module.setRecipeTally(0); - module.setInversionConfig(godforge.isInversionAvailable()); - } -} -- cgit