From 1f3406bc9eccdf13273f4f0e15286e19c59f882f Mon Sep 17 00:00:00 2001 From: JacksonAbney Date: Wed, 16 Apr 2025 13:55:45 -0800 Subject: [PATCH] Terminal hotfix. --- .github/workflows/publish.yml | 18 +- build.gradle | 6 +- .../oc2/client/gui/MachineTerminalWidget.java | 8 +- .../FlashMemoryFlasherBlockEntity.java | 5 +- .../bus/device/provider/ProviderRegistry.java | 1 - .../cil/oc2/common/vm/terminal/Terminal.java | 286 +++++++++--------- .../oc2/common/vm/terminal/escapes/RIS.java | 8 + .../common/vm/terminal/escapes/csi/CH1.java | 11 +- .../common/vm/terminal/escapes/csi/CH10.java | 58 ++++ .../common/vm/terminal/escapes/csi/CH11.java | 111 +++++++ .../common/vm/terminal/escapes/csi/CH2.java | 2 + .../common/vm/terminal/escapes/csi/CH3.java | 1 + .../common/vm/terminal/escapes/csi/CH6.java | 2 + .../common/vm/terminal/escapes/csi/CH7.java | 4 +- .../vm/terminal/escapes/csi/CSIManager.java | 34 ++- .../common/vm/terminal/escapes/csi/ECH.java | 6 +- .../common/vm/terminal/escapes/csi/ED.java | 29 +- .../terminal/fonts/UnicodeFontRenderer.java | 2 +- .../modes/ImplementedPrivateModes.java | 3 +- .../common/vm/terminal/modes/PrivateMode.java | 1 + .../vm/terminal/modes/PrivateModeState.java | 2 + .../oc2r/models/item/hard_drive_custom.json | 7 - .../oc2r.common/hard_drive_custom.json | 47 --- .../oc2r/tags/items/device_needs_reboot.json | 1 - .../oc2r/tags/items/devices/hard_drive.json | 3 +- 25 files changed, 406 insertions(+), 250 deletions(-) create mode 100644 src/main/java/li/cil/oc2/common/vm/terminal/escapes/csi/CH10.java create mode 100644 src/main/java/li/cil/oc2/common/vm/terminal/escapes/csi/CH11.java delete mode 100644 src/main/resources/assets/oc2r/models/item/hard_drive_custom.json delete mode 100644 src/main/resources/data/oc2r/advancements/recipes/oc2r.common/hard_drive_custom.json diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index ce73d8e7..b069dc1a 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -18,6 +18,15 @@ jobs: runs-on: ${{ matrix.os }} steps: + - name: Set release type to 'release' + run: | + echo "RELEASE_TYPE=release" >> $GITHUB_ENV + if: github.event.release.prerelease == false + - name: Set release type to 'alpha' + run: | + echo "RELEASE_TYPE=alpha" >> $GITHUB_ENV + if: github.event.release.prerelease == true + - uses: actions/checkout@v4 - name: build run: | @@ -31,15 +40,6 @@ jobs: with: asset_paths: '["./build/libs/*-all.jar"]' - - name: Set release type to 'release' - run: | - echo "RELEASE_TYPE=release" >> $GITHUB_ENV - if: github.event.release.prerelease == false - - name: Set release type to 'alpha' - run: | - echo "RELEASE_TYPE=alpha" >> $GITHUB_ENV - if: github.event.release.prerelease == true - - name: Publish to Curseforge run: ./gradlew -Psemver='${{ github.event.release.tag_name }}' curseforge env: diff --git a/build.gradle b/build.gradle index ee4a0c32..c9d70a28 100644 --- a/build.gradle +++ b/build.gradle @@ -24,7 +24,7 @@ allprojects { def getGitRef() { try { final def stdout = new ByteArrayOutputStream() - exec { + providers.exec { commandLine "git", "rev-parse", "--short", "HEAD" standardOutput = stdout } @@ -34,7 +34,7 @@ def getGitRef() { } } -version = "${semver}+${getGitRef()}" +version = System.getenv('RELEASE_TYPE') == "release" ? "${semver}" : "${semver}+${getGitRef()}" group = "li.cil.oc2" java.toolchain.languageVersion = JavaLanguageVersion.of(17) @@ -264,7 +264,7 @@ modrinth { gameVersions = ["1.20.1"] loaders = ["forge"] dependencies { - optional.version "markdownmanual" + required.project "markdownmanual" } } diff --git a/src/main/java/li/cil/oc2/client/gui/MachineTerminalWidget.java b/src/main/java/li/cil/oc2/client/gui/MachineTerminalWidget.java index c8b4c478..98268db9 100644 --- a/src/main/java/li/cil/oc2/client/gui/MachineTerminalWidget.java +++ b/src/main/java/li/cil/oc2/client/gui/MachineTerminalWidget.java @@ -256,14 +256,18 @@ public final class MachineTerminalWidget { return false; } + if (keyCode == GLFW.GLFW_KEY_ESCAPE && terminal.currentPrivateModeState.APPLICATION_ESC_MODE) { + terminal.putInput("\033[0["); + } + if ((modifiers & GLFW.GLFW_MOD_CONTROL) != 0 && keyCode == GLFW.GLFW_KEY_V) { final String value = getClient().keyboardHandler.getClipboard(); boolean bracketed = terminal.currentPrivateModeState.SET_BRACKETED_PASTE; - if(bracketed) terminal.putInput("\033[200~"); + if (bracketed) terminal.putInput("\033[200~"); for (final char ch : value.toCharArray()) { terminal.putInput((byte) ch); } - if(bracketed) terminal.putInput("\033[201~"); + if (bracketed) terminal.putInput("\033[201~"); } else { byte[] sequence; if (terminal.currentPrivateModeState.DECCKM && (keyCode == GLFW.GLFW_KEY_UP || keyCode == GLFW.GLFW_KEY_DOWN || keyCode == GLFW.GLFW_KEY_LEFT || keyCode == GLFW.GLFW_KEY_RIGHT)) diff --git a/src/main/java/li/cil/oc2/common/blockentity/FlashMemoryFlasherBlockEntity.java b/src/main/java/li/cil/oc2/common/blockentity/FlashMemoryFlasherBlockEntity.java index 5e8cdfa0..61c72993 100644 --- a/src/main/java/li/cil/oc2/common/blockentity/FlashMemoryFlasherBlockEntity.java +++ b/src/main/java/li/cil/oc2/common/blockentity/FlashMemoryFlasherBlockEntity.java @@ -35,7 +35,6 @@ public final class FlashMemoryFlasherBlockEntity extends ModBlockEntity implemen private final FlashMemoryItemStackHandler itemHandler = new FlashMemoryItemStackHandler(); private final FlashMemoryFlasherDevice device = new FlashMemoryFlasherDevice<>(this); - private final ThrottledSoundEmitter accessSoundEmitter; private final ThrottledSoundEmitter insertSoundEmitter; private final ThrottledSoundEmitter ejectSoundEmitter; @@ -44,8 +43,6 @@ public final class FlashMemoryFlasherBlockEntity extends ModBlockEntity implemen public FlashMemoryFlasherBlockEntity(final BlockPos pos, final BlockState state) { super(BlockEntities.FLASH_MEMORY_FLASHER.get(), pos, state); - this.accessSoundEmitter = new ThrottledSoundEmitter(LocationSupplierUtils.of(this), - SoundEvents.FLOPPY_ACCESS.get()).withMinInterval(Duration.ofSeconds(1)); this.insertSoundEmitter = new ThrottledSoundEmitter(LocationSupplierUtils.of(this), SoundEvents.FLOPPY_INSERT.get()).withMinInterval(Duration.ofMillis(100)); this.ejectSoundEmitter = new ThrottledSoundEmitter(LocationSupplierUtils.of(this), @@ -143,7 +140,7 @@ public final class FlashMemoryFlasherBlockEntity extends ModBlockEntity implemen @Override public void handleDataAccess() { - accessSoundEmitter.play(); + // DO NOTHING } /////////////////////////////////////////////////////////////////// diff --git a/src/main/java/li/cil/oc2/common/bus/device/provider/ProviderRegistry.java b/src/main/java/li/cil/oc2/common/bus/device/provider/ProviderRegistry.java index 0223ba13..d2126af0 100644 --- a/src/main/java/li/cil/oc2/common/bus/device/provider/ProviderRegistry.java +++ b/src/main/java/li/cil/oc2/common/bus/device/provider/ProviderRegistry.java @@ -33,7 +33,6 @@ public final class ProviderRegistry { ITEM_DEVICE_PROVIDERS.register("memory", MemoryItemDeviceProvider::new); ITEM_DEVICE_PROVIDERS.register("hard_drive", HardDriveItemDeviceProvider::new); - ITEM_DEVICE_PROVIDERS.register("hard_drive_custom", HardDriveWithExternalDataItemDeviceProvider::new); ITEM_DEVICE_PROVIDERS.register("flash_memory", FlashMemoryItemDeviceProvider::new); ITEM_DEVICE_PROVIDERS.register("flash_memory_custom", FlashMemoryWithExternalDataItemDeviceProvider::new); ITEM_DEVICE_PROVIDERS.register("redstone_interface_card", RedstoneInterfaceCardItemDeviceProvider::new); diff --git a/src/main/java/li/cil/oc2/common/vm/terminal/Terminal.java b/src/main/java/li/cil/oc2/common/vm/terminal/Terminal.java index d084dfd0..b0ca9150 100644 --- a/src/main/java/li/cil/oc2/common/vm/terminal/Terminal.java +++ b/src/main/java/li/cil/oc2/common/vm/terminal/Terminal.java @@ -274,8 +274,10 @@ public class Terminal { Arrays.fill(altColorsBackground, c.Copy()); Arrays.fill(altStyles, DEFAULT_STYLE); } else { - Arrays.fill(buffer, ' '); - Arrays.fill(colors, DEFAULT_COLORS.Copy()); + int startIndex = (lastRowToDisplayMax - HEIGHT) * WIDTH; + int endIndex = startIndex + (HEIGHT * WIDTH); + Arrays.fill(buffer, startIndex, endIndex, ' '); + Arrays.fill(colors, startIndex, endIndex, DEFAULT_COLORS.Copy()); ColorData c; switch (currentBackgroundColorMode) { case SIXTEEN_COLOR -> c = sixteenColor; @@ -283,8 +285,8 @@ public class Terminal { case TRUE_COLOR -> c = backgroundColor; default -> c = DEFAULT_COLORS.Copy(); } - Arrays.fill(colorsBackground, c.Copy()); - Arrays.fill(styles, DEFAULT_STYLE); + Arrays.fill(colorsBackground, startIndex, endIndex, c.Copy()); + Arrays.fill(styles, startIndex, endIndex, DEFAULT_STYLE); } setCursorPos(0, 0); renderers.forEach(model -> model.getDirtyMask().set(-1)); @@ -423,159 +425,163 @@ public class Terminal { } } - public void putOutput(final byte value) { - final char ch = (char) value; - if (!continuationByte && (ch & (1 << 7)) != 0) { - continuationByte = true; - bytesToRead = 0; - bytesRead = 0; - unicode = 0; - if ((ch & (1 << 6)) != 0) { - bytesToRead++; - } else { - continuationByte = false; - return; - } + public synchronized void putOutput(final byte value) { + synchronized (buffer) { + synchronized (altBuffer) { + final char ch = (char) value; + if (!continuationByte && (ch & (1 << 7)) != 0) { + continuationByte = true; + bytesToRead = 0; + bytesRead = 0; + unicode = 0; + if ((ch & (1 << 6)) != 0) { + bytesToRead++; + } else { + continuationByte = false; + return; + } - if ((ch & (1 << 5)) != 0) { - bytesToRead++; - } else { - unicode = (ch & 0b11111) << 6; // 2 Byte Char - return; - } + if ((ch & (1 << 5)) != 0) { + bytesToRead++; + } else { + unicode = (ch & 0b11111) << 6; // 2 Byte Char + return; + } - if ((ch & (1 << 4)) != 0) { - bytesToRead++; - } else { - unicode = (ch & 0b1111) << 12; // 3 Byte Char - return; - } + if ((ch & (1 << 4)) != 0) { + bytesToRead++; + } else { + unicode = (ch & 0b1111) << 12; // 3 Byte Char + return; + } - unicode = (ch & 0b111) << 18; // 4 Byte Char + unicode = (ch & 0b111) << 18; // 4 Byte Char - return; - } else if (continuationByte) { - if ((ch & (1 << 7)) == 0) { - continuationByte = false; - bytesToRead = 0; - bytesRead = 0; - return; - } + return; + } else if (continuationByte) { + if ((ch & (1 << 7)) == 0) { + continuationByte = false; + bytesToRead = 0; + bytesRead = 0; + return; + } - bytesRead++; + bytesRead++; - unicode |= (ch & 0b111111) << ((bytesToRead - bytesRead) * 6); + unicode |= (ch & 0b111111) << ((bytesToRead - bytesRead) * 6); - if (bytesToRead == bytesRead) { - bytesToRead = 0; - bytesRead = 0; - } else { - return; - } - } - switch (state) { - case NORMAL -> { - switch (value) { - case '\007' -> hasPendingBell = true; - case '\033' -> state = State.ESCAPE; - case '\016' -> useG0 = false; // SO - case '\017' -> useG0 = true; // SI + if (bytesToRead == bytesRead) { + bytesToRead = 0; + bytesRead = 0; + } else { + return; + } + } + switch (state) { + case NORMAL -> { + switch (value) { + case '\007' -> hasPendingBell = true; + case '\033' -> state = State.ESCAPE; + case '\016' -> useG0 = false; // SO + case '\017' -> useG0 = true; // SI - case (byte) '\r' /* 015 */ -> setCursorPos(0, y); - case (byte) '\n' /* 012 */, '\013', '\014' -> { - if (currentModeState.LNM) { - NEL.execute(this); + case (byte) '\r' /* 015 */ -> setCursorPos(0, y); + case (byte) '\n' /* 012 */, '\013', '\014' -> { + if (currentModeState.LNM) { + NEL.execute(this); + } else { + IND.execute(this); + } + } + case (byte) '\t' /* 011 */ -> { + if (x < WIDTH) { + do { + x++; + } while (x < WIDTH && (currentPrivateModeState.isAltBufferEnabled() ? !altTabs[x] : !tabs[x])); + } + } + case (byte) '\b' /* 010 */ -> setCursorPos(Math.min(x, WIDTH - 1) - 1, y); + + default -> putChar((continuationByte) ? unicode : ch); + } + } + case ESCAPE -> { + if (ch == '[') { // Control Sequence Indicator + csiManager.reset(); + state = State.CONTROL_SEQUENCE; + } else if (ch == '(') { // SCS – Select Character Set + state = State.SHIFT_IN_CHARACTER_SET; + } else if (ch == ')') { // SCS – Select Character Set + state = State.SHIFT_OUT_CHARACTER_SET; + } else if (ch == '#') { // # Intermediate + state = State.HASH; + } else if (ch == 'P') { + dcsManager.reset(); + state = State.DCS; + } else if (ch == ']') { + oscManager.reset(); + state = State.OSC; + } else if (ch == '_') { + apcManager.reset(); + state = State.APC; } else { - IND.execute(this); + state = State.NORMAL; + switch (ch) { + case 'D' -> IND.execute(this); // IND – Index + case 'E' -> NEL.execute(this); // NEL – Next Line + case 'M' -> RI.execute(this); // RI – Reverse Index + case '7' -> DECSC.execute(this); // DECSC – Save Cursor (DEC public) + case '8' -> DECRC.execute(this); // DECRC – Restore Cursor (DEC public) + case 'H' -> HTS.execute(this); // HTS – Horizontal Tabulation Set + case 'c' -> RIS.execute(this); // RIS – Reset To Initial State + case '=' -> { + } // DECKPAM – Keypad Application Mode (DEC public) + case '>' -> { + } // DECKPNM – Keypad Numeric Mode (DEC public) + default -> System.out.println("Invalid escape: " + ch); + } } } - case (byte) '\t' /* 011 */ -> { - if (x < WIDTH) { - do { - x++; - } while (x < WIDTH && (currentPrivateModeState.isAltBufferEnabled() ? !altTabs[x] : !tabs[x])); + case CONTROL_SEQUENCE -> csiManager.handle(ch); + case SHIFT_IN_CHARACTER_SET, SHIFT_OUT_CHARACTER_SET -> { + state = State.NORMAL; + switch (ch) { + case 'A' -> { + } // United Kingdom Set + case 'B' -> drawingModeG0 = DrawingMode.ASCII; // ASCII Set + case '0' -> drawingModeG0 = DrawingMode.SPECIAL_GRAPHICS; // Special Graphics + case '1' -> { + } // Alternate Character ROM Standard Character Set + case '2' -> { + } // Alternate Character ROM Special Graphics } } - case (byte) '\b' /* 010 */ -> setCursorPos(Math.min(x, WIDTH - 1) - 1, y); - - default -> putChar((continuationByte) ? unicode : ch); - } - } - case ESCAPE -> { - if (ch == '[') { // Control Sequence Indicator - csiManager.reset(); - state = State.CONTROL_SEQUENCE; - } else if (ch == '(') { // SCS – Select Character Set - state = State.SHIFT_IN_CHARACTER_SET; - } else if (ch == ')') { // SCS – Select Character Set - state = State.SHIFT_OUT_CHARACTER_SET; - } else if (ch == '#') { // # Intermediate - state = State.HASH; - } else if (ch == 'P') { - dcsManager.reset(); - state = State.DCS; - } else if (ch == ']') { - oscManager.reset(); - state = State.OSC; - } else if (ch == '_') { - apcManager.reset(); - state = State.APC; - } else { - state = State.NORMAL; - switch (ch) { - case 'D' -> IND.execute(this); // IND – Index - case 'E' -> NEL.execute(this); // NEL – Next Line - case 'M' -> RI.execute(this); // RI – Reverse Index - case '7' -> DECSC.execute(this); // DECSC – Save Cursor (DEC public) - case '8' -> DECRC.execute(this); // DECRC – Restore Cursor (DEC public) - case 'H' -> HTS.execute(this); // HTS – Horizontal Tabulation Set - case 'c' -> RIS.execute(this); // RIS – Reset To Initial State - case '=' -> { - } // DECKPAM – Keypad Application Mode (DEC public) - case '>' -> { - } // DECKPNM – Keypad Numeric Mode (DEC public) - default -> System.out.println("Invalid escape: " + ch); - } - } - } - case CONTROL_SEQUENCE -> csiManager.handle(ch); - case SHIFT_IN_CHARACTER_SET, SHIFT_OUT_CHARACTER_SET -> { - state = State.NORMAL; - switch (ch) { - case 'A' -> { - } // United Kingdom Set - case 'B' -> drawingModeG0 = DrawingMode.ASCII; // ASCII Set - case '0' -> drawingModeG0 = DrawingMode.SPECIAL_GRAPHICS; // Special Graphics - case '1' -> { - } // Alternate Character ROM Standard Character Set - case '2' -> { - } // Alternate Character ROM Special Graphics - } - } - case HASH -> { - state = State.NORMAL; - switch (ch) { - case '3' -> { - } // Change this line to double-height top half (DECDHL) - case '4' -> { - } // Change this line to double-height bottom half (DECDHL) - case '5' -> { - } // Change this line to single-width single-height (DECSWL) - case '6' -> { - } // Change this line to double-width single-height (DECDWL) - case '8' -> { // Fill Screen with Es (DECALN) - if (currentPrivateModeState.isAltBufferEnabled()) { - Arrays.fill(altBuffer, 'E'); - } else { - Arrays.fill(buffer, (lastRowToDisplayMax - HEIGHT) * WIDTH, ((WIDTH - 1) + (HEIGHT - 1) * WIDTH) + 1, 'E'); + case HASH -> { + state = State.NORMAL; + switch (ch) { + case '3' -> { + } // Change this line to double-height top half (DECDHL) + case '4' -> { + } // Change this line to double-height bottom half (DECDHL) + case '5' -> { + } // Change this line to single-width single-height (DECSWL) + case '6' -> { + } // Change this line to double-width single-height (DECDWL) + case '8' -> { // Fill Screen with Es (DECALN) + if (currentPrivateModeState.isAltBufferEnabled()) { + Arrays.fill(altBuffer, 'E'); + } else { + Arrays.fill(buffer, (lastRowToDisplayMax - HEIGHT) * WIDTH, ((WIDTH - 1) + (HEIGHT - 1) * WIDTH) + 1, 'E'); + } + renderers.forEach(model -> model.getDirtyMask().set(-1)); + } } - renderers.forEach(model -> model.getDirtyMask().set(-1)); } + case DCS -> dcsManager.handle(ch); // Used for mapping Function keys and possibly other things + case OSC -> oscManager.handle(ch); + case APC -> apcManager.handle(ch); } } - case DCS -> dcsManager.handle(ch); // Used for mapping Function keys and possibly other things - case OSC -> oscManager.handle(ch); - case APC -> apcManager.handle(ch); } } diff --git a/src/main/java/li/cil/oc2/common/vm/terminal/escapes/RIS.java b/src/main/java/li/cil/oc2/common/vm/terminal/escapes/RIS.java index e1ff942c..e8560f14 100644 --- a/src/main/java/li/cil/oc2/common/vm/terminal/escapes/RIS.java +++ b/src/main/java/li/cil/oc2/common/vm/terminal/escapes/RIS.java @@ -25,6 +25,14 @@ public class RIS { terminal.useG0 = true; terminal.clear(); terminal.clearAlt(); + Arrays.fill(terminal.buffer, ' '); + Arrays.fill(terminal.colors, Terminal.DEFAULT_COLORS.Copy()); + Arrays.fill(terminal.colorsBackground, Terminal.DEFAULT_COLORS.Copy()); + Arrays.fill(terminal.styles, Terminal.DEFAULT_STYLE); + Arrays.fill(terminal.altBuffer, ' '); + Arrays.fill(terminal.altColors, Terminal.DEFAULT_COLORS.Copy()); + Arrays.fill(terminal.altColorsBackground, Terminal.DEFAULT_COLORS.Copy()); + Arrays.fill(terminal.altStyles, Terminal.DEFAULT_STYLE); Arrays.fill(terminal.tabs, false); Arrays.fill(terminal.altTabs, false); for (int i = 1; i < Terminal.WIDTH; i++) { diff --git a/src/main/java/li/cil/oc2/common/vm/terminal/escapes/csi/CH1.java b/src/main/java/li/cil/oc2/common/vm/terminal/escapes/csi/CH1.java index 6b1a72b8..9e607fee 100644 --- a/src/main/java/li/cil/oc2/common/vm/terminal/escapes/csi/CH1.java +++ b/src/main/java/li/cil/oc2/common/vm/terminal/escapes/csi/CH1.java @@ -8,10 +8,13 @@ public class CH1 extends CSISequenceHandler { // Combined Handler 1 (DECSTBM & X } public void execute(int[] args, int argCount, CSIState state) { - if (state.questionMark) { + if (state.questionMark) { // XTRESTORE handleXTRESTORE(args[0]); } - else if (argCount == 2) { + else if (state.dollarSign) { // DECCARA + System.out.println("DECCARA is not implemented"); + } + else if (argCount == 2) { // DECSTBM handleDECSTBM(args, argCount); } } @@ -90,15 +93,19 @@ public class CH1 extends CSISequenceHandler { // Combined Handler 1 (DECSTBM & X case 2004 -> terminal.currentPrivateModeState.SET_BRACKETED_PASTE = terminal.savePrivateModeState.SET_BRACKETED_PASTE; case 2005 -> terminal.currentPrivateModeState.ENABLE_READLINE_CHAR_QUOTE = terminal.savePrivateModeState.ENABLE_READLINE_CHAR_QUOTE; case 2006 -> terminal.currentPrivateModeState.ENABLE_READLINE_NEWLINE_PASTE = terminal.savePrivateModeState.ENABLE_READLINE_NEWLINE_PASTE; + case 2026 -> terminal.currentPrivateModeState.APPLICATION_SYNC = terminal.savePrivateModeState.APPLICATION_SYNC; + case 7727 -> terminal.currentPrivateModeState.APPLICATION_ESC_MODE = terminal.savePrivateModeState.APPLICATION_ESC_MODE; } } private void handleDECSTBM(int[] args, int argCount) { final int first, last; if (argCount == 2) { + System.out.println("Top: " + args[0] + ", Bottom: " + args[1]); first = args[0] - 1; last = args[1] - 1; } else { + System.out.println("Full screen"); first = 0; last = Terminal.HEIGHT - 1; } diff --git a/src/main/java/li/cil/oc2/common/vm/terminal/escapes/csi/CH10.java b/src/main/java/li/cil/oc2/common/vm/terminal/escapes/csi/CH10.java new file mode 100644 index 00000000..ff378de1 --- /dev/null +++ b/src/main/java/li/cil/oc2/common/vm/terminal/escapes/csi/CH10.java @@ -0,0 +1,58 @@ +package li.cil.oc2.common.vm.terminal.escapes.csi; + +import li.cil.oc2.common.vm.terminal.Terminal; + +import java.util.Arrays; + +public class CH10 extends CSISequenceHandler { // Combined Handler 10 (DCH and XTPUSHCOLORS) + public CH10(final Terminal terminal) { + super(terminal); + } + + @Override + public void execute(final int[] args, final int argsCount, final CSIState state) { + if (state.hash) { // XTPUSHCOLORS + System.out.println("XTPUSHCOLORS not implemented"); + } else { // DCH + int chars = Math.min(Math.max(args[0], 1), Terminal.WIDTH - terminal.x); + int startIndex = ((terminal.currentPrivateModeState.isAltBufferEnabled()) ? terminal.y * Terminal.WIDTH : (terminal.y + (terminal.lastRowToDisplayMax - Terminal.HEIGHT)) * Terminal.WIDTH) + terminal.x; + int count = (Terminal.WIDTH - terminal.x) - chars; + int endIndex = startIndex + count; + if (terminal.currentPrivateModeState.isAltBufferEnabled()) { + System.arraycopy(terminal.altBuffer, startIndex + chars, terminal.altBuffer, startIndex, count); + System.arraycopy(terminal.altColors, startIndex + chars, terminal.altColors, startIndex, count); + System.arraycopy(terminal.altColorsBackground, startIndex + chars, terminal.altColorsBackground, startIndex, count); + System.arraycopy(terminal.altStyles, startIndex + chars, terminal.altStyles, startIndex, count); + Arrays.fill(terminal.altBuffer, endIndex, endIndex + chars + 1, ' '); + Arrays.fill(terminal.altColors, endIndex, endIndex + chars + 1, Terminal.DEFAULT_COLORS.Copy()); + Terminal.ColorData c; + switch (terminal.currentBackgroundColorMode) { + case SIXTEEN_COLOR -> c = terminal.sixteenColor; + case TWO_FIFTY_SIX_COLOR -> c = terminal.twoFiftySixColor; + case TRUE_COLOR -> c = terminal.backgroundColor; + default -> c = Terminal.DEFAULT_COLORS; + } + Arrays.fill(terminal.altColors, endIndex, endIndex + chars + 1, c.Copy()); + Arrays.fill(terminal.altStyles, endIndex, endIndex + chars + 1, Terminal.DEFAULT_STYLE); + } else { + System.arraycopy(terminal.buffer, startIndex + chars, terminal.buffer, startIndex, count); + System.arraycopy(terminal.colors, startIndex + chars, terminal.colors, startIndex, count); + System.arraycopy(terminal.colorsBackground, startIndex + chars, terminal.colorsBackground, startIndex, count); + System.arraycopy(terminal.styles, startIndex + chars, terminal.styles, startIndex, count); + Arrays.fill(terminal.buffer, endIndex, endIndex + chars + 1, ' '); + Arrays.fill(terminal.colors, endIndex, endIndex + chars + 1, Terminal.DEFAULT_COLORS.Copy()); + Terminal.ColorData c; + switch (terminal.currentBackgroundColorMode) { + case SIXTEEN_COLOR -> c = terminal.sixteenColor; + case TWO_FIFTY_SIX_COLOR -> c = terminal.twoFiftySixColor; + case TRUE_COLOR -> c = terminal.backgroundColor; + default -> c = Terminal.DEFAULT_COLORS; + } + Arrays.fill(terminal.colorsBackground, endIndex, endIndex + chars + 1, c.Copy()); + Arrays.fill(terminal.styles, endIndex, endIndex + chars + 1, Terminal.DEFAULT_STYLE); + } + + terminal.renderers.forEach(model -> model.getDirtyMask().accumulateAndGet(1 << terminal.y, (left, right) -> left | right)); + } + } +} diff --git a/src/main/java/li/cil/oc2/common/vm/terminal/escapes/csi/CH11.java b/src/main/java/li/cil/oc2/common/vm/terminal/escapes/csi/CH11.java new file mode 100644 index 00000000..fa80dc5f --- /dev/null +++ b/src/main/java/li/cil/oc2/common/vm/terminal/escapes/csi/CH11.java @@ -0,0 +1,111 @@ +package li.cil.oc2.common.vm.terminal.escapes.csi; + +import li.cil.oc2.common.vm.terminal.Terminal; + +import java.util.Arrays; + +public class CH11 extends CSISequenceHandler { // Combined Handler 10 (ICH and SL) + public CH11(final Terminal terminal) { + super(terminal); + } + + @Override + public void execute(final int[] args, final int argsCount, final CSIState state) { + int chars = Math.max(args[0], 1); + if (state.space) { // SL + for (int i = 0; i <= terminal.y; i++) { + shiftLeft(chars, i); + } + } else { // ICH + if (chars >= Terminal.WIDTH) { + terminal.clearLine(terminal.y); + } + else { + shiftRight(chars); + } + } + } + + private void shiftLeft(int chars, int y) { + int startIndex = ((terminal.currentPrivateModeState.isAltBufferEnabled()) ? y * Terminal.WIDTH : (y + (terminal.lastRowToDisplayMax - Terminal.HEIGHT)) * Terminal.WIDTH); + int count = (Terminal.WIDTH) - chars; + int endIndex = startIndex + count; + if (terminal.currentPrivateModeState.isAltBufferEnabled()) { + System.arraycopy(terminal.altBuffer, startIndex + chars, terminal.altBuffer, startIndex, count); + System.arraycopy(terminal.altColors, startIndex + chars, terminal.altColors, startIndex, count); + System.arraycopy(terminal.altColorsBackground, startIndex + chars, terminal.altColorsBackground, startIndex, count); + System.arraycopy(terminal.altStyles, startIndex + chars, terminal.altStyles, startIndex, count); + + Arrays.fill(terminal.altBuffer, endIndex, endIndex + chars, ' '); + Arrays.fill(terminal.altColors, endIndex, endIndex + chars, Terminal.DEFAULT_COLORS.Copy()); + Terminal.ColorData c; + switch (terminal.currentBackgroundColorMode) { + case SIXTEEN_COLOR -> c = terminal.sixteenColor; + case TWO_FIFTY_SIX_COLOR -> c = terminal.twoFiftySixColor; + case TRUE_COLOR -> c = terminal.backgroundColor; + default -> c = Terminal.DEFAULT_COLORS; + } + Arrays.fill(terminal.altColors, endIndex, endIndex + chars, c.Copy()); + Arrays.fill(terminal.altStyles, endIndex, endIndex + chars, Terminal.DEFAULT_STYLE); + } else { + System.arraycopy(terminal.buffer, startIndex + chars, terminal.buffer, startIndex, count); + System.arraycopy(terminal.colors, startIndex + chars, terminal.colors, startIndex, count); + System.arraycopy(terminal.colorsBackground, startIndex + chars, terminal.colorsBackground, startIndex , count); + System.arraycopy(terminal.styles, startIndex + chars, terminal.styles, startIndex, count); + + Arrays.fill(terminal.buffer, endIndex, endIndex + chars, ' '); + Arrays.fill(terminal.colors, endIndex, endIndex + chars, Terminal.DEFAULT_COLORS.Copy()); + Terminal.ColorData c; + switch (terminal.currentBackgroundColorMode) { + case SIXTEEN_COLOR -> c = terminal.sixteenColor; + case TWO_FIFTY_SIX_COLOR -> c = terminal.twoFiftySixColor; + case TRUE_COLOR -> c = terminal.backgroundColor; + default -> c = Terminal.DEFAULT_COLORS; + } + Arrays.fill(terminal.colorsBackground, endIndex, endIndex + chars, c.Copy()); + Arrays.fill(terminal.styles, endIndex, endIndex + chars, Terminal.DEFAULT_STYLE); + } + + terminal.renderers.forEach(model -> model.getDirtyMask().accumulateAndGet(1 << y, (left, right) -> left | right)); + } + + private void shiftRight(int chars) { + int startIndex = ((terminal.currentPrivateModeState.isAltBufferEnabled()) ? terminal.y * Terminal.WIDTH : (terminal.y + (terminal.lastRowToDisplayMax - Terminal.HEIGHT)) * Terminal.WIDTH) + terminal.x; + int count = (Terminal.WIDTH - terminal.x) - chars; + if (terminal.currentPrivateModeState.isAltBufferEnabled()) { + System.arraycopy(terminal.altBuffer, startIndex, terminal.altBuffer, startIndex + chars, count); + System.arraycopy(terminal.altColors, startIndex, terminal.altColors, startIndex + chars, count); + System.arraycopy(terminal.altColorsBackground, startIndex, terminal.altColorsBackground, startIndex + chars, count); + System.arraycopy(terminal.altStyles, startIndex, terminal.altStyles, startIndex + chars, count); + Arrays.fill(terminal.altBuffer, startIndex, startIndex + chars, ' '); + Arrays.fill(terminal.altColors, startIndex, startIndex + chars, Terminal.DEFAULT_COLORS.Copy()); + Terminal.ColorData c; + switch (terminal.currentBackgroundColorMode) { + case SIXTEEN_COLOR -> c = terminal.sixteenColor; + case TWO_FIFTY_SIX_COLOR -> c = terminal.twoFiftySixColor; + case TRUE_COLOR -> c = terminal.backgroundColor; + default -> c = Terminal.DEFAULT_COLORS; + } + Arrays.fill(terminal.altColors, startIndex, startIndex + chars, c.Copy()); + Arrays.fill(terminal.altStyles, startIndex, startIndex + chars, Terminal.DEFAULT_STYLE); + } else { + System.arraycopy(terminal.buffer, startIndex, terminal.buffer, startIndex + chars, count); + System.arraycopy(terminal.colors, startIndex, terminal.colors, startIndex + chars, count); + System.arraycopy(terminal.colorsBackground, startIndex, terminal.colorsBackground, startIndex + chars, count); + System.arraycopy(terminal.styles, startIndex, terminal.styles, startIndex + chars, count); + Arrays.fill(terminal.buffer, startIndex, startIndex + chars, ' '); + Arrays.fill(terminal.colors, startIndex, startIndex + chars, Terminal.DEFAULT_COLORS.Copy()); + Terminal.ColorData c; + switch (terminal.currentBackgroundColorMode) { + case SIXTEEN_COLOR -> c = terminal.sixteenColor; + case TWO_FIFTY_SIX_COLOR -> c = terminal.twoFiftySixColor; + case TRUE_COLOR -> c = terminal.backgroundColor; + default -> c = Terminal.DEFAULT_COLORS; + } + Arrays.fill(terminal.colorsBackground, startIndex, startIndex + chars, c.Copy()); + Arrays.fill(terminal.styles, startIndex, startIndex + chars, Terminal.DEFAULT_STYLE); + } + + terminal.renderers.forEach(model -> model.getDirtyMask().accumulateAndGet(1 << terminal.y, (left, right) -> left | right)); + } +} diff --git a/src/main/java/li/cil/oc2/common/vm/terminal/escapes/csi/CH2.java b/src/main/java/li/cil/oc2/common/vm/terminal/escapes/csi/CH2.java index 983708e1..1aacdf16 100644 --- a/src/main/java/li/cil/oc2/common/vm/terminal/escapes/csi/CH2.java +++ b/src/main/java/li/cil/oc2/common/vm/terminal/escapes/csi/CH2.java @@ -188,6 +188,8 @@ public class CH2 extends CSISequenceHandler { // Combined Handler 2 (SM & DECSET case 2004 -> terminal.currentPrivateModeState.SET_BRACKETED_PASTE = true; case 2005 -> terminal.currentPrivateModeState.ENABLE_READLINE_CHAR_QUOTE = true; case 2006 -> terminal.currentPrivateModeState.ENABLE_READLINE_NEWLINE_PASTE = true; + case 2026 -> terminal.currentPrivateModeState.APPLICATION_SYNC = true; + case 7727 -> terminal.currentPrivateModeState.APPLICATION_ESC_MODE = true; } ImplementedPrivateModes.instance.modeUsed(args[i], true); diff --git a/src/main/java/li/cil/oc2/common/vm/terminal/escapes/csi/CH3.java b/src/main/java/li/cil/oc2/common/vm/terminal/escapes/csi/CH3.java index 0fab372e..b066a54d 100644 --- a/src/main/java/li/cil/oc2/common/vm/terminal/escapes/csi/CH3.java +++ b/src/main/java/li/cil/oc2/common/vm/terminal/escapes/csi/CH3.java @@ -137,6 +137,7 @@ public class CH3 extends CSISequenceHandler { // Combined Handler 3 (RM & DECRST case 2005 -> terminal.currentPrivateModeState.ENABLE_READLINE_CHAR_QUOTE = false; case 2006 -> terminal.currentPrivateModeState.ENABLE_READLINE_NEWLINE_PASTE = false; case 2026 -> terminal.currentPrivateModeState.APPLICATION_SYNC = false; + case 7727 -> terminal.currentPrivateModeState.APPLICATION_ESC_MODE = false; } ImplementedPrivateModes.instance.modeUsed(args[i], false); diff --git a/src/main/java/li/cil/oc2/common/vm/terminal/escapes/csi/CH6.java b/src/main/java/li/cil/oc2/common/vm/terminal/escapes/csi/CH6.java index 0c33438c..8859bbfd 100644 --- a/src/main/java/li/cil/oc2/common/vm/terminal/escapes/csi/CH6.java +++ b/src/main/java/li/cil/oc2/common/vm/terminal/escapes/csi/CH6.java @@ -99,6 +99,8 @@ public class CH6 extends CSISequenceHandler { // Combined Handler 6 (XTSAVE, XTS case 2004 -> terminal.savePrivateModeState.SET_BRACKETED_PASTE = terminal.currentPrivateModeState.SET_BRACKETED_PASTE; case 2005 -> terminal.savePrivateModeState.ENABLE_READLINE_CHAR_QUOTE = terminal.currentPrivateModeState.ENABLE_READLINE_CHAR_QUOTE; case 2006 -> terminal.savePrivateModeState.ENABLE_READLINE_NEWLINE_PASTE = terminal.currentPrivateModeState.ENABLE_READLINE_NEWLINE_PASTE; + case 2026 -> terminal.savePrivateModeState.APPLICATION_SYNC = terminal.currentPrivateModeState.APPLICATION_SYNC; + case 7727 -> terminal.savePrivateModeState.APPLICATION_ESC_MODE = terminal.currentPrivateModeState.APPLICATION_ESC_MODE; } } } diff --git a/src/main/java/li/cil/oc2/common/vm/terminal/escapes/csi/CH7.java b/src/main/java/li/cil/oc2/common/vm/terminal/escapes/csi/CH7.java index 85f70259..289476e1 100644 --- a/src/main/java/li/cil/oc2/common/vm/terminal/escapes/csi/CH7.java +++ b/src/main/java/li/cil/oc2/common/vm/terminal/escapes/csi/CH7.java @@ -9,7 +9,9 @@ public class CH7 extends CSISequenceHandler { // Combined Handler 7 (XTVERSION, public void execute(final int[] args, final int argsCount, final CSIState state) { if (state.greaterThan) { // XTVERSION - System.out.println("XTVERSION not implemented"); + if (args[0] == 0) { + terminal.putResponse("\033P>|oc2rvt(1.0.0)\033\\"); + } } else if (state.space) { // DECSCUSR int cursorStyle = args[0]; if (cursorStyle < 0 || cursorStyle > 6) { diff --git a/src/main/java/li/cil/oc2/common/vm/terminal/escapes/csi/CSIManager.java b/src/main/java/li/cil/oc2/common/vm/terminal/escapes/csi/CSIManager.java index 93423f52..2f8d791b 100644 --- a/src/main/java/li/cil/oc2/common/vm/terminal/escapes/csi/CSIManager.java +++ b/src/main/java/li/cil/oc2/common/vm/terminal/escapes/csi/CSIManager.java @@ -28,28 +28,32 @@ public class CSIManager { sequences.put('B', new CUD(terminal)); sequences.put('C', new CUF(terminal)); sequences.put('D', new CUB(terminal)); + sequences.put('G', new CHA(terminal)); sequences.put('H', new CUP(terminal)); - sequences.put('f', new HVP(terminal)); - sequences.put('m', new SGR(terminal)); - sequences.put('K', new EL(terminal)); sequences.put('J', new ED(terminal)); - sequences.put('r', new CH1(terminal)); + sequences.put('K', new EL(terminal)); + sequences.put('L', new IL(terminal)); + sequences.put('M', new DL(terminal)); + sequences.put('P', new CH10(terminal)); + sequences.put('S', new CH8(terminal)); + sequences.put('T', new CH9(terminal)); + sequences.put('X', new ECH(terminal)); + + sequences.put('c', new DA(terminal)); + sequences.put('d', new VPA(terminal)); + sequences.put('f', new HVP(terminal)); sequences.put('g', new TBC(terminal)); sequences.put('h', new CH2(terminal)); sequences.put('l', new CH3(terminal)); + sequences.put('m', new SGR(terminal)); sequences.put('n', new DSR(terminal)); - sequences.put('c', new DA(terminal)); - sequences.put('d', new VPA(terminal)); - sequences.put('G', new CHA(terminal)); - sequences.put('t', new CH4(terminal)); sequences.put('p', new CH5(terminal)); - sequences.put('s', new CH6(terminal)); - sequences.put('X', new ECH(terminal)); sequences.put('q', new CH7(terminal)); - sequences.put('L', new IL(terminal)); - sequences.put('M', new DL(terminal)); - sequences.put('S', new CH8(terminal)); - sequences.put('T', new CH9(terminal)); + sequences.put('r', new CH1(terminal)); + sequences.put('s', new CH6(terminal)); + sequences.put('t', new CH4(terminal)); + + sequences.put('@', new CH11(terminal)); } public void handle(final char ch) { @@ -100,6 +104,8 @@ public class CSIManager { terminal.state = Terminal.State.NORMAL; + System.out.println("Control sequence sent: " + ch); + CSISequenceHandler handler = sequences.get(ch); CSIState state = new CSIState(questionMark, greaterThan, dollarSign, hash, quote, singleQuote, space, exclamation); diff --git a/src/main/java/li/cil/oc2/common/vm/terminal/escapes/csi/ECH.java b/src/main/java/li/cil/oc2/common/vm/terminal/escapes/csi/ECH.java index b13d1a57..47c33f34 100644 --- a/src/main/java/li/cil/oc2/common/vm/terminal/escapes/csi/ECH.java +++ b/src/main/java/li/cil/oc2/common/vm/terminal/escapes/csi/ECH.java @@ -14,21 +14,21 @@ public class ECH extends CSISequenceHandler { if (terminal.currentPrivateModeState.isAltBufferEnabled()) { int fromIndex = terminal.x + terminal.y * Terminal.WIDTH; int toIndex = fromIndex + Math.max(Math.min(Math.max(chars, 1), Terminal.WIDTH - terminal.x), 1); - Arrays.fill(terminal.altBuffer, fromIndex, toIndex, '\0'); + Arrays.fill(terminal.altBuffer, fromIndex, toIndex, ' '); Arrays.fill(terminal.altColors, fromIndex, toIndex, Terminal.DEFAULT_COLORS.Copy()); Terminal.ColorData c; switch (terminal.currentBackgroundColorMode) { case SIXTEEN_COLOR -> c = terminal.sixteenColor; case TWO_FIFTY_SIX_COLOR -> c = terminal.twoFiftySixColor; case TRUE_COLOR -> c = terminal.backgroundColor; - default -> c = Terminal.DEFAULT_COLORS.Copy(); + default -> c = Terminal.DEFAULT_COLORS; } Arrays.fill(terminal.altColorsBackground, fromIndex, toIndex, c.Copy()); Arrays.fill(terminal.altStyles, fromIndex, toIndex, Terminal.DEFAULT_STYLE); } else { int fromIndex = terminal.x + (terminal.y + (terminal.lastRowToDisplayMax - Terminal.HEIGHT)) * Terminal.WIDTH; int toIndex = fromIndex + Math.max(Math.min(Math.max(chars, 1), Terminal.WIDTH - terminal.x), 1); - Arrays.fill(terminal.buffer, fromIndex, toIndex, '\0'); + Arrays.fill(terminal.buffer, fromIndex, toIndex, ' '); Arrays.fill(terminal.colors, fromIndex, toIndex, Terminal.DEFAULT_COLORS.Copy()); Terminal.ColorData c; switch (terminal.currentBackgroundColorMode) { diff --git a/src/main/java/li/cil/oc2/common/vm/terminal/escapes/csi/ED.java b/src/main/java/li/cil/oc2/common/vm/terminal/escapes/csi/ED.java index 67554bae..f386295c 100644 --- a/src/main/java/li/cil/oc2/common/vm/terminal/escapes/csi/ED.java +++ b/src/main/java/li/cil/oc2/common/vm/terminal/escapes/csi/ED.java @@ -8,21 +8,26 @@ public class ED extends CSISequenceHandler { } public void execute(int[] args, int argCount, CSIState state) { - switch (args[0]) { - case 0 -> { // From cursor to end of screen - terminal.clearLine(terminal.y, terminal.x, Terminal.WIDTH); - for (int iy = terminal.y + 1; iy < Terminal.HEIGHT; iy++) { - terminal.clearLine(iy); + if (state.questionMark) { + System.out.println("DECSED is not implemented"); + } + else { + switch (args[0]) { + case 0 -> { // From cursor to end of screen + terminal.clearLine(terminal.y, terminal.x, Terminal.WIDTH); + for (int iy = terminal.y + 1; iy < Terminal.HEIGHT; iy++) { + terminal.clearLine(iy); + } } - } - case 1 -> { // From beginning of screen to cursor - for (int iy = 0; iy < terminal.y; iy++) { - terminal.clearLine(iy); + case 1 -> { // From beginning of screen to cursor + for (int iy = 0; iy < terminal.y; iy++) { + terminal.clearLine(iy); + } + terminal.clearLine(terminal.y, 0, terminal.x + 1); } - terminal.clearLine(terminal.y, 0, terminal.x + 1); + case 2 -> // Entire screen + terminal.clear(); } - case 2 -> // Entire screen - terminal.clear(); } } } diff --git a/src/main/java/li/cil/oc2/common/vm/terminal/fonts/UnicodeFontRenderer.java b/src/main/java/li/cil/oc2/common/vm/terminal/fonts/UnicodeFontRenderer.java index 7cef00c9..d24e9a9b 100644 --- a/src/main/java/li/cil/oc2/common/vm/terminal/fonts/UnicodeFontRenderer.java +++ b/src/main/java/li/cil/oc2/common/vm/terminal/fonts/UnicodeFontRenderer.java @@ -39,7 +39,7 @@ public class UnicodeFontRenderer { FontMetrics metrics = g.getFontMetrics(); int ascent = metrics.getAscent(); - g.drawGlyphVector(gv, 0, ascent); + g.drawGlyphVector(gv, 0, ascent - 1); g.dispose(); Glyph glyph = new Glyph(img, 16, 32, (int) gv.getGlyphMetrics(0).getAdvance()); diff --git a/src/main/java/li/cil/oc2/common/vm/terminal/modes/ImplementedPrivateModes.java b/src/main/java/li/cil/oc2/common/vm/terminal/modes/ImplementedPrivateModes.java index 873b330b..05416e89 100644 --- a/src/main/java/li/cil/oc2/common/vm/terminal/modes/ImplementedPrivateModes.java +++ b/src/main/java/li/cil/oc2/common/vm/terminal/modes/ImplementedPrivateModes.java @@ -12,7 +12,7 @@ public class ImplementedPrivateModes { modeStatus.put(2, false); // DECANM; modeStatus.put(3, false); // DECCOLM; modeStatus.put(4, true); // DECSCLM; - modeStatus.put(5, false); // DECSCNM; + modeStatus.put(5, true); // DECSCNM; Has no function, meant for older terminals modeStatus.put(6, true); // DECOM; modeStatus.put(7, true); // DECAWM; modeStatus.put(8, true); // DECARM; @@ -81,6 +81,7 @@ public class ImplementedPrivateModes { modeStatus.put(2005, false); // ENABLE_READLINE_CHAR_QUOTE; modeStatus.put(2006, false); // ENABLE_READLINE_NEWLINE_PASTE; modeStatus.put(2026, true); // APPLICATION_SYNC; + modeStatus.put(7727, true); // APPLICATION_ESC_MODE; } public void modeUsed(int mode, boolean state) { diff --git a/src/main/java/li/cil/oc2/common/vm/terminal/modes/PrivateMode.java b/src/main/java/li/cil/oc2/common/vm/terminal/modes/PrivateMode.java index 8fc17414..adc0a43a 100644 --- a/src/main/java/li/cil/oc2/common/vm/terminal/modes/PrivateMode.java +++ b/src/main/java/li/cil/oc2/common/vm/terminal/modes/PrivateMode.java @@ -75,4 +75,5 @@ public final class PrivateMode { public static final int ENABLE_READLINE_CHAR_QUOTE = 2005; // Enable readline character quoting public static final int ENABLE_READLINE_NEWLINE_PASTE = 2006; // Enable readline newline pasting public static final int APPLICATION_SYNC = 2026; // Wait to render until application is ready + public static final int APPLICATION_ESC_MODE = 7727; // Send escape key as ^[0[ } diff --git a/src/main/java/li/cil/oc2/common/vm/terminal/modes/PrivateModeState.java b/src/main/java/li/cil/oc2/common/vm/terminal/modes/PrivateModeState.java index d66bd0cb..e14c1ebf 100644 --- a/src/main/java/li/cil/oc2/common/vm/terminal/modes/PrivateModeState.java +++ b/src/main/java/li/cil/oc2/common/vm/terminal/modes/PrivateModeState.java @@ -80,6 +80,7 @@ public class PrivateModeState { public boolean ENABLE_READLINE_CHAR_QUOTE = false; public boolean ENABLE_READLINE_NEWLINE_PASTE = false; public boolean APPLICATION_SYNC = false; + public boolean APPLICATION_ESC_MODE = false; public boolean getMode(int mode) { return switch (mode) { @@ -156,6 +157,7 @@ public class PrivateModeState { case 2005 -> ENABLE_READLINE_CHAR_QUOTE; case 2006 -> ENABLE_READLINE_NEWLINE_PASTE; case 2026 -> APPLICATION_SYNC; + case 7727 -> APPLICATION_ESC_MODE; default -> throw new IndexOutOfBoundsException(); }; } diff --git a/src/main/resources/assets/oc2r/models/item/hard_drive_custom.json b/src/main/resources/assets/oc2r/models/item/hard_drive_custom.json deleted file mode 100644 index ce13c2ff..00000000 --- a/src/main/resources/assets/oc2r/models/item/hard_drive_custom.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "parent": "minecraft:item/generated", - "textures": { - "layer0": "oc2r:item/hard_drive_base", - "layer1": "oc2r:item/hard_drive_tint" - } -} diff --git a/src/main/resources/data/oc2r/advancements/recipes/oc2r.common/hard_drive_custom.json b/src/main/resources/data/oc2r/advancements/recipes/oc2r.common/hard_drive_custom.json deleted file mode 100644 index 7eaca159..00000000 --- a/src/main/resources/data/oc2r/advancements/recipes/oc2r.common/hard_drive_custom.json +++ /dev/null @@ -1,47 +0,0 @@ -{ - "parent": "minecraft:recipes/root", - "rewards": { - "recipes": [ - "oc2r:hard_drive_custom" - ] - }, - "criteria": { - "has_computer": { - "trigger": "minecraft:inventory_changed", - "conditions": { - "items": [ - { - "items": [ - "oc2r:computer" - ] - } - ] - } - }, - "has_robot": { - "trigger": "minecraft:inventory_changed", - "conditions": { - "items": [ - { - "items": [ - "oc2r:robot" - ] - } - ] - } - }, - "has_the_recipe": { - "trigger": "minecraft:recipe_unlocked", - "conditions": { - "recipe": "oc2r:hard_drive_custom" - } - } - }, - "requirements": [ - [ - "has_computer", - "has_robot", - "has_the_recipe" - ] - ] -} diff --git a/src/main/resources/data/oc2r/tags/items/device_needs_reboot.json b/src/main/resources/data/oc2r/tags/items/device_needs_reboot.json index 45c4bad5..e6bb6e16 100644 --- a/src/main/resources/data/oc2r/tags/items/device_needs_reboot.json +++ b/src/main/resources/data/oc2r/tags/items/device_needs_reboot.json @@ -8,7 +8,6 @@ "oc2r:hard_drive_medium", "oc2r:hard_drive_large", "oc2r:hard_drive_extra_large", - "oc2r:hard_drive_custom", "oc2r:keyboard", "oc2r:memory_small", "oc2r:memory_medium", diff --git a/src/main/resources/data/oc2r/tags/items/devices/hard_drive.json b/src/main/resources/data/oc2r/tags/items/devices/hard_drive.json index b57141c5..7879146e 100644 --- a/src/main/resources/data/oc2r/tags/items/devices/hard_drive.json +++ b/src/main/resources/data/oc2r/tags/items/devices/hard_drive.json @@ -4,7 +4,6 @@ "oc2r:hard_drive_small", "oc2r:hard_drive_medium", "oc2r:hard_drive_large", - "oc2r:hard_drive_extra_large", - "oc2r:hard_drive_custom" + "oc2r:hard_drive_extra_large" ] }