Skip to content

Commit

Permalink
fix: comparator right-side input not working correctly
Browse files Browse the repository at this point in the history
  • Loading branch information
MrTJP committed May 4, 2024
1 parent 4be8342 commit f8e461c
Showing 1 changed file with 15 additions and 16 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -1002,8 +1002,11 @@ protected boolean pulsing() {

public static class Comparator extends RedstoneGatePart implements NeighborTileChangePart {

public static final int KEY_STATE2 = 20;

// Analog IO mask: LLBB RRTT
// TT analog top output
// RR analog right input
// BB analog bottom input
// LL analog left input
private short lState2 = 0;

public Comparator(GateType type) {
Expand Down Expand Up @@ -1049,18 +1052,13 @@ protected boolean gateLogicCycleShape() {
return true;
}

@Override
protected boolean gateLogicCanConnect(int r) {
return true; //TODO why?
}

@Override
protected int getOutput(int r) {
return r == 0 ? state2() & 0xF : 0;
}
//endregion

private int calcInputA() {
private int calcBottomComparatorInput() {

Direction absDir = Direction.values()[Rotation.rotateSide(getSide(), toAbsolute(2))];
BlockPos pos1 = tile().getBlockPos().relative(absDir);
Expand Down Expand Up @@ -1115,8 +1113,9 @@ private int getDiodeSignal(int r) {
return list.size() == 1 ? list.get(0) : null;
}

private int calcInput() {
return getRedstoneInput(1) << 4 | calcInputA() << 8 | getAnalogRedstoneInput(3) << 12;
private int calcAnalogInputMask() {
// LLBBRR00
return getAnalogRedstoneInput(1) << 4 | calcBottomComparatorInput() << 8 | getAnalogRedstoneInput(3) << 12;
}

private int digitize(int analog) {
Expand All @@ -1130,19 +1129,19 @@ private int digitize(int analog) {
@Override
protected void gateLogicOnChange() {
int oldInput = state2() & 0xFFF0;
int newInput = calcInput();
int newInput = calcAnalogInputMask();
if (oldInput != newInput) {
setState2(state2() & 0xF | newInput);
setState(digitize(newInput | calcOutput()) | state() & 0xF0);
setState(state() & 0xF0 | digitize(newInput));
onInputChange();
}
if ((state2() & 0xF) != calcOutput()) scheduleTick(2);
}

private int calcOutput() {
int inputA = state2() >> 8 & 0xF;
int inputB = Math.max(state2() >> 4 & 0xF, state2() >> 12 & 0xF);
return shape() == 0 ? inputA > inputB ? inputA : 0 : Math.max(inputA - inputB, 0);
int backInput = state2() >> 8 & 0xF;
int lrMaxInput = Math.max(state2() >> 4 & 0xF, state2() >> 12 & 0xF);
return shape() == 0 ? backInput > lrMaxInput ? backInput : 0 : Math.max(backInput - lrMaxInput, 0);
}

@Override
Expand All @@ -1151,7 +1150,7 @@ protected void gateLogicOnScheduledTick() {
int newOutput = calcOutput();
if (oldOutput != newOutput) {
setState2(state2() & 0xFFF0 | newOutput);
setState(state() & 0xF | digitize(newOutput) << 4);
setState(state() & 0xF | (newOutput != 0 ? 0x10 : 0));
onOutputChange(1);
}
}
Expand Down

0 comments on commit f8e461c

Please sign in to comment.