blob: bd75a0226995b382068ee4993e4517df5346e7b8 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
|
package net.glease.ggfab.util;
import gregtech.api.util.GT_Utility;
public class OverclockHelper {
public static OverclockOutput normalOverclock(long recipeEUt, int duration, long inputVoltage, boolean perfectOC) {
if (recipeEUt > inputVoltage) return null;
int recipeTier = Math.max(1, GT_Utility.getTier(recipeEUt)); // ULV no overclock
int machineTier = GT_Utility.getTier(inputVoltage);
int shift = perfectOC ? 2 : 1;
while (recipeTier < machineTier && duration > 1) {
duration >>= shift;
recipeEUt <<= 2;
recipeTier++;
}
return new OverclockOutput(recipeEUt, duration);
}
public static OverclockOutput laserOverclock(long recipeEUt, int duration, long inputEUt,
float penaltyIncreaseFactor) {
if (recipeEUt > inputEUt) return null;
float currentPenalty = 4 + penaltyIncreaseFactor;
// 2/(n+k) overclock until energy hatch is crying
// must ensure it doesn't go to negative after overclock
while (recipeEUt * currentPenalty > 0 && recipeEUt * currentPenalty < inputEUt && duration > 1) {
duration >>= 1;
recipeEUt *= currentPenalty;
currentPenalty += penaltyIncreaseFactor;
}
return new OverclockOutput(recipeEUt, duration);
}
public static final class OverclockOutput {
private final long mEUt;
private final int mDuration;
public OverclockOutput(long aEUt, int aDuration) {
this.mEUt = aEUt;
this.mDuration = aDuration;
}
public long getEUt() {
return mEUt;
}
public int getDuration() {
return mDuration;
}
@Override
public String toString() {
return mEUt + "@" + mDuration + "ticks";
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof OverclockOutput)) return false;
OverclockOutput that = (OverclockOutput) o;
if (mEUt != that.mEUt) return false;
return mDuration == that.mDuration;
}
@Override
public int hashCode() {
int result = (int) (mEUt ^ (mEUt >>> 32));
result = 31 * result + mDuration;
return result;
}
}
}
|