aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/ggfab/util/OverclockHelper.java
blob: b0e42930e822d794281db9459efef2cc09ac8806 (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 ggfab.util;

import gregtech.api.util.GTUtility;

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, GTUtility.getTier(recipeEUt)); // ULV no overclock
        int machineTier = GTUtility.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;
        }
    }
}