diff --git a/src/main/java/com/hbm/items/ModItems.java b/src/main/java/com/hbm/items/ModItems.java index 6607a52be..8459990df 100644 --- a/src/main/java/com/hbm/items/ModItems.java +++ b/src/main/java/com/hbm/items/ModItems.java @@ -11,6 +11,7 @@ import com.hbm.items.armor.*; import com.hbm.items.bomb.*; import com.hbm.items.food.*; import com.hbm.items.machine.*; +import com.hbm.items.machine.ItemRBMKRod.EnumBurnFunc; import com.hbm.items.special.*; import com.hbm.items.tool.*; import com.hbm.items.tool.ItemToolAbility.EnumToolType; @@ -3297,18 +3298,21 @@ public class ModItems { rbmk_fuel_ueu = (ItemRBMKRod) new ItemRBMKRod(rbmk_pellet_ueu) .setYield(100000000D) .setStats(75) + .setFunction(EnumBurnFunc.PLATEU) .setMeltingPoint(2865) .addRadiation(ItemHazard.u * ItemHazard.rod_rbmk).toItem() .setUnlocalizedName("rbmk_fuel_ueu").setTextureName(RefStrings.MODID + ":rbmk_fuel_ueu"); rbmk_fuel_meu = (ItemRBMKRod) new ItemRBMKRod(rbmk_pellet_meu) .setYield(100000000D) .setStats(150) + .setFunction(EnumBurnFunc.LOG_TEN) .setMeltingPoint(2865) .addRadiation(ItemHazard.uf * ItemHazard.rod_rbmk).toItem() .setUnlocalizedName("rbmk_fuel_meu").setTextureName(RefStrings.MODID + ":rbmk_fuel_meu"); rbmk_fuel_thmeu = (ItemRBMKRod) new ItemRBMKRod(rbmk_pellet_thmeu) .setYield(100000000D) .setStats(75) + .setFunction(EnumBurnFunc.LOG_TEN) .setMeltingPoint(3350) .addRadiation(ItemHazard.thf * ItemHazard.rod_rbmk).toItem() .setUnlocalizedName("rbmk_fuel_thmeu").setTextureName(RefStrings.MODID + ":rbmk_fuel_thmeu"); @@ -3321,6 +3325,7 @@ public class ModItems { rbmk_fuel_mep = (ItemRBMKRod) new ItemRBMKRod(rbmk_pellet_mep) .setYield(100000000D) .setStats(215, 20) + .setFunction(EnumBurnFunc.SQUARE_ROOT) .setHeat(1.25D) .setMeltingPoint(2744) .addRadiation(ItemHazard.purg * ItemHazard.rod_rbmk).toItem() @@ -3328,6 +3333,7 @@ public class ModItems { rbmk_fuel_hep = (ItemRBMKRod) new ItemRBMKRod(rbmk_pellet_hep239) .setYield(100000000D) .setStats(250) + .setFunction(EnumBurnFunc.LINEAR) .setHeat(1.5D) .setMeltingPoint(2744) .addRadiation(ItemHazard.pu239 * ItemHazard.rod_rbmk).toItem() @@ -3335,6 +3341,7 @@ public class ModItems { rbmk_fuel_hep241 = (ItemRBMKRod) new ItemRBMKRod(rbmk_pellet_hep241) .setYield(100000000D) .setStats(280) + .setFunction(EnumBurnFunc.LINEAR) .setHeat(1.75D) .setMeltingPoint(2744) .addRadiation(ItemHazard.pu241 * ItemHazard.rod_rbmk).toItem() @@ -3342,6 +3349,7 @@ public class ModItems { rbmk_fuel_men = (ItemRBMKRod) new ItemRBMKRod(rbmk_pellet_men) .setYield(100000000D) .setStats(175) + .setFunction(EnumBurnFunc.SQUARE_ROOT) .setMeltingPoint(2800) .setNeutronTypes(NType.FAST, NType.FAST) .addRadiation(ItemHazard.npf * ItemHazard.rod_rbmk).toItem() @@ -3349,6 +3357,7 @@ public class ModItems { rbmk_fuel_mox = (ItemRBMKRod) new ItemRBMKRod(rbmk_pellet_mox) .setYield(100000000D) .setStats(130) + .setFunction(EnumBurnFunc.LOG_TEN) .setHeat(1.5D) .setMeltingPoint(2815) .addRadiation(ItemHazard.mox * ItemHazard.rod_rbmk).toItem() @@ -3356,6 +3365,7 @@ public class ModItems { rbmk_fuel_les = (ItemRBMKRod) new ItemRBMKRod(rbmk_pellet_les) .setYield(100000000D) .setStats(150) + .setFunction(EnumBurnFunc.SQUARE_ROOT) .setHeat(1.25D) .setMeltingPoint(2500) .addRadiation(ItemHazard.saf * ItemHazard.rod_rbmk).toItem() @@ -3363,6 +3373,7 @@ public class ModItems { rbmk_fuel_mes = (ItemRBMKRod) new ItemRBMKRod(rbmk_pellet_mes) .setYield(100000000D) .setStats(200) + .setFunction(EnumBurnFunc.ARCH) .setHeat(1.5D) .setMeltingPoint(2750) .addRadiation(ItemHazard.saf * ItemHazard.rod_rbmk).toItem() @@ -3370,23 +3381,27 @@ public class ModItems { rbmk_fuel_hes = (ItemRBMKRod) new ItemRBMKRod(rbmk_pellet_hes) .setYield(100000000D) .setStats(250) + .setFunction(EnumBurnFunc.LINEAR) .setHeat(1.75D) .setMeltingPoint(3000) .addRadiation(ItemHazard.saf * ItemHazard.rod_rbmk).toItem() .setUnlocalizedName("rbmk_fuel_hes").setTextureName(RefStrings.MODID + ":rbmk_fuel_hes"); rbmk_fuel_leaus = (ItemRBMKRod) new ItemRBMKRod(rbmk_pellet_leaus) .setYield(100000000D) + .setStats(100) + .setFunction(EnumBurnFunc.SIGMOID) .setHeat(1.5D) - .setMeltingPoint(7029) - .setStats(100).setUnlocalizedName("rbmk_fuel_leaus").setTextureName(RefStrings.MODID + ":rbmk_fuel_leaus"); + .setMeltingPoint(7029).setUnlocalizedName("rbmk_fuel_leaus").setTextureName(RefStrings.MODID + ":rbmk_fuel_leaus"); rbmk_fuel_heaus = (ItemRBMKRod) new ItemRBMKRod(rbmk_pellet_heaus) .setYield(100000000D) + .setStats(100) + .setFunction(EnumBurnFunc.SQUARE_ROOT) .setHeat(2D) - .setMeltingPoint(5211) - .setStats(100).setUnlocalizedName("rbmk_fuel_heaus").setTextureName(RefStrings.MODID + ":rbmk_fuel_heaus"); + .setMeltingPoint(5211).setUnlocalizedName("rbmk_fuel_heaus").setTextureName(RefStrings.MODID + ":rbmk_fuel_heaus"); rbmk_fuel_po210be = (ItemRBMKRod) new ItemRBMKRod(rbmk_pellet_po210be) .setYield(100000000D) .setStats(70, 50) + .setFunction(EnumBurnFunc.SQUARE_ROOT) .setHeat(0.5D) .setDiffusion(0.2D) .setMeltingPoint(1287) @@ -3395,6 +3410,7 @@ public class ModItems { rbmk_fuel_ra226be = (ItemRBMKRod) new ItemRBMKRod(rbmk_pellet_ra226be) .setYield(100000000D) .setStats(0D, 40) + .setFunction(EnumBurnFunc.PLATEU) .setHeat(0.1D) .setDiffusion(0.5D) .setMeltingPoint(700) @@ -3403,6 +3419,7 @@ public class ModItems { rbmk_fuel_pu238be = (ItemRBMKRod) new ItemRBMKRod(rbmk_pellet_pu238be) .setYield(100000000D) .setStats(60, 35) + .setFunction(EnumBurnFunc.PLATEU) .setHeat(0.5D) .setDiffusion(0.2D) .setMeltingPoint(1287) @@ -3411,12 +3428,14 @@ public class ModItems { rbmk_fuel_balefire_gold = (ItemRBMKRod) new ItemRBMKRod(rbmk_pellet_balefire_gold) .setYield(100000000D) .setStats(10, 50) + .setFunction(EnumBurnFunc.ARCH) .setMeltingPoint(2000) .addRadiation(ItemHazard.au198 * ItemHazard.rod_rbmk).toItem() .setUnlocalizedName("rbmk_fuel_balefire_gold").setTextureName(RefStrings.MODID + ":rbmk_fuel_balefire_gold"); rbmk_fuel_balefire = (ItemRBMKRod) new ItemRBMKRod(rbmk_pellet_balefire) .setYield(100000000D) .setStats(300, 35) + .setFunction(EnumBurnFunc.LINEAR) .setHeat(3D) .setMeltingPoint(3652) .addRadiation(800000F).toItem() @@ -3424,6 +3443,7 @@ public class ModItems { rbmk_fuel_drx = (ItemRBMKRod) new ItemRBMKRod(rbmk_pellet_drx) .setYield(1000000D) .setStats(10000) + .setFunction(EnumBurnFunc.QUADRATIC) .setHeat(0.1D) .setMeltingPoint(100000) .addDigamma(0.1F).toItem().setUnlocalizedName("rbmk_fuel_drx").setTextureName(RefStrings.MODID + ":rbmk_fuel_drx"); diff --git a/src/main/java/com/hbm/items/machine/ItemRBMKRod.java b/src/main/java/com/hbm/items/machine/ItemRBMKRod.java index 436e832af..817699863 100644 --- a/src/main/java/com/hbm/items/machine/ItemRBMKRod.java +++ b/src/main/java/com/hbm/items/machine/ItemRBMKRod.java @@ -24,8 +24,9 @@ public class ItemRBMKRod extends Item implements IItemHazard { public ItemRBMKPellet pellet; public String fullName = ""; //full name of the fuel rod - public double funcEnd; //endpoint of the function + public double reactivity; //endpoint of the function public double selfRate; //self-inflicted flux from self-igniting fuels + public EnumBurnFunc function = EnumBurnFunc.LOG_TEN; public double xGen = 0.5D; //multiplier for xenon production public double xBurn = 50D; //divider for xenon burnup public double heat = 1D; //heat produced per outFlux @@ -80,11 +81,16 @@ public class ItemRBMKRod extends Item implements IItemHazard { } public ItemRBMKRod setStats(double funcEnd, double selfRate) { - this.funcEnd = funcEnd; + this.reactivity = funcEnd; this.selfRate = selfRate; return this; } + public ItemRBMKRod setFunction(EnumBurnFunc func) { + this.function = func; + return this; + } + public ItemRBMKRod setHeat(double heat) { this.heat = heat; return this; @@ -201,13 +207,59 @@ public class ItemRBMKRod extends Item implements IItemHazard { return ret; } + public static enum EnumBurnFunc { + LOG_TEN(EnumChatFormatting.YELLOW + "MEDIUM / LOGARITHMIC"), //log10(x + 1) * reactivity * 50 + PLATEU(EnumChatFormatting.GREEN + "SAFE / EULER"), //(1 - e^(-x/25)) * reactivity * 100 + ARCH(EnumChatFormatting.YELLOW + "MEDIUM / NEGATIVE-QUADRATIC"), //x-(x²/1000) * reactivity + SIGMOID(EnumChatFormatting.GREEN + "SAFE / SIGMOID"), //100 / (1 + e^(-(x - 50) / 10)) <- tiny amount of reactivity at x=0 ! + SQUARE_ROOT(EnumChatFormatting.YELLOW + "MEDIUM / SQUARE ROOT"), //sqrt(x) * 10 * reactivity + LINEAR(EnumChatFormatting.RED + "DANGEROUS / LINEAR"), //x * reactivity + QUADRATIC(EnumChatFormatting.RED + "DANGEROUS / QUADRATIC"); //x^2 / 100 * reactivity + + public String title = ""; + + private EnumBurnFunc(String title) { + this.title = title; + } + } + /** * @param flux [0;100] ...or at least those are sane levels * @return the amount of reactivity yielded, unmodified by xenon */ public double reactivityFunc(double flux) { - return Math.log10(flux + 1) * funcEnd * 0.1D; - //TODO: alternate functions for NU and THMEU, peaking at 25% + + switch(this.function) { + case LOG_TEN: return Math.log10(flux + 1) * 0.1D * reactivity; + case PLATEU: return (1 - Math.pow(Math.E, -flux / 25D)) * 100D * reactivity; + case ARCH: return flux - (flux * flux / 1000D) * reactivity; + case SIGMOID: return 100D / (1 + Math.pow(Math.E, -(flux - 50D) / 10D)) * reactivity; + case SQUARE_ROOT: return Math.sqrt(flux) * reactivity; + case LINEAR: return flux * reactivity; + case QUADRATIC: return flux * flux / 100D * reactivity; + } + + return 0; + } + + public String getFuncDescription() { + + String x = "x"; + + if(selfRate > 0) + x = "(x" + EnumChatFormatting.RED + " + " + selfRate + "" + EnumChatFormatting.WHITE + ")"; + + switch(this.function) { + case LOG_TEN: return "log10(x + 1" + (selfRate > 0 ? (EnumChatFormatting.RED + " + " + selfRate) : "") + EnumChatFormatting.WHITE + ") * " + reactivity; + case PLATEU: return "(1 - e^-" + x + " / 25)) * 100 * " + reactivity; + case ARCH: return "(" + x + " - " + x + "² / 1000) * " + reactivity; + case SIGMOID: return "100 / (1 + e^(-(" + x + " - 50) / 10) * " + reactivity; + case SQUARE_ROOT: return "sqrt(" + x + ") * " + reactivity; + case LINEAR: return x + " * " + reactivity; + case QUADRATIC: return x + "² / 100 * " + reactivity; + } + + return "ERROR"; } /** @@ -259,7 +311,8 @@ public class ItemRBMKRod extends Item implements IItemHazard { list.add(EnumChatFormatting.DARK_PURPLE + I18nUtil.resolveKey("trait.rbmx.xenon", ((int)(getPoison(stack) * 1000D) / 1000D) + "%")); list.add(EnumChatFormatting.BLUE + I18nUtil.resolveKey("trait.rbmx.splitsWith", I18nUtil.resolveKey(nType.unlocalized + ".x"))); list.add(EnumChatFormatting.BLUE + I18nUtil.resolveKey("trait.rbmx.splitsInto", I18nUtil.resolveKey(rType.unlocalized + ".x"))); - list.add(EnumChatFormatting.YELLOW + I18nUtil.resolveKey("trait.rbmx.fluxFunc", EnumChatFormatting.WHITE + "log10(x + 1" + (selfRate > 0 ? (EnumChatFormatting.RED + " + " + selfRate) : "") + EnumChatFormatting.WHITE + ") * " + funcEnd)); + list.add(EnumChatFormatting.YELLOW + I18nUtil.resolveKey("trait.rbmx.fluxFunc", EnumChatFormatting.WHITE + getFuncDescription())); + list.add(EnumChatFormatting.YELLOW + I18nUtil.resolveKey("trait.rbmx.funcType", this.function.title)); list.add(EnumChatFormatting.YELLOW + I18nUtil.resolveKey("trait.rbmx.xenonGen", EnumChatFormatting.WHITE + "x * " + xGen)); list.add(EnumChatFormatting.YELLOW + I18nUtil.resolveKey("trait.rbmx.xenonBurn", EnumChatFormatting.WHITE + "x² * " + xBurn)); list.add(EnumChatFormatting.GOLD + I18nUtil.resolveKey("trait.rbmx.heat", heat + "°C")); @@ -278,7 +331,8 @@ public class ItemRBMKRod extends Item implements IItemHazard { list.add(EnumChatFormatting.DARK_PURPLE + I18nUtil.resolveKey("trait.rbmk.xenon", ((int)(getPoison(stack) * 1000D) / 1000D) + "%")); list.add(EnumChatFormatting.BLUE + I18nUtil.resolveKey("trait.rbmk.splitsWith", I18nUtil.resolveKey(nType.unlocalized))); list.add(EnumChatFormatting.BLUE + I18nUtil.resolveKey("trait.rbmk.splitsInto", I18nUtil.resolveKey(rType.unlocalized))); - list.add(EnumChatFormatting.YELLOW + I18nUtil.resolveKey("trait.rbmk.fluxFunc", EnumChatFormatting.WHITE + "log10(x + 1" + (selfRate > 0 ? (EnumChatFormatting.RED + " + " + selfRate) : "") + EnumChatFormatting.WHITE + ") * " + funcEnd)); + list.add(EnumChatFormatting.YELLOW + I18nUtil.resolveKey("trait.rbmk.fluxFunc", EnumChatFormatting.WHITE + getFuncDescription())); + list.add(EnumChatFormatting.YELLOW + I18nUtil.resolveKey("trait.rbmk.funcType", this.function.title)); list.add(EnumChatFormatting.YELLOW + I18nUtil.resolveKey("trait.rbmk.xenonGen", EnumChatFormatting.WHITE + "x * " + xGen)); list.add(EnumChatFormatting.YELLOW + I18nUtil.resolveKey("trait.rbmk.xenonBurn", EnumChatFormatting.WHITE + "x² * " + xBurn)); list.add(EnumChatFormatting.GOLD + I18nUtil.resolveKey("trait.rbmk.heat", heat + "°C")); diff --git a/src/main/resources/assets/hbm/lang/de_DE.lang b/src/main/resources/assets/hbm/lang/de_DE.lang index c52d1b8f7..fabe75b77 100644 --- a/src/main/resources/assets/hbm/lang/de_DE.lang +++ b/src/main/resources/assets/hbm/lang/de_DE.lang @@ -3104,6 +3104,7 @@ trait.rbmk.coreTemp=Kerntemperatur: %s trait.rbmk.depletion=Erschöpfung: %s trait.rbmk.diffusion=Diffusion: %s trait.rbmk.fluxFunc=Flux-Funktion: %s +trait.rbmk.funcType=Funktionstyp: %s trait.rbmk.heat=Hitze pro Tick bei voller Kraft: %s trait.rbmk.melt=Schmelzpunkt: %s trait.rbmk.neutron.any=Alle Neutronen @@ -3121,6 +3122,7 @@ trait.rbmx.coreTemp=Kernentropie: %s trait.rbmx.depletion=Verkrustungsgraad: %s trait.rbmx.diffusion=Fluss: %s trait.rbmx.fluxFunc=Zerstörungsfunktion: %s +trait.rbmk.funcType=Funktionsspezifikation: %s trait.rbmx.heat=Verkrustung pro Tick bei voller Kraft: %s trait.rbmx.melt=Kollapstiefe: %s trait.rbmk.neutron.any.x=Alle nicht-euklidischen Formen diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index 8e8c2252c..fa844788c 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -3188,6 +3188,7 @@ trait.rbmk.coreTemp=Core temp: %s trait.rbmk.depletion=Depletion: %s trait.rbmk.diffusion=Diffusion: %s trait.rbmk.fluxFunc=Flux function: %s +trait.rbmk.funcType=Function type: %s trait.rbmk.heat=Heat per tick at full power: %s trait.rbmk.melt=Melting point: %s trait.rbmk.neutron.any=All Neutrons @@ -3205,6 +3206,7 @@ trait.rbmx.coreTemp=Core entropy: %s trait.rbmx.depletion=Crustyness: %s trait.rbmx.diffusion=Flow: %s trait.rbmx.fluxFunc=Doom function: %s +trait.rbmx.funcType=Function specification: %s trait.rbmx.heat=Crust per tick at full power: %s trait.rbmx.melt=Crush depth: %s trait.rbmk.neutron.any.x=All non-euclidean shapes