diff options
| author | Technus <daniel112092@gmail.com> | 2017-12-12 22:07:49 +0100 |
|---|---|---|
| committer | Technus <daniel112092@gmail.com> | 2017-12-12 22:07:49 +0100 |
| commit | 59f659ad868e21f78dc26c18b093d8b58c0d5237 (patch) | |
| tree | f58a8b47a929fe952a371e9d3ddf6d0e06993325 /src | |
| parent | bce02aacb936f4c87085f1cc58551477f1c81564 (diff) | |
| parent | 92f600c303efb7ca5c9bfb5272ca959a4dabbbe7 (diff) | |
| download | GT5-Unofficial-59f659ad868e21f78dc26c18b093d8b58c0d5237.tar.gz GT5-Unofficial-59f659ad868e21f78dc26c18b093d8b58c0d5237.tar.bz2 GT5-Unofficial-59f659ad868e21f78dc26c18b093d8b58c0d5237.zip | |
Merge branch 'master' into nh-recipes
# Conflicts:
# build.properties
Diffstat (limited to 'src')
32 files changed, 1128 insertions, 368 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=amountRemaining; + products.putUnify(this.clone()); + this.amount=amount; + return products; + } + + //Use to get direct decay output providing correct decay array + public cElementalInstanceStackMap decayCompute(cElementalDecay[] decays, float lifeTimeMult, long newProductsAge, long energy) { if (decays == null) return null;//Can not decay so it wont else if (decays.length == 0) return new cElementalInstanceStackMap();//provide non null 0 length array for annihilation else if (decays.length == 1) {//only one type of decay :D, doesn't need dead end - return decays[0].getResults(lifeTimeMult, newProductsAge, energy, this.amount); + cElementalInstanceStackMap products=decays[0].getResults(lifeTimeMult, newProductsAge, energy, this.amount); + if(newProductsAge<0){ + for(cElementalInstanceStack s:products.values()){ + if(s.definition.equals(definition)){ + s.age=this.age; + s.energy=this.energy; + } + } + }else{ + for(cElementalInstanceStack s:products.values()){ + if(s.definition.equals(definition)){ + s.energy=this.energy; + } + } + } + return products; } else { cElementalInstanceStackMap output = new cElementalInstanceStackMap(); final int differentDecays = decays.length; - int[] qttyOfDecay = new int[differentDecays]; - int amountRemaining = this.amount, amount = this.amount; + long[] qttyOfDecay = new long[differentDecays]; + long amountRemaining = this.amount, amount = this.amount; float remainingProbability = 1F; for (int i = 0; i < differentDecays; i++) { if (decays[i].probability > 1F) { - int thisDecayAmount = (int) (Math.floor(remainingProbability * (float) amount)); + long thisDecayAmount = (long) (Math.floor(remainingProbability * (double) amount)); if (thisDecayAmount == 0) { //remainingProbability=something; break; @@ -170,7 +231,7 @@ public final class cElementalInstanceStack implements iHasElementalDefinition { //remainingProbability=0; break; } - int thisDecayAmount = (int) (Math.floor(decays[i].probability * (float) amount)); + long thisDecayAmount = (long) (Math.floor(decays[i].probability * (double) amount)); if (thisDecayAmount <= amountRemaining && thisDecayAmount > 0) {//some was made remainingProbability -= (decays[i].probability); amountRemaining -= thisDecayAmount; @@ -184,9 +245,9 @@ public final class cElementalInstanceStack implements iHasElementalDefinition { } for (int i = 0; i < amountRemaining; i++) { - double rand = (double) (TecTech.Rnd.nextFloat()); + double rand = TecTech.Rnd.nextDouble(); for (int j = 0; j < differentDecays; j++) {//looking for the thing it decayed into - rand -= (double) (decays[j].probability); + rand -= decays[j].probability; if (rand <= 0D) { qttyOfDecay[j]++; break; @@ -198,6 +259,21 @@ public final class cElementalInstanceStack implements iHasElementalDefinition { if (qttyOfDecay[i] > 0) output.putUnifyAll(decays[i].getResults(lifeTimeMult, newProductsAge, energy, qttyOfDecay[i])); } + + if(newProductsAge<0){ + for(cElementalInstanceStack s:output.values()){ + if(s.definition.equals(definition)){ + s.age=this.age; + s.energy=this.energy; + } + } + }else{ + for(cElementalInstanceStack s:output.values()){ + if(s.definition.equals(definition)){ + s.energy=this.energy; + } + } + } return output; } } @@ -205,7 +281,7 @@ public final class cElementalInstanceStack implements iHasElementalDefinition { public cElementalInstanceStack unifyIntoThis(cElementalInstanceStack... instances) { if (instances == null) return this; //returns with the definition from the first object passed - int energy = this.energy * this.amount; + long energy = this.energy * this.amount; float lifeTimeMul = this.lifeTimeMult; for (cElementalInstanceStack instance : instances) { @@ -220,15 +296,15 @@ public final class cElementalInstanceStack implements iHasElementalDefinition { if (amount != 0) energy /= Math.abs(amount); this.energy = energy; - this.multLifeTime(lifeTimeMul); + this.setLifeTimeMultipleOfBaseValue(lifeTimeMul); return this; } public NBTTagCompound toNBT() { NBTTagCompound nbt = new NBTTagCompound(); nbt.setTag("d", definition.toNBT()); - nbt.setInteger("q", amount); - nbt.setInteger("e", energy); + nbt.setLong("q", amount); + nbt.setLong("e", energy); nbt.setByte("c", color); nbt.setLong("a", age); nbt.setFloat("m", lifeTimeMult); @@ -239,10 +315,10 @@ public final class cElementalInstanceStack implements iHasElementalDefinition { NBTTagCompound definition = nbt.getCompoundTag("d"); cElementalInstanceStack instance = new cElementalInstanceStack( cElementalDefinition.fromNBT(definition), - nbt.getInteger("q"), + nbt.getLong("q"), nbt.getFloat("m"), nbt.getLong("a"), - nbt.getInteger("e")); + nbt.getLong("e")); instance.setColor(nbt.getByte("c")); return instance; } diff --git a/src/main/java/com/github/technus/tectech/elementalMatter/core/interfaces/iElementalDefinition.java b/src/main/java/com/github/technus/tectech/elementalMatter/core/interfaces/iElementalDefinition.java index e40e2c0a46..33432bad5d 100644 --- a/src/main/java/com/github/technus/tectech/elementalMatter/core/interfaces/iElementalDefinition.java +++ b/src/main/java/com/github/technus/tectech/elementalMatter/core/interfaces/iElementalDefinition.java @@ -13,6 +13,9 @@ import net.minecraft.nbt.NBTTagCompound; */ public interface iElementalDefinition extends Comparable<iElementalDefinition>,Cloneable {//IMMUTABLE float STABLE_RAW_LIFE_TIME =1.5e36f; + float NO_DECAY_RAW_LIFE_TIME=-1; + long DEFAULT_ENERGY_LEVEL=0; + float DEFAULT_ENERGY_REQUIREMENT=25000f; //Nomenclature String getName(); @@ -30,7 +33,11 @@ public interface iElementalDefinition extends Comparable<iElementalDefinition>,C cElementalDecay[] getNaturalDecayInstant();//natural decay if lifespan <1tick - cElementalDecay[] getEnergeticDecayInstant();//energetic decay if lifespan <1tick + cElementalDecay[] getEnergyInducedDecay(long energyLevel);//energetic decay + + boolean usesSpecialEnergeticDecayHandling(); + + float getEnergyDiffBetweenStates(long currentEnergy, long newEnergyLevel);//positive or negative float getMass();//mass... MeV/c^2 @@ -39,7 +46,9 @@ public interface iElementalDefinition extends Comparable<iElementalDefinition>,C //dynamically changing stuff byte getColor();//-1 nope cannot 0 it can but undefined - float getRawLifeTime();//defined in static fields or generated + float getRawTimeSpan(long currentEnergy);//defined in static fields or generated + + boolean isTimeSpanHalfLife(); cElementalDefinitionStackMap getSubParticles();//contents... null if none diff --git a/src/main/java/com/github/technus/tectech/elementalMatter/core/interfaces/iHasElementalDefinition.java b/src/main/java/com/github/technus/tectech/elementalMatter/core/interfaces/iHasElementalDefinition.java index 815af67974..92aac40bf8 100644 --- a/src/main/java/com/github/technus/tectech/elementalMatter/core/interfaces/iHasElementalDefinition.java +++ b/src/main/java/com/github/technus/tectech/elementalMatter/core/interfaces/iHasElementalDefinition.java @@ -6,11 +6,11 @@ package com.github.technus.tectech.elementalMatter.core.interfaces; public interface iHasElementalDefinition extends Comparable<iHasElementalDefinition>,Cloneable { iElementalDefinition getDefinition(); - int getAmount(); + long getAmount(); - float getMass(); + long getCharge(); - int getCharge(); + float getMass(); iHasElementalDefinition clone(); } diff --git a/src/main/java/com/github/technus/tectech/elementalMatter/core/templates/cElementalPrimitive.java b/src/main/java/com/github/technus/tectech/elementalMatter/core/templates/cElementalPrimitive.java index 5f250888b2..2a2a3459c2 100644 --- a/src/main/java/com/github/technus/tectech/elementalMatter/core/templates/cElementalPrimitive.java +++ b/src/main/java/com/github/technus/tectech/elementalMatter/core/templates/cElementalPrimitive.java @@ -108,18 +108,28 @@ public abstract class cElementalPrimitive extends cElementalDefinition { } @Override - public cElementalDecay[] getEnergeticDecayInstant() { + public cElementalDecay[] getEnergyInducedDecay(long energyLevel) { if (energeticDecayInstant < 0) return elementalDecays; return new cElementalDecay[]{elementalDecays[energeticDecayInstant]}; } @Override + public float getEnergyDiffBetweenStates(long currentEnergyLevel, long newEnergyLevel) { + return DEFAULT_ENERGY_REQUIREMENT*(newEnergyLevel-currentEnergyLevel); + } + + @Override + public boolean usesSpecialEnergeticDecayHandling() { + return false; + } + + @Override public cElementalDecay[] getDecayArray() { return elementalDecays; } @Override - public float getRawLifeTime() { + public float getRawTimeSpan(long currentEnergy) { return rawLifeTime; } diff --git a/src/main/java/com/github/technus/tectech/elementalMatter/definitions/complex/dAtomDefinition.java b/src/main/java/com/github/technus/tectech/elementalMatter/definitions/complex/dAtomDefinition.java index 3fc042f0d9..92ba693889 100644 --- a/src/main/java/com/github/technus/tectech/elementalMatter/definitions/complex/dAtomDefinition.java +++ b/src/main/java/com/github/technus/tectech/elementalMatter/definitions/complex/dAtomDefinition.java @@ -10,7 +10,10 @@ import com.github.technus.tectech.elementalMatter.core.containers.cElementalDefi import com.github.technus.tectech.elementalMatter.core.interfaces.iElementalDefinition; import com.github.technus.tectech.elementalMatter.core.tElementalException; import com.github.technus.tectech.elementalMatter.core.templates.cElementalDefinition; -import com.github.technus.tectech.elementalMatter.core.transformations.*; +import com.github.technus.tectech.elementalMatter.core.transformations.aFluidDequantizationInfo; +import com.github.technus.tectech.elementalMatter.core.transformations.aItemDequantizationInfo; +import com.github.technus.tectech.elementalMatter.core.transformations.aOredictDequantizationInfo; +import com.github.technus.tectech.elementalMatter.core.transformations.bTransformationInfo; import com.github.technus.tectech.elementalMatter.definitions.complex.iaea.iaeaNuclide; import com.github.technus.tectech.elementalMatter.definitions.primitive.eBosonDefinition; import com.github.technus.tectech.elementalMatter.definitions.primitive.eLeptonDefinition; @@ -19,7 +22,6 @@ import cpw.mods.fml.common.Loader; import gregtech.api.enums.Materials; import gregtech.api.enums.OrePrefixes; import net.minecraft.nbt.NBTTagCompound; -import net.minecraftforge.oredict.OreDictionary; import java.util.*; @@ -33,6 +35,9 @@ import static gregtech.api.enums.OrePrefixes.dust; * Created by danie_000 on 18.11.2016. */ public final class dAtomDefinition extends cElementalDefinition { + public static final long ATOM_COMPLEXITY_LIMIT=65536L; + private static final byte BYTE_OFFSET=32; + private final int hash; public static final bTransformationInfo transformation=new bTransformationInfo(16,0,64); public static float refMass, refUnstableMass; @@ -43,8 +48,7 @@ public final class dAtomDefinition extends cElementalDefinition { private static final Map<Integer, dAtomDefinition> stableAtoms = new HashMap<>(); private static Map<Integer, TreeMap<Float, Integer>> mostStableUnstableIsotopes = new HashMap<>(); private static final Map<Integer, dAtomDefinition> unstableAtoms = new HashMap<>(); - private static cElementalDefinitionStack alpha; - + private static cElementalDefinitionStack alpha,deuterium,tritium,helium_3,beryllium_8,carbon_14,neon_24,silicon_34; private static final HashMap<dAtomDefinition,Float> lifetimeOverrides = new HashMap<>(); public static final ArrayList<Runnable> overrides = new ArrayList<>(); @@ -60,16 +64,18 @@ public final class dAtomDefinition extends cElementalDefinition { public final int charge; //int -electric charge in 1/3rds of electron charge for optimization public final int chargeLeptons; - public final float rawLifeTime; + private float rawLifeTime; //generation max present inside - minus if contains any anti quark public final byte type; public final byte decayMode;//t neutron to proton+,0,f proton to neutron - public final boolean stable; + //public final boolean stable; public final int neutralCount; public final int element; + private final boolean iaeaDefinitionExistsAndHasEnergyLevels; + private final cElementalDefinitionStackMap elementalStacks; //stable is rawLifeTime>=10^9 @@ -108,7 +114,7 @@ public final class dAtomDefinition extends cElementalDefinition { boolean containsAnti = false; for (cElementalDefinitionStack stack : elementalStacks.values()) { iElementalDefinition def = stack.definition; - int amount = stack.amount; + int amount = (int)stack.amount; mass += stack.getMass(); if (def.getType() < 0) containsAnti = true; type = Math.max(type, Math.abs(def.getType())); @@ -123,7 +129,7 @@ public final class dAtomDefinition extends cElementalDefinition { } } this.type = containsAnti ? (byte) -type : (byte) type; - this.mass = mass; + //this.mass = mass; this.chargeLeptons = cLeptons; this.charge = cNucleus + cLeptons; this.neutralCount = neutralCount; @@ -131,40 +137,56 @@ public final class dAtomDefinition extends cElementalDefinition { element = Math.abs(element); - //stability curve int StableIsotope = stableIzoCurve(element); int izoDiff = neutralCount - StableIsotope; int izoDiffAbs = Math.abs(izoDiff); - hash=super.hashCode(); - - iaea=iaeaNuclide.get(element,neutralCount); + xstr.setSeed((element + 1L) * (neutralCount + 100L)); + this.iaea=iaeaNuclide.get(element,neutralCount); if(iaea!=null){ - xstr.setSeed((long) (element + 1) * (neutralCount + 100)); - this.rawLifeTime=containsAnti ? iaea.Thalf * 1.5514433E-21f * (1f + xstr.nextFloat() * 9f):iaea.Thalf; + if(Float.isNaN(iaea.mass)) this.mass=mass; + else this.mass=iaea.mass; + + if(Float.isNaN(iaea.halfTime)) { + Float overriddenLifeTime=lifetimeOverrides.get(this); + float rawLifeTimeTemp; + if(overriddenLifeTime!=null) + rawLifeTimeTemp = overriddenLifeTime; + else { + rawLifeTimeTemp = calculateLifeTime(izoDiff, izoDiffAbs, element, neutralCount, containsAnti); + } + this.rawLifeTime=rawLifeTimeTemp> STABLE_RAW_LIFE_TIME ? STABLE_RAW_LIFE_TIME :rawLifeTimeTemp; + }else { + this.rawLifeTime = containsAnti ? iaea.halfTime * 1.5514433E-21f * (1f + xstr.nextFloat() * 9f) : iaea.halfTime; + } + this.iaeaDefinitionExistsAndHasEnergyLevels =iaea.energeticStatesArray.length>1; }else{ + this.mass=mass; + Float overriddenLifeTime=lifetimeOverrides.get(this); float rawLifeTimeTemp; if(overriddenLifeTime!=null) rawLifeTimeTemp = overriddenLifeTime; else { - xstr.setSeed((long) (element + 1) * (neutralCount + 100)); rawLifeTimeTemp = calculateLifeTime(izoDiff, izoDiffAbs, element, neutralCount, containsAnti); } this.rawLifeTime=rawLifeTimeTemp> STABLE_RAW_LIFE_TIME ? STABLE_RAW_LIFE_TIME :rawLifeTimeTemp; - } + this.iaeaDefinitionExistsAndHasEnergyLevels =false; + } - if(iaea==null || iaea.energeticStates==null || iaea.energeticStates.get(0f)==null) { + if(iaea==null || iaea.energeticStatesArray[0].energy!=0) { if (izoDiff == 0) this.decayMode = 0; else this.decayMode = izoDiff > 0 ? (byte) Math.min(2, 1 + izoDiffAbs / 4) : (byte) -Math.min(2, 1 + izoDiffAbs / 4); }else{ - this.decayMode=Byte.MAX_VALUE; + this.decayMode = izoDiff > 0 ? (byte) (Math.min(2, 1 + izoDiffAbs / 4)+ BYTE_OFFSET) : (byte) (-Math.min(2, 1 + izoDiffAbs / 4) + BYTE_OFFSET); } - this.stable = this.rawLifeTime >= STABLE_RAW_LIFE_TIME; + //this.stable = this.rawLifeTime >= STABLE_RAW_LIFE_TIME; + + hash=super.hashCode(); } private static int stableIzoCurve(int element) { @@ -227,12 +249,15 @@ public final class dAtomDefinition extends cElementalDefinition { private static boolean canTheyBeTogether(cElementalDefinitionStackMap stacks) { boolean nuclei = false; - for (cElementalDefinitionStack stack : stacks.values()) + long qty=0; + for (cElementalDefinitionStack stack : stacks.values()) { if (stack.definition instanceof dHadronDefinition) { if (((dHadronDefinition) stack.definition).amount != 3) return false; nuclei = true; } else if (!(stack.definition instanceof eLeptonDefinition)) return false; - return nuclei; + qty+=stack.amount; + } + return nuclei && qty<ATOM_COMPLEXITY_LIMIT; } @Override @@ -263,8 +288,20 @@ public final class dAtomDefinition extends cElementalDefinition { } @Override - public float getRawLifeTime() { - return rawLifeTime; + public float getRawTimeSpan(long currentEnergy) { + if(currentEnergy<=0) return rawLifeTime; + if(iaeaDefinitionExistsAndHasEnergyLevels){ + if(currentEnergy>=iaea.energeticStatesArray.length){ + return iaea.energeticStatesArray[iaea.energeticStatesArray.length-1].Thalf/(currentEnergy-iaea.energeticStatesArray.length+1); + } + return iaea.energeticStatesArray[(int)currentEnergy].Thalf; + } + return rawLifeTime/(currentEnergy+1); + } + + @Override + public boolean isTimeSpanHalfLife() { + return true; } @Override @@ -278,7 +315,7 @@ public final class dAtomDefinition extends cElementalDefinition { final boolean negative = element < 0; try { if (type != 1) return (negative ? "~? " : "? ") + nomenclature.Name[element]; - return negative ? "~" + nomenclature.Name[element] : nomenclature.Name[element]; + return negative ? "~" + nomenclature.Name[-element] : nomenclature.Name[element]; } catch (Exception e) { if (DEBUG_MODE) e.printStackTrace(); return (negative ? "Element: ~" : "Element: ") + element; @@ -310,136 +347,607 @@ public final class dAtomDefinition extends cElementalDefinition { @Override public cElementalDecay[] getDecayArray() { + ArrayList<cElementalDecay> decaysList=new ArrayList<>(4); + return getDecayArray(decaysList,decayMode,true); + } + + private cElementalDecay[] getDecayArray(ArrayList<cElementalDecay> decaysList,int decayMode,boolean tryAnti) { if (this.type == 1) { switch (decayMode) { case -2: - return PbetaDecay(); + if(TecTech.Rnd.nextBoolean() && ElectronCapture(decaysList)) + return decaysList.toArray(new cElementalDecay[decaysList.size()]); + else if(PbetaDecay(decaysList)) + return decaysList.toArray(new cElementalDecay[decaysList.size()]); + break; case -1: - return Emmision(dHadronDefinition.hadron_p1); + if(Emmision(decaysList, dHadronDefinition.hadron_p1)) + return decaysList.toArray(new cElementalDecay[decaysList.size()]); + break; case 0: - return alphaDecay(); + if(alphaDecay(decaysList)) + return decaysList.toArray(new cElementalDecay[decaysList.size()]); + break; case 1: - return Emmision(dHadronDefinition.hadron_n1); + if(Emmision(decaysList, dHadronDefinition.hadron_n1)) + return decaysList.toArray(new cElementalDecay[decaysList.size()]); + break; case 2: - return MbetaDecay(); - case Byte.MAX_VALUE: - return iaeaDecay(); + if(MbetaDecay(decaysList)) + return decaysList.toArray(new cElementalDecay[decaysList.size()]); + break; default: - return getNaturalDecayInstant(); + if(decayMode>8){ + if(iaeaDecay(decaysList,0)) + return decaysList.toArray(new cElementalDecay[decaysList.size()]); + return getDecayArray(decaysList,decayMode-BYTE_OFFSET,false); + } } - } else { - return getNaturalDecayInstant(); + return cElementalDecay.noDecay; + }else if(this.type==-1){ + dAtomDefinition anti=getAnti(); + if(anti!=null) return anti.getDecayArray(decaysList,decayMode,false); } + return getNaturalDecayInstant(); } - private cElementalDecay[] iaeaDecay(){ - return null; + private boolean iaeaDecay(ArrayList<cElementalDecay> decaysList,long energy){ + iaeaNuclide.energeticState state; + if(energy>iaea.energeticStatesArray.length) state = iaea.energeticStatesArray[iaea.energeticStatesArray.length-1]; + else if(energy<=0) state = iaea.energeticStatesArray[0]; + else state=iaea.energeticStatesArray[(int)energy]; + for (int i=0;i<state.decaymodes.length;i++){ + if(!getDecay(decaysList,state.decaymodes[i])) { + decaysList.clear(); + return false; + } + } + return true; } - private cElementalDecay[] Emmision(cElementalDefinitionStack emit) { - final cElementalMutableDefinitionStackMap tree = new cElementalMutableDefinitionStackMap(elementalStacks.values()); + private boolean getDecay(ArrayList<cElementalDecay> decaysList,iaeaNuclide.iaeaDecay decay){ + cElementalMutableDefinitionStackMap withThis=elementalStacks.toMutable(),newStuff=new cElementalMutableDefinitionStackMap(); + switch (decay.decayName){ + case "D": { + if (withThis.removeAllAmounts(false, deuterium.definition.getSubParticles())){ + withThis.putReplace(deuterium); + decaysList.add(new cElementalDecay(decay.chance,withThis.toImmutable_unsafeMightLeaveExposedElementalTree())); + return true; + } + } break; + case "3H": { + if (withThis.removeAllAmounts(false, tritium.definition.getSubParticles())){ + withThis.putReplace(tritium); + decaysList.add(new cElementalDecay(decay.chance,withThis.toImmutable_unsafeMightLeaveExposedElementalTree())); + return true; + } + } break; + case "3HE": { + if (withThis.removeAllAmounts(false, helium_3.definition.getSubParticles())){ + withThis.putReplace(helium_3); + decaysList.add(new cElementalDecay(decay.chance,withThis.toImmutable_unsafeMightLeaveExposedElementalTree())); + return true; + } + } break; + case "8BE": { + if (withThis.removeAllAmounts(false, beryllium_8.definition.getSubParticles())){ + withThis.putReplace(beryllium_8); + decaysList.add(new cElementalDecay(decay.chance,withThis.toImmutable_unsafeMightLeaveExposedElementalTree())); + return true; + } + } break; + case "14C": { + if (withThis.removeAllAmounts(false, carbon_14.definition.getSubParticles())){ + newStuff.putReplace(carbon_14); + try{ + newStuff.putReplace(new dAtomDefinition(withThis.toImmutable_unsafeMightLeaveExposedElementalTree()).getStackForm(1)); + decaysList.add(new cElementalDecay(decay.chance,newStuff.toImmutable_unsafeMightLeaveExposedElementalTree())); + return true; + }catch (Exception e){ + if(DEBUG_MODE) e.printStackTrace(); + } + } + } break; + case "24NE": { + if (withThis.removeAllAmounts(false, neon_24.definition.getSubParticles())){ + newStuff.putReplace(neon_24); + try{ + newStuff.putReplace(new dAtomDefinition(withThis.toImmutable_unsafeMightLeaveExposedElementalTree()).getStackForm(1)); + decaysList.add(new cElementalDecay(decay.chance,newStuff.toImmutable_unsafeMightLeaveExposedElementalTree())); + return true; + }catch (Exception e){ + if(DEBUG_MODE) e.printStackTrace(); + } + } + } break; + case "34SI": { + if (withThis.removeAllAmounts(false, silicon_34.definition.getSubParticles())){ + newStuff.putReplace(silicon_34); + try{ + newStuff.putReplace(new dAtomDefinition(withThis.toImmutable_unsafeMightLeaveExposedElementalTree()).getStackForm(1)); + decaysList.add(new cElementalDecay(decay.chance,newStuff.toImmutable_unsafeMightLeaveExposedElementalTree())); + return true; + }catch (Exception e){ + if(DEBUG_MODE) e.printStackTrace(); + } + } + } break; + case "A": case "A?": { + if (withThis.removeAllAmounts(false, dHadronDefinition.hadron_n2,dHadronDefinition.hadron_p2)){ + newStuff.putReplace(alpha); + try{ + newStuff.putReplace(new dAtomDefinition(withThis.toImmutable_unsafeMightLeaveExposedElementalTree()).getStackForm(1)); + decaysList.add(new cElementalDecay(decay.chance,newStuff.toImmutable_unsafeMightLeaveExposedElementalTree())); + return true; + }catch (Exception e){ + if(DEBUG_MODE) e.printStackTrace(); + } + } + } break; + case "B+": { + if (withThis.removeAllAmounts(false, dHadronDefinition.hadron_p1)){ + withThis.putUnify(dHadronDefinition.hadron_n1); + newStuff.putReplace(eLeptonDefinition.lepton_e_1); + newStuff.putReplace(eNeutrinoDefinition.lepton_Ve1); + try{ + newStuff.putReplace(new dAtomDefinition(withThis.toImmutable_unsafeMightLeaveExposedElementalTree()).getStackForm(1)); + decaysList.add(new cElementalDecay(decay.chance,newStuff.toImmutable_unsafeMightLeaveExposedElementalTree())); + return true; + }catch (Exception e){ + if(DEBUG_MODE) e.printStackTrace(); + } + } + } break; + case "2B+": { + if (withThis.removeAllAmounts(false, dHadronDefinition.hadron_p2)){ + withThis.putUnify(dHadronDefinition.hadron_n2); + newStuff.putReplace(eLeptonDefinition.lepton_e_2); + newStuff.putReplace(eNeutrinoDefinition.lepton_Ve2); + try{ + newStuff.putReplace(new dAtomDefinition(withThis.toImmutable_unsafeMightLeaveExposedElementalTree()).getStackForm(1)); + decaysList.add(new cElementalDecay(decay.chance,newStuff.toImmutable_unsafeMightLeaveExposedElementalTree())); + return true; + }catch (Exception e){ + if(DEBUG_MODE) e.printStackTrace(); + } + } + } break; + case "B-": { + if (withThis.removeAllAmounts(false, dHadronDefinition.hadron_n1)){ + withThis.putUnify(dHadronDefinition.hadron_p1); + newStuff.putReplace(eLeptonDefinition.lepton_e1); + newStuff.putReplace(eNeutrinoDefinition.lepton_Ve_1); + try{ + newStuff.putReplace(new dAtomDefinition(withThis.toImmutable_unsafeMightLeaveExposedElementalTree()).getStackForm(1)); + decaysList.add(new cElementalDecay(decay.chance,newStuff.toImmutable_unsafeMightLeaveExposedElementalTree())); + return true; + }catch (Exception e){ + if(DEBUG_MODE) e.printStackTrace(); + } + } + } break; + case "2B-": { + if (withThis.removeAllAmounts(false, dHadronDefinition.hadron_n2)){ + withThis.putUnify(dHadronDefinition.hadron_p2); + newStuff.putReplace(eLeptonDefinition.lepton_e2); + newStuff.putReplace(eNeutrinoDefinition.lepton_Ve_2); + try{ + newStuff.putReplace(new dAtomDefinition(withThis.toImmutable_unsafeMightLeaveExposedElementalTree()).getStackForm(1)); + decaysList.add(new cElementalDecay(decay.chance,newStuff.toImmutable_unsafeMightLeaveExposedElementalTree())); + return true; + }catch (Exception e){ + if(DEBUG_MODE) e.printStackTrace(); + } + } + } break; + case "EC": { + if (withThis.removeAllAmounts(false, dHadronDefinition.hadron_p1,eLeptonDefinition.lepton_e1)){ + withThis.putUnify(dHadronDefinition.hadron_n1); + newStuff.putReplace(eNeutrinoDefinition.lepton_Ve1); + try{ + newStuff.putReplace(new dAtomDefinition(withThis.toImmutable_unsafeMightLeaveExposedElementalTree()).getStackForm(1)); + decaysList.add(new cElementalDecay(decay.chance,newStuff.toImmutable_unsafeMightLeaveExposedElementalTree())); + return true; + }catch (Exception e){ + if(DEBUG_MODE) e.printStackTrace(); + } + } + } break; + case "2EC": { + if (withThis.removeAllAmounts(false, dHadronDefinition.hadron_p2,eLeptonDefinition.lepton_e2)){ + withThis.putUnify(dHadronDefinition.hadron_n2); + newStuff.putReplace(eNeutrinoDefinition.lepton_Ve2); + try{ + newStuff.putReplace(new dAtomDefinition(withThis.toImmutable_unsafeMightLeaveExposedElementalTree()).getStackForm(1)); + decaysList.add(new cElementalDecay(decay.chance,newStuff.toImmutable_unsafeMightLeaveExposedElementalTree())); + return true; + }catch (Exception e){ + if(DEBUG_MODE) e.printStackTrace(); + } + } + } break; + case "B++EC": case "EC+B+": { + if (withThis.removeAllAmounts(false, dHadronDefinition.hadron_p2,eLeptonDefinition.lepton_e1)){ + withThis.putUnify(dHadronDefinition.hadron_n2); + newStuff.putReplace(eLeptonDefinition.lepton_e_1); + newStuff.putReplace(eNeutrinoDefinition.lepton_Ve2); + try{ + newStuff.putReplace(new dAtomDefinition(withThis.toImmutable_unsafeMightLeaveExposedElementalTree()).getStackForm(1)); + decaysList.add(new cElementalDecay(decay.chance,newStuff.toImmutable_unsafeMightLeaveExposedElementalTree())); + return true; + }catch (Exception e){ + if(DEBUG_MODE) e.printStackTrace(); + } + } + } break; + case "B+A": { + if (withThis.removeAllAmounts(false, dHadronDefinition.hadron_p3, dHadronDefinition.hadron_n1)){ + newStuff.putReplace(eLeptonDefinition.lepton_e_1); + newStuff.putReplace(eNeutrinoDefinition.lepton_Ve1); + newStuff.putReplace(alpha); + try{ + newStuff.putReplace(new dAtomDefinition(withThis.toImmutable_unsafeMightLeaveExposedElementalTree()).getStackForm(1)); + decaysList.add(new cElementalDecay(decay.chance,newStuff.toImmutable_unsafeMightLeaveExposedElementalTree())); + return true; + }catch (Exception e){ + if(DEBUG_MODE) e.printStackTrace(); + } + } + } break; + case "B+P": { + if (withThis.removeAllAmounts(false, dHadronDefinition.hadron_p2)){ + withThis.putUnify(dHadronDefinition.hadron_n1); + newStuff.putReplace(eLeptonDefinition.lepton_e_1); + newStuff.putReplace(eNeutrinoDefinition.lepton_Ve1); + newStuff.putReplace(dHadronDefinition.hadron_p1); + try{ + newStuff.putReplace(new dAtomDefinition(withThis.toImmutable_unsafeMightLeaveExposedElementalTree()).getStackForm(1)); + decaysList.add(new cElementalDecay(decay.chance,newStuff.toImmutable_unsafeMightLeaveExposedElementalTree())); + return true; + }catch (Exception e){ + if(DEBUG_MODE) e.printStackTrace(); + } + } + } break; + case "B+2P": { + if (withThis.removeAllAmounts(false, dHadronDefinition.hadron_p3)){ + withThis.putUnify(dHadronDefinition.hadron_n1); + newStuff.putReplace(eLeptonDefinition.lepton_e_1); + newStuff.putReplace(eNeutrinoDefinition.lepton_Ve1); + newStuff.putReplace(dHadronDefinition.hadron_p2); + try{ + newStuff.putReplace(new dAtomDefinition(withThis.toImmutable_unsafeMightLeaveExposedElementalTree()).getStackForm(1)); + decaysList.add(new cElementalDecay(decay.chance,newStuff.toImmutable_unsafeMightLeaveExposedElementalTree())); + return true; + }catch (Exception e){ + if(DEBUG_MODE) e.printStackTrace(); + } + } + } break; + case "B-A": { + if (withThis.removeAllAmounts(false, dHadronDefinition.hadron_n3, dHadronDefinition.hadron_p1)){ + newStuff.putReplace(eLeptonDefinition.lepton_e1); + newStuff.putReplace(eNeutrinoDefinition.lepton_Ve_1); + newStuff.putReplace(alpha); + try{ + newStuff.putReplace(new dAtomDefinition(withThis.toImmutable_unsafeMightLeaveExposedElementalTree()).getStackForm(1)); + decaysList.add(new cElementalDecay(decay.chance,newStuff.toImmutable_unsafeMightLeaveExposedElementalTree())); + return true; + }catch (Exception e){ + if(DEBUG_MODE) e.printStackTrace(); + } + } + } break; + case "B-N": { + if (withThis.removeAllAmounts(false, dHadronDefinition.hadron_n2)){ + withThis.putUnify(dHadronDefinition.hadron_p1); + newStuff.putReplace(eLeptonDefinition.lepton_e1); + newStuff.putReplace(eNeutrinoDefinition.lepton_Ve_1); + newStuff.putReplace(dHadronDefinition.hadron_n1); + try{ + newStuff.putReplace(new dAtomDefinition(withThis.toImmutable_unsafeMightLeaveExposedElementalTree()).getStackForm(1)); + decaysList.add(new cElementalDecay(decay.chance,newStuff.toImmutable_unsafeMightLeaveExposedElementalTree())); + return true; + }catch (Exception e){ + if(DEBUG_MODE) e.printStackTrace(); + } + } + } break; + case "B-2N": { + if (withThis.removeAllAmounts(false, dHadronDefinition.hadron_n3)){ + withThis.putUnify(dHadronDefinition.hadron_p1); + newStuff.putReplace(eLeptonDefinition.lepton_e1); + newStuff.putReplace(eNeutrinoDefinition.lepton_Ve_1); + newStuff.putReplace(dHadronDefinition.hadron_n2); + try{ + newStuff.putReplace(new dAtomDefinition(withThis.toImmutable_unsafeMightLeaveExposedElementalTree()).getStackForm(1)); + decaysList.add(new cElementalDecay(decay.chance,newStuff.toImmutable_unsafeMightLeaveExposedElementalTree())); + return true; + }catch (Exception e){ + if(DEBUG_MODE) e.printStackTrace(); + } + } + } break; + case "B-P": { + if (withThis.removeAllAmounts(false, dHadronDefinition.hadron_n1)){ + newStuff.putReplace(eLeptonDefinition.lepton_e1); + newStuff.putReplace(eNeutrinoDefinition.lepton_Ve_1); + newStuff.putReplace(dHadronDefinition.hadron_p1); + try{ + newStuff.putReplace(new dAtomDefinition(withThis.toImmutable_unsafeMightLeaveExposedElementalTree()).getStackForm(1)); + decaysList.add(new cElementalDecay(decay.chance,newStuff.toImmutable_unsafeMightLeaveExposedElementalTree())); + return true; + }catch (Exception e){ + if(DEBUG_MODE) e.printStackTrace(); + } + } + } break; + case "ECA": { + if (withThis.removeAllAmounts(false, dHadronDefinition.hadron_n1,eLeptonDefinition.lepton_e1,dHadronDefinition.hadron_p3)){ + newStuff.putReplace(eNeutrinoDefinition.lepton_Ve1); + newStuff.putReplace(alpha); + try{ + newStuff.putReplace(new dAtomDefinition(withThis.toImmutable_unsafeMightLeaveExposedElementalTree()).getStackForm(1)); + decaysList.add(new cElementalDecay(decay.chance,newStuff.toImmutable_unsafeMightLeaveExposedElementalTree())); + return true; + }catch (Exception e){ + if(DEBUG_MODE) e.printStackTrace(); + } + } + } break; + case "ECP": { + if (withThis.removeAllAmounts(false, eLeptonDefinition.lepton_e1,dHadronDefinition.hadron_p2)){ + withThis.putUnify(dHadronDefinition.hadron_n1); + newStuff.putReplace(eNeutrinoDefinition.lepton_Ve1); + newStuff.putReplace(dHadronDefinition.hadron_p1); + try{ + newStuff.putReplace(new dAtomDefinition(withThis.toImmutable_unsafeMightLeaveExposedElementalTree()).getStackForm(1)); + decaysList.add(new cElementalDecay(decay.chance,newStuff.toImmutable_unsafeMightLeaveExposedElementalTree())); + return true; + }catch (Exception e){ + if(DEBUG_MODE) e.printStackTrace(); + } + } + } break; + case "EC2P": { + if (withThis.removeAllAmounts(false, eLeptonDefinition.lepton_e1,dHadronDefinition.hadron_p3)){ + withThis.putUnify(dHadronDefinition.hadron_n1); + newStuff.putReplace(eNeutrinoDefinition.lepton_Ve1); + newStuff.putReplace(dHadronDefinition.hadron_p2); + try{ + newStuff.putReplace(new dAtomDefinition(withThis.toImmutable_unsafeMightLeaveExposedElementalTree()).getStackForm(1)); + decaysList.add(new cElementalDecay(decay.chance,newStuff.toImmutable_unsafeMightLeaveExposedElementalTree())); + return true; + }catch (Exception e){ + if(DEBUG_MODE) e.printStackTrace(); + } + } + } break; + case "ECP+EC2P": {//todo look at branching ratios + if (withThis.removeAllAmounts(false, eLeptonDefinition.lepton_e2,dHadronDefinition.hadron_p5)){ + withThis.putUnify(dHadronDefinition.hadron_n1); + newStuff.putReplace(eNeutrinoDefinition.lepton_Ve2); + newStuff.putReplace(dHadronDefinition.hadron_p3); + try{ + newStuff.putReplace(new dAtomDefinition(withThis.toImmutable_unsafeMightLeaveExposedElementalTree()).getStackForm(1)); + decaysList.add(new cElementalDecay(decay.chance,newStuff.toImmutable_unsafeMightLeaveExposedElementalTree())); + return true; + }catch (Exception e){ + if(DEBUG_MODE) e.printStackTrace(); + } + } + } break; + case "N": { + if (withThis.removeAllAmounts(false, dHadronDefinition.hadron_n1)){ + newStuff.putReplace(dHadronDefinition.hadron_n1); + try{ + newStuff.putReplace(new dAtomDefinition(withThis.toImmutable_unsafeMightLeaveExposedElementalTree()).getStackForm(1)); + decaysList.add(new cElementalDecay(decay.chance,newStuff.toImmutable_unsafeMightLeaveExposedElementalTree())); + return true; + }catch (Exception e){ + if(DEBUG_MODE) e.printStackTrace(); + } + } + } break; + case "2N": { + if (withThis.removeAllAmounts(false, dHadronDefinition.hadron_n2)){ + newStuff.putReplace(dHadronDefinition.hadron_n2); + try{ + newStuff.putReplace(new dAtomDefinition(withThis.toImmutable_unsafeMightLeaveExposedElementalTree()).getStackForm(1)); + decaysList.add(new cElementalDecay(decay.chance,newStuff.toImmutable_unsafeMightLeaveExposedElementalTree())); + return true; + }catch (Exception e){ + if(DEBUG_MODE) e.printStackTrace(); + } + } + } break; + case "P": { + if (withThis.removeAllAmounts(false, dHadronDefinition.hadron_p1)){ + newStuff.putReplace(dHadronDefinition.hadron_p1); + try{ + newStuff.putReplace(new dAtomDefinition(withThis.toImmutable_unsafeMightLeaveExposedElementalTree()).getStackForm(1)); + decaysList.add(new cElementalDecay(decay.chance,newStuff.toImmutable_unsafeMightLeaveExposedElementalTree())); + return true; + }catch (Exception e){ + if(DEBUG_MODE) e.printStackTrace(); + } + } + } break; + case "2P": { + if (withThis.removeAllAmounts(false, dHadronDefinition.hadron_p2)){ + newStuff.putReplace(dHadronDefinition.hadron_p2); + try{ + newStuff.putReplace(new dAtomDefinition(withThis.toImmutable_unsafeMightLeaveExposedElementalTree()).getStackForm(1)); + decaysList.add(new cElementalDecay(decay.chance,newStuff.toImmutable_unsafeMightLeaveExposedElementalTree())); + return true; + }catch (Exception e){ + if(DEBUG_MODE) e.printStackTrace(); + } + } + } break; + case "SF": + if(Fission(decaysList,withThis,newStuff,decay.chance,false)) return true; + case "B-F": { + if (withThis.removeAllAmounts(false, dHadronDefinition.hadron_n1)){ + withThis.putUnify(dHadronDefinition.hadron_p1); + newStuff.putReplace(eLeptonDefinition.lepton_e1); + newStuff.putReplace(eNeutrinoDefinition.lepton_Ve_1); + try{ + if(Fission(decaysList,withThis,newStuff,decay.chance,false)) return true; + }catch (Exception e){ + if(DEBUG_MODE) e.printStackTrace(); + } + } + } break; + case "ECF": case "ECSF": case "EC(+SF)": { + if (withThis.removeAllAmounts(false, dHadronDefinition.hadron_p1,eLeptonDefinition.lepton_e1)){ + withThis.putUnify(dHadronDefinition.hadron_n1); + newStuff.putReplace(eNeutrinoDefinition.lepton_Ve1); + try{ + if(Fission(decaysList,withThis,newStuff,decay.chance,false)) return true; + }catch (Exception e){ + if(DEBUG_MODE) e.printStackTrace(); + } + } + } break; + case "SF(+EC+B+)": case "SF+EC+B+": { + if (withThis.removeAllAmounts(false, dHadronDefinition.hadron_p2,eLeptonDefinition.lepton_e1)){ + withThis.putUnify(dHadronDefinition.hadron_n2); + newStuff.putReplace(eLeptonDefinition.lepton_e_1); + newStuff.putReplace(eNeutrinoDefinition.lepton_Ve2); + try{ + if(Fission(decaysList,withThis,newStuff,decay.chance,false)) return true; + }catch (Exception e){ + if(DEBUG_MODE) e.printStackTrace(); + } + } + } break; + case "SF+EC+B-": { + if (withThis.removeAllAmounts(false, eLeptonDefinition.lepton_e1)){ + newStuff.putReplace(eLeptonDefinition.lepton_e1); + newStuff.putReplace(eNeutrinoDefinition.lepton_Ve1); + newStuff.putReplace(eNeutrinoDefinition.lepton_Ve_1); + try{ + if(Fission(decaysList,withThis,newStuff,decay.chance,false)) return true; + }catch (Exception e){ + if(DEBUG_MODE) e.printStackTrace(); + } + } + } break; + case "IT": case "IT?": case "G": + decaysList.add(new cElementalDecay(decay.chance, this, eBosonDefinition.boson_Y__)); + return true; + case "IT+EC+B+": { + if (withThis.removeAllAmounts(false, dHadronDefinition.hadron_p2,eLeptonDefinition.lepton_e1)){ + withThis.putUnify(dHadronDefinition.hadron_n2); + newStuff.putReplace(eLeptonDefinition.lepton_e_1); + newStuff.putReplace(eNeutrinoDefinition.lepton_Ve2); + newStuff.putReplace(eBosonDefinition.boson_Y__1); + try{ + newStuff.putReplace(new dAtomDefinition(withThis.toImmutable_unsafeMightLeaveExposedElementalTree()).getStackForm(1)); + decaysList.add(new cElementalDecay(decay.chance,newStuff.toImmutable_unsafeMightLeaveExposedElementalTree())); + return true; + }catch (Exception e){ + if(DEBUG_MODE) e.printStackTrace(); + } + } + } break; + case "DEAD_END": + decaysList.add(deadEnd); + return true; + default: throw new Error("Unsupported decay mode: " + decay.decayName + " "+ neutralCount+" "+element); + } + if(DEBUG_MODE) TecTech.Logger.info("Failed to decay "+element+" "+neutralCount+" "+decay.decayName); + return false; + } + + private boolean Emmision(ArrayList<cElementalDecay> decaysList, cElementalDefinitionStack emit) { + final cElementalMutableDefinitionStackMap tree = elementalStacks.toMutable(); if (tree.removeAmount(false, emit)) { try { - return new cElementalDecay[]{ - new cElementalDecay(0.5f, this), - new cElementalDecay(0.5f, new cElementalDefinitionStack(new dAtomDefinition(tree.toImmutable()), 1), emit), - deadEnd - }; + decaysList.add(new cElementalDecay((float) 1, new cElementalDefinitionStack(new dAtomDefinition(tree.toImmutable_unsafeMightLeaveExposedElementalTree()), 1), emit)); + return true; } catch (Exception e) { if (DEBUG_MODE) e.printStackTrace(); } } - return getNaturalDecayInstant(); + return false; } - private cElementalDecay[] alphaDecay() { - final cElementalMutableDefinitionStackMap tree = new cElementalMutableDefinitionStackMap(elementalStacks.values()); - if (tree.removeAllAmounts(false, dHadronDefinition.hadron_n2, dHadronDefinition.hadron_p2)) { + private boolean alphaDecay(ArrayList<cElementalDecay> decaysList) { + final cElementalMutableDefinitionStackMap tree = elementalStacks.toMutable(); + if (tree.removeAllAmounts(false, alpha.definition.getSubParticles())) { try { - return new cElementalDecay[]{ - new cElementalDecay(0.5f, this), - new cElementalDecay(0.5f, new cElementalDefinitionStack(new dAtomDefinition(tree.toImmutable()), 1), alpha), - deadEnd - }; + decaysList.add(new cElementalDecay((float) 1, new cElementalDefinitionStack(new dAtomDefinition(tree.toImmutable_unsafeMightLeaveExposedElementalTree()), 1), alpha)); + return true; } catch (Exception e) { if (DEBUG_MODE) e.printStackTrace(); } } - return getNaturalDecayInstant(); + return false; } - private cElementalDecay[] MbetaDecay() { - final cElementalMutableDefinitionStackMap tree = new cElementalMutableDefinitionStackMap(elementalStacks.values()); + private boolean MbetaDecay(ArrayList<cElementalDecay> decaysList) { + final cElementalMutableDefinitionStackMap tree = elementalStacks.toMutable(); if (tree.removeAmount(false, dHadronDefinition.hadron_n1)) { try { tree.putUnify(dHadronDefinition.hadron_p1); - return new cElementalDecay[]{ - new cElementalDecay(0.5f, this), - new cElementalDecay(0.5f, new cElementalDefinitionStack(new dAtomDefinition(tree.toImmutable()), 1), eLeptonDefinition.lepton_e1, eNeutrinoDefinition.lepton_Ve_1), - deadEnd - }; + decaysList.add(new cElementalDecay((float) 1, new cElementalDefinitionStack(new dAtomDefinition(tree.toImmutable_unsafeMightLeaveExposedElementalTree()), 1), eLeptonDefinition.lepton_e1, eNeutrinoDefinition.lepton_Ve_1)); + return true; } catch (Exception e) { if (DEBUG_MODE) e.printStackTrace(); } } - return getNaturalDecayInstant(); + return false; } - private cElementalDecay[] PbetaDecay() { - final cElementalMutableDefinitionStackMap tree = new cElementalMutableDefinitionStackMap(elementalStacks.values()); + private boolean PbetaDecay(ArrayList<cElementalDecay> decaysList) { + final cElementalMutableDefinitionStackMap tree = elementalStacks.toMutable(); if (tree.removeAmount(false, dHadronDefinition.hadron_p1)) { try { tree.putUnify(dHadronDefinition.hadron_n1); - return new cElementalDecay[]{ - new cElementalDecay(0.5f, this), - new cElementalDecay(0.5f, new cElementalDefinitionStack(new dAtomDefinition(tree.toImmutable()), 1), eLeptonDefinition.lepton_e_1, eNeutrinoDefinition.lepton_Ve1), - deadEnd - }; + decaysList.add(new cElementalDecay((float) 1, new cElementalDefinitionStack(new dAtomDefinition(tree.toImmutable_unsafeMightLeaveExposedElementalTree()), 1), eLeptonDefinition.lepton_e_1, eNeutrinoDefinition.lepton_Ve1)); + return true; } catch (Exception e) { if (DEBUG_MODE) e.printStackTrace(); } } - return getNaturalDecayInstant(); + return false; } - private cElementalDecay[] ElectronCapture() { - final cElementalMutableDefinitionStackMap tree = new cElementalMutableDefinitionStackMap(elementalStacks.values()); - if (tree.removeAmount(false, eLeptonDefinition.lepton_e1) && tree.removeAmount(false, dHadronDefinition.hadron_p1)) { + private boolean ElectronCapture(ArrayList<cElementalDecay> decaysList) { + final cElementalMutableDefinitionStackMap tree = elementalStacks.toMutable(); + if (tree.removeAllAmounts(false, dHadronDefinition.hadron_p1,eLeptonDefinition.lepton_e1)) { try { tree.putUnify(dHadronDefinition.hadron_n1); - return new cElementalDecay[]{ - new cElementalDecay(0.5f, this), - new cElementalDecay(0.5f, new cElementalDefinitionStack(new dAtomDefinition(tree.toImmutable()), 1), eNeutrinoDefinition.lepton_Ve1), - deadEnd - }; + decaysList.add(new cElementalDecay((float) 1, new cElementalDefinitionStack(new dAtomDefinition(tree.toImmutable_unsafeMightLeaveExposedElementalTree()), 1), eNeutrinoDefinition.lepton_Ve1)); + return true; } catch (Exception e) { if (DEBUG_MODE) e.printStackTrace(); } } - return getNaturalDecayInstant(); + return false; } - private cElementalDecay[] Fission(boolean spontaneousCheck) { - final cElementalMutableDefinitionStackMap light = new cElementalMutableDefinitionStackMap(elementalStacks.values()); + private boolean Fission(ArrayList<cElementalDecay> decaysList, cElementalMutableDefinitionStackMap fissile, cElementalMutableDefinitionStackMap particles,float probability,boolean spontaneousCheck) { final cElementalMutableDefinitionStackMap heavy = new cElementalMutableDefinitionStackMap(); - final ArrayList<cElementalDefinitionStack> particles = new ArrayList<>(4); final double[] liquidDrop=liquidDropFunction(Math.abs(element)<=97); - for(cElementalDefinitionStack stack:light.values()){ + for(cElementalDefinitionStack stack: fissile.values()){ if(spontaneousCheck && stack.definition instanceof dHadronDefinition && (stack.amount<=80 || (stack.amount<90 && XSTR_INSTANCE.nextInt(10)<stack.amount-80))) - return getNaturalDecayInstant(); + return false; if(stack.definition.getCharge()==0){ //if(stack.definition instanceof dHadronDefinition){ double neutrals=stack.amount*liquidDrop[2]; int neutrals_cnt=(int)Math.floor(neutrals); neutrals_cnt+=neutrals-neutrals_cnt>XSTR_INSTANCE.nextDouble()?1:0; - particles.add(new cElementalDefinitionStack(stack.definition, neutrals_cnt)); + particles.putUnify(new cElementalDefinitionStack(stack.definition, neutrals_cnt)); int heavy_cnt=(int)Math.ceil(stack.amount*liquidDrop[1]); while(heavy_cnt+neutrals_cnt>stack.amount) heavy_cnt--; - light.removeAmount(false,new cElementalDefinitionStack(stack.definition,heavy_cnt+neutrals_cnt)); + fissile.removeAmount(false,new cElementalDefinitionStack(stack.definition,heavy_cnt+neutrals_cnt)); heavy.putReplace(new cElementalDefinitionStack(stack.definition, heavy_cnt)); //}else{ // particles.add(stack); @@ -450,23 +958,20 @@ public final class dAtomDefinition extends cElementalDefinition { if(heavy_cnt%2==1 && XSTR_INSTANCE.nextFloat()>0.05f) heavy_cnt--; cElementalDefinitionStack new_stack=new cElementalDefinitionStack(stack.definition, heavy_cnt); - light.removeAmount(false,new_stack); + fissile.removeAmount(false,new_stack); heavy.putReplace(new_stack); } } try { - particles.add(new cElementalDefinitionStack(new dAtomDefinition(light.toImmutable()),1)); - particles.add(new cElementalDefinitionStack(new dAtomDefinition(heavy.toImmutable()),1)); - return new cElementalDecay[]{ - new cElementalDecay(0.5f,this), - new cElementalDecay(0.5f, particles.toArray(new cElementalDefinitionStack[0])), - deadEnd - }; + particles.putReplace(new cElementalDefinitionStack(new dAtomDefinition(fissile.toImmutable_unsafeMightLeaveExposedElementalTree()),1)); + particles.putReplace(new cElementalDefinitionStack(new dAtomDefinition(heavy.toImmutable_unsafeMightLeaveExposedElementalTree()),1)); + decaysList.add(new cElementalDecay(probability, particles.toImmutable_unsafeMightLeaveExposedElementalTree())); + return true; } catch (Exception e) { - if (DEBUG_MODE) e.printStackTrace(); + if(DEBUG_MODE) e.printStackTrace(); } - return getNaturalDecayInstant(); + return false; } private static double[] liquidDropFunction(boolean asymmetric) { @@ -501,31 +1006,48 @@ public final class dAtomDefinition extends cElementalDefinition { } @Override - public cElementalDecay[] getEnergeticDecayInstant() { - //strip leptons - boolean doIt = true; - ArrayList<cElementalDefinitionStack> decaysInto = new ArrayList<cElementalDefinitionStack>(); - ArrayList<cElementalDefinitionStack> newAtom = new ArrayList<cElementalDefinitionStack>(); - for (cElementalDefinitionStack elementalStack : elementalStacks.values()) { - if (elementalStack.definition instanceof eLeptonDefinition && doIt) { - doIt = false; - if (elementalStack.amount > 1) - newAtom.add(new cElementalDefinitionStack(elementalStack.definition, elementalStack.amount - 1)); - decaysInto.add(new cElementalDefinitionStack(elementalStack.definition, 1)); - } else { - newAtom.add(elementalStack); + public cElementalDecay[] getEnergyInducedDecay(long energyLevel) { + if (iaeaDefinitionExistsAndHasEnergyLevels) { + ArrayList<cElementalDecay> decays=new ArrayList<>(4); + if(iaeaDecay(decays,energyLevel)){ + return decays.toArray(new cElementalDecay[decays.size()]); } } - try { - decaysInto.add(new cElementalDefinitionStack(new dAtomDefinition(newAtom.toArray(new cElementalDefinitionStack[newAtom.size()])), 1)); - return new cElementalDecay[]{new cElementalDecay(0.95F, decaysInto.toArray(new cElementalDefinitionStack[decaysInto.size()])), eBosonDefinition.deadEnd}; - } catch (tElementalException e) { - if (DEBUG_MODE) e.printStackTrace(); - for (cElementalDefinitionStack things : newAtom) { - decaysInto.add(things); + if(energyLevel< Math.abs(charge)/3+neutralCount) { + return new cElementalDecay[]{new cElementalDecay(1, this, eBosonDefinition.boson_Y__)}; + } + return getNaturalDecayInstant(); + } + + @Override + public float getEnergyDiffBetweenStates(long currentEnergyLevel,long newEnergyLevel) { + if(iaeaDefinitionExistsAndHasEnergyLevels){ + float result=0; + boolean backwards=newEnergyLevel<currentEnergyLevel; + if(backwards){ + long temp=currentEnergyLevel; + currentEnergyLevel=newEnergyLevel; + newEnergyLevel=temp; } - return new cElementalDecay[]{new cElementalDecay(0.75F, decaysInto.toArray(new cElementalDefinitionStack[decaysInto.size()])), eBosonDefinition.deadEnd}; + + if(currentEnergyLevel<=0){ + if(newEnergyLevel<=0) return DEFAULT_ENERGY_REQUIREMENT*(newEnergyLevel-currentEnergyLevel); + else result+=DEFAULT_ENERGY_REQUIREMENT*(-currentEnergyLevel); + }else result-=iaea.energeticStatesArray[(int)Math.min(iaea.energeticStatesArray.length-1,currentEnergyLevel)].energy; + if(newEnergyLevel>=iaea.energeticStatesArray.length){ + if(currentEnergyLevel>=iaea.energeticStatesArray.length) return DEFAULT_ENERGY_REQUIREMENT*(newEnergyLevel-currentEnergyLevel); + else result+=DEFAULT_ENERGY_REQUIREMENT*(newEnergyLevel-iaea.energeticStatesArray.length+1); + result+=iaea.energeticStatesArray[iaea.energeticStatesArray.length-1].energy; + }else result+=iaea.energeticStatesArray[(int)Math.max(0,newEnergyLevel)].energy; + + return backwards?-result:result; } + return DEFAULT_ENERGY_REQUIREMENT*(newEnergyLevel-currentEnergyLevel); + } + + @Override + public boolean usesSpecialEnergeticDecayHandling() { + return iaeaDefinitionExistsAndHasEnergyLevels; } @Override @@ -560,12 +1082,12 @@ public final class dAtomDefinition extends cElementalDefinition { //} @Override - public iElementalDefinition getAnti() { + public dAtomDefinition getAnti() { cElementalMutableDefinitionStackMap anti = new cElementalMutableDefinitionStackMap(); for (cElementalDefinitionStack stack : elementalStacks.values()) anti.putReplace(new cElementalDefinitionStack(stack.definition.getAnti(), stack.amount)); try { - return new dAtomDefinition(anti.toImmutable()); + return new dAtomDefinition(anti.toImmutable_unsafeMightLeaveExposedElementalTree()); } catch (tElementalException e) { if (DEBUG_MODE) e.printStackTrace(); return null; @@ -588,6 +1110,7 @@ public final class dAtomDefinition extends cElementalDefinition { } private final static class nomenclature { + private nomenclature(){} static final private String[] Symbol = new String[]{"Nt", "H", "He", "Li", "Be", "B", "C", "N", "O", "F", "Ne", "Na", "Mg", "Al", "Si", "P", "S", "Cl", "Ar", "K", "Ca", "Sc", "Ti", "V", "Cr", "Mn", "Fe", "Co", "Ni", "Cu", "Zn", "Ga", "Ge", "As", "Se", "Br", "Kr", "Rb", "Sr", "Y", "Zr", "Nb", "Mo", "Tc", "Ru", "Rh", "Pd", "Ag", "Cd", "In", "Sn", "Sb", "Te", "I", "Xe", "Cs", "Ba", "La", "Ce", "Pr", "Nd", "Pm", "Sm", "Eu", "Gd", "Tb", "Dy", "Ho", "Er", "Tm", "Yb", "Lu", "Hf", "Ta", "W", "Re", "Os", "Ir", "Pt", "Au", "Hg", "Tl", "Pb", "Bi", "Po", "At", "Rn", "Fr", "Ra", "Ac", "Th", "Pa", "U", "Np", "Pu", "Am", "Cm", "Bk", "Cf", "Es", "Fm", "Md", "No", "Lr", "Rf", "Db", "Sg", "Bh", "Hs", "Mt", "Ds", "Rg", "Cn", "Nh", "Fl", "Mc", "Lv", "Ts", "Og"}; static final private String[] Name = new String[]{"Neutronium", "Hydrogen", "Helium", "Lithium", "Beryllium", "Boron", "Carbon", "Nitrogen", "Oxygen", "Fluorine", "Neon", "Sodium", "Magnesium", "Aluminium", "Silicon", "Phosphorus", "Sulfur", "Chlorine", "Argon", "Potassium", "Calcium", "Scandium", "Titanium", "Vanadium", "Chromium", "Manganese", "Iron", "Cobalt", "Nickel", "Copper", "Zinc", "Gallium", "Germanium", "Arsenic", "Selenium", "Bromine", "Krypton", "Rubidium", "Strontium", "Yttrium", "Zirconium", "Niobium", "Molybdenum", "Technetium", "Ruthenium", "Rhodium", "Palladium", "Silver", "Cadmium", "Indium", "Tin", "Antimony", "Tellurium", "Iodine", "Xenon", "Caesium", "Barium", "Lanthanum", "Cerium", "Praseodymium", "Neodymium", "Promethium", "Samarium", "Europium", "Gadolinium", "Terbium", "Dysprosium", "Holmium", "Erbium", "Thulium", "Ytterbium", "Lutetium", "Hafnium", "Tantalum", "Tungsten", "Rhenium", "Osmium", "Iridium", "Platinum", "Gold", "Mercury", "Thallium", "Lead", "Bismuth", "Polonium", "Astatine", "Radon", "Francium", "Radium", "Actinium", "Thorium", "Protactinium", "Uranium", "Neptunium", "Plutonium", "Americium", "Curium", "Berkelium", "Californium", "Einsteinium", "Fermium", "Mendelevium", "Nobelium", "Lawrencium", "Rutherfordium", "Dubnium", "Seaborgium", "Bohrium", "Hassium", "Meitnerium", "Darmstadtium", "Roentgenium", "Copernicium", "Nihonium", "Flerovium", "Moscovium", "Livermorium", "Tennessine", "Oganesson"}; static final private String[] SymbolIUPAC = new String[]{"n", "u", "b", "t", "q", "p", "h", "s", "o", "e", "N", "U", "B", "T", "Q", "P", "H", "S", "O", "E"}; @@ -637,7 +1160,7 @@ public final class dAtomDefinition extends cElementalDefinition { final int izoDiffAbs = Math.abs(izoDiff); final float rawLifeTime = calculateLifeTime(izoDiff, izoDiffAbs, element, isotope, false); iaeaNuclide nuclide=iaeaNuclide.get(element,isotope); - if (rawLifeTime>= STABLE_RAW_LIFE_TIME || (nuclide!=null && nuclide.Thalf>=STABLE_RAW_LIFE_TIME)) { + if (rawLifeTime>= STABLE_RAW_LIFE_TIME || (nuclide!=null && nuclide.halfTime >=STABLE_RAW_LIFE_TIME)) { TreeSet<Integer> isotopes = stableIsotopes.get(element); if (isotopes == null) stableIsotopes.put(element, isotopes = new TreeSet<>()); isotopes.add(isotope); @@ -675,11 +1198,37 @@ public final class dAtomDefinition extends cElementalDefinition { if (DEBUG_MODE) TecTech.Logger.info("Added Unstable Atom:" + key + " " + mostStableUnstableIsotopes.get(key).lastEntry().getValue() + " " + unstableAtoms.get(key).getMass()); } - alpha = new cElementalDefinitionStack( - new dAtomDefinition( - new cElementalDefinitionStack(dHadronDefinition.hadron_p, 2), - new cElementalDefinitionStack(dHadronDefinition.hadron_n, 2)) - , 1); + deuterium=new dAtomDefinition( + dHadronDefinition.hadron_p1, + dHadronDefinition.hadron_n1, + eLeptonDefinition.lepton_e1).getStackForm(1); + tritium=new dAtomDefinition( + dHadronDefinition.hadron_p1, + dHadronDefinition.hadron_n2, + eLeptonDefinition.lepton_e1).getStackForm(1); + helium_3=new dAtomDefinition( + dHadronDefinition.hadron_p2, + dHadronDefinition.hadron_n1, + eLeptonDefinition.lepton_e2).getStackForm(1); + alpha = new dAtomDefinition( + dHadronDefinition.hadron_p2, + dHadronDefinition.hadron_n2).getStackForm(1); + beryllium_8=new dAtomDefinition( + new cElementalDefinitionStack(dHadronDefinition.hadron_p, 4), + new cElementalDefinitionStack(dHadronDefinition.hadron_n, 4), + new cElementalDefinitionStack(eLeptonDefinition.lepton_e, 4)).getStackForm(1); + carbon_14=new dAtomDefinition( + new cElementalDefinitionStack(dHadronDefinition.hadron_p, 6), + new cElementalDefinitionStack(dHadronDefinition.hadron_n, 8), + new cElementalDefinitionStack(eLeptonDefinition.lepton_e, 6)).getStackForm(1); + neon_24=new dAtomDefinition( + new cElementalDefinitionStack(dHadronDefinition.hadron_p, 10), + new cElementalDefinitionStack(dHadronDefinition.hadron_n, 14), + new cElementalDefinitionStack(eLeptonDefinition.lepton_e, 10)).getStackForm(1); + silicon_34=new dAtomDefinition( + new cElementalDefinitionStack(dHadronDefinition.hadron_p, 14), + new cElementalDefinitionStack(dHadronDefinition.hadron_n, 20), + new cElementalDefinitionStack(eLeptonDefinition.lepton_e, 14)).getStackForm(1); } catch (Exception e) { if (DEBUG_MODE) e.printStackTrace(); } @@ -797,36 +1346,13 @@ public final class dAtomDefinition extends cElementalDefinition { ////transformation.addOredict(new cElementalDefinitionStack(getBestUnstableIsotope(94),144), dust, Materials.Plutonium,1); transformation.addOredict(new cElementalDefinitionStack(getBestUnstableIsotope(95),144), dust, Materials.Americium,1); - /* ... */ - cElementalDefinitionStack neutrons=new cElementalDefinitionStack(dHadronDefinition.hadron_n, 100000); - transformation.oredictDequantization.put(neutrons.definition,new aOredictDequantizationInfo(neutrons, dust,Materials.Neutronium,1)); - bTransformationInfo.oredictQuantization.put( - OreDictionary.getOreID(OrePrefixes.ingotHot.name()+Materials.Neutronium.mName), - new aOredictQuantizationInfo(OrePrefixes.ingotHot,Materials.Neutronium,1 ,neutrons) - ); - try { dAtomDefinition temp; - temp=new dAtomDefinition( - eLeptonDefinition.lepton_e1, - dHadronDefinition.hadron_p1, - dHadronDefinition.hadron_n1 - ); - transformation.addFluid(new cElementalDefinitionStack(temp, 144),Materials.Deuterium.mGas.getID(), 144); + transformation.addFluid(new cElementalDefinitionStack(deuterium.definition, 144),Materials.Deuterium.mGas.getID(), 144); - temp=new dAtomDefinition( - eLeptonDefinition.lepton_e1, - dHadronDefinition.hadron_p1, - dHadronDefinition.hadron_n2 - ); - transformation.addFluid(new cElementalDefinitionStack(temp, 144),Materials.Tritium.mGas.getID(), 144); + transformation.addFluid(new cElementalDefinitionStack(tritium.definition, 144),Materials.Tritium.mGas.getID(), 144); - temp=new dAtomDefinition( - new cElementalDefinitionStack(eLeptonDefinition.lepton_e, 2), - dHadronDefinition.hadron_p2, - new cElementalDefinitionStack(dHadronDefinition.hadron_n, 3) - ); - transformation.addFluid(new cElementalDefinitionStack(temp, 144),Materials.Helium_3.mGas.getID(), 144); + transformation.addFluid(new cElementalDefinitionStack(helium_3.definition, 144),Materials.Helium_3.mGas.getID(), 144); temp=new dAtomDefinition( new cElementalDefinitionStack(eLeptonDefinition.lepton_e, 92), diff --git a/src/main/java/com/github/technus/tectech/elementalMatter/definitions/complex/dHadronDefinition.java b/src/main/java/com/github/technus/tectech/elementalMatter/definitions/complex/dHadronDefinition.java index d473abcb6d..f7bb9c7f5d 100644 --- a/src/main/java/com/github/technus/tectech/elementalMatter/definitions/complex/dHadronDefinition.java +++ b/src/main/java/com/github/technus/tectech/elementalMatter/definitions/complex/dHadronDefinition.java @@ -1,23 +1,28 @@ package com.github.technus.tectech.elementalMatter.definitions.complex; import com.github.technus.tectech.TecTech; +import com.github.technus.tectech.auxiliary.TecTechConfig; import com.github.technus.tectech.elementalMatter.core.cElementalDecay; import com.github.technus.tectech.elementalMatter.core.cElementalDefinitionStackMap; +import com.github.technus.tectech.elementalMatter.core.cElementalMutableDefinitionStackMap; import com.github.technus.tectech.elementalMatter.core.containers.cElementalDefinitionStack; import com.github.technus.tectech.elementalMatter.core.interfaces.iElementalDefinition; import com.github.technus.tectech.elementalMatter.core.tElementalException; import com.github.technus.tectech.elementalMatter.core.templates.cElementalDefinition; -import com.github.technus.tectech.elementalMatter.core.transformations.aFluidDequantizationInfo; -import com.github.technus.tectech.elementalMatter.core.transformations.aItemDequantizationInfo; -import com.github.technus.tectech.elementalMatter.core.transformations.aOredictDequantizationInfo; +import com.github.technus.tectech.elementalMatter.core.transformations.*; import com.github.technus.tectech.elementalMatter.definitions.primitive.eBosonDefinition; import com.github.technus.tectech.elementalMatter.definitions.primitive.eQuarkDefinition; +import gregtech.api.enums.Materials; +import gregtech.api.enums.OrePrefixes; import net.minecraft.nbt.NBTTagCompound; +import net.minecraftforge.oredict.OreDictionary; import java.util.ArrayList; import static com.github.technus.tectech.auxiliary.TecTechConfig.DEBUG_MODE; +import static com.github.technus.tectech.elementalMatter.definitions.complex.dAtomDefinition.transformation; import static com.github.technus.tectech.elementalMatter.definitions.primitive.eBosonDefinition.boson_Y__; +import static gregtech.api.enums.OrePrefixes.dust; /** * Created by danie_000 on 17.11.2016. @@ -28,7 +33,7 @@ public final class dHadronDefinition extends cElementalDefinition {//TODO Optimi private static final byte nbtType = (byte) 'h'; //Helpers public static dHadronDefinition hadron_p, hadron_n, hadron_p_, hadron_n_; - public static cElementalDefinitionStack hadron_p1, hadron_n1, hadron_p2, hadron_n2; + public static cElementalDefinitionStack hadron_p1, hadron_n1, hadron_p2, hadron_n2, hadron_p3, hadron_n3, hadron_p5; private static float protonMass = 0F; private static float neutronMass = 0F; @@ -106,13 +111,12 @@ public final class dHadronDefinition extends cElementalDefinition {//TODO Optimi //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 quarks : stacks.values()) { if (!(quarks.definition instanceof eQuarkDefinition)) return false; amount += quarks.amount; } - if (amount < 2 || amount > 12) return false; - return true; + return amount >= 2 && amount <= 12; } @Override @@ -164,11 +168,14 @@ public final class dHadronDefinition extends cElementalDefinition {//TODO Optimi @Override public cElementalDecay[] getNaturalDecayInstant() { + cElementalDefinitionStack[] quarkStacks = this.quarkStacks.values(); + if (amount == 2 && quarkStacks.length == 2 && quarkStacks[0].definition.getMass() == quarkStacks[1].definition.getMass() && quarkStacks[0].definition.getType() == -quarkStacks[1].definition.getType()) + return cElementalDecay.noProduct; ArrayList<cElementalDefinitionStack> decaysInto = new ArrayList<>(); - for (cElementalDefinitionStack quarkStack : quarkStacks.values()) { - if (quarkStack.definition.getType() == 1 || quarkStack.definition.getType() == -1) { + for (cElementalDefinitionStack quarks : quarkStacks) { + if (quarks.definition.getType() == 1 || quarks.definition.getType() == -1) { //covers both quarks and antiquarks - decaysInto.add(quarkStack); + decaysInto.add(quarks); } else { //covers both quarks and antiquarks decaysInto.add(new cElementalDefinitionStack(boson_Y__, 2)); @@ -181,18 +188,28 @@ public final class dHadronDefinition extends cElementalDefinition {//TODO Optimi } @Override - public cElementalDecay[] getEnergeticDecayInstant() { + public cElementalDecay[] getEnergyInducedDecay(long energyLevel) { cElementalDefinitionStack[] quarkStacks = this.quarkStacks.values(); if (amount == 2 && quarkStacks.length == 2 && quarkStacks[0].definition.getMass() == quarkStacks[1].definition.getMass() && quarkStacks[0].definition.getType() == -quarkStacks[1].definition.getType()) - return new cElementalDecay[]{eBosonDefinition.deadEnd}; + return cElementalDecay.noProduct; return new cElementalDecay[]{new cElementalDecay(0.75F, quarkStacks), eBosonDefinition.deadEnd}; //decay into quarks } @Override + public float getEnergyDiffBetweenStates(long currentEnergyLevel, long newEnergyLevel) { + return DEFAULT_ENERGY_REQUIREMENT*(newEnergyLevel-currentEnergyLevel); + } + + @Override + public boolean usesSpecialEnergeticDecayHandling() { + return false; + } + + @Override public cElementalDecay[] getDecayArray() { cElementalDefinitionStack[] quarkStacks = this.quarkStacks.values(); if (amount == 2 && quarkStacks.length == 2 && quarkStacks[0].definition.getMass() == quarkStacks[1].definition.getMass() && quarkStacks[0].definition.getType() == -quarkStacks[1].definition.getType()) - return new cElementalDecay[]{eBosonDefinition.deadEnd}; + return cElementalDecay.noProduct; else if (amount != 3) return new cElementalDecay[]{new cElementalDecay(0.95F, quarkStacks), eBosonDefinition.deadEnd}; //decay into quarks else { @@ -221,9 +238,9 @@ public final class dHadronDefinition extends cElementalDefinition {//TODO Optimi try { return new cElementalDecay[]{ - new cElementalDecay(0.98F, new dHadronDefinition(false, contentOfBaryon), Particles[0], Particles[1]), + new cElementalDecay(0.99F, new dHadronDefinition(false, contentOfBaryon), Particles[0], Particles[1]), new cElementalDecay(0.001F, new dHadronDefinition(false, contentOfBaryon), Particles[0], Particles[1], boson_Y__), - eBosonDefinition.deadEnd}; //decay into quarks + eBosonDefinition.deadEnd}; } catch (tElementalException e) { if (DEBUG_MODE) e.printStackTrace(); return new cElementalDecay[]{eBosonDefinition.deadEnd}; @@ -242,44 +259,49 @@ public final class dHadronDefinition extends cElementalDefinition {//TODO Optimi } @Override - public float getRawLifeTime() { + public float getRawTimeSpan(long currentEnergy) { return rawLifeTime; } @Override - public byte getType() { - return type; + public boolean isTimeSpanHalfLife() { + return true; } @Override - public iElementalDefinition getAnti() { - cElementalDefinitionStack[] stacks = this.quarkStacks.values(); - cElementalDefinitionStack[] antiElements = new cElementalDefinitionStack[stacks.length]; - for (int i = 0; i < antiElements.length; i++) { - antiElements[i] = new cElementalDefinitionStack(stacks[i].definition.getAnti(), stacks[i].amount); - } - try { - return new dHadronDefinition(false, antiElements); - } catch (tElementalException e) { - if (DEBUG_MODE) e.printStackTrace(); - return null; - } + public byte getType() { + return type; } //@Override //public iElementalDefinition getAnti() { - // cElementalMutableDefinitionStackMap anti = new cElementalMutableDefinitionStackMap(); - // for (cElementalDefinitionStack stack : quarkStacks.values()) - // anti.putReplace(new cElementalDefinitionStack(stack.definition.getAnti(), stack.amount)); + // cElementalDefinitionStack[] stacks = this.quarkStacks.values(); + // cElementalDefinitionStack[] antiElements = new cElementalDefinitionStack[stacks.length]; + // for (int i = 0; i < antiElements.length; i++) { + // antiElements[i] = new cElementalDefinitionStack(stacks[i].definition.getAnti(), stacks[i].amount); + // } // try { - // return new dHadronDefinition(anti.toImmutable()); + // return new dHadronDefinition(false, antiElements); // } catch (tElementalException e) { - // if (TecTechConfig.DEBUG_MODE) e.printStackTrace(); + // if (DEBUG_MODE) e.printStackTrace(); // return null; // } //} @Override + public iElementalDefinition getAnti() { + cElementalMutableDefinitionStackMap anti = new cElementalMutableDefinitionStackMap(); + for (cElementalDefinitionStack stack : quarkStacks.values()) + anti.putReplace(new cElementalDefinitionStack(stack.definition.getAnti(), stack.amount)); + try { + return new dHadronDefinition(anti.toImmutable_unsafeMightLeaveExposedElementalTree()); + } catch (tElementalException e) { + if (TecTechConfig.DEBUG_MODE) e.printStackTrace(); + return null; + } + } + + @Override public aFluidDequantizationInfo someAmountIntoFluidStack() { return null; } @@ -338,6 +360,9 @@ public final class dHadronDefinition extends cElementalDefinition {//TODO Optimi hadron_n1 = new cElementalDefinitionStack(hadron_n, 1); hadron_p2 = new cElementalDefinitionStack(hadron_p, 2); hadron_n2 = new cElementalDefinitionStack(hadron_n, 2); + hadron_p3 = new cElementalDefinitionStack(hadron_p, 3); + hadron_n3 = new cElementalDefinitionStack(hadron_n, 3); + hadron_p5 = new cElementalDefinitionStack(hadron_p, 5); try { cElementalDefinition.addCreatorFromNBT(nbtType, dHadronDefinition.class.getMethod("fromNBT", NBTTagCompound.class),(byte)-64); @@ -348,6 +373,16 @@ public final class dHadronDefinition extends cElementalDefinition {//TODO Optimi TecTech.Logger.info("Registered Elemental Matter Class: Hadron "+nbtType+" "+(-64)); } + public static void setTransformations(){ + //Added to atom map, but should be in its own + cElementalDefinitionStack neutrons=new cElementalDefinitionStack(dHadronDefinition.hadron_n, 100000); + transformation.oredictDequantization.put(neutrons.definition,new aOredictDequantizationInfo(neutrons, dust, Materials.Neutronium,1)); + bTransformationInfo.oredictQuantization.put( + OreDictionary.getOreID(OrePrefixes.ingotHot.name()+Materials.Neutronium.mName), + new aOredictQuantizationInfo(OrePrefixes.ingotHot,Materials.Neutronium,1 ,neutrons) + ); + } + @Override public byte getClassType() { return -64; diff --git a/src/main/java/com/github/technus/tectech/elementalMatter/definitions/complex/iaea/iaeaNuclide.java b/src/main/java/com/github/technus/tectech/elementalMatter/definitions/complex/iaea/iaeaNuclide.java index d9cdf8db4e..d08ec62256 100644 --- a/src/main/java/com/github/technus/tectech/elementalMatter/definitions/complex/iaea/iaeaNuclide.java +++ b/src/main/java/com/github/technus/tectech/elementalMatter/definitions/complex/iaea/iaeaNuclide.java @@ -12,6 +12,7 @@ import java.util.HashMap; import java.util.HashSet; import java.util.TreeMap; +import static com.github.technus.tectech.auxiliary.TecTechConfig.DEBUG_MODE; import static com.github.technus.tectech.elementalMatter.core.interfaces.iElementalDefinition.STABLE_RAW_LIFE_TIME; public final class iaeaNuclide { @@ -34,13 +35,13 @@ public final class iaeaNuclide { while((line=reader.readLine())!=null) { String[] split= Util.splitButDifferent(line,","); if(split.length!=19) throw new Error("Invalid count ("+split.length+") of separators in IAEA nuclides database " + line); - if(split[1].length()>0 && !blockOfData.isEmpty()) { + if(split[1].length()>0 && blockOfData.size()>0) { new iaeaNuclide(blockOfData.toArray(new String[0][])); blockOfData.clear(); } blockOfData.add(split); } - if(!blockOfData.isEmpty()) { + if(blockOfData.size()>0) { new iaeaNuclide(blockOfData.toArray(new String[0][])); blockOfData.clear(); } @@ -75,9 +76,8 @@ public final class iaeaNuclide { e.printStackTrace(); } - for(String s:decays){ - System.out.println(s); - } + for(iaeaNuclide nuclide:NUCLIDES.values()) + nuclide.makeArrayOfEnergyStates(); } public static iaeaNuclide get(int protons, int neutrons){ @@ -85,10 +85,11 @@ public final class iaeaNuclide { } public final short N,Z; - public final float Thalf;//sec + public final float halfTime;//sec public final float mass;//eV/c^2 public final short discovery;//year - public TreeMap<Float,energeticState> energeticStates; + private TreeMap<Float,energeticState> energeticStates; + public energeticState[] energeticStatesArray; private iaeaNuclide(String[][] rows){ @@ -104,36 +105,34 @@ public final class iaeaNuclide { discovery=(short)doubleOrNaN(rows[0][18],"discovery"); if(rows[0][3].contains("STABLE")){ - Thalf= STABLE_RAW_LIFE_TIME; + halfTime = STABLE_RAW_LIFE_TIME; }else{ parts = Util.splitButDifferent(rows[0][4], "|"); - Thalf = (float)doubleOrNaN(parts[0],"half life"); - //if(Thalf>STABLE_RAW_LIFE_TIME) System.out.println("KEK KEK"+N+" "+Z+" "+Thalf); + halfTime = (float)doubleOrNaN(parts[0],"half life"); } + } - for(int i=0;i<rows.length;i++){ - add(rows[i][5]); + private void getMoreData(String[] cells){ + if(DEBUG_MODE) { + if (add(cells[14])) System.out.println(N + " " + Z); + if (add(cells[17])) System.out.println(N + " " + Z); + if (add(cells[20])) System.out.println(N + " " + Z); } - - - //for(String[] S:rows) { - // for(String s:S)System.out.print(s+" "); - // System.out.println(); - //} - //System.out.println("KEKEKEK"); + new energeticState(this, halfTime,getDecaysFixed(cells[14],doubleOrNaN(cells[15],"chance1"),cells[17],doubleOrNaN(cells[18],"chance1"),cells[20],doubleOrNaN(cells[21],"chance1"))); } - private void getMoreData(String[] cells){ - add(cells[14]); - add(cells[17]); - add(cells[20]); + private static final energeticState[] empty=new energeticState[0]; + private void makeArrayOfEnergyStates(){ + if(energeticStates==null || energeticStates.size()==0)energeticStatesArray=empty; + else energeticStatesArray=energeticStates.values().toArray(new energeticState[energeticStates.size()]); } private double doubleOrNaN(String s, String name){ s=s.replaceAll("#",""); if(s.length()>0) { try { - return Double.parseDouble(s); + double value=Double.parseDouble(s); + return value != 0 ?value:Float.NaN; } catch (Exception e) { System.out.println("Invalid Value " + name + " " + N + " " + Z + " " + s); e.printStackTrace(); @@ -145,9 +144,9 @@ public final class iaeaNuclide { public static class energeticState{ public final float energy; public final float Thalf; - public TreeMap<Float,String> decaymodes; + public final iaeaDecay[] decaymodes; - private energeticState(iaeaNuclide nuclide,float Thalf,TreeMap<Float,String> decaymodes){ + private energeticState(iaeaNuclide nuclide,float Thalf,iaeaDecay[] decaymodes){ energy=0; this.Thalf=Thalf; this.decaymodes=decaymodes; @@ -160,15 +159,20 @@ public final class iaeaNuclide { iaeaNuclide nuclide=get((int)doubleOrNaN(cells[0],"protons"),(int)doubleOrNaN(cells[1],"neutrons")); if(nuclide==null) throw new Error("Missing nuclide "+(int)doubleOrNaN(cells[0],"protons")+" "+(int)doubleOrNaN(cells[1],"neutrons")); - this.energy=(float) (doubleOrNaN(cells[3],"energy level",nuclide)*1000);//to eV + this.energy=(float) (doubleOrNaN(cells[3],"energy level",nuclide)*1000f);//to eV + if(energy<0) throw new Error("Invalid energy "+ nuclide.N +" "+nuclide.Z+ " "+cells[3]); this.Thalf=(float) doubleOrNaN(cells[10],"half life",nuclide); - if(nuclide.energeticStates==null) - nuclide.energeticStates=new TreeMap<>(); + if(nuclide.energeticStates==null) { + new Exception("Should be initialized before doing this... "+ nuclide.N +" "+nuclide.Z).printStackTrace(); + nuclide.energeticStates = new TreeMap<>(); + } nuclide.energeticStates.put(energy,this); - - add(cells[12]); - add(cells[15]); - add(cells[18]); + if(DEBUG_MODE) { + if (add(cells[12])) System.out.println(nuclide.N + " " + nuclide.Z); + if (add(cells[15])) System.out.println(nuclide.N + " " + nuclide.Z); + if (add(cells[18])) System.out.println(nuclide.N + " " + nuclide.Z); + } + this.decaymodes=getDecaysFixed(cells[12],doubleOrNaN(cells[13],"chance 1",nuclide),cells[15],doubleOrNaN(cells[16],"chance 2",nuclide),cells[18],doubleOrNaN(cells[19],"chance 3",nuclide)); } private double doubleOrNaN(String s, String name){ @@ -194,18 +198,33 @@ public final class iaeaNuclide { } private static HashSet<String> decays=new HashSet<>(); - private static void add(String s){ - int len=decays.size(); - decays.add(s); - if(decays.size()>len){ + private static boolean add(String s){ + if(decays.add(s)){ System.out.println(s); + return true; } + return false; } - public enum decayType{ - ; - public final String name; - decayType(String name){ - this.name=name; + + private static iaeaDecay[] getDecaysFixed(String decay1, double chance1,String decay2, double chance2,String decay3, double chance3){ + TreeMap<Double,iaeaDecay> decays=new TreeMap<>(); + if(decay1.length()>0) + decays.put(chance1/100D,new iaeaDecay((float)(chance1/100D),decay1)); + if(decay2.length()>0) + decays.put(chance2/100D,new iaeaDecay((float)(chance2/100D),decay3)); + if(decay3.length()>0) + decays.put(chance3/100D,new iaeaDecay((float)(chance3/100D),decay3)); + decays.put(1D,iaeaDecay.DEAD_END); + return decays.values().toArray(new iaeaDecay[decays.size()]); + } + + public static class iaeaDecay{ + public final float chance; + public final String decayName; + public static final iaeaDecay DEAD_END=new iaeaDecay(1f,"DEAD_END"); + private iaeaDecay(float chance,String decayName){ + this.chance=chance; + this.decayName=decayName; } } } diff --git a/src/main/java/com/github/technus/tectech/elementalMatter/definitions/primitive/cPrimitiveDefinition.java b/src/main/java/com/github/technus/tectech/elementalMatter/definitions/primitive/cPrimitiveDefinition.java index cef87b5a39..1a4582386b 100644 --- a/src/main/java/com/github/technus/tectech/elementalMatter/definitions/primitive/cPrimitiveDefinition.java +++ b/src/main/java/com/github/technus/tectech/elementalMatter/definitions/primitive/cPrimitiveDefinition.java @@ -3,7 +3,6 @@ package com.github.technus.tectech.elementalMatter.definitions.primitive; import com.github.technus.tectech.elementalMatter.core.templates.cElementalPrimitive; import static com.github.technus.tectech.elementalMatter.core.cElementalDecay.noDecay; -import static com.github.technus.tectech.elementalMatter.core.cElementalDecay.noProduct; /** * Created by danie_000 on 22.10.2016. @@ -21,15 +20,20 @@ public final class cPrimitiveDefinition extends cElementalPrimitive { } public static void run() { - nbtE__.init(null__, -1F, -1, -1, noDecay); - null__.init(null__, -1F, -1, -1, noProduct); - space__.init(space__, -1F, -1, -1, noProduct); - magic.init(magic_, -1F, -1, -1, noDecay); - magic_.init(magic, -1F, -1, -1, noDecay); + nbtE__.init(null__, NO_DECAY_RAW_LIFE_TIME, -1, -1, noDecay); + null__.init(null__, NO_DECAY_RAW_LIFE_TIME, -1, -1, noDecay); + space__.init(space__, NO_DECAY_RAW_LIFE_TIME, -1, -1, noDecay); + magic.init(magic_, NO_DECAY_RAW_LIFE_TIME, -1, -1, noDecay); + magic_.init(magic, NO_DECAY_RAW_LIFE_TIME, -1, -1, noDecay); } @Override public String getName() { return "Primitive: " + name; } + + @Override + public boolean isTimeSpanHalfLife() { + return false; + } }
\ No newline at end of file diff --git a/src/main/java/com/github/technus/tectech/elementalMatter/definitions/primitive/eBosonDefinition.java b/src/main/java/com/github/technus/tectech/elementalMatter/definitions/primitive/eBosonDefinition.java index d52d5505c1..3b9ecc8433 100644 --- a/src/main/java/com/github/technus/tectech/elementalMatter/definitions/primitive/eBosonDefinition.java +++ b/src/main/java/com/github/technus/tectech/elementalMatter/definitions/primitive/eBosonDefinition.java @@ -14,15 +14,14 @@ public final class eBosonDefinition extends cElementalPrimitive { //deadEnd public static final cElementalDecay deadEnd = new cElementalDecay(boson_Y__, boson_Y__); public static final cElementalDecay deadEndHalf = new cElementalDecay(boson_Y__); + public static final cElementalDefinitionStack boson_Y__1=new cElementalDefinitionStack(boson_Y__,1); private eBosonDefinition(String name, String symbol, int type, float mass, int charge, int color, int ID) { super(name, symbol, type, mass, charge, color, ID); } public static void run() { - boson_Y__.init(null, -1F, 0, 1, - new cElementalDecay(boson_Y__), - deadEnd); + boson_Y__.init(null, NO_DECAY_RAW_LIFE_TIME, -1, -1, cElementalDecay.noDecay); boson_H__.init(null, 1.56e-22F, 0, 0, new cElementalDecay(0.96F, new cElementalDefinitionStack(boson_Y__, 4)), new cElementalDecay(0.02F, eLeptonDefinition.lepton_t, eLeptonDefinition.lepton_t_), @@ -34,4 +33,9 @@ public final class eBosonDefinition extends cElementalPrimitive { public String getName() { return "Boson: " + name; } + + @Override + public boolean isTimeSpanHalfLife() { + return false; + } } diff --git a/src/main/java/com/github/technus/tectech/elementalMatter/definitions/primitive/eLeptonDefinition.java b/src/main/java/com/github/technus/tectech/elementalMatter/definitions/primitive/eLeptonDefinition.java index 4d66a7cae2..2f13fae24f 100644 --- a/src/main/java/com/github/technus/tectech/elementalMatter/definitions/primitive/eLeptonDefinition.java +++ b/src/main/java/com/github/technus/tectech/elementalMatter/definitions/primitive/eLeptonDefinition.java @@ -17,7 +17,9 @@ public final class eLeptonDefinition extends cElementalPrimitive { lepton_t_ = new eLeptonDefinition("Antitauon", "\u03c4+", -3, 1776.83e6F, 3, -1, 20); public static final cElementalDefinitionStack lepton_e1 = new cElementalDefinitionStack(lepton_e, 1); + public static final cElementalDefinitionStack lepton_e2 = new cElementalDefinitionStack(lepton_e, 2); public static final cElementalDefinitionStack lepton_e_1 = new cElementalDefinitionStack(lepton_e_, 1); + public static final cElementalDefinitionStack lepton_e_2 = new cElementalDefinitionStack(lepton_e_, 2); private eLeptonDefinition(String name, String symbol, int type, float mass, int charge, int color, int ID) { super(name, symbol, type, mass, charge, color, ID); @@ -26,9 +28,7 @@ public final class eLeptonDefinition extends cElementalPrimitive { } public static void run() { - lepton_e.init(lepton_e_, 100000F, 2, 3, - new cElementalDecay(0.9F, lepton_e), - new cElementalDecay(0.05F, nothing), + lepton_e.init(lepton_e_, STABLE_RAW_LIFE_TIME, 0, 1, eBosonDefinition.deadEnd,//makes photons and don't care new cElementalDecay(lepton_e, eBosonDefinition.boson_Y__)); lepton_m.init(lepton_m_, 2.197019e-6F, 0, 1, @@ -40,15 +40,13 @@ public final class eLeptonDefinition extends cElementalPrimitive { new cElementalDecay(0.05F, lepton_m, eNeutrinoDefinition.lepton_Vm_, eNeutrinoDefinition.lepton_Vt, eBosonDefinition.boson_H__), eBosonDefinition.deadEnd);//makes photons and don't care - lepton_e_.init(lepton_e, 100000F, 2, 3, - new cElementalDecay(0.9F, lepton_e_), - new cElementalDecay(0.05F, nothing), + lepton_e_.init(lepton_e, STABLE_RAW_LIFE_TIME, 0, 1, eBosonDefinition.deadEnd,//makes photons and don't care new cElementalDecay(lepton_e_, eBosonDefinition.boson_Y__)); - lepton_m_.init(lepton_m, 2.197e-6F, 0, 1, + lepton_m_.init(lepton_m, 2.197019e-6F, 0, 1, new cElementalDecay(0.9F, lepton_e_, eNeutrinoDefinition.lepton_Ve, eNeutrinoDefinition.lepton_Vm_), eBosonDefinition.deadEnd);//makes photons and don't care - lepton_t_.init(lepton_t, 2.9e-13F, 1, 3, + lepton_t_.init(lepton_t, 2.906e-13F, 1, 3, new cElementalDecay(0.8F, lepton_m_, eNeutrinoDefinition.lepton_Vm, eNeutrinoDefinition.lepton_Vt_, eBosonDefinition.boson_Y__), new cElementalDecay(0.1F, lepton_e_, eNeutrinoDefinition.lepton_Ve, eNeutrinoDefinition.lepton_Vm_), new cElementalDecay(0.05F, lepton_m_, eNeutrinoDefinition.lepton_Vm, eNeutrinoDefinition.lepton_Vt_, eBosonDefinition.boson_H__), @@ -59,4 +57,9 @@ public final class eLeptonDefinition extends cElementalPrimitive { public String getName() { return "Lepton: " + name; } + + @Override + public boolean isTimeSpanHalfLife() { + return true; + } } diff --git a/src/main/java/com/github/technus/tectech/elementalMatter/definitions/primitive/eNeutrinoDefinition.java b/src/main/java/com/github/technus/tectech/elementalMatter/definitions/primitive/eNeutrinoDefinition.java index df9b081e9b..673dba7b77 100644 --- a/src/main/java/com/github/technus/tectech/elementalMatter/definitions/primitive/eNeutrinoDefinition.java +++ b/src/main/java/com/github/technus/tectech/elementalMatter/definitions/primitive/eNeutrinoDefinition.java @@ -17,42 +17,41 @@ public final class eNeutrinoDefinition extends cElementalPrimitive { lepton_Vt_ = new eNeutrinoDefinition("Antitauon neutrino", "~\u03bd\u03c4", -3, 15e6F, 0, -1, 26); public static final cElementalDefinitionStack lepton_Ve1 = new cElementalDefinitionStack(lepton_Ve, 1); + public static final cElementalDefinitionStack lepton_Ve2 = new cElementalDefinitionStack(lepton_Ve, 2); public static final cElementalDefinitionStack lepton_Ve_1 = new cElementalDefinitionStack(lepton_Ve_, 1); + public static final cElementalDefinitionStack lepton_Ve_2 = new cElementalDefinitionStack(lepton_Ve_, 2); private eNeutrinoDefinition(String name, String symbol, int type, float mass, int charge, int color, int ID) { super(name, symbol, type, mass, charge, color, ID); } public static void run() { - lepton_Ve.init(lepton_Ve_, 1F, 1, 0, - new cElementalDecay(0.95F, nothing), - new cElementalDecay(0.1F, lepton_Ve), - eBosonDefinition.deadEndHalf); + lepton_Ve.init(lepton_Ve_, 1F, 0, 0, + cElementalDecay.noProduct); lepton_Vm.init(lepton_Vm_, 1F, 1, 0, - new cElementalDecay(0.9F, nothing), - new cElementalDecay(0.1F, lepton_Vm), + new cElementalDecay(0.825F, nothing), eBosonDefinition.deadEndHalf); lepton_Vt.init(lepton_Vt_, 1F, 1, 0, - new cElementalDecay(0.85F, nothing), - new cElementalDecay(0.1F, lepton_Vt), - eBosonDefinition.deadEndHalf); + new cElementalDecay(0.75F, nothing), + eBosonDefinition.deadEnd); - lepton_Ve_.init(lepton_Ve, 1F, 1, 0, - new cElementalDecay(0.95F, nothing), - new cElementalDecay(0.1F, lepton_Ve_), - eBosonDefinition.deadEndHalf); + lepton_Ve_.init(lepton_Ve, 1F, 0, 0, + cElementalDecay.noProduct); lepton_Vm_.init(lepton_Vm, 1F, 1, 0, - new cElementalDecay(0.9F, nothing), - new cElementalDecay(0.1F, lepton_Vm_), + new cElementalDecay(0.825F, nothing), eBosonDefinition.deadEndHalf); lepton_Vt_.init(lepton_Vt, 1F, 1, 0, - new cElementalDecay(0.85F, nothing), - new cElementalDecay(0.1F, lepton_Vt_), - eBosonDefinition.deadEndHalf); + new cElementalDecay(0.75F, nothing), + eBosonDefinition.deadEnd); } @Override public String getName() { return "Lepton: " + name; } + + @Override + public boolean isTimeSpanHalfLife() { + return true; + } } diff --git a/src/main/java/com/github/technus/tectech/elementalMatter/definitions/primitive/eQuarkDefinition.java b/src/main/java/com/github/technus/tectech/elementalMatter/definitions/primitive/eQuarkDefinition.java index a8662f7338..3abf04464f 100644 --- a/src/main/java/com/github/technus/tectech/elementalMatter/definitions/primitive/eQuarkDefinition.java +++ b/src/main/java/com/github/technus/tectech/elementalMatter/definitions/primitive/eQuarkDefinition.java @@ -26,7 +26,7 @@ public final class eQuarkDefinition extends cElementalPrimitive { } public static void run() { - quark_u.init(quark_u_, 1e35F, 3, -1, + quark_u.init(quark_u_, STABLE_RAW_LIFE_TIME, 3, -1, new cElementalDecay(0.9F, quark_d, eLeptonDefinition.lepton_e_, eNeutrinoDefinition.lepton_Ve), new cElementalDecay(0.050778116F, quark_s/*,lepton_m_,lepton_Vm*/), new cElementalDecay(1.23201e-5F, quark_b/*,lepton_t_,lepton_Vt*/), @@ -42,7 +42,7 @@ public final class eQuarkDefinition extends cElementalPrimitive { new cElementalDecay(7.51689e-5F, quark_d, eLeptonDefinition.lepton_t_, eNeutrinoDefinition.lepton_Vt), eBosonDefinition.deadEnd);//makes photons and don't care - quark_d.init(quark_d_, 1e35F, 3, -1, + quark_d.init(quark_d_, STABLE_RAW_LIFE_TIME, 3, -1, new cElementalDecay(0.9F, quark_u, eLeptonDefinition.lepton_e, eNeutrinoDefinition.lepton_Ve_), new cElementalDecay(0.05071504F, quark_c/*,lepton_m,lepton_Vm_*/), new cElementalDecay(7.51689e-5F, quark_t/*,lepton_t,lepton_Vt_*/), @@ -58,7 +58,7 @@ public final class eQuarkDefinition extends cElementalPrimitive { new cElementalDecay(1.23201e-5F, quark_u, eLeptonDefinition.lepton_t, eNeutrinoDefinition.lepton_Vt_), eBosonDefinition.deadEnd);//makes photons and don't care - quark_u_.init(quark_u, 88, 3, -1, + quark_u_.init(quark_u, STABLE_RAW_LIFE_TIME, 3, -1, new cElementalDecay(0.9F, quark_d_, eLeptonDefinition.lepton_e, eNeutrinoDefinition.lepton_Ve_), new cElementalDecay(0.050778116F, quark_s_/*,lepton_m,lepton_Vm_*/), new cElementalDecay(1.23201e-5F, quark_b_/*,lepton_t,lepton_Vt_*/), @@ -74,7 +74,7 @@ public final class eQuarkDefinition extends cElementalPrimitive { new cElementalDecay(7.51689e-5F, quark_d_, eLeptonDefinition.lepton_t, eNeutrinoDefinition.lepton_Vt_), eBosonDefinition.deadEnd);//makes photons and don't care - quark_d_.init(quark_d, 44F, 3, -1, + quark_d_.init(quark_d, STABLE_RAW_LIFE_TIME, 3, -1, new cElementalDecay(0.9F, quark_u_, eLeptonDefinition.lepton_e_, eNeutrinoDefinition.lepton_Ve), new cElementalDecay(0.05071504F, quark_c_/*,lepton_m_,lepton_Vm*/), new cElementalDecay(7.51689e-5F, quark_t_/*,lepton_t_,lepton_Vt*/), @@ -95,4 +95,9 @@ public final class eQuarkDefinition extends cElementalPrimitive { public String getName() { return "Quark: " + name; } + + @Override + public boolean isTimeSpanHalfLife() { + return true; + } } diff --git a/src/main/java/com/github/technus/tectech/loader/RecipeLoader.java b/src/main/java/com/github/technus/tectech/loader/RecipeLoader.java index 601552e33e..f4883b10db 100644 --- a/src/main/java/com/github/technus/tectech/loader/RecipeLoader.java +++ b/src/main/java/com/github/technus/tectech/loader/RecipeLoader.java @@ -2,6 +2,7 @@ package com.github.technus.tectech.loader; import com.github.technus.tectech.compatibility.dreamcraft.DreamCraftRecipeLoader; import com.github.technus.tectech.elementalMatter.definitions.complex.dAtomDefinition; +import com.github.technus.tectech.elementalMatter.definitions.complex.dHadronDefinition; import com.github.technus.tectech.thing.casing.TT_Container_Casings; import cpw.mods.fml.common.Loader; import gregtech.api.enums.Materials; @@ -18,6 +19,7 @@ import static gregtech.api.enums.GT_Values.RA; public class RecipeLoader implements Runnable { public void run() { dAtomDefinition.setTransformation(); + dHadronDefinition.setTransformations(); // =================================================================================================== // Recipes init - common goes here rest goes into methods below diff --git a/src/main/java/com/github/technus/tectech/thing/metaTileEntity/hatch/GT_MetaTileEntity_Hatch_ElementalContainer.java b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/hatch/GT_MetaTileEntity_Hatch_ElementalContainer.java index 66929ad77a..a469872047 100644 --- a/src/main/java/com/github/technus/tectech/thing/metaTileEntity/hatch/GT_MetaTileEntity_Hatch_ElementalContainer.java +++ b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/hatch/GT_MetaTileEntity_Hatch_ElementalContainer.java @@ -108,7 +108,7 @@ public abstract class GT_MetaTileEntity_Hatch_ElementalContainer extends GT_Meta byte Tick = (byte) (aTick % 20); if (DECAY_AT == Tick) { purgeOverflow(); - content.tickContent(postEnergize);//Hatches don't life time mult things + content.tickContentByOneSecond(1,postEnergize);//Hatches don't life time mult things purgeOverflow(); } else if (OVERFLOW_AT == Tick) { if (overflowMatter <= 0) { diff --git a/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/GT_MetaTileEntity_EM_decay.java b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/GT_MetaTileEntity_EM_decay.java index 9395d5de37..f00f182de1 100644 --- a/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/GT_MetaTileEntity_EM_decay.java +++ b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/GT_MetaTileEntity_EM_decay.java @@ -128,7 +128,7 @@ public class GT_MetaTileEntity_EM_decay extends GT_MetaTileEntity_MultiblockBase mMaxProgresstime = 1;//(int)m3; mEfficiencyIncrease = 10000; m1 = input.getMass()/input.amount; - cElementalInstanceStackMap decayed=input.decayCompute(input.getDefinition().getDecayArray(),1,0,0); + cElementalInstanceStackMap decayed=input.decay(); m2 = decayed.getMass()/input.amount; //TecTech.Logger.info("I " + input.toString()); //TecTech.Logger.info("O " + decayed.toString()); diff --git a/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/GT_MetaTileEntity_EM_dequantizer.java b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/GT_MetaTileEntity_EM_dequantizer.java index 04d2cea363..92ff23b6bb 100644 --- a/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/GT_MetaTileEntity_EM_dequantizer.java +++ b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/GT_MetaTileEntity_EM_dequantizer.java @@ -21,6 +21,7 @@ import java.util.ArrayList; import static com.github.technus.tectech.Util.StructureBuilder; import static com.github.technus.tectech.Util.V; +import static com.github.technus.tectech.elementalMatter.core.interfaces.iElementalDefinition.STABLE_RAW_LIFE_TIME; import static com.github.technus.tectech.elementalMatter.definitions.complex.dAtomDefinition.refMass; import static com.github.technus.tectech.elementalMatter.definitions.complex.dAtomDefinition.refUnstableMass; import static com.github.technus.tectech.thing.casing.GT_Block_CasingsTT.textureOffset; @@ -89,7 +90,7 @@ public class GT_MetaTileEntity_EM_dequantizer extends GT_MetaTileEntity_Multiblo if (info != null) { if (map.removeAllAmounts(false, (iHasElementalDefinition) info.input())) { mOutputFluids = new FluidStack[]{(FluidStack) info.output()}; - startRecipe((iHasElementalDefinition) info.input()); + startRecipe((iHasElementalDefinition) info.input(),stack.getEnergy()); return true; } } @@ -98,7 +99,7 @@ public class GT_MetaTileEntity_EM_dequantizer extends GT_MetaTileEntity_Multiblo if (info != null) { if (map.removeAllAmounts(false, (iHasElementalDefinition) info.input())) { mOutputItems = new ItemStack[]{(ItemStack) info.output()}; - startRecipe((iHasElementalDefinition) info.input()); + startRecipe((iHasElementalDefinition) info.input(),stack.getEnergy()); return true; } } @@ -109,7 +110,7 @@ public class GT_MetaTileEntity_EM_dequantizer extends GT_MetaTileEntity_Multiblo ArrayList<ItemStack> items = OreDictionary.getOres(((aOredictDequantizationInfo) info).out); if (items != null && items.size() > 0) { mOutputItems = new ItemStack[]{items.get(0)}; - startRecipe((iHasElementalDefinition) info.input()); + startRecipe((iHasElementalDefinition) info.input(),stack.getEnergy()); return true; } } @@ -121,13 +122,13 @@ public class GT_MetaTileEntity_EM_dequantizer extends GT_MetaTileEntity_Multiblo return false; } - private void startRecipe(iHasElementalDefinition from) { + private void startRecipe(iHasElementalDefinition from, long energy) { mMaxProgresstime = 20; mEfficiencyIncrease = 10000; float mass = from.getMass(); float euMult = mass / refMass; eAmpereFlow = (int) Math.ceil(euMult); - if (mass > refUnstableMass || from.getDefinition().getRawLifeTime() < 1.5e25f) { + if (mass > refUnstableMass || from.getDefinition().getRawTimeSpan(energy) < STABLE_RAW_LIFE_TIME) { mEUt = (int) -V[10]; } else { mEUt = (int) -V[8]; diff --git a/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/GT_MetaTileEntity_EM_quantizer.java b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/GT_MetaTileEntity_EM_quantizer.java index f245e63ff5..4ebbc9438b 100644 --- a/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/GT_MetaTileEntity_EM_quantizer.java +++ b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/GT_MetaTileEntity_EM_quantizer.java @@ -22,6 +22,7 @@ import net.minecraftforge.oredict.OreDictionary; import static com.github.technus.tectech.Util.*; import static com.github.technus.tectech.auxiliary.TecTechConfig.DEBUG_MODE; +import static com.github.technus.tectech.elementalMatter.core.interfaces.iElementalDefinition.DEFAULT_ENERGY_LEVEL; import static com.github.technus.tectech.elementalMatter.definitions.complex.dAtomDefinition.refMass; import static com.github.technus.tectech.elementalMatter.definitions.complex.dAtomDefinition.refUnstableMass; import static com.github.technus.tectech.thing.casing.GT_Block_CasingsTT.textureOffset; @@ -153,7 +154,7 @@ public class GT_MetaTileEntity_EM_quantizer extends GT_MetaTileEntity_Multiblock float mass = into.getMass(); float euMult = mass / refMass; eAmpereFlow = (int) Math.ceil(euMult); - if (mass > refUnstableMass || into.getDefinition().getRawLifeTime() < 1.5e25f) { + if (mass > refUnstableMass || into.getDefinition().getRawTimeSpan(DEFAULT_ENERGY_LEVEL) < 1.5e25f) { mEUt = (int) -V[10]; } else { mEUt = (int) -V[8]; diff --git a/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/GT_MetaTileEntity_EM_research.java b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/GT_MetaTileEntity_EM_research.java index e31626910a..6ee2e7f88f 100644 --- a/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/GT_MetaTileEntity_EM_research.java +++ b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/GT_MetaTileEntity_EM_research.java @@ -179,7 +179,7 @@ public class GT_MetaTileEntity_EM_research extends GT_MetaTileEntity_MultiblockB public boolean checkRecipe_EM(ItemStack itemStack) { tRecipe=null; aRecipe=null; - if(!eHolders.isEmpty() && eHolders.get(0).mInventory[0]!=null) { + if(eHolders.size()>0 && eHolders.get(0).mInventory[0]!=null) { holdItem = eHolders.get(0).mInventory[0].copy(); if(ItemList.Tool_DataStick.isStackEqual(itemStack, false, true)) { for (GT_Recipe.GT_Recipe_AssemblyLine assRecipe : GT_Recipe.GT_Recipe_AssemblyLine.sAssemblylineRecipes) { @@ -265,7 +265,7 @@ public class GT_MetaTileEntity_EM_research extends GT_MetaTileEntity_MultiblockB @Override public void outputAfterRecipe_EM() { - if(!eHolders.isEmpty()) { + if(eHolders.size()>0) { if (tRecipe != null && ItemList.Tool_DataStick.isStackEqual(mInventory[1], false, true)){ eHolders.get(0).getBaseMetaTileEntity().setActive(false); eHolders.get(0).mInventory[0] = null; diff --git a/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/GT_MetaTileEntity_EM_scanner.java b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/GT_MetaTileEntity_EM_scanner.java index 158293c38d..d43765f7f2 100644 --- a/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/GT_MetaTileEntity_EM_scanner.java +++ b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/GT_MetaTileEntity_EM_scanner.java @@ -174,7 +174,7 @@ public class GT_MetaTileEntity_EM_scanner extends GT_MetaTileEntity_MultiblockBa @Override public boolean checkRecipe_EM(ItemStack itemStack) { eRecipe=null; - if(!eInputHatches.isEmpty() && eInputHatches.get(0).getContainerHandler().hasStacks() && !eOutputHatches.isEmpty()) { + if(eInputHatches.size()>0 && eInputHatches.get(0).getContainerHandler().hasStacks() && !eOutputHatches.isEmpty()) { cElementalInstanceStackMap researchEM = eInputHatches.get(0).getContainerHandler(); if(ItemList.Tool_DataOrb.isStackEqual(itemStack, false, true)) { GT_Recipe scannerRecipe=null; diff --git a/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/GT_MetaTileEntity_MultiblockBase_EM.java b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/GT_MetaTileEntity_MultiblockBase_EM.java index 3fd05f9eb5..e28e12069e 100644 --- a/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/GT_MetaTileEntity_MultiblockBase_EM.java +++ b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/GT_MetaTileEntity_MultiblockBase_EM.java @@ -578,7 +578,7 @@ public abstract class GT_MetaTileEntity_MultiblockBase_EM extends GT_MetaTileEnt float remaining = voider.overflowMax - voider.getOverflowMatter(); for (GT_MetaTileEntity_Hatch_InputElemental in : eInputHatches) { for (cElementalInstanceStack instance : in.getContainerHandler().values()) { - int qty = (int) Math.floor(remaining / instance.definition.getMass()); + long qty = (long) Math.floor(remaining / instance.definition.getMass()); if (qty > 0) { qty = Math.min(qty, instance.amount); if (voider.addOverflowMatter(instance.definition.getMass() * qty)) @@ -589,7 +589,7 @@ public abstract class GT_MetaTileEntity_MultiblockBase_EM extends GT_MetaTileEnt } for (GT_MetaTileEntity_Hatch_OutputElemental out : eOutputHatches) { for (cElementalInstanceStack instance : out.getContainerHandler().values()) { - int qty = (int) Math.floor(remaining / instance.definition.getMass()); + long qty = (long)Math.floor(remaining / instance.definition.getMass()); if (qty > 0) { qty = Math.min(qty, instance.amount); if (voider.addOverflowMatter(instance.definition.getMass() * qty)) diff --git a/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/other todo b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/other todo index e24b3ff4c9..b255c2013c 100644 --- a/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/other todo +++ b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/other todo @@ -28,3 +28,9 @@ floodlightb fix eu/t checks if needs maintenance!!! make microwave grinder cap autosmelting based on power + + +iterative halflife formula: + +=prev qty* 2^(-t diff / t half) + diff --git a/src/main/resources/assets/tectech/energyLevels.csv b/src/main/resources/assets/tectech/energyLevels.csv index ec98b17ab2..484768d8b7 100644 --- a/src/main/resources/assets/tectech/energyLevels.csv +++ b/src/main/resources/assets/tectech/energyLevels.csv @@ -2917,4 +2917,4 @@ 105,152,Db,370,-1,(1/2-),,0.67,6,S,0.67,0.06,A,87,0,SF,13,0,,,,,,,,, 106,159,Sg,152,0,,,8.5,+26-16,S,8.5,2.1,SF,51,0,A,49,0,,,,,,,,, 108,157,Hs,300,-1,,,0.75,+17-12,MS,0.00075,0.00015,A,100,0,SF,1,0,,,,,,,,, -110,160,Ds,1130,0,,,6.0,+82-22,MS,0.006,0.0052,A,70,0,IT,,0,,,,,,,,, +110,160,Ds,1130,0,,,6.0,+82-22,MS,0.006,0.0052,A,70,0,IT,,0,,,,,,,,,
\ No newline at end of file diff --git a/src/main/resources/assets/tectech/nuclidesTable.csv b/src/main/resources/assets/tectech/nuclidesTable.csv index 940dbf0cb1..783276227a 100644 --- a/src/main/resources/assets/tectech/nuclidesTable.csv +++ b/src/main/resources/assets/tectech/nuclidesTable.csv @@ -3252,4 +3252,4 @@ 116,177,LV,,,0,0,,,53,+62-19,MS,0.053,0.041,A,100,0,,,,,,,,,,,,-3716,1000,-10978,889,10679.42,50,,,5644,996,,,7111,2,293204691,629,190669,586, 117,176,Ts,,,,0,,,14,+11-4,MS,0.014,0.008,A,100,0,SF,,0,,,,,,,,,,,,,,,,,,,,,,,,,,, 117,177,Ts,,,,0,,,,,,,,A,100,0,SF,,0,,,,,,,,,,,,,,,,,,,,,,,,,,, -118,176,Og,,,0,0,0+,,1.8,+84-8,MS,0.0018,0.0046,A,100,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +118,176,Og,,,0,0,0+,,1.8,+84-8,MS,0.0018,0.0046,A,100,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
\ No newline at end of file |
