From 5c33fa17070dca0b720b3c9a534a35b70d5c043e Mon Sep 17 00:00:00 2001 From: Boblet Date: Thu, 7 Dec 2023 16:39:20 +0100 Subject: [PATCH] finished RBMK console, more upgrade stuff --- changelog | 6 ++ .../inventory/gui/GUIMachineArcWelder.java | 5 +- .../inventory/gui/GUIMachineAssembler.java | 7 +- .../com/hbm/inventory/gui/GUIRBMKConsole.java | 99 +++++++++++++++--- .../hbm/inventory/gui/GuiInfoContainer.java | 32 ++++++ .../inventory/recipes/CompressorRecipes.java | 2 + .../hbm/tileentity/IUpgradeInfoProvider.java | 13 +++ .../machine/TileEntityFurnaceIron.java | 27 ++++- .../machine/TileEntityMachineArcWelder.java | 33 +++++- .../machine/TileEntityMachineAssembler.java | 36 ++++++- .../machine/TileEntityMachineChemfac.java | 2 +- .../machine/TileEntityMachineChemplant.java | 2 +- .../machine/TileEntityMachineCompressor.java | 1 + .../TileEntityMachineElectricFurnace.java | 17 ++- .../machine/rbmk/TileEntityRBMKBoiler.java | 20 ++-- .../machine/rbmk/TileEntityRBMKConsole.java | 40 ++++++- src/main/resources/assets/hbm/lang/de_DE.lang | 3 + src/main/resources/assets/hbm/lang/en_US.lang | 17 +-- .../gui/processing/gui_arc_welder.png | Bin 2952 -> 2981 bytes .../gui/reactors/gui_rbmk_console.png | Bin 6569 -> 6651 bytes 20 files changed, 317 insertions(+), 45 deletions(-) diff --git a/changelog b/changelog index 7abe48a6f..b0650e213 100644 --- a/changelog +++ b/changelog @@ -30,6 +30,12 @@ * Missile parts such as non-custom thrusters and fuselages are now made in the arc welder, recipe ingredients have been adjusted as well * Null grenades now have a slightly larger radius, should no longer wipe playerdata and require UNDEFINED to make * Added some breedable material to BFB PWR fuel rods, meaning that the recycling recipes now actually yield a net positive instead of being a massive waste of time +* The RBMK control panel has been upgraded + * Right.clicking the color buttons will now assign the color to the selected control rods + * There's now a new button that allows to cycle through compressor settings on RBMK steam channels + * The flux display is now functional. It will display the flux curve of the last 30 seconds, as well as labels for the total flux level. + * With the color assigning buttons and the flux display finished, the console is now finally complete +* Compressing blood at 4 PU now turns it into crude oil at a ratio of 2:1 ## Fixed * Fixed ancient bug where custom missiles launched using the launch table would not use the accuracy calculation and always be pin-point accurate diff --git a/src/main/java/com/hbm/inventory/gui/GUIMachineArcWelder.java b/src/main/java/com/hbm/inventory/gui/GUIMachineArcWelder.java index e37e7cf05..ae993fb9a 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIMachineArcWelder.java +++ b/src/main/java/com/hbm/inventory/gui/GUIMachineArcWelder.java @@ -30,6 +30,8 @@ public class GUIMachineArcWelder extends GuiInfoContainer { welder.tank.renderTankInfo(this, x, y, guiLeft + 35, guiTop + 63, 34, 16); this.drawElectricityInfo(this, x, y, guiLeft + 152, guiTop + 18, 16, 52, welder.getPower(), welder.getMaxPower()); + + this.drawCustomInfoStat(x, y, guiLeft + 78, guiTop + 67, 8, 8, guiLeft + 78, guiTop + 67, this.getUpgradeInfo(welder)); } @Override @@ -54,7 +56,8 @@ public class GUIMachineArcWelder extends GuiInfoContainer { if(welder.power >= welder.consumption) { drawTexturedModalRect(guiLeft + 156, guiTop + 4, 176, 52, 9, 12); } - + + this.drawInfoPanel(guiLeft + 78, guiTop + 67, 8, 8, 8); welder.tank.renderTank(guiLeft + 35, guiTop + 79, this.zLevel, 34, 16, 1); } } diff --git a/src/main/java/com/hbm/inventory/gui/GUIMachineAssembler.java b/src/main/java/com/hbm/inventory/gui/GUIMachineAssembler.java index 31ebd23ec..795d8882b 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIMachineAssembler.java +++ b/src/main/java/com/hbm/inventory/gui/GUIMachineAssembler.java @@ -41,12 +41,7 @@ public class GUIMachineAssembler extends GuiInfoContainer { String[] templateText = I18nUtil.resolveKeyArray("desc.gui.template"); this.drawCustomInfoStat(mouseX, mouseY, guiLeft - 16, guiTop + 16, 16, 16, guiLeft - 8, guiTop + 16 + 16, templateText); - String[] upgradeText = new String[3]; - upgradeText[0] = I18nUtil.resolveKey("desc.gui.upgrade"); - upgradeText[1] = I18nUtil.resolveKey("desc.gui.upgrade.speed"); - upgradeText[2] = I18nUtil.resolveKey("desc.gui.upgrade.power"); - - this.drawCustomInfoStat(mouseX, mouseY, guiLeft + 141, guiTop + 40, 8, 8, guiLeft + 225, guiTop + 40 + 16 + 8, upgradeText); + this.drawCustomInfoStat(mouseX, mouseY, guiLeft + 141, guiTop + 40, 8, 8, guiLeft + 225, guiTop + 40 + 16 + 8, this.getUpgradeInfo(assembler)); } @Override diff --git a/src/main/java/com/hbm/inventory/gui/GUIRBMKConsole.java b/src/main/java/com/hbm/inventory/gui/GUIRBMKConsole.java index 1f8d20881..b07d3a19c 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIRBMKConsole.java +++ b/src/main/java/com/hbm/inventory/gui/GUIRBMKConsole.java @@ -22,6 +22,7 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.audio.PositionedSoundRecord; import net.minecraft.client.gui.GuiScreen; import net.minecraft.client.gui.GuiTextField; +import net.minecraft.client.renderer.Tessellator; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.EnumChatFormatting; @@ -102,11 +103,12 @@ public class GUIRBMKConsole extends GuiScreen { } } - this.drawCustomInfoStat(mouseX, mouseY, guiLeft + 6, guiTop + 70, 10, 10, mouseX, mouseY, new String[]{ "Select red group" } ); - this.drawCustomInfoStat(mouseX, mouseY, guiLeft + 17, guiTop + 70, 10, 10, mouseX, mouseY, new String[]{ "Select yellow group" } ); - this.drawCustomInfoStat(mouseX, mouseY, guiLeft + 28, guiTop + 70, 10, 10, mouseX, mouseY, new String[]{ "Select green group" } ); - this.drawCustomInfoStat(mouseX, mouseY, guiLeft + 39, guiTop + 70, 10, 10, mouseX, mouseY, new String[]{ "Select blue group" } ); - this.drawCustomInfoStat(mouseX, mouseY, guiLeft + 50, guiTop + 70, 10, 10, mouseX, mouseY, new String[]{ "Select purple group" } ); + this.drawCustomInfoStat(mouseX, mouseY, guiLeft + 6, guiTop + 70, 10, 10, mouseX, mouseY, new String[]{ EnumChatFormatting.RED + "Left click: Select red group", EnumChatFormatting.RED + "Right click: Assign red group" } ); + this.drawCustomInfoStat(mouseX, mouseY, guiLeft + 17, guiTop + 70, 10, 10, mouseX, mouseY, new String[]{ EnumChatFormatting.YELLOW + "Left click: Select yellow group", EnumChatFormatting.YELLOW + "Right click: Assign yellow group" } ); + this.drawCustomInfoStat(mouseX, mouseY, guiLeft + 28, guiTop + 70, 10, 10, mouseX, mouseY, new String[]{ EnumChatFormatting.GREEN + "Left click: Select green group", EnumChatFormatting.GREEN + "Right click: Assign green group" } ); + this.drawCustomInfoStat(mouseX, mouseY, guiLeft + 39, guiTop + 70, 10, 10, mouseX, mouseY, new String[]{ EnumChatFormatting.BLUE + "Left click: Select blue group", EnumChatFormatting.BLUE + "Right click: Assign blue group" } ); + this.drawCustomInfoStat(mouseX, mouseY, guiLeft + 50, guiTop + 70, 10, 10, mouseX, mouseY, new String[]{ EnumChatFormatting.LIGHT_PURPLE + "Left click: Select purple group", EnumChatFormatting.LIGHT_PURPLE + "Right click: Assign purple group" } ); + this.drawCustomInfoStat(mouseX, mouseY, guiLeft + 70, guiTop + 82, 12, 12, mouseX, mouseY, new String[]{ "Cycle steam channel compressor setting" } ); } public void drawCustomInfoStat(int mouseX, int mouseY, int x, int y, int width, int height, int tPosX, int tPosY, String[] text) { @@ -116,9 +118,12 @@ public class GUIRBMKConsole extends GuiScreen { } @Override - protected void mouseClicked(int mouseX, int mouseY, int i) { - super.mouseClicked(mouseX, mouseY, i); - this.field.mouseClicked(mouseX, mouseY, i); + protected void mouseClicked(int mouseX, int mouseY, int key) { + super.mouseClicked(mouseX, mouseY, key); + this.field.mouseClicked(mouseX, mouseY, key); + + int LEFT_CLICK = 0; + int RIGTH_CLICK = 1; int bX = 86; int bY = 11; @@ -158,19 +163,54 @@ public class GUIRBMKConsole extends GuiScreen { return; } + //compressor + if(guiLeft + 70 <= mouseX && guiLeft + 70 + 12 > mouseX && guiTop + 82 < mouseY && guiTop + 82 + 12 >= mouseY) { + NBTTagCompound control = new NBTTagCompound(); + control.setBoolean("compressor", true); + List ints = new ArrayList(); + for(int j = 0; j < console.columns.length; j++) { + if(console.columns[j] != null && console.columns[j].type == ColumnType.BOILER && this.selection[j]) { + ints.add(j); + } + } + int[] cols = new int[ints.size()]; + for(int i = 0; i < cols.length; i++) cols[i] = ints.get(i); + control.setIntArray("cols", cols); + PacketDispatcher.wrapper.sendToServer(new NBTControlPacket(control, console.xCoord, console.yCoord, console.zCoord)); + mc.getSoundHandler().playSound(PositionedSoundRecord.func_147674_a(new ResourceLocation("gui.button.press"), 1F)); + } + //select color groups for(int k = 0; k < 5; k++) { if(guiLeft + 6 + k * 11 <= mouseX && guiLeft + 6 + k * 11 + 10 > mouseX && guiTop + 70 < mouseY && guiTop + 70 + 10 >= mouseY) { - this.selection = new boolean[15 * 15]; - for(int j = 0; j < console.columns.length; j++) { + if(key == LEFT_CLICK) { + this.selection = new boolean[15 * 15]; - if(console.columns[j] != null && console.columns[j].type == ColumnType.CONTROL && console.columns[j].data.getShort("color") == k) { - this.selection[j] = true; + for(int j = 0; j < console.columns.length; j++) { + + if(console.columns[j] != null && console.columns[j].type == ColumnType.CONTROL && console.columns[j].data.getShort("color") == k) { + this.selection[j] = true; + } } } + if(key == RIGTH_CLICK) { + NBTTagCompound control = new NBTTagCompound(); + control.setByte("assignColor", (byte) k); + List ints = new ArrayList(); + for(int j = 0; j < console.columns.length; j++) { + if(console.columns[j] != null && console.columns[j].type == ColumnType.CONTROL && this.selection[j]) { + ints.add(j); + } + } + int[] cols = new int[ints.size()]; + for(int i = 0; i < cols.length; i++) cols[i] = ints.get(i); + control.setIntArray("cols", cols); + PacketDispatcher.wrapper.sendToServer(new NBTControlPacket(control, console.xCoord, console.yCoord, console.zCoord)); + } + mc.getSoundHandler().playSound(PositionedSoundRecord.func_147674_a(new ResourceLocation("gui.button.press"), 0.8F + k * 0.1F)); return; } @@ -358,6 +398,41 @@ public class GUIRBMKConsole extends GuiScreen { drawTexturedModalRect(guiLeft + x, guiTop + y, 0, 192, 10, 10); } + int highest = Integer.MIN_VALUE; + int lowest = Integer.MAX_VALUE; + + for(int i : console.fluxBuffer) { + if(i > highest) highest = i; + if(i < lowest) lowest = i; + } + + GL11.glDisable(GL11.GL_TEXTURE_2D); + GL11.glLineWidth(2F); + Tessellator tess = Tessellator.instance; + tess.startDrawing(GL11.GL_LINES); + tess.setColorOpaque_I(0x00ff00); + int range = highest - lowest; + for(int i = 0; i < console.fluxBuffer.length - 1; i++) { + for(int j = 0; j < 2; j++) { + int k = i + j; + int flux = console.fluxBuffer[k]; + double x = guiLeft + 7 + k * 74D / console.fluxBuffer.length; + double y = guiTop + 127 - (flux - lowest) * 24D / Math.max(range, 1); + tess.addVertex(x, y, this.zLevel + 10); + } + } + tess.draw(); + GL11.glEnable(GL11.GL_TEXTURE_2D); + + GL11.glPushMatrix(); + double scale = 0.5D; + GL11.glScaled(scale, scale, 1); + this.fontRendererObj.drawString(highest + "", (int) ((guiLeft + 8) / scale), (int) ((guiTop + 98) / scale), 0x00ff00); + this.fontRendererObj.drawString(highest + "", (int) ((guiLeft + 80 - this.fontRendererObj.getStringWidth(highest + "") * scale) / scale), (int) ((guiTop + 98) / scale), 0x00ff00); + this.fontRendererObj.drawString(lowest + "", (int) ((guiLeft + 8) / scale), (int) ((guiTop + 133 - this.fontRendererObj.FONT_HEIGHT * scale) / scale), 0x00ff00); + this.fontRendererObj.drawString(lowest + "", (int) ((guiLeft + 80 - this.fontRendererObj.getStringWidth(lowest + "") * scale) / scale), (int) ((guiTop + 133 - this.fontRendererObj.FONT_HEIGHT * scale) / scale), 0x00ff00); + GL11.glPopMatrix(); + this.field.drawTextBox(); } diff --git a/src/main/java/com/hbm/inventory/gui/GuiInfoContainer.java b/src/main/java/com/hbm/inventory/gui/GuiInfoContainer.java index 1ae9a28e9..51bc6d957 100644 --- a/src/main/java/com/hbm/inventory/gui/GuiInfoContainer.java +++ b/src/main/java/com/hbm/inventory/gui/GuiInfoContainer.java @@ -1,5 +1,6 @@ package com.hbm.inventory.gui; +import java.util.ArrayList; import java.util.Arrays; import java.util.Iterator; import java.util.List; @@ -7,8 +8,11 @@ import java.util.List; import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL12; +import com.hbm.items.machine.ItemMachineUpgrade.UpgradeType; import com.hbm.lib.RefStrings; +import com.hbm.tileentity.IUpgradeInfoProvider; import com.hbm.util.BobMathUtil; +import com.hbm.util.I18nUtil; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.FontRenderer; @@ -18,6 +22,7 @@ import net.minecraft.client.renderer.entity.RenderItem; import net.minecraft.inventory.Container; import net.minecraft.inventory.Slot; import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; import net.minecraft.util.ResourceLocation; public abstract class GuiInfoContainer extends GuiContainer { @@ -45,6 +50,33 @@ public abstract class GuiInfoContainer extends GuiContainer { this.func_146283_a(Arrays.asList(text), x, y); } + /** Automatically grabs upgrade info out of the tile entity if it's a IUpgradeInfoProvider and crams the available info into a list for display. Automation, yeah! */ + public List getUpgradeInfo(TileEntity tile) { + List lines = new ArrayList(); + + if(tile instanceof IUpgradeInfoProvider) { + IUpgradeInfoProvider provider = (IUpgradeInfoProvider) tile; + + lines.add(I18nUtil.resolveKey("upgrade.gui.title")); + + for(UpgradeType type : UpgradeType.values()) { + if(provider.canProvideInfo(type, 0, false)) { + int maxLevel = provider.getMaxLevel(type); + switch(type) { + case SPEED: lines.add(I18nUtil.resolveKey("upgrade.gui.speed", maxLevel)); break; + case POWER: lines.add(I18nUtil.resolveKey("upgrade.gui.power", maxLevel)); break; + case EFFECT: lines.add(I18nUtil.resolveKey("upgrade.gui.effectiveness", maxLevel)); break; + case AFTERBURN: lines.add(I18nUtil.resolveKey("upgrade.gui.afterburner", maxLevel)); break; + case OVERDRIVE: lines.add(I18nUtil.resolveKey("upgrade.gui.overdrive", maxLevel)); break; + default: break; + } + } + } + } + + return lines; + } + @Deprecated public void drawCustomInfo(GuiInfoContainer gui, int mouseX, int mouseY, int x, int y, int width, int height, String[] text) { if(x <= mouseX && x + width > mouseX && y < mouseY && y + height >= mouseY) diff --git a/src/main/java/com/hbm/inventory/recipes/CompressorRecipes.java b/src/main/java/com/hbm/inventory/recipes/CompressorRecipes.java index c1cc077d9..9b5ef555d 100644 --- a/src/main/java/com/hbm/inventory/recipes/CompressorRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/CompressorRecipes.java @@ -25,6 +25,8 @@ public class CompressorRecipes extends SerializableRecipe { recipes.put(new Pair(Fluids.PETROLEUM, 0), new CompressorRecipe(2_000, new FluidStack(Fluids.PETROLEUM, 2_000, 1), 20)); recipes.put(new Pair(Fluids.PETROLEUM, 1), new CompressorRecipe(2_000, new FluidStack(Fluids.LPG, 1_000, 0), 20)); + + recipes.put(new Pair(Fluids.BLOOD, 3), new CompressorRecipe(1_000, new FluidStack(Fluids.OIL, 500, 0), 100)); } public static class CompressorRecipe { diff --git a/src/main/java/com/hbm/tileentity/IUpgradeInfoProvider.java b/src/main/java/com/hbm/tileentity/IUpgradeInfoProvider.java index 8c8396573..00ecd8ab1 100644 --- a/src/main/java/com/hbm/tileentity/IUpgradeInfoProvider.java +++ b/src/main/java/com/hbm/tileentity/IUpgradeInfoProvider.java @@ -3,9 +3,22 @@ package com.hbm.tileentity; import java.util.List; import com.hbm.items.machine.ItemMachineUpgrade.UpgradeType; +import com.hbm.util.I18nUtil; + +import net.minecraft.block.Block; +import net.minecraft.util.EnumChatFormatting; public interface IUpgradeInfoProvider { + /** If any of the automated display stuff should be applied for this upgrade. A level of 0 is used by the GUI's indicator, as opposed to the item tooltips */ public boolean canProvideInfo(UpgradeType type, int level, boolean extendedInfo); public void provideInfo(UpgradeType type, int level, List info, boolean extendedInfo); + public int getMaxLevel(UpgradeType type); + + public static String getStandardLabel(Block block) { + return EnumChatFormatting.GREEN.YELLOW + ">>> " + I18nUtil.resolveKey(block.getUnlocalizedName() + ".name") + " <<<"; + } + + public static final String KEY_CONSUMPTION = "upgrade.consumption"; + public static final String KEY_SPEED = "upgrade.speed"; } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityFurnaceIron.java b/src/main/java/com/hbm/tileentity/machine/TileEntityFurnaceIron.java index aafd90a83..920fd6458 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityFurnaceIron.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityFurnaceIron.java @@ -1,5 +1,8 @@ package com.hbm.tileentity.machine; +import java.util.List; + +import com.hbm.blocks.ModBlocks; import com.hbm.handler.pollution.PollutionHandler; import com.hbm.handler.pollution.PollutionHandler.PollutionType; import com.hbm.inventory.UpgradeManager; @@ -8,7 +11,9 @@ import com.hbm.inventory.gui.GUIFurnaceIron; import com.hbm.items.machine.ItemMachineUpgrade.UpgradeType; import com.hbm.module.ModuleBurnTime; import com.hbm.tileentity.IGUIProvider; +import com.hbm.tileentity.IUpgradeInfoProvider; import com.hbm.tileentity.TileEntityMachineBase; +import com.hbm.util.I18nUtil; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -19,10 +24,11 @@ import net.minecraft.item.ItemStack; import net.minecraft.item.crafting.FurnaceRecipes; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.EnumChatFormatting; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityFurnaceIron extends TileEntityMachineBase implements IGUIProvider { +public class TileEntityFurnaceIron extends TileEntityMachineBase implements IGUIProvider, IUpgradeInfoProvider { public int maxBurnTime; public int burnTime; @@ -234,4 +240,23 @@ public class TileEntityFurnaceIron extends TileEntityMachineBase implements IGUI public double getMaxRenderDistanceSquared() { return 65536.0D; } + + @Override + public boolean canProvideInfo(UpgradeType type, int level, boolean extendedInfo) { + return type == UpgradeType.SPEED; + } + + @Override + public void provideInfo(UpgradeType type, int level, List info, boolean extendedInfo) { + info.add(IUpgradeInfoProvider.getStandardLabel(ModBlocks.furnace_iron)); + if(type == UpgradeType.SPEED) { + info.add(EnumChatFormatting.GREEN + I18nUtil.resolveKey(this.KEY_SPEED, "-" + (level * 50 / 3) + "%")); + } + } + + @Override + public int getMaxLevel(UpgradeType type) { + if(type == UpgradeType.SPEED) return 3; + return 0; + } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineArcWelder.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineArcWelder.java index 669e4c71a..a2933ca1d 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineArcWelder.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineArcWelder.java @@ -1,6 +1,9 @@ package com.hbm.tileentity.machine; +import java.util.List; + import com.hbm.inventory.RecipesCommon.AStack; +import com.hbm.blocks.ModBlocks; import com.hbm.inventory.UpgradeManager; import com.hbm.inventory.container.ContainerMachineArcWelder; import com.hbm.inventory.fluid.Fluids; @@ -14,7 +17,9 @@ import com.hbm.packet.AuxParticlePacketNT; import com.hbm.packet.PacketDispatcher; import com.hbm.tileentity.IConditionalInvAccess; import com.hbm.tileentity.IGUIProvider; +import com.hbm.tileentity.IUpgradeInfoProvider; import com.hbm.tileentity.TileEntityMachineBase; +import com.hbm.util.I18nUtil; import com.hbm.util.fauxpointtwelve.BlockPos; import com.hbm.util.fauxpointtwelve.DirPos; @@ -30,10 +35,11 @@ import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.EnumChatFormatting; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityMachineArcWelder extends TileEntityMachineBase implements IEnergyUser, IFluidStandardReceiver, IConditionalInvAccess, IGUIProvider { +public class TileEntityMachineArcWelder extends TileEntityMachineBase implements IEnergyUser, IFluidStandardReceiver, IConditionalInvAccess, IGUIProvider, IUpgradeInfoProvider { public long power; public long maxPower = 2_000; @@ -340,4 +346,29 @@ public class TileEntityMachineArcWelder extends TileEntityMachineBase implements public double getMaxRenderDistanceSquared() { return 65536.0D; } + + @Override + public boolean canProvideInfo(UpgradeType type, int level, boolean extendedInfo) { + return type == UpgradeType.SPEED || type == UpgradeType.POWER; + } + + @Override + public void provideInfo(UpgradeType type, int level, List info, boolean extendedInfo) { + info.add(IUpgradeInfoProvider.getStandardLabel(ModBlocks.machine_electric_furnace_off)); + if(type == UpgradeType.SPEED) { + info.add(EnumChatFormatting.GREEN + I18nUtil.resolveKey(this.KEY_SPEED, "-" + (level * 100 / 6) + "%")); + info.add(EnumChatFormatting.RED + I18nUtil.resolveKey(this.KEY_CONSUMPTION, "+" + (level * 100) + "%")); + } + if(type == UpgradeType.POWER) { + info.add(EnumChatFormatting.GREEN + I18nUtil.resolveKey(this.KEY_CONSUMPTION, "-" + (level * 100 / 6) + "%")); + info.add(EnumChatFormatting.RED + I18nUtil.resolveKey(this.KEY_SPEED, "+" + (level * 100 / 3) + "%")); + } + } + + @Override + public int getMaxLevel(UpgradeType type) { + if(type == UpgradeType.SPEED) return 3; + if(type == UpgradeType.POWER) return 3; + return 0; + } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAssembler.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAssembler.java index 3c0893c5f..cddb1a40f 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAssembler.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAssembler.java @@ -1,5 +1,6 @@ package com.hbm.tileentity.machine; +import java.util.List; import java.util.Random; import com.hbm.blocks.BlockDummyable; @@ -14,6 +15,9 @@ import com.hbm.items.machine.ItemAssemblyTemplate; import com.hbm.items.machine.ItemMachineUpgrade.UpgradeType; import com.hbm.main.MainRegistry; import com.hbm.sound.AudioWrapper; +import com.hbm.tileentity.IUpgradeInfoProvider; +import com.hbm.util.BobMathUtil; +import com.hbm.util.I18nUtil; import com.hbm.util.fauxpointtwelve.DirPos; import api.hbm.energy.IBatteryItem; @@ -25,10 +29,11 @@ import net.minecraft.inventory.Container; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.EnumChatFormatting; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityMachineAssembler extends TileEntityMachineAssemblerBase { +public class TileEntityMachineAssembler extends TileEntityMachineAssemblerBase implements IUpgradeInfoProvider { public int recipe = -1; @@ -265,4 +270,33 @@ public class TileEntityMachineAssembler extends TileEntityMachineAssemblerBase { public GuiScreen provideGUI(int ID, EntityPlayer player, World world, int x, int y, int z) { return new GUIMachineAssembler(player.inventory, this); } + + @Override + public boolean canProvideInfo(UpgradeType type, int level, boolean extendedInfo) { + return type == UpgradeType.SPEED || type == UpgradeType.POWER || type == UpgradeType.OVERDRIVE; + } + + @Override + public void provideInfo(UpgradeType type, int level, List info, boolean extendedInfo) { + info.add(IUpgradeInfoProvider.getStandardLabel(ModBlocks.machine_assembler)); + if(type == UpgradeType.SPEED) { + info.add(EnumChatFormatting.GREEN + I18nUtil.resolveKey(this.KEY_SPEED, "-" + (level * 25) + "%")); + info.add(EnumChatFormatting.RED + I18nUtil.resolveKey(this.KEY_CONSUMPTION, "+" + (level * 300) + "%")); + } + if(type == UpgradeType.POWER) { + info.add(EnumChatFormatting.GREEN + I18nUtil.resolveKey(this.KEY_CONSUMPTION, "-" + (level * 30) + "%")); + info.add(EnumChatFormatting.RED + I18nUtil.resolveKey(this.KEY_SPEED, "+" + (level * 5) + "%")); + } + if(type == UpgradeType.OVERDRIVE) { + info.add((BobMathUtil.getBlink() ? EnumChatFormatting.RED : EnumChatFormatting.DARK_GRAY) + "YES"); + } + } + + @Override + public int getMaxLevel(UpgradeType type) { + if(type == UpgradeType.SPEED) return 3; + if(type == UpgradeType.POWER) return 3; + if(type == UpgradeType.OVERDRIVE) return 3; + return 0; + } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemfac.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemfac.java index 3f7413677..f838e1082 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemfac.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemfac.java @@ -88,7 +88,7 @@ public class TileEntityMachineChemfac extends TileEntityMachineChemplantBase { this.speed -= speedLevel * 15; this.consumption += speedLevel * 300; this.speed += powerLevel * 5; - this.consumption -= powerLevel * 30; + this.consumption -= powerLevel * 20; this.speed /= (overLevel + 1); this.consumption *= (overLevel + 1); diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemplant.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemplant.java index edc19ee83..d78b87c9f 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemplant.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemplant.java @@ -124,7 +124,7 @@ public class TileEntityMachineChemplant extends TileEntityMachineBase implements this.speed -= speedLevel * 25; this.consumption += speedLevel * 300; this.speed += powerLevel * 5; - this.consumption -= powerLevel * 30; + this.consumption -= powerLevel * 20; this.speed /= (overLevel + 1); this.consumption *= (overLevel + 1); diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCompressor.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCompressor.java index 89be677fc..fa99ad805 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCompressor.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCompressor.java @@ -84,6 +84,7 @@ public class TileEntityMachineCompressor extends TileEntityMachineBase implement if(rec != null) timeBase = rec.duration; //there is a reason to do this but i'm not telling you + // ^ a few months later i have to wonder what the fuck this guy was on about, and if i ever see him i will punch him in the nuts if(timeBase == this.processTimeBase) this.processTime = speedLevel == 3 ? 10 : speedLevel == 2 ? 20 : speedLevel == 1 ? 60 : timeBase; else this.processTime = timeBase / (speedLevel + 1); this.powerRequirement = this.powerRequirementBase / (powerLevel + 1); diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineElectricFurnace.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineElectricFurnace.java index 4c546e019..8757970f5 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineElectricFurnace.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineElectricFurnace.java @@ -277,14 +277,21 @@ public class TileEntityMachineElectricFurnace extends TileEntityMachineBase impl @Override public void provideInfo(UpgradeType type, int level, List info, boolean extendedInfo) { - info.add(EnumChatFormatting.GREEN.YELLOW + ">>> " + I18nUtil.resolveKey(ModBlocks.machine_electric_furnace_off.getUnlocalizedName() + ".name") + " <<<"); + info.add(IUpgradeInfoProvider.getStandardLabel(ModBlocks.machine_electric_furnace_off)); if(type == UpgradeType.SPEED) { - info.add(EnumChatFormatting.GREEN + "Process time -" + (level * 25) + "%"); - info.add(EnumChatFormatting.RED + "Consumption +" + (level * 100) + "%"); + info.add(EnumChatFormatting.GREEN + I18nUtil.resolveKey(this.KEY_SPEED, "-" + (level * 25) + "%")); + info.add(EnumChatFormatting.RED + I18nUtil.resolveKey(this.KEY_CONSUMPTION, "+" + (level * 100) + "%")); } if(type == UpgradeType.POWER) { - info.add(EnumChatFormatting.GREEN + "Consumption -" + (level * 30) + "%"); - info.add(EnumChatFormatting.RED + "Process time +" + (level * 10) + "%"); + info.add(EnumChatFormatting.GREEN + I18nUtil.resolveKey(this.KEY_CONSUMPTION, "-" + (level * 30) + "%")); + info.add(EnumChatFormatting.RED + I18nUtil.resolveKey(this.KEY_SPEED, "+" + (level * 10) + "%")); } } + + @Override + public int getMaxLevel(UpgradeType type) { + if(type == UpgradeType.SPEED) return 3; + if(type == UpgradeType.POWER) return 3; + return 0; + } } \ No newline at end of file diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKBoiler.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKBoiler.java index 44baadde9..9c96a4893 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKBoiler.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKBoiler.java @@ -263,17 +263,21 @@ public class TileEntityRBMKBoiler extends TileEntityRBMKSlottedBase implements I public void receiveControl(NBTTagCompound data) { if(data.hasKey("compression")) { - - FluidType type = steam.getTankType(); - if(type == Fluids.STEAM) { steam.setTankType(Fluids.HOTSTEAM); steam.setFill(steam.getFill() / 10); } - if(type == Fluids.HOTSTEAM) { steam.setTankType(Fluids.SUPERHOTSTEAM); steam.setFill(steam.getFill() / 10); } - if(type == Fluids.SUPERHOTSTEAM) { steam.setTankType(Fluids.ULTRAHOTSTEAM); steam.setFill(steam.getFill() / 10); } - if(type == Fluids.ULTRAHOTSTEAM) { steam.setTankType(Fluids.STEAM); steam.setFill(Math.min(steam.getFill() * 1000, steam.getMaxFill())); } - - this.markDirty(); + this.cyceCompressor(); } } + public void cyceCompressor() { + + FluidType type = steam.getTankType(); + if(type == Fluids.STEAM) { steam.setTankType(Fluids.HOTSTEAM); steam.setFill(steam.getFill() / 10); } + if(type == Fluids.HOTSTEAM) { steam.setTankType(Fluids.SUPERHOTSTEAM); steam.setFill(steam.getFill() / 10); } + if(type == Fluids.SUPERHOTSTEAM) { steam.setTankType(Fluids.ULTRAHOTSTEAM); steam.setFill(steam.getFill() / 10); } + if(type == Fluids.ULTRAHOTSTEAM) { steam.setTankType(Fluids.STEAM); steam.setFill(Math.min(steam.getFill() * 1000, steam.getMaxFill())); } + + this.markDirty(); + } + @Override public void onMelt(int reduce) { diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKConsole.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKConsole.java index dce56b111..ee5690703 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKConsole.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKConsole.java @@ -12,6 +12,7 @@ import com.hbm.inventory.gui.GUIRBMKConsole; import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.TileEntityMachineBase; import com.hbm.tileentity.machine.rbmk.TileEntityRBMKControlManual.RBMKColor; +import com.hbm.util.EnumUtil; import com.hbm.util.I18nUtil; import cpw.mods.fml.relauncher.Side; @@ -33,7 +34,8 @@ public class TileEntityRBMKConsole extends TileEntityMachineBase implements ICon private int targetY; private int targetZ; - public int[] fluxBuffer = new int[20]; + public static final int fluxDisplayBuffer = 60; + public int[] fluxBuffer = new int[fluxDisplayBuffer]; //made this one-dimensional because it's a lot easier to serialize public RBMKColumn[] columns = new RBMKColumn[15 * 15]; @@ -104,7 +106,7 @@ public class TileEntityRBMKConsole extends TileEntityMachineBase implements ICon this.fluxBuffer[i] = this.fluxBuffer[i + 1]; } - this.fluxBuffer[19] = (int) flux; + this.fluxBuffer[this.fluxBuffer.length - 1] = (int) flux; } @SuppressWarnings("incomplete-switch") //shut up @@ -287,6 +289,40 @@ public class TileEntityRBMKConsole extends TileEntityMachineBase implements ICon Integer[] cols = list.toArray(new Integer[0]); this.screens[slot].columns = cols; } + + if(data.hasKey("assignColor")) { + int color = data.getByte("assignColor"); + int[] cols = data.getIntArray("cols"); + + for(int i : cols) { + int x = i % 15 - 7; + int z = i / 15 - 7; + + TileEntity te = worldObj.getTileEntity(targetX + x, targetY, targetZ + z); + + if(te instanceof TileEntityRBMKControlManual) { + TileEntityRBMKControlManual rod = (TileEntityRBMKControlManual) te; + rod.color = EnumUtil.grabEnumSafely(RBMKColor.class, color); + te.markDirty(); + } + } + } + + if(data.hasKey("compressor")) { + int[] cols = data.getIntArray("cols"); + + for(int i : cols) { + int x = i % 15 - 7; + int z = i / 15 - 7; + + TileEntity te = worldObj.getTileEntity(targetX + x, targetY, targetZ + z); + + if(te instanceof TileEntityRBMKBoiler) { + TileEntityRBMKBoiler rod = (TileEntityRBMKBoiler) te; + rod.cyceCompressor(); + } + } + } } @Override diff --git a/src/main/resources/assets/hbm/lang/de_DE.lang b/src/main/resources/assets/hbm/lang/de_DE.lang index 9cd2d7a8f..8edc158e4 100644 --- a/src/main/resources/assets/hbm/lang/de_DE.lang +++ b/src/main/resources/assets/hbm/lang/de_DE.lang @@ -4617,6 +4617,9 @@ turret.off=AUS turret.on=AN turret.players=Spieler anzielen: %s +upgrade.consumption=Verbrauch %s +upgrade.speed=Verarbeitungszeit %s + wavelengths.name.ir=Infrarot wavelengths.name.visible=Sichtbares Licht wavelengths.name.uv=Ultraviolett diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index 101515558..5d2ef5a8d 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -885,16 +885,11 @@ desc.gui.template=§9Templates§r$Templates can be made by$using the Machine Tem desc.gui.turbinegas.automode=§2Automatic Turbine Throttling Mode§r$By clicking the "AUTO" button, the turbine$will automatically adjust the power production$based on the power required from the network desc.gui.turbinegas.fuels=§6Accepted fuels:§r desc.gui.turbinegas.warning=§cFuel or lubricant level low!§r -desc.gui.upgrade=§lAcceptable Upgrades:§r -desc.gui.upgrade.afterburner= * §dAfterburner§r: Stacks to level 3 -desc.gui.upgrade.effectiveness= * §aEffectiveness§r: Stacks to level 3 -desc.gui.upgrade.overdrive= * §7Overdrive§r: Stacks to level 3 -desc.gui.upgrade.power= * §1Power-Saving§r: Stacks to level 3 -desc.gui.upgrade.speed= * §4Speed§r: Stacks to level 3 desc.gui.zirnox.coolant=§3Coolant§r$CO2 transfers heat from the core to the water.$This will boil it into super dense steam.$The efficiency of cooling and steam production$is based on pressure. desc.gui.zirnox.pressure=§6Pressure§r$Pressure can be reduced by venting CO2.$However, too low a pressure, and cooling$efficiency and steam production will be reduced.$Look out for meltdowns! desc.gui.zirnox.warning1=§cError:§r Water is required for$the reactor to function properly! desc.gui.zirnox.warning2=§cError:§r CO2 is required for$the reactor to function properly! + desc.item.ammo.con_accuracy2=- Highly decreased accuracy desc.item.ammo.con_damage=- Highly decreased damage desc.item.ammo.con_heavy_wear=- Highly increased wear @@ -5624,6 +5619,16 @@ turret.off=OFF turret.on=ON turret.players=Target Players: %s +upgrade.consumption=Consumption %s +upgrade.speed=Process time %s + +upgrade.gui.title=§lAcceptable Upgrades:§r +upgrade.gui.afterburner= * §dAfterburner§r: Stacks to level %s +upgrade.gui.effectiveness= * §aEffectiveness§r: Stacks to level %s +upgrade.gui.overdrive= * §7Overdrive§r: Stacks to level %s +upgrade.gui.power= * §9Power-Saving§r: Stacks to level %s +upgrade.gui.speed= * §4Speed§r: Stacks to level %s + wavelengths.name.ir=Infrared wavelengths.name.visible=Visible Light wavelengths.name.uv=Ultraviolet diff --git a/src/main/resources/assets/hbm/textures/gui/processing/gui_arc_welder.png b/src/main/resources/assets/hbm/textures/gui/processing/gui_arc_welder.png index 14366acc325432628c0d5dd3f694de688a8539d3..82c982cfa2527ba924a7a5ec95b3209ea8d52aef 100644 GIT binary patch literal 2981 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 SwRBim&(7M>>Y;`2um1w3mmDwv literal 2952 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 diff --git a/src/main/resources/assets/hbm/textures/gui/reactors/gui_rbmk_console.png b/src/main/resources/assets/hbm/textures/gui/reactors/gui_rbmk_console.png index 8771329375e75fd9e63ccd3ce38691e5f6f7106f..5222274f917d11bd982ed2decc290c11654942b3 100644 GIT binary patch literal 6651 zcma)BXESl2KQ&>q^ zb7ihogz*iv`cT?!9JS(1FQ2_xEixp2!=yre+q=?7j~u-rqb z@4VIuV}p-I80h;s@BhjQBbEq?R||b4k+3>KW+A10rMmV^t}Z8WesU|yYvZtP{(uky zpYlGM%BM?R^j>#Q^-RKWibFWKU*+yamOtyqk_yKnIYGM1-~@E5W=L;DbTpx!(kAI^ z33O;EsaP#%U~}W5WwaVq{$5(w?f?Eyjin*SNTxUr55O&89C z6%zEEm`CjxP7XE%$8s#r`<78_ten@_xwyE*DrT1f-B;hOo_hESBMbDJYN=bgs6`CIeLAw{G*2BvnbGm8@-T^D?q4Dj56w`v(?b+s{3-zGl0J%-(+a5&#jWt>2sMw&vhse*71gmuU7rc1gGtNi z%S4($70*$cJa~(EoEB|SEzWs)A=SQBus66z857!B5#sL#kGJ$EPn1<&yTQ?+rw`}E zO6yBL@Zynj|AUkXj)wHg#3ECY;PKD3dqR$3nVvsF;G)jFGZ|?i*}hc|UgJH88D1I) zczBZIsd(AhY9-<`_*(dqmbMaZRVE*3^2x5Eobv^gWTITU3j_=TWDgMsSQ=U)!%MpI zxJky9|J>;WAw$+fudQ?reEhIp3RFElsnzP0oupI7MXn<^$%@F#`0Y!#Nl{KFx9kE) zR6LpzP4#DgiVPTu24&Lm;PswsYlTYS0Q!gGz?;oxq!Im2hoYPqJ}r%ka`9i}Lz0SU zh2&A1*YGi2PbQ84U3dgB5=G|zSFo3QcQp^fL~!uL)UTUn3X-h^|CiU^3!ej%pj*co zX~s+MO*6XGjr1ibRaEG3c*&QhWaTr^;r?p)2|faHBtAG*d~m9hap>>p^-wN+>}l&% zh(x=3#=-pycOSFYsnWE2YcnEnVNmLjjx2@yAEzt)v+eq%PnfD;uW`xE2^+Bjy>-^s z5=3bV;bIZs|GztoyR(Da`|G%?D&P9jdlekS6g3HQC}9;W3U7m8LkuLE^ljtnmB!{n ziE?L>o;tC>&?Cp1y3Zy1HWX&l%@QJl&+;dNl+jx-SWKtxP!|P=jU^RB?R(f1_OQ6i zgz0m{@3X3NZ;uAk1LX$-lv?y4bh&+`#jWUjL zvv0*1e|D-4`9Q%h4P77EOHFV0T;-oWxHVB$SanN!Hzfay>1j)6~ul>7MfVoaa69Ac3~#lHC7@>B^w}LxOBq0AmhD zsFXG+%EhvM4~SUel#k&8$*X5Cv!d+|q!!1<(g2wMNaIvCVUqzmq~~{zi}eVy`)#sd_Z3Bw`17h| z-GpXpNzkR%-3f!gJZa`H1AgPBfX{ETRq6AAx&=~nJVfa2s(f@t>wei46>isI)pAzW zbvtR6-fQ7=%Vt~%Yb<}euMU`X7AA9 zTU0ITT?ezgh`2a$vMjY>Wz4zzPx_e_M&Zq|r(zZNRAg)_Av24v^OQcTnmz%k(~hk6 zGFWD76EPZe)2Z}khY3Mp-P?0X=e(D#kluioVF0>jHqrj+kt;LX0BGxP(4R~(fd)t~Jd@)VA$Oph9I;IhbPV@P8Z^!%RKW}k<@j>|l>lDT z>+H_XJs;6D2;|Z~9D)xD5om$*>Ju(fr^i>t%4Xgqo=|TkTA41K*X#`3@vleb={z!e`g(+4PuPGQx^QXAr zq2P`671I`hE?AD^1$UgPU6p-YUz`}%zd0-NJ;zF%^rHS~ZUVB8m!lct z?;ai;q+dOP2>Vq@0_=A(BgRLe=43TQA<#eiYs7`NlDi-=g5+NmD1avYcg->X3?2wl z_pM*WHf(LZ@ysCpU40o>-=g=B;vO9e7OGc_QvB9Quj4gbUW$aBVw$(69H1~@xC(cr zV!C{z@8Pz~talaM|Nb9=et3`2>iEPgy}1Z9k`R>cyoyGR?bQD8Hm)EKjCt|J5g4ap z+o#&2=_G}$l{W>)??=WcDUy@KFen+B1yaw0`)u^NxWb>&%1ie)f+Qj$<|D^j+=BT# zrb$B%;^#?MLNBT*^4+x=jG&JnE5L7tDe=3j^bAzQ&zH)C>eUC{Yi6Mh1;(g?5f|a7 zMG^wrFP~bL0@suQU>W7ZkY>8c0KD!b)4$IQPrInVbk&3sM_HP)16f|eO+WYlO0N2X zj#XBU)yRoe=Vm2jhyr*ViD?tQ++_B_>7Po90}-l_Clg1C-gq>ue)q=2h~wv-W@9jL z_S@yt`_@`&8dbx?y_zMt|2{Cs9 zKA%t#1o4=*MGh09>1Ynk^8Dz`35th6IAk})%PZhqb_x@*@v!~uGR&N zRG#kuXq_F&FY8i}t?z`Z4_I|P3Pcl6UY9GYaM7OJnhEnZApt(|8szSL(;FZ4Svg@8 zuB@eGJ4J-=TtW2SG2nYHWvuz9*%;IB7@YpeigArLZcJe_2wn6!j@t2j?#cWrzpw#! z^F_JkymtmGj!M6kaA^)GsA66>p;)L-(_->n9LsXsmfevIY*>2+pgX&#h=7Ts*m(WX zw;|~j@fZCI4Zh4Abxk?DIeh8qPm5vxV#ht(SxkxB@fxnWeVYE8 zlvK`$6@3~h<6Fdi{wQ!SV0_$kT)Y5l@5lxio*6kZ8@H|OJwr%FzL&rDffm>3W|@#% zDXa|#4$kER249fs3WY>+5RPJb5`+q!!o?8MKtWACyo+T3LXn(i(b3Vv6HFY<{77)j z(jucR)SO>AiUox3u`J4R=qZeO52X#vvz?)%mfl2DVw{Q_`nHiPZyz0OHc?k!O}xSX z;$xe_WlFTAff}(@N69xV>?ZKM<7UNS-BxobU5s<8_i1V6>8T}v$z#pm{I2O+sxtiI z8En&sYI1UNq|}-knCVGZc$1Q%*in{JdAy&TS$g0NlEJlq%U1ipmky7ua*ME7=_>qJiGwyC^Wl6d4*C)u~XwV^8PthqGA$vUM>#F8|a=iVNZlcQN zCNL9vX3}`xxj264MpAUZR!8=wV$Qcag%IFB-wfXJ1kQI`nK1#>3qd4QGabz0rjqFC zx@|JR*J7f^U6h!FqyrlzQ|&s(0m$?X=Y-ZP*gM$UQ#m;~jg(l1muebX3;GMZQ1!Pk zNT_`_F8;~5c1*`<>xbgvVN3W?+nmg<%SXB=q$Qotd$K};*2Bz=dUgmfbeht$d0!Xb zdxoL9&wgEhFqty$aI^1wR~KiBhQ)A!5fdwGi^}ZNHjyOtSb;|+FSZ5-E&=TEYLZn* zPQM`M)o)#2i|kn+cBeR@>JLsVv`-K0r)n-gDz|HRT3AaAR30t76PA<={rspR!KfYw zUTRzvH)y22T{Voh9uD>R;?AT(?@)JS#dFpgc^d?1qZ%F5x%2v=9v zSb=yodKr=;_nig(t7NoMN)ZEbadB_nzHJ=({3slSvpCl?+Z08&BH8>nI99ko^*mAp^K%LM?Igb$kZ2nvj+in9Gw;N( zh2G8d=Ybxa>ged;1DT({W?y%-!1+C0{*A8+*}>#KP3_m`2a^RS6Z?r*5BhF-gJ&!c z2_~I@#zVys!DI~^Dn#8m34;^CAO>veg>rGp`23j?CVQ-HcibDDJPk-!SPB3ICqy^p z5;(}JbYpwU_;=1{f(MCY1ZQORuCK07_&jAd;*OJZb-gW;M6tgkZ?UPQv7$>Hk>R*ztaNn`Ao2)8pAF*uH^*B?DLmOAAEz%3kJ}{|a@tfYd zuMa^Q@l2L>-(hawgmH80Lv#tZDKJ6R8?A3QyxJuHIv#tPI=rRMJ$H$y?33G}8HFAX zmlvdn&j!NLJL`PDVZAH&g!Glkr7NBaSOdRiW)-ic^wa%(1(nn5S4%)M)l9rjw7%XO zi_ZYJmEyt^IMie^*e>T%pMY27@zz{;JlfmaTS+1(ZMg95>L>rGLYW1_#UsIqcL3UV zxu$9K0H=+@Kj61HvuMyGFo$aGWj7uYG-c4V18_Hsr-*fm!|d+eBI(Rjjbn4O;GZ3d zB(@Lu{Eh2*3rfjopYe6uUcU}Jl=&mv0~Zk$4h*rZqFAM37pH%s2x0jfFV#6kW%6(l`oZVtw)Beq-kxr(Dr4i3a#{ag0RZQ2Gpg3p7A9u|>$T@k)4St} zKvLT2?XZxS(2SSi4mD4F=L_nc*Ux^kCHYPr-0s>R6C3t`1CHl{=j!+FT?g3B#$D3( zT4_mBf1u<;M69qIl8+)z9o~1#nwIYeV7tG6GBz<1W?=<5?nT7SZi#HBQTap7uToa9 zLpZKUpzuxY{~EgZfzq?UTWk>kgd;E}yN%ecVohXHRn@ic(Lv7s4`KIe3Y+is8Edq4 z(JdC+;v65~Zsh+}nEowM|IToRpz{B}VF{5j#mXMYza3xbb$v*%#^xhGM_}{cYZcS$ z?sjf&Ob3&$siileCy!Hxg&W8PYcOIUQsJQ4S+idgU;BmEjjCPDaO(U1Sgj2tK&BR= zjdFID9A_4{!z?ZFxU5f*vTv}@$NHjBmohUm>(;gy(9nPwN<$>L@kV=Q?MOBu`v<>~ zuTHQi7Retq4C6R&Y~pq!Grt&L3T6-rE&&i>u<#gpW&!G)I<5Uir5p(&gd;?&K0lwF z_3UhElP)@%#5Rr!4OLiL+Hfr&en5M7%$>~|fqQHL(v%ok$BMZQtmSAj+6X#3r`IC+ zlKtLsJt^kTU-*`3CmycLtM^pY4u+5#wM!U$cMqxTTW`_17Brm*%?sAkm7s-NfzGWmEm&_D!KUkb7WxSjU{ z#COM{KSQ6`*-=Qfw*G*p@WIZ7!s8}KF(*&rdQB&=TAbfD8Up@+ge+NgoL!pjY4rB{j96Y z$_8~Rii!Y0!sXYS93}D1hEP|02V!Or)!I%k09 z-1O$5bzKN^Ppum}d8Zje%2KP*AxqQ`W@DrB3L0Q zDmqsq5Dp;q9nvLea|aJWJIa;I1ELb=OBGuZbs-uk3vyyd#yhaH55mC)EG@T%Qap$m zbp(TLr*~Hs24=*!m7S@EubFz87 zS){E&k74XS51yV9bVNB9$EhqMskvhvBfP0f-yn%oHmSyWdsT*mb=$V)+ERMzGcyUJ zr4QMG^P)SDM4;w;CSYl)oe_GlyE}8ZHMjK_!NX86^oN3g6^M4@oS_4~ZT_~=Cw=D~ zQAk*q{M9tNNxjHZ5wk*S8}-20ur)#=SkXDgPb&&BPb6?@%4AGnMu&_)_^d1XuDKB8 z$JwA)rKhJS;c|9PjzWbIxzn451bKs&Ya*5vV6!5vvptT;XrUo*A_Zb}z0`BeXhP0O zV1NXNjb)Qy%OL3W)DAUJS4tRP)U4D_qoIC&PgAoRPT*cYt;+#S_>4c(|5``1k^D8x zb+N#FHsahzmI1peC2<^TFcEYM-a9AZFWEW6qx8JR<0?eh*CCV=_f}0Z8p9S#QS)jj zT7+aKel!1;;!?}Vh(0!ea$a^K6x?bj^;{Sl6HPFYj2_13+MG2{wwskNVNL3YDjTZW zDj+HgNuJU1MyU>?;&+bpQ_q=In?z(~so7JhLylQ2#=dl{cwuG?zg*!;G4Q^I$Fh~-SZ zj&_qriMQPSM{!-r>drBBO=1vtWOrvLg@=a+LGYGYY`EVyUQhs37Y5Zp*pVn&{&n8i z|4iTg`~=X_HQ6Yejtu{p=yg%t pii(M~yl5b{TI@00c{Q9=186Rwdngd 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 O1<=(r(kNAPi25(&%t8JD