mirror of
https://github.com/HbmMods/Hbm-s-Nuclear-Tech-GIT.git
synced 2026-01-25 10:32:49 +00:00
90 lines
4.0 KiB
Java
90 lines
4.0 KiB
Java
package com.hbm.util.function;
|
|
|
|
import com.hbm.util.BobMathUtil;
|
|
|
|
import net.minecraft.util.EnumChatFormatting;
|
|
|
|
/**
|
|
* A simple class for defining function types (linear, log, sqrt, etc.) for things like fuel reactivity.
|
|
* Unlike current RBMK functions, constants used in the calculations have been removed
|
|
*
|
|
* @author hbm
|
|
*/
|
|
public abstract class Function {
|
|
|
|
protected double div = 1D;
|
|
protected double off = 0;
|
|
|
|
//the german prononciation of f(x) - "F von X", tee hee
|
|
public abstract double effonix(double x);
|
|
public abstract String getLabelForFuel();
|
|
public abstract String getDangerFromFuel();
|
|
|
|
public Function withDiv(double div) { this.div = div; return this; };
|
|
public Function withOff(double off) { this.off = off; return this; };
|
|
|
|
public double getX(double x) { return x / div + off; }
|
|
public String getXName() { return getXName(true); }
|
|
public String getXName(boolean brackets) {
|
|
String x = "x";
|
|
boolean mod = false;
|
|
if(div != 1D) x += " / " + String.format("%,.1f", div);
|
|
if(off != 0D) x += " + " + String.format("%,.1f", off);
|
|
if(mod && brackets) x = "(" + x + ")";
|
|
return x;
|
|
}
|
|
|
|
public static abstract class FunctionSingleArg extends Function {
|
|
protected double level;
|
|
public FunctionSingleArg(double level) { this.level = level; }
|
|
}
|
|
|
|
public static abstract class FunctionDoubleArg extends Function {
|
|
protected double level, vOff;
|
|
public FunctionDoubleArg(double level, double vOff) { this.level = level; this.vOff = vOff; }
|
|
}
|
|
|
|
public static class FunctionLogarithmic extends FunctionSingleArg {
|
|
public FunctionLogarithmic(double level) { super(level); this.withOff(1D); }
|
|
@Override public double effonix(double x) { return Math.log10(getX(x)) * level; }
|
|
@Override public String getLabelForFuel() { return "log10(" + getXName(false) + ") * " + String.format("%,.1f", this.level); }
|
|
@Override public String getDangerFromFuel() { return EnumChatFormatting.YELLOW + "MEDIUM / LOGARITHMIC"; }
|
|
}
|
|
|
|
public static class FunctionPassive extends FunctionSingleArg {
|
|
public FunctionPassive(double level) { super(level); }
|
|
@Override public double effonix(double x) { return this.level; }
|
|
@Override public String getLabelForFuel() { return "" + String.format("%,.1f", this.level); }
|
|
@Override public String getDangerFromFuel() { return EnumChatFormatting.DARK_GREEN + "SAFE / PASSIVE"; }
|
|
}
|
|
|
|
public static class FunctionSqrt extends FunctionSingleArg {
|
|
public FunctionSqrt(double level) { super(level); }
|
|
@Override public double effonix(double x) { return BobMathUtil.squirt(getX(x)) * this.level; }
|
|
@Override public String getLabelForFuel() { return "sqrt(" + getXName(false) + ") * " + String.format("%,.3f", this.level); } //not entirely correct but good enough
|
|
@Override public String getDangerFromFuel() { return EnumChatFormatting.YELLOW + "MEDIUM / SQUARE ROOT"; }
|
|
}
|
|
|
|
public static class FunctionSqrtFalling extends FunctionSqrt {
|
|
public FunctionSqrtFalling(double fallFactor) {
|
|
super(1D / fallFactor);
|
|
this.withOff(fallFactor * fallFactor);
|
|
}
|
|
}
|
|
|
|
public static class FunctionLinear extends FunctionSingleArg {
|
|
public FunctionLinear(double level) { super(level); }
|
|
@Override public double effonix(double x) { return getX(x) * this.level; }
|
|
@Override public String getLabelForFuel() { return getXName(true) + " * " + String.format("%,.1f", this.level); }
|
|
@Override public String getDangerFromFuel() { return EnumChatFormatting.RED + "DANGEROUS / LINEAR"; }
|
|
}
|
|
|
|
public static class FunctionQuadratic extends FunctionDoubleArg {
|
|
public FunctionQuadratic(double level) { super(level, 0D); }
|
|
public FunctionQuadratic(double level, double vOff) { super(level, vOff); }
|
|
@Override public double effonix(double x) { return getX(x) * getX(x) * this.level + this.vOff; }
|
|
@Override public String getLabelForFuel() { return getXName(true) + "² * " + String.format("%,.1f", this.level) + (vOff != 0 ? (" + " + String.format("%,.1f", vOff)) : ""); }
|
|
@Override public String getDangerFromFuel() { return EnumChatFormatting.RED + "DANGEROUS / QUADRATIC"; }
|
|
}
|
|
}
|