different RBMK reactivity functions per fuel type

This commit is contained in:
Boblet 2021-06-18 14:59:49 +02:00
parent 6003279d27
commit 8b0e5b4ef2
4 changed files with 88 additions and 10 deletions

View File

@ -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");

View File

@ -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"));

View File

@ -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

View File

@ -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