diff --git a/README.md b/README.md index 2c0194598..39977e9da 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ **This is for 1.7.10!** For 1.12, check out these projects: * NTM Reloaded: https://github.com/TheOriginalGolem/Hbm-s-Nuclear-Tech-GIT/releases -* NTM Alcater Edition: https://github.com/Alcatergit/Hbm-s-Nuclear-Tech-GIT/releases +* NTM Extended Edition (Alcater): https://github.com/Alcatergit/Hbm-s-Nuclear-Tech-GIT/releases For 1.18, try Martin's remake: https://github.com/MartinTheDragon/Nuclear-Tech-Mod-Remake/releases diff --git a/src/main/java/com/hbm/main/CraftingManager.java b/src/main/java/com/hbm/main/CraftingManager.java index e1e7ad471..547061e43 100644 --- a/src/main/java/com/hbm/main/CraftingManager.java +++ b/src/main/java/com/hbm/main/CraftingManager.java @@ -221,7 +221,7 @@ public class CraftingManager { addRecipeAuto(new ItemStack(ModItems.definitelyfood, 1), new Object[] { "DDD", "SDS", "DDD", 'D', Blocks.dirt, 'S', STEEL.plate() }); addRecipeAuto(new ItemStack(ModItems.turbine_tungsten, 1), new Object[] { "BBB", "BSB", "BBB", 'B', ModItems.blade_tungsten, 'S', DURA.ingot() }); addRecipeAuto(new ItemStack(ModItems.ring_starmetal, 1), new Object[] { " S ", "S S", " S ", 'S', STAR.ingot() }); - addRecipeAuto(new ItemStack(ModItems.flywheel_beryllium, 1), new Object[] { "BBB", "BTB", "BBB", 'B', BE.block(), 'T', ModItems.bolt_compound }); + addRecipeAuto(new ItemStack(ModItems.flywheel_beryllium, 1), new Object[] { "IBI", "BTB", "IBI", 'B', BE.block(), 'I', IRON.plateCast(), 'T', ModItems.bolt_compound }); addShapelessAuto(new ItemStack(ModItems.powder_poison), new Object[] { DictFrame.fromOne(ModBlocks.plant_flower, EnumFlowerType.NIGHTSHADE) }); addShapelessAuto(new ItemStack(ModItems.syringe_metal_stimpak), new Object[] { ModItems.syringe_metal_empty, Items.carrot, DictFrame.fromOne(ModBlocks.plant_flower, EnumFlowerType.FOXGLOVE) }); //xander root and broc flower diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityWatz.java b/src/main/java/com/hbm/tileentity/machine/TileEntityWatz.java index 761e8252d..b5c1c0e23 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityWatz.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityWatz.java @@ -15,8 +15,10 @@ import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.TileEntityMachineBase; import com.hbm.util.Compat; import com.hbm.util.EnumUtil; +import com.hbm.util.fauxpointtwelve.DirPos; import com.hbm.util.function.Function; +import api.hbm.fluid.IFluidStandardTransceiver; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.client.gui.GuiScreen; @@ -27,13 +29,14 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityWatz extends TileEntityMachineBase implements IGUIProvider { +public class TileEntityWatz extends TileEntityMachineBase implements IFluidStandardTransceiver, IGUIProvider { public FluidTank[] tanks; public int heat; - public double fluxLastBase; - public double fluxLastReaction; //stores the flux created by the reaction, excludes passive emission + public double fluxLastBase; //flux created by the previous passive emission, only used for display + public double fluxLastReaction; //flux created by the previous reaction, used for the next reaction public double fluxDisplay; /* lock types for item IO */ @@ -60,6 +63,7 @@ public class TileEntityWatz extends TileEntityMachineBase implements IGUIProvide List segments = new ArrayList(); segments.add(this); + this.subscribeToTop(); /* accumulate all segments */ for(int y = yCoord - 3; y >= 0; y -= 3) { @@ -76,6 +80,7 @@ public class TileEntityWatz extends TileEntityMachineBase implements IGUIProvide for(int i = 0; i < 3; i++) sharedTanks[i] = new FluidTank(tanks[i].getTankType(), 0); for(TileEntityWatz segment : segments) { + segment.setupCoolant(); for(int i = 0; i < 3; i++) { sharedTanks[i].changeTankSize(sharedTanks[i].getMaxFill() + segment.tanks[i].getMaxFill()); sharedTanks[i].setFill(sharedTanks[i].getFill() + segment.tanks[i].getFill()); @@ -89,11 +94,11 @@ public class TileEntityWatz extends TileEntityMachineBase implements IGUIProvide } /* update reaction, top to bottom */ - this.updateReaction(null); + this.updateReaction(null, sharedTanks); for(int i = 1; i < segments.size(); i++) { TileEntityWatz segment = segments.get(i); TileEntityWatz above = segments.get(i - 1); - segment.updateReaction(above); + segment.updateReaction(above, sharedTanks); } //TODO: call fluidSend on the bottom-most segment @@ -114,15 +119,25 @@ public class TileEntityWatz extends TileEntityMachineBase implements IGUIProvide segment.heat *= 0.99; //cool 1% per tick } + segments.get(segments.size() - 1).sendOutBottom(); } } + /** basic sanity checking, usually wouldn't do anything except when NBT loading borks */ + public void setupCoolant() { + + if(!tanks[0].getTankType().hasTrait(FT_Heatable.class)) { + tanks[0].setTankType(Fluids.COOLANT); + } + + tanks[1].setTankType(tanks[0].getTankType().getTrait(FT_Heatable.class).getFirstStep().typeProduced); + } + public void updateCoolant(FluidTank[] tanks) { double coolingFactor = 0.05D; //20% per tick, TEMP double heatToUse = this.heat * coolingFactor; - //TODO: add sanity checking so fucking with the tank type doesn't instantly crash the game FT_Heatable trait = tanks[0].getTankType().getTrait(FT_Heatable.class); HeatingStep step = trait.getFirstStep(); @@ -137,7 +152,7 @@ public class TileEntityWatz extends TileEntityMachineBase implements IGUIProvide } /** enforces strict top to bottom update order (instead of semi-random based on placement) */ - public void updateReaction(TileEntityWatz above) { + public void updateReaction(TileEntityWatz above, FluidTank[] tanks) { List pellets = new ArrayList(); @@ -185,6 +200,26 @@ public class TileEntityWatz extends TileEntityMachineBase implements IGUIProvide this.heat += addedHeat; this.fluxLastBase = baseFlux; this.fluxLastReaction = addedFlux; + + if(above != null) { + for(int i = 0; i < 24; i++) { + ItemStack stackBottom = slots[i]; + ItemStack stackTop = above.slots[i]; + + /* items fall down if the bottom slot is empty */ + if(stackBottom == null && stackTop != null) { + slots[i] = stackTop.copy(); + above.decrStackSize(i, stackTop.stackSize); + } + + /* items switch places if the top slot is depleted */ + if(stackBottom != null && stackBottom.getItem() == ModItems.watz_pellet && stackTop != null && stackTop.getItem() == ModItems.watz_pellet_depleted) { + ItemStack buf = stackTop.copy(); + above.slots[i] = stackBottom.copy(); + slots[i] = buf; + } + } + } } public void sendPacket(FluidTank[] tanks) { @@ -202,6 +237,32 @@ public class TileEntityWatz extends TileEntityMachineBase implements IGUIProvide public boolean updateLock() { return Compat.getTileStandard(worldObj, xCoord, yCoord + 3, zCoord) instanceof TileEntityWatz; } + + protected void subscribeToTop() { + this.trySubscribe(tanks[0].getTankType(), worldObj, xCoord, yCoord + 3, zCoord, ForgeDirection.UP); + this.trySubscribe(tanks[0].getTankType(), worldObj, xCoord + 2, yCoord + 3, zCoord, ForgeDirection.UP); + this.trySubscribe(tanks[0].getTankType(), worldObj, xCoord - 2, yCoord + 3, zCoord, ForgeDirection.UP); + this.trySubscribe(tanks[0].getTankType(), worldObj, xCoord, yCoord + 3, zCoord + 2, ForgeDirection.UP); + this.trySubscribe(tanks[0].getTankType(), worldObj, xCoord, yCoord + 3, zCoord - 2, ForgeDirection.UP); + } + + protected void sendOutBottom() { + + for(DirPos pos : getSendingPos()) { + if(tanks[1].getFill() > 0) this.sendFluid(tanks[1].getTankType(), worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); + if(tanks[2].getFill() > 0) this.sendFluid(tanks[2].getTankType(), worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); + } + } + + protected DirPos[] getSendingPos() { + return new DirPos[] { + new DirPos(xCoord, yCoord - 1, zCoord, ForgeDirection.DOWN), + new DirPos(xCoord + 2, yCoord - 1, zCoord, ForgeDirection.DOWN), + new DirPos(xCoord - 2, yCoord - 1, zCoord, ForgeDirection.DOWN), + new DirPos(xCoord, yCoord - 1, zCoord + 2, ForgeDirection.DOWN), + new DirPos(xCoord, yCoord - 1, zCoord - 2, ForgeDirection.DOWN) + }; + } @Override public void networkUnpack(NBTTagCompound nbt) { @@ -257,4 +318,19 @@ public class TileEntityWatz extends TileEntityMachineBase implements IGUIProvide public GuiScreen provideGUI(int ID, EntityPlayer player, World world, int x, int y, int z) { return new GUIWatz(player.inventory, this); } + + @Override + public FluidTank[] getAllTanks() { + return tanks; + } + + @Override + public FluidTank[] getSendingTanks() { + return new FluidTank[] { tanks[1], tanks[2] }; + } + + @Override + public FluidTank[] getReceivingTanks() { + return new FluidTank[] { tanks[0] }; + } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityWatzCore.java b/src/main/java/com/hbm/tileentity/machine/TileEntityWatzCore.java index 7e59d7119..8411a1c76 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityWatzCore.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityWatzCore.java @@ -44,6 +44,7 @@ import net.minecraft.util.AxisAlignedBB; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; +@Deprecated public class TileEntityWatzCore extends TileEntityLoadedBase implements ISidedInventory, IReactor, IEnergyGenerator, IFluidContainer, IFluidSource, IFluidStandardSender, IGUIProvider { public long power; diff --git a/src/main/resources/assets/hbm/models/machines/dieselgen.obj b/src/main/resources/assets/hbm/models/machines/dieselgen.obj new file mode 100644 index 000000000..70f78c379 --- /dev/null +++ b/src/main/resources/assets/hbm/models/machines/dieselgen.obj @@ -0,0 +1,500 @@ +# Blender v2.79 (sub 0) OBJ File: 'dieselgen.blend' +# www.blender.org +o Plane +v -0.500000 0.062500 0.500000 +v 0.500000 0.062500 0.500000 +v -0.500000 0.062500 -0.500000 +v 0.500000 0.062500 -0.500000 +v 0.500000 0.937500 0.500000 +v -0.500000 0.937500 -0.500000 +v -0.500000 0.937500 0.500000 +v 0.500000 0.937500 -0.500000 +v 0.437500 0.062500 0.500000 +v 0.437500 0.062500 -0.500000 +v 0.437500 0.937500 0.500000 +v 0.437500 0.937500 -0.500000 +v -0.437500 0.062500 0.500000 +v -0.437500 0.062500 -0.500000 +v -0.437500 0.937500 -0.500000 +v -0.437500 0.937500 0.500000 +v -0.500000 0.062500 0.437500 +v 0.500000 0.062500 0.437500 +v 0.500000 0.937500 0.437500 +v -0.500000 0.937500 0.437500 +v 0.437500 0.062500 0.437500 +v 0.437500 0.937500 0.437500 +v -0.437500 0.062500 0.437500 +v -0.437500 0.937500 0.437500 +v -0.500000 0.062500 -0.437500 +v 0.500000 0.062500 -0.437500 +v -0.500000 0.937500 -0.437500 +v 0.500000 0.937500 -0.437500 +v 0.437500 0.062500 -0.437500 +v 0.437500 0.937500 -0.437500 +v -0.437500 0.062500 -0.437500 +v -0.437500 0.937500 -0.437500 +v 0.437500 0.000000 0.500000 +v -0.437500 0.000000 0.500000 +v 0.437500 0.000000 0.437500 +v -0.437500 0.000000 0.437500 +v 0.437500 0.000000 -0.500000 +v -0.437500 0.000000 -0.500000 +v 0.437500 0.000000 -0.437500 +v -0.437500 0.000000 -0.437500 +v 0.500000 1.000000 0.437500 +v -0.500000 1.000000 0.437500 +v 0.437500 1.000000 0.437500 +v -0.437500 1.000000 0.437500 +v -0.500000 1.000000 -0.437500 +v 0.500000 1.000000 -0.437500 +v 0.437500 1.000000 -0.437500 +v -0.437500 1.000000 -0.437500 +v -0.500000 0.625000 0.375000 +v 0.500000 0.625000 0.375000 +v -0.500000 0.625000 -0.375000 +v 0.500000 0.625000 -0.375000 +v -0.500000 0.875000 -0.312500 +v -0.500000 0.875000 0.312500 +v 0.500000 0.875000 0.312500 +v 0.500000 0.875000 -0.312500 +v -0.500000 0.625000 0.437500 +v 0.500000 0.625000 0.437500 +v -0.500000 0.625000 -0.437500 +v 0.500000 0.625000 -0.437500 +v -0.500000 0.250000 0.437500 +v 0.500000 0.250000 0.437500 +v -0.500000 0.250000 -0.437500 +v 0.500000 0.250000 -0.437500 +v -0.500000 0.250000 0.375000 +v 0.500000 0.250000 0.375000 +v -0.500000 0.250000 -0.375000 +v 0.500000 0.250000 -0.375000 +v -0.500000 0.500000 0.375000 +v 0.500000 0.500000 0.375000 +v -0.500000 0.500000 -0.375000 +v 0.500000 0.500000 -0.375000 +v 0.125000 0.500000 0.343750 +v 0.125000 0.500000 -0.031250 +v 0.125000 0.125000 0.343750 +v 0.125000 0.125000 -0.031250 +v -0.375000 0.500000 0.343750 +v -0.375000 0.500000 -0.031250 +v -0.375000 0.125000 0.343750 +v -0.375000 0.125000 -0.031250 +v 0.125000 0.312500 -0.031250 +v 0.125000 0.445083 0.023667 +v 0.125000 0.500000 0.156250 +v 0.125000 0.445083 0.288832 +v 0.125000 0.312500 0.343750 +v 0.125000 0.179917 0.288832 +v 0.125000 0.125000 0.156250 +v 0.125000 0.179917 0.023668 +v 0.375000 0.445082 0.023667 +v 0.375000 0.312500 -0.031250 +v 0.375000 0.500000 0.156250 +v 0.375000 0.445082 0.288832 +v 0.375000 0.312500 0.343750 +v 0.375000 0.179917 0.288832 +v 0.375000 0.125000 0.156250 +v 0.375000 0.179917 0.023668 +v 0.375000 0.411937 0.056813 +v 0.375000 0.312500 0.015625 +v 0.375000 0.453125 0.156250 +v 0.375000 0.411937 0.255687 +v 0.375000 0.312500 0.296875 +v 0.375000 0.213063 0.255687 +v 0.375000 0.171875 0.156250 +v 0.375000 0.213063 0.056813 +v 0.500000 0.411937 0.056813 +v 0.500000 0.312500 0.015625 +v 0.500000 0.453125 0.156250 +v 0.500000 0.411937 0.255687 +v 0.500000 0.312500 0.296875 +v 0.500000 0.213063 0.255687 +v 0.500000 0.171875 0.156250 +v 0.500000 0.213063 0.056813 +v -0.375000 0.411937 0.056813 +v -0.375000 0.312500 0.015625 +v -0.375000 0.453125 0.156250 +v -0.375000 0.411937 0.255687 +v -0.375000 0.312500 0.296875 +v -0.375000 0.213063 0.255687 +v -0.375000 0.171875 0.156250 +v -0.375000 0.213063 0.056813 +v -0.500000 0.411937 0.056813 +v -0.500000 0.312500 0.015625 +v -0.500000 0.453125 0.156250 +v -0.500000 0.411937 0.255687 +v -0.500000 0.312500 0.296875 +v -0.500000 0.213063 0.255687 +v -0.500000 0.171875 0.156250 +v -0.500000 0.213063 0.056813 +v -0.250000 0.062500 0.500000 +v -0.250000 0.062500 -0.500000 +v -0.187500 0.062500 0.500000 +v -0.187500 0.062500 -0.500000 +v -0.250000 0.125000 0.437500 +v -0.250000 0.125000 -0.437500 +v -0.187500 0.125000 0.437500 +v -0.187500 0.125000 -0.437500 +v 0.187500 0.062500 0.500000 +v 0.187500 0.062500 -0.500000 +v 0.250000 0.062500 0.500000 +v 0.250000 0.062500 -0.500000 +v 0.187500 0.125000 0.437500 +v 0.187500 0.125000 -0.437500 +v 0.250000 0.125000 0.437500 +v 0.250000 0.125000 -0.437500 +v 0.125000 0.875000 -0.125000 +v 0.036612 0.875000 -0.088388 +v 0.000000 0.875000 0.000000 +v 0.036612 0.875000 0.088388 +v 0.125000 0.875000 0.125000 +v 0.213388 0.875000 0.088388 +v 0.250000 0.875000 -0.000000 +v 0.213388 0.875000 -0.088388 +v 0.036612 0.937500 -0.088388 +v 0.125000 0.937500 -0.125000 +v 0.000000 0.937500 0.000000 +v 0.036612 0.937500 0.088388 +v 0.125000 0.937500 0.125000 +v 0.213388 0.937500 0.088388 +v 0.250000 0.937500 -0.000000 +v 0.213388 0.937500 -0.088388 +v -0.437500 0.125000 -0.093750 +v 0.437500 0.125000 -0.093750 +v -0.437500 0.125000 -0.343750 +v 0.437500 0.125000 -0.343750 +v -0.437500 0.500000 -0.343750 +v -0.437500 0.500000 -0.093750 +v 0.437500 0.500000 -0.093750 +v 0.437500 0.500000 -0.343750 +v 0.437500 1.000000 0.187500 +v -0.437500 1.000000 0.187500 +v 0.437500 0.937500 0.187500 +v -0.437500 0.937500 0.187500 +v 0.437500 1.000000 0.250000 +v -0.437500 1.000000 0.250000 +v 0.437500 0.937500 0.250000 +v -0.437500 0.937500 0.250000 +v 0.437500 1.000000 -0.250000 +v -0.437500 1.000000 -0.250000 +v 0.437500 0.937500 -0.250000 +v -0.437500 0.937500 -0.250000 +v 0.437500 1.000000 -0.187500 +v -0.437500 1.000000 -0.187500 +v 0.437500 0.937500 -0.187500 +v -0.437500 0.937500 -0.187500 +vn 0.0000 0.0000 -1.0000 +vn 0.0000 0.0000 1.0000 +vn 1.0000 0.0000 0.0000 +vn -1.0000 0.0000 0.0000 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 0.7071 0.7071 +vn 0.0000 0.7071 -0.7071 +vn -0.7071 -0.7071 0.0000 +vn 0.7071 -0.7071 0.0000 +vn 0.0000 0.2425 -0.9701 +vn 0.0000 0.2425 0.9701 +vn 0.0000 -0.9239 0.3827 +vn -0.0000 -0.3827 -0.9239 +vn 0.0000 0.3827 0.9239 +vn 0.0000 0.9239 -0.3827 +vn -0.0000 -0.9239 -0.3827 +vn -0.0000 -0.3827 0.9239 +vn 0.0000 0.9239 0.3827 +vn 0.0000 0.3827 -0.9239 +vn 0.3827 -0.0000 -0.9239 +vn 0.9239 0.0000 0.3827 +vn -0.3827 0.0000 0.9239 +vn -0.9239 0.0000 -0.3827 +vn 0.9239 0.0000 -0.3827 +vn 0.3827 0.0000 0.9239 +vn -0.9239 0.0000 0.3827 +vn -0.3827 0.0000 -0.9239 +s off +f 4//1 12//1 8//1 +f 11//2 2//2 5//2 +f 1//2 16//2 7//2 +f 15//1 3//1 6//1 +f 18//3 5//3 2//3 +f 13//3 24//3 16//3 +f 22//4 9//4 11//4 +f 7//4 17//4 1//4 +f 10//4 30//4 12//4 +f 8//3 26//3 4//3 +f 25//4 6//4 3//4 +f 32//3 14//3 15//3 +f 29//2 28//2 30//2 +f 25//2 32//2 27//2 +f 24//1 17//1 20//1 +f 19//1 21//1 22//1 +f 19//5 30//5 28//5 +f 24//5 27//5 32//5 +f 10//6 31//6 29//6 +f 13//6 21//6 23//6 +f 21//1 36//1 23//1 +f 13//2 33//2 9//2 +f 31//2 39//2 29//2 +f 10//1 38//1 14//1 +f 37//5 40//5 38//5 +f 34//5 35//5 33//5 +f 22//4 47//4 30//4 +f 32//3 44//3 24//3 +f 28//3 41//3 19//3 +f 20//4 45//4 27//4 +f 41//6 47//6 43//6 +f 44//6 45//6 42//6 +f 41//7 11//7 5//7 +f 11//4 43//4 22//4 +f 19//3 41//3 5//3 +f 44//7 7//7 16//7 +f 24//3 44//3 16//3 +f 20//4 7//4 42//4 +f 6//8 48//8 15//8 +f 27//4 45//4 6//4 +f 15//3 48//3 32//3 +f 12//8 46//8 8//8 +f 30//4 47//4 12//4 +f 28//3 8//3 46//3 +f 3//9 40//9 25//9 +f 31//2 25//2 40//2 +f 14//1 38//1 3//1 +f 36//9 1//9 17//9 +f 23//1 36//1 17//1 +f 13//2 1//2 34//2 +f 2//10 35//10 18//10 +f 9//2 33//2 2//2 +f 18//1 35//1 21//1 +f 39//10 4//10 26//10 +f 10//1 4//1 37//1 +f 29//2 39//2 26//2 +f 55//6 53//6 54//6 +f 52//3 55//3 50//3 +f 49//4 53//4 51//4 +f 51//11 56//11 52//11 +f 50//12 54//12 49//12 +f 60//6 57//6 58//6 +f 64//1 59//1 60//1 +f 61//2 58//2 57//2 +f 65//5 62//5 61//5 +f 68//5 63//5 64//5 +f 72//2 67//2 68//2 +f 69//1 66//1 65//1 +f 69//5 72//5 70//5 +f 58//3 72//3 60//3 +f 62//3 70//3 58//3 +f 64//3 72//3 68//3 +f 71//4 57//4 59//4 +f 63//4 71//4 59//4 +f 61//4 69//4 65//4 +f 75//3 74//3 73//3 +f 78//4 79//4 77//4 +f 76//1 78//1 74//1 +f 73//2 79//2 75//2 +f 75//5 80//5 76//5 +f 126//13 119//13 118//13 +f 93//3 95//3 90//3 +f 81//14 96//14 88//14 +f 86//13 95//13 94//13 +f 84//15 93//15 92//15 +f 82//16 91//16 89//16 +f 87//17 96//17 95//17 +f 85//18 94//18 93//18 +f 84//19 91//19 83//19 +f 82//20 90//20 81//20 +f 109//3 111//3 106//3 +f 98//14 112//14 104//14 +f 102//13 111//13 110//13 +f 101//15 108//15 100//15 +f 97//16 107//16 105//16 +f 104//17 111//17 103//17 +f 102//18 109//18 101//18 +f 100//19 107//19 99//19 +f 97//20 106//20 98//20 +f 124//15 117//15 116//15 +f 121//16 115//16 113//16 +f 127//17 120//17 119//17 +f 125//18 118//18 117//18 +f 123//19 116//19 115//19 +f 122//20 113//20 114//20 +f 128//14 114//14 120//14 +f 127//4 125//4 123//4 +f 130//5 131//5 129//5 +f 135//6 134//6 133//6 +f 131//7 133//7 129//7 +f 132//3 135//3 131//3 +f 130//8 136//8 132//8 +f 129//4 134//4 130//4 +f 138//5 139//5 137//5 +f 143//6 142//6 141//6 +f 139//7 141//7 137//7 +f 140//3 143//3 139//3 +f 138//8 144//8 140//8 +f 137//4 142//4 138//4 +f 157//6 159//6 154//6 +f 145//21 160//21 152//21 +f 151//22 158//22 150//22 +f 149//23 156//23 148//23 +f 147//24 153//24 146//24 +f 152//25 159//25 151//25 +f 150//26 157//26 149//26 +f 148//27 155//27 147//27 +f 145//28 153//28 154//28 +f 163//5 162//5 161//5 +f 167//6 165//6 166//6 +f 161//4 165//4 163//4 +f 163//1 168//1 164//1 +f 162//2 166//2 161//2 +f 164//3 167//3 162//3 +f 171//1 170//1 169//1 +f 174//2 175//2 173//2 +f 182//2 183//2 181//2 +f 170//6 173//6 169//6 +f 179//1 178//1 177//1 +f 171//5 176//5 172//5 +f 178//6 181//6 177//6 +f 179//5 184//5 180//5 +f 4//1 10//1 12//1 +f 11//2 9//2 2//2 +f 1//2 13//2 16//2 +f 15//1 14//1 3//1 +f 18//3 19//3 5//3 +f 13//3 23//3 24//3 +f 22//4 21//4 9//4 +f 7//4 20//4 17//4 +f 10//4 29//4 30//4 +f 8//3 28//3 26//3 +f 25//4 27//4 6//4 +f 32//3 31//3 14//3 +f 29//2 26//2 28//2 +f 25//2 31//2 32//2 +f 24//1 23//1 17//1 +f 19//1 18//1 21//1 +f 19//5 22//5 30//5 +f 24//5 20//5 27//5 +f 10//6 14//6 31//6 +f 13//6 9//6 21//6 +f 21//1 35//1 36//1 +f 13//2 34//2 33//2 +f 31//2 40//2 39//2 +f 10//1 37//1 38//1 +f 37//5 39//5 40//5 +f 34//5 36//5 35//5 +f 22//4 43//4 47//4 +f 32//3 48//3 44//3 +f 28//3 46//3 41//3 +f 20//4 42//4 45//4 +f 41//6 46//6 47//6 +f 44//6 48//6 45//6 +f 41//7 43//7 11//7 +f 44//7 42//7 7//7 +f 6//8 45//8 48//8 +f 12//8 47//8 46//8 +f 3//9 38//9 40//9 +f 36//9 34//9 1//9 +f 2//10 33//10 35//10 +f 39//10 37//10 4//10 +f 55//6 56//6 53//6 +f 52//3 56//3 55//3 +f 49//4 54//4 53//4 +f 51//11 53//11 56//11 +f 50//12 55//12 54//12 +f 60//6 59//6 57//6 +f 64//1 63//1 59//1 +f 61//2 62//2 58//2 +f 65//5 66//5 62//5 +f 68//5 67//5 63//5 +f 72//2 71//2 67//2 +f 69//1 70//1 66//1 +f 69//5 71//5 72//5 +f 58//3 70//3 72//3 +f 62//3 66//3 70//3 +f 64//3 60//3 72//3 +f 71//4 69//4 57//4 +f 63//4 67//4 71//4 +f 61//4 57//4 69//4 +f 75//3 76//3 74//3 +f 78//4 80//4 79//4 +f 76//1 80//1 78//1 +f 73//2 77//2 79//2 +f 75//5 79//5 80//5 +f 126//13 127//13 119//13 +f 90//3 89//3 91//3 +f 91//3 92//3 90//3 +f 92//3 93//3 90//3 +f 93//3 94//3 95//3 +f 95//3 96//3 90//3 +f 81//14 90//14 96//14 +f 86//13 87//13 95//13 +f 84//15 85//15 93//15 +f 82//16 83//16 91//16 +f 87//17 88//17 96//17 +f 85//18 86//18 94//18 +f 84//19 92//19 91//19 +f 82//20 89//20 90//20 +f 106//3 105//3 107//3 +f 107//3 108//3 106//3 +f 108//3 109//3 106//3 +f 109//3 110//3 111//3 +f 111//3 112//3 106//3 +f 98//14 106//14 112//14 +f 102//13 103//13 111//13 +f 101//15 109//15 108//15 +f 97//16 99//16 107//16 +f 104//17 112//17 111//17 +f 102//18 110//18 109//18 +f 100//19 108//19 107//19 +f 97//20 105//20 106//20 +f 124//15 125//15 117//15 +f 121//16 123//16 115//16 +f 127//17 128//17 120//17 +f 125//18 126//18 118//18 +f 123//19 124//19 116//19 +f 122//20 121//20 113//20 +f 128//14 122//14 114//14 +f 123//4 121//4 122//4 +f 122//4 128//4 127//4 +f 127//4 126//4 125//4 +f 125//4 124//4 123//4 +f 123//4 122//4 127//4 +f 130//5 132//5 131//5 +f 135//6 136//6 134//6 +f 131//7 135//7 133//7 +f 132//3 136//3 135//3 +f 130//8 134//8 136//8 +f 129//4 133//4 134//4 +f 138//5 140//5 139//5 +f 143//6 144//6 142//6 +f 139//7 143//7 141//7 +f 140//3 144//3 143//3 +f 138//8 142//8 144//8 +f 137//4 141//4 142//4 +f 154//6 153//6 157//6 +f 153//6 155//6 157//6 +f 155//6 156//6 157//6 +f 157//6 158//6 159//6 +f 159//6 160//6 154//6 +f 145//21 154//21 160//21 +f 151//22 159//22 158//22 +f 149//23 157//23 156//23 +f 147//24 155//24 153//24 +f 152//25 160//25 159//25 +f 150//26 158//26 157//26 +f 148//27 156//27 155//27 +f 145//28 146//28 153//28 +f 163//5 164//5 162//5 +f 167//6 168//6 165//6 +f 161//4 166//4 165//4 +f 163//1 165//1 168//1 +f 162//2 167//2 166//2 +f 164//3 168//3 167//3 +f 171//1 172//1 170//1 +f 174//2 176//2 175//2 +f 182//2 184//2 183//2 +f 170//6 174//6 173//6 +f 179//1 180//1 178//1 +f 171//5 175//5 176//5 +f 178//6 182//6 181//6 +f 179//5 183//5 184//5