diff options
Diffstat (limited to 'src/main/java/com')
30 files changed, 1126 insertions, 366 deletions
diff --git a/src/main/java/com/github/technus/tectech/compatibility/thaumcraft/definitions/AspectDefinitionCompatEnabled.java b/src/main/java/com/github/technus/tectech/compatibility/thaumcraft/definitions/AspectDefinitionCompatEnabled.java index da0bb07ff0..07603114ed 100644 --- a/src/main/java/com/github/technus/tectech/compatibility/thaumcraft/definitions/AspectDefinitionCompatEnabled.java +++ b/src/main/java/com/github/technus/tectech/compatibility/thaumcraft/definitions/AspectDefinitionCompatEnabled.java @@ -30,7 +30,7 @@ public final class AspectDefinitionCompatEnabled extends AspectDefinitionCompat ArrayList<Aspect> list=Aspect.getCompoundAspects(); Aspect[] array=list.toArray(new Aspect[0]); - while (!list.isEmpty()) { + while (list.size()>0) { for (Aspect aspect : array) { if (list.contains(aspect)) { Aspect[] content = aspect.getComponents(); diff --git a/src/main/java/com/github/technus/tectech/compatibility/thaumcraft/definitions/dComplexAspectDefinition.java b/src/main/java/com/github/technus/tectech/compatibility/thaumcraft/definitions/dComplexAspectDefinition.java index 3b4a08c703..034aa55642 100644 --- a/src/main/java/com/github/technus/tectech/compatibility/thaumcraft/definitions/dComplexAspectDefinition.java +++ b/src/main/java/com/github/technus/tectech/compatibility/thaumcraft/definitions/dComplexAspectDefinition.java @@ -63,11 +63,11 @@ public final class dComplexAspectDefinition extends cElementalDefinition impleme //public but u can just try{}catch(){} the constructor it still calls this method private static boolean canTheyBeTogether(cElementalDefinitionStackMap stacks) { - int amount = 0; + long amount = 0; for (cElementalDefinitionStack aspects : stacks.values()) { - if (aspects.definition instanceof dComplexAspectDefinition || aspects.definition instanceof ePrimalAspectDefinition) - amount += aspects.amount; - else return false; + if (!(aspects.definition instanceof dComplexAspectDefinition) && !(aspects.definition instanceof ePrimalAspectDefinition)) + return false; + amount += aspects.amount; } return amount==2; } @@ -126,11 +126,16 @@ public final class dComplexAspectDefinition extends cElementalDefinition impleme } @Override - public float getRawLifeTime() { + public float getRawTimeSpan(long currentEnergy) { return -1; } @Override + public boolean isTimeSpanHalfLife() { + return false; + } + + @Override public int getCharge() { return 0; } @@ -151,11 +156,21 @@ public final class dComplexAspectDefinition extends cElementalDefinition impleme } @Override - public cElementalDecay[] getEnergeticDecayInstant() { + public cElementalDecay[] getEnergyInducedDecay(long energyLevel) { return new cElementalDecay[]{new cElementalDecay(0.75F, aspectStacks), eBosonDefinition.deadEnd}; } @Override + public float getEnergyDiffBetweenStates(long currentEnergyLevel, long newEnergyLevel) { + return DEFAULT_ENERGY_REQUIREMENT*(newEnergyLevel-currentEnergyLevel); + } + + @Override + public boolean usesSpecialEnergeticDecayHandling() { + return false; + } + + @Override public cElementalDecay[] getNaturalDecayInstant() { return noDecay; } diff --git a/src/main/java/com/github/technus/tectech/compatibility/thaumcraft/definitions/ePrimalAspectDefinition.java b/src/main/java/com/github/technus/tectech/compatibility/thaumcraft/definitions/ePrimalAspectDefinition.java index 1131c2a4ce..6205055967 100644 --- a/src/main/java/com/github/technus/tectech/compatibility/thaumcraft/definitions/ePrimalAspectDefinition.java +++ b/src/main/java/com/github/technus/tectech/compatibility/thaumcraft/definitions/ePrimalAspectDefinition.java @@ -38,5 +38,10 @@ public final class ePrimalAspectDefinition extends cElementalPrimitive implement public Object materializeIntoAspect() { return aspectDefinitionCompat.getAspect(this); } + + @Override + public boolean isTimeSpanHalfLife() { + return false; + } } diff --git a/src/main/java/com/github/technus/tectech/elementalMatter/core/cElementalDecay.java b/src/main/java/com/github/technus/tectech/elementalMatter/core/cElementalDecay.java index ae38be4d3e..b6a8b4c2d0 100644 --- a/src/main/java/com/github/technus/tectech/elementalMatter/core/cElementalDecay.java +++ b/src/main/java/com/github/technus/tectech/elementalMatter/core/cElementalDecay.java @@ -48,11 +48,11 @@ public final class cElementalDecay { this.probability = probability; } - public cElementalInstanceStackMap getResults(float lifeMult, long age, int energy, int amountDecaying) { + public cElementalInstanceStackMap getResults(float lifeMult, long age, long energy, long amountDecaying) { cElementalInstanceStackMap decayResult = new cElementalInstanceStackMap(); if (outputStacks == null) return decayResult;//This is to prevent null pointer exceptions. //Deny decay code is in instance! - int qtty = 0; + long qtty = 0; for (cElementalDefinitionStack stack : outputStacks.values()) qtty += stack.amount; if (qtty <= 0) return decayResult; //energy /= qtty; diff --git a/src/main/java/com/github/technus/tectech/elementalMatter/core/cElementalDefinitionStackMap.java b/src/main/java/com/github/technus/tectech/elementalMatter/core/cElementalDefinitionStackMap.java index c46df6c826..823dbfecdf 100644 --- a/src/main/java/com/github/technus/tectech/elementalMatter/core/cElementalDefinitionStackMap.java +++ b/src/main/java/com/github/technus/tectech/elementalMatter/core/cElementalDefinitionStackMap.java @@ -32,6 +32,10 @@ public final class cElementalDefinitionStackMap/*IMMUTABLE*/ extends cElementalS map = new TreeMap<>(in); } + cElementalDefinitionStackMap(cElementalMutableDefinitionStackMap unsafeMap){ + map=unsafeMap.map; + } + //IMMUTABLE DON'T NEED IT @Override public final cElementalDefinitionStackMap clone() { diff --git a/src/main/java/com/github/technus/tectech/elementalMatter/core/cElementalInstanceStackMap.java b/src/main/java/com/github/technus/tectech/elementalMatter/core/cElementalInstanceStackMap.java index b0edc510b6..5891d4e252 100644 --- a/src/main/java/com/github/technus/tectech/elementalMatter/core/cElementalInstanceStackMap.java +++ b/src/main/java/com/github/technus/tectech/elementalMatter/core/cElementalInstanceStackMap.java @@ -7,6 +7,7 @@ import com.github.technus.tectech.elementalMatter.core.interfaces.iHasElementalD import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.EnumChatFormatting; +import java.util.Iterator; import java.util.Map; import java.util.TreeMap; @@ -16,7 +17,7 @@ import static com.github.technus.tectech.elementalMatter.definitions.primitive.c * Created by danie_000 on 22.01.2017. */ public final class cElementalInstanceStackMap implements Comparable<cElementalInstanceStackMap> { - private TreeMap<iElementalDefinition, cElementalInstanceStack> map; + TreeMap<iElementalDefinition, cElementalInstanceStack> map; //Constructors public cElementalInstanceStackMap() { @@ -125,7 +126,7 @@ public final class cElementalInstanceStackMap implements Comparable<cElementalIn if (testOnly) return target.amount >= instance.amount; else { - final int diff = target.amount - instance.amount; + final long diff = target.amount - instance.amount; if (diff > 0) { target.amount = diff; return true; @@ -144,7 +145,7 @@ public final class cElementalInstanceStackMap implements Comparable<cElementalIn if (testOnly) return target.amount >= stack.getAmount(); else { - final int diff = target.amount - stack.getAmount(); + final long diff = target.amount - stack.getAmount(); if (diff > 0) { target.amount = diff; return true; @@ -190,15 +191,35 @@ public final class cElementalInstanceStackMap implements Comparable<cElementalIn } public boolean removeAllAmounts(boolean testOnly, cElementalStackMap container) { - return removeAllAmounts(testOnly, container.values()); + boolean test=true; + for (Iterator<Map.Entry<iElementalDefinition, cElementalDefinitionStack>> entries = container.map.entrySet().iterator(); entries.hasNext(); ) { + Map.Entry<iElementalDefinition, cElementalDefinitionStack> entry = entries.next(); + test &= removeAmount(true, entry.getValue()); + } + if (testOnly || !test) return test; + for (Iterator<Map.Entry<iElementalDefinition, cElementalDefinitionStack>> entries = container.map.entrySet().iterator(); entries.hasNext(); ) { + Map.Entry<iElementalDefinition, cElementalDefinitionStack> entry = entries.next(); + removeAmount(false, entry.getValue()); + } + return true; } public boolean removeAllAmounts(boolean testOnly, cElementalInstanceStackMap container) { - return removeAllAmounts(testOnly, container.values()); + boolean test=true; + for (Iterator<Map.Entry<iElementalDefinition, cElementalInstanceStack>> entries = container.map.entrySet().iterator(); entries.hasNext(); ) { + Map.Entry<iElementalDefinition, cElementalInstanceStack> entry = entries.next(); + test &= removeAmount(true, entry.getValue()); + } + if (testOnly || !test) return test; + for (Iterator<Map.Entry<iElementalDefinition, cElementalInstanceStack>> entries = container.map.entrySet().iterator(); entries.hasNext(); ) { + Map.Entry<iElementalDefinition, cElementalInstanceStack> entry = entries.next(); + test &= removeAmount(false, entry.getValue()); + } + return true; } //Remove overflow - public float removeOverflow(int stacksCount, int stackCapacity) { + public float removeOverflow(int stacksCount, long stackCapacity) { float massRemoved = 0; if (map.size() > stacksCount) { @@ -320,32 +341,23 @@ public final class cElementalInstanceStackMap implements Comparable<cElementalIn } //Tick Content - public void tickContent(float lifeTimeMult, int postEnergize) { - for (cElementalInstanceStack instance : this.values()) { - cElementalInstanceStackMap newThings = instance.decay(lifeTimeMult, instance.age += 20, postEnergize); - if (newThings == null) { - instance.nextColor(); - } else { - map.remove(instance.definition); - for (cElementalInstanceStack newInstance : newThings.values()) - putUnify(newInstance); - } - } - + public void tickContentByOneSecond(float lifeTimeMult, int postEnergize) { + tickContent(lifeTimeMult,postEnergize,1); } - public void tickContent(int postEnergize) { + public void tickContent(float lifeTimeMult, int postEnergize, int seconds){ for (cElementalInstanceStack instance : this.values()) { - cElementalInstanceStackMap newThings = instance.decay(instance.age += 20, postEnergize); - if (newThings == null) { + cElementalInstanceStackMap newInstances = instance.decay(lifeTimeMult, instance.age += seconds, postEnergize); + if (newInstances == null) { instance.nextColor(); } else { map.remove(instance.definition); - for (cElementalInstanceStack newInstance : newThings.values()) + for (cElementalInstanceStack newInstance : newInstances.values()) { putUnify(newInstance); + newInstance.nextColor(); + } } } - } //NBT diff --git a/src/main/java/com/github/technus/tectech/elementalMatter/core/cElementalMutableDefinitionStackMap.java b/src/main/java/com/github/technus/tectech/elementalMatter/core/cElementalMutableDefinitionStackMap.java index 2873dfefd2..846a1cf410 100644 --- a/src/main/java/com/github/technus/tectech/elementalMatter/core/cElementalMutableDefinitionStackMap.java +++ b/src/main/java/com/github/technus/tectech/elementalMatter/core/cElementalMutableDefinitionStackMap.java @@ -6,6 +6,7 @@ import com.github.technus.tectech.elementalMatter.core.interfaces.iElementalDefi import com.github.technus.tectech.elementalMatter.core.interfaces.iHasElementalDefinition; import net.minecraft.nbt.NBTTagCompound; +import java.util.Iterator; import java.util.Map; import java.util.TreeMap; @@ -53,6 +54,9 @@ public final class cElementalMutableDefinitionStackMap extends cElementalStackMa public cElementalDefinitionStackMap toImmutable() { return new cElementalDefinitionStackMap(map); } + public cElementalDefinitionStackMap toImmutable_unsafeMightLeaveExposedElementalTree() { + return new cElementalDefinitionStackMap(this); + } @Override @Deprecated @@ -94,7 +98,7 @@ public final class cElementalMutableDefinitionStackMap extends cElementalStackMa if (testOnly) return target.amount >= instance.amount; else { - final int diff = target.amount - instance.amount; + final long diff = target.amount - instance.amount; if (diff > 0) { map.put(target.definition, new cElementalDefinitionStack(target.definition, diff)); return true; @@ -113,7 +117,7 @@ public final class cElementalMutableDefinitionStackMap extends cElementalStackMa if (testOnly) return target.amount >= stack.getAmount(); else { - final int diff = target.amount - stack.getAmount(); + final long diff = target.amount - stack.getAmount(); if (diff > 0) { map.put(target.definition, new cElementalDefinitionStack(target.definition, diff)); return true; @@ -159,11 +163,31 @@ public final class cElementalMutableDefinitionStackMap extends cElementalStackMa } public boolean removeAllAmounts(boolean testOnly, cElementalStackMap container) { - return removeAllAmounts(testOnly, container.values()); + boolean test=true; + for (Iterator<Map.Entry<iElementalDefinition, cElementalDefinitionStack>> entries = container.map.entrySet().iterator(); entries.hasNext(); ) { + Map.Entry<iElementalDefinition, cElementalDefinitionStack> entry = entries.next(); + test &= removeAmount(true, entry.getValue()); + } + if (testOnly || !test) return test; + for (Iterator<Map.Entry<iElementalDefinition, cElementalDefinitionStack>> entries = container.map.entrySet().iterator(); entries.hasNext(); ) { + Map.Entry<iElementalDefinition, cElementalDefinitionStack> entry = entries.next(); + removeAmount(false, entry.getValue()); + } + return true; } public boolean removeAllAmounts(boolean testOnly, cElementalInstanceStackMap container) { - return removeAllAmounts(testOnly, container.values()); + boolean test=true; + for (Iterator<Map.Entry<iElementalDefinition, cElementalInstanceStack>> entries = container.map.entrySet().iterator(); entries.hasNext(); ) { + Map.Entry<iElementalDefinition, cElementalInstanceStack> entry = entries.next(); + test &= removeAmount(true, entry.getValue()); + } + if (testOnly || !test) return test; + for (Iterator<Map.Entry<iElementalDefinition, cElementalInstanceStack>> entries = container.map.entrySet().iterator(); entries.hasNext(); ) { + Map.Entry<iElementalDefinition, cElementalInstanceStack> entry = entries.next(); + test &= removeAmount(false, entry.getValue()); + } + return true; } //Put replace diff --git a/src/main/java/com/github/technus/tectech/elementalMatter/core/cElementalStackMap.java b/src/main/java/com/github/technus/tectech/elementalMatter/core/cElementalStackMap.java index 408e62621d..55446e9c93 100644 --- a/src/main/java/com/github/technus/tectech/elementalMatter/core/cElementalStackMap.java +++ b/src/main/java/com/github/technus/tectech/elementalMatter/core/cElementalStackMap.java @@ -118,7 +118,7 @@ abstract class cElementalStackMap implements Comparable<cElementalStackMap> { } @Override - public int hashCode() {//Hash only definitions to compare contents not amounts or data + public final int hashCode() {//Hash only definitions to compare contents not amounts or data int hash = -(map.size() << 4); for (cElementalDefinitionStack s : map.values()) { hash += s.definition.hashCode(); diff --git a/src/main/java/com/github/technus/tectech/elementalMatter/core/containers/cElementalDefinitionStack.java b/src/main/java/com/github/technus/tectech/elementalMatter/core/containers/cElementalDefinitionStack.java index 8a9d855e7e..1e3f79573e 100644 --- a/src/main/java/com/github/technus/tectech/elementalMatter/core/containers/cElementalDefinitionStack.java +++ b/src/main/java/com/github/technus/tectech/elementalMatter/core/containers/cElementalDefinitionStack.java @@ -12,9 +12,9 @@ import static com.github.technus.tectech.elementalMatter.definitions.primitive.c */ public final class cElementalDefinitionStack implements iHasElementalDefinition { public final iElementalDefinition definition; - public final int amount; + public final long amount; - public cElementalDefinitionStack(iElementalDefinition def, int amount) { + public cElementalDefinitionStack(iElementalDefinition def, long amount) { this.definition = def == null ? null__ : def; this.amount = amount; } @@ -30,11 +30,11 @@ public final class cElementalDefinitionStack implements iHasElementalDefinition } @Override - public int getAmount() { + public long getAmount() { return amount; } - public int getCharge() { + public long getCharge() { return definition.getCharge() * amount; } @@ -45,24 +45,24 @@ public final class cElementalDefinitionStack implements iHasElementalDefinition public NBTTagCompound toNBT() { NBTTagCompound nbt = new NBTTagCompound(); nbt.setTag("d", definition.toNBT()); - nbt.setInteger("q", amount); + nbt.setLong("q", amount); return nbt; } public static cElementalDefinitionStack fromNBT(NBTTagCompound nbt) { return new cElementalDefinitionStack( cElementalDefinition.fromNBT(nbt.getCompoundTag("d")), - nbt.getInteger("q")); + nbt.getLong("q")); } - public cElementalDefinitionStack addAmountIntoNewInstance(int amount) { + public cElementalDefinitionStack addAmountIntoNewInstance(long amount) { if(amount==0) return this; return new cElementalDefinitionStack(definition, amount + this.amount); } public cElementalDefinitionStack addAmountIntoNewInstance(cElementalDefinitionStack... other) { if (other == null || other.length == 0) return this; - int i = 0; + long i = 0; for (cElementalDefinitionStack stack : other) i += stack.amount; return addAmountIntoNewInstance(i); diff --git a/src/main/java/com/github/technus/tectech/elementalMatter/core/containers/cElementalInstanceStack.java b/src/main/java/com/github/technus/tectech/elementalMatter/core/containers/cElementalInstanceStack.java index 9864376c25..a28fed340e 100644 --- a/src/main/java/com/github/technus/tectech/elementalMatter/core/containers/cElementalInstanceStack.java +++ b/src/main/java/com/github/technus/tectech/elementalMatter/core/containers/cElementalInstanceStack.java @@ -16,11 +16,11 @@ import static com.github.technus.tectech.elementalMatter.definitions.primitive.c public final class cElementalInstanceStack implements iHasElementalDefinition { public final iElementalDefinition definition; //energy - if positive then particle should try to decay - public int energy; + private long energy; //byte color; 0=Red 1=Green 2=Blue 0=Cyan 1=Magenta 2=Yellow, else ignored (-1 - uncolorable) private byte color; public long age; - public int amount; + public long amount; private float lifeTime; private float lifeTimeMult; @@ -28,15 +28,15 @@ public final class cElementalInstanceStack implements iHasElementalDefinition { this(stackSafe.definition, stackSafe.amount, 1F, 0, 0); } - public cElementalInstanceStack(cElementalDefinitionStack stackSafe, float lifeTimeMult, long age, int energy) { + public cElementalInstanceStack(cElementalDefinitionStack stackSafe, float lifeTimeMult, long age, long energy) { this(stackSafe.definition, stackSafe.amount, lifeTimeMult, age, energy); } - public cElementalInstanceStack(iElementalDefinition defSafe, int amount) { + public cElementalInstanceStack(iElementalDefinition defSafe, long amount) { this(defSafe, amount, 1F, 0, 0); } - public cElementalInstanceStack(iElementalDefinition defSafe, int amount, float lifeTimeMult, long age, int energy) { + public cElementalInstanceStack(iElementalDefinition defSafe, long amount, float lifeTimeMult, long age, long energy) { this.definition = defSafe == null ? null__ : defSafe; byte color = definition.getColor(); if (color < 0 || color > 2) {//transforms colorable??? into proper color @@ -45,9 +45,9 @@ public final class cElementalInstanceStack implements iHasElementalDefinition { this.color = (byte) (TecTech.Rnd.nextInt(3)); } this.lifeTimeMult = lifeTimeMult; - this.lifeTime = definition.getRawLifeTime() * this.lifeTimeMult; - this.age = age; this.energy = energy; + this.lifeTime = definition.getRawTimeSpan(energy) * this.lifeTimeMult; + this.age = age; this.amount = amount; } @@ -68,11 +68,11 @@ public final class cElementalInstanceStack implements iHasElementalDefinition { } @Override - public int getAmount() { + public long getAmount() { return amount; } - public int getCharge() { + public long getCharge() { return definition.getCharge() * amount; } @@ -80,6 +80,25 @@ public final class cElementalInstanceStack implements iHasElementalDefinition { return definition.getMass() * amount; } + public long getEnergy() { + return energy; + } + + public void setEnergy(long newEnergyLevel){ + energy=newEnergyLevel; + setLifeTimeMultipleOfBaseValue(getLifeTimeMult()); + } + + @Deprecated //can be done from definition + public float getEnergySettingCost(long currentEnergyLevel, long newEnergyLevel){ + return definition.getEnergyDiffBetweenStates(currentEnergyLevel,newEnergyLevel); + } + + @Deprecated //can be done from definition + public float getEnergySettingCost(long newEnergyLevel){ + return definition.getEnergyDiffBetweenStates(energy,newEnergyLevel); + } + public cElementalDefinitionStack getDefinitionStack() { return new cElementalDefinitionStack(definition, amount); } @@ -107,9 +126,12 @@ public final class cElementalInstanceStack implements iHasElementalDefinition { return lifeTime; } - public float multLifeTime(float mult) { + public float setLifeTimeMultipleOfBaseValue(float mult) { + if(mult<=0) //since infinity*0=nan + throw new IllegalArgumentException("mult must be >0"); this.lifeTimeMult = mult; - this.lifeTime = definition.getRawLifeTime() * mult; + if (definition.getRawTimeSpan(energy) <= 0) return this.lifeTime; + this.lifeTime = definition.getRawTimeSpan(energy) * this.lifeTimeMult; return this.lifeTime; } @@ -121,41 +143,80 @@ public final class cElementalInstanceStack implements iHasElementalDefinition { return decay(1F, age, 0);//try to decay without changes } - public cElementalInstanceStackMap decay(long apparentAge, int postEnergize) { + public cElementalInstanceStackMap decay(long apparentAge, long postEnergize) { return decay(1F,apparentAge,postEnergize); } - public cElementalInstanceStackMap decay(Float lifeTimeMult, long apparentAge, int postEnergize) { - if (this.energy > 0) { - this.energy--; - return decayCompute(definition.getEnergeticDecayInstant(), lifeTimeMult, 0, postEnergize + this.energy); - } else if (definition.getRawLifeTime() < 0) { + public cElementalInstanceStackMap decay(Float lifeTimeMult, long apparentAge, long postEnergize) { + long newEnergyLevel=postEnergize+this.energy; + if(newEnergyLevel>0) newEnergyLevel-=1; + else if(newEnergyLevel<0) newEnergyLevel+=1; + if (this.energy > 0 && !definition.usesSpecialEnergeticDecayHandling()) { + setLifeTimeMultipleOfBaseValue(getLifeTimeMult()); + return decayCompute(definition.getEnergyInducedDecay(this.energy), lifeTimeMult, -1, newEnergyLevel); + }else if (definition.getRawTimeSpan(energy) < 0) { return null;//return null, decay cannot be achieved - } else if (1F > this.lifeTime) { - return decayCompute(definition.getNaturalDecayInstant(), lifeTimeMult, 0, postEnergize + this.energy); - } else if (((float) apparentAge) > this.lifeTime) { - return decayCompute(definition.getDecayArray(), lifeTimeMult, 0, postEnergize + this.energy); + } else if(definition.isTimeSpanHalfLife()){ + return exponentialDecayCompute(energy>0?definition.getEnergyInducedDecay(this.energy):definition.getDecayArray(), lifeTimeMult, -1, newEnergyLevel); + } else{ + if (1F > this.lifeTime) { + return decayCompute(energy>0?definition.getEnergyInducedDecay(this.energy):definition.getNaturalDecayInstant(), lifeTimeMult, 0, newEnergyLevel); + } else if (((float) apparentAge) > this.lifeTime) { + return decayCompute(energy>0?definition.getEnergyInducedDecay(this.energy):definition.getDecayArray(), lifeTimeMult, 0, newEnergyLevel); + } } return null;//return null since decay cannot be achieved } //Use to get direct decay output providing correct decay array - public cElementalInstanceStackMap decayCompute(cElementalDecay[] decays, float lifeTimeMult, long newProductsAge, int energy) { + private cElementalInstanceStackMap exponentialDecayCompute(cElementalDecay[] decays, float lifeTimeMult, long newProductsAge, long energy) { + double decayInverseRatio=Math.pow(2d,1d/* 1 second *//(double)lifeTime); + double newAmount=(double)amount/decayInverseRatio; + long amountRemaining=((long)Math.floor(newAmount))+(TecTech.Rnd.nextDouble()<=newAmount-Math.floor(newAmount)?1:0); + if(amountRemaining==amount) return null;//nothing decayed + else if(amountRemaining<=0) return decayCompute(decays,lifeTimeMult,newProductsAge,energy); + //split to non decaying and decaying part + long amount=this.amount; + this.amount-=amountRemaining; + cElementalInstanceStackMap products=decayCompute(decays,lifeTimeMult,newProductsAge,energy); + this.amount=amou |
