aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/main/java/goodgenerator/blocks/regularBlock/AntimatterRenderBlock.java62
-rw-r--r--src/main/java/goodgenerator/blocks/structures/AntimatterStructures.java3834
-rw-r--r--src/main/java/goodgenerator/blocks/tileEntity/AntimatterForge.java978
-rw-r--r--src/main/java/goodgenerator/blocks/tileEntity/AntimatterGenerator.java572
-rw-r--r--src/main/java/goodgenerator/blocks/tileEntity/AntimatterOutputHatch.java74
-rw-r--r--src/main/java/goodgenerator/blocks/tileEntity/render/TileAntimatter.java130
-rw-r--r--src/main/java/goodgenerator/client/ClientProxy.java4
-rw-r--r--src/main/java/goodgenerator/client/render/AntimatterRenderer.java253
-rw-r--r--src/main/java/goodgenerator/common/CommonProxy.java1
-rw-r--r--src/main/java/goodgenerator/loader/IDs_GoodGenerator.java49
-rw-r--r--src/main/java/goodgenerator/loader/Loaders.java49
-rw-r--r--src/main/java/gregtech/api/enums/ItemList.java2
-rw-r--r--src/main/java/gregtech/api/enums/Materials.java1
-rw-r--r--src/main/java/gregtech/api/enums/MaterialsUEVplus.java48
-rw-r--r--src/main/java/gregtech/api/enums/MetaTileEntityIDs.java1
-rw-r--r--src/main/java/gregtech/api/enums/Textures.java2
-rw-r--r--src/main/java/gregtech/loaders/preload/LoaderGTBlockFluid.java18
-rw-r--r--src/main/resources/assets/goodgenerator/lang/en_US.lang11
-rw-r--r--src/main/resources/assets/goodgenerator/models/Antimatter.obj270
-rw-r--r--src/main/resources/assets/goodgenerator/models/SmoothSphere.obj2487
-rw-r--r--src/main/resources/assets/goodgenerator/shaders/antimatter.frag.glsl9
-rw-r--r--src/main/resources/assets/goodgenerator/shaders/antimatter.vert.glsl80
-rw-r--r--src/main/resources/assets/goodgenerator/shaders/protomatter.frag.glsl8
-rw-r--r--src/main/resources/assets/goodgenerator/shaders/protomatter.vert.glsl87
-rw-r--r--src/main/resources/assets/goodgenerator/textures/blocks/antimatterAnnihilationMatrix.pngbin0 -> 636 bytes
-rw-r--r--src/main/resources/assets/goodgenerator/textures/blocks/antimatterContainmentCasing.pngbin0 -> 285 bytes
-rw-r--r--src/main/resources/assets/goodgenerator/textures/blocks/gravityStabilizationCasing.pngbin0 -> 546 bytes
-rw-r--r--src/main/resources/assets/goodgenerator/textures/blocks/magneticFluxCasing.pngbin0 -> 253 bytes
-rw-r--r--src/main/resources/assets/goodgenerator/textures/blocks/protomatterActivationCoil.pngbin0 -> 492 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.antimatter.pngbin0 -> 4889 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.antimatter.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.protomatter.pngbin0 -> 5131 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.protomatter.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_ANTIMATTER.pngbin0 -> 414 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_ANTIMATTER_GLOW.pngbin0 -> 222 bytes
-rw-r--r--src/main/resources/assets/tectech/lang/en_US.lang4
36 files changed, 9035 insertions, 1 deletions
diff --git a/src/main/java/goodgenerator/blocks/regularBlock/AntimatterRenderBlock.java b/src/main/java/goodgenerator/blocks/regularBlock/AntimatterRenderBlock.java
new file mode 100644
index 0000000000..baa06f70dc
--- /dev/null
+++ b/src/main/java/goodgenerator/blocks/regularBlock/AntimatterRenderBlock.java
@@ -0,0 +1,62 @@
+package goodgenerator.blocks.regularBlock;
+
+import java.util.ArrayList;
+
+import net.minecraft.block.Block;
+import net.minecraft.block.material.Material;
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.item.ItemStack;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.world.World;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import goodgenerator.blocks.tileEntity.render.TileAntimatter;
+
+public class AntimatterRenderBlock extends Block {
+
+ public AntimatterRenderBlock() {
+ super(Material.iron);
+ this.setResistance(20f);
+ this.setHardness(-1.0f);
+ this.setLightLevel(100.0f);
+ this.setBlockName("gg.antimatterRender");
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void registerBlockIcons(IIconRegister iconRegister) {
+ blockIcon = iconRegister.registerIcon("gregtech:iconsets/TRANSPARENT");
+ }
+
+ @Override
+ public boolean isOpaqueCube() {
+ return false;
+ }
+
+ @Override
+ public boolean canRenderInPass(int a) {
+ return true;
+ }
+
+ @Override
+ public boolean renderAsNormalBlock() {
+ return false;
+ }
+
+ @Override
+ public boolean hasTileEntity(int metadata) {
+ return true;
+ }
+
+ @Override
+ public TileEntity createTileEntity(World world, int metadata) {
+ return new TileAntimatter();
+ }
+
+ @Override
+ public ArrayList<ItemStack> getDrops(World world, int x, int y, int z, int meta, int fortune) {
+ return new ArrayList<>();
+ }
+
+}
diff --git a/src/main/java/goodgenerator/blocks/structures/AntimatterStructures.java b/src/main/java/goodgenerator/blocks/structures/AntimatterStructures.java
new file mode 100644
index 0000000000..e199e680cc
--- /dev/null
+++ b/src/main/java/goodgenerator/blocks/structures/AntimatterStructures.java
@@ -0,0 +1,3834 @@
+package goodgenerator.blocks.structures;
+
+public class AntimatterStructures {
+
+ public static final String[][] ANTIMATTER_FORGE = new String[][] {
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " D D ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " D D ",
+ " ",
+ " D D ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " D D ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " D D ",
+ " DAD ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " DD DD ",
+ " A A ",
+ " DD DD ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " DAD ",
+ " D D ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " D D ",
+ " DAD ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " DD DD ",
+ " A A ",
+ " DD DD ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " DAD ",
+ " D D ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " D D ",
+ " DAD ",
+ " DAD ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " DDD DDD ",
+ " AA AA ",
+ " DDD DDD ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " DAD ",
+ " DAD ",
+ " D D ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " D D ",
+ " DAD ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " D D ",
+ " DD D D DD ",
+ " A DD~DD A ",
+ " DD D D DD ",
+ " D D ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " DAD ",
+ " D D ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " D D ",
+ " DCD ",
+ " DAD ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " D D ",
+ " DDD DDDDDDD DDD ",
+ " CA AC ",
+ " DDD DDDDDDD DDD ",
+ " D D ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " DAD ",
+ " DCD ",
+ " D D ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " D D ",
+ " DCD ",
+ " DAD ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " D D ",
+ " DDD DDDCCCCCCCDDD DDD ",
+ " CA CCCCCCC AC ",
+ " DDD DDDCCCCCCCDDD DDD ",
+ " D D ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " DAD ",
+ " DCD ",
+ " D D ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " D D ",
+ " DCD ",
+ " DAD ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " D D ",
+ " DDD DDCCDCAAAAACDCCDD DDD ",
+ " CA CCCBBBBBBBCCC AC ",
+ " DDD DDCCCAAAAAAACCCDD DDD ",
+ " D D ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " DAD ",
+ " DCD ",
+ " D D ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " D D ",
+ " DCD ",
+ " DAD ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " D D ",
+ " DDD DCCACDCCCCCCCDCACCD DDD ",
+ " CA CCBBBCCCCCCCBBBCC AC ",
+ " DDD DCCAAACCCCCCCAAACCD DDD ",
+ " D D ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " DAD ",
+ " DCD ",
+ " D D ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " D D ",
+ " DDCDD ",
+ " DAD ",
+ " DAD ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " D DD DD D ",
+ " DDDD DCAAACDDDDDDDDDCAAACD DDDD ",
+ " CAA CBBBCC CCBBBC AAC ",
+ " DDDD DCAAACCDDDDDDDCCAAACD DDDD ",
+ " D DD DD D ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " DAD ",
+ " DAD ",
+ " DDCDD ",
+ " D D ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " D D ",
+ " DDCDD ",
+ " DAD ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " D DD DD D ",
+ " DDD DCAACCDD E E DDCCAACD DDD ",
+ " CA CBBCC D D CCBBC AC ",
+ " DDD DCAACCDD E E DDCCAACD DDD ",
+ " D DD DD D ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " DAD ",
+ " DDCDD ",
+ " D D ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " D D ",
+ " DDCDD ",
+ " DAD ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " D DD DD D ",
+ " DDD DCAACDD DDCAACD DDD ",
+ " CA CBBC CBBC AC ",
+ " DDD DCAACDD DDCAACD DDD ",
+ " D DD DD D ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " DAD ",
+ " DDCDD ",
+ " D D ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " D D ",
+ " DDCDD ",
+ " DAD ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " D D D D ",
+ " DDD DCAACD DCAACD DDD ",
+ " CA CBBC CBBC AC ",
+ " DDD DCAACD DCAACD DDD ",
+ " D D D D ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " DAD ",
+ " DDCDD ",
+ " D D ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " D D ",
+ " DDCDD ",
+ " DAD ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " D D D D ",
+ " DDD DCACD DCACD DDD ",
+ " CA CBC CBC AC ",
+ " DDD DCACD DCACD DDD ",
+ " D D D D ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " DAD ",
+ " DDCDD ",
+ " D D ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " D D ",
+ " DDCDD ",
+ " DAD ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " D D D D ",
+ " DDD DCAACD DCAACD DDD ",
+ " CA CBBC CBBC AC ",
+ " DDD DCAACD DCAACD DDD ",
+ " D D D D ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " DAD ",
+ " DDCDD ",
+ " D D ",
+ " ",
+ " " },
+ { " ",
+ " D D ",
+ " DDCDD ",
+ " DAD ",
+ " DAD ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " D D D D ",
+ " DDDD DCCCD DCCCD DDDD ",
+ " CAA CBC CBC AAC ",
+ " DDDD DCACD DCACD DDDD ",
+ " D D D D ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " DAD ",
+ " DAD ",
+ " DDCDD ",
+ " D D ",
+ " " },
+ { " ",
+ " D D ",
+ " DDCDD ",
+ " DAD ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " D D D D ",
+ " DDD DDDDD DDDDD DDD ",
+ " CA CBC CBC AC ",
+ " DDD DCACD DCACD DDD ",
+ " D D D D ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " DAD ",
+ " DDCDD ",
+ " D D ",
+ " " },
+ { " ",
+ " D D ",
+ " DDCDD ",
+ " DAD ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " D D D D ",
+ " DDD DCCCD DCCCD DDD ",
+ " CA CBC CBC AC ",
+ " DDD DCACD DCACD DDD ",
+ " D D D D ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " DAD ",
+ " DDCDD ",
+ " D D ",
+ " " },
+ { " DDDDD ",
+ " DD DD ",
+ " DDCDD ",
+ " DDADD ",
+ " DDDDD ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ "DDDDDDDDDDDDDDDD DDDDDDDDDDDDDDDD",
+ "DDDD DCACDE EDCACD DDDD",
+ "D CA CBC D D CBC AC D",
+ "DDDD DCACDE EDCACD DDDD",
+ "DDDDDDDDDDDDDDDD DDDDDDDDDDDDDDDD",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " DDDDD ",
+ " DDADD ",
+ " DDCDD ",
+ " DD DD ",
+ " DDDDD " },
+ { " ",
+ " D D ",
+ " AFA ",
+ " DAD ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " DAD DCACD DCACD DAD ",
+ " HAAAAAAAAACBC CBCAAAAAAAAAH ",
+ " DAD DCACD DCACD DAD ",
+ " D D ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " DAD ",
+ " AFA ",
+ " D D ",
+ " " },
+ { " ",
+ " D D ",
+ " AFA ",
+ " DAD ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " DAAAAAAAAAAAACD DCAAAAAAAAAAAAD ",
+ " HBBBBBBBBBBBC CBBBBBBBBBBBH ",
+ " DAAAAAAAAAAAACD DCAAAAAAAAAAAAD ",
+ " D D ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " DAD ",
+ " AFA ",
+ " D D ",
+ " " },
+ { " ",
+ " D D ",
+ " AFA ",
+ " DAD ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " DAD DCACD DCACD DAD ",
+ " HAAAAAAAAACBC CBCAAAAAAAAAH ",
+ " DAD DCACD DCACD DAD ",
+ " D D ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " DAD ",
+ " AFA ",
+ " D D ",
+ " " },
+ { " DDDDD ",
+ " DD DD ",
+ " DDCDD ",
+ " DDADD ",
+ " DDDDD ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ "DDDDDDDDDDDDDDDD DDDDDDDDDDDDDDDD",
+ "DDDD DCACDE EDCACD DDDD",
+ "D CA CBC D D CBC AC D",
+ "DDDD DCACDE EDCACD DDDD",
+ "DDDDDDDDDDDDDDDD DDDDDDDDDDDDDDDD",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " DDDDD ",
+ " DDADD ",
+ " DDCDD ",
+ " DD DD ",
+ " DDDDD " },
+ { " ",
+ " D D ",
+ " DDCDD ",
+ " DAD ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " D D D D ",
+ " DDD DCCCD DCCCD DDD ",
+ " CA CBC CBC AC ",
+ " DDD DCACD DCACD DDD ",
+ " D D D D ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " DAD ",
+ " DDCDD ",
+ " D D ",
+ " " },
+ { " ",
+ " D D ",
+ " DDCDD ",
+ " DAD ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " D D D D ",
+ " DDD DDDDD DDDDD DDD ",
+ " CA CBC CBC AC ",
+ " DDD DCACD DCACD DDD ",
+ " D D D D ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " DAD ",
+ " DDCDD ",
+ " D D ",
+ " " },
+ { " ",
+ " D D ",
+ " DDCDD ",
+ " DDD ",
+ " DAD ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " D D D D ",
+ " DDDD DCCCD DCCCD DDDD ",
+ " C A CBC CBC A C ",
+ " DDDD DCACD DCACD DDDD ",
+ " D D D D ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " DAD ",
+ " D D ",
+ " DDCDD ",
+ " D D ",
+ " " },
+ { " ",
+ " ",
+ " D D ",
+ " DDCDD ",
+ " DAD ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " D D D D ",
+ " DDD DCAACD DCAACD DDD ",
+ " CA CBBC CBBC AC ",
+ " DDD DCAACD DCAACD DDD ",
+ " D D D D ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " DAD ",
+ " DDCDD ",
+ " D D ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " D D ",
+ " DDCDD ",
+ " DAD ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " D D D D ",
+ " DDD DCACD DCACD DDD ",
+ " CA CBC CBC AC ",
+ " DDD DCACD DCACD DDD ",
+ " D D D D ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " DAD ",
+ " DDCDD ",
+ " D D ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " D D ",
+ " DDCDD ",
+ " DAD ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " D D D D ",
+ " DDD DCAACD DCAACD DDD ",
+ " CA CBBC CBBC AC ",
+ " DDD DCAACD DCAACD DDD ",
+ " D D D D ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " DAD ",
+ " DDCDD ",
+ " D D ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " D D ",
+ " DDCDD ",
+ " DAD ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " D DD DD D ",
+ " DDD DCAACDD DDCAACD DDD ",
+ " CA CBBC CBBC AC ",
+ " DDD DCAACDD DDCAACD DDD ",
+ " D DD DD D ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " DAD ",
+ " DDCDD ",
+ " D D ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " D D ",
+ " DDCDD ",
+ " DAD ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " D DD DD D ",
+ " DDD DCAACCDD E E DDCCAACD DDD ",
+ " CA CBBCC D D CCBBC AC ",
+ " DDD DCAACCDD E E DDCCAACD DDD ",
+ " D DD DD D ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " DAD ",
+ " DDCDD ",
+ " D D ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " D D ",
+ " DDCDD ",
+ " DDD ",
+ " DAD ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " D DD DD D ",
+ " DDDD DCAAACDDDDDDDDDCAAACD DDDD ",
+ " C A CBBBCC CCBBBC A C ",
+ " DDDD DCAAACCDDDDDDDCCAAACD DDDD ",
+ " D DDDDDDD D ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " DAD ",
+ " DDD ",
+ " DDCDD ",
+ " D D ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " D D ",
+ " DCD ",
+ " DAD ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " D D ",
+ " DDD DCCACDCCCCCCCDCACCD DDD ",
+ " CA CCBBBCCCCCCCBBBCC AC ",
+ " DDD DCCAAACCCCCCCAAACCD DDD ",
+ " D D ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " DAD ",
+ " DCD ",
+ " D D ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " D D ",
+ " DCD ",
+ " DAD ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " D D ",
+ " DDD DDCCDCAAAAACDCCDD DDD ",
+ " CA CCCBBBBBBBCCC AC ",
+ " DDD DDCCCAAAAAAACCCDD DDD ",
+ " D D ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " DAD ",
+ " DCD ",
+ " D D ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " D D ",
+ " DCD ",
+ " DDD ",
+ " DAD ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " D D ",
+ " DDDD DDDCCCACCCDDD DDDD ",
+ " C A CCCBCCC A C ",
+ " DDDD DDDCCCACCCDDD DDDD ",
+ " D D ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " DAD ",
+ " DDD ",
+ " DCD ",
+ " D D ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " D D ",
+ " DCD ",
+ " DAD ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " D D ",
+ " DDD DDDADDD DDD ",
+ " CA ABA AC ",
+ " DDD DDDADDD DDD ",
+ " D D ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " DAD ",
+ " DCD ",
+ " D D ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " D D ",
+ " DCD ",
+ " DAD ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " D D ",
+ " DDD A DDD ",
+ " CA ABA AC ",
+ " DDD A DDD ",
+ " D D ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " DAD ",
+ " DCD ",
+ " D D ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " D D ",
+ " DCD ",
+ " DDD ",
+ " DAD ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " D D ",
+ " DDDD A DDDD ",
+ " C A ABA A C ",
+ " DDDD A DDDD ",
+ " D D ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " DAD ",
+ " DDD ",
+ " DCD ",
+ " D D ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " D D ",
+ " DCD ",
+ " DCD ",
+ " DAD ",
+ " DAD ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " D D ",
+ " DDDDD A DDDDD ",
+ " CCAA ABA AACC ",
+ " DDDDD A DDDDD ",
+ " D D ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " DAD ",
+ " DAD ",
+ " DCD ",
+ " DCD ",
+ " D D ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " D D ",
+ " D D ",
+ " DCD ",
+ " DDD ",
+ " DAD ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " D D ",
+ " DDDDD A DDDDD ",
+ " C A ABA A C ",
+ " DDDDD A DDDDD ",
+ " D D ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " DAD ",
+ " DDD ",
+ " DCD ",
+ " D D ",
+ " D D ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " D D ",
+ " DCD ",
+ " DCD ",
+ " DAD ",
+ " DAD ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " D D ",
+ " DDDDD A DDDDD ",
+ " CCAA ABA AACC ",
+ " DDDDD A DDDDD ",
+ " D D ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " DAD ",
+ " DAD ",
+ " DCD ",
+ " DCD ",
+ " D D ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " D D ",
+ " D D ",
+ " DCD ",
+ " DCD ",
+ " DAD ",
+ " DAD ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " D D ",
+ " DDDDDD A DDDDDD ",
+ " CCAA ABA AA C ",
+ " DDDDDD A DDDDDD ",
+ " D D ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " DAD ",
+ " DAD ",
+ " DDD ",
+ " DCD ",
+ " D D ",
+ " D D ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " D D ",
+ " DDCDD ",
+ " DDCDD ",
+ " DDCDD ",
+ " DAD ",
+ " DAD ",
+ " DAD ",
+ " DAD ",
+ " ",
+ " ",
+ " DDD DDDDD DDD ",
+ " DDDDDDDD A DDDDDDDD ",
+ " CCCAAAA ABA AAAACCC ",
+ " DDDDDDDD A DDDDDDDD ",
+ " DDD DDDDD DDD ",
+ " ",
+ " ",
+ " DAD ",
+ " DAD ",
+ " DAD ",
+ " DAD ",
+ " DDCDD ",
+ " DDCDD ",
+ " DDCDD ",
+ " D D ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " D D ",
+ " D D ",
+ " D D ",
+ " DDCDD ",
+ " DDCDD ",
+ " DDCDD ",
+ " DDD ",
+ " DAD ",
+ " DAD ",
+ " DDD DDADD DDD ",
+ " DDDDDDDDDDDADDDDDDDDDDD ",
+ " CCC AAADBDAAA CCC ",
+ " DDDDDDDDDDDADDDDDDDDDDD ",
+ " DDD DDADD DDD ",
+ " DAD ",
+ " DAD ",
+ " DDD ",
+ " DDCDD ",
+ " DDCDD ",
+ " DDCDD ",
+ " D D ",
+ " D D ",
+ " D D ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " D D ",
+ " D D ",
+ " D D ",
+ " DDCDD ",
+ " DDCDD ",
+ " DDCDD ",
+ " DDDDDCDDDDD ",
+ " DDDDDDDDCDDDDDDDD ",
+ " CCCCHHHCCCC ",
+ " DDDDDDDDCDDDDDDDD ",
+ " DDDDDCDDDDD ",
+ " DDCDD ",
+ " DDCDD ",
+ " DDCDD ",
+ " D D ",
+ " D D ",
+ " D D ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " D D ",
+ " D D ",
+ " D D ",
+ " DDDDD ",
+ " DDDDDDDDDDD ",
+ " ",
+ " DDDDDDDDDDD ",
+ " DD DD ",
+ " D D ",
+ " D D ",
+ " D D ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " DDDDD ",
+ " D D ",
+ " D D ",
+ " D D ",
+ " DDDDD ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " } };
+
+ /*
+ * public static final String[][] ANTIMATTER_GENERATOR = new String[][] {
+ * { " ", " ",
+ * " ", " ",
+ * " ", " ",
+ * " ", " ",
+ * " ", " ",
+ * " ", " ",
+ * " ", " ",
+ * " F ", " F ",
+ * " F ", " ",
+ * " ", " ",
+ * " ", " ",
+ * " ", " ",
+ * " ", " ",
+ * " ", " ",
+ * " ", " ",
+ * " " },
+ * { " ", " ",
+ * " ", " ",
+ * " ", " ",
+ * " ", " D ",
+ * " D ", " D ",
+ * " D ", " D ",
+ * " D ", " D ",
+ * " FDF ", " FDF ",
+ * " FDF ", " D ",
+ * " D ", " D ",
+ * " D ", " D ",
+ * " D ", " D ",
+ * " ", " ",
+ * " ", " ",
+ * " ", " ",
+ * " " },
+ * { " ", " ",
+ * " ", " ",
+ * " D ", " D ",
+ * " D ", " D ",
+ * " ", " ",
+ * " ", " BBBBBBB ",
+ * " ", " ",
+ * " ", " ",
+ * " ", " ",
+ * " ", " BBBBBBB ",
+ * " ", " ",
+ * " ", " D ",
+ * " D ", " D ",
+ * " D ", " ",
+ * " ", " ",
+ * " " },
+ * { " ", " ",
+ * " ", " ",
+ * " D ", " EEDEE ",
+ * " D ", " ",
+ * " ", " ",
+ * " ", " BBBB BBBB ",
+ * " ", " ",
+ * " ", " ",
+ * " ", " ",
+ * " ", " BBBB BBBB ",
+ * " ", " ",
+ * " ", " ",
+ * " D ", " EEDEE ",
+ * " D ", " ",
+ * " ", " ",
+ * " " },
+ * { " ", " ",
+ * " ", " D ",
+ * " EDE ", " EEEE D EEEE ",
+ * " ", " ",
+ * " ", " ",
+ * " ", " BBB BBB ",
+ * " ", " ",
+ * " ", " ",
+ * " ", " ",
+ * " ", " BBB BBB ",
+ * " ", " ",
+ * " ", " ",
+ * " ", " EEEE D EEEE ",
+ * " EDE ", " D ",
+ * " ", " ",
+ * " " },
+ * { " ", " ",
+ * " ", " D ",
+ * " EEEEEDEEEEE ", " EE D EE ",
+ * " ", " ",
+ * " ", " ",
+ * " ", " BB BB ",
+ * " ", " ",
+ * " ", " ",
+ * " ", " ",
+ * " ", " BB BB ",
+ * " ", " ",
+ * " ", " ",
+ * " ", " EE D EE ",
+ * " EEEEEDEEEEE ", " D ",
+ * " ", " ",
+ * " " },
+ * { " ", " ",
+ * " D ", " EEEDEEE ",
+ * " EEEE D EEEE ", " E E ",
+ * " ", " ",
+ * " ", " ",
+ * " ", " BBB BBB ",
+ * " ", " ",
+ * " F F ", " F F ",
+ * " F F ", " ",
+ * " ", " BBB BBB ",
+ * " ", " ",
+ * " ", " ",
+ * " ", " E E ",
+ * " EEEE D EEEE ", " EEEDEEE ",
+ * " D ", " ",
+ * " " },
+ * { " ", " ",
+ * " D ", " EEEEEDEEEEE ",
+ * " D EEE D EEE D ", " DE ED ",
+ * " D D ", " D D ",
+ * " D D ", " D D ",
+ * " D D ", " BD DB ",
+ * " D D ", " D D ",
+ * " FD DF ", " FD DF ",
+ * " FD DF ", " D D ",
+ * " D D ", " BD DB ",
+ * " D D ", " D D ",
+ * " D D ", " D D ",
+ * " D D ", " DE ED ",
+ * " D EEE D EEE D ", " EEEEEDEEEEE ",
+ * " D ", " ",
+ * " " },
+ * { " ", " D ",
+ * " EEDEE ", " D EEEEE D EEEEE D ",
+ * " EE EE ", " ED DE ",
+ * " ", " ",
+ * " D D ", " D D ",
+ * " D D ", " BB BB ",
+ * " ", " ",
+ * " ", " ",
+ * " ", " ",
+ * " ", " BB BB ",
+ * " D D ", " D D ",
+ * " D D ", " ",
+ * " ", " ED DE ",
+ * " EE EE ", " D EEEEE D EEEEE D ",
+ * " EEDEE ", " D ",
+ * " " },
+ * { " ", " D ",
+ * " D EEEEDEEEE D ", " EEEE D EEEE ",
+ * " EED DEE ", " E E ",
+ * " ", " ",
+ * " ", " ",
+ * " D D ", " BB D D BB ",
+ * " D D ", " ",
+ * " ", " ",
+ * " ", " ",
+ * " D D ", " BB D D BB ",
+ * " D D ", " ",
+ * " ", " ",
+ * " ", " E E ",
+ * " EED DEE ", " EEEE D EEEE ",
+ * " D EEEEDEEEE D ", " D ",
+ * " " },
+ * { " ", " D ",
+ * " DEEEEEEDEEEEEED ", " EEE D EEE ",
+ * " EE D D EE ", " E E ",
+ * " ", " ",
+ * " ", " ",
+ * " ", " B B ",
+ * " D D ", " D D ",
+ * " EEEEE ", " ",
+ * " EEEEE ", " D D ",
+ * " D D ", " B B ",
+ * " ", " ",
+ * " ", " ",
+ * " ", " E E ",
+ * " EE D D EE ", " EEE D EEE ",
+ * " DEEEEEEDEEEEEED ", " D ",
+ * " " },
+ * { " ", " D D D ",
+ * " EEEEEEEDEEEEEEE ", " EE D D D EE ",
+ * " EE EE ", " E E ",
+ * " ", " ",
+ * " ", " ",
+ * " ", " BB BB ",
+ * " ", " D D ",
+ * " BEEAAAAAEEBD ", " CCCCC ",
+ * " DBEEAAAAAEEBD ", " D D ",
+ * " ", " BB BB ",
+ * " ", " ",
+ * " ", " ",
+ * " ", " E E ",
+ * " EE EE ", " EE D D D EE ",
+ * " EEEEEEEDEEEEEEE ", " D D D ",
+ * " " },
+ * { " D ", " D EEDEE D ",
+ * " EEEEE D EEEEE ", " EEE D D EEE ",
+ * " EE EE ", " E E ",
+ * " ", " ",
+ * " ", " ",
+ * " ", " B B ",
+ * " ", " ",
+ * " BEAAEEEEEAAEB ", " CCEECEECC ",
+ * " BEAAEEEEEAAEB ", " ",
+ * " ", " B B ",
+ * " ", " ",
+ * " ", " ",
+ * " ", " E E ",
+ * " EE EE ", " EEE D D EEE ",
+ * " EEEEE D EEEEE ", " D EEDEE D ",
+ * " D " },
+ * { " D ", " DEEEDEEED ",
+ * " EEEEE D EEEEE ", " EE D D EE ",
+ * " EE EE ", " E E ",
+ * " ", " ",
+ * " ", " ",
+ * " ", " B B ",
+ * " ", " ",
+ * " EAEE EEAE ", " CEE C EEC ",
+ * " EAEE EEAE ", " ",
+ * " ", " B B ",
+ * " ", " ",
+ * " ", " ",
+ * " ", " E E ",
+ * " EE EE ", " EE D D EE ",
+ * " EEEEE D EEEEE ", " DEEEDEEED ",
+ * " D " },
+ * { " D D D ", " EEEEDEEEE ",
+ * " EEEE D D D EEEE ", " EEE EEE ",
+ * " E E ", " E E ",
+ * " ", " ",
+ * " ", " ",
+ * " ", " BB BB ",
+ * " ", " ",
+ * " EAE EAE ", " CE C EC ",
+ * " EAE EAE ", " ",
+ * " ", " BB BB ",
+ * " ", " ",
+ * " ", " ",
+ * " ", " E E ",
+ * " E E ", " EEE EEE ",
+ * " EEEE D D D EEEE ", " EEEEDEEEE ",
+ * " D D D " },
+ * { " DDDDD ", " EEEEEDEEEEE ",
+ * " EEEE DDDDD EEEE ", " EE D D EE ",
+ * " E D D E ", " EE EE ",
+ * " ", " ",
+ * " ", " ",
+ * " ", " B B ",
+ * " ", " ",
+ * " EAE EAE ", " CE C EC ",
+ * " EAE EAE ", " ",
+ * " ", " B B ",
+ * " ", " ",
+ * " ", " ",
+ * " ", " EE EE ",
+ * " E D D E ", " EE D D EE ",
+ * " EEEE DDDDD EEEE ", " EEEEEDEEEEE ",
+ * " DDDDD " },
+ * { " D D ", " EEEEEEEEEEE ",
+ * " EEEE DEEED EEEE ", " EE EEE EE ",
+ * " EE EEE EE ", " E DED E ",
+ * " DED ", " DED ",
+ * " A ", " A ",
+ * " A ", " B B ",
+ * " ", " ",
+ * " F EAE E EAE F ", " F CE ECE EC F ",
+ * " F EAE E EAE F ", " ",
+ * " ", " B B ",
+ * " A ", " A ",
+ * " A ", " DED ",
+ * " DED ", " E DED E ",
+ * " EE EEE EE ", " EE E~E EE ",
+ * " EEEE DEEED EEEE ", " EEEEEEEEEEE ",
+ * " D D " },
+ * { " DDDD DDDD ", " DDDDDDDDEGEDDDDDDDD ",
+ * " DDDDDDDDDDECEDDDDDDDDDD ", " DDDDDDDDD ECE DDDDDDDDD ",
+ * " DDDDDD ECE DDDDDD ", " DDDD ECE DDDD ",
+ * " DDD ECE DD ", " D ECE DD ",
+ * " D ACA D ", " D ACA D ",
+ * " D ACA D ", " DB C BD ",
+ * " D C D ", " D C D ",
+ * "FD EAE ECE EAE DF", "FD CCCCCCCCCCCCC DF",
+ * "FD EAE ECE EAE DF", " D C D ",
+ * " D C D ", " DB C BD ",
+ * " D ACA D ", " D ACA D ",
+ * " D ACA D ", " DD ECE DD ",
+ * " DD ECE DD ", " DDDD ECE DDDD ",
+ * " DDDDDD ECE DDDDDD ", " DDDDDDDDD ECE DDDDDDDDD ",
+ * " DDDDDDDDDDECEDDDDDDDDDD ", " DDDDDDDDEGEDDDDDDDD ",
+ * " DDDD DDDD " },
+ * { " D D ", " EEEEEEEEEEE ",
+ * " EEEE DEEED EEEE ", " EE EEE EE ",
+ * " EE EEE EE ", " E DED E ",
+ * " DED ", " DED ",
+ * " A ", " A ",
+ * " A ", " B B ",
+ * " ", " ",
+ * " F EAE E EAE F ", " F CE ECE EC F ",
+ * " F EAE E EAE F ", " ",
+ * " ", " B B ",
+ * " A ", " A ",
+ * " A ", " DED ",
+ * " DED ", " E DED E ",
+ * " EE EEE EE ", " EE EEE EE ",
+ * " EEEE DEEED EEEE ", " EEEEEEEEEEE ",
+ * " D D " },
+ * { " DDDDD ", " EEEEEDEEEEE ",
+ * " EEEE DDDDD EEEE ", " EE D D EE ",
+ * " E D D E ", " EE EE ",
+ * " ", " ",
+ * " ", " ",
+ * " ", " B B ",
+ * " ", " ",
+ * " EAE EAE ", " CE C EC ",
+ * " EAE EAE ", " ",
+ * " ", " B B ",
+ * " ", " ",
+ * " ", " ",
+ * " ", " EE EE ",
+ * " E D D E ", " EE D D EE ",
+ * " EEEE DDDDD EEEE ", " EEEEEDEEEEE ",
+ * " DDDDD " },
+ * { " D D D ", " EEEEDEEEE ",
+ * " EEEE D D D EEEE ", " EEE EEE ",
+ * " E E ", " E E ",
+ * " ", " ",
+ * " ", " ",
+ * " ", " BB BB ",
+ * " ", " ",
+ * " EAE EAE ", " CE C EC ",
+ * " EAE EAE ", " ",
+ * " ", " BB BB ",
+ * " ", " ",
+ * " ", " ",
+ * " ", " E E ",
+ * " E E ", " EEE EEE ",
+ * " EEEE D D D EEEE ", " EEEEDEEEE ",
+ * " D D D " },
+ * { " D ", " DEEEDEEED ",
+ * " EEEEE D EEEEE ", " EE D D EE ",
+ * " EE EE ", " E E ",
+ * " ", " ",
+ * " ", " ",
+ * " ", " B B ",
+ * " ", " ",
+ * " EAEE EEAE ", " CEE C EEC ",
+ * " EAEE EEAE ", " ",
+ * " ", " B B ",
+ * " ", " ",
+ * " ", " ",
+ * " ", " E E ",
+ * " EE EE ", " EE D D EE ",
+ * " EEEEE D EEEEE ", " DEEEDEEED ",
+ * " D " },
+ * { " D ", " D EEDEE D ",
+ * " EEEEE D EEEEE ", " EEE D D EEE ",
+ * " EE EE ", " E E ",
+ * " ", " ",
+ * " ", " ",
+ * " ", " B B ",
+ * " ", " ",
+ * " BEAAEEEEEAAEB ", " CCEECEECC ",
+ * " BEAAEEEEEAAEB ", " ",
+ * " ", " B B ",
+ * " ", " ",
+ * " ", " ",
+ * " ", " E E ",
+ * " EE EE ", " EEE D D EEE ",
+ * " EEEEE D EEEEE ", " D EEDEE D ",
+ * " D " },
+ * { " ", " D D D ",
+ * " EEEEEEEDEEEEEEE ", " EE D D D EE ",
+ * " EE EE ", " E E ",
+ * " ", " ",
+ * " ", " ",
+ * " ", " BB BB ",
+ * " ", " D D ",
+ * " BEEAAAAAEEBD ", " CCCCC ",
+ * " DBEEAAAAAEEBD ", " D D ",
+ * " ", " BB BB ",
+ * " ", " ",
+ * " ", " ",
+ * " ", " E E ",
+ * " EE EE ", " EE D D D EE ",
+ * " EEEEEEEDEEEEEEE ", " D D D ",
+ * " " },
+ * { " ", " D ",
+ * " DEEEEEEDEEEEEED ", " EEE D EEE ",
+ * " EE D D EE ", " E E ",
+ * " ", " ",
+ * " ", " ",
+ * " ", " B B ",
+ * " D D ", " D D ",
+ * " EEEEE ", " ",
+ * " EEEEE ", " D D ",
+ * " D D ", " B B ",
+ * " ", " ",
+ * " ", " ",
+ * " ", " E E ",
+ * " EE D D EE ", " EEE D EEE ",
+ * " DEEEEEEDEEEEEED ", " D ",
+ * " " },
+ * { " ", " D ",
+ * " D EEEEDEEEE D ", " EEEE D EEEE ",
+ * " EED DEE ", " E E ",
+ * " ", " ",
+ * " ", " ",
+ * " D D ", " BB D D BB ",
+ * " D D ", " ",
+ * " ", " ",
+ * " ", " ",
+ * " D D ", " BB D D BB ",
+ * " D D ", " ",
+ * " ", " ",
+ * " ", " E E ",
+ * " EED DEE ", " EEEE D EEEE ",
+ * " D EEEEDEEEE D ", " D ",
+ * " " },
+ * { " ", " D ",
+ * " EEDEE ", " D EEEEE D EEEEE D ",
+ * " EE EE ", " ED DE ",
+ * " ", " ",
+ * " D D ", " D D ",
+ * " D D ", " BB BB ",
+ * " ", " ",
+ * " ", " ",
+ * " ", " ",
+ * " ", " BB BB ",
+ * " D D ", " D D ",
+ * " D D ", " ",
+ * " ", " ED DE ",
+ * " EE EE ", " D EEEEE D EEEEE D ",
+ * " EEDEE ", " D ",
+ * " " },
+ * { " ", " ",
+ * " D ", " EEEEEDEEEEE ",
+ * " D EEE D EEE D ", " DE ED ",
+ * " D D ", " D D ",
+ * " D D ", " D D ",
+ * " D D ", " BD DB ",
+ * " D D ", " D D ",
+ * " FD DF ", " FD DF ",
+ * " FD DF ", " D D ",
+ * " D D ", " BD DB ",
+ * " D D ", " D D ",
+ * " D D ", " D D ",
+ * " D D ", " DE ED ",
+ * " D EEE D EEE D ", " EEEEEDEEEEE ",
+ * " D ", " ",
+ * " " },
+ * { " ", " ",
+ * " D ", " EEEDEEE ",
+ * " EEEE D EEEE ", " E E ",
+ * " ", " ",
+ * " ", " ",
+ * " ", " BBB BBB ",
+ * " ", " ",
+ * " F F ", " F F ",
+ * " F F ", " ",
+ * " ", " BBB BBB ",
+ * " ", " ",
+ * " ", " ",
+ * " ", " E E ",
+ * " EEEE D EEEE ", " EEEDEEE ",
+ * " D ", " ",
+ * " " },
+ * { " ", " ",
+ * " ", " D ",
+ * " EEEEEDEEEEE ", " EE D EE ",
+ * " ", " ",
+ * " ", " ",
+ * " ", " BB BB ",
+ * " ", " ",
+ * " ", " ",
+ * " ", " ",
+ * " ", " BB BB ",
+ * " ", " ",
+ * " ", " ",
+ * " ", " EE D EE ",
+ * " EEEEEDEEEEE ", " D ",
+ * " ", " ",
+ * " " },
+ * { " ", " ",
+ * " ", " D ",
+ * " EDE ", " EEEE D EEEE ",
+ * " ", " ",
+ * " ", " ",
+ * " ", " BBB BBB ",
+ * " ", " ",
+ * " ", " ",
+ * " ", " ",
+ * " ", " BBB BBB ",
+ * " ", " ",
+ * " ", " ",
+ * " ", " EEEE D EEEE ",
+ * " EDE ", " D ",
+ * " ", " ",
+ * " " },
+ * { " ", " ",
+ * " ", " D ",
+ * " D ", " EEDEE ",
+ * " D ", " ",
+ * " ", " ",
+ * " ", " BBBB BBBB ",
+ * " ", " ",
+ * " ", " ",
+ * " ", " ",
+ * " ", " BBBB BBBB ",
+ * " ", " ",
+ * " ", " ",
+ * " D ", " EEDEE ",
+ * " D ", " D ",
+ * " ", " ",
+ * " " },
+ * { " ", " ",
+ * " ", " ",
+ * " D ", " D ",
+ * " D ", " D ",
+ * " ", " ",
+ * " ", " BBBBBBB ",
+ * " ", " ",
+ * " ", " ",
+ * " ", " ",
+ * " ", " BBBBBBB ",
+ * " ", " ",
+ * " ", " D ",
+ * " D ", " D ",
+ * " D ", " ",
+ * " ", " ",
+ * " " },
+ * { " ", " ",
+ * " ", " ",
+ * " ", " ",
+ * " ", " D ",
+ * " D ", " D ",
+ * " D ", " D ",
+ * " D ", " D ",
+ * " FDF ", " FDF ",
+ * " FDF ", " D ",
+ * " D ", " D ",
+ * " D ", " D ",
+ * " D ", " D ",
+ * " ", " ",
+ * " ", " ",
+ * " ", " ",
+ * " " },
+ * { " ", " ",
+ * " ", " ",
+ * " ", " ",
+ * " ", " ",
+ * " ", " ",
+ * " ", " ",
+ * " ", " ",
+ * " F ", " F ",
+ * " F ", " ",
+ * " ", " ",
+ * " ", " ",
+ * " ", " ",
+ * " ", " ",
+ * " ", " ",
+ * " ", " ",
+ * " " } };
+ * }
+ */
+
+ public static final String[][] ANTIMATTER_GENERATOR = new String[][] {
+ { " ", " ",
+ " ", " ",
+ " ", " ",
+ " ", " ",
+ " F ", " F ",
+ " F ", " F ",
+ " F ", " F ",
+ " F ", " F ",
+ " DDD ", " DDD ",
+ " DDD ", " F ",
+ " F ", " F ",
+ " F ", " F ",
+ " F ", " F ",
+ " F ", " F ",
+ " F ", " F ",
+ " F ", " F ",
+ " F ", " F ",
+ " F ", " F ",
+ " F ", " F ",
+ " D ", " DDD ",
+ " DDD ", " D~D ",
+ " DDD " },
+ { " ", " ",
+ " ", " ",
+ " ", " ",
+ " ", " F ",
+ " CCC ", " CCC ",
+ " CCC ", " CCC ",
+ " CCC ", " CCC ",
+ " CCC ", " CCC ",
+ " DCCCD ", " DCCCD ",
+ " DCCCD ", " CCC ",
+ " CCC ", " CCC ",
+ " CCC ", " CCC ",
+ " CCC ", " CCC ",
+ " CCC ", " CCC ",
+ " CCC ", " CCC ",
+ " CCC ", " CCC ",
+ " CCC ", " CCC ",
+ " CCC ", " CCC ",
+ " CCC ", " CCC ",
+ " CCC ", " CCC ",
+ " HCCCH ", " HCCCH ",
+ " HDDDH " },
+ { " ", " ",
+ " ", " ",
+ " ", " ",
+ " F ", " CCC ",
+ " CCC ", " CCC ",
+ " CCC ", " CCC ",
+ " CCC ", " CCC ",
+ " CCC ", " CCC ",
+ " DCCCD ", " CCC ",
+ " DCCCD ", " CCC ",
+ " CCC ", " CCC ",
+ " CCC ", " CCC ",
+ " CCC ", " CCC ",
+ " CCC ", " CCC ",
+ " CCC ", " CCC ",
+ " CCC ", " CCC ",
+ " CCC ", " CCC ",
+ " CCC ", " CCC ",
+ " CCC ", " CCC ",
+ " CCC ", " DCCCD ",
+ " HCCCH ", " DCCCD ",
+ " HDDDH " },
+ { " ", " ",
+ " ", " ",
+ " ", " ",
+ " F ", " CCC ",
+ " CCC ", " CCC ",
+ " CCC ", " CCC ",
+ " CCC ", " CCC ",
+ " CCC ", " CCC ",
+ " DCCCD ", " CCC ",
+ " DCCCD ", " CCC ",
+ " CCC ", " CCC ",
+ " CCC ", " CCC ",
+ " CCC ", " CCC ",
+ " CCC ", " CCC ",
+ " CCC ", " CCC ",
+ " CCC ", " DCCCD ",
+ " DCCCD ", " DCCCD ",
+ " DCCCD ", " DCCCD ",
+ " DCCCD ", " DCCCD ",
+ " DCCCD ", " DCCCD ",
+ " HCCCH ", " HCCCH ",
+ " HDDDH " },
+ { " ", " ",
+ " ", " ",
+ " ", " DDD ",
+ " DDDDD ", " DCCCD ",
+ " DCCCD ", " DCCCD ",
+ " DCCCD ", " DCCCD ",
+ " DCCCD ", " DCCCD ",
+ " DCCCD ", " DCCCD ",
+ " DCCCD ", " CCC ",
+ " DCCCD ", " DCCCD ",
+ " DCCCD ", " DCCCD ",
+ " DCCCD ", " DCCCD ",
+ " DCCCD ", " DCCCD ",
+ " DCCCD ", " DCCCD ",
+ " DCCCD ", " DCCCD ",
+ " DCCCD ", " DCCCD ",
+ " DCCCD ", " DCCCD ",
+ " DCCCD ", " DCCCD ",
+ " DCCCD ", " DDCCCDD ",
+ " DDCCCDD ", " DDCCCDD ",
+ " DDCCCDD ", " DDCCCDD ",
+ " DDDDDDD " },
+ { " ", " ",
+ " ", " ",
+ " DDD ", " DDDDD ",
+ " DDDDDDD ", " DDDDDDD ",
+ " DDCCCDD ", " DDCCCDD ",
+ " DDCCCDD ", " DDCCCDD ",
+ " DDCCCDD ", " DDCCCDD ",
+ " DDCCCDD ", " DDCCCDD ",
+ " DDCCCDD ", " DDCCCDD ",
+ " DDCCCDD ", " DDCCCDD ",
+ " DDCCCDD ", " DDCCCDD ",
+ " DDCCCDD ", " DDCCCDD ",
+ " DDCCCDD ", " DDCCCDD ",
+ " DDCCCDD ", " DDCCCDD ",
+ " DDCCCDD ", " DDCCCDD ",
+ " DDCCCDD ", " DDCCCDD ",
+ " DDCCCDD ", " DDCCCDD ",
+ " DDCCCDD ", " DDCCCDD ",
+ " DDCCCDD ", " DDCCCDD ",
+ " DDCCCDD ", " DDCCCDD ",
+ " DDDDDDD ", " DDDDDDD ",
+ " FFDDDDDDDFF " },
+ { " ", " ",
+ " ", " DDD ",
+ " DDDDD ", " DDDDD ",
+ " DDDDDDDDDDD ", " DDDDDDDDDDD ",
+ " FFDDDDDDDFF ", " DDDCDDD ",
+ " DD DD ", " DD DD ",
+ " DD DD ", " DD DD ",
+ " DD DD ", " DD DD ",
+ " DDDDDDDDDDD ", " DDDDDDDDD ",
+ " DDDDDDDDDDD ", " DD DD ",
+ " DD DD ", " DD DD ",
+ " DD DD ", " DD DD ",
+ " DD DD ", " DD DD ",
+ " DD DD ", " DD DD ",
+ " DD DD ", " DD DD ",
+ " DD DD ", " DD DD ",
+ " DD DD ", " DD DD ",
+ " DD DD ", " DD DD ",
+ " DD DD ", " DD DD ",
+ " CCCCCCC ", " FFCCCCCCCFF ",
+ " DDDDG GDDDD ", " DDDDG GDDDD ",
+ " FFDDDDDDDDDDDFF " },
+ { " ", " ",
+ " ", " DDD ",
+ " DDDDD ", " DDDDD ",
+ " DDDDDDDDDDDDDDD ", " DDDDGGGGGGGDDDD ",
+ " FFCCGGGGGGGCCFF ", " CCGGGGGGGCC ",
+ " AA AA ", " AA AA ",
+ " AA AA ", " AA AA ",
+ " AA AA ", " AA AA ",
+ " DDAA F AADD ", " AA FCF AA ",
+ " DDAA F AADD ", " AA AA ",
+ " AA AA ", " AA AA ",
+ " AA AA ", " AA AA ",
+ " AA AA ", " AA AA ",
+ " AA AA ", " AA AA ",
+ " AA AA ", " AA AA ",
+ " AA AA ", " AA AA ",
+ " AA AA ", " AA AA ",
+ " AA AA ", " AA AA ",
+ " AA AA ", " AA AA ",
+ " CC CC ", " FFCCGGGGGGGCCFF ",
+ " DDDDGGGGGGGDDDD ", " DDDDGGGGGGGDDDD ",
+ " FDDDDDDDDDDDDDDDF " },
+ { " ", " ",
+ " ", " DDD ",
+ " DDDDD ", " DDDDD ",
+ " DDDDDDDDDDDDDDDDD ", " DDDGGDDDDDDDGGDDD ",
+ " FCCGGDDDCDDDGGCCF ", " CCGG GGCC ",
+ " AA AA ", " AA AA ",
+ " AA AA ", " AA AA ",
+ " AA AA ", " AA AA ",
+ " DAA F AAD ", " AA FCF AA ",
+ " DAA F AAD ", " AA AA ",
+ " AA AA ", " AA AA ",
+ " AA AA ", " AA AA ",
+ " AA AA ", " AA AA ",
+ " AA AA ", " AA AA ",
+ " AA AA ", " AA AA ",
+ " AA AA ", " AA AA ",
+ " AA AA ", " AA AA ",
+ " AA AA ", " AA AA ",
+ " AA AA ", " AA AA ",
+ " CC CC ", " FCCGG GGCCF ",
+ " DDCGGDDDCDDDGGDDD ", " DDDGGDDDDDDDGGDDD ",
+ " FDDDDDDDDDDDDDDDDDF " },
+ { " ", " ",
+ " ", " DDD ",
+ " DDDDD ", " DDDDD ",
+ " DDDDDDDDDDDDDDDDDDD ", " DDGGDDDDDDDDDDDGGDD ",
+ " FCGGDDDDDCDDDDDGGCF ", " CGG GGC ",
+ " A A ", " A A ",
+ " A A ", " A A ",
+ " A A ", " A A ",
+ " DA F AD ", " A FCF A ",
+ " DA F AD ", " A A ",
+ " A A ", " A A ",
+ " A A ", " A A ",
+ " A A ", " A A ",
+ " A A ", " A A ",
+ " A A ", " A A ",
+ " A A ", " A A ",
+ " A A ", " A A ",
+ " A A ", " A A ",
+ " A A ", " A A ",
+ " C C ", " FCGG GGCF ",
+ " DDGGDDDDDCDDDDDGGDD ", " DDGGDDDDDDDDDDDGGDD ",
+ " FDDDDDDDDDDDDDDDDDDDF " },
+ { " ", " ",
+ " ", " DDD ",
+ " DDDDD ", " DDDDD ",
+ " DDDDDDDDDDDDDDDDDDDDD ", " DDGDDDDDGGGGGDDDDDGDD ",
+ " FCGCDDDDGGGGGDDDDCGCF ", " CG GC ",
+ " A A ", " A A ",
+ " A A ", " A A ",
+ " A A ", " A A ",
+ " DA DDD AD ", " A CCC A ",
+ " DA DDD AD ", " A A ",
+ " A A ", " A A ",
+ " A A ", " A A ",
+ " A A ", " A A ",
+ " A A ", " A A ",
+ " A A ", " A A ",
+ " A A ", " A A ",
+ " A A ", " A A ",
+ " A A ", " A A ",
+ " A A ", " A A ",
+ " C C ", " FCG GCF ",
+ " DDGCDDDDGGGGGDDDDCGDD ", " DDGDDDDDGGGGGDDDDDGDD ",
+ " FDDDDDDDDDDDDDDDDDDDDDF " },
+ { " ", " CCC ",
+ " CCC ", " DDD ",
+ " DDDDD ", " DDDDD ",
+ " DDDDDDDDDDDDDDDDDDDDD ", " DDGDDDGGDDCDDGGDDDGDD ",
+ " FCGDCDGG GGDCDGCF ", " CG GC ",
+ " A A ", " A A ",
+ " A A ", " A A ",
+ " A A ", " A A ",
+ " DA DD DD AD ", " A CCBBBCC A ",
+ " DA DD DD AD ", " A A ",
+ " A A ", " A A ",
+ " A A ", " A A ",
+ " A A ", " A A ",
+ " A A ", " A A ",
+ " A A ", " A A ",
+ " A A ", " A A ",
+ " A A ", " A A ",
+ " A A ", " A A ",
+ " A A ", " A A ",
+ " C C ", " FCG GCF ",
+ " DDGDCDGG GGDCDGDD ", " DDGDDDGGDDCDDGGDDDGDD ",
+ " FDDDDDDDDDDDDDDDDDDDDDF " },
+ { " CCC ", " EEEEE ",
+ " EEEEE ", " EEEEE ",
+ " EEEEE ", " EEEEE ",
+ " DDDDDDDDDDDDDDDDDDDDDDD ", " DDGDDDGDDDDCDDDDGDDDGDD ",
+ " FCGDDDG GDDDGCF ", " CG GC ",
+ " A A ", " A A ",
+ " A A ", " A A ",
+ " A A ", " A A ",
+ " DA D DDD D AD ", " A CBBDDDBBC A ",
+ " DA D DDD D AD ", " A A ",
+ " A A ", " A A ",
+ " A A ", " A A ",
+ " A A ", " A A ",
+ " A A ", " A A ",
+ " A A ", " A A ",
+ " A A ", " A A ",
+ " A A ", " A A ",
+ " A A ", " A A ",
+ " A A ", " A A ",
+ " C C ", " FCG GCF ",
+ " DDGDDDG GDDDGDD ", " DDGDDDGDDDDCDDDDGDDDGDD ",
+ " FDDDDDDDDDDDDDDDDDDDDDDDF " },
+ { " CCC ", " EEEEEEE ",
+ " E E ", " E E ",
+ " E E ", " E E ",
+ " DDDDDDDDDDDDDDDDDDDDDDD ", " DDGDDGDCDGGGGGDCDGDDGDD ",
+ " FCGDDG GDDGCF ", " CG GC ",
+ " A A ", " A A ",
+ " A A ", " A A ",
+ " A A ", " A A ",
+ " DA D DD DD D AD ", " DA CBDD DDBC AD ",
+ " DA D DD DD D AD ", " A A ",
+ " A A ", " A A ",
+ " A A ", " A A ",
+ " A A ", " A A ",
+ " A A ", " A A ",
+ " A A ", " A A ",
+ " A A ", " A A ",
+ " A A ", " A A ",
+ " A A ", " A A ",
+ " A A ", " A A ",
+ " C C ", " FCG GCF ",
+ " DDGDDG GDDGDD ", " DDGDDGDCDGGGGGDCDGDDGDD ",
+ " FDDDDDDDDDDDDDDDDDDDDDDDFF " },
+ { " CCC ", " EEEEEEEEE ",
+ " E E ", " E E ",
+ " E E ", " E E ",
+ " DDDDDDDDDDDDCDDDDDDDDDDDD ", " DDGDDDGDDG GDDGDDDGDD ",
+ " DDGDDDG GDDDGDD ", " DDG GDD ",
+ " DD DD ", " DD DD ",
+ " DD DD ", " DD DD ",
+ " DD DD ", " DD DD ",
+ " DD D D D D DD ", " DD CBD DBC DD ",
+ " DD D D D D DD ", " DD DD ",
+ " DD DD ", " DD DD ",
+ " DD DD ", " DD DD ",
+ " DD DD ", " DD DD ",
+ " DD DD ", " DD DD ",
+ " DD DD ", " DD DD ",
+ " DD DD ", " DD DD ",
+ " DD DD ", " DD DD ",
+ " DD DD ", " DD DD ",
+ " DD DD ", " DDD DDD ",
+ " DDC CDD ", " DDCG GCDD ",
+ " DDDGDDDG GDDDGDDD ", " DDDGDDDGDDG GDDGDDDGDDD ",
+ " DDDDDDDDDDDDDCDDDDDDDDDDDDD " },
+ { " CCC ", " EEEEEEEEEEE ",
+ " E E ", " E E ",
+ " DDDDDDE EDDDDDD ", " DDDDDDDE EDDDDDDD ",
+ " DDDDDDDDDDDCCCCCDDDDDDDDDDD ", " DDDGDDGDDG GDDGDDGDDD ",
+ " DDDGDDG GDDGDDD ", " DDDG GDDD ",
+ " DDD DDD ", " DDD DDD ",
+ " DDD DDD ", " DDD DDD ",
+ " DDD DDD ", " DDD DDD ",
+ " DDDDDD D D D D DDDDDD ", " D DD CBD DBC DD D ",
+ " DDDDDD D D D D DDDDDD ", " DDD DDD ",
+ " DDD DDD ", " DDD DDD ",
+ " DDD DDD ", " DDD DDD ",
+ " DDD DDD ", " DDD DDD ",
+ " DDD DDD ", " DDD DDD ",
+ " DDD DDD ", " DDD DDD ",
+ " DDD DDD ", " DDDD DDDD ",
+ " DDDD DDDD ", " DDDD DDDD ",
+ " DDDD DDDD ", " DDDD DDDD ",
+ " DDDD DDDD ", " DDDD DDDD ",
+ " DDDC CDDD ", " DDDDCG GCDDDD ",
+ " HHHDDDGDDG GDDGDDDHHH ", " HDHDDDGDDGDDG GDDGDDGDDDHDH ",
+ " HHHDDDDDDDDDDDCCCCCDDDDDDDDDDDHHH " },
+ { " CCCCCCCCCCC ", " CEEEEEEEEEEEC ",
+ " CE EC ", " DDDDDDE EDDDDDD ",
+ " DDDDDDDE EDDDDDDD ", " DDDDDDDDE EDDDDDDDD ",
+ " DDDDDDDDDDDCGGGCDDDDDDDDDDD ", " CCCDDGDDGDDG GDDGDDGDDCCC ",
+ " CCCCCDGDDG GDDGDCCCCC ", " CCCCCDG GDCCCCC ",
+ " CCCCC CCCCC ", " CCCCC CCCCC ",
+ " CCCCC CCCCC ", " CCCCC CCCCC ",
+ " CCCCC CCCCC ", " CCCCC CCCCC ",
+ "DCCCCCD D D D D DCCCCCD", "DCCCCCDFFFCBD DBCFFFDCCCCCD",
+ "DCCCCCD D D D D DCCCCCD", " CCCCC CCCCC ",
+ " CCCCC CCCCC ", " CCCCC CCCCC ",
+ " CCCCC CCCCC ", " CCCCC CCCCC ",
+ " CCCCC CCCCC ", " CCCCC CCCCC ",
+ " CCCCC CCCCC ", " CCCCC CCCCC ",
+ " CCCCC CCCCC ", " CCCCC CCCCC ",
+ " CCCCC CCCCC ", " CCCCC CCCCC ",
+ " CCCCC CCCCC ", " CCCCC CCCCC ",
+ " CCCCC CCCCC ", " CCCCC CCCCC ",
+ " CCCCC CCCCC ", " CCCCC CCCCC ",
+ " CCCCCC CCCCCC ", "DCCCCCCG GCCCCCCD",
+ "DCCCCDGGDDG GDDGGDCCCCD", "DCCCCDGGDDGDDG GDDGDDGGDCCCCD",
+ "DDDDDDDDDDDDDDDCGGGCDDDDDDDDDDDDDDD" },
+ { " CCCCCCCCCCC ", " CEEEEEEEEEEEC ",
+ " CE EC ", " DDDDDDE EDDDDDD ",
+ " DDDDDDDE EDDDDDDD ", " DDDDDDDDE EDDDDDDDD ",
+ " FFDDDDDDDDDDCCGDGCCDDDDDDDDDDFF ", " FCCCDDGDDGCCG GCCGDDGDDCCCF ",
+ "FCCCCCDGCCG GCCGDCCCCCF", "FCCCCCCG GCCCCCCF",
+ "FCCCCC CCCCCF", "FCCCCC CCCCCF",
+ "FCCCCC CCCCCF", "FCCCCC CCCCCF",
+ "FCCCCC CCCCCF", "FCCCCC CCCCCF",
+ "DCCCCCDFFFD D D DFFFDCCCCCD", "ICCCCCDCCCCBD DBCCCCDCCCCCI",
+ "DCCCCCDFFFD D D DFFFDCCCCCD", "FCCCCC CCCCCF",
+ "FCCCCC CCCCCF", "FCCCCC CCCCCF",
+ "FCCCCC CCCCCF", "FCCCCC CCCCCF",
+ "FCCCCC CCCCCF", "FCCCCC CCCCCF",
+ "FCCCCC CCCCCF", "FCCCCC CCCCCF",
+ "FCCCCC CCCCCF", "FCCCCC CCCCCF",
+ "FCCCCC CCCCCF", "FCCCCC CCCCCF",
+ "FCCCCC CCCCCF", "FCCCCC CCCCCF",
+ "FCCCCC CCCCCF", "FCCCCC CCCCCF",
+ "FCCCCC CCCCCF", "FCCCCC CCCCCF",
+ "DCCCCCC CCCCCCD", "DCCCCCCG GCCCCCCD",
+ "DCCCCD GCCG GCCG DCCCCD", "DCCCCD GDDGCCG GCCGDDG DCCCCD",
+ "DDDDDDDDDDDDDDCCGDGCCDDDDDDDDDDDDDD" },
+ { " CCCCCCCCCCC ", " CEEEEEEEEEEEC ",
+ " CE EC ", " DDDDDDE EDDDDDD ",
+ " DDDDDDDE EDDDDDDD ", " DDDDDDDDE EDDDDDDDD ",
+ " DDDDDDDDDDDCGGGCDDDDDDDDDDD ", " CCCDDGDDGDDG GDDGDDGDDCCC ",
+ " CCCCCDGDDG GDDGDCCCCC ", " CCCCCDG GDCCCCC ",
+ " CCCCC CCCCC ", " CCCCC CCCCC ",
+ " CCCCC CCCCC ", " CCCCC CCCCC ",
+ " CCCCC CCCCC ", " CCCCC CCCCC ",
+ "DCCCCCD D D D D DCCCCCD", "DCCCCCDFFFCBD DBCFFFDCCCCCD",
+ "DCCCCCD D D D D DCCCCCD", " CCCCC CCCCC ",
+ " CCCCC CCCCC ", " CCCCC CCCCC ",
+ " CCCCC CCCCC ", " CCCCC CCCCC ",
+ " CCCCC CCCCC ", " CCCCC CCCCC ",
+ " CCCCC CCCCC ", " CCCCC CCCCC ",
+ " CCCCC CCCCC ", " CCCCC CCCCC ",
+ " CCCCC CCCCC ", " CCCCC CCCCC ",
+ " CCCCC CCCCC ", " CCCCC CCCCC ",
+ " CCCCC CCCCC ", " CCCCC CCCCC ",
+ " CCCCC CCCCC ", " CCCCC CCCCC ",
+ " CCCCCC CCCCCC ", "DCCCCCCG GCCCCCCD",
+ "DCCCCDGGDDG GDDGGDCCCCD", "DCCCCDGGDDGDDG GDDGDDGGDCCCCD",
+ "DDDDDDDDDDDDDDDCGGGCDDDDDDDDDDDDDDD" },
+ { " CCC ", " EEEEEEEEEEE ",
+ " E E ", " E E ",
+ " DDDDDDE EDDDDDD ", " DDDDDDDE EDDDDDDD ",
+ " DDDDDDDDDDDCCCCCDDDDDDDDDDD ", " DDDGDDGDDG GDDGDDGDDD ",
+ " DDDGDDG GDDGDDD ", " DDDG GDDD ",
+ " DDD DDD ", " DDD DDD ",
+ " DDD DDD ", " DDD DDD ",
+ " DDD DDD ", " DDD DDD ",
+ " DDDDDD D D D D DDDDDD ", " D DD CBD DBC DD D ",
+ " DDDDDD D D D D DDDDDD ", " DDD DDD ",
+ " DDD DDD ", " DDD DDD ",
+ " DDD DDD ", " DDD DDD ",
+ " DDD DDD ", " DDD DDD ",
+ " DDD DDD ", " DDD DDD ",
+ " DDD DDD ", " DDD DDD ",
+ " DDD DDD ", " DDDD DDDD ",
+ " DDDD DDDD ", " DDDD DDDD ",
+ " DDDD DDDD ", " DDDD DDDD ",
+ " DDDD DDDD ", " DDDD DDDD ",
+ " DDDC CDDD ", " DDDDCG GCDDDD ",
+ " HHHDDDGDDG GDDGDDDHHH ", " HDHDDDGDDGDDG GDDGDDGDDDHDH ",
+ " HHHDDDDDDDDDDDCCCCCDDDDDDDDDDDHHH " },
+ { " CCC ", " EEEEEEEEE ",
+ " E E ", " E E ",
+ " E E ", " E E ",
+ " DDDDDDDDDDDDCDDDDDDDDDDDD ", " DDGDDDGDDG GDDGDDDGDD ",
+ " DDGDDDG GDDDGDD ", " DDG GDD ",
+ " DD DD ", " DD DD ",
+ " DD DD ", " DD DD ",
+ " DD DD ", " DD DD ",
+ " DD D D D D DD ", " DD CBD DBC DD ",
+ " DD D D D D DD ", " DD DD ",
+ " DD DD ", " DD DD ",
+ " DD DD ", " DD DD ",
+ " DD DD ", " DD DD ",
+ " DD DD ", " DD DD ",
+ " DD DD ", " DD DD ",
+ " DD DD ", " DD DD ",
+ " DD DD ", " DD DD ",
+ " DD DD ", " DD DD ",
+ " DD DD ", " DDD DDD ",
+ " DDC CDD ", " DDCG GCDD ",
+ " DDDGDDDG GDDDGDDD ", " DDDGDDDGDDG GDDGDDDGDDD ",
+ " DDDDDDDDDDDDDCDDDDDDDDDDDDD " },
+ { " CCC ", " EEEEEEE ",
+ " E E ", " E E ",
+ " E E ", " E E ",
+ " DDDDDDDDDDDDDDDDDDDDDDD ", " DDGDDGDCDGGGGGDCDGDDGDD ",
+ " FCGDDG GDDGCF ", " CG GC ",
+ " A A ", " A A ",
+ " A A ", " A A ",
+ " A A ", " A A ",
+ " DA D DD DD D AD ", " DA CBDD DDBC AD ",
+ " DA D DD DD D AD ", " A A ",
+ " A A ", " A A ",
+ " A A ", " A A ",
+ " A A ", " A A ",
+ " A A ", " A A ",
+ " A A ", " A A ",
+ " A A ", " A A ",
+ " A A ", " A A ",
+ " A A ", " A A ",
+ " A A ", " A A ",
+ " C C ", " FCG GCF ",
+ " DDGDDG GDDGDD ", " DDGDDGDCDGGGGGDCDGDDGDD ",
+ " FDDDDDDDDDDDDDDDDDDDDDDDF " },
+ { " CCC ", " EEEEE ",
+ " EEEEE ", " EEEEE ",
+ " EEEEE ", " EEEEE ",
+ " DDDDDDDDDDDDDDDDDDDDDDD ", " DDGDDDGDDDDCDDDDGDDDGDD ",
+ " FCGDDDG GDDDGCF ", " CG GC ",
+ " A A ", " A A ",
+ " A A ", " A A ",
+ " A A ", " A A ",
+ " DA D DDD D AD ", " A CBBDDDBBC A ",
+ " DA D DDD D AD ", " A A ",
+ " A A ", " A A ",
+ " A A ", " A A ",
+ " A A ", " A A ",
+ " A A ", " A A ",
+ " A A ", " A A ",
+ " A A ", " A A ",
+ " A A ", " A A ",
+ " A A ", " A A ",
+ " A A ", " A A ",
+ " C C ", " FCG GCF ",
+ " DDGDDDG GDDDG D ", " DDGDDDGDDDDCDDDDGDDDG D ",
+ " FDDDDDDDDDDDDDDDDDDDDDDDF " },
+ { " ", " CCC ",
+ " CCC ", " DDD ",
+ " DDDDD ", " DDDDD ",
+ " DDDDDDDDDDDDDDDDDDDDD ", " DDGDDDGGDDCDDGGDDDGDD ",
+ " FCGDCDGG GGDCDGCF ", " CG GC ",
+ " A A ", " A A ",
+ " A A ", " A A ",
+ " A A ", " A A ",
+ " DA DD DD AD ", " A CCBBBCC A ",
+ " DA DD DD AD ", " A A ",
+ " A A ", " A A ",
+ " A A ", " A A ",
+ " A A ", " A A ",
+ " A A ", " A A ",
+ " A A ", " A A ",
+ " A A ", " A A ",
+ " A A ", " A A ",
+ " A A ", " A A ",
+ " A A ", " A A ",
+ " C C ", " FCG GCF ",
+ " DDGDCDGG GGDCDGDD ", " DDGDDDGGDDCDDGGDDDGDD ",
+ " FDDDDDDDDDDDDDDDDDDDDDF " },
+ { " ", " ",
+ " ", " DDD ",
+ " DDDDD ", " DDDDD ",
+ " DDDDDDDDDDDDDDDDDDDDD ", " DDGDDDDDGGGGGDDDDDGDD ",
+ " FCGCDDDDGGGGGDDDDCGCF ", " CG GC ",
+ " A A ", " A A ",
+ " A A ", " A A ",
+ " A A ", " A A ",
+ " DA DDD AD ", " A CCC A ",
+ " DA DDD AD ", " A A ",
+ " A A ", " A A ",
+ " A A ", " A A ",
+ " A A ", " A A ",
+ " A A ", " A A ",
+ " A A ", " A A ",
+ " A A ", " A A ",
+ " A A ", " A A ",
+ " A A ", " A A ",
+ " A A ", " A A ",
+ " C C ", " FCG GCF ",
+ " DDGCDDDDGGGGGDDDDCGDD ", " DDGDDDDDGGGGGDDDDDGDD ",
+ " FDDDDDDDDDDDDDDDDDDDDDF " },
+ { " ", " ",
+ " ", " DDD ",
+ " DDDDD ", " DDDDD ",
+ " DDDDDDDDDDDDDDDDDDD ", " DDGGDDDDDDDDDDDGGDD ",
+ " FCGGDDDDDCDDDDDGGCF ", " CGG GGC ",
+ " A A ", " A A ",
+ " A A ", " A A ",
+ " A A ", " A A ",
+ " DA F AD ", " A FCF A ",
+ " DA F AD ", " A A ",
+ " A A ", " A A ",
+ " A A ", " A A ",
+ " A A ", " A A ",
+ " A A ", " A A ",
+ " A A ", " A A ",
+ " A A ", " A A ",
+ " A A ", " A A ",
+ " A A ", " A A ",
+ " A A ", " A A ",
+ " C C ", " FCGG GGCF ",
+ " DDGGDDDDDCDDDDDGG D ", " DDGGDDDDDDDDDDDGG D ",
+ " FDDDDDDDDDDDDDDDDDDDF " },
+ { " ", " ",
+ " ", " DDD ",
+ " DDDDD ", " DDDDD ",
+ " DDDDDDDDDDDDDDDDD ", " DDDGGDDDDDDDGGDDD ",
+ " FCCGGDDDCDDDGGCCF ", " CCGG GGCC ",
+ " AA AA ", " AA AA ",
+ " AA AA ", " AA AA ",
+ " AA AA ", " AA AA ",
+ " DAA F AAD ", " AA FCF AA ",
+ " DAA F AAD ", " AA AA ",
+ " AA AA ", " AA AA ",
+ " AA AA ", " AA AA ",
+ " AA AA ", " AA AA ",
+ " AA AA ", " AA AA ",
+ " AA AA ", " AA AA ",
+ " AA AA ", " AA AA ",
+ " AA AA ", " AA AA ",
+ " AA AA ", " AA AA ",
+ " AA AA ", " AA AA ",
+ " CC CC ", " FCCGG GGCCF ",
+ " DDDGGDDDCDDDGGDDD ", " DDDGGDDDDDDDGGDDD ",
+ " FDDDDDDDDDDDDDDDDDF " },
+ { " ", " ",
+ " ", " DDD ",
+ " DDDDD ", " DDDDD ",
+ " DDDDDDDDDDDDDDD ", " DDDDGGGGGGGDDDD ",
+ " FFCCGGGGGGGCCFF ", " CCGGGGGGGCC ",
+ " AA AA ", " AA AA ",
+ " AA AA ", " AA AA ",
+ " AA AA ", " AA AA ",
+ " DDAA F AADD ", " AA FCF AA ",
+ " DDAA F AADD ", " AA AA ",
+ " AA AA ", " AA AA ",
+ " AA AA ", " AA AA ",
+ " AA AA ", " AA AA ",
+ " AA AA ", " AA AA ",
+ " AA AA ", " AA AA ",
+ " AA AA ", " AA AA ",
+ " AA AA ", " AA AA ",
+ " AA AA ", " AA AA ",
+ " AA AA ", " AA AA ",
+ " CC CC ", " FFCCGGGGGGGCCFF ",
+ " DDDDGGGGGGGDDDD ", " DDDDGGGGGGGDDDD ",
+ " FDDDDDDDDDDDDDDDF " },
+ { " ", " ",
+ " ", " DDD ",
+ " DDDDD ", " DDDDD ",
+ " DDDDDDDDDDD ", " DDDDDDDDDDD ",
+ " FFDDDDDDDFF ", " DDDCDDD ",
+ " DD DD ", " DD DD ",
+ " DD DD ", " DD DD ",
+ " DD DD ", " DD DD ",
+ " DDDDDDDDDDD ", " DDDDDDDDD ",
+ " DDDDDDDDDDD ", " DD DD ",
+ " DD DD ", " DD DD ",
+ " DD DD ", " DD DD ",
+ " DD DD ", " DD DD ",
+ " DD DD ", " DD DD ",
+ " DD DD ", " DD DD ",
+ " DD DD ", " DD DD ",
+ " DD DD ", " DD DD ",
+ " DD DD ", " DD DD ",
+ " DD DD ", " DD DD ",
+ " CCCCCCC ", " FFCCCCCCCFF ",
+ " DDDDG GDDDD ", " DDDDG GDDDD ",
+ " FFDDDDDDDDDDDFF " },
+ { " ", " ",
+ " ", " ",
+ " DDD ", " DDDDD ",
+ " DDDDDDD ", " DDDDDDD ",
+ " DDCCCDD ", " DDCCCDD ",
+ " DDCCCDD ", " DDCCCDD ",
+ " DDCCCDD ", " DDCCCDD ",
+ " DDCCCDD ", " DDCCCDD ",
+ " DDCCCDD ", " DDCCCDD ",
+ " DDCCCDD ", " DDCCCDD ",
+ " DDCCCDD ", " DDCCCDD ",
+ " DDCCCDD ", " DDCCCDD ",
+ " DDCCCDD ", " DDCCCDD ",
+ " DDCCCDD ", " DDCCCDD ",
+ " DDCCCDD ", " DDCCCDD ",
+ " DDCCCDD ", " DDCCCDD ",
+ " DDCCCDD ", " DDCCCDD ",
+ " DDCCCDD ", " DDCCCDD ",
+ " DDCCCDD ", " DDCCCDD ",
+ " DDCCCDD ", " DDCCCDD ",
+ " DDDDDDD ", " DDDDDDD ",
+ " FFDDDDDDDFF " },
+ { " ", " ",
+ " ", " ",
+ " ", " DDD ",
+ " DDDDD ", " DCCCD ",
+ " DCCCD ", " DCCCD ",
+ " DCCCD ", " DCCCD ",
+ " DCCCD ", " DCCCD ",
+ " DCCCD ", " DCCCD ",
+ " DCCCD ", " CCC ",
+ " DCCCD ", " DCCCD ",
+ " DCCCD ", " DCCCD ",
+ " DCCCD ", " DCCCD ",
+ " DCCCD ", " DCCCD ",
+ " DCCCD ", " DCCCD ",
+ " DCCCD ", " DCCCD ",
+ " DCCCD ", " DCCCD ",
+ " DCCCD ", " DCCCD ",
+ " DCCCD ", " DCCCD ",
+ " DCCCD ", " DDCCCDD ",
+ " DDCCCDD ", " DDCCCDD ",
+ " DDCCCDD ", " DDCCCDD ",
+ " DDDDDDD " },
+ { " ", " ",
+ " ", " ",
+ " ", " ",
+ " F ", " CCC ",
+ " CCC ", " CCC ",
+ " CCC ", " CCC ",
+ " CCC ", " CCC ",
+ " CCC ", " CCC ",
+ " DCCCD ", " CCC ",
+ " DCCCD ", " CCC ",
+ " CCC ", " CCC ",
+ " CCC ", " CCC ",
+ " CCC ", " CCC ",
+ " CCC ", " CCC ",
+ " CCC ", " CCC ",
+ " CCC ", " DCCCD ",
+ " DCCCD ", " DCCCD ",
+ " DCCCD ", " DCCCD ",
+ " DCCCD ", " DCCCD ",
+ " DCCCD ", " DCCCD ",
+ " HCCCH ", " HCCCH ",
+ " HDDDH " },
+ { " ", " ",
+ " ", " ",
+ " ", " ",
+ " F ", " CCC ",
+ " CCC ", " CCC ",
+ " CCC ", " CCC ",
+ " CCC ", " CCC ",
+ " CCC ", " CCC ",
+ " DCCCD ", " CCC ",
+ " DCCCD ", " CCC ",
+ " CCC ", " CCC ",
+ " CCC ", " CCC ",
+ " CCC ", " CCC ",
+ " CCC ", " CCC ",
+ " CCC ", " CCC ",
+ " CCC ", " CCC ",
+ " CCC ", " CCC ",
+ " CCC ", " CCC ",
+ " CCC ", " CCC ",
+ " CCC ", " DCCCD ",
+ " HCCCH ", " DCCCD ",
+ " HDDDH " },
+ { " ", " ",
+ " ", " ",
+ " ", " ",
+ " ", " F ",
+ " CCC ", " CCC ",
+ " CCC ", " CCC ",
+ " CCC ", " CCC ",
+ " CCC ", " CCC ",
+ " DCCCD ", " DCCCD ",
+ " DCCCD ", " CCC ",
+ " CCC ", " CCC ",
+ " CCC ", " CCC ",
+ " CCC ", " CCC ",
+ " CCC ", " CCC ",
+ " CCC ", " CCC ",
+ " CCC ", " CCC ",
+ " CCC ", " CCC ",
+ " CCC ", " CCC ",
+ " CCC ", " CCC ",
+ " CCC ", " CCC ",
+ " HCCCH ", " HCCCH ",
+ " HDDDH " },
+ { " ", " ",
+ " ", " ",
+ " ", " ",
+ " ", " ",
+ " F ", " F ",
+ " F ", " F ",
+ " F ", " F ",
+ " F ", " F ",
+ " DDD ", " DDD ",
+ " DDD ", " F ",
+ " F ", " F ",
+ " F ", " F ",
+ " F ", " F ",
+ " F ", " F ",
+ " F ", " F ",
+ " F ", " F ",
+ " F ", " F ",
+ " F ", " F ",
+ " F ", " F ",
+ " D ", " DDD ",
+ " DDD ", " DDD ",
+ " DDD " } };
+}
diff --git a/src/main/java/goodgenerator/blocks/tileEntity/AntimatterForge.java b/src/main/java/goodgenerator/blocks/tileEntity/AntimatterForge.java
new file mode 100644
index 0000000000..4bf48910e8
--- /dev/null
+++ b/src/main/java/goodgenerator/blocks/tileEntity/AntimatterForge.java
@@ -0,0 +1,978 @@
+package goodgenerator.blocks.tileEntity;
+
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.*;
+import static gregtech.api.enums.Textures.BlockIcons.*;
+import static gregtech.api.util.GTStructureUtility.buildHatchAdder;
+
+import java.text.DecimalFormat;
+import java.text.DecimalFormatSymbols;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Locale;
+import java.util.Random;
+
+import javax.annotation.Nonnull;
+
+import net.minecraft.block.Block;
+import net.minecraft.init.Blocks;
+import net.minecraft.item.ItemStack;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.StatCollector;
+import net.minecraft.world.World;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.FluidStack;
+
+import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment;
+import com.gtnewhorizon.structurelib.structure.StructureDefinition;
+import com.gtnewhorizons.modularui.api.NumberFormatMUI;
+import com.gtnewhorizons.modularui.common.widget.DynamicPositionedColumn;
+import com.gtnewhorizons.modularui.common.widget.FakeSyncWidget;
+import com.gtnewhorizons.modularui.common.widget.SlotWidget;
+import com.gtnewhorizons.modularui.common.widget.TextWidget;
+
+import goodgenerator.blocks.structures.AntimatterStructures;
+import goodgenerator.blocks.tileEntity.render.TileAntimatter;
+import goodgenerator.items.GGMaterial;
+import goodgenerator.loader.Loaders;
+import gregtech.api.enums.HatchElement;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.MaterialsUEVplus;
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.interfaces.tileentity.IOverclockDescriptionProvider;
+import gregtech.api.metatileentity.implementations.MTEExtendedPowerMultiBlockBase;
+import gregtech.api.metatileentity.implementations.MTEHatch;
+import gregtech.api.metatileentity.implementations.MTEHatchInput;
+import gregtech.api.metatileentity.implementations.MTEHatchOutput;
+import gregtech.api.objects.GTChunkManager;
+import gregtech.api.objects.GTItemStack;
+import gregtech.api.objects.overclockdescriber.OverclockDescriber;
+import gregtech.api.recipe.check.CheckRecipeResult;
+import gregtech.api.recipe.check.CheckRecipeResultRegistry;
+import gregtech.api.render.TextureFactory;
+import gregtech.api.util.ExoticEnergyInputHelper;
+import gregtech.api.util.GTRecipe;
+import gregtech.api.util.GTUtility;
+import gregtech.api.util.HatchElementBuilder;
+import gregtech.api.util.MultiblockTooltipBuilder;
+import gregtech.api.util.shutdown.ShutDownReason;
+import gregtech.api.util.shutdown.ShutDownReasonRegistry;
+import gregtech.common.tileentities.machines.IDualInputHatch;
+
+public class AntimatterForge extends MTEExtendedPowerMultiBlockBase<AntimatterForge>
+ implements ISurvivalConstructable, IOverclockDescriptionProvider {
+
+ private static final FluidStack[] magneticUpgrades = { Materials.TengamAttuned.getMolten(1L),
+ MaterialsUEVplus.Time.getMolten(1L) };
+ private static final FluidStack[] gravityUpgrades = { MaterialsUEVplus.SpaceTime.getMolten(1L),
+ MaterialsUEVplus.Space.getMolten(1L), MaterialsUEVplus.Eternity.getMolten(1L) };
+ private static final FluidStack[] containmentUpgrades = { GGMaterial.shirabon.getMolten(1),
+ MaterialsUEVplus.MagnetohydrodynamicallyConstrainedStarMatter.getMolten(1L) };
+ private static final FluidStack[] activationUpgrades = { GGMaterial.naquadahBasedFuelMkVDepleted.getFluidOrGas(1),
+ GGMaterial.naquadahBasedFuelMkVIDepleted.getFluidOrGas(1) };
+
+ private static final int MAGNETIC_ID = 0;
+ private static final int GRAVITY_ID = 1;
+ private static final int CONTAINMENT_ID = 2;
+ private static final int ACTIVATION_ID = 3;
+
+ private static final int BASE_CONSUMPTION = 10_000_000;
+ private static final int passiveBaseMult = 1000;
+ private static final int activeBaseMult = 10000;
+
+ private static final float passiveBaseExp = 1.5f;
+ private static final float activeBaseExp = 1.5f;
+ private static final float coefficientBaseExp = 0.5f;
+ private static final float baseSkew = 0.2f;
+
+ private float[] modifiers = { 0.0f, 0.0f, 0.0f, 0.0f };
+ private FluidStack[] upgradeFluids = { null, null, null, null };
+ private int[] fluidConsumptions = { 0, 0, 0, 0 };
+
+ public static final String MAIN_NAME = "antimatterForge";
+ private int speed = 100;
+ private long rollingCost = 0L;
+ private boolean isLoadedChunk;
+ public GTRecipe mLastRecipe;
+ public int para;
+ private Random r = new Random();
+ // Values for displaying cycle data
+ private long guiAntimatterAmount = 0;
+ private long guiAntimatterChange = 0;
+ private long guiPassiveEnergy = 0;
+ private long guiActiveEnergy = 0;
+
+ private List<AntimatterOutputHatch> amOutputHatches = new ArrayList<>(16);
+ private static final ClassValue<IStructureDefinition<AntimatterForge>> STRUCTURE_DEFINITION = new ClassValue<IStructureDefinition<AntimatterForge>>() {
+
+ @Override
+ protected IStructureDefinition<AntimatterForge> computeValue(Class<?> type) {
+ return StructureDefinition.<AntimatterForge>builder()
+ .addShape(MAIN_NAME, AntimatterStructures.ANTIMATTER_FORGE)
+ .addElement('A', lazy(x -> ofBlock(x.getFrameBlock(), x.getFrameMeta())))
+ .addElement('B', lazy(x -> ofBlock(x.getCoilBlock(), x.getCoilMeta())))
+ .addElement('C', lazy(x -> ofBlock(x.getCasingBlock(2), x.getCasingMeta(2))))
+ .addElement('D', lazy(x -> ofBlock(x.getCasingBlock(1), x.getCasingMeta(1))))
+ .addElement(
+ 'F',
+ lazy(
+ x -> HatchElementBuilder.<AntimatterForge>builder()
+ .anyOf(HatchElement.InputHatch)
+ .adder(AntimatterForge::addFluidIO)
+ .casingIndex(x.textureIndex(2))
+ .dot(1)
+ .buildAndChain(x.getCasingBlock(2), x.getCasingMeta(2))))
+ .addElement(
+ 'E',
+ lazy(
+ x -> buildHatchAdder(AntimatterForge.class).adder(AntimatterForge::addAntimatterHatch)
+ .hatchClass(AntimatterOutputHatch.class)
+ .casingIndex(x.textureIndex(1))
+ .dot(3)
+ .build()))
+ .addElement(
+ 'H',
+ lazy(
+ x -> HatchElementBuilder.<AntimatterForge>builder()
+ .anyOf(HatchElement.Energy.or(HatchElement.ExoticEnergy))
+ .adder(AntimatterForge::addEnergyInjector)
+ .casingIndex(x.textureIndex(2))
+ .dot(4)
+ .buildAndChain(x.getCasingBlock(2), x.getCasingMeta(2))))
+ .build();
+ }
+ };
+
+ static {
+ Textures.BlockIcons.setCasingTextureForId(
+ 53,
+ TextureFactory.of(
+ TextureFactory.builder()
+ .addIcon(MACHINE_CASING_ANTIMATTER)
+ .extFacing()
+ .build(),
+ TextureFactory.builder()
+ .addIcon(MACHINE_CASING_ANTIMATTER_GLOW)
+ .extFacing()
+ .glow()
+ .build()));
+ }
+
+ public AntimatterForge(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public AntimatterForge(String aName) {
+ super(aName);
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity arg0) {
+ return new AntimatterForge(MAIN_NAME);
+ }
+
+ @Override
+ protected MultiblockTooltipBuilder createTooltip() {
+ final MultiblockTooltipBuilder tt = new MultiblockTooltipBuilder();
+ tt.addMachineType("Antimatter Forge")
+ .addInfo(EnumChatFormatting.LIGHT_PURPLE + "Dimensions not included!" + EnumChatFormatting.GRAY)
+ .addInfo("Converts protomatter into antimatter")
+ .addInfo(
+ "Consumes 10 000 000 + (" + EnumChatFormatting.DARK_BLUE
+ + "Antimatter"
+ + EnumChatFormatting.GRAY
+ + " * "
+ + String.valueOf(this.passiveBaseMult)
+ + ")^"
+ + EnumChatFormatting.GREEN
+ + String.valueOf(this.passiveBaseExp)
+ + EnumChatFormatting.GRAY
+ + " EU/t passively. The consumption decays by 0.5% every tick when empty")
+ .addInfo(
+ "Uses (" + EnumChatFormatting.DARK_BLUE
+ + "Antimatter"
+ + EnumChatFormatting.GRAY
+ + " * "
+ + String.valueOf(this.activeBaseMult)
+ + ")^"
+ + EnumChatFormatting.DARK_PURPLE
+ + String.valueOf(this.activeBaseExp)
+ + EnumChatFormatting.GRAY
+ + " EU per operation to produce antimatter")
+ .addSeparator()
+ .addInfo("Every cycle, the lowest amount of antimatter in the 16 antimatter hatches is recorded")
+ .addInfo("Cycles every 5 seconds")
+ .addInfo(
+ "All hatches with more than the lowest amount will " + EnumChatFormatting.RED
+ + "lose half the difference!"
+ + EnumChatFormatting.GRAY)
+ .addInfo(
+ "If the machine runs out of energy or protomatter during a cycle, " + EnumChatFormatting.RED
+ + "10% of antimatter will be voided!"
+ + EnumChatFormatting.GRAY)
+ .addInfo(
+ "Produces (" + EnumChatFormatting.DARK_BLUE
+ + "Antimatter"
+ + EnumChatFormatting.GRAY
+ + "^"
+ + EnumChatFormatting.GOLD
+ + String.valueOf(this.coefficientBaseExp)
+ + EnumChatFormatting.GRAY
+ + ") * N("
+ + EnumChatFormatting.AQUA
+ + String.valueOf(this.baseSkew)
+ + EnumChatFormatting.GRAY
+ + ", 1) of antimatter per cycle, consuming equal amounts of Protomatter")
+ .addInfo("The change can be negative! (N = Skewed Normal Distribution)")
+ .addSeparator()
+ .addInfo("Can be supplied with stabilization fluids to improve antimatter generation")
+ .addInfo(
+ EnumChatFormatting.GREEN + "Magnetic Stabilization"
+ + EnumChatFormatting.GRAY
+ + " (Uses "
+ + EnumChatFormatting.DARK_BLUE
+ + "Antimatter"
+ + EnumChatFormatting.GRAY
+ + "^0.5 per cycle)")
+ .addInfo(
+ "1. Molten Purified Tengam - Passive cost exponent " + EnumChatFormatting.GREEN
+ + "-0.15"
+ + EnumChatFormatting.GRAY)
+ .addInfo(
+ "2. Tachyon Rich Fluid - Passive cost exponent " + EnumChatFormatting.GREEN
+ + "-0.3"
+ + EnumChatFormatting.GRAY)
+ .addInfo(
+ EnumChatFormatting.DARK_PURPLE + "Gravity Stabilization"
+ + EnumChatFormatting.GRAY
+ + " (Uses "
+ + EnumChatFormatting.DARK_BLUE
+ + "Antimatter"
+ + EnumChatFormatting.GRAY
+ + "^0.5 per cycle)")
+ .addInfo(
+ "1. Molten Spacetime - Active cost exponent " + EnumChatFormatting.DARK_PURPLE
+ + "-0.05"
+ + EnumChatFormatting.GRAY)
+ .addInfo(
+ "2. Spatially Enlarged Fluid - Active cost exponent " + EnumChatFormatting.DARK_PURPLE
+ + "-0.10"
+ + EnumChatFormatting.GRAY)
+ .addInfo(
+ "3. Molten Eternity - Active cost exponent " + EnumChatFormatting.DARK_PURPLE
+ + "-0.15"
+ + EnumChatFormatting.GRAY)
+ .addInfo(
+ EnumChatFormatting.GOLD + "Containment Stabilization"
+ + EnumChatFormatting.GRAY
+ + " (Uses "
+ + EnumChatFormatting.DARK_BLUE
+ + "Antimatter"
+ + EnumChatFormatting.GRAY
+ + "^(2/7) per operation)")
+ .addInfo(
+ "1. Molten Shirabon - Production exponent " + EnumChatFormatting.GOLD
+ + "+0.05"
+ + EnumChatFormatting.GRAY)
+ .addInfo(
+ "2. Molten MHDCSM - Production exponent " + EnumChatFormatting.GOLD + "+0.10" + EnumChatFormatting.GRAY)
+ .addInfo(
+ EnumChatFormatting.AQUA + "Activation Stabilization"
+ + EnumChatFormatting.GRAY
+ + " (Uses "
+ + EnumChatFormatting.DARK_BLUE
+ + "Antimatter"
+ + EnumChatFormatting.GRAY
+ + "^(1/3) per operation)")
+ .addInfo(
+ "1. Depleted Naquadah Fuel Mk V - Distribution skew " + EnumChatFormatting.AQUA
+ + "+0.05"
+ + EnumChatFormatting.GRAY)
+ .addInfo(
+ "2. Depleted Naquadah Fuel Mk VI - Distribution skew " + EnumChatFormatting.AQUA
+ + "+0.10"
+ + EnumChatFormatting.GRAY)
+ .addSeparator()
+ .addEnergyHatch("1-9, Hint block with dot 4", 4)
+ .addInputHatch("1-6, Hint block with dot 1", 1)
+ .toolTipFinisher("Good Generator");
+ return tt;
+ }
+
+ @Override
+ public IStructureDefinition<AntimatterForge> getStructureDefinition() {
+ return STRUCTURE_DEFINITION.get(getClass());
+ }
+
+ public Block getCasingBlock(int type) {
+ switch (type) {
+ case 1:
+ return Loaders.magneticFluxCasing;
+ case 2:
+ return Loaders.gravityStabilizationCasing;
+ default:
+ return Loaders.magneticFluxCasing;
+ }
+ }
+
+ public int getCasingMeta(int type) {
+ switch (type) {
+ case 1:
+ return 0;
+ case 2:
+ return 0;
+ default:
+ return 0;
+ }
+ }
+
+ public Block getCoilBlock() {
+ return Loaders.protomatterActivationCoil;
+ }
+
+ public int getCoilMeta() {
+ return 0;
+ }
+
+ public Block getFrameBlock() {
+ return Loaders.antimatterContainmentCasing;
+ }
+
+ public int getFrameMeta() {
+ return 0;
+ }
+
+ public int textureIndex(int type) {
+ switch (type) {
+ case 1:
+ return (12 << 7) + 9;
+ case 2:
+ return (12 << 7) + 10;
+ default:
+ return (12 << 7) + 9;
+ }
+ }
+
+ private static final ITexture textureOverlay = TextureFactory.of(
+ TextureFactory.builder()
+ .addIcon(OVERLAY_FUSION1)
+ .extFacing()
+ .build(),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_FUSION1_GLOW)
+ .extFacing()
+ .glow()
+ .build());
+
+ public ITexture getTextureOverlay() {
+ return textureOverlay;
+ }
+
+ @Override
+ public boolean allowCoverOnSide(ForgeDirection side, GTItemStack aStack) {
+ return side != getBaseMetaTileEntity().getFrontFacing();
+ }
+
+ @Override
+ public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) {
+ return checkPiece(MAIN_NAME, 26, 26, 4);
+ }
+
+ @Override
+ public void construct(ItemStack itemStack, boolean b) {
+ buildPiece(MAIN_NAME, itemStack, b, 26, 26, 4);
+ }
+
+ @Override
+ public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) {
+ if (mMachine) return -1;
+ int realBudget = elementBudget >= 200 ? elementBudget : Math.min(200, elementBudget * 5);
+ return survivialBuildPiece(MAIN_NAME, stackSize, 26, 26, 4, realBudget, env, false, true);
+ }
+
+ @Override
+ public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection facing,
+ int colorIndex, boolean aActive, boolean aRedstone) {
+ if (side == facing) return new ITexture[] { TextureFactory.builder()
+ .addIcon(MACHINE_CASING_ANTIMATTER)
+ .extFacing()
+ .build(), getTextureOverlay() };
+ if (aActive) return new ITexture[] { Textures.BlockIcons.getCasingTextureForId(53) };
+ return new ITexture[] { TextureFactory.builder()
+ .addIcon(MACHINE_CASING_ANTIMATTER)
+ .extFacing()
+ .build() };
+ }
+
+ @Override
+ public boolean isCorrectMachinePart(ItemStack aStack) {
+ return true;
+ }
+
+ @Override
+ public void onMachineBlockUpdate() {
+ mUpdate = 100;
+ }
+
+ @Override
+ public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+ super.onPostTick(aBaseMetaTileEntity, aTick);
+ if (aBaseMetaTileEntity.isServerSide()) {
+ FluidStack[] antimatterStored = new FluidStack[16];
+ long totalAntimatterAmount = 0;
+ for (int i = 0; i < amOutputHatches.size(); i++) {
+ if (amOutputHatches.get(i) == null || !amOutputHatches.get(i)
+ .isValid()
+ || amOutputHatches.get(i)
+ .getFluid() == null)
+ continue;
+ antimatterStored[i] = amOutputHatches.get(i)
+ .getFluid()
+ .copy();
+ totalAntimatterAmount += antimatterStored[i].amount;
+ }
+ drainEnergyInput(calculateEnergyContainmentCost(totalAntimatterAmount));
+
+ if ((this.mProgresstime >= this.mMaxProgresstime) && (!isAllowedToWork())) {
+ setProtoRender(false);
+ }
+ }
+ }
+
+ private long calculateContainedAntimatter() {
+ long antimatterStored = 0;
+ for (int i = 0; i < amOutputHatches.size(); i++) {
+ if (amOutputHatches.get(i) == null || !amOutputHatches.get(i)
+ .isValid()
+ || amOutputHatches.get(i)
+ .getFluid() == null)
+ continue;
+ antimatterStored += amOutputHatches.get(i)
+ .getFluid().amount;
+ }
+ return antimatterStored;
+ }
+
+ private void setModifiers(FluidStack inputFluid, float step, FluidStack[] upgradeFluids, int upgradeId) {
+ for (int tier = 1; tier <= upgradeFluids.length; tier++) {
+ if (inputFluid.isFluidEqual(upgradeFluids[tier - 1])) {
+ if (inputFluid.amount >= fluidConsumptions[upgradeId]) {
+ modifiers[upgradeId] = step * tier;
+ upgradeFluids[upgradeId] = inputFluid;
+ }
+ }
+ }
+ }
+
+ @Override
+ public CheckRecipeResult checkProcessing() {
+ startRecipeProcessing();
+ FluidStack[] antimatterStored = new FluidStack[16];
+ long totalAntimatterAmount = 0;
+ long minAntimatterAmount = Long.MAX_VALUE;
+ // Calculate the total amount of antimatter in all 16 hatches and the minimum amount found in any individual
+ // hatch
+ for (int i = 0; i < amOutputHatches.size(); i++) {
+ if (amOutputHatches.get(i) == null || !amOutputHatches.get(i)
+ .isValid()
+ || amOutputHatches.get(i)
+ .getFluid() == null)
+ continue;
+ antimatterStored[i] = amOutputHatches.get(i)
+ .getFluid()
+ .copy();
+ totalAntimatterAmount += antimatterStored[i].amount;
+ minAntimatterAmount = Math.min(minAntimatterAmount, antimatterStored[i].amount);
+ }
+ int ratioLosses = 0;
+ // Reduce the amount of antimatter in each hatch by half of the difference between the lowest amount and current
+ // hatch contents
+ for (int i = 0; i < amOutputHatches.size(); i++) {
+ if (amOutputHatches.get(i) == null || !amOutputHatches.get(i)
+ .isValid()
+ || amOutputHatches.get(i)
+ .getFluid() == null)
+ continue;
+ FluidStack fluid = amOutputHatches.get(i)
+ .getFluid()
+ .copy();
+ ratioLosses -= amOutputHatches.get(i)
+ .drain((int) ((fluid.amount - minAntimatterAmount) * 0.5), true).amount;
+ }
+
+ // Check for upgrade fluids
+ long containedProtomatter = 0;
+
+ fluidConsumptions[MAGNETIC_ID] = (int) Math.ceil(Math.pow(totalAntimatterAmount, 0.5));
+ fluidConsumptions[GRAVITY_ID] = (int) Math.ceil(Math.pow(totalAntimatterAmount, 0.5));
+ fluidConsumptions[CONTAINMENT_ID] = (int) Math.ceil(Math.pow(totalAntimatterAmount, 2 / 7));
+ fluidConsumptions[ACTIVATION_ID] = (int) Math.ceil(Math.pow(totalAntimatterAmount, 1 / 3));
+
+ for (int i = 0; i < modifiers.length; i++) {
+ modifiers[i] = 0.0f;
+ upgradeFluids[i] = null;
+ }
+
+ List<FluidStack> inputFluids = getStoredFluids();
+ for (int i = 0; i < inputFluids.size(); i++) {
+ FluidStack inputFluid = inputFluids.get(i);
+ setModifiers(inputFluid, -0.15f, magneticUpgrades, MAGNETIC_ID);
+ setModifiers(inputFluid, -0.05f, gravityUpgrades, GRAVITY_ID);
+ setModifiers(inputFluid, 0.05f, containmentUpgrades, CONTAINMENT_ID);
+ setModifiers(inputFluid, 0.05f, activationUpgrades, ACTIVATION_ID);
+ }
+
+ long energyCost = calculateEnergyCost(totalAntimatterAmount);
+
+ // If we run out of energy, reduce contained antimatter by 10%
+ if (!drainEnergyInput(energyCost)) {
+ decimateAntimatter();
+ stopMachine(ShutDownReasonRegistry.POWER_LOSS);
+ endRecipeProcessing();
+ setProtoRender(false);
+ return CheckRecipeResultRegistry.insufficientPower(energyCost);
+ }
+
+ // Drain upgrade fluids
+ for (int i = 0; i < upgradeFluids.length; i++) {
+ FluidStack upgradeFluid = upgradeFluids[i];
+ if (upgradeFluid != null) {
+ for (FluidStack inputFluid : inputFluids.toArray(new FluidStack[0])) {
+ if (inputFluid.isFluidEqual(upgradeFluid)) {
+ inputFluid.amount -= fluidConsumptions[i];
+ }
+ }
+ }
+ }
+
+ int antimatterChange = distributeAntimatterToHatch(
+ amOutputHatches,
+ totalAntimatterAmount,
+ containedProtomatter);
+
+ // We didn't have enough protomatter, reduce antimatter by 10% and stop the machine.
+ if (!this.depleteInput(MaterialsUEVplus.Protomatter.getFluid((long) Math.abs(antimatterChange)))) {
+ decimateAntimatter();
+ stopMachine(ShutDownReasonRegistry.outOfFluid(MaterialsUEVplus.Protomatter.getFluid(1L)));
+ endRecipeProcessing();
+ setProtoRender(false);
+ return CheckRecipeResultRegistry.NO_FUEL_FOUND;
+ }
+
+ this.guiAntimatterChange = ratioLosses + antimatterChange;
+ this.guiAntimatterAmount = calculateContainedAntimatter();
+
+ updateAntimatterSize(this.guiAntimatterAmount);
+ setProtoRender(true);
+
+ mEfficiency = (10000 - (getIdealStatus() - getRepairStatus()) * 1000);
+ mEfficiencyIncrease = 10000;
+ mMaxProgresstime = speed;
+
+ endRecipeProcessing();
+ return CheckRecipeResultRegistry.SUCCESSFUL;
+ }
+
+ /*
+ * How much passive energy is drained every tick
+ * Base containment cost: 10M EU/t
+ * The containment cost ramps up by the amount of antimatter each tick, up to 1000 times
+ * If the current cost is more than 1000 times the amount of antimatter, or
+ * if no antimatter is in the hatches, the value will decay by 1% every tick
+ */
+ private long calculateEnergyContainmentCost(long antimatterAmount) {
+ if (antimatterAmount == 0) {
+ rollingCost *= 0.995;
+ if (rollingCost < 100) rollingCost = 0;
+ } else if (rollingCost < antimatterAmount * 1000) {
+ rollingCost += antimatterAmount;
+ } else {
+ rollingCost *= 0.995;
+ }
+ long value = BASE_CONSUMPTION + (long) Math.pow(rollingCost, 1.5 + modifiers[MAGNETIC_ID]);
+ this.guiPassiveEnergy = value;
+ return value;
+ }
+
+ // How much energy is consumed when machine does one operation
+ // Base formula: (Antimatter * 10000) ^ (1.5)
+ private long calculateEnergyCost(long antimatterAmount) {
+ long value = (long) Math.pow(antimatterAmount * activeBaseMult, activeBaseExp + modifiers[GRAVITY_ID]);
+ this.guiActiveEnergy = value;
+ return value;
+ }
+
+ private void decimateAntimatter() {
+ for (int i = 0; i < amOutputHatches.size(); i++) {
+ if (amOutputHatches.get(i) == null || !amOutputHatches.get(i)
+ .isValid()
+ || amOutputHatches.get(i)
+ .getFluid() == null)
+ continue;
+ FluidStack fluid = amOutputHatches.get(i)
+ .getFluid()
+ .copy();
+ amOutputHatches.get(i)
+ .drain((int) Math.floor(fluid.amount * 0.1), true);
+ }
+ }
+
+ private int distributeAntimatterToHatch(List<AntimatterOutputHatch> hatches, long totalAntimatterAmount,
+ long protomatterAmount) {
+ double coeff = Math.pow((totalAntimatterAmount), 0.5 + modifiers[CONTAINMENT_ID]);
+ int difference = 0;
+
+ for (AntimatterOutputHatch hatch : hatches) {
+ // Skewed normal distribution multiplied by coefficient from antimatter amount
+ // We round up so you are guaranteed to be antimatter positive on the first run (reduces startup RNG)
+ int change = (int) (Math.ceil((r.nextGaussian() + baseSkew + modifiers[ACTIVATION_ID]) * (coeff / 16)));
+ difference += change;
+ if (change >= 0) {
+ hatch.fill(MaterialsUEVplus.Antimatter.getFluid((long) (change)), true);
+ } else {
+ hatch.drain(-change, true);
+ }
+ }
+ return difference;
+ }
+
+ @Override
+ public void clearHatches() {
+ super.clearHatches();
+ amOutputHatches.clear();
+ }
+
+ @Override
+ public void onRemoval() {
+ if (this.isLoadedChunk) GTChunkManager.releaseTicket((TileEntity) getBaseMetaTileEntity());
+ super.onRemoval();
+ }
+
+ public int getChunkX() {
+ return getBaseMetaTileEntity().getXCoord() >> 4;
+ }
+
+ public int getChunkZ() {
+ return getBaseMetaTileEntity().getZCoord() >> 4;
+ }
+
+ private boolean addEnergyInjector(IGregTechTileEntity aBaseMetaTileEntity, int aBaseCasingIndex) {
+ IMetaTileEntity aMetaTileEntity = aBaseMetaTileEntity.getMetaTileEntity();
+ if (aMetaTileEntity == null) return false;
+ if (aMetaTileEntity instanceof MTEHatch hatch && ExoticEnergyInputHelper.isExoticEnergyInput(aMetaTileEntity)) {
+ hatch.updateTexture(aBaseCasingIndex);
+ hatch.updateCraftingIcon(this.getMachineCraftingIcon());
+ return mExoticEnergyHatches.add(hatch);
+ }
+ return false;
+ }
+
+ private boolean addFluidIO(IGregTechTileEntity aBaseMetaTileEntity, int aBaseCasingIndex) {
+ IMetaTileEntity aMetaTileEntity = aBaseMetaTileEntity.getMetaTileEntity();
+ if (aMetaTileEntity == null) return false;
+ if (aMetaTileEntity instanceof MTEHatch hatch) {
+ hatch.updateTexture(aBaseCasingIndex);
+ hatch.updateCraftingIcon(this.getMachineCraftingIcon());
+ }
+ if (aMetaTileEntity instanceof MTEHatchInput tInput) {
+ tInput.mRecipeMap = getRecipeMap();
+ return mInputHatches.add(tInput);
+ }
+ if (aMetaTileEntity instanceof AntimatterOutputHatch tAntimatter) {
+ return amOutputHatches.add(tAntimatter);
+ }
+ if (aMetaTileEntity instanceof MTEHatchOutput tOutput) {
+ return mOutputHatches.add(tOutput);
+ }
+ if (aMetaTileEntity instanceof IDualInputHatch tInput) {
+ tInput.updateCraftingIcon(this.getMachineCraftingIcon());
+ return mDualInputHatches.add(tInput);
+ }
+ return false;
+ }
+
+ private boolean addAntimatterHatch(IGregTechTileEntity aBaseMetaTileEntity, int aBaseCasingIndex) {
+ IMetaTileEntity aMetaTileEntity = aBaseMetaTileEntity.getMetaTileEntity();
+ if (aMetaTileEntity == null) return false;
+ if (aMetaTileEntity instanceof MTEHatch hatch) {
+ hatch.updateTexture(aBaseCasingIndex);
+ hatch.updateCraftingIcon(this.getMachineCraftingIcon());
+ }
+ if (aMetaTileEntity instanceof AntimatterOutputHatch tAntimatter) {
+ return amOutputHatches.add(tAntimatter);
+ }
+
+ return false;
+ }
+
+ @Override
+ public int getMaxEfficiency(ItemStack aStack) {
+ return 10000;
+ }
+
+ @Override
+ public int getDamageToComponent(ItemStack aStack) {
+ return 0;
+ }
+
+ @Override
+ public boolean explodesOnComponentBreak(ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public OverclockDescriber getOverclockDescriber() {
+ return null;
+ }
+
+ @Override
+ public String[] getInfoData() {
+ IGregTechTileEntity baseMetaTileEntity = getBaseMetaTileEntity();
+
+ long storedEnergy = 0;
+ long maxEnergy = 0;
+
+ for (MTEHatch tHatch : mExoticEnergyHatches) {
+ storedEnergy += tHatch.getBaseMetaTileEntity()
+ .getStoredEU();
+ maxEnergy += tHatch.getBaseMetaTileEntity()
+ .getEUCapacity();
+ }
+
+ return new String[] { EnumChatFormatting.BLUE + "Antimatter Forge " + EnumChatFormatting.GRAY,
+ StatCollector.translateToLocal("GT5U.multiblock.Progress") + ": "
+ + EnumChatFormatting.GREEN
+ + GTUtility.formatNumbers(mProgresstime)
+ + EnumChatFormatting.RESET
+ + "t / "
+ + EnumChatFormatting.YELLOW
+ + GTUtility.formatNumbers(mMaxProgresstime)
+ + EnumChatFormatting.RESET
+ + "t",
+ StatCollector.translateToLocal("GT5U.multiblock.energy") + ": "
+ + EnumChatFormatting.GREEN
+ + GTUtility.formatNumbers(storedEnergy)
+ + EnumChatFormatting.RESET
+ + " EU / "
+ + EnumChatFormatting.YELLOW
+ + GTUtility.formatNumbers(maxEnergy)
+ + EnumChatFormatting.RESET
+ + " EU",
+ StatCollector.translateToLocal("gui.AntimatterForge.0") + ": "
+ + EnumChatFormatting.BLUE
+ + GTUtility.formatNumbers(this.guiAntimatterAmount)
+ + EnumChatFormatting.RESET
+ + " L",
+ StatCollector.translateToLocal("gui.AntimatterForge.1") + ": "
+ + EnumChatFormatting.RED
+ + GTUtility.formatNumbers(this.guiPassiveEnergy)
+ + EnumChatFormatting.RESET
+ + " EU/t",
+ StatCollector.translateToLocal("gui.AntimatterForge.2") + ": "
+ + EnumChatFormatting.LIGHT_PURPLE
+ + GTUtility.formatNumbers(this.guiActiveEnergy)
+ + EnumChatFormatting.RESET
+ + " EU/t",
+ StatCollector.translateToLocal("gui.AntimatterForge.3") + ": "
+ + EnumChatFormatting.AQUA
+ + GTUtility.formatNumbers(this.guiAntimatterChange)
+ + EnumChatFormatting.RESET
+ + " EU/t" };
+ }
+
+ private long getAntimatterAmount() {
+ return this.guiAntimatterAmount;
+ }
+
+ private long getPassiveConsumption() {
+ return this.guiPassiveEnergy;
+ }
+
+ private long getActiveConsumption() {
+ return this.guiActiveEnergy;
+ }
+
+ private long getAntimatterChange() {
+ return this.guiAntimatterChange;
+ }
+
+ protected long antimatterAmountCache;
+ protected long passiveCostCache;
+ protected long activeCostCache;
+ protected long antimatterChangeCache;
+ protected static final NumberFormatMUI numberFormat = new NumberFormatMUI();
+
+ protected static DecimalFormat standardFormat;
+
+ static {
+ DecimalFormatSymbols dfs = new DecimalFormatSymbols(Locale.US);
+ dfs.setExponentSeparator("e");
+ standardFormat = new DecimalFormat("0.00E0", dfs);
+ }
+
+ @Override
+ protected void drawTexts(DynamicPositionedColumn screenElements, SlotWidget inventorySlot) {
+ super.drawTexts(screenElements, inventorySlot);
+
+ screenElements
+ .widget(
+ new TextWidget()
+ .setStringSupplier(
+ () -> StatCollector.translateToLocal("gui.AntimatterForge.0") + ": "
+ + EnumChatFormatting.BLUE
+ + numberFormat.format(antimatterAmountCache)
+ + EnumChatFormatting.WHITE
+ + " L")
+ .setDefaultColor(COLOR_TEXT_WHITE.get()))
+ .widget(new FakeSyncWidget.LongSyncer(this::getAntimatterAmount, val -> antimatterAmountCache = val))
+ .widget(
+ new TextWidget()
+ .setStringSupplier(
+ () -> StatCollector.translateToLocal("gui.AntimatterForge.1") + ": "
+ + EnumChatFormatting.RED
+ + standardFormat.format(passiveCostCache)
+ + EnumChatFormatting.WHITE
+ + " EU/t")
+ .setDefaultColor(COLOR_TEXT_WHITE.get()))
+ .widget(new FakeSyncWidget.LongSyncer(this::getPassiveConsumption, val -> passiveCostCache = val))
+ .widget(
+ new TextWidget()
+ .setStringSupplier(
+ () -> StatCollector.translateToLocal("gui.AntimatterForge.2") + ": "
+ + EnumChatFormatting.LIGHT_PURPLE
+ + standardFormat.format(activeCostCache)
+ + EnumChatFormatting.WHITE
+ + " EU")
+ .setDefaultColor(COLOR_TEXT_WHITE.get()))
+ .widget(new FakeSyncWidget.LongSyncer(this::getActiveConsumption, val -> activeCostCache = val))
+ .widget(
+ new TextWidget()
+ .setStringSupplier(
+ () -> StatCollector.translateToLocal("gui.AntimatterForge.3") + ": "
+ + EnumChatFormatting.AQUA
+ + numberFormat.format(antimatterChangeCache)
+ + EnumChatFormatting.WHITE
+ + " L")
+ .setDefaultColor(COLOR_TEXT_WHITE.get()))
+ .widget(new FakeSyncWidget.LongSyncer(this::getAntimatterChange, val -> antimatterChangeCache = val));
+ }
+
+ @Override
+ public boolean getDefaultHasMaintenanceChecks() {
+ return false;
+ }
+
+ @Override
+ public void stopMachine(@Nonnull ShutDownReason reason) {
+ super.stopMachine(reason);
+ setProtoRender(false);
+ }
+
+ @Override
+ public void onBlockDestroyed() {
+ super.onBlockDestroyed();
+ destroyAntimatterRender();
+ }
+
+ public void updateAntimatterSize(float antimatterAmount) {
+ TileAntimatter render = forceGetAntimatterRender();
+
+ if (antimatterAmount < 0) {
+ setProtoRender(false);
+ render.setCoreSize(0);
+ return;
+ }
+
+ float size = (float) Math.pow(antimatterAmount, 0.17);
+ render.setCoreSize(size);
+ }
+
+ public void setProtoRender(boolean flag) {
+ TileAntimatter render = forceGetAntimatterRender();
+ render.setProtomatterRender(flag);
+ if (flag) render.setRotationFields(getRotation(), getDirection());
+ }
+
+ public TileAntimatter getAntimatterRender() {
+ IGregTechTileEntity gregTechTileEntity = this.getBaseMetaTileEntity();
+ World world = gregTechTileEntity.getWorld();
+
+ if (world == null) {
+ return null;
+ }
+
+ int x = gregTechTileEntity.getXCoord();
+ int y = gregTechTileEntity.getYCoord();
+ int z = gregTechTileEntity.getZCoord();
+
+ double xOffset = 16 * getExtendedFacing().getRelativeBackInWorld().offsetX;
+ double zOffset = 16 * getExtendedFacing().getRelativeBackInWorld().offsetZ;
+ double yOffset = 16 * getExtendedFacing().getRelativeBackInWorld().offsetY;
+
+ int wX = (int) (x + xOffset);
+ int wY = (int) (y + yOffset);
+ int wZ = (int) (z + zOffset);
+
+ return (TileAntimatter) world.getTileEntity(wX, wY, wZ);
+ }
+
+ public void destroyAntimatterRender() {
+ IGregTechTileEntity gregTechTileEntity = this.getBaseMetaTileEntity();
+ World world = gregTechTileEntity.getWorld();
+
+ if (world == null) {
+ return;
+ }
+
+ int x = gregTechTileEntity.getXCoord();
+ int y = gregTechTileEntity.getYCoord();
+ int z = gregTechTileEntity.getZCoord();
+
+ int xOffset = 16 * getExtendedFacing().getRelativeBackInWorld().offsetX;
+ int yOffset = 16 * getExtendedFacing().getRelativeBackInWorld().offsetY;
+ int zOffset = 16 * getExtendedFacing().getRelativeBackInWorld().offsetZ;
+
+ int xTarget = x + xOffset;
+ int yTarget = y + yOffset;
+ int zTarget = z + zOffset;
+
+ world.setBlock(xTarget, yTarget, zTarget, Blocks.air);
+ }
+
+ public void createAntimatterRender() {
+ IGregTechTileEntity gregTechTileEntity = this.getBaseMetaTileEntity();
+ World world = gregTechTileEntity.getWorld();
+
+ if (world == null) {
+ return;
+ }
+
+ int x = gregTechTileEntity.getXCoord();
+ int y = gregTechTileEntity.getYCoord();
+ int z = gregTechTileEntity.getZCoord();
+
+ int xOffset = 16 * getExtendedFacing().getRelativeBackInWorld().offsetX;
+ int yOffset = 16 * getExtendedFacing().getRelativeBackInWorld().offsetY;
+ int zOffset = 16 * getExtendedFacing().getRelativeBackInWorld().offsetZ;
+
+ int wX = x + xOffset;
+ int wY = y + yOffset;
+ int wZ = z + zOffset;
+
+ world.setBlock(wX, wY, wZ, Blocks.air);
+ world.setBlock(wX, wY, wZ, Loaders.antimatterRenderBlock);
+ }
+
+ public TileAntimatter forceGetAntimatterRender() {
+ TileAntimatter render = getAntimatterRender();
+ if (render != null) return render;
+ else createAntimatterRender();
+ return getAntimatterRender();
+ }
+
+}
diff --git a/src/main/java/goodgenerator/blocks/tileEntity/AntimatterGenerator.java b/src/main/java/goodgenerator/blocks/tileEntity/AntimatterGenerator.java
new file mode 100644
index 0000000000..89bb56acdd
--- /dev/null
+++ b/src/main/java/goodgenerator/blocks/tileEntity/AntimatterGenerator.java
@@ -0,0 +1,572 @@
+package goodgenerator.blocks.tileEntity;
+
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.lazy;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock;
+import static gregtech.api.enums.Textures.BlockIcons.*;
+import static gregtech.api.metatileentity.BaseTileEntity.TOOLTIP_DELAY;
+import static gregtech.api.util.GTStructureUtility.buildHatchAdder;
+import static gregtech.api.util.GTStructureUtility.ofFrame;
+import static gregtech.common.misc.WirelessNetworkManager.addEUToGlobalEnergyMap;
+import static gregtech.common.misc.WirelessNetworkManager.strongCheckOrAddUser;
+
+import java.text.DecimalFormat;
+import java.text.DecimalFormatSymbols;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Locale;
+import java.util.UUID;
+
+import net.minecraft.block.Block;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.StatCollector;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.FluidStack;
+
+import com.gtnewhorizon.structurelib.alignment.constructable.IConstructable;
+import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment;
+import com.gtnewhorizon.structurelib.structure.StructureDefinition;
+import com.gtnewhorizons.modularui.api.NumberFormatMUI;
+import com.gtnewhorizons.modularui.api.drawable.IDrawable;
+import com.gtnewhorizons.modularui.api.drawable.UITexture;
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.api.screen.UIBuildContext;
+import com.gtnewhorizons.modularui.common.widget.ButtonWidget;
+import com.gtnewhorizons.modularui.common.widget.DynamicPositionedColumn;
+import com.gtnewhorizons.modularui.common.widget.FakeSyncWidget;
+import com.gtnewhorizons.modularui.common.widget.SlotWidget;
+import com.gtnewhorizons.modularui.common.widget.TextWidget;
+
+import bartworks.common.loaders.ItemRegistry;
+import goodgenerator.blocks.structures.AntimatterStructures;
+import goodgenerator.loader.Loaders;
+import gregtech.api.GregTechAPI;
+import gregtech.api.enums.HatchElement;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.MaterialsUEVplus;
+import gregtech.api.enums.Textures;
+import gregtech.api.gui.modularui.GTUITextures;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.implementations.MTEExtendedPowerMultiBlockBase;
+import gregtech.api.metatileentity.implementations.MTEHatch;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.check.CheckRecipeResult;
+import gregtech.api.recipe.check.CheckRecipeResultRegistry;
+import gregtech.api.render.TextureFactory;
+import gregtech.api.util.GTUtility;
+import gregtech.api.util.HatchElementBuilder;
+import gregtech.api.util.MultiblockTooltipBuilder;
+import kekztech.client.gui.KTUITextures;
+import tectech.thing.metaTileEntity.hatch.MTEHatchDynamoTunnel;
+
+public class AntimatterGenerator extends MTEExtendedPowerMultiBlockBase
+ implements IConstructable, ISurvivalConstructable {
+
+ public static final String MAIN_NAME = "antimatterGenerator";
+ protected IStructureDefinition<AntimatterGenerator> multiDefinition = null;
+ protected int times = 1;
+ private UUID owner_uuid;
+ private boolean wirelessEnabled = false;
+ private boolean canUseWireless = true;
+ private long euCapacity = 0;
+ private long euLastCycle = 0;
+ private float annihilationEfficiency = 0f;
+
+ private static final ClassValue<IStructureDefinition<AntimatterGenerator>> STRUCTURE_DEFINITION = new ClassValue<IStructureDefinition<AntimatterGenerator>>() {
+
+ @Override
+ protected IStructureDefinition<AntimatterGenerator> computeValue(Class<?> type) {
+ return StructureDefinition.<AntimatterGenerator>builder()
+ .addShape(MAIN_NAME, AntimatterStructures.ANTIMATTER_GENERATOR)
+ .addElement('F', lazy(x -> ofFrame(Materials.Naquadria))) // Naquadria Frame Box
+ .addElement('D', lazy(x -> ofBlock(x.getCasingBlock(1), x.getCasingMeta(1)))) // Black Casing
+ .addElement('G', lazy(x -> ofBlock(x.getCoilBlock(1), x.getCoilMeta(1)))) // Annihilation Coil
+ .addElement('B', lazy(x -> ofBlock(x.getCoilBlock(2), x.getCoilMeta(2)))) // Containment Coil
+ .addElement('C', lazy(x -> ofBlock(x.getCasingBlock(2), x.getCasingMeta(2)))) // White Casing
+ .addElement('A', lazy(x -> ofBlock(x.getGlassBlock(), x.getGlassMeta()))) // Glass
+ .addElement('E', lazy(x -> ofBlock(GregTechAPI.sBlockCasings9, 1))) // Filter Casing
+ .addElement(
+ 'H',
+ lazy(
+ x -> HatchElementBuilder.<AntimatterGenerator>builder()
+ .anyOf(HatchElement.ExoticEnergy)
+ .adder(AntimatterGenerator::addLaserSource)
+ .casingIndex(x.textureIndex(2))
+ .dot(1)
+ .buildAndChain(x.getCasingBlock(2), x.getCasingMeta(2))))
+ .addElement(
+ 'I',
+ lazy(
+ x -> buildHatchAdder(AntimatterGenerator.class).atLeast(HatchElement.InputHatch)
+ .casingIndex(x.textureIndex(1))
+ .dot(2)
+ .buildAndChain(x.getCasingBlock(1), x.getCasingMeta(1))))
+ .build();
+ }
+ };
+
+ static {
+ Textures.BlockIcons.setCasingTextureForId(
+ 53,
+ TextureFactory.of(
+ TextureFactory.builder()
+ .addIcon(MACHINE_CASING_ANTIMATTER)
+ .extFacing()
+ .build(),
+ TextureFactory.builder()
+ .addIcon(MACHINE_CASING_ANTIMATTER_GLOW)
+ .extFacing()
+ .glow()
+ .build()));
+ };
+
+ private boolean addLaserSource(IGregTechTileEntity aBaseMetaTileEntity, int aBaseCasingIndex) {
+ IMetaTileEntity aMetaTileEntity = aBaseMetaTileEntity.getMetaTileEntity();
+ if (aMetaTileEntity == null) return false;
+ if (aMetaTileEntity instanceof MTEHatchDynamoTunnel tHatch) {
+ tHatch.updateTexture(aBaseCasingIndex);
+ return mExoticEnergyHatches.add(tHatch);
+ }
+ return false;
+ }
+
+ public AntimatterGenerator(String name) {
+ super(name);
+ }
+
+ public AntimatterGenerator(int id, String name, String nameRegional) {
+ super(id, name, nameRegional);
+ }
+
+ @Override
+ public boolean isCorrectMachinePart(ItemStack aStack) {
+ return true;
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return null;
+ }
+
+ @Override
+ public CheckRecipeResult checkProcessing() {
+ startRecipeProcessing();
+ List<FluidStack> inputFluids = getStoredFluids();
+ long containedAntimatter = 0;
+ FluidStack catalystFluid = null;
+ int i = 0;
+
+ while (i < inputFluids.size()) {
+ FluidStack inputFluid = inputFluids.get(i);
+ if (inputFluid.isFluidEqual(MaterialsUEVplus.Antimatter.getFluid(1))) {
+ containedAntimatter += inputFluid.amount;
+ } else {
+ catalystFluid = inputFluid.copy();
+ }
+ // We annihilate everything, even if it was the wrong fluid
+ inputFluid.amount = 0;
+ i++;
+ }
+ // If i != 2, we iterated more than 2 times and have too many fluids.
+ if (i == 2 && containedAntimatter > 0 && catalystFluid != null) {
+ createEU(containedAntimatter, catalystFluid);
+ }
+
+ endRecipeProcessing();
+ return CheckRecipeResultRegistry.SUCCESSFUL;
+ }
+
+ // (Antimatter^(EXP) * 1e12 )/(Math.min((Antimatter/Matter),(Matter/Antimatter)))
+ public void createEU(long antimatter, FluidStack catalyst) {
+ Float modifier = null;
+
+ if (catalyst.isFluidEqual(Materials.Copper.getMolten(1L))) {
+ modifier = 1.0F;
+ } else if (catalyst.isFluidEqual(Materials.SuperconductorUIVBase.getMolten(1L))) {
+ modifier = 1.02F;
+ } else if (catalyst.isFluidEqual(Materials.SuperconductorUMVBase.getMolten(1L))) {
+ modifier = 1.03F;
+ } else if (catalyst.isFluidEqual(MaterialsUEVplus.BlackDwarfMatter.getMolten(1L))) {
+ modifier = 1.04F;
+ }
+ long catalystCount = catalyst.amount;
+ long generatedEU = 0;
+
+ if (modifier != null) {
+ float efficiency = Math
+ .min(((float) antimatter / (float) catalystCount), ((float) catalystCount / (float) antimatter));
+ this.annihilationEfficiency = efficiency;
+ generatedEU = (long) ((Math.pow(antimatter, modifier) * 1e12) * efficiency);
+ }
+
+ if (wirelessEnabled && modifier >= 1.03F) {
+ // Clamp the EU to the maximum of the hatches so wireless cannot bypass the limitations
+ generatedEU = Math.min(generatedEU, euCapacity);
+ this.euLastCycle = generatedEU;
+ addEUToGlobalEnergyMap(owner_uuid, generatedEU);
+ } else {
+ this.euLastCycle = generatedEU;
+ float invHatchCount = 1.0F / (float) mExoticEnergyHatches.size();
+ for (MTEHatch tHatch : getExoticEnergyHatches()) {
+ if (tHatch instanceof MTEHatchDynamoTunnel tLaserSource) {
+ tLaserSource.setEUVar(tLaserSource.getEUVar() + (long) (generatedEU * invHatchCount));
+ }
+ }
+ }
+ }
+
+ @Override
+ public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) {
+ this.euCapacity = 0;
+ for (MTEHatch tHatch : getExoticEnergyHatches()) {
+ if (tHatch instanceof MTEHatchDynamoTunnel tLaserSource) {
+ this.euCapacity += tLaserSource.maxEUStore();
+ }
+ }
+ return checkPiece(MAIN_NAME, 17, 41, 0);
+ }
+
+ @Override
+ public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) {
+ if (mMachine) return -1;
+ return survivialBuildPiece(MAIN_NAME, stackSize, 17, 41, 0, elementBudget, env, false, true);
+ }
+
+ @Override
+ public void construct(ItemStack itemStack, boolean hintsOnly) {
+ buildPiece(MAIN_NAME, itemStack, hintsOnly, 17, 41, 0);
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound nbt) {
+ nbt.setBoolean("wirelessEnabled", wirelessEnabled);
+ super.saveNBTData(nbt);
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound nbt) {
+ wirelessEnabled = nbt.getBoolean("wirelessEnabled");
+ super.loadNBTData(nbt);
+ }
+
+ @Override
+ public int getMaxEfficiency(ItemStack aStack) {
+ return 10000;
+ }
+
+ @Override
+ public int getPollutionPerTick(ItemStack aStack) {
+ return 0;
+ }
+
+ @Override
+ public int getDamageToComponent(ItemStack aStack) {
+ return 0;
+ }
+
+ @Override
+ public boolean explodesOnComponentBreak(ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new AntimatterGenerator(this.MAIN_NAME);
+ }
+
+ @Override
+ public void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ wirelessEnabled = !wirelessEnabled;
+ GTUtility.sendChatToPlayer(aPlayer, "Wireless network mode " + (wirelessEnabled ? "enabled." : "disabled."));
+ if (wirelessEnabled) {
+ GTUtility.sendChatToPlayer(aPlayer, "Wireless only works with UMV Superconductor Base or better.");
+ }
+ }
+
+ @Override
+ public void onPreTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+ super.onPreTick(aBaseMetaTileEntity, aTick);
+
+ if (aBaseMetaTileEntity.isServerSide()) {
+
+ // On first tick find the player name and attempt to add them to the map.
+ if (aTick == 1) {
+
+ // UUID and username of the owner.
+ owner_uuid = aBaseMetaTileEntity.getOwnerUuid();
+
+ strongCheckOrAddUser(owner_uuid);
+ }
+ }
+ }
+
+ @Override
+ protected MultiblockTooltipBuilder createTooltip() {
+ final MultiblockTooltipBuilder tt = new MultiblockTooltipBuilder();
+ tt.addMachineType("Antimatter Generator")
+ .addInfo("Annihilating antimatter like it's 2205!")
+ .addSeparator()
+ .addInfo("Generates energy by reacting Semi-Stable Antimatter with matter")
+ .addInfo("Annihilation uses an equal amount of antimatter and matter")
+ .addInfo(
+ "Consumes " + EnumChatFormatting.GOLD
+ + "all inputs"
+ + EnumChatFormatting.GRAY
+ + " every processing cycle")
+ .addInfo(
+ "Imbalance between antimatter and matter " + EnumChatFormatting.RED
+ + "will waste energy!"
+ + EnumChatFormatting.GRAY)
+ .addInfo(
+ "Any EU that does not fit in laser hatches will be " + EnumChatFormatting.RED
+ + "voided"
+ + EnumChatFormatting.GRAY)
+ .addSeparator()
+ .addInfo("Antimatter base energy value: 1,000,000,000 EU/L")
+ .addInfo("Energy production is exponentially increased depending on the matter used:")
+ .addInfo("Molten Copper: 1.00")
+ .addInfo("Molten SC UIV Base: 1.02")
+ .addInfo("Molten SC UMV Base: 1.03")
+ .addInfo("Molten Black Dwarf Matter: 1.04")
+ .addSeparator()
+ .addInfo("Enable wireless EU mode with screwdriver")
+ .addInfo("Wireless mode requires SC UMV Base or better")
+ .addInfo("Wireless mode uses hatch capacity limit")
+ .addDynamoHatch("1-9, Hint block with dot 4", 4)
+ .addInputHatch("1-6, Hint block with dot 1", 1)
+ .toolTipFinisher("Good Generator");
+ return tt;
+ }
+
+ protected boolean canUseWireless() {
+ return true;
+ }
+
+ @Override
+ public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) {
+ super.addUIWidgets(builder, buildContext);
+ builder.widget(new ButtonWidget().setOnClick((clickData, widget) -> {
+ if (!widget.isClient()) {
+ canUseWireless = canUseWireless();
+ }
+ if (canUseWireless) {
+ wirelessEnabled = !wirelessEnabled;
+ }
+ })
+ .setPlayClickSound(true)
+ .setBackground(() -> {
+ List<UITexture> ret = new ArrayList<>();
+ ret.add(GTUITextures.BUTTON_STANDARD);
+ if (canUseWireless) {
+ if (wirelessEnabled) {
+ ret.add(KTUITextures.OVERLAY_BUTTON_WIRELESS_ON);
+ } else {
+ ret.add(KTUITextures.OVERLAY_BUTTON_WIRELESS_OFF);
+ }
+ } else {
+ ret.add(KTUITextures.OVERLAY_BUTTON_WIRELESS_OFF_DISABLED);
+ }
+ return ret.toArray(new IDrawable[0]);
+ })
+ .setPos(80, 91)
+ .setSize(16, 16)
+ .addTooltip(StatCollector.translateToLocal("gui.kekztech_lapotronicenergyunit.wireless"))
+ .setTooltipShowUpDelay(TOOLTIP_DELAY))
+ .widget(new FakeSyncWidget.BooleanSyncer(() -> wirelessEnabled, val -> wirelessEnabled = val))
+ .widget(new FakeSyncWidget.BooleanSyncer(this::canUseWireless, val -> canUseWireless = val));
+ }
+
+ @Override
+ public String[] getInfoData() {
+ long storedEnergy = 0;
+ long maxEnergy = 0;
+
+ for (MTEHatch tHatch : mExoticEnergyHatches) {
+ storedEnergy += tHatch.getBaseMetaTileEntity()
+ .getStoredEU();
+ maxEnergy += tHatch.getBaseMetaTileEntity()
+ .getEUCapacity();
+ }
+
+ return new String[] { EnumChatFormatting.BLUE + "Antimatter Forge " + EnumChatFormatting.GRAY,
+ StatCollector.translateToLocal("GT5U.multiblock.Progress") + ": "
+ + EnumChatFormatting.GREEN
+ + GTUtility.formatNumbers(mProgresstime)
+ + EnumChatFormatting.RESET
+ + "t / "
+ + EnumChatFormatting.YELLOW
+ + GTUtility.formatNumbers(mMaxProgresstime)
+ + EnumChatFormatting.RESET
+ + "t",
+ StatCollector.translateToLocal("GT5U.multiblock.energy") + ": "
+ + EnumChatFormatting.GREEN
+ + GTUtility.formatNumbers(storedEnergy)
+ + EnumChatFormatting.RESET
+ + " EU / "
+ + EnumChatFormatting.YELLOW
+ + GTUtility.formatNumbers(maxEnergy)
+ + EnumChatFormatting.RESET
+ + " EU",
+ StatCollector.translateToLocal("gui.AntimatterGenerator.0") + ": "
+ + EnumChatFormatting.GREEN
+ + GTUtility.formatNumbers(this.euLastCycle)
+ + EnumChatFormatting.RESET
+ + " EU",
+ StatCollector.translateToLocal("gui.AntimatterGenerator.1") + ": "
+ + EnumChatFormatting.AQUA
+ + GTUtility.formatNumbers(Math.ceil(this.annihilationEfficiency * 100))
+ + EnumChatFormatting.RESET
+ + " %" };
+ }
+
+ private long getEnergyProduced() {
+ return this.euLastCycle;
+ }
+
+ private float getEfficiency() {
+ return this.annihilationEfficiency;
+ }
+
+ protected long energyProducedCache;
+ protected float efficiencyCache;
+ protected static final NumberFormatMUI numberFormat = new NumberFormatMUI();
+
+ protected static DecimalFormat standardFormat;
+
+ static {
+ DecimalFormatSymbols dfs = new DecimalFormatSymbols(Locale.US);
+ dfs.setExponentSeparator("e");
+ standardFormat = new DecimalFormat("0.00E0", dfs);
+ }
+
+ @Override
+ protected void drawTexts(DynamicPositionedColumn screenElements, SlotWidget inventorySlot) {
+ super.drawTexts(screenElements, inventorySlot);
+
+ screenElements
+ .widget(
+ new TextWidget()
+ .setStringSupplier(
+ () -> StatCollector.translateToLocal("gui.AntimatterGenerator.0") + ": "
+ + EnumChatFormatting.BLUE
+ + standardFormat.format(energyProducedCache)
+ + EnumChatFormatting.WHITE
+ + " EU")
+ .setDefaultColor(COLOR_TEXT_WHITE.get()))
+ .widget(new FakeSyncWidget.LongSyncer(this::getEnergyProduced, val -> energyProducedCache = val))
+ .widget(
+ new TextWidget()
+ .setStringSupplier(
+ () -> StatCollector.translateToLocal("gui.AntimatterGenerator.1") + ": "
+ + EnumChatFormatting.RED
+ + numberFormat.format(Math.ceil(efficiencyCache * 100))
+ + EnumChatFormatting.WHITE
+ + " %")
+ .setDefaultColor(COLOR_TEXT_WHITE.get()))
+ .widget(new FakeSyncWidget.FloatSyncer(this::getEfficiency, val -> efficiencyCache = val));
+ }
+
+ @Override
+ public IStructureDefinition<AntimatterGenerator> getStructureDefinition() {
+ return STRUCTURE_DEFINITION.get(getClass());
+ }
+
+ private static final ITexture textureOverlay = TextureFactory.of(
+ TextureFactory.builder()
+ .addIcon(OVERLAY_FUSION1)
+ .extFacing()
+ .build(),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_FUSION1_GLOW)
+ .extFacing()
+ .glow()
+ .build());
+
+ public ITexture getTextureOverlay() {
+ return textureOverlay;
+ }
+
+ @Override
+ @SuppressWarnings("ALL")
+ public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection facing,
+ int colorIndex, boolean aActive, boolean aRedstone) {
+ if (side == facing) return new ITexture[] { TextureFactory.builder()
+ .addIcon(MACHINE_CASING_ANTIMATTER)
+ .extFacing()
+ .build(), getTextureOverlay() };
+ if (aActive) return new ITexture[] { Textures.BlockIcons.getCasingTextureForId(53) };
+ return new ITexture[] { TextureFactory.builder()
+ .addIcon(MACHINE_CASING_ANTIMATTER)
+ .extFacing()
+ .build() };
+ }
+
+ public Block getCoilBlock(int type) {
+ switch (type) {
+ case 1:
+ return Loaders.antimatterAnnihilationMatrix;
+ case 2:
+ return Loaders.protomatterActivationCoil;
+ default:
+ return Loaders.antimatterAnnihilationMatrix;
+ }
+ }
+
+ public int getCoilMeta(int type) {
+ return 0;
+ }
+
+ public Block getCasingBlock(int type) {
+ switch (type) {
+ case 1:
+ return Loaders.magneticFluxCasing;
+ case 2:
+ return Loaders.gravityStabilizationCasing;
+ default:
+ return Loaders.magneticFluxCasing;
+ }
+ }
+
+ public int getCasingMeta(int type) {
+ return 0;
+ }
+
+ public Block getFrameBlock() {
+ return Loaders.antimatterContainmentCasing;
+ }
+
+ public int getFrameMeta() {
+ return 0;
+ }
+
+ public Block getGlassBlock() {
+ return ItemRegistry.bw_realglas2;
+ }
+
+ public int getGlassMeta() {
+ return 0;
+ }
+
+ public int textureIndex(int type) {
+ switch (type) {
+ case 1:
+ return (12 << 7) + 9;
+ case 2:
+ return (12 << 7) + 10;
+ default:
+ return (12 << 7) + 9;
+ }
+ }
+
+ @Override
+ public boolean getDefaultHasMaintenanceChecks() {
+ return false;
+ }
+
+}
diff --git a/src/main/java/goodgenerator/blocks/tileEntity/AntimatterOutputHatch.java b/src/main/java/goodgenerator/blocks/tileEntity/AntimatterOutputHatch.java
new file mode 100644
index 0000000000..f575e2f315
--- /dev/null
+++ b/src/main/java/goodgenerator/blocks/tileEntity/AntimatterOutputHatch.java
@@ -0,0 +1,74 @@
+package goodgenerator.blocks.tileEntity;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.FluidStack;
+
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.MaterialsUEVplus;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.metatileentity.implementations.MTEHatchOutput;
+
+public class AntimatterOutputHatch extends MTEHatchOutput {
+
+ private static final FluidStack ANTIMATTER = Materials.Antimatter.getFluid(1);
+
+ public AntimatterOutputHatch(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional, 11);
+ this.mDescriptionArray[1] = "Stores Antimatter";
+ this.mDescriptionArray[2] = "Antimatter can be inserted from any side";
+ this.mDescriptionArray[3] = "Capacity: 16,384,000L";
+ }
+
+ public AntimatterOutputHatch(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) {
+ super(aName, aTier, aDescription, aTextures);
+ setLockedFluidName(
+ MaterialsUEVplus.Antimatter.getFluid(1)
+ .getFluid()
+ .getName());
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new AntimatterOutputHatch(this.mName, this.mTier, this.mDescriptionArray, this.mTextures);
+ }
+
+ @Override
+ public int getCapacity() {
+ return 16_384_000;
+ }
+
+ @Override
+ public boolean isFluidLocked() {
+ return true;
+ }
+
+ @Override
+ protected void onEmptyingContainerWhenEmpty() {
+ // Disable removing the lock
+ }
+
+ @Override
+ public void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ if (!getBaseMetaTileEntity().getCoverInfoAtSide(side)
+ .isGUIClickable()) return;
+ if (aPlayer.isSneaking()) {
+ mMode = (byte) ((mMode + 9) % 10);
+ } else {
+ mMode = (byte) ((mMode + 1) % 10);
+ }
+ }
+
+ @Override
+ public boolean isLiquidInput(ForgeDirection side) {
+ return side != this.getBaseMetaTileEntity()
+ .getFrontFacing();
+ }
+
+ @Override
+ public boolean isLiquidOutput(ForgeDirection side) {
+ return side == getBaseMetaTileEntity().getFrontFacing();
+ }
+}
diff --git a/src/main/java/goodgenerator/blocks/tileEntity/render/TileAntimatter.java b/src/main/java/goodgenerator/blocks/tileEntity/render/TileAntimatter.java
new file mode 100644
index 0000000000..8e2027b36d
--- /dev/null
+++ b/src/main/java/goodgenerator/blocks/tileEntity/render/TileAntimatter.java
@@ -0,0 +1,130 @@
+
+package goodgenerator.blocks.tileEntity.render;
+
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.network.NetworkManager;
+import net.minecraft.network.Packet;
+import net.minecraft.network.play.server.S35PacketUpdateTileEntity;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.util.AxisAlignedBB;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import com.gtnewhorizon.structurelib.alignment.enumerable.Rotation;
+
+public class TileAntimatter extends TileEntity {
+
+ public boolean shouldRender = true;
+
+ // Antimatter Core settings
+ public static final float spikeR = 0.82f, spikeG = 0.92f, spikeB = 1f;
+ public static final float coreR = 0.43f, coreG = 0.40f, coreB = 1f;
+ public static final float maximalRadius = 9; // Includes core radius + spike length
+ // Due to being partially managed by a global timer, rotationSpeedMultiplier shouldn't change
+ // Otherwise it'll cause a snapping effect
+ public final float rotationSpeedMultiplier = 1;
+
+ public float coreScale = 1f;
+ public float coreScaleSnapshot = 1f;
+ public final float coreScaleTransitionTime = 2.5f;
+ public float timeSnapshot;
+ public float spikeFactor = 1f;
+
+ // Protomatter Settings
+ public static float protoSpiralMaxRadius = .5f;
+ public static final float protoR = 0.2f, protoG = 0.2f, protoB = 0.2f;
+ public float protomatterScale = .2f;
+ public boolean protomatterRender = false;
+ public float rotX = 0, rotY = 0, rotZ = 0;
+ public float rotationAngle = 0;
+
+ @Override
+ public void writeToNBT(NBTTagCompound compound) {
+ super.writeToNBT(compound);
+ compound.setFloat("coreScale", coreScale);
+ compound.setFloat("coreScaleSnapshot", coreScaleSnapshot);
+ compound.setFloat("currentTime", timeSnapshot);
+ compound.setFloat("spikeFactor", spikeFactor);
+ compound.setBoolean("protomatterRender", protomatterRender);
+
+ compound.setFloat("rotX", rotX);
+ compound.setFloat("rotY", rotY);
+ compound.setFloat("rotZ", rotZ);
+ compound.setFloat("rotationAngle", rotationAngle);
+ }
+
+ @Override
+ public void readFromNBT(NBTTagCompound compound) {
+ super.readFromNBT(compound);
+ coreScale = compound.getFloat("coreScale");
+ coreScaleSnapshot = compound.getFloat("coreScaleSnapshot");
+ timeSnapshot = compound.getFloat("currentTime");
+ spikeFactor = compound.getFloat("spikeFactor");
+ protomatterRender = compound.getBoolean("protomatterRender");
+
+ rotX = compound.getFloat("rotX");
+ rotY = compound.getFloat("rotY");
+ rotZ = compound.getFloat("rotZ");
+ rotationAngle = compound.getFloat("rotationAngle");
+ }
+
+ @Override
+ public Packet getDescriptionPacket() {
+ NBTTagCompound nbttagcompound = new NBTTagCompound();
+ writeToNBT(nbttagcompound);
+ return new S35PacketUpdateTileEntity(xCoord, yCoord, zCoord, 1, nbttagcompound);
+ }
+
+ @Override
+ public void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity pkt) {
+ readFromNBT(pkt.func_148857_g());
+ worldObj.markBlockRangeForRenderUpdate(xCoord, yCoord, zCoord, xCoord, yCoord, zCoord);
+ }
+
+ @Override
+ public AxisAlignedBB getRenderBoundingBox() {
+ return AxisAlignedBB.getBoundingBox(
+ xCoord - maximalRadius - 1,
+ yCoord - maximalRadius - 1,
+ zCoord - maximalRadius - 1,
+ xCoord + maximalRadius + 1,
+ yCoord + maximalRadius + 1,
+ zCoord + maximalRadius + 1);
+ }
+
+ @Override
+ public double getMaxRenderDistanceSquared() {
+ return 65536;
+ }
+
+ public void setProtomatterRender(boolean flag) {
+ protomatterRender = flag;
+ worldObj.markBlockForUpdate(xCoord, yCoord, zCoord);
+ }
+
+ public float getSpiralRadius(float normalization) {
+ return Math.min(coreScale / 2.0f * normalization, protoSpiralMaxRadius);
+ }
+
+ public void setCoreSize(float diameter) {
+ coreScaleSnapshot = coreScale;
+ coreScale = diameter;
+ timeSnapshot = this.getWorldObj()
+ .getWorldInfo()
+ .getWorldTotalTime();
+ worldObj.markBlockForUpdate(xCoord, yCoord, zCoord);
+ }
+
+ public void setRotationFields(Rotation rotation, ForgeDirection direction) {
+ switch (rotation) {
+ case NORMAL -> rotationAngle = 0;
+ case CLOCKWISE -> rotationAngle = 90;
+ case COUNTER_CLOCKWISE -> rotationAngle = -90;
+ case UPSIDE_DOWN -> rotationAngle = 180;
+ }
+ rotX = direction.offsetX;
+ rotY = direction.offsetY;
+ rotZ = direction.offsetZ;
+ worldObj.markBlockForUpdate(xCoord, yCoord, zCoord);
+ }
+
+}
diff --git a/src/main/java/goodgenerator/client/ClientProxy.java b/src/main/java/goodgenerator/client/ClientProxy.java
index b8a885cab6..6041962ef7 100644
--- a/src/main/java/goodgenerator/client/ClientProxy.java
+++ b/src/main/java/goodgenerator/client/ClientProxy.java
@@ -3,6 +3,7 @@ package goodgenerator.client;
import cpw.mods.fml.common.event.FMLInitializationEvent;
import cpw.mods.fml.common.event.FMLPostInitializationEvent;
import cpw.mods.fml.common.event.FMLPreInitializationEvent;
+import goodgenerator.client.render.AntimatterRenderer;
import goodgenerator.common.CommonProxy;
public class ClientProxy extends CommonProxy {
@@ -15,10 +16,13 @@ public class ClientProxy extends CommonProxy {
@Override
public void init(FMLInitializationEvent event) {
super.init(event);
+
+ new AntimatterRenderer();
}
@Override
public void postInit(FMLPostInitializationEvent event) {
super.postInit(event);
}
+
}
diff --git a/src/main/java/goodgenerator/client/render/AntimatterRenderer.java b/src/main/java/goodgenerator/client/render/AntimatterRenderer.java
new file mode 100644
index 0000000000..3b988b4491
--- /dev/null
+++ b/src/main/java/goodgenerator/client/render/AntimatterRenderer.java
@@ -0,0 +1,253 @@
+package goodgenerator.client.render;
+
+import static gregtech.api.enums.Mods.GoodGenerator;
+
+import java.nio.FloatBuffer;
+
+import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.util.ResourceLocation;
+import net.minecraftforge.client.model.IModelCustom;
+import net.minecraftforge.client.model.obj.WavefrontObject;
+
+import org.lwjgl.BufferUtils;
+import org.lwjgl.opengl.GL11;
+import org.lwjgl.opengl.GL15;
+import org.lwjgl.opengl.GL20;
+
+import com.gtnewhorizon.gtnhlib.client.renderer.shader.ShaderProgram;
+
+import cpw.mods.fml.client.registry.ClientRegistry;
+import goodgenerator.blocks.tileEntity.render.TileAntimatter;
+
+public class AntimatterRenderer extends TileEntitySpecialRenderer {
+
+ // Antimatter 'Blob'
+ private static ShaderProgram antimatterProgram;
+ private static IModelCustom antimatterModel;
+ private static IModelCustom containerModel;
+ private static final float modelNormalize = .5f;
+
+ private int uColorSpike = -1;
+ private int uColorCore = -1;
+ private int uSpikeMult = -1;
+ private int uScale = -1;
+ private int uScaleSnapshot = -1;
+ private int uTime = -1;
+ private int uTimeSnapshot = -1;
+ private int uOpacity = -1;
+
+ // Protomatter Beam
+ private static final int particleCount = 32;
+ private static ShaderProgram protomatterProgram;
+ private int aBeamVertexID;
+ private int uProtomatterTime = -1;
+ private int uProtomatterScale = -1;
+ private int uProtomatterColor = -1;
+ private int uProtomatterSpiralRadius = -1;
+ private static final int beamVertexCount = particleCount * 6 * 6;
+
+ private boolean initialized = false;
+
+ private static final float[] promomatterVerticies = {
+ // Front Face
+ -0.5f, 0.5f, 0.5f, -0.5f, -0.5f, 0.5f, 0.5f, -0.5f, 0.5f, 0.5f, 0.5f, 0.5f,
+ // Back Face
+ -0.5f, -0.5f, -0.5f, -0.5f, 0.5f, -0.5f, 0.5f, 0.5f, -0.5f, 0.5f, -0.5f, -0.5f,
+ // Left face
+ -0.5f, -0.5f, -0.5f, -0.5f, -0.5f, 0.5f, -0.5f, 0.5f, 0.5f, -0.5f, 0.5f, -0.5f,
+ // Right face
+ 0.5f, -0.5f, -0.5f, 0.5f, 0.5f, -0.5f, 0.5f, 0.5f, 0.5f, 0.5f, -0.5f, 0.5f,
+ // Top face
+ -0.5f, 0.5f, -0.5f, -0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, -0.5f,
+ // Bottom face
+ -0.5f, -0.5f, 0.5f, -0.5f, -0.5f, -0.5f, 0.5f, -0.5f, -0.5f, 0.5f, -0.5f, 0.5f, };
+
+ public AntimatterRenderer() {
+ ClientRegistry.bindTileEntitySpecialRenderer(TileAntimatter.class, this);
+ }
+
+ public void loadModels() {
+ ResourceLocation antimatterLocation = new ResourceLocation(
+ GoodGenerator.resourceDomain,
+ "models/Antimatter.obj");
+ antimatterModel = (IModelCustom) new WavefrontObject(antimatterLocation);
+
+ ResourceLocation location = new ResourceLocation(GoodGenerator.resourceDomain, "models/SmoothSphere.obj");
+ containerModel = (IModelCustom) new WavefrontObject(location);
+ }
+
+ private void init() {
+ antimatterProgram = new ShaderProgram(
+ GoodGenerator.resourceDomain,
+ "shaders/antimatter.vert.glsl",
+ "shaders/antimatter.frag.glsl");
+
+ antimatterProgram.use();
+
+ try {
+ uScale = antimatterProgram.getUniformLocation("u_Scale");
+ uScaleSnapshot = antimatterProgram.getUniformLocation("u_ScaleSnapshot");
+ uTime = antimatterProgram.getUniformLocation("u_Time");
+ uTimeSnapshot = antimatterProgram.getUniformLocation("u_TimeSnapshot");
+ uSpikeMult = antimatterProgram.getUniformLocation("u_SpikeMult");
+ uOpacity = antimatterProgram.getUniformLocation("u_Opacity");
+ uColorCore = antimatterProgram.getUniformLocation("u_ColorCore");
+ uColorSpike = antimatterProgram.getUniformLocation("u_ColorSpike");
+ } catch (NullPointerException e) {
+ System.out.println(e.getMessage());
+ ShaderProgram.clear();
+ return;
+ }
+
+ GL20.glUniform3f(uColorCore, TileAntimatter.coreR, TileAntimatter.coreG, TileAntimatter.coreB);
+ GL20.glUniform3f(uColorSpike, TileAntimatter.spikeR, TileAntimatter.spikeG, TileAntimatter.spikeB);
+ GL20.glUniform1f(uOpacity, 1);
+
+ ShaderProgram.clear();
+
+ loadModels();
+
+ protomatterProgram = new ShaderProgram(
+ GoodGenerator.resourceDomain,
+ "shaders/protomatter.vert.glsl",
+ "shaders/protomatter.frag.glsl");
+
+ int uCubeCount;
+ int uProtomatterVertices;
+ try {
+ uProtomatterVertices = protomatterProgram.getUniformLocation("u_Vertices");
+ uCubeCount = protomatterProgram.getUniformLocation("u_CubeCount");
+ uProtomatterTime = protomatterProgram.getUniformLocation("u_Time");
+ uProtomatterScale = protomatterProgram.getUniformLocation("u_Scale");
+ uProtomatterColor = protomatterProgram.getUniformLocation("u_Color");
+ uProtomatterSpiralRadius = protomatterProgram.getUniformLocation("u_SpiralRadius");
+ } catch (NullPointerException e) {
+ ShaderProgram.clear();
+ return;
+ }
+
+ protomatterProgram.use();
+ FloatBuffer bufferBeamVertexID = BufferUtils.createFloatBuffer(beamVertexCount * 3);
+ for (int i = 0; i < beamVertexCount; i++) {
+ bufferBeamVertexID.put(i * 3, i);
+ }
+
+ aBeamVertexID = GL15.glGenBuffers();
+ GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, aBeamVertexID);
+ GL15.glBufferData(GL15.GL_ARRAY_BUFFER, bufferBeamVertexID, GL15.GL_STATIC_DRAW);
+
+ FloatBuffer bufferBeamVertex = BufferUtils.createFloatBuffer(promomatterVerticies.length);
+ bufferBeamVertex.put(promomatterVerticies)
+ .flip();
+ GL20.glUniform3(uProtomatterVertices, bufferBeamVertex);
+ GL20.glUniform1f(uCubeCount, particleCount);
+ ShaderProgram.clear();
+
+ initialized = true;
+ }
+
+ private void renderAntimatter(TileAntimatter tile, double x, double y, double z, float timer) {
+ antimatterProgram.use();
+
+ GL11.glPushAttrib(GL11.GL_ALL_ATTRIB_BITS);
+ GL11.glDisable(GL11.GL_LIGHTING);
+ GL11.glDisable(GL11.GL_TEXTURE_2D);
+
+ GL11.glPushMatrix();
+ GL11.glTranslated(x, y, z);
+
+ float angle = ((timer) % (20 * 60 * 60)) * tile.rotationSpeedMultiplier;
+
+ GL11.glRotated(angle, 0, 1, 0);
+ GL11.glRotated(angle / 8, 1, 0, 0);
+
+ float snapshotSize = tile.coreScaleSnapshot;
+ snapshotSize *= modelNormalize;
+ float coreSizeSnapshot = Math.min(snapshotSize, TileAntimatter.maximalRadius / (1 + tile.spikeFactor));
+ float targetSize = tile.coreScale;
+ targetSize *= modelNormalize;
+ float coreSize = Math.min(targetSize, TileAntimatter.maximalRadius / (1 + tile.spikeFactor));
+
+ float realTime = timer / 20;
+ float snapTime = tile.timeSnapshot / 20;
+
+ GL20.glUniform1f(uTime, realTime);
+ GL20.glUniform1f(uTimeSnapshot, snapTime);
+ GL20.glUniform1f(uSpikeMult, tile.spikeFactor);
+ GL20.glUniform1f(uScale, coreSize);
+ GL20.glUniform1f(uScaleSnapshot, coreSizeSnapshot);
+ GL11.glDisable(GL11.GL_CULL_FACE);
+
+ antimatterModel.renderAll();
+
+ ShaderProgram.clear();
+
+ GL11.glEnable(GL11.GL_CULL_FACE);
+ GL11.glColor3f(0, 0, 0);
+ GL11.glScalef(
+ -coreSize * (1 + tile.spikeFactor),
+ -coreSize * (1 + tile.spikeFactor),
+ -coreSize * (1 + tile.spikeFactor));
+ containerModel.renderAll();
+
+ GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
+ GL11.glPopMatrix();
+ GL11.glPopAttrib();
+ }
+
+ private void renderProtomatterBeam(TileAntimatter tile, double x, double y, double z, float timer) {
+ protomatterProgram.use();
+ GL11.glPushMatrix();
+ GL11.glEnableClientState(GL11.GL_VERTEX_ARRAY);
+ GL20.glEnableVertexAttribArray(aBeamVertexID);
+
+ GL20.glUniform1f(uProtomatterTime, timer);
+ GL20.glUniform1f(uProtomatterScale, tile.protomatterScale);
+ GL20.glUniform3f(uProtomatterColor, TileAntimatter.protoR, TileAntimatter.protoG, TileAntimatter.protoB);
+ GL20.glUniform1f(uProtomatterSpiralRadius, tile.getSpiralRadius(modelNormalize));
+
+ GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, aBeamVertexID);
+ GL20.glVertexAttribPointer(0, 1, GL11.GL_FLOAT, false, 3 * Float.BYTES, 2 * Float.BYTES);
+ GL11.glVertexPointer(3, GL11.GL_FLOAT, 0, 0);
+
+ GL11.glTranslated(x, y, z);
+ GL11.glRotatef(tile.rotationAngle, tile.rotX, tile.rotY, tile.rotZ);
+
+ GL11.glDrawArrays(GL11.GL_TRIANGLES, 0, beamVertexCount);
+
+ GL11.glDisableClientState(GL11.GL_VERTEX_ARRAY);
+ GL20.glDisableVertexAttribArray(aBeamVertexID);
+
+ GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
+ ShaderProgram.clear();
+ GL11.glPopMatrix();
+
+ }
+
+ @Override
+ public void renderTileEntityAt(TileEntity tile, double x, double y, double z, float timeSinceLastTick) {
+
+ if (!(tile instanceof TileAntimatter Antimatter)) return;
+
+ if (!Antimatter.shouldRender) return;
+
+ if (!initialized) {
+ init();
+ if (!initialized) {
+ return;
+ }
+ }
+ float tx = (float) x + 0.5f;
+ float ty = (float) y + 0.5f;
+ float tz = (float) z + 0.5f;
+
+ float timer = tile.getWorldObj()
+ .getWorldInfo()
+ .getWorldTotalTime() + timeSinceLastTick;
+ renderAntimatter(Antimatter, tx, ty, tz, timer);
+
+ if (!Antimatter.protomatterRender) return;
+ renderProtomatterBeam(Antimatter, tx, ty, tz, timer);
+ }
+}
diff --git a/src/main/java/goodgenerator/common/CommonProxy.java b/src/main/java/goodgenerator/common/CommonProxy.java
index 05bf053bb7..59e60546fc 100644
--- a/src/main/java/goodgenerator/common/CommonProxy.java
+++ b/src/main/java/goodgenerator/common/CommonProxy.java
@@ -11,4 +11,5 @@ public class CommonProxy {
public void init(FMLInitializationEvent event) {}
public void postInit(FMLPostInitializationEvent event) {}
+
}
diff --git a/src/main/java/goodgenerator/loader/IDs_GoodGenerator.java b/src/main/java/goodgenerator/loader/IDs_GoodGenerator.java
new file mode 100644
index 0000000000..406a9548b1
--- /dev/null
+++ b/src/main/java/goodgenerator/loader/IDs_GoodGenerator.java
@@ -0,0 +1,49 @@
+package goodgenerator.loader;
+
+public enum IDs_GoodGenerator {
+
+ DieselGeneratorEV(1113),
+ DieselGeneratorIV(1114),
+ MultiNqGenerator(12732),
+ FuelRefineFactory(16999),
+ PipeIncoloy903(30995),
+ UniversalChemicalFuelEngine(32001),
+ LargeEssentiaGenerator(32002),
+ NeutronAcceleratorULV(32003),
+ NeutronAcceleratorLV(32004),
+ NeutronAcceleratorMV(32005),
+ NeutronAcceleratorHV(32006),
+ NeutronAcceleratorEV(32007),
+ NeutronAcceleratorIV(32008),
+ NeutronAcceleratorLuV(32009),
+ NeutronAcceleratorZPM(32010),
+ NeutronAcceleratorUV(32011),
+ NeutronSensor(32012),
+ NeutronActivator(32013),
+ YottaFluidTank(32014),
+ YottaHatch(32015),
+ SupercriticalFluidTurbine(32016),
+ ExtremeHeatExchanger(32017),
+ PreciseAssembler(32018),
+ LargeFusionComputer1(32019),
+ LargeFusionComputer2(32020),
+ LargeFusionComputer3(32021),
+ LargeFusionComputer4(32022),
+ LargeFusionComputer5(32023),
+ LargeEssentiaSmeltery(32024),
+ CoolantTower(32025),
+ ComponentAssemblyLine(32026),
+ AntimatterForge(32027),
+ AntimatterGenerator(32028),
+ AntimatterHatch(32029),
+ WireSignalium(32749),
+ WireLumiium(32737),
+
+ ;
+
+ public final int ID;
+
+ IDs_GoodGenerator(int ID) {
+ this.ID = ID;
+ }
+}
diff --git a/src/main/java/goodgenerator/loader/Loaders.java b/src/main/java/goodgenerator/loader/Loaders.java
index 3603537427..e3648b855d 100644
--- a/src/main/java/goodgenerator/loader/Loaders.java
+++ b/src/main/java/goodgenerator/loader/Loaders.java
@@ -10,11 +10,15 @@ import net.minecraftforge.oredict.OreDictionary;
import cpw.mods.fml.common.FMLCommonHandler;
import cpw.mods.fml.common.registry.GameRegistry;
import goodgenerator.blocks.myFluids.FluidsBuilder;
+import goodgenerator.blocks.regularBlock.AntimatterRenderBlock;
import goodgenerator.blocks.regularBlock.BlockCasing;
import goodgenerator.blocks.regularBlock.BlockComplexTextureCasing;
import goodgenerator.blocks.regularBlock.BlockFrame;
import goodgenerator.blocks.regularBlock.BlockTEContainer;
import goodgenerator.blocks.regularBlock.BlockTurbineCasing;
+import goodgenerator.blocks.tileEntity.AntimatterForge;
+import goodgenerator.blocks.tileEntity.AntimatterGenerator;
+import goodgenerator.blocks.tileEntity.AntimatterOutputHatch;
import goodgenerator.blocks.tileEntity.GTMetaTileEntity.MTEDieselGenerator;
import goodgenerator.blocks.tileEntity.GTMetaTileEntity.MTENeutronAccelerator;
import goodgenerator.blocks.tileEntity.GTMetaTileEntity.MTENeutronSensor;
@@ -39,6 +43,7 @@ import goodgenerator.blocks.tileEntity.MTEPreciseAssembler;
import goodgenerator.blocks.tileEntity.MTESupercriticalFluidTurbine;
import goodgenerator.blocks.tileEntity.MTEUniversalChemicalFuelEngine;
import goodgenerator.blocks.tileEntity.MTEYottaFluidTank;
+import goodgenerator.blocks.tileEntity.render.TileAntimatter;
import goodgenerator.client.render.BlockRenderHandler;
import goodgenerator.crossmod.ic2.CropsLoader;
import goodgenerator.crossmod.nei.NEIConfig;
@@ -222,6 +227,22 @@ public class Loaders {
new String[] { GoodGenerator.MOD_ID + ":fuison/1", GoodGenerator.MOD_ID + ":fuison/2",
GoodGenerator.MOD_ID + ":fuison/3", GoodGenerator.MOD_ID + ":fuison/4",
GoodGenerator.MOD_ID + ":fuison/5" });
+ public static final Block antimatterContainmentCasing = new BlockFrame(
+ "antimatterContainmentCasing",
+ new String[] { GoodGenerator.MOD_ID + ":antimatterContainmentCasing" });
+ public static final Block magneticFluxCasing = new BlockCasing(
+ "magneticFluxCasing",
+ new String[] { GoodGenerator.MOD_ID + ":magneticFluxCasing" });
+ public static final Block gravityStabilizationCasing = new BlockCasing(
+ "gravityStabilizationCasing",
+ new String[] { GoodGenerator.MOD_ID + ":gravityStabilizationCasing" });
+ public static final Block protomatterActivationCoil = new BlockCasing(
+ "protomatterActivationCoil",
+ new String[] { GoodGenerator.MOD_ID + ":protomatterActivationCoil" });
+ public static final Block antimatterAnnihilationMatrix = new BlockCasing(
+ "antimatterAnnihilationMatrix",
+ new String[] { GoodGenerator.MOD_ID + ":antimatterAnnihilationMatrix" });
+ public static final Block antimatterRenderBlock = new AntimatterRenderBlock();
public static final Block essentiaFilterCasing = new BlockCasing(
"essentiaFilterCasing",
new String[] { GoodGenerator.MOD_ID + ":essentiaFilterCasing" });
@@ -264,6 +285,9 @@ public class Loaders {
public static ItemStack[] Generator_Diesel = new ItemStack[2];
public static ItemStack CompAssline;
+ public static ItemStack AMForge;
+ public static ItemStack AMGenerator;
+ public static ItemStack AMHatch;
// public static Item Isotope = new NuclearMetaItemGenerator();
public static void GTMetaTileRegister() {
@@ -297,8 +321,12 @@ public class Loaders {
.getStackForm(1L);
Loaders.YFH = new MTEYOTTAHatch(MetaTileEntityIDs.YottaHatch.ID, "YottaFluidTankHatch", "YOTHatch", 5)
.getStackForm(1L);
+ Loaders.AMHatch = new AntimatterOutputHatch(
+ IDs_GoodGenerator.AntimatterHatch.ID,
+ "AntimatterHatch",
+ "Antimatter Hatch").getStackForm(1L);
Loaders.SCTurbine = new MTESupercriticalFluidTurbine(
- MetaTileEntityIDs.SupercriticalFluidTurbine.ID,
+ IDs_GoodGenerator.SupercriticalFluidTurbine.ID,
"SupercriticalSteamTurbine",
"Large Supercritical Steam Turbine").getStackForm(1L);
Loaders.XHE = new MTEExtremeHeatExchanger(
@@ -348,6 +376,14 @@ public class Loaders {
CrackRecipeAdder.registerPipe(MetaTileEntityIDs.PipeIncoloy903.ID, GGMaterial.incoloy903, 15000, 8000, true);
CrackRecipeAdder.registerWire(MetaTileEntityIDs.WireSignalium.ID, GGMaterial.signalium, 12, 131072, 16, true);
CrackRecipeAdder.registerWire(MetaTileEntityIDs.WireLumiium.ID, GGMaterial.lumiium, 8, 524288, 64, true);
+ Loaders.AMForge = new AntimatterForge(
+ IDs_GoodGenerator.AntimatterForge.ID,
+ "AntimatterForge",
+ "Semi-Stable Antimatter Stabilization Sequencer").getStackForm(1L);
+ Loaders.AMGenerator = new AntimatterGenerator(
+ IDs_GoodGenerator.AntimatterGenerator.ID,
+ "AntimatterGenerator",
+ "Shielded Lagrangian Annihilation Matrix").getStackForm(1L);
}
public static void Register() {
@@ -375,6 +411,12 @@ public class Loaders {
GameRegistry.registerBlock(impreciseUnitCasing, GGItemBlocks.class, "impreciseUnitCasing");
GameRegistry.registerBlock(preciseUnitCasing, GGItemBlocks.class, "preciseUnitCasing");
GameRegistry.registerBlock(compactFusionCoil, GGItemBlocks.class, "compactFusionCoil");
+ GameRegistry.registerBlock(antimatterContainmentCasing, GGItemBlocks.class, "antimatterContainmentCasing");
+ GameRegistry.registerBlock(magneticFluxCasing, GGItemBlocks.class, "magneticFluxCasing");
+ GameRegistry.registerBlock(protomatterActivationCoil, GGItemBlocks.class, "protomatterActivationCoil");
+ GameRegistry.registerBlock(antimatterAnnihilationMatrix, GGItemBlocks.class, "antimatterAnnihilationMatrix");
+ GameRegistry.registerBlock(gravityStabilizationCasing, GGItemBlocks.class, "gravityStabilizationCasing");
+ GameRegistry.registerBlock(antimatterRenderBlock, "antimatterRenderBlock");
GameRegistry.registerItem(radiationProtectionPlate, "radiationProtectionPlate", GoodGenerator.MOD_ID);
GameRegistry.registerItem(wrappedUraniumIngot, "wrappedUraniumIngot", GoodGenerator.MOD_ID);
GameRegistry.registerItem(highDensityUraniumNugget, "highDensityUraniumNugget", GoodGenerator.MOD_ID);
@@ -407,6 +449,7 @@ public class Loaders {
GameRegistry.registerItem(saltyRoot, "saltyRoot", GoodGenerator.MOD_ID);
GameRegistry.registerItem(huiCircuit, "huiCircuit", GoodGenerator.MOD_ID);
GameRegistry.registerItem(circuitWrap, "circuitWrap", GoodGenerator.MOD_ID);
+ GameRegistry.registerTileEntity(TileAntimatter.class, "AntimatterRender");
}
public static void compactMod() {
@@ -469,6 +512,10 @@ public class Loaders {
.of(preciseUnitCasing, 2);
Textures.BlockIcons.casingTexturePages[GoodGeneratorTexturePage][8] = TextureFactory
.of(preciseUnitCasing, 3);
+ Textures.BlockIcons.casingTexturePages[GoodGeneratorTexturePage][9] = TextureFactory
+ .of(magneticFluxCasing, 0);
+ Textures.BlockIcons.casingTexturePages[GoodGeneratorTexturePage][10] = TextureFactory
+ .of(gravityStabilizationCasing, 0);
}
}
diff --git a/src/main/java/gregtech/api/enums/ItemList.java b/src/main/java/gregtech/api/enums/ItemList.java
index 34df98fc55..8bd9027a23 100644
--- a/src/main/java/gregtech/api/enums/ItemList.java
+++ b/src/main/java/gregtech/api/enums/ItemList.java
@@ -1481,6 +1481,8 @@ public enum ItemList implements IItemContainer {
Electromagnet_Samarium,
Electromagnet_Tengam,
+ Hatch_Antimatter,
+
Machine_Multi_Canner,
Machine_Multi_Solidifier,
diff --git a/src/main/java/gregtech/api/enums/Materials.java b/src/main/java/gregtech/api/enums/Materials.java
index 5aa02b8094..9ad86df256 100644
--- a/src/main/java/gregtech/api/enums/Materials.java
+++ b/src/main/java/gregtech/api/enums/Materials.java
@@ -420,6 +420,7 @@ public class Materials implements IColorModulationContainer, ISubTagContainer {
* Not possible to determine exact Components
*/
public static Materials Antimatter;
+ public static Materials Protomatter;
public static Materials AdvancedGlue;
public static Materials BioFuel;
public static Materials Biomass;
diff --git a/src/main/java/gregtech/api/enums/MaterialsUEVplus.java b/src/main/java/gregtech/api/enums/MaterialsUEVplus.java
index d13fe68a47..1fc32cd413 100644
--- a/src/main/java/gregtech/api/enums/MaterialsUEVplus.java
+++ b/src/main/java/gregtech/api/enums/MaterialsUEVplus.java
@@ -840,6 +840,54 @@ public class MaterialsUEVplus {
.disableAutoGeneratedVacuumFreezerRecipe()
.disableAutoGeneratedBlastFurnaceRecipes();
+ public static Materials Antimatter = new Materials(
+ 158,
+ TextureSet.SET_FLUID,
+ 1.0F,
+ 0,
+ 2,
+ 16,
+ 255,
+ 255,
+ 255,
+ 0,
+ "Antimatter",
+ "Semi-Stable Antimatter",
+ -1,
+ -1,
+ 0,
+ 1,
+ false,
+ true,
+ 1,
+ 1,
+ 1,
+ Dyes._NULL);
+
+ public static Materials Protomatter = new Materials(
+ 159,
+ TextureSet.SET_FLUID,
+ 1.0F,
+ 0,
+ 2,
+ 16,
+ 255,
+ 255,
+ 255,
+ 0,
+ "Protomatter",
+ "Protomatter",
+ -1,
+ -1,
+ 0,
+ 1,
+ false,
+ true,
+ 1,
+ 1,
+ 1,
+ Dyes._NULL);
+
/**
* called by Materials. Can be safely called multiple times. exists to allow Materials ensure this class is
* initialized
diff --git a/src/main/java/gregtech/api/enums/MetaTileEntityIDs.java b/src/main/java/gregtech/api/enums/MetaTileEntityIDs.java
index 12ecb96155..721cb36457 100644
--- a/src/main/java/gregtech/api/enums/MetaTileEntityIDs.java
+++ b/src/main/java/gregtech/api/enums/MetaTileEntityIDs.java
@@ -1914,6 +1914,7 @@ public enum MetaTileEntityIDs {
LargeEssentiaSmeltery(32024),
CoolantTower(32025),
ComponentAssemblyLine(32026),
+ AntimatterForge(32027),
WireLumiium(32737),
WireSignalium(32749),;
diff --git a/src/main/java/gregtech/api/enums/Textures.java b/src/main/java/gregtech/api/enums/Textures.java
index 4eace204e6..39dc57af41 100644
--- a/src/main/java/gregtech/api/enums/Textures.java
+++ b/src/main/java/gregtech/api/enums/Textures.java
@@ -278,6 +278,8 @@ public class Textures {
MACHINE_CASING_FUSION_GLASS_YELLOW_GLOW,
MACHINE_CASING_FUSION_2,
+ MACHINE_CASING_ANTIMATTER,
+ MACHINE_CASING_ANTIMATTER_GLOW,
MACHINE_CASING_MAGIC,
MACHINE_CASING_MAGIC_GLOW,
diff --git a/src/main/java/gregtech/loaders/preload/LoaderGTBlockFluid.java b/src/main/java/gregtech/loaders/preload/LoaderGTBlockFluid.java
index 42110f68f1..f46256e2c5 100644
--- a/src/main/java/gregtech/loaders/preload/LoaderGTBlockFluid.java
+++ b/src/main/java/gregtech/loaders/preload/LoaderGTBlockFluid.java
@@ -1297,6 +1297,24 @@ public class LoaderGTBlockFluid implements Runnable {
GTOreDictUnificator.get(OrePrefixes.cell, MaterialsUEVplus.PhononCrystalSolution, 1L),
ItemList.Cell_Empty.get(1L));
+ GTFluidFactory.builder("antimatter")
+ .withLocalizedName(MaterialsUEVplus.Antimatter.mLocalizedName)
+ .withStateAndTemperature(LIQUID, -1)
+ .buildAndRegister()
+ .configureMaterials(MaterialsUEVplus.Antimatter)
+ .registerBContainers(
+ GTOreDictUnificator.get(OrePrefixes.cell, MaterialsUEVplus.Antimatter, 1L),
+ ItemList.Cell_Empty.get(1L));
+
+ GTFluidFactory.builder("protomatter")
+ .withLocalizedName(MaterialsUEVplus.Protomatter.mLocalizedName)
+ .withStateAndTemperature(LIQUID, 1)
+ .buildAndRegister()
+ .configureMaterials(MaterialsUEVplus.Protomatter)
+ .registerBContainers(
+ GTOreDictUnificator.get(OrePrefixes.cell, MaterialsUEVplus.Protomatter, 1L),
+ ItemList.Cell_Empty.get(1L));
+
GTFluidFactory.builder("fieryblood")
.withLocalizedName("Fiery Blood")
.withStateAndTemperature(LIQUID, 6400)
diff --git a/src/main/resources/assets/goodgenerator/lang/en_US.lang b/src/main/resources/assets/goodgenerator/lang/en_US.lang
index 37b246a018..253cc99a7e 100644
--- a/src/main/resources/assets/goodgenerator/lang/en_US.lang
+++ b/src/main/resources/assets/goodgenerator/lang/en_US.lang
@@ -58,6 +58,11 @@ componentAssemblyLineCasing.10.name=Component Assembly Line Casing (UIV)
componentAssemblyLineCasing.11.name=Component Assembly Line Casing (UMV)
componentAssemblyLineCasing.12.name=Component Assembly Line Casing (UXV)
componentAssemblyLineCasing.13.name=Component Assembly Line Casing (MAX)
+magneticFluxCasing.0.name=Magnetic Flux Casing
+gravityStabilizationCasing.0.name=Gravity Stabilization Casing
+antimatterContainmentCasing.0.name=Antimatter Containment Casing
+protomatterActivationCoil.0.name=Protomatter Activation Coil
+antimatterAnnihilationMatrix.0.name=Antimatter Annihilation Matrix
#Items
item.radiationProtectionPlate.name=Radiation Proof Plate
@@ -313,6 +318,12 @@ gui.YOTTank.button.void=Void Excess
gui.YOTTank.button.locking=Fluid locking
gui.LargeFusion.0=Energy Capacity:
gui.LargeFusion.1=Stored Energy:
+gui.AntimatterForge.0=Contained Antimatter
+gui.AntimatterForge.1=Passive Consumption
+gui.AntimatterForge.2=Active Consumption
+gui.AntimatterForge.3=Antimatter Change
+gui.AntimatterGenerator.0=EU Produced
+gui.AntimatterGenerator.1=Efficiency
gt.blockmachines.LargeFusionComputerPP.cfgi.0=Batch Size
gt.blockmachines.YottaFluidTank.cfgi.0=Tick rate (Update I/O every x ticks)
diff --git a/src/main/resources/assets/goodgenerator/models/Antimatter.obj b/src/main/resources/assets/goodgenerator/models/Antimatter.obj
new file mode 100644
index 0000000000..91c63c8fcf
--- /dev/null
+++ b/src/main/resources/assets/goodgenerator/models/Antimatter.obj
@@ -0,0 +1,270 @@
+# Blender 4.2.0
+# www.blender.org
+mtllib Antimatter.mtl
+o Icosphere
+v 0.000000 -2.000000 0.000000
+v 1.447215 -0.894439 1.051451
+v -0.552776 -0.894440 1.701298
+v -1.788852 -0.894431 0.000000
+v -0.552776 -0.894440 -1.701298
+v 1.447215 -0.894439 -1.051451
+v 0.552776 0.894440 1.701298
+v -1.447215 0.894439 1.051451
+v -1.447215 0.894439 -1.051451
+v 0.552776 0.894440 -1.701298
+v 1.788852 0.894431 0.000000
+v 0.000000 2.000000 0.000000
+v -0.162456 -0.850654 0.499995
+v 0.425323 -0.850654 0.309011
+v 0.262869 -0.525738 0.809012
+v 0.850648 -0.525736 0.000000
+v 0.425323 -0.850654 -0.309011
+v -0.525730 -0.850652 0.000000
+v -0.688189 -0.525736 0.499997
+v -0.162456 -0.850654 -0.499995
+v -0.688189 -0.525736 -0.499997
+v 0.262869 -0.525738 -0.809012
+v 0.951058 0.000000 0.309013
+v 0.951058 0.000000 -0.309013
+v 0.000000 0.000000 1.000000
+v 0.587786 0.000000 0.809017
+v -0.951058 0.000000 0.309013
+v -0.587786 0.000000 0.809017
+v -0.587786 0.000000 -0.809017
+v -0.951058 0.000000 -0.309013
+v 0.587786 0.000000 -0.809017
+v 0.000000 0.000000 -1.000000
+v 0.688189 0.525736 0.499997
+v -0.262869 0.525738 0.809012
+v -0.850648 0.525736 0.000000
+v -0.262869 0.525738 -0.809012
+v 0.688189 0.525736 -0.499997
+v 0.162456 0.850654 0.499995
+v 0.525730 0.850652 0.000000
+v -0.425323 0.850654 0.309011
+v -0.425323 0.850654 -0.309011
+v 0.162456 0.850654 -0.499995
+vn 0.2898 -0.3471 0.8919
+vn 0.3006 -0.8338 -0.4630
+vn -0.7587 -0.3471 0.5513
+vn -0.7587 -0.3471 -0.5513
+vn 0.2898 -0.3471 -0.8919
+vn 0.8803 0.1040 -0.4630
+vn 0.7123 0.1040 0.6941
+vn -0.4400 0.1040 0.8919
+vn -0.9843 0.1040 -0.1429
+vn -0.1683 0.1040 -0.9802
+vn 0.5905 0.6836 0.4290
+vn -0.2255 0.6836 0.6941
+vn -0.7298 0.6836 -0.0000
+vn -0.2255 0.6836 -0.6941
+vn 0.5905 0.6836 -0.4290
+vn 0.5153 0.8338 -0.1978
+vn 0.3474 0.8338 0.4290
+vn -0.3006 0.8338 0.4630
+vn -0.5332 0.8338 -0.1429
+vn -0.0289 0.8338 -0.5512
+vn 0.7587 0.3471 -0.5513
+vn 0.4911 0.7947 -0.3568
+vn 0.5153 0.8338 0.1978
+vn -0.2898 0.3471 -0.8919
+vn -0.1876 0.7947 -0.5773
+vn 0.3474 0.8338 -0.4290
+vn -0.9378 0.3471 -0.0000
+vn -0.6071 0.7947 -0.0000
+vn -0.3006 0.8338 -0.4630
+vn -0.2898 0.3471 0.8919
+vn -0.1876 0.7947 0.5773
+vn -0.5332 0.8338 0.1429
+vn 0.7587 0.3471 0.5513
+vn 0.4911 0.7947 0.3568
+vn -0.0289 0.8338 0.5512
+vn 0.4400 -0.1040 -0.8919
+vn 0.7947 0.1876 -0.5773
+vn 0.9843 -0.1040 -0.1429
+vn -0.7123 -0.1040 -0.6941
+vn -0.3035 0.1876 -0.9342
+vn 0.1683 -0.1040 -0.9802
+vn -0.8803 -0.1040 0.4630
+vn -0.9822 0.1876 -0.0000
+vn -0.8803 -0.1040 -0.4630
+vn 0.1683 -0.1040 0.9802
+vn -0.3035 0.1876 0.9342
+vn -0.7123 -0.1040 0.6941
+vn 0.9843 -0.1040 0.1429
+vn 0.7947 0.1876 0.5773
+vn 0.4400 -0.1040 0.8919
+vn 0.2255 -0.6836 -0.6941
+vn 0.3035 -0.1876 -0.9342
+vn 0.7123 0.1040 -0.6941
+vn -0.5905 -0.6836 -0.4290
+vn -0.7947 -0.1876 -0.5773
+vn -0.4400 0.1040 -0.8919
+vn -0.5905 -0.6836 0.4290
+vn -0.7947 -0.1876 0.5773
+vn -0.9843 0.1040 0.1429
+vn 0.2255 -0.6836 0.6941
+vn 0.3035 -0.1876 0.9342
+vn -0.1683 0.1040 0.9802
+vn 0.7298 -0.6836 -0.0000
+vn 0.9822 -0.1876 -0.0000
+vn 0.8803 0.1040 0.4630
+vn -0.3474 -0.8338 -0.4290
+vn 0.1876 -0.7947 -0.5773
+vn 0.5332 -0.8338 -0.1429
+vn -0.5153 -0.8338 0.1978
+vn -0.4911 -0.7947 -0.3568
+vn 0.0289 -0.8338 -0.5512
+vn 0.0289 -0.8338 0.5512
+vn -0.4911 -0.7947 0.3568
+vn -0.5153 -0.8338 -0.1978
+vn 0.3006 -0.8338 0.4630
+vn 0.6071 -0.7947 -0.0000
+vn 0.9378 -0.3471 -0.0000
+vn 0.5332 -0.8338 0.1429
+vn 0.1876 -0.7947 0.5773
+vn -0.3474 -0.8338 0.4290
+vt 0.181819 0.000000
+vt 0.227273 0.078731
+vt 0.136365 0.078731
+vt 0.272728 0.157461
+vt 0.318182 0.078731
+vt 0.363637 0.157461
+vt 0.909091 0.000000
+vt 0.954545 0.078731
+vt 0.863636 0.078731
+vt 0.727273 0.000000
+vt 0.772727 0.078731
+vt 0.681818 0.078731
+vt 0.545455 0.000000
+vt 0.590909 0.078731
+vt 0.500000 0.078731
+vt 0.318182 0.236191
+vt 0.090910 0.157461
+vt 0.181819 0.157461
+vt 0.136365 0.236191
+vt 0.818182 0.157461
+vt 0.909091 0.157461
+vt 0.863636 0.236191
+vt 0.636364 0.157461
+vt 0.727273 0.157461
+vt 0.681818 0.236191
+vt 0.454546 0.157461
+vt 0.545455 0.157461
+vt 0.500000 0.236191
+vt 0.227273 0.236191
+vt 0.045455 0.236191
+vt 0.772727 0.236191
+vt 0.590909 0.236191
+vt 0.409092 0.236191
+vt 0.181819 0.314921
+vt 0.272728 0.314921
+vt 0.227273 0.393651
+vt 0.000000 0.314921
+vt 0.090910 0.314921
+vt 0.045455 0.393651
+vt 0.727273 0.314921
+vt 0.818182 0.314921
+vt 0.772727 0.393651
+vt 0.545455 0.314921
+vt 0.636364 0.314921
+vt 0.590909 0.393651
+vt 0.363637 0.314921
+vt 0.454546 0.314921
+vt 0.409092 0.393651
+vt 0.500000 0.393651
+vt 0.454546 0.472382
+vt 0.681818 0.393651
+vt 0.636364 0.472382
+vt 0.863636 0.393651
+vt 0.818182 0.472382
+vt 0.909091 0.314921
+vt 0.136365 0.393651
+vt 0.090910 0.472382
+vt 0.318182 0.393651
+vt 0.272728 0.472382
+vt 0.954545 0.236191
+vt 1.000000 0.157461
+vt 0.409092 0.078731
+vt 0.363637 0.000000
+s 0
+f 1/1/1 14/2/1 13/3/1
+f 2/4/2 14/5/2 16/6/2
+f 1/7/3 13/8/3 18/9/3
+f 1/10/4 18/11/4 20/12/4
+f 1/13/5 20/14/5 17/15/5
+f 2/4/6 16/6/6 23/16/6
+f 3/17/7 15/18/7 25/19/7
+f 4/20/8 19/21/8 27/22/8
+f 5/23/9 21/24/9 29/25/9
+f 6/26/10 22/27/10 31/28/10
+f 2/4/11 23/16/11 26/29/11
+f 3/17/12 25/19/12 28/30/12
+f 4/20/13 27/22/13 30/31/13
+f 5/23/14 29/25/14 32/32/14
+f 6/26/15 31/28/15 24/33/15
+f 7/34/16 33/35/16 38/36/16
+f 8/37/17 34/38/17 40/39/17
+f 9/40/18 35/41/18 41/42/18
+f 10/43/19 36/44/19 42/45/19
+f 11/46/20 37/47/20 39/48/20
+f 39/48/21 42/49/21 12/50/21
+f 39/48/22 37/47/22 42/49/22
+f 37/47/23 10/43/23 42/49/23
+f 42/45/24 41/51/24 12/52/24
+f 42/45/25 36/44/25 41/51/25
+f 36/44/26 9/40/26 41/51/26
+f 41/42/27 40/53/27 12/54/27
+f 41/42/28 35/41/28 40/53/28
+f 35/41/29 8/55/29 40/53/29
+f 40/39/30 38/56/30 12/57/30
+f 40/39/31 34/38/31 38/56/31
+f 34/38/32 7/34/32 38/56/32
+f 38/36/33 39/58/33 12/59/33
+f 38/36/34 33/35/34 39/58/34
+f 33/35/35 11/46/35 39/58/35
+f 24/33/36 37/47/36 11/46/36
+f 24/33/37 31/28/37 37/47/37
+f 31/28/38 10/43/38 37/47/38
+f 32/32/39 36/44/39 10/43/39
+f 32/32/40 29/25/40 36/44/40
+f 29/25/41 9/40/41 36/44/41
+f 30/31/42 35/41/42 9/40/42
+f 30/31/43 27/22/43 35/41/43
+f 27/22/44 8/55/44 35/41/44
+f 28/30/45 34/38/45 8/37/45
+f 28/30/46 25/19/46 34/38/46
+f 25/19/47 7/34/47 34/38/47
+f 26/29/48 33/35/48 7/34/48
+f 26/29/49 23/16/49 33/35/49
+f 23/16/50 11/46/50 33/35/50
+f 31/28/51 32/32/51 10/43/51
+f 31/28/52 22/27/52 32/32/52
+f 22/27/53 5/23/53 32/32/53
+f 29/25/54 30/31/54 9/40/54
+f 29/25/55 21/24/55 30/31/55
+f 21/24/56 4/20/56 30/31/56
+f 27/22/57 28/60/57 8/55/57
+f 27/22/58 19/21/58 28/60/58
+f 19/21/59 3/61/59 28/60/59
+f 25/19/60 26/29/60 7/34/60
+f 25/19/61 15/18/61 26/29/61
+f 15/18/62 2/4/62 26/29/62
+f 23/16/63 24/33/63 11/46/63
+f 23/16/64 16/6/64 24/33/64
+f 16/6/65 6/26/65 24/33/65
+f 17/15/66 22/27/66 6/26/66
+f 17/15/67 20/14/67 22/27/67
+f 20/14/68 5/23/68 22/27/68
+f 20/12/69 21/24/69 5/23/69
+f 20/12/70 18/11/70 21/24/70
+f 18/11/71 4/20/71 21/24/71
+f 18/9/72 19/21/72 4/20/72
+f 18/9/73 13/8/73 19/21/73
+f 13/8/74 3/61/74 19/21/74
+f 16/6/75 17/62/75 6/26/75
+f 16/6/76 14/5/76 17/62/76
+f 14/5/77 1/63/77 17/62/77
+f 13/3/78 15/18/78 3/17/78
+f 13/3/79 14/2/79 15/18/79
+f 14/2/80 2/4/80 15/18/80
diff --git a/src/main/resources/assets/goodgenerator/models/SmoothSphere.obj b/src/main/resources/assets/goodgenerator/models/SmoothSphere.obj
new file mode 100644
index 0000000000..078c23324f
--- /dev/null
+++ b/src/main/resources/assets/goodgenerator/models/SmoothSphere.obj
@@ -0,0 +1,2487 @@
+# Blender 4.2.0
+# www.blender.org
+o Sphere
+v 0.000000 0.831470 -0.555570
+v 0.000000 0.555570 -0.831470
+v 0.000000 0.195090 -0.980785
+v 0.000000 0.000000 -1.000000
+v 0.000000 -0.195090 -0.980785
+v 0.000000 -0.555570 -0.831470
+v 0.038060 0.980785 -0.191342
+v 0.074658 0.923880 -0.375330
+v 0.108386 0.831470 -0.544895
+v 0.137950 0.707107 -0.693520
+v 0.162212 0.555570 -0.815493
+v 0.180240 0.382683 -0.906127
+v 0.191342 0.195090 -0.961940
+v 0.195090 0.000000 -0.980785
+v 0.191342 -0.195090 -0.961940
+v 0.180240 -0.382683 -0.906127
+v 0.162212 -0.555570 -0.815493
+v 0.137950 -0.707107 -0.693520
+v 0.108386 -0.831470 -0.544895
+v 0.074658 -0.923880 -0.375330
+v 0.038060 -0.980785 -0.191342
+v 0.074658 0.980785 -0.180240
+v 0.146447 0.923880 -0.353553
+v 0.212608 0.831470 -0.513280
+v 0.270598 0.707107 -0.653281
+v 0.318190 0.555570 -0.768178
+v 0.353553 0.382683 -0.853553
+v 0.375330 0.195090 -0.906127
+v 0.382683 0.000000 -0.923879
+v 0.375330 -0.195090 -0.906127
+v 0.353553 -0.382683 -0.853553
+v 0.318190 -0.555570 -0.768178
+v 0.270598 -0.707107 -0.653281
+v 0.212608 -0.831470 -0.513280
+v 0.146447 -0.923880 -0.353553
+v 0.074658 -0.980785 -0.180240
+v 0.108386 0.980785 -0.162212
+v 0.212608 0.923880 -0.318190
+v 0.308658 0.831470 -0.461940
+v 0.392847 0.707107 -0.587938
+v 0.461940 0.555570 -0.691342
+v 0.513280 0.382683 -0.768178
+v 0.544895 0.195090 -0.815493
+v 0.555570 0.000000 -0.831469
+v 0.544895 -0.195090 -0.815493
+v 0.513280 -0.382683 -0.768178
+v 0.461940 -0.555570 -0.691342
+v 0.392847 -0.707107 -0.587938
+v 0.308658 -0.831470 -0.461940
+v 0.212608 -0.923880 -0.318190
+v 0.108386 -0.980785 -0.162212
+v 0.137950 0.980785 -0.137950
+v 0.270598 0.923880 -0.270598
+v 0.392847 0.831470 -0.392847
+v 0.500000 0.707107 -0.500000
+v 0.587938 0.555570 -0.587938
+v 0.653281 0.382683 -0.653281
+v 0.693520 0.195090 -0.693520
+v 0.707107 0.000000 -0.707107
+v 0.693520 -0.195090 -0.693520
+v 0.653281 -0.382683 -0.653281
+v 0.587938 -0.555570 -0.587938
+v 0.500000 -0.707107 -0.500000
+v 0.392847 -0.831470 -0.392847
+v 0.270598 -0.923880 -0.270598
+v 0.137950 -0.980785 -0.137950
+v 0.162212 0.980785 -0.108386
+v 0.318190 0.923880 -0.212608
+v 0.461940 0.831470 -0.308658
+v 0.587938 0.707107 -0.392847
+v 0.691342 0.555570 -0.461940
+v 0.768178 0.382683 -0.513280
+v 0.815493 0.195090 -0.544895
+v 0.831470 0.000000 -0.555570
+v 0.815493 -0.195090 -0.544895
+v 0.768178 -0.382683 -0.513280
+v 0.691342 -0.555570 -0.461940
+v 0.587938 -0.707107 -0.392847
+v 0.461940 -0.831470 -0.308658
+v 0.318190 -0.923880 -0.212608
+v 0.162212 -0.980785 -0.108386
+v 0.000000 1.000000 0.000000
+v 0.180240 0.980785 -0.074658
+v 0.353553 0.923880 -0.146447
+v 0.513280 0.831470 -0.212607
+v 0.653281 0.707107 -0.270598
+v 0.768178 0.555570 -0.318190
+v 0.853553 0.382683 -0.353553
+v 0.906127 0.195090 -0.375330
+v 0.923879 0.000000 -0.382683
+v 0.906127 -0.195090 -0.375330
+v 0.853553 -0.382683 -0.353553
+v 0.768178 -0.555570 -0.318190
+v 0.653281 -0.707107 -0.270598
+v 0.513280 -0.831470 -0.212607
+v 0.353553 -0.923880 -0.146447
+v 0.180240 -0.980785 -0.074658
+v 0.191342 0.980785 -0.038060
+v 0.375330 0.923880 -0.074658
+v 0.544895 0.831470 -0.108386
+v 0.693520 0.707107 -0.137950
+v 0.815493 0.555570 -0.162212
+v 0.906127 0.382683 -0.180240
+v 0.961940 0.195090 -0.191342
+v 0.980785 0.000000 -0.195090
+v 0.961940 -0.195090 -0.191342
+v 0.906127 -0.382683 -0.180240
+v 0.815493 -0.555570 -0.162212
+v 0.693520 -0.707107 -0.137950
+v 0.544895 -0.831470 -0.108386
+v 0.375330 -0.923880 -0.074658
+v 0.191342 -0.980785 -0.038060
+v 0.195090 0.980785 0.000000
+v 0.382683 0.923880 0.000000
+v 0.555570 0.831470 0.000000
+v 0.707107 0.707107 -0.000000
+v 0.831469 0.555570 0.000000
+v 0.923879 0.382683 -0.000000
+v 0.980785 0.195090 0.000000
+v 1.000000 0.000000 0.000000
+v 0.980785 -0.195090 0.000000
+v 0.923879 -0.382683 -0.000000
+v 0.831469 -0.555570 0.000000
+v 0.707107 -0.707107 -0.000000
+v 0.555570 -0.831470 0.000000
+v 0.382683 -0.923880 0.000000
+v 0.195090 -0.980785 0.000000
+v 0.191342 0.980785 0.038060
+v 0.375330 0.923880 0.074658
+v 0.544895 0.831470 0.108386
+v 0.693520 0.707107 0.137950
+v 0.815493 0.555570 0.162212
+v 0.906127 0.382683 0.180240
+v 0.961940 0.195090 0.191342
+v 0.980785 0.000000 0.195090
+v 0.961940 -0.195090 0.191342
+v 0.906127 -0.382683 0.180240
+v 0.815493 -0.555570 0.162212
+v 0.693520 -0.707107 0.137950
+v 0.544895 -0.831470 0.108386
+v 0.375330 -0.923880 0.074658
+v 0.191342 -0.980785 0.038060
+v 0.180240 0.980785 0.074658
+v 0.353553 0.923880 0.146447
+v 0.513280 0.831470 0.212608
+v 0.653281 0.707107 0.270598
+v 0.768178 0.555570 0.318190
+v 0.853553 0.382683 0.353553
+v 0.906127 0.195090 0.375330
+v 0.923879 0.000000 0.382683
+v 0.906127 -0.195090 0.375330
+v 0.853553 -0.382683 0.353553
+v 0.768178 -0.555570 0.318190
+v 0.653281 -0.707107 0.270598
+v 0.513280 -0.831470 0.212608
+v 0.353553 -0.923880 0.146447
+v 0.180240 -0.980785 0.074658
+v 0.162212 0.980785 0.108386
+v 0.318190 0.923880 0.212608
+v 0.461940 0.831470 0.308658
+v 0.587938 0.707107 0.392847
+v 0.691341 0.555570 0.461940
+v 0.768178 0.382683 0.513280
+v 0.815493 0.195090 0.544895
+v 0.831469 0.000000 0.555570
+v 0.815493 -0.195090 0.544895
+v 0.768178 -0.382683 0.513280
+v 0.691341 -0.555570 0.461940
+v 0.587938 -0.707107 0.392847
+v 0.461940 -0.831470 0.308658
+v 0.318190 -0.923880 0.212608
+v 0.162212 -0.980785 0.108386
+v 0.137950 0.980785 0.137950
+v 0.270598 0.923880 0.270598
+v 0.392847 0.831470 0.392847
+v 0.500000 0.707107 0.500000
+v 0.587938 0.555570 0.587938
+v 0.653281 0.382683 0.653281
+v 0.693520 0.195090 0.693520
+v 0.707106 0.000000 0.707107
+v 0.693520 -0.195090 0.693520
+v 0.653281 -0.382683 0.653281
+v 0.587938 -0.555570 0.587938
+v 0.500000 -0.707107 0.500000
+v 0.392847 -0.831470 0.392847
+v 0.270598 -0.923880 0.270598
+v 0.137950 -0.980785 0.137950
+v 0.108386 0.980785 0.162212
+v 0.212607 0.923880 0.318190
+v 0.308658 0.831470 0.461940
+v 0.392847 0.707107 0.587938
+v 0.461940 0.555570 0.691342
+v 0.513280 0.382683 0.768178
+v 0.544895 0.195090 0.815493
+v 0.555570 0.000000 0.831469
+v 0.544895 -0.195090 0.815493
+v 0.513280 -0.382683 0.768178
+v 0.461940 -0.555570 0.691342
+v 0.392847 -0.707107 0.587938
+v 0.308658 -0.831470 0.461940
+v 0.212607 -0.923880 0.318190
+v 0.108386 -0.980785 0.162212
+v 0.074658 0.980785 0.180240
+v 0.146447 0.923880 0.353553
+v 0.212607 0.831470 0.513280
+v 0.270598 0.707107 0.653281
+v 0.318189 0.555570 0.768178
+v 0.353553 0.382683 0.853553
+v 0.375330 0.195090 0.906127
+v 0.382683 0.000000 0.923879
+v 0.375330 -0.195090 0.906127
+v 0.353553 -0.382683 0.853553
+v 0.318189 -0.555570 0.768178
+v 0.270598 -0.707107 0.653281
+v 0.212607 -0.831470 0.513280
+v 0.146447 -0.923880 0.353553
+v 0.074658 -0.980785 0.180240
+v 0.038060 0.980785 0.191342
+v 0.074658 0.923880 0.375330
+v 0.108386 0.831470 0.544895
+v 0.137950 0.707107 0.693520
+v 0.162212 0.555570 0.815493
+v 0.180240 0.382683 0.906127
+v 0.191342 0.195090 0.961939
+v 0.195090 0.000000 0.980785
+v 0.191342 -0.195090 0.961939
+v 0.180240 -0.382683 0.906127
+v 0.162212 -0.555570 0.815493
+v 0.137950 -0.707107 0.693520
+v 0.108386 -0.831470 0.544895
+v 0.074658 -0.923880 0.375330
+v 0.038060 -0.980785 0.191342
+v -0.000000 0.980785 0.195090
+v -0.000000 0.923880 0.382683
+v -0.000000 0.831470 0.555570
+v -0.000000 0.707107 0.707107
+v -0.000000 0.555570 0.831469
+v 0.000000 0.382683 0.923879
+v -0.000000 0.195090 0.980785
+v -0.000000 0.000000 0.999999
+v -0.000000 -0.195090 0.980785
+v 0.000000 -0.382683 0.923879
+v -0.000000 -0.555570 0.831469
+v -0.000000 -0.707107 0.707107
+v -0.000000 -0.831470 0.555570
+v -0.000000 -0.923880 0.382683
+v -0.000000 -0.980785 0.195090
+v -0.038060 0.980785 0.191342
+v -0.074658 0.923880 0.375330
+v -0.108386 0.831470 0.544895
+v -0.137950 0.707107 0.693520
+v -0.162212 0.555570 0.815493
+v -0.180240 0.382683 0.906127
+v -0.191342 0.195090 0.961939
+v -0.195091 0.000000 0.980785
+v -0.191342 -0.195090 0.961939
+v -0.180240 -0.382683 0.906127
+v -0.162212 -0.555570 0.815493
+v -0.137950 -0.707107 0.693520
+v -0.108386 -0.831470 0.544895
+v -0.074658 -0.923880 0.375330
+v -0.038060 -0.980785 0.191342
+v -0.074658 0.980785 0.180240
+v -0.146447 0.923880 0.353553
+v -0.212608 0.831470 0.513280
+v -0.270598 0.707107 0.653281
+v -0.318190 0.555570 0.768177
+v -0.353553 0.382683 0.853553
+v -0.375330 0.195090 0.906127
+v -0.382683 0.000000 0.923879
+v -0.375330 -0.195090 0.906127
+v -0.353553 -0.382683 0.853553
+v -0.318190 -0.555570 0.768177
+v -0.270598 -0.707107 0.653281
+v -0.212608 -0.831470 0.513280
+v -0.146447 -0.923880 0.353553
+v -0.074658 -0.980785 0.180240
+v -0.108386 0.980785 0.162212
+v -0.212608 0.923880 0.318190
+v -0.308658 0.831470 0.461939
+v -0.392847 0.707107 0.587938
+v -0.461940 0.555570 0.691341
+v -0.513280 0.382683 0.768178
+v -0.544895 0.195090 0.815493
+v -0.555570 0.000000 0.831469
+v -0.544895 -0.195090 0.815493
+v -0.513280 -0.382683 0.768178
+v -0.461940 -0.555570 0.691341
+v -0.392847 -0.707107 0.587938
+v -0.308658 -0.831470 0.461939
+v -0.212608 -0.923880 0.318190
+v -0.108386 -0.980785 0.162212
+v -0.137950 0.980785 0.137950
+v -0.270598 0.923880 0.270598
+v -0.392847 0.831470 0.392847
+v -0.500000 0.707107 0.500000
+v -0.587938 0.555570 0.587937
+v -0.653281 0.382683 0.653281
+v -0.693520 0.195090 0.693520
+v -0.707106 0.000000 0.707106
+v -0.693520 -0.195090 0.693520
+v -0.653281 -0.382683 0.653281
+v -0.587938 -0.555570 0.587937
+v -0.500000 -0.707107 0.500000
+v -0.392847 -0.831470 0.392847
+v -0.270598 -0.923880 0.270598
+v -0.137950 -0.980785 0.137950
+v 0.000000 -1.000000 0.000000
+v -0.162212 0.980785 0.108386
+v -0.318190 0.923880 0.212607
+v -0.461940 0.831470 0.308658
+v -0.587938 0.707107 0.392847
+v -0.691341 0.555570 0.461939
+v -0.768177 0.382683 0.513280
+v -0.815493 0.195090 0.544895
+v -0.831469 0.000000 0.555569
+v -0.815493 -0.195090 0.544895
+v -0.768177 -0.382683 0.513280
+v -0.691341 -0.555570 0.461939
+v -0.587938 -0.707107 0.392847
+v -0.461940 -0.831470 0.308658
+v -0.318190 -0.923880 0.212607
+v -0.162212 -0.980785 0.108386
+v -0.180240 0.980785 0.074658
+v -0.353553 0.923880 0.146447
+v -0.513280 0.831470 0.212607
+v -0.653281 0.707107 0.270598
+v -0.768177 0.555570 0.318189
+v -0.853553 0.382683 0.353553
+v -0.906127 0.195090 0.375330
+v -0.923879 0.000000 0.382683
+v -0.906127 -0.195090 0.375330
+v -0.853553 -0.382683 0.353553
+v -0.768177 -0.555570 0.318189
+v -0.653281 -0.707107 0.270598
+v -0.513280 -0.831470 0.212607
+v -0.353553 -0.923880 0.146447
+v -0.180240 -0.980785 0.074658
+v -0.191342 0.980785 0.038060
+v -0.375330 0.923880 0.074658
+v -0.544895 0.831470 0.108386
+v -0.693520 0.707107 0.137950
+v -0.815493 0.555570 0.162211
+v -0.906127 0.382683 0.180240
+v -0.961939 0.195090 0.191341
+v -0.980784 0.000000 0.195090
+v -0.961939 -0.195090 0.191341
+v -0.906127 -0.382683 0.180240
+v -0.815493 -0.555570 0.162211
+v -0.693520 -0.707107 0.137950
+v -0.544895 -0.831470 0.108386
+v -0.375330 -0.923880 0.074658
+v -0.191342 -0.980785 0.038060
+v -0.195090 0.980785 -0.000000
+v -0.382683 0.923880 -0.000000
+v -0.555570 0.831470 -0.000000
+v -0.707107 0.707107 -0.000000
+v -0.831469 0.555570 -0.000000
+v -0.923879 0.382683 -0.000000
+v -0.980785 0.195090 -0.000000
+v -0.999999 0.000000 -0.000000
+v -0.980785 -0.195090 -0.000000
+v -0.923879 -0.382683 -0.000000
+v -0.831469 -0.555570 -0.000000
+v -0.707107 -0.707107 -0.000000
+v -0.555570 -0.831470 -0.000000
+v -0.382683 -0.923880 -0.000000
+v -0.195090 -0.980785 -0.000000
+v -0.191342 0.980785 -0.038060
+v -0.375330 0.923880 -0.074658
+v -0.544895 0.831470 -0.108386
+v -0.693520 0.707107 -0.137950
+v -0.815493 0.555570 -0.162212
+v -0.906127 0.382683 -0.180240
+v -0.961939 0.195090 -0.191342
+v -0.980784 0.000000 -0.195091
+v -0.961939 -0.195090 -0.191342
+v -0.906127 -0.382683 -0.180240
+v -0.815493 -0.555570 -0.162212
+v -0.693520 -0.707107 -0.137950
+v -0.544895 -0.831470 -0.108386
+v -0.375330 -0.923880 -0.074658
+v -0.191342 -0.980785 -0.038060
+v -0.180240 0.980785 -0.074658
+v -0.353553 0.923880 -0.146447
+v -0.513279 0.831470 -0.212607
+v -0.653281 0.707107 -0.270598
+v -0.768177 0.555570 -0.318190
+v -0.853553 0.382683 -0.353553
+v -0.906127 0.195090 -0.375330
+v -0.923878 0.000000 -0.382683
+v -0.906127 -0.195090 -0.375330
+v -0.853553 -0.382683 -0.353553
+v -0.768177 -0.555570 -0.318190
+v -0.653281 -0.707107 -0.270598
+v -0.513279 -0.831470 -0.212607
+v -0.353553 -0.923880 -0.146447
+v -0.180240 -0.980785 -0.074658
+v -0.162212 0.980785 -0.108386
+v -0.318189 0.923880 -0.212607
+v -0.461939 0.831470 -0.308658
+v -0.587938 0.707107 -0.392847
+v -0.691341 0.555570 -0.461940
+v -0.768177 0.382683 -0.513280
+v -0.815493 0.195090 -0.544895
+v -0.831468 0.000000 -0.555570
+v -0.815493 -0.195090 -0.544895
+v -0.768177 -0.382683 -0.513280
+v -0.691341 -0.555570 -0.461940
+v -0.587938 -0.707107 -0.392847
+v -0.461939 -0.831470 -0.308658
+v -0.318189 -0.923880 -0.212607
+v -0.162212 -0.980785 -0.108386
+v -0.137950 0.980785 -0.137950
+v -0.270598 0.923880 -0.270598
+v -0.392847 0.831470 -0.392847
+v -0.500000 0.707107 -0.500000
+v -0.587937 0.555570 -0.587938
+v -0.653281 0.382683 -0.653281
+v -0.693519 0.195090 -0.693520
+v -0.707106 0.000000 -0.707106
+v -0.693519 -0.195090 -0.693520
+v -0.653281 -0.382683 -0.653281
+v -0.587937 -0.555570 -0.587938
+v -0.500000 -0.707107 -0.500000
+v -0.392847 -0.831470 -0.392847
+v -0.270598 -0.923880 -0.270598
+v -0.137950 -0.980785 -0.137950
+v -0.108386 0.980785 -0.162212
+v -0.212607 0.923880 -0.318190
+v -0.308658 0.831470 -0.461939
+v -0.392847 0.707107 -0.587938
+v -0.461939 0.555570 -0.691341
+v -0.513280 0.382683 -0.768177
+v -0.544895 0.195090 -0.815493
+v -0.555569 0.000000 -0.831469
+v -0.544895 -0.195090 -0.815493
+v -0.513280 -0.382683 -0.768177
+v -0.461939 -0.555570 -0.691341
+v -0.392847 -0.707107 -0.587938
+v -0.308658 -0.831470 -0.461939
+v -0.212607 -0.923880 -0.318190
+v -0.108386 -0.980785 -0.162212
+v -0.074658 0.980785 -0.180240
+v -0.146446 0.923880 -0.353553
+v -0.212607 0.831470 -0.513279
+v -0.270598 0.707107 -0.653281
+v -0.318189 0.555570 -0.768177
+v -0.353553 0.382683 -0.853553
+v -0.375330 0.195090 -0.906127
+v -0.382683 0.000000 -0.923879
+v -0.375330 -0.195090 -0.906127
+v -0.353553 -0.382683 -0.853553
+v -0.318189 -0.555570 -0.768177
+v -0.270598 -0.707107 -0.653281
+v -0.212607 -0.831470 -0.513279
+v -0.146446 -0.923880 -0.353553
+v -0.074658 -0.980785 -0.180240
+v -0.038060 0.980785 -0.191342
+v -0.074658 0.923880 -0.375330
+v -0.108386 0.831470 -0.544895
+v -0.137950 0.707107 -0.693520
+v -0.162211 0.555570 -0.815493
+v -0.180240 0.382683 -0.906127
+v -0.191341 0.195090 -0.961939
+v -0.195090 0.000000 -0.980784
+v -0.191341 -0.195090 -0.961939
+v -0.180240 -0.382683 -0.906127
+v -0.162211 -0.555570 -0.815493
+v -0.137950 -0.707107 -0.693520
+v -0.108386 -0.831470 -0.544895
+v -0.074658 -0.923880 -0.375330
+v -0.038060 -0.980785 -0.191342
+v 0.000000 0.980785 -0.195090
+v 0.000000 0.923880 -0.382683
+v 0.000000 0.707107 -0.707107
+v 0.000000 0.382683 -0.923879
+v 0.000000 -0.382683 -0.923879
+v 0.000000 -0.707107 -0.707107
+v 0.000000 -0.831470 -0.555570
+v 0.000000 -0.923880 -0.382683
+v 0.000000 -0.980785 -0.195090
+vn -0.0000 0.8286 -0.5598
+vn -0.0000 0.5528 -0.8333
+vn -0.0000 0.1939 -0.9810
+vn -0.0000 -0.0000 -1.0000
+vn -0.0000 -0.1939 -0.9810
+vn -0.0000 -0.5528 -0.8333
+vn 0.0392 0.9796 -0.1971
+vn 0.0757 0.9217 -0.3804
+vn 0.1092 0.8286 -0.5490
+vn 0.1385 0.7041 -0.6965
+vn 0.1626 0.5528 -0.8173
+vn 0.1804 0.3805 -0.9070
+vn 0.1914 0.1939 -0.9622
+vn 0.1951 -0.0000 -0.9808
+vn 0.1914 -0.1939 -0.9622
+vn 0.1804 -0.3805 -0.9070
+vn 0.1626 -0.5528 -0.8173
+vn 0.1385 -0.7041 -0.6965
+vn 0.1092 -0.8286 -0.5490
+vn 0.0757 -0.9217 -0.3804
+vn 0.0392 -0.9796 -0.1971
+vn 0.0769 0.9796 -0.1857
+vn 0.1484 0.9217 -0.3584
+vn 0.2142 0.8286 -0.5172
+vn 0.2718 0.7041 -0.6561
+vn 0.3189 0.5528 -0.7699
+vn 0.3539 0.3805 -0.8544
+vn 0.3754 0.1939 -0.9063
+vn 0.3827 -0.0000 -0.9239
+vn 0.3754 -0.1939 -0.9063
+vn 0.3539 -0.3805 -0.8544
+vn 0.3189 -0.5528 -0.7699
+vn 0.2718 -0.7041 -0.6561
+vn 0.2142 -0.8286 -0.5172
+vn 0.1484 -0.9217 -0.3584
+vn 0.0769 -0.9796 -0.1857
+vn 0.1117 0.9796 -0.1671
+vn 0.2155 0.9217 -0.3225
+vn 0.3110 0.8286 -0.4654
+vn 0.3945 0.7041 -0.5905
+vn 0.4630 0.5528 -0.6929
+vn 0.5138 0.3805 -0.7689
+vn 0.5450 0.1939 -0.8157
+vn 0.5556 -0.0000 -0.8315
+vn 0.5450 -0.1939 -0.8157
+vn 0.5138 -0.3805 -0.7689
+vn 0.4630 -0.5528 -0.6929
+vn 0.3945 -0.7041 -0.5905
+vn 0.3110 -0.8286 -0.4654
+vn 0.2155 -0.9217 -0.3225
+vn 0.1117 -0.9796 -0.1671
+vn 0.1421 0.9796 -0.1421
+vn 0.2743 0.9217 -0.2743
+vn 0.3958 0.8286 -0.3958
+vn 0.5021 0.7041 -0.5021
+vn 0.5893 0.5528 -0.5893
+vn 0.6539 0.3805 -0.6539
+vn 0.6937 0.1939 -0.6937
+vn 0.7071 -0.0000 -0.7071
+vn 0.6937 -0.1939 -0.6937
+vn 0.6539 -0.3805 -0.6539
+vn 0.5893 -0.5528 -0.5893
+vn 0.5021 -0.7041 -0.5021
+vn 0.3958 -0.8286 -0.3958
+vn 0.2743 -0.9217 -0.2743
+vn 0.1421 -0.9796 -0.1421
+vn 0.1671 0.9796 -0.1117
+vn 0.3225 0.9217 -0.2155
+vn 0.4654 0.8286 -0.3110
+vn 0.5905 0.7041 -0.3945
+vn 0.6929 0.5528 -0.4630
+vn 0.7689 0.3805 -0.5138
+vn 0.8157 0.1939 -0.5450
+vn 0.8315 -0.0000 -0.5556
+vn 0.8157 -0.1939 -0.5450
+vn 0.7689 -0.3805 -0.5138
+vn 0.6929 -0.5528 -0.4630
+vn 0.5905 -0.7041 -0.3945
+vn 0.4654 -0.8286 -0.3110
+vn 0.3225 -0.9217 -0.2155
+vn 0.1671 -0.9796 -0.1117
+vn -0.0000 1.0000 -0.0000
+vn 0.1857 0.9796 -0.0769
+vn 0.3584 0.9217 -0.1484
+vn 0.5172 0.8286 -0.2142
+vn 0.6561 0.7041 -0.2718
+vn 0.7699 0.5528 -0.3189
+vn 0.8544 0.3805 -0.3539
+vn 0.9063 0.1939 -0.3754
+vn 0.9239 -0.0000 -0.3827
+vn 0.9063 -0.1939 -0.3754
+vn 0.8544 -0.3805 -0.3539
+vn 0.7699 -0.5528 -0.3189
+vn 0.6561 -0.7041 -0.2718
+vn 0.5172 -0.8286 -0.2142
+vn 0.3584 -0.9217 -0.1484
+vn 0.1857 -0.9796 -0.0769
+vn 0.1971 0.9796 -0.0392
+vn 0.3804 0.9217 -0.0757
+vn 0.5490 0.8286 -0.1092
+vn 0.6965 0.7041 -0.1385
+vn 0.8173 0.5528 -0.1626
+vn 0.9070 0.3805 -0.1804
+vn 0.9622 0.1939 -0.1914
+vn 0.9808 -0.0000 -0.1951
+vn 0.9622 -0.1939 -0.1914
+vn 0.9070 -0.3805 -0.1804
+vn 0.8173 -0.5528 -0.1626
+vn 0.6965 -0.7041 -0.1385
+vn 0.5490 -0.8286 -0.1092
+vn 0.3804 -0.9217 -0.0757
+vn 0.1971 -0.9796 -0.0392
+vn 0.2010 0.9796 -0.0000
+vn 0.3879 0.9217 -0.0000
+vn 0.5598 0.8286 -0.0000
+vn 0.7101 0.7041 -0.0000
+vn 0.8333 0.5528 -0.0000
+vn 0.9248 0.3805 -0.0000
+vn 0.9810 0.1939 -0.0000
+vn 1.0000 -0.0000 -0.0000
+vn 0.9810 -0.1939 -0.0000
+vn 0.9248 -0.3805 -0.0000
+vn 0.8333 -0.5528 -0.0000
+vn 0.7101 -0.7041 -0.0000
+vn 0.5598 -0.8286 -0.0000
+vn 0.3879 -0.9217 -0.0000
+vn 0.2010 -0.9796 -0.0000
+vn 0.1971 0.9796 0.0392
+vn 0.3804 0.9217 0.0757
+vn 0.5490 0.8286 0.1092
+vn 0.6965 0.7041 0.1385
+vn 0.8173 0.5528 0.1626
+vn 0.9070 0.3805 0.1804
+vn 0.9622 0.1939 0.1914
+vn 0.9808 -0.0000 0.1951
+vn 0.9622 -0.1939 0.1914
+vn 0.9070 -0.3805 0.1804
+vn 0.8173 -0.5528 0.1626
+vn 0.6965 -0.7041 0.1385
+vn 0.5490 -0.8286 0.1092
+vn 0.3804 -0.9217 0.0757
+vn 0.1971 -0.9796 0.0392
+vn 0.1857 0.9796 0.0769
+vn 0.3584 0.9217 0.1484
+vn 0.5172 0.8286 0.2142
+vn 0.6561 0.7041 0.2718
+vn 0.7699 0.5528 0.3189
+vn 0.8544 0.3805 0.3539
+vn 0.9063 0.1939 0.3754
+vn 0.9239 -0.0000 0.3827
+vn 0.9063 -0.1939 0.3754
+vn 0.8544 -0.3805 0.3539
+vn 0.7699 -0.5528 0.3189
+vn 0.6561 -0.7041 0.2718
+vn 0.5172 -0.8286 0.2142
+vn 0.3584 -0.9217 0.1484
+vn 0.1857 -0.9796 0.0769
+vn 0.1671 0.9796 0.1117
+vn 0.3225 0.9217 0.2155
+vn 0.4654 0.8286 0.3110
+vn 0.5905 0.7041 0.3945
+vn 0.6929 0.5528 0.4630
+vn 0.7689 0.3805 0.5138
+vn 0.8157 0.1939 0.5450
+vn 0.8315 -0.0000 0.5556
+vn 0.8157 -0.1939 0.5450
+vn 0.7689 -0.3805 0.5138
+vn 0.6929 -0.5528 0.4630
+vn 0.5905 -0.7041 0.3945
+vn 0.4654 -0.8286 0.3110
+vn 0.3225 -0.9217 0.2155
+vn 0.1671 -0.9796 0.1117
+vn 0.1421 0.9796 0.1421
+vn 0.2743 0.9217 0.2743
+vn 0.3958 0.8286 0.3958
+vn 0.5021 0.7041 0.5021
+vn 0.5893 0.5528 0.5893
+vn 0.6539 0.3805 0.6539
+vn 0.6937 0.1939 0.6937
+vn 0.7071 -0.0000 0.7071
+vn 0.6937 -0.1939 0.6937
+vn 0.6539 -0.3805 0.6539
+vn 0.5893 -0.5528 0.5893
+vn 0.5021 -0.7041 0.5021
+vn 0.3958 -0.8286 0.3958
+vn 0.2743 -0.9217 0.2743
+vn 0.1421 -0.9796 0.1421
+vn 0.1117 0.9796 0.1671
+vn 0.2155 0.9217 0.3225
+vn 0.3110 0.8286 0.4654
+vn 0.3945 0.7041 0.5905
+vn 0.4630 0.5528 0.6929
+vn 0.5138 0.3805 0.7689
+vn 0.5450 0.1939 0.8157
+vn 0.5556 -0.0000 0.8315
+vn 0.5450 -0.1939 0.8157
+vn 0.5138 -0.3805 0.7689
+vn 0.4630 -0.5528 0.6929
+vn 0.3945 -0.7041 0.5905
+vn 0.3110 -0.8286 0.4654
+vn 0.2155 -0.9217 0.3225
+vn 0.1117 -0.9796 0.1671
+vn 0.0769 0.9796 0.1857
+vn 0.1484 0.9217 0.3584
+vn 0.2142 0.8286 0.5172
+vn 0.2718 0.7041 0.6561
+vn 0.3189 0.5528 0.7699
+vn 0.3539 0.3805 0.8544
+vn 0.3754 0.1939 0.9063
+vn 0.3827 -0.0000 0.9239
+vn 0.3754 -0.1939 0.9063
+vn 0.3539 -0.3805 0.8544
+vn 0.3189 -0.5528 0.7699
+vn 0.2718 -0.7041 0.6561
+vn 0.2142 -0.8286 0.5172
+vn 0.1484 -0.9217 0.3584
+vn 0.0769 -0.9796 0.1857
+vn 0.0392 0.9796 0.1971
+vn 0.0757 0.9217 0.3804
+vn 0.1092 0.8286 0.5490
+vn 0.1385 0.7041 0.6965
+vn 0.1626 0.5528 0.8173
+vn 0.1804 0.3805 0.9070
+vn 0.1914 0.1939 0.9622
+vn 0.1951 -0.0000 0.9808
+vn 0.1914 -0.1939 0.9622
+vn 0.1804 -0.3805 0.9070
+vn 0.1626 -0.5528 0.8173
+vn 0.1385 -0.7041 0.6965
+vn 0.1092 -0.8286 0.5490
+vn 0.0757 -0.9217 0.3804
+vn 0.0392 -0.9796 0.1971
+vn -0.0000 0.9796 0.2010
+vn -0.0000 0.9217 0.3879
+vn -0.0000 0.8286 0.5598
+vn -0.0000 0.7041 0.7101
+vn -0.0000 0.5528 0.8333
+vn -0.0000 0.3805 0.9248
+vn -0.0000 0.1939 0.9810
+vn -0.0000 -0.0000 1.0000
+vn -0.0000 -0.1939 0.9810
+vn -0.0000 -0.3805 0.9248
+vn -0.0000 -0.5528 0.8333
+vn -0.0000 -0.7041 0.7101
+vn -0.0000 -0.8286 0.5598
+vn -0.0000 -0.9217 0.3879
+vn -0.0000 -0.9796 0.2010
+vn -0.0392 0.9796 0.1971
+vn -0.0757 0.9217 0.3804
+vn -0.1092 0.8286 0.5490
+vn -0.1385 0.7041 0.6965
+vn -0.1626 0.5528 0.8173
+vn -0.1804 0.3805 0.9070
+vn -0.1914 0.1939 0.9622
+vn -0.1951 -0.0000 0.9808
+vn -0.1914 -0.1939 0.9622
+vn -0.1804 -0.3805 0.9070
+vn -0.1626 -0.5528 0.8173
+vn -0.1385 -0.7041 0.6965
+vn -0.1092 -0.8286 0.5490
+vn -0.0757 -0.9217 0.3804
+vn -0.0392 -0.9796 0.1971
+vn -0.0769 0.9796 0.1857
+vn -0.1484 0.9217 0.3584
+vn -0.2142 0.8286 0.5172
+vn -0.2718 0.7041 0.6561
+vn -0.3189 0.5528 0.7699
+vn -0.3539 0.3805 0.8544
+vn -0.3754 0.1939 0.9063
+vn -0.3827 -0.0000 0.9239
+vn -0.3754 -0.1939 0.9063
+vn -0.3539 -0.3805 0.8544
+vn -0.3189 -0.5528 0.7699
+vn -0.2718 -0.7041 0.6561
+vn -0.2142 -0.8286 0.5172
+vn -0.1484 -0.9217 0.3584
+vn -0.0769 -0.9796 0.1857
+vn -0.1117 0.9796 0.1671
+vn -0.2155 0.9217 0.3225
+vn -0.3110 0.8286 0.4654
+vn -0.3945 0.7041 0.5905
+vn -0.4630 0.5528 0.6929
+vn -0.5138 0.3805 0.7689
+vn -0.5450 0.1939 0.8157
+vn -0.5556 -0.0000 0.8315
+vn -0.5450 -0.1939 0.8157
+vn -0.5138 -0.3805 0.7689
+vn -0.4630 -0.5528 0.6929
+vn -0.3945 -0.7041 0.5905
+vn -0.3110 -0.8286 0.4654
+vn -0.2155 -0.9217 0.3225
+vn -0.1117 -0.9796 0.1671
+vn -0.1421 0.9796 0.1421
+vn -0.2743 0.9217 0.2743
+vn -0.3958 0.8286 0.3958
+vn -0.5021 0.7041 0.5021
+vn -0.5893 0.5528 0.5893
+vn -0.6539 0.3805 0.6539
+vn -0.6937 0.1939 0.6937
+vn -0.7071 -0.0000 0.7071
+vn -0.6937 -0.1939 0.6937
+vn -0.6539 -0.3805 0.6539
+vn -0.5893 -0.5528 0.5893
+vn -0.5021 -0.7041 0.5021
+vn -0.3958 -0.8286 0.3958
+vn -0.2743 -0.9217 0.2743
+vn -0.1421 -0.9796 0.1421
+vn -0.0000 -1.0000 -0.0000
+vn -0.1671 0.9796 0.1117
+vn -0.3225 0.9217 0.2155
+vn -0.4654 0.8286 0.3110
+vn -0.5905 0.7041 0.3945
+vn -0.6929 0.5528 0.4630
+vn -0.7689 0.3805 0.5138
+vn -0.8157 0.1939 0.5450
+vn -0.8315 -0.0000 0.5556
+vn -0.8157 -0.1939 0.5450
+vn -0.7689 -0.3805 0.5138
+vn -0.6929 -0.5528 0.4630
+vn -0.5905 -0.7041 0.3945
+vn -0.4654 -0.8286 0.3110
+vn -0.3225 -0.9217 0.2155
+vn -0.1671 -0.9796 0.1117
+vn -0.1857 0.9796 0.0769
+vn -0.3584 0.9217 0.1484
+vn -0.5172 0.8286 0.2142
+vn -0.6561 0.7041 0.2718
+vn -0.7699 0.5528 0.3189
+vn -0.8544 0.3805 0.3539
+vn -0.9063 0.1939 0.3754
+vn -0.9239 -0.0000 0.3827
+vn -0.9063 -0.1939 0.3754
+vn -0.8544 -0.3805 0.3539
+vn -0.7699 -0.5528 0.3189
+vn -0.6561 -0.7041 0.2718
+vn -0.5172 -0.8286 0.2142
+vn -0.3584 -0.9217 0.1484
+vn -0.1857 -0.9796 0.0769
+vn -0.1971 0.9796 0.0392
+vn -0.3804 0.9217 0.0757
+vn -0.5490 0.8286 0.1092
+vn -0.6965 0.7041 0.1385
+vn -0.8173 0.5528 0.1626
+vn -0.9070 0.3805 0.1804
+vn -0.9622 0.1939 0.1914
+vn -0.9808 -0.0000 0.1951
+vn -0.9622 -0.1939 0.1914
+vn -0.9070 -0.3805 0.1804
+vn -0.8173 -0.5528 0.1626
+vn -0.6965 -0.7041 0.1385
+vn -0.5490 -0.8286 0.1092
+vn -0.3804 -0.9217 0.0757
+vn -0.1971 -0.9796 0.0392
+vn -0.2010 0.9796 -0.0000
+vn -0.3879 0.9217 -0.0000
+vn -0.5598 0.8286 -0.0000
+vn -0.7101 0.7041 -0.0000
+vn -0.8333 0.5528 -0.0000
+vn -0.9248 0.3805 -0.0000
+vn -0.9810 0.1939 -0.0000
+vn -1.0000 -0.0000 -0.0000
+vn -0.9810 -0.1939 -0.0000
+vn -0.9248 -0.3805 -0.0000
+vn -0.8333 -0.5528 -0.0000
+vn -0.7101 -0.7041 -0.0000
+vn -0.5598 -0.8286 -0.0000
+vn -0.3879 -0.9217 -0.0000
+vn -0.2010 -0.9796 -0.0000
+vn -0.1971 0.9796 -0.0392
+vn -0.3804 0.9217 -0.0757
+vn -0.5490 0.8286 -0.1092
+vn -0.6965 0.7041 -0.1385
+vn -0.8173 0.5528 -0.1626
+vn -0.9070 0.3805 -0.1804
+vn -0.9622 0.1939 -0.1914
+vn -0.9808 -0.0000 -0.1951
+vn -0.9622 -0.1939 -0.1914
+vn -0.9070 -0.3805 -0.1804
+vn -0.8173 -0.5528 -0.1626
+vn -0.6965 -0.7041 -0.1385
+vn -0.5490 -0.8286 -0.1092
+vn -0.3804 -0.9217 -0.0757
+vn -0.1971 -0.9796 -0.0392
+vn -0.1857 0.9796 -0.0769
+vn -0.3584 0.9217 -0.1484
+vn -0.5172 0.8286 -0.2142
+vn -0.6561 0.7041 -0.2718
+vn -0.7699 0.5528 -0.3189
+vn -0.8544 0.3805 -0.3539
+vn -0.9063 0.1939 -0.3754
+vn -0.9239 -0.0000 -0.3827
+vn -0.9063 -0.1939 -0.3754
+vn -0.8544 -0.3805 -0.3539
+vn -0.7699 -0.5528 -0.3189
+vn -0.6561 -0.7041 -0.2718
+vn -0.5172 -0.8286 -0.2142
+vn -0.3584 -0.9217 -0.1484
+vn -0.1857 -0.9796 -0.0769
+vn -0.1671 0.9796 -0.1117
+vn -0.3225 0.9217 -0.2155
+vn -0.4654 0.8286 -0.3110
+vn -0.5905 0.7041 -0.3945
+vn -0.6929 0.5528 -0.4630
+vn -0.7689 0.3805 -0.5138
+vn -0.8157 0.1939 -0.5450
+vn -0.8315 -0.0000 -0.5556
+vn -0.8157 -0.1939 -0.5450
+vn -0.7689 -0.3805 -0.5138
+vn -0.6929 -0.5528 -0.4630
+vn -0.5905 -0.7041 -0.3945
+vn -0.4654 -0.8286 -0.3110
+vn -0.3225 -0.9217 -0.2155
+vn -0.1671 -0.9796 -0.1117
+vn -0.1421 0.9796 -0.1421
+vn -0.2743 0.9217 -0.2743
+vn -0.3958 0.8286 -0.3958
+vn -0.5021 0.7041 -0.5021
+vn -0.5893 0.5528 -0.5893
+vn -0.6539 0.3805 -0.6539
+vn -0.6937 0.1939 -0.6937
+vn -0.7071 -0.0000 -0.7071
+vn -0.6937 -0.1939 -0.6937
+vn -0.6539 -0.3805 -0.6539
+vn -0.5893 -0.5528 -0.5893
+vn -0.5021 -0.7041 -0.5021
+vn -0.3958 -0.8286 -0.3958
+vn -0.2743 -0.9217 -0.2743
+vn -0.1421 -0.9796 -0.1421
+vn -0.1117 0.9796 -0.1671
+vn -0.2155 0.9217 -0.3225
+vn -0.3110 0.8286 -0.4654
+vn -0.3945 0.7041 -0.5905
+vn -0.4630 0.5528 -0.6929
+vn -0.5138 0.3805 -0.7689
+vn -0.5450 0.1939 -0.8157
+vn -0.5556 -0.0000 -0.8315
+vn -0.5450 -0.1939 -0.8157
+vn -0.5138 -0.3805 -0.7689
+vn -0.4630 -0.5528 -0.6929
+vn -0.3945 -0.7041 -0.5905
+vn -0.3110 -0.8286 -0.4654
+vn -0.2155 -0.9217 -0.3225
+vn -0.1117 -0.9796 -0.1671
+vn -0.0769 0.9796 -0.1857
+vn -0.1484 0.9217 -0.3584
+vn -0.2142 0.8286 -0.5172
+vn -0.2718 0.7041 -0.6561
+vn -0.3189 0.5528 -0.7699
+vn -0.3539 0.3805 -0.8544
+vn -0.3754 0.1939 -0.9063
+vn -0.3827 -0.0000 -0.9239
+vn -0.3754 -0.1939 -0.9063
+vn -0.3539 -0.3805 -0.8544
+vn -0.3189 -0.5528 -0.7699
+vn -0.2718 -0.7041 -0.6561
+vn -0.2142 -0.8286 -0.5172
+vn -0.1484 -0.9217 -0.3584
+vn -0.0769 -0.9796 -0.1857
+vn -0.0392 0.9796 -0.1971
+vn -0.0757 0.9217 -0.3804
+vn -0.1092 0.8286 -0.5490
+vn -0.1385 0.7041 -0.6965
+vn -0.1626 0.5528 -0.8173
+vn -0.1804 0.3805 -0.9070
+vn -0.1914 0.1939 -0.9622
+vn -0.1951 -0.0000 -0.9808
+vn -0.1914 -0.1939 -0.9622
+vn -0.1804 -0.3805 -0.9070
+vn -0.1626 -0.5528 -0.8173
+vn -0.1385 -0.7041 -0.6965
+vn -0.1092 -0.8286 -0.5490
+vn -0.0757 -0.9217 -0.3804
+vn -0.0392 -0.9796 -0.1971
+vn -0.0000 0.9796 -0.2010
+vn -0.0000 0.9217 -0.3879
+vn -0.0000 0.7041 -0.7101
+vn -0.0000 0.3805 -0.9248
+vn -0.0000 -0.3805 -0.9248
+vn -0.0000 -0.7041 -0.7101
+vn -0.0000 -0.8286 -0.5598
+vn -0.0000 -0.9217 -0.3879
+vn -0.0000 -0.9796 -0.2010
+vt 0.750000 0.437500
+vt 0.718750 0.375000
+vt 0.750000 0.375000
+vt 0.750000 0.812500
+vt 0.718750 0.875000
+vt 0.718750 0.812500
+vt 0.718750 0.312500
+vt 0.750000 0.312500
+vt 0.750000 0.750000
+vt 0.718750 0.750000
+vt 0.718750 0.250000
+vt 0.750000 0.250000
+vt 0.750000 0.687500
+vt 0.718750 0.687500
+vt 0.718750 0.187500
+vt 0.750000 0.187500
+vt 0.750000 0.625000
+vt 0.718750 0.625000
+vt 0.718750 0.125000
+vt 0.750000 0.125000
+vt 0.750000 0.562500
+vt 0.718750 0.562500
+vt 0.718750 0.062500
+vt 0.750000 0.062500
+vt 0.718750 0.500000
+vt 0.750000 0.500000
+vt 0.750000 0.937500
+vt 0.734375 1.000000
+vt 0.718750 0.937500
+vt 0.734375 0.000000
+vt 0.718750 0.437500
+vt 0.750000 0.875000
+vt 0.703125 1.000000
+vt 0.687500 0.937500
+vt 0.703125 0.000000
+vt 0.687500 0.062500
+vt 0.687500 0.437500
+vt 0.687500 0.875000
+vt 0.687500 0.375000
+vt 0.687500 0.812500
+vt 0.687500 0.312500
+vt 0.687500 0.750000
+vt 0.687500 0.250000
+vt 0.687500 0.687500
+vt 0.687500 0.187500
+vt 0.687500 0.625000
+vt 0.687500 0.125000
+vt 0.687500 0.562500
+vt 0.687500 0.500000
+vt 0.656250 0.687500
+vt 0.656250 0.250000
+vt 0.656250 0.187500
+vt 0.656250 0.625000
+vt 0.656250 0.125000
+vt 0.656250 0.562500
+vt 0.656250 0.062500
+vt 0.656250 0.500000
+vt 0.671875 1.000000
+vt 0.656250 0.937500
+vt 0.671875 0.000000
+vt 0.656250 0.437500
+vt 0.656250 0.875000
+vt 0.656250 0.375000
+vt 0.656250 0.812500
+vt 0.656250 0.312500
+vt 0.656250 0.750000
+vt 0.625000 0.437500
+vt 0.625000 0.875000
+vt 0.625000 0.375000
+vt 0.625000 0.812500
+vt 0.625000 0.312500
+vt 0.625000 0.750000
+vt 0.625000 0.250000
+vt 0.625000 0.687500
+vt 0.625000 0.187500
+vt 0.625000 0.625000
+vt 0.625000 0.125000
+vt 0.625000 0.562500
+vt 0.625000 0.062500
+vt 0.625000 0.500000
+vt 0.640625 1.000000
+vt 0.625000 0.937500
+vt 0.640625 0.000000
+vt 0.593750 0.187500
+vt 0.593750 0.625000
+vt 0.593750 0.125000
+vt 0.593750 0.562500
+vt 0.593750 0.062500
+vt 0.593750 0.500000
+vt 0.609375 1.000000
+vt 0.593750 0.937500
+vt 0.609375 0.000000
+vt 0.593750 0.437500
+vt 0.593750 0.875000
+vt 0.593750 0.375000
+vt 0.593750 0.812500
+vt 0.593750 0.312500
+vt 0.593750 0.750000
+vt 0.593750 0.250000
+vt 0.593750 0.687500
+vt 0.562500 0.375000
+vt 0.562500 0.812500
+vt 0.562500 0.312500
+vt 0.562500 0.750000
+vt 0.562500 0.250000
+vt 0.562500 0.687500
+vt 0.562500 0.187500
+vt 0.562500 0.625000
+vt 0.562500 0.125000
+vt 0.562500 0.562500
+vt 0.562500 0.062500
+vt 0.562500 0.500000
+vt 0.578125 1.000000
+vt 0.562500 0.937500
+vt 0.578125 0.000000
+vt 0.562500 0.437500
+vt 0.562500 0.875000
+vt 0.531250 0.187500
+vt 0.531250 0.125000
+vt 0.531250 0.625000
+vt 0.531250 0.562500
+vt 0.531250 0.062500
+vt 0.531250 0.500000
+vt 0.546875 1.000000
+vt 0.531250 0.937500
+vt 0.546875 0.000000
+vt 0.531250 0.437500
+vt 0.531250 0.875000
+vt 0.531250 0.375000
+vt 0.531250 0.812500
+vt 0.531250 0.312500
+vt 0.531250 0.750000
+vt 0.531250 0.250000
+vt 0.531250 0.687500
+vt 0.500000 0.812500
+vt 0.500000 0.375000
+vt 0.500000 0.312500
+vt 0.500000 0.750000
+vt 0.500000 0.250000
+vt 0.500000 0.687500
+vt 0.500000 0.187500
+vt 0.500000 0.625000
+vt 0.500000 0.125000
+vt 0.500000 0.562500
+vt 0.500000 0.062500
+vt 0.500000 0.500000
+vt 0.515625 1.000000
+vt 0.500000 0.937500
+vt 0.515625 0.000000
+vt 0.500000 0.437500
+vt 0.500000 0.875000
+vt 0.468750 0.625000
+vt 0.468750 0.562500
+vt 0.468750 0.062500
+vt 0.468750 0.500000
+vt 0.484375 1.000000
+vt 0.468750 0.937500
+vt 0.484375 0.000000
+vt 0.468750 0.437500
+vt 0.468750 0.875000
+vt 0.468750 0.375000
+vt 0.468750 0.812500
+vt 0.468750 0.312500
+vt 0.468750 0.750000
+vt 0.468750 0.250000
+vt 0.468750 0.687500
+vt 0.468750 0.187500
+vt 0.468750 0.125000
+vt 0.437500 0.375000
+vt 0.437500 0.312500
+vt 0.437500 0.750000
+vt 0.437500 0.250000
+vt 0.437500 0.687500
+vt 0.437500 0.187500
+vt 0.437500 0.625000
+vt 0.437500 0.125000
+vt 0.437500 0.562500
+vt 0.437500 0.062500
+vt 0.437500 0.500000
+vt 0.453125 1.000000
+vt 0.437500 0.937500
+vt 0.453125 0.000000
+vt 0.437500 0.437500
+vt 0.437500 0.875000
+vt 0.437500 0.812500
+vt 0.406250 0.062500
+vt 0.406250 0.562500
+vt 0.406250 0.500000
+vt 0.421875 1.000000
+vt 0.406250 0.937500
+vt 0.421875 0.000000
+vt 0.406250 0.437500
+vt 0.406250 0.875000
+vt 0.406250 0.375000
+vt 0.406250 0.812500
+vt 0.406250 0.312500
+vt 0.406250 0.750000
+vt 0.406250 0.250000
+vt 0.406250 0.687500
+vt 0.406250 0.187500
+vt 0.406250 0.625000
+vt 0.406250 0.125000
+vt 0.375000 0.750000
+vt 0.375000 0.250000
+vt 0.375000 0.687500
+vt 0.375000 0.187500
+vt 0.375000 0.625000
+vt 0.375000 0.125000
+vt 0.375000 0.562500
+vt 0.375000 0.062500
+vt 0.375000 0.500000
+vt 0.390625 1.000000
+vt 0.375000 0.937500
+vt 0.390625 0.000000
+vt 0.375000 0.437500
+vt 0.375000 0.875000
+vt 0.375000 0.375000
+vt 0.375000 0.812500
+vt 0.375000 0.312500
+vt 0.343750 0.562500
+vt 0.343750 0.500000
+vt 0.359375 1.000000
+vt 0.343750 0.937500
+vt 0.359375 0.000000
+vt 0.343750 0.062500
+vt 0.343750 0.437500
+vt 0.343750 0.875000
+vt 0.343750 0.375000
+vt 0.343750 0.812500
+vt 0.343750 0.312500
+vt 0.343750 0.750000
+vt 0.343750 0.250000
+vt 0.343750 0.687500
+vt 0.343750 0.187500
+vt 0.343750 0.625000
+vt 0.343750 0.125000
+vt 0.312500 0.250000
+vt 0.312500 0.750000
+vt 0.312500 0.687500
+vt 0.312500 0.187500
+vt 0.312500 0.625000
+vt 0.312500 0.125000
+vt 0.312500 0.562500
+vt 0.312500 0.062500
+vt 0.312500 0.500000
+vt 0.328125 1.000000
+vt 0.312500 0.937500
+vt 0.328125 0.000000
+vt 0.312500 0.437500
+vt 0.312500 0.875000
+vt 0.312500 0.375000
+vt 0.312500 0.812500
+vt 0.312500 0.312500
+vt 0.296875 0.000000
+vt 0.281250 0.062500
+vt 0.281250 0.437500
+vt 0.281250 0.875000
+vt 0.281250 0.375000
+vt 0.281250 0.812500
+vt 0.281250 0.312500
+vt 0.281250 0.750000
+vt 0.281250 0.250000
+vt 0.281250 0.687500
+vt 0.281250 0.187500
+vt 0.281250 0.625000
+vt 0.281250 0.125000
+vt 0.281250 0.562500
+vt 0.281250 0.500000
+vt 0.296875 1.000000
+vt 0.281250 0.937500
+vt 0.250000 0.250000
+vt 0.250000 0.187500
+vt 0.250000 0.625000
+vt 0.250000 0.125000
+vt 0.250000 0.562500
+vt 0.250000 0.062500
+vt 0.250000 0.500000
+vt 0.265625 1.000000
+vt 0.250000 0.937500
+vt 0.265625 0.000000
+vt 0.250000 0.437500
+vt 0.250000 0.875000
+vt 0.250000 0.375000
+vt 0.250000 0.812500
+vt 0.250000 0.312500
+vt 0.250000 0.750000
+vt 0.250000 0.687500
+vt 0.218750 0.875000
+vt 0.218750 0.375000
+vt 0.218750 0.812500
+vt 0.218750 0.312500
+vt 0.218750 0.750000
+vt 0.218750 0.250000
+vt 0.218750 0.687500
+vt 0.218750 0.187500
+vt 0.218750 0.625000
+vt 0.218750 0.125000
+vt 0.218750 0.562500
+vt 0.218750 0.062500
+vt 0.218750 0.500000
+vt 0.234375 1.000000
+vt 0.218750 0.937500
+vt 0.234375 0.000000
+vt 0.218750 0.437500
+vt 0.187500 0.625000
+vt 0.187500 0.125000
+vt 0.187500 0.562500
+vt 0.187500 0.062500
+vt 0.187500 0.500000
+vt 0.203125 1.000000
+vt 0.187500 0.937500
+vt 0.203125 0.000000
+vt 0.187500 0.437500
+vt 0.187500 0.875000
+vt 0.187500 0.375000
+vt 0.187500 0.812500
+vt 0.187500 0.312500
+vt 0.187500 0.750000
+vt 0.187500 0.250000
+vt 0.187500 0.687500
+vt 0.187500 0.187500
+vt 0.156250 0.375000
+vt 0.156250 0.812500
+vt 0.156250 0.312500
+vt 0.156250 0.750000
+vt 0.156250 0.250000
+vt 0.156250 0.687500
+vt 0.156250 0.187500
+vt 0.156250 0.625000
+vt 0.156250 0.125000
+vt 0.156250 0.562500
+vt 0.156250 0.062500
+vt 0.156250 0.500000
+vt 0.171875 1.000000
+vt 0.156250 0.937500
+vt 0.171875 0.000000
+vt 0.156250 0.437500
+vt 0.156250 0.875000
+vt 0.125000 0.125000
+vt 0.125000 0.625000
+vt 0.125000 0.562500
+vt 0.125000 0.062500
+vt 0.125000 0.500000
+vt 0.140625 1.000000
+vt 0.125000 0.937500
+vt 0.140625 0.000000
+vt 0.125000 0.437500
+vt 0.125000 0.875000
+vt 0.125000 0.375000
+vt 0.125000 0.812500
+vt 0.125000 0.312500
+vt 0.125000 0.750000
+vt 0.125000 0.250000
+vt 0.125000 0.687500
+vt 0.125000 0.187500
+vt 0.093750 0.812500
+vt 0.093750 0.375000
+vt 0.093750 0.312500
+vt 0.093750 0.750000
+vt 0.093750 0.250000
+vt 0.093750 0.687500
+vt 0.093750 0.187500
+vt 0.093750 0.625000
+vt 0.093750 0.125000
+vt 0.093750 0.562500
+vt 0.093750 0.062500
+vt 0.093750 0.500000
+vt 0.109375 1.000000
+vt 0.093750 0.937500
+vt 0.109375 0.000000
+vt 0.093750 0.437500
+vt 0.093750 0.875000
+vt 0.062500 0.625000
+vt 0.062500 0.562500
+vt 0.062500 0.062500
+vt 0.062500 0.500000
+vt 0.078125 1.000000
+vt 0.062500 0.937500
+vt 0.078125 0.000000
+vt 0.062500 0.437500
+vt 0.062500 0.875000
+vt 0.062500 0.375000
+vt 0.062500 0.812500
+vt 0.062500 0.312500
+vt 0.062500 0.750000
+vt 0.062500 0.250000
+vt 0.062500 0.687500
+vt 0.062500 0.187500
+vt 0.062500 0.125000
+vt 0.031250 0.375000
+vt 0.031250 0.312500
+vt 0.031250 0.750000
+vt 0.031250 0.250000
+vt 0.031250 0.687500
+vt 0.031250 0.187500
+vt 0.031250 0.625000
+vt 0.031250 0.125000
+vt 0.031250 0.562500
+vt 0.031250 0.062500
+vt 0.031250 0.500000
+vt 0.046875 1.000000
+vt 0.031250 0.937500
+vt 0.046875 0.000000
+vt 0.031250 0.437500
+vt 0.031250 0.875000
+vt 0.031250 0.812500
+vt 0.000000 0.062500
+vt 0.000000 0.562500
+vt 0.000000 0.500000
+vt 0.015625 1.000000
+vt 0.000000 0.937500
+vt 0.015625 0.000000
+vt 0.000000 0.437500
+vt 0.000000 0.875000
+vt 0.000000 0.375000
+vt 0.000000 0.812500
+vt 0.000000 0.312500
+vt 0.000000 0.750000
+vt 0.000000 0.250000
+vt 0.000000 0.687500
+vt 0.000000 0.187500
+vt 0.000000 0.625000
+vt 0.000000 0.125000
+vt 1.000000 0.312500
+vt 0.968750 0.250000
+vt 1.000000 0.250000
+vt 1.000000 0.687500
+vt 0.968750 0.750000
+vt 0.968750 0.687500
+vt 1.000000 0.187500
+vt 0.968750 0.187500
+vt 0.968750 0.625000
+vt 1.000000 0.625000
+vt 0.968750 0.125000
+vt 1.000000 0.125000
+vt 1.000000 0.562500
+vt 0.968750 0.562500
+vt 0.968750 0.062500
+vt 1.000000 0.062500
+vt 1.000000 0.500000
+vt 0.968750 0.500000
+vt 1.000000 0.937500
+vt 0.984375 1.000000
+vt 0.968750 0.937500
+vt 0.984375 0.000000
+vt 0.968750 0.437500
+vt 1.000000 0.437500
+vt 0.968750 0.875000
+vt 1.000000 0.875000
+vt 0.968750 0.375000
+vt 1.000000 0.375000
+vt 1.000000 0.812500
+vt 0.968750 0.812500
+vt 0.968750 0.312500
+vt 1.000000 0.750000
+vt 0.953125 1.000000
+vt 0.937500 0.937500
+vt 0.953125 0.000000
+vt 0.937500 0.062500
+vt 0.937500 0.437500
+vt 0.937500 0.875000
+vt 0.937500 0.375000
+vt 0.937500 0.812500
+vt 0.937500 0.312500
+vt 0.937500 0.750000
+vt 0.937500 0.250000
+vt 0.937500 0.687500
+vt 0.937500 0.187500
+vt 0.937500 0.625000
+vt 0.937500 0.125000
+vt 0.937500 0.562500
+vt 0.937500 0.500000
+vt 0.906250 0.750000
+vt 0.906250 0.687500
+vt 0.906250 0.250000
+vt 0.906250 0.187500
+vt 0.906250 0.625000
+vt 0.906250 0.125000
+vt 0.906250 0.562500
+vt 0.906250 0.062500
+vt 0.906250 0.500000
+vt 0.921875 1.000000
+vt 0.906250 0.937500
+vt 0.921875 0.000000
+vt 0.906250 0.437500
+vt 0.906250 0.875000
+vt 0.906250 0.375000
+vt 0.906250 0.812500
+vt 0.906250 0.312500
+vt 0.875000 0.437500
+vt 0.875000 0.875000
+vt 0.875000 0.375000
+vt 0.875000 0.812500
+vt 0.875000 0.312500
+vt 0.875000 0.750000
+vt 0.875000 0.250000
+vt 0.875000 0.687500
+vt 0.875000 0.187500
+vt 0.875000 0.625000
+vt 0.875000 0.125000
+vt 0.875000 0.562500
+vt 0.875000 0.062500
+vt 0.875000 0.500000
+vt 0.890625 1.000000
+vt 0.875000 0.937500
+vt 0.890625 0.000000
+vt 0.843750 0.250000
+vt 0.843750 0.187500
+vt 0.843750 0.625000
+vt 0.843750 0.125000
+vt 0.843750 0.562500
+vt 0.843750 0.062500
+vt 0.843750 0.500000
+vt 0.859375 1.000000
+vt 0.843750 0.937500
+vt 0.859375 0.000000
+vt 0.843750 0.437500
+vt 0.843750 0.875000
+vt 0.843750 0.375000
+vt 0.843750 0.812500
+vt 0.843750 0.312500
+vt 0.843750 0.750000
+vt 0.843750 0.687500
+vt 0.812500 0.937500
+vt 0.812500 0.875000
+vt 0.812500 0.375000
+vt 0.812500 0.812500
+vt 0.812500 0.312500
+vt 0.812500 0.750000
+vt 0.812500 0.250000
+vt 0.812500 0.687500
+vt 0.812500 0.187500
+vt 0.812500 0.625000
+vt 0.812500 0.125000
+vt 0.812500 0.562500
+vt 0.812500 0.062500
+vt 0.812500 0.500000
+vt 0.828125 1.000000
+vt 0.828125 0.000000
+vt 0.812500 0.437500
+vt 0.781250 0.625000
+vt 0.781250 0.125000
+vt 0.781250 0.562500
+vt 0.781250 0.062500
+vt 0.781250 0.500000
+vt 0.796875 1.000000
+vt 0.781250 0.937500
+vt 0.796875 0.000000
+vt 0.781250 0.437500
+vt 0.781250 0.875000
+vt 0.781250 0.375000
+vt 0.781250 0.812500
+vt 0.781250 0.312500
+vt 0.781250 0.750000
+vt 0.781250 0.250000
+vt 0.781250 0.687500
+vt 0.781250 0.187500
+vt 0.765625 1.000000
+vt 0.765625 0.000000
+s 1
+f 5/1/5 16/2/16 478/3/478
+f 1/4/1 8/5/8 9/6/9
+f 478/3/478 17/7/17 6/8/6
+f 476/9/476 9/6/9 10/10/10
+f 6/8/6 18/11/18 479/12/479
+f 2/13/2 10/10/10 11/14/11
+f 479/12/479 19/15/19 480/16/480
+f 477/17/477 11/14/11 12/18/12
+f 480/16/480 20/19/20 481/20/481
+f 3/21/3 12/18/12 13/22/13
+f 481/20/481 21/23/21 482/24/482
+f 3/21/3 14/25/14 4/26/4
+f 474/27/474 82/28/82 7/29/7
+f 308/30/308 482/24/482 21/23/21
+f 4/26/4 15/31/15 5/1/5
+f 475/32/475 7/29/7 8/5/8
+f 7/29/7 82/33/82 22/34/22
+f 308/35/308 21/23/21 36/36/36
+f 14/25/14 30/37/30 15/31/15
+f 7/29/7 23/38/23 8/5/8
+f 15/31/15 31/39/31 16/2/16
+f 8/5/8 24/40/24 9/6/9
+f 16/2/16 32/41/32 17/7/17
+f 9/6/9 25/42/25 10/10/10
+f 17/7/17 33/43/33 18/11/18
+f 10/10/10 26/44/26 11/14/11
+f 19/15/19 33/43/33 34/45/34
+f 11/14/11 27/46/27 12/18/12
+f 20/19/20 34/45/34 35/47/35
+f 13/22/13 27/46/27 28/48/28
+f 20/19/20 36/36/36 21/23/21
+f 13/22/13 29/49/29 14/25/14
+f 25/42/25 41/50/41 26/44/26
+f 34/45/34 48/51/48 49/52/49
+f 26/44/26 42/53/42 27/46/27
+f 34/45/34 50/54/50 35/47/35
+f 27/46/27 43/55/43 28/48/28
+f 35/47/35 51/56/51 36/36/36
+f 28/48/28 44/57/44 29/49/29
+f 22/34/22 82/58/82 37/59/37
+f 308/60/308 36/36/36 51/56/51
+f 30/37/30 44/57/44 45/61/45
+f 22/34/22 38/62/38 23/38/23
+f 30/37/30 46/63/46 31/39/31
+f 23/38/23 39/64/39 24/40/24
+f 32/41/32 46/63/46 47/65/47
+f 24/40/24 40/66/40 25/42/25
+f 33/43/33 47/65/47 48/51/48
+f 44/57/44 60/67/60 45/61/45
+f 37/59/37 53/68/53 38/62/38
+f 45/61/45 61/69/61 46/63/46
+f 38/62/38 54/70/54 39/64/39
+f 47/65/47 61/69/61 62/71/62
+f 39/64/39 55/72/55 40/66/40
+f 47/65/47 63/73/63 48/51/48
+f 40/66/40 56/74/56 41/50/41
+f 48/51/48 64/75/64 49/52/49
+f 41/50/41 57/76/57 42/53/42
+f 49/52/49 65/77/65 50/54/50
+f 43/55/43 57/76/57 58/78/58
+f 50/54/50 66/79/66 51/56/51
+f 44/57/44 58/78/58 59/80/59
+f 37/59/37 82/81/82 52/82/52
+f 308/83/308 51/56/51 66/79/66
+f 63/73/63 79/84/79 64/75/64
+f 56/74/56 72/85/72 57/76/57
+f 65/77/65 79/84/79 80/86/80
+f 58/78/58 72/85/72 73/87/73
+f 65/77/65 81/88/81 66/79/66
+f 59/80/59 73/87/73 74/89/74
+f 52/82/52 82/90/82 67/91/67
+f 308/92/308 66/79/66 81/88/81
+f 59/80/59 75/93/75 60/67/60
+f 52/82/52 68/94/68 53/68/53
+f 60/67/60 76/95/76 61/69/61
+f 53/68/53 69/96/69 54/70/54
+f 62/71/62 76/95/76 77/97/77
+f 54/70/54 70/98/70 55/72/55
+f 62/71/62 78/99/78 63/73/63
+f 56/74/56 70/98/70 71/100/71
+f 75/93/75 92/101/92 76/95/76
+f 68/94/68 85/102/85 69/96/69
+f 77/97/77 92/101/92 93/103/93
+f 69/96/69 86/104/86 70/98/70
+f 77/97/77 94/105/94 78/99/78
+f 71/100/71 86/104/86 87/106/87
+f 78/99/78 95/107/95 79/84/79
+f 71/100/71 88/108/88 72/85/72
+f 79/84/79 96/109/96 80/86/80
+f 73/87/73 88/108/88 89/110/89
+f 81/88/81 96/109/96 97/111/97
+f 74/89/74 89/110/89 90/112/90
+f 67/91/67 82/113/82 83/114/83
+f 308/115/308 81/88/81 97/111/97
+f 74/89/74 91/116/91 75/93/75
+f 67/91/67 84/117/84 68/94/68
+f 96/109/96 110/118/110 111/119/111
+f 89/110/89 103/120/103 104/121/104
+f 96/109/96 112/122/112 97/111/97
+f 90/112/90 104/121/104 105/123/105
+f 83/114/83 82/124/82 98/125/98
+f 308/126/308 97/111/97 112/122/112
+f 90/112/90 106/127/106 91/116/91
+f 84/117/84 98/125/98 99/128/99
+f 91/116/91 107/129/107 92/101/92
+f 84/117/84 100/130/100 85/102/85
+f 93/103/93 107/129/107 108/131/108
+f 85/102/85 101/132/101 86/104/86
+f 93/103/93 109/133/109 94/105/94
+f 87/106/87 101/132/101 102/134/102
+f 95/107/95 109/133/109 110/118/110
+f 87/106/87 103/120/103 88/108/88
+f 99/128/99 115/135/115 100/130/100
+f 108/131/108 122/136/122 123/137/123
+f 100/130/100 116/138/116 101/132/101
+f 108/131/108 124/139/124 109/133/109
+f 102/134/102 116/138/116 117/140/117
+f 110/118/110 124/139/124 125/141/125
+f 102/134/102 118/142/118 103/120/103
+f 110/118/110 126/143/126 111/119/111
+f 104/121/104 118/142/118 119/144/119
+f 111/119/111 127/145/127 112/122/112
+f 105/123/105 119/144/119 120/146/120
+f 98/125/98 82/147/82 113/148/113
+f 308/149/308 112/122/112 127/145/127
+f 105/123/105 121/150/121 106/127/106
+f 99/128/99 113/148/113 114/151/114
+f 106/127/106 122/136/122 107/129/107
+f 119/144/119 133/152/133 134/153/134
+f 126/143/126 142/154/142 127/145/127
+f 120/146/120 134/153/134 135/155/135
+f 113/148/113 82/156/82 128/157/128
+f 308/158/308 127/145/127 142/154/142
+f 120/146/120 136/159/136 121/150/121
+f 113/148/113 129/160/129 114/151/114
+f 121/150/121 137/161/137 122/136/122
+f 114/151/114 130/162/130 115/135/115
+f 123/137/123 137/161/137 138/163/138
+f 115/135/115 131/164/131 116/138/116
+f 123/137/123 139/165/139 124/139/124
+f 117/140/117 131/164/131 132/166/132
+f 125/141/125 139/165/139 140/167/140
+f 117/140/117 133/152/133 118/142/118
+f 125/141/125 141/168/141 126/143/126
+f 138/163/138 152/169/152 153/170/153
+f 130/162/130 146/171/146 131/164/131
+f 138/163/138 154/172/154 139/165/139
+f 132/166/132 146/171/146 147/173/147
+f 140/167/140 154/172/154 155/174/155
+f 132/166/132 148/175/148 133/152/133
+f 140/167/140 156/176/156 141/168/141
+f 134/153/134 148/175/148 149/177/149
+f 142/154/142 156/176/156 157/178/157
+f 135/155/135 149/177/149 150/179/150
+f 128/157/128 82/180/82 143/181/143
+f 308/182/308 142/154/142 157/178/157
+f 135/155/135 151/183/151 136/159/136
+f 128/157/128 144/184/144 129/160/129
+f 136/159/136 152/169/152 137/161/137
+f 130/162/130 144/184/144 145/185/145
+f 156/176/156 172/186/172 157/178/157
+f 150/179/150 164/187/164 165/188/165
+f 143/181/143 82/189/82 158/190/158
+f 308/191/308 157/178/157 172/186/172
+f 150/179/150 166/192/166 151/183/151
+f 143/181/143 159/193/159 144/184/144
+f 151/183/151 167/194/167 152/169/152
+f 145/185/145 159/193/159 160/195/160
+f 153/170/153 167/194/167 168/196/168
+f 145/185/145 161/197/161 146/171/146
+f 153/170/153 169/198/169 154/172/154
+f 147/173/147 161/197/161 162/199/162
+f 155/174/155 169/198/169 170/200/170
+f 147/173/147 163/201/163 148/175/148
+f 155/174/155 171/202/171 156/176/156
+f 149/177/149 163/201/163 164/187/164
+f 160/195/160 176/203/176 161/197/161
+f 168/196/168 184/204/184 169/198/169
+f 162/199/162 176/203/176 177/205/177
+f 169/198/169 185/206/185 170/200/170
+f 162/199/162 178/207/178 163/201/163
+f 171/202/171 185/206/185 186/208/186
+f 164/187/164 178/207/178 179/209/179
+f 172/186/172 186/208/186 187/210/187
+f 165/188/165 179/209/179 180/211/180
+f 158/190/158 82/212/82 173/213/173
+f 308/214/308 172/186/172 187/210/187
+f 165/188/165 181/215/181 166/192/166
+f 158/190/158 174/216/174 159/193/159
+f 166/192/166 182/217/182 167/194/167
+f 159/193/159 175/218/175 160/195/160
+f 168/196/168 182/217/182 183/219/183
+f 180/211/180 194/220/194 195/221/195
+f 173/213/173 82/222/82 188/223/188
+f 308/224/308 187/210/187 202/225/202
+f 180/211/180 196/226/196 181/215/181
+f 174/216/174 188/223/188 189/227/189
+f 181/215/181 197/228/197 182/217/182
+f 175/218/175 189/227/189 190/229/190
+f 183/219/183 197/228/197 198/230/198
+f 175/218/175 191/231/191 176/203/176
+f 183/219/183 199/232/199 184/204/184
+f 177/205/177 191/231/191 192/233/192
+f 185/206/185 199/232/199 200/234/200
+f 177/205/177 193/235/193 178/207/178
+f 185/206/185 201/236/201 186/208/186
+f 179/209/179 193/235/193 194/220/194
+f 186/208/186 202/225/202 187/210/187
+f 198/230/198 214/237/214 199/232/199
+f 192/233/192 206/238/206 207/239/207
+f 200/234/200 214/237/214 215/240/215
+f 192/233/192 208/241/208 193/235/193
+f 200/234/200 216/242/216 201/236/201
+f 194/220/194 208/241/208 209/243/209
+f 201/236/201 217/244/217 202/225/202
+f 195/221/195 209/243/209 210/245/210
+f 188/223/188 82/246/82 203/247/203
+f 308/248/308 202/225/202 217/244/217
+f 195/221/195 211/249/211 196/226/196
+f 188/223/188 204/250/204 189/227/189
+f 196/226/196 212/251/212 197/228/197
+f 189/227/189 205/252/205 190/229/190
+f 198/230/198 212/251/212 213/253/213
+f 190/229/190 206/238/206 191/231/191
+f 308/254/308 217/244/217 232/255/232
+f 210/245/210 226/256/226 211/249/211
+f 203/247/203 219/257/219 204/250/204
+f 211/249/211 227/258/227 212/251/212
+f 204/250/204 220/259/220 205/252/205
+f 213/253/213 227/258/227 228/260/228
+f 205/252/205 221/261/221 206/238/206
+f 213/253/213 229/262/229 214/237/214
+f 207/239/207 221/261/221 222/263/222
+f 215/240/215 229/262/229 230/264/230
+f 207/239/207 223/265/223 208/241/208
+f 215/240/215 231/266/231 216/242/216
+f 209/243/209 223/265/223 224/267/224
+f 216/242/216 232/255/232 217/244/217
+f 210/245/210 224/267/224 225/268/225
+f 203/247/203 82/269/82 218/270/218
+f 230/264/230 244/271/244 245/272/245
+f 222/263/222 238/273/238 223/265/223
+f 230/264/230 246/274/246 231/266/231
+f 224/267/224 238/273/238 239/275/239
+f 232/255/232 246/274/246 247/276/247
+f 225/268/225 239/275/239 240/277/240
+f 218/270/218 82/278/82 233/279/233
+f 308/280/308 232/255/232 247/276/247
+f 225/268/225 241/281/241 226/256/226
+f 218/270/218 234/282/234 219/257/219
+f 226/256/226 242/283/242 227/258/227
+f 220/259/220 234/282/234 235/284/235
+f 228/260/228 242/283/242 243/285/243
+f 220/259/220 236/286/236 221/261/221
+f 228/260/228 244/271/244 229/262/229
+f 222/263/222 236/286/236 237/287/237
+f 233/279/233 249/288/249 234/282/234
+f 241/281/241 257/289/257 242/283/242
+f 234/282/234 250/290/250 235/284/235
+f 243/285/243 257/289/257 258/291/258
+f 235/284/235 251/292/251 236/286/236
+f 243/285/243 259/293/259 244/271/244
+f 237/287/237 251/292/251 252/294/252
+f 245/272/245 259/293/259 260/295/260
+f 237/287/237 253/296/253 238/273/238
+f 245/272/245 261/297/261 246/274/246
+f 239/275/239 253/296/253 254/298/254
+f 246/274/246 262/299/262 247/276/247
+f 240/277/240 254/298/254 255/300/255
+f 233/279/233 82/301/82 248/302/248
+f 308/303/308 247/276/247 262/299/262
+f 240/277/240 256/304/256 241/281/241
+f 252/294/252 268/305/268 253/296/253
+f 260/295/260 276/306/276 261/297/261
+f 254/298/254 268/305/268 269/307/269
+f 261/297/261 277/308/277 262/299/262
+f 255/300/255 269/307/269 270/309/270
+f 248/302/248 82/310/82 263/311/263
+f 308/312/308 262/299/262 277/308/277
+f 255/300/255 271/313/271 256/304/256
+f 249/288/249 263/311/263 264/314/264
+f 256/304/256 272/315/272 257/289/257
+f 249/288/249 265/316/265 250/290/250
+f 258/291/258 272/315/272 273/317/273
+f 250/290/250 266/318/266 251/292/251
+f 258/291/258 274/319/274 259/293/259
+f 252/294/252 266/318/266 267/320/267
+f 260/295/260 274/319/274 275/321/275
+f 271/313/271 287/322/287 272/315/272
+f 264/314/264 280/323/280 265/316/265
+f 273/317/273 287/322/287 288/324/288
+f 265/316/265 281/325/281 266/318/266
+f 273/317/273 289/326/289 274/319/274
+f 267/320/267 281/325/281 282/327/282
+f 275/321/275 289/326/289 290/328/290
+f 267/320/267 283/329/283 268/305/268
+f 275/321/275 291/330/291 276/306/276
+f 269/307/269 283/329/283 284/331/284
+f 277/308/277 291/330/291 292/332/292
+f 270/309/270 284/331/284 285/333/285
+f 263/311/263 82/334/82 278/335/278
+f 308/336/308 277/308/277 292/332/292
+f 270/309/270 286/337/286 271/313/271
+f 264/314/264 278/335/278 279/338/279
+f 290/328/290 306/339/306 291/330/291
+f 284/331/284 298/340/298 299/341/299
+f 292/332/292 306/339/306 307/342/307
+f 285/333/285 299/341/299 300/343/300
+f 278/335/278 82/344/82 293/345/293
+f 308/346/308 292/332/292 307/342/307
+f 285/333/285 301/347/301 286/337/286
+f 278/335/278 294/348/294 279/338/279
+f 286/337/286 302/349/302 287/322/287
+f 279/338/279 295/350/295 280/323/280
+f 288/324/288 302/349/302 303/351/303
+f 280/323/280 296/352/296 281/325/281
+f 288/324/288 304/353/304 289/326/289
+f 282/327/282 296/352/296 297/354/297
+f 290/328/290 304/353/304 305/355/305
+f 282/327/282 298/340/298 283/329/283
+f 294/348/294 311/356/311 295/350/295
+f 303/351/303 318/357/318 319/358/319
+f 295/350/295 312/359/312 296/352/296
+f 303/351/303 320/360/320 304/353/304
+f 297/354/297 312/359/312 313/361/313
+f 305/355/305 320/360/320 321/362/321
+f 297/354/297 314/363/314 298/340/298
+f 305/355/305 322/364/322 306/339/306
+f 299/341/299 314/363/314 315/365/315
+f 306/339/306 323/366/323 307/342/307
+f 300/343/300 315/365/315 316/367/316
+f 293/345/293 82/368/82 309/369/309
+f 308/370/308 307/342/307 323/366/323
+f 300/343/300 317/371/317 301/347/301
+f 293/345/293 310/372/310 294/348/294
+f 301/347/301 318/357/318 302/349/302
+f 315/365/315 329/373/329 330/374/330
+f 322/364/322 338/375/338 323/366/323
+f 316/367/316 330/374/330 331/376/331
+f 309/369/309 82/377/82 324/378/324
+f 308/379/308 323/366/323 338/375/338
+f 316/367/316 332/380/332 317/371/317
+f 309/369/309 325/381/325 310/372/310
+f 317/371/317 333/382/333 318/357/318
+f 310/372/310 326/383/326 311/356/311
+f 319/358/319 333/382/333 334/384/334
+f 311/356/311 327/385/327 312/359/312
+f 319/358/319 335/386/335 320/360/320
+f 312/359/312 328/387/328 313/361/313
+f 321/362/321 335/386/335 336/388/336
+f 313/361/313 329/373/329 314/363/314
+f 321/362/321 337/389/337 322/364/322
+f 334/384/334 348/390/348 349/391/349
+f 326/383/326 342/392/342 327/385/327
+f 334/384/334 350/393/350 335/386/335
+f 328/387/328 342/392/342 343/394/343
+f 336/388/336 350/393/350 351/395/351
+f 328/387/328 344/396/344 329/373/329
+f 336/388/336 352/397/352 337/389/337
+f 330/374/330 344/396/344 345/398/345
+f 337/389/337 353/399/353 338/375/338
+f 331/376/331 345/398/345 346/400/346
+f 324/378/324 82/401/82 339/402/339
+f 308/403/308 338/375/338 353/399/353
+f 331/376/331 347/404/347 332/380/332
+f 324/378/324 340/405/340 325/381/325
+f 332/380/332 348/390/348 333/382/333
+f 325/381/325 341/406/341 326/383/326
+f 352/397/352 368/407/368 353/399/353
+f 346/400/346 360/408/360 361/409/361
+f 339/402/339 82/410/82 354/411/354
+f 308/412/308 353/399/353 368/407/368
+f 346/400/346 362/413/362 347/404/347
+f 339/402/339 355/414/355 340/405/340
+f 347/404/347 363/415/363 348/390/348
+f 341/406/341 355/414/355 356/416/356
+f 349/391/349 363/415/363 364/417/364
+f 341/406/341 357/418/357 342/392/342
+f 349/391/349 365/419/365 350/393/350
+f 343/394/343 357/418/357 358/420/358
+f 351/395/351 365/419/365 366/421/366
+f 343/394/343 359/422/359 344/396/344
+f 351/395/351 367/423/367 352/397/352
+f 345/398/345 359/422/359 360/408/360
+f 364/424/364 380/425/380 365/426/365
+f 358/427/358 372/428/372 373/429/373
+f 366/430/366 380/425/380 381/431/381
+f 358/427/358 374/432/374 359/433/359
+f 366/430/366 382/434/382 367/435/367
+f 360/436/360 374/432/374 375/437/375
+f 367/435/367 383/438/383 368/439/368
+f 361/440/361 375/437/375 376/441/376
+f 354/442/354 82/443/82 369/444/369
+f 308/445/308 368/439/368 383/438/383
+f 361/440/361 377/446/377 362/447/362
+f 354/442/354 370/448/370 355/449/355
+f 362/447/362 378/450/378 363/451/363
+f 356/452/356 370/448/370 371/453/371
+f 364/424/364 378/450/378 379/454/379
+f 356/452/356 372/428/372 357/455/357
+f 369/444/369 82/456/82 384/457/384
+f 308/458/308 383/438/383 398/459/398
+f 376/441/376 392/460/392 377/446/377
+f 369/444/369 385/461/385 370/448/370
+f 377/446/377 393/462/393 378/450/378
+f 371/453/371 385/461/385 386/463/386
+f 379/454/379 393/462/393 394/464/394
+f 371/453/371 387/465/387 372/428/372
+f 379/454/379 395/466/395 380/425/380
+f 373/429/373 387/465/387 388/467/388
+f 381/431/381 395/466/395 396/468/396
+f 373/429/373 389/469/389 374/432/374
+f 381/431/381 397/470/397 382/434/382
+f 375/437/375 389/469/389 390/471/390
+f 382/434/382 398/459/398 383/438/383
+f 376/441/376 390/471/390 391/472/391
+f 388/467/388 402/473/402 403/474/403
+f 396/468/396 410/475/410 411/476/411
+f 388/467/388 404/477/404 389/469/389
+f 397/470/397 411/476/411 412/478/412
+f 390/471/390 404/477/404 405/479/405
+f 397/470/397 413/480/413 398/459/398
+f 391/472/391 405/479/405 406/481/406
+f 384/457/384 82/482/82 399/483/399
+f 308/484/308 398/459/398 413/480/413
+f 391/472/391 407/485/407 392/460/392
+f 385/461/385 399/483/399 400/486/400
+f 392/460/392 408/487/408 393/462/393
+f 385/461/385 401/488/401 386/463/386
+f 394/464/394 408/487/408 409/489/409
+f 386/463/386 402/473/402 387/465/387
+f 394/464/394 410/475/410 395/466/395
+f 406/481/406 422/490/422 407/485/407
+f 399/483/399 415/491/415 400/486/400
+f 407/485/407 423/492/423 408/487/408
+f 401/488/401 415/491/415 416/493/416
+f 409/489/409 423/492/423 424/494/424
+f 401/488/401 417/495/417 402/473/402
+f 409/489/409 425/496/425 410/475/410
+f 403/474/403 417/495/417 418/497/418
+f 411/476/411 425/496/425 426/498/426
+f 403/474/403 419/499/419 404/477/404
+f 411/476/411 427/500/427 412/478/412
+f 405/479/405 419/499/419 420/501/420
+f 412/478/412 428/502/428 413/480/413
+f 406/481/406 420/501/420 421/503/421
+f 399/483/399 82/504/82 414/505/414
+f 308/506/308 413/480/413 428/502/428
+f 426/498/426 440/507/440 441/508/441
+f 418/497/418 434/509/434 419/499/419
+f 426/498/426 442/510/442 427/500/427
+f 420/501/420 434/509/434 435/511/435
+f 427/500/427 443/512/443 428/502/428
+f 421/503/421 435/511/435 436/513/436
+f 414/505/414 82/514/82 429/515/429
+f 308/516/308 428/502/428 443/512/443
+f 421/503/421 437/517/437 422/490/422
+f 414/505/414 430/518/430 415/491/415
+f 422/490/422 438/519/438 423/492/423
+f 416/493/416 430/518/430 431/520/431
+f 424/494/424 438/519/438 439/521/439
+f 416/493/416 432/522/432 417/495/417
+f 424/494/424 440/507/440 425/496/425
+f 418/497/418 432/522/432 433/523/433
+f 430/518/430 444/524/444 445/525/445
+f 437/517/437 453/526/453 438/519/438
+f 430/518/430 446/527/446 431/520/431
+f 439/521/439 453/526/453 454/528/454
+f 431/520/431 447/529/447 432/522/432
+f 439/521/439 455/530/455 440/507/440
+f 433/523/433 447/529/447 448/531/448
+f 441/508/441 455/530/455 456/532/456
+f 433/523/433 449/533/449 434/509/434
+f 441/508/441 457/534/457 442/510/442
+f 435/511/435 449/533/449 450/535/450
+f 442/510/442 458/536/458 443/512/443
+f 436/513/436 450/535/450 451/537/451
+f 429/515/429 82/538/82 444/524/444
+f 308/539/308 443/512/443 458/536/458
+f 436/513/436 452/540/452 437/517/437
+f 448/531/448 464/541/464 449/533/449
+f 456/532/456 472/542/472 457/534/457
+f 450/535/450 464/541/464 465/543/465
+f 458/536/458 472/542/472 473/544/473
+f 451/537/451 465/543/465 466/545/466
+f 444/524/444 82/546/82 459/547/459
+f 308/548/308 458/536/458 473/544/473
+f 451/537/451 467/549/467 452/540/452
+f 444/524/444 460/550/460 445/525/445
+f 452/540/452 468/551/468 453/526/453
+f 446/527/446 460/550/460 461/552/461
+f 454/528/454 468/551/468 469/553/469
+f 446/527/446 462/554/462 447/529/447
+f 454/528/454 470/555/470 455/530/455
+f 448/531/448 462/554/462 463/556/463
+f 456/532/456 470/555/470 471/557/471
+f 467/549/467 478/3/478 468/551/468
+f 461/552/461 475/32/475 1/4/1
+f 468/551/468 6/8/6 469/553/469
+f 462/554/462 1/4/1 476/9/476
+f 469/553/469 479/12/479 470/555/470
+f 463/556/463 476/9/476 2/13/2
+f 471/557/471 479/12/479 480/16/480
+f 464/541/464 2/13/2 477/17/477
+f 471/557/471 481/20/481 472/542/472
+f 465/543/465 477/17/477 3/21/3
+f 472/542/472 482/24/482 473/544/473
+f 466/545/466 3/21/3 4/26/4
+f 459/547/459 82/558/82 474/27/474
+f 308/559/308 473/544/473 482/24/482
+f 466/545/466 5/1/5 467/549/467
+f 460/550/460 474/27/474 475/32/475
+f 5/1/5 15/31/15 16/2/16
+f 1/4/1 475/32/475 8/5/8
+f 478/3/478 16/2/16 17/7/17
+f 476/9/476 1/4/1 9/6/9
+f 6/8/6 17/7/17 18/11/18
+f 2/13/2 476/9/476 10/10/10
+f 479/12/479 18/11/18 19/15/19
+f 477/17/477 2/13/2 11/14/11
+f 480/16/480 19/15/19 20/19/20
+f 3/21/3 477/17/477 12/18/12
+f 481/20/481 20/19/20 21/23/21
+f 3/21/3 13/22/13 14/25/14
+f 4/26/4 14/25/14 15/31/15
+f 475/32/475 474/27/474 7/29/7
+f 14/25/14 29/49/29 30/37/30
+f 7/29/7 22/34/22 23/38/23
+f 15/31/15 30/37/30 31/39/31
+f 8/5/8 23/38/23 24/40/24
+f 16/2/16 31/39/31 32/41/32
+f 9/6/9 24/40/24 25/42/25
+f 17/7/17 32/41/32 33/43/33
+f 10/10/10 25/42/25 26/44/26
+f 19/15/19 18/11/18 33/43/33
+f 11/14/11 26/44/26 27/46/27
+f 20/19/20 19/15/19 34/45/34
+f 13/22/13 12/18/12 27/46/27
+f 20/19/20 35/47/35 36/36/36
+f 13/22/13 28/48/28 29/49/29
+f 25/42/25 40/66/40 41/50/41
+f 34/45/34 33/43/33 48/51/48
+f 26/44/26 41/50/41 42/53/42
+f 34/45/34 49/52/49 50/54/50
+f 27/46/27 42/53/42 43/55/43
+f 35/47/35 50/54/50 51/56/51
+f 28/48/28 43/55/43 44/57/44
+f 30/37/30 29/49/29 44/57/44
+f 22/34/22 37/59/37 38/62/38
+f 30/37/30 45/61/45 46/63/46
+f 23/38/23 38/62/38 39/64/39
+f 32/41/32 31/39/31 46/63/46
+f 24/40/24 39/64/39 40/66/40
+f 33/43/33 32/41/32 47/65/47
+f 44/57/44 59/80/59 60/67/60
+f 37/59/37 52/82/52 53/68/53
+f 45/61/45 60/67/60 61/69/61
+f 38/62/38 53/68/53 54/70/54
+f 47/65/47 46/63/46 61/69/61
+f 39/64/39 54/70/54 55/72/55
+f 47/65/47 62/71/62 63/73/63
+f 40/66/40 55/72/55 56/74/56
+f 48/51/48 63/73/63 64/75/64
+f 41/50/41 56/74/56 57/76/57
+f 49/52/49 64/75/64 65/77/65
+f 43/55/43 42/53/42 57/76/57
+f 50/54/50 65/77/65 66/79/66
+f 44/57/44 43/55/43 58/78/58
+f 63/73/63 78/99/78 79/84/79
+f 56/74/56 71/100/71 72/85/72
+f 65/77/65 64/75/64 79/84/79
+f 58/78/58 57/76/57 72/85/72
+f 65/77/65 80/86/80 81/88/81
+f 59/80/59 58/78/58 73/87/73
+f 59/80/59 74/89/74 75/93/75
+f 52/82/52 67/91/67 68/94/68
+f 60/67/60 75/93/75 76/95/76
+f 53/68/53 68/94/68 69/96/69
+f 62/71/62 61/69/61 76/95/76
+f 54/70/54 69/96/69 70/98/70
+f 62/71/62 77/97/77 78/99/78
+f 56/74/56 55/72/55 70/98/70
+f 75/93/75 91/116/91 92/101/92
+f 68/94/68 84/117/84 85/102/85
+f 77/97/77 76/95/76 92/101/92
+f 69/96/69 85/102/85 86/104/86
+f 77/97/77 93/103/93 94/105/94
+f 71/100/71 70/98/70 86/104/86
+f 78/99/78 94/105/94 95/107/95
+f 71/100/71 87/106/87 88/108/88
+f 79/84/79 95/107/95 96/109/96
+f 73/87/73 72/85/72 88/108/88
+f 81/88/81 80/86/80 96/109/96
+f 74/89/74 73/87/73 89/110/89
+f 74/89/74 90/112/90 91/116/91
+f 67/91/67 83/114/83 84/117/84
+f 96/109/96 95/107/95 110/118/110
+f 89/110/89 88/108/88 103/120/103
+f 96/109/96 111/119/111 112/122/112
+f 90/112/90 89/110/89 104/121/104
+f 90/112/90 105/123/105 106/127/106
+f 84/117/84 83/114/83 98/125/98
+f 91/116/91 106/127/106 107/129/107
+f 84/117/84 99/128/99 100/130/100
+f 93/103/93 92/101/92 107/129/107
+f 85/102/85 100/130/100 101/132/101
+f 93/103/93 108/131/108 109/133/109
+f 87/106/87 86/104/86 101/132/101
+f 95/107/95 94/105/94 109/133/109
+f 87/106/87 102/134/102 103/120/103
+f 99/128/99 114/151/114 115/135/115
+f 108/131/108 107/129/107 122/136/122
+f 100/130/100 115/135/115 116/138/116
+f 108/131/108 123/137/123 124/139/124
+f 102/134/102 101/132/101 116/138/116
+f 110/118/110 109/133/109 124/139/124
+f 102/134/102 117/140/117 118/142/118
+f 110/118/110 125/141/125 126/143/126
+f 104/121/104 103/120/103 118/142/118
+f 111/119/111 126/143/126 127/145/127
+f 105/123/105 104/121/104 119/144/119
+f 105/123/105 120/146/120 121/150/121
+f 99/128/99 98/125/98 113/148/113
+f 106/127/106 121/150/121 122/136/122
+f 119/144/119 118/142/118 133/152/133
+f 126/143/126 141/168/141 142/154/142
+f 120/146/120 119/144/119 134/153/134
+f 120/146/120 135/155/135 136/159/136
+f 113/148/113 128/157/128 129/160/129
+f 121/150/121 136/159/136 137/161/137
+f 114/151/114 129/160/129 130/162/130
+f 123/137/123 122/136/122 137/161/137
+f 115/135/115 130/162/130 131/164/131
+f 123/137/123 138/163/138 139/165/139
+f 117/140/117 116/138/116 131/164/131
+f 125/141/125 124/139/124 139/165/139
+f 117/140/117 132/166/132 133/152/133
+f 125/141/125 140/167/140 141/168/141
+f 138/163/138 137/161/137 152/169/152
+f 130/162/130 145/185/145 146/171/146
+f 138/163/138 153/170/153 154/172/154
+f 132/166/132 131/164/131 146/171/146
+f 140/167/140 139/165/139 154/172/154
+f 132/166/132 147/173/147 148/175/148
+f 140/167/140 155/174/155 156/176/156
+f 134/153/134 133/152/133 148/175/148
+f 142/154/142 141/168/141 156/176/156
+f 135/155/135 134/153/134 149/177/149
+f 135/155/135 150/179/150 151/183/151
+f 128/157/128 143/181/143 144/184/144
+f 136/159/136 151/183/151 152/169/152
+f 130/162/130 129/160/129 144/184/144
+f 156/176/156 171/202/171 172/186/172
+f 150/179/150 149/177/149 164/187/164
+f 150/179/150 165/188/165 166/192/166
+f 143/181/143 158/190/158 159/193/159
+f 151/183/151 166/192/166 167/194/167
+f 145/185/145 144/184/144 159/193/159
+f 153/170/153 152/169/152 167/194/167
+f 145/185/145 160/195/160 161/197/161
+f 153/170/153 168/196/168 169/198/169
+f 147/173/147 146/171/146 161/197/161
+f 155/174/155 154/172/154 169/198/169
+f 147/173/147 162/199/162 163/201/163
+f 155/174/155 170/200/170 171/202/171
+f 149/177/149 148/175/148 163/201/163
+f 160/195/160 175/218/175 176/203/176
+f 168/196/168 183/219/183 184/204/184
+f 162/199/162 161/197/161 176/203/176
+f 169/198/169 184/204/184 185/206/185
+f 162/199/162 177/205/177 178/207/178
+f 171/202/171 170/200/170 185/206/185
+f 164/187/164 163/201/163 178/207/178
+f 172/186/172 171/202/171 186/208/186
+f 165/188/165 164/187/164 179/209/179
+f 165/188/165 180/211/180 181/215/181
+f 158/190/158 173/213/173 174/216/174
+f 166/192/166 181/215/181 182/217/182
+f 159/193/159 174/216/174 175/218/175
+f 168/196/168 167/194/167 182/217/182
+f 180/211/180 179/209/179 194/220/194
+f 180/211/180 195/221/195 196/226/196
+f 174/216/174 173/213/173 188/223/188
+f 181/215/181 196/226/196 197/228/197
+f 175/218/175 174/216/174 189/227/189
+f 183/219/183 182/217/182 197/228/197
+f 175/218/175 190/229/190 191/231/191
+f 183/219/183 198/230/198 199/232/199
+f 177/205/177 176/203/176 191/231/191
+f 185/206/185 184/204/184 199/232/199
+f 177/205/177 192/233/192 193/235/193
+f 185/206/185 200/234/200 201/236/201
+f 179/209/179 178/207/178 193/235/193
+f 186/208/186 201/236/201 202/225/202
+f 198/230/198 213/253/213 214/237/214
+f 192/233/192 191/231/191 206/238/206
+f 200/234/200 199/232/199 214/237/214
+f 192/233/192 207/239/207 208/241/208
+f 200/234/200 215/240/215 216/242/216
+f 194/220/194 193/235/193 208/241/208
+f 201/236/201 216/242/216 217/244/217
+f 195/221/195 194/220/194 209/243/209
+f 195/221/195 210/245/210 211/249/211
+f 188/223/188 203/247/203 204/250/204
+f 196/226/196 211/249/211 212/251/212
+f 189/227/189 204/250/204 205/252/205
+f 198/230/198 197/228/197 212/251/212
+f 190/229/190 205/252/205 206/238/206
+f 210/245/210 225/268/225 226/256/226
+f 203/247/203 218/270/218 219/257/219
+f 211/249/211 226/256/226 227/258/227
+f 204/250/204 219/257/219 220/259/220
+f 213/253/213 212/251/212 227/258/227
+f 205/252/205 220/259/220 221/261/221
+f 213/253/213 228/260/228 229/262/229
+f 207/239/207 206/238/206 221/261/221
+f 215/240/215 214/237/214 229/262/229
+f 207/239/207 222/263/222 223/265/223
+f 215/240/215 230/264/230 231/266/231
+f 209/243/209 208/241/208 223/265/223
+f 216/242/216 231/266/231 232/255/232
+f 210/245/210 209/243/209 224/267/224
+f 230/264/230 229/262/229 244/271/244
+f 222/263/222 237/287/237 238/273/238
+f 230/264/230 245/272/245 246/274/246
+f 224/267/224 223/265/223 238/273/238
+f 232/255/232 231/266/231 246/274/246
+f 225/268/225 224/267/224 239/275/239
+f 225/268/225 240/277/240 241/281/241
+f 218/270/218 233/279/233 234/282/234
+f 226/256/226 241/281/241 242/283/242
+f 220/259/220 219/257/219 234/282/234
+f 228/260/228 227/258/227 242/283/242
+f 220/259/220 235/284/235 236/286/236
+f 228/260/228 243/285/243 244/271/244
+f 222/263/222 221/261/221 236/286/236
+f 233/279/233 248/302/248 249/288/249
+f 241/281/241 256/304/256 257/289/257
+f 234/282/234 249/288/249 250/290/250
+f 243/285/243 242/283/242 257/289/257
+f 235/284/235 250/290/250 251/292/251
+f 243/285/243 258/291/258 259/293/259
+f 237/287/237 236/286/236 251/292/251
+f 245/272/245 244/271/244 259/293/259
+f 237/287/237 252/294/252 253/296/253
+f 245/272/245 260/295/260 261/297/261
+f 239/275/239 238/273/238 253/296/253
+f 246/274/246 261/297/261 262/299/262
+f 240/277/240 239/275/239 254/298/254
+f 240/277/240 255/300/255 256/304/256
+f 252/294/252 267/320/267 268/305/268
+f 260/295/260 275/321/275 276/306/276
+f 254/298/254 253/296/253 268/305/268
+f 261/297/261 276/306/276 277/308/277
+f 255/300/255 254/298/254 269/307/269
+f 255/300/255 270/309/270 271/313/271
+f 249/288/249 248/302/248 263/311/263
+f 256/304/256 271/313/271 272/315/272
+f 249/288/249 264/314/264 265/316/265
+f 258/291/258 257/289/257 272/315/272
+f 250/290/250 265/316/265 266/318/266
+f 258/291/258 273/317/273 274/319/274
+f 252/294/252 251/292/251 266/318/266
+f 260/295/260 259/293/259 274/319/274
+f 271/313/271 286/337/286 287/322/287
+f 264/314/264 279/338/279 280/323/280
+f 273/317/273 272/315/272 287/322/287
+f 265/316/265 280/323/280 281/325/281
+f 273/317/273 288/324/288 289/326/289
+f 267/320/267 266/318/266 281/325/281
+f 275/321/275 274/319/274 289/326/289
+f 267/320/267 282/327/282 283/329/283
+f 275/321/275 290/328/290 291/330/291
+f 269/307/269 268/305/268 283/329/283
+f 277/308/277 276/306/276 291/330/291
+f 270/309/270 269/307/269 284/331/284
+f 270/309/270 285/333/285 286/337/286
+f 264/314/264 263/311/263 278/335/278
+f 290/328/290 305/355/305 306/339/306
+f 284/331/284 283/329/283 298/340/298
+f 292/332/292 291/330/291 306/339/306
+f 285/333/285 284/331/284 299/341/299
+f 285/333/285 300/343/300 301/347/301
+f 278/335/278 293/345/293 294/348/294
+f 286/337/286 301/347/301 302/349/302
+f 279/338/279 294/348/294 295/350/295
+f 288/324/288 287/322/287 302/349/302
+f 280/323/280 295/350/295 296/352/296
+f 288/324/288 303/351/303 304/353/304
+f 282/327/282 281/325/281 296/352/296
+f 290/328/290 289/326/289 304/353/304
+f 282/327/282 297/354/297 298/340/298
+f 294/348/294 310/372/310 311/356/311
+f 303/351/303 302/349/302 318/357/318
+f 295/350/295 311/356/311 312/359/312
+f 303/351/303 319/358/319 320/360/320
+f 297/354/297 296/352/296 312/359/312
+f 305/355/305 304/353/304 320/360/320
+f 297/354/297 313/361/313 314/363/314
+f 305/355/305 321/362/321 322/364/322
+f 299/341/299 298/340/298 314/363/314
+f 306/339/306 322/364/322 323/366/323
+f 300/343/300 299/341/299 315/365/315
+f 300/343/300 316/367/316 317/371/317
+f 293/345/293 309/369/309 310/372/310
+f 301/347/301 317/371/317 318/357/318
+f 315/365/315 314/363/314 329/373/329
+f 322/364/322 337/389/337 338/375/338
+f 316/367/316 315/365/315 330/374/330
+f 316/367/316 331/376/331 332/380/332
+f 309/369/309 324/378/324 325/381/325
+f 317/371/317 332/380/332 333/382/333
+f 310/372/310 325/381/325 326/383/326
+f 319/358/319 318/357/318 333/382/333
+f 311/356/311 326/383/326 327/385/327
+f 319/358/319 334/384/334 335/386/335
+f 312/359/312 327/385/327 328/387/328
+f 321/362/321 320/360/320 335/386/335
+f 313/361/313 328/387/328 329/373/329
+f 321/362/321 336/388/336 337/389/337
+f 334/384/334 333/382/333 348/390/348
+f 326/383/326 341/406/341 342/392/342
+f 334/384/334 349/391/349 350/393/350
+f 328/387/328 327/385/327 342/392/342
+f 336/388/336 335/386/335 350/393/350
+f 328/387/328 343/394/343 344/396/344
+f 336/388/336 351/395/351 352/397/352
+f 330/374/330 329/373/329 344/396/344
+f 337/389/337 352/397/352 353/399/353
+f 331/376/331 330/374/330 345/398/345
+f 331/376/331 346/400/346 347/404/347
+f 324/378/324 339/402/339 340/405/340
+f 332/380/332 347/404/347 348/390/348
+f 325/381/325 340/405/340 341/406/341
+f 352/397/352 367/423/367 368/407/368
+f 346/400/346 345/398/345 360/408/360
+f 346/400/346 361/409/361 362/413/362
+f 339/402/339 354/411/354 355/414/355
+f 347/404/347 362/413/362 363/415/363
+f 341/406/341 340/405/340 355/414/355
+f 349/391/349 348/390/348 363/415/363
+f 341/406/341 356/416/356 357/418/357
+f 349/391/349 364/417/364 365/419/365
+f 343/394/343 342/392/342 357/418/357
+f 351/395/351 350/393/350 365/419/365
+f 343/394/343 358/420/358 359/422/359
+f 351/395/351 366/421/366 367/423/367
+f 345/398/345 344/396/344 359/422/359
+f 364/424/364 379/454/379 380/425/380
+f 358/427/358 357/455/357 372/428/372
+f 366/430/366 365/426/365 380/425/380
+f 358/427/358 373/429/373 374/432/374
+f 366/430/366 381/431/381 382/434/382
+f 360/436/360 359/433/359 374/432/374
+f 367/435/367 382/434/382 383/438/383
+f 361/440/361 360/436/360 375/437/375
+f 361/440/361 376/441/376 377/446/377
+f 354/442/354 369/444/369 370/448/370
+f 362/447/362 377/446/377 378/450/378
+f 356/452/356 355/449/355 370/448/370
+f 364/424/364 363/451/363 378/450/378
+f 356/452/356 371/453/371 372/428/372
+f 376/441/376 391/472/391 392/460/392
+f 369/444/369 384/457/384 385/461/385
+f 377/446/377 392/460/392 393/462/393
+f 371/453/371 370/448/370 385/461/385
+f 379/454/379 378/450/378 393/462/393
+f 371/453/371 386/463/386 387/465/387
+f 379/454/379 394/464/394 395/466/395
+f 373/429/373 372/428/372 387/465/387
+f 381/431/381 380/425/380 395/466/395
+f 373/429/373 388/467/388 389/469/389
+f 381/431/381 396/468/396 397/470/397
+f 375/437/375 374/432/374 389/469/389
+f 382/434/382 397/470/397 398/459/398
+f 376/441/376 375/437/375 390/471/390
+f 388/467/388 387/465/387 402/473/402
+f 396/468/396 395/466/395 410/475/410
+f 388/467/388 403/474/403 404/477/404
+f 397/470/397 396/468/396 411/476/411
+f 390/471/390 389/469/389 404/477/404
+f 397/470/397 412/478/412 413/480/413
+f 391/472/391 390/471/390 405/479/405
+f 391/472/391 406/481/406 407/485/407
+f 385/461/385 384/457/384 399/483/399
+f 392/460/392 407/485/407 408/487/408
+f 385/461/385 400/486/400 401/488/401
+f 394/464/394 393/462/393 408/487/408
+f 386/463/386 401/488/401 402/473/402
+f 394/464/394 409/489/409 410/475/410
+f 406/481/406 421/503/421 422/490/422
+f 399/483/399 414/505/414 415/491/415
+f 407/485/407 422/490/422 423/492/423
+f 401/488/401 400/486/400 415/491/415
+f 409/489/409 408/487/408 423/492/423
+f 401/488/401 416/493/416 417/495/417
+f 409/489/409 424/494/424 425/496/425
+f 403/474/403 402/473/402 417/495/417
+f 411/476/411 410/475/410 425/496/425
+f 403/474/403 418/497/418 419/499/419
+f 411/476/411 426/498/426 427/500/427
+f 405/479/405 404/477/404 419/499/419
+f 412/478/412 427/500/427 428/502/428
+f 406/481/406 405/479/405 420/501/420
+f 426/498/426 425/496/425 440/507/440
+f 418/497/418 433/523/433 434/509/434
+f 426/498/426 441/508/441 442/510/442
+f 420/501/420 419/499/419 434/509/434
+f 427/500/427 442/510/442 443/512/443
+f 421/503/421 420/501/420 435/511/435
+f 421/503/421 436/513/436 437/517/437
+f 414/505/414 429/515/429 430/518/430
+f 422/490/422 437/517/437 438/519/438
+f 416/493/416 415/491/415 430/518/430
+f 424/494/424 423/492/423 438/519/438
+f 416/493/416 431/520/431 432/522/432
+f 424/494/424 439/521/439 440/507/440
+f 418/497/418 417/495/417 432/522/432
+f 430/518/430 429/515/429 444/524/444
+f 437/517/437 452/540/452 453/526/453
+f 430/518/430 445/525/445 446/527/446
+f 439/521/439 438/519/438 453/526/453
+f 431/520/431 446/527/446 447/529/447
+f 439/521/439 454/528/454 455/530/455
+f 433/523/433 432/522/432 447/529/447
+f 441/508/441 440/507/440 455/530/455
+f 433/523/433 448/531/448 449/533/449
+f 441/508/441 456/532/456 457/534/457
+f 435/511/435 434/509/434 449/533/449
+f 442/510/442 457/534/457 458/536/458
+f 436/513/436 435/511/435 450/535/450
+f 436/513/436 451/537/451 452/540/452
+f 448/531/448 463/556/463 464/541/464
+f 456/532/456 471/557/471 472/542/472
+f 450/535/450 449/533/449 464/541/464
+f 458/536/458 457/534/457 472/542/472
+f 451/537/451 450/535/450 465/543/465
+f 451/537/451 466/545/466 467/549/467
+f 444/524/444 459/547/459 460/550/460
+f 452/540/452 467/549/467 468/551/468
+f 446/527/446 445/525/445 460/550/460
+f 454/528/454 453/526/453 468/551/468
+f 446/527/446 461/552/461 462/554/462
+f 454/528/454 469/553/469 470/555/470
+f 448/531/448 447/529/447 462/554/462
+f 456/532/456 455/530/455 470/555/470
+f 467/549/467 5/1/5 478/3/478
+f 461/552/461 460/550/460 475/32/475
+f 468/551/468 478/3/478 6/8/6
+f 462/554/462 461/552/461 1/4/1
+f 469/553/469 6/8/6 479/12/479
+f 463/556/463 462/554/462 476/9/476
+f 471/557/471 470/555/470 479/12/479
+f 464/541/464 463/556/463 2/13/2
+f 471/557/471 480/16/480 481/20/481
+f 465/543/465 464/541/464 477/17/477
+f 472/542/472 481/20/481 482/24/482
+f 466/545/466 465/543/465 3/21/3
+f 466/545/466 4/26/4 5/1/5
+f 460/550/460 459/547/459 474/27/474
diff --git a/src/main/resources/assets/goodgenerator/shaders/antimatter.frag.glsl b/src/main/resources/assets/goodgenerator/shaders/antimatter.frag.glsl
new file mode 100644
index 0000000000..08b80694d6
--- /dev/null
+++ b/src/main/resources/assets/goodgenerator/shaders/antimatter.frag.glsl
@@ -0,0 +1,9 @@
+#version 120
+uniform float u_Opacity;
+varying vec3 v_Color;
+
+
+void main() {
+ // Color ramp from 0 to 1
+ gl_FragColor = vec4(v_Color.rgb,u_Opacity);
+}
diff --git a/src/main/resources/assets/goodgenerator/shaders/antimatter.vert.glsl b/src/main/resources/assets/goodgenerator/shaders/antimatter.vert.glsl
new file mode 100644
index 0000000000..8286a26a4f
--- /dev/null
+++ b/src/main/resources/assets/goodgenerator/shaders/antimatter.vert.glsl
@@ -0,0 +1,80 @@
+#version 120
+
+
+uniform float u_SpikeMult;
+uniform float u_Scale;
+uniform float u_ScaleSnapshot;
+uniform vec3 u_ColorCore;
+uniform vec3 u_ColorSpike;
+uniform float u_Time;
+uniform float u_TimeSnapshot;
+varying vec3 v_Color;
+
+/*
+float wave ( vec3 input){
+ return (cos(input.x + u_Time*1.2)*cos(input.y + u_Time*1.3)*cos(input.z + u_Time*1.4));
+}
+*/
+const float PI = 3.14159265358979323846;
+
+
+float lazyHash(vec3 input){
+ vec3 v = fract(input*1.23456 + 3.1456);
+ v*=7;
+ return fract(v.y + v.x*(v.z+1));
+}
+
+
+float wave ( vec3 input){
+ float val = lazyHash(input);
+ float pulse = cos(val*2*PI + u_Time)*cos(u_Time*(1+val)); // Slow save
+ return pulse;
+}
+
+float trim (float val){
+ return clamp(val - .1,0,1)/.9;
+}
+
+float amp(float x){
+ float b = smoothstep(0.,1.,x);
+ float c = pow(b,.3);
+ return c;
+}
+
+float triangle(float x){
+ return 1.0 - abs(2.0 * (x - 0.5));
+}
+
+void main() {
+ //grab local position
+ vec3 pos = gl_Vertex.xyz;
+
+ //Grabs how far the vertex is for center
+ //Antimatter.model has spikes that are 2 unit away, and the 'core' is 1 unit away
+ float len = length(pos);
+
+ //Grabs distance that remains as spike
+ float spike = len-1;
+
+ //Spike
+ float extension = wave(pos);
+ extension = abs(extension);
+ float spikeSize = extension * u_SpikeMult;
+
+ //Scale
+ float timelerp = clamp(1,0,(u_Time-u_TimeSnapshot)/2.5);
+ float scale = mix(u_ScaleSnapshot,u_Scale,timelerp)*(1 + 0.5*spike*(spikeSize - 1));
+
+ vec3 currentCoreColor = mix(u_ColorCore,u_ColorSpike,triangle(mod((u_Time/4.0 + lazyHash(pos)/2),1.0)));
+ vec3 currentSpikeColor = mix(u_ColorCore,u_ColorSpike,triangle(mod((u_Time/2.0 + lazyHash(pos)),1.0)));
+ //v_Color = mix(u_ColorCore,u_ColorSpike,extension*spike);
+ v_Color = mix(currentCoreColor,currentSpikeColor,extension*spike);
+ mat4 mScale = mat4(
+ scale,0,0,0,
+ 0,scale,0,0,
+ 0,0,scale,0,
+ 0,0,0,1);
+
+
+ gl_Position = gl_ModelViewProjectionMatrix * mScale * gl_Vertex;
+}
diff --git a/src/main/resources/assets/goodgenerator/shaders/protomatter.frag.glsl b/src/main/resources/assets/goodgenerator/shaders/protomatter.frag.glsl
new file mode 100644
index 0000000000..ab6df42637
--- /dev/null
+++ b/src/main/resources/assets/goodgenerator/shaders/protomatter.frag.glsl
@@ -0,0 +1,8 @@
+#version 120
+uniform vec3 u_Color;
+uniform float u_Opacity;
+
+void main() {
+ // Color ramp from 0 to 1
+ gl_FragColor = vec4(u_Color,1);
+}
diff --git a/src/main/resources/assets/goodgenerator/shaders/protomatter.vert.glsl b/src/main/resources/assets/goodgenerator/shaders/protomatter.vert.glsl
new file mode 100644
index 0000000000..746b31cc46
--- /dev/null
+++ b/src/main/resources/assets/goodgenerator/shaders/protomatter.vert.glsl
@@ -0,0 +1,87 @@
+#version 120
+attribute float a_VertexID;
+
+uniform float u_CubeCount;
+uniform float u_Time;
+uniform float u_Scale;
+uniform float u_SpiralRadius;
+uniform vec3 u_Vertices[24];
+
+const float PI = 3.14159265358979323846;
+
+int modulo(int a, int b){
+ return int(mod(float(a),float(b)));
+}
+
+int idVertexTransform(float id){
+ int i = int(id);
+ int l = modulo(i,6); // Local vertex id for face: 0..5 inclusive
+ int v = modulo((l-l/3),4); // Transform 0,1,2,3,4,5 to 0,1,2,2,3,0
+ int f = (i/6)*4; // Grab face offset for vertex
+ return f+v;
+}
+
+
+//Best fit equation, needs to be manually calculated
+//Alternatives should be looked if shader is going to be multi purpose
+float positionEquation(float tickTime){
+ float x = tickTime/20;
+ float y1 = 7.6331796059e-12*pow(x,1.7827335640e+01);
+ float y2 = x/10.0;
+ float y = max(y1,y2);
+ return y;
+}
+
+float velocityEquation(float tickTime){
+ return (positionEquation(tickTime + 0.001)-positionEquation(tickTime))/.001;
+}
+
+void main() {
+ float cubeCount = u_CubeCount;
+ float maxDistance = 22.5;
+
+ //This probably needs a better method for generating cubes
+ int cube_id = int(a_VertexID)/36;
+ int local_id = idVertexTransform(mod(a_VertexID, 36));
+ vec3 pos = u_Vertices[local_id];
+
+
+ //Beam particles y speed
+ float loopTime = 100;
+ float cycleOffset = (cube_id/cubeCount) * loopTime;
+ float cubeTime = mod(u_Time+cycleOffset,loopTime);
+ float dist = positionEquation(cubeTime);
+
+
+ //beam particles position x&z
+ float halfCycle = PI * mod(cube_id,2);
+ float x_offset = sin(cube_id/cubeCount * 3 * PI + halfCycle) * u_SpiralRadius;
+ float z_offset = cos(cube_id/cubeCount * 3 * PI + halfCycle) * u_SpiralRadius;
+ float y_offset = maxDistance-dist;
+
+ //scale
+ float size = min((cubeTime/loopTime)/.8,1)*u_Scale;
+ float tall = size*max(1,maxDistance-y_offset);
+ float width = min(size/sqrt(tall),size);
+
+ float y_trim = max(0,tall/2-y_offset);
+
+ tall -= y_trim;
+ y_offset += y_trim/2;
+
+ mat4 scale = mat4 (
+ width,0,0,0,
+ 0,tall,0,0,
+ 0,0,width,0,
+ 0,0,0,1
+ );
+
+ mat4 gravity = mat4(
+ 1,0,0,0,
+ 0,1,0,0,
+ 0,0,1,0,
+ x_offset,y_offset,z_offset,1
+ );
+
+ gl_Position = gl_ModelViewProjectionMatrix * (gravity * (scale*vec4(pos,1)));
+}
diff --git a/src/main/resources/assets/goodgenerator/textures/blocks/antimatterAnnihilationMatrix.png b/src/main/resources/assets/goodgenerator/textures/blocks/antimatterAnnihilationMatrix.png
new file mode 100644
index 0000000000..9d98f818d8
--- /dev/null
+++ b/src/main/resources/assets/goodgenerator/textures/blocks/antimatterAnnihilationMatrix.png
Binary files differ
diff --git a/src/main/resources/assets/goodgenerator/textures/blocks/antimatterContainmentCasing.png b/src/main/resources/assets/goodgenerator/textures/blocks/antimatterContainmentCasing.png
new file mode 100644
index 0000000000..a856f339ce
--- /dev/null
+++ b/src/main/resources/assets/goodgenerator/textures/blocks/antimatterContainmentCasing.png
Binary files differ
diff --git a/src/main/resources/assets/goodgenerator/textures/blocks/gravityStabilizationCasing.png b/src/main/resources/assets/goodgenerator/textures/blocks/gravityStabilizationCasing.png
new file mode 100644
index 0000000000..3ad3f96b84
--- /dev/null
+++ b/src/main/resources/assets/goodgenerator/textures/blocks/gravityStabilizationCasing.png
Binary files differ
diff --git a/src/main/resources/assets/goodgenerator/textures/blocks/magneticFluxCasing.png b/src/main/resources/assets/goodgenerator/textures/blocks/magneticFluxCasing.png
new file mode 100644
index 0000000000..b60b317025
--- /dev/null
+++ b/src/main/resources/assets/goodgenerator/textures/blocks/magneticFluxCasing.png
Binary files differ
diff --git a/src/main/resources/assets/goodgenerator/textures/blocks/protomatterActivationCoil.png b/src/main/resources/assets/goodgenerator/textures/blocks/protomatterActivationCoil.png
new file mode 100644
index 0000000000..434b6b420e
--- /dev/null
+++ b/src/main/resources/assets/goodgenerator/textures/blocks/protomatterActivationCoil.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.antimatter.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.antimatter.png
new file mode 100644
index 0000000000..9f634cbbfa
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.antimatter.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.antimatter.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.antimatter.png.mcmeta
new file mode 100644
index 0000000000..dd8674956c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.antimatter.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 2}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.protomatter.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.protomatter.png
new file mode 100644
index 0000000000..df6d59f158
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.protomatter.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.protomatter.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.protomatter.png.mcmeta
new file mode 100644
index 0000000000..14578b550b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.protomatter.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 4}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_ANTIMATTER.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_ANTIMATTER.png
new file mode 100644
index 0000000000..a6b0c6d71d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_ANTIMATTER.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_ANTIMATTER_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_ANTIMATTER_GLOW.png
new file mode 100644
index 0000000000..3cf2d90b80
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_ANTIMATTER_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/lang/en_US.lang b/src/main/resources/assets/tectech/lang/en_US.lang
index 9c3411f8a8..e683876e2d 100644
--- a/src/main/resources/assets/tectech/lang/en_US.lang
+++ b/src/main/resources/assets/tectech/lang/en_US.lang
@@ -853,6 +853,10 @@ gt.blockcasingsBA0.10.desc.0=Resistant to temporal shearing from time dilation d
gt.blockcasingsBA0.10.desc.1=This block can last an eternity without any decay.
+# Antimatter
+gt.blockmachines.antimatterForge.name=Semi-Stable Antimatter Stabilization Sequencer
+gt.blockmachines.antimatterGenerator.name=Shielded Lagrangian Annihilation Matrix
+
achievement.gt.spacetime_compression_field_generator.0=Crude Spacetime Compression Field Generator
achievement.gt.spacetime_compression_field_generator.1=Primitive Spacetime Compression Field Generator
achievement.gt.spacetime_compression_field_generator.2=Stable Spacetime Compression Field Generator