From 969eba427360ab9d26aabea8e0ad39aafc483aeb Mon Sep 17 00:00:00 2001 From: Cedric Date: Mon, 25 Sep 2023 21:27:35 +0200 Subject: [PATCH] feat: added system for presignal repeater --- .../signals/enums/SignalBoxNetwork.java | 2 +- .../signals/guis/ContainerSignalBox.java | 12 +++++ .../signals/guis/GuiSignalBox.java | 18 +++++++ .../signals/parser/FunctionParsingInfo.java | 5 ++ .../signals/parser/LogicParser.java | 3 ++ .../signals/parser/PredicateHolder.java | 36 +++++-------- .../signalbox/MainSignalIdentifier.java | 36 +++++++++++++ .../signalbox/OtherSignalIdentifier.java | 36 +++++++++++++ .../signals/signalbox/PathwayHolder.java | 2 +- .../signals/signalbox/SignalBoxPathway.java | 54 +++++++++++-------- .../signals/signalbox/config/ConfigInfo.java | 8 +++ .../signalbox/config/SignalConfig.java | 1 + .../signals/signalbox/entrys/BoolEntry.java | 4 +- .../signalbox/entrys/PathEntryType.java | 3 ++ .../signalconfigs/change/hv_hv_config.json | 1 + .../signalconfigs/change/ks_ks_config.json | 2 + 16 files changed, 172 insertions(+), 51 deletions(-) create mode 100644 src/main/java/com/troblecodings/signals/signalbox/MainSignalIdentifier.java create mode 100644 src/main/java/com/troblecodings/signals/signalbox/OtherSignalIdentifier.java diff --git a/src/main/java/com/troblecodings/signals/enums/SignalBoxNetwork.java b/src/main/java/com/troblecodings/signals/enums/SignalBoxNetwork.java index 32002ce0b..088f36ed8 100644 --- a/src/main/java/com/troblecodings/signals/enums/SignalBoxNetwork.java +++ b/src/main/java/com/troblecodings/signals/enums/SignalBoxNetwork.java @@ -5,6 +5,6 @@ public enum SignalBoxNetwork { SEND_POS_ENTRY, SEND_INT_ENTRY, REMOVE_ENTRY, REQUEST_PW, REMOVE_POS, RESET_PW, SEND_GRID, SEND_PW_UPDATE, RESET_ALL_PW, SEND_CHANGED_MODES, REQUEST_LINKED_POS, NO_PW_FOUND, REQUEST_SUBSIDIARY, SEND_ZS2_ENTRY, UPDATE_RS_OUTPUT, NO_OUTPUT_UPDATE, OUTPUT_UPDATE, - RESET_SUBSIDIARY, SET_AUTO_POINT, SEND_NAME; + RESET_SUBSIDIARY, SET_AUTO_POINT, SEND_NAME, SEND_SIGNAL_REPEATER; } \ No newline at end of file diff --git a/src/main/java/com/troblecodings/signals/guis/ContainerSignalBox.java b/src/main/java/com/troblecodings/signals/guis/ContainerSignalBox.java index b646bfc6c..071fa493d 100644 --- a/src/main/java/com/troblecodings/signals/guis/ContainerSignalBox.java +++ b/src/main/java/com/troblecodings/signals/guis/ContainerSignalBox.java @@ -243,6 +243,18 @@ public void deserializeServer(final ReadBuffer buffer) { node.setCustomText(buffer.getString()); break; } + case SEND_SIGNAL_REPEATER: { + final Point point = Point.of(buffer); + final ModeSet modeSet = ModeSet.of(buffer); + final boolean state = buffer.getBoolean(); + final SignalBoxNode node = tile.getSignalBoxGrid().getNode(point); + final Optional option = node.getOption(modeSet); + if (option.isPresent()) { + option.get().setEntry(PathEntryType.SIGNAL_REPEATER, state); + } else { + node.addAndSetEntry(modeSet, PathEntryType.SIGNAL_REPEATER, state); + } + } default: break; } diff --git a/src/main/java/com/troblecodings/signals/guis/GuiSignalBox.java b/src/main/java/com/troblecodings/signals/guis/GuiSignalBox.java index cc4b44776..06e52ee49 100644 --- a/src/main/java/com/troblecodings/signals/guis/GuiSignalBox.java +++ b/src/main/java/com/troblecodings/signals/guis/GuiSignalBox.java @@ -337,6 +337,13 @@ private void setupModeSettings(final UIEntity parent, final EnumGuiMode mode, case VP: selectLink(parent, node, option, entrySet, LinkType.SIGNAL, PathEntryType.SIGNAL, mode, rotation); + final Optional opt = option.getEntry(PathEntryType.SIGNAL_REPEATER); + parent.add( + GuiElements.createBoolElement(BoolIntegerables.of("signal_repeater"), e -> { + final boolean state = e == 1 ? true : false; + sendSignalRepeater(node.getPoint(), modeSet, state); + option.setEntry(PathEntryType.SIGNAL_REPEATER, state); + }, opt.isPresent() && opt.get() ? 1 : 0)); break; case HP: { parent.add(GuiElements.createBoolElement(BoolIntegerables.of("auto_pathway"), e -> { @@ -934,6 +941,17 @@ private void sendName(final Point point, final String name) { OpenSignalsMain.network.sendTo(info.player, buffer); } + private void sendSignalRepeater(final Point point, final ModeSet mode, final boolean state) { + if (!allPacketsRecived) + return; + final WriteBuffer buffer = new WriteBuffer(); + buffer.putEnumValue(SignalBoxNetwork.SEND_SIGNAL_REPEATER); + point.writeNetwork(buffer); + mode.writeNetwork(buffer); + buffer.putBoolean(state); + OpenSignalsMain.network.sendTo(info.player, buffer); + } + private void reset() { lowerEntity.clear(); } diff --git a/src/main/java/com/troblecodings/signals/parser/FunctionParsingInfo.java b/src/main/java/com/troblecodings/signals/parser/FunctionParsingInfo.java index a29dcfb61..3d997684e 100644 --- a/src/main/java/com/troblecodings/signals/parser/FunctionParsingInfo.java +++ b/src/main/java/com/troblecodings/signals/parser/FunctionParsingInfo.java @@ -24,6 +24,7 @@ public class FunctionParsingInfo { PARAMETER_PARSER.put(ValuePack.class, FunctionParsingInfo::getPredicate); PARAMETER_PARSER.put(StringInteger.class, FunctionParsingInfo::getStringInt); PARAMETER_PARSER.put(String.class, FunctionParsingInfo::getString); + PARAMETER_PARSER.put(Boolean.class, FunctionParsingInfo::getBoolean); } public String argument; @@ -115,6 +116,10 @@ public Object getString() { return argument; } + public Object getBoolean() { + return Boolean.valueOf(argument); + } + public Map getTable() { return translationTable; } diff --git a/src/main/java/com/troblecodings/signals/parser/LogicParser.java b/src/main/java/com/troblecodings/signals/parser/LogicParser.java index eafca0772..b82c2a08e 100644 --- a/src/main/java/com/troblecodings/signals/parser/LogicParser.java +++ b/src/main/java/com/troblecodings/signals/parser/LogicParser.java @@ -49,6 +49,9 @@ private LogicParser() { TRANSLATION_TABLE.put("zs2value", new MethodInfo(String.class, "zs2value", obj -> PredicateHolder.zs2Value((String) obj[0]), String.class)); + TRANSLATION_TABLE.put("signalrepeater", new MethodInfo(Boolean.class, "signalrepeater", + obj -> PredicateHolder.signalRepeater((boolean) obj[0]), Boolean.class)); + TRANSLATION_TABLE.forEach((name, info) -> UNIVERSAL_TRANSLATION_TABLE.put(name, new MethodInfo(Map.class, name, objects -> { final Predicate original = info.blockState.apply(objects); diff --git a/src/main/java/com/troblecodings/signals/parser/PredicateHolder.java b/src/main/java/com/troblecodings/signals/parser/PredicateHolder.java index b14969659..2fb294b3f 100644 --- a/src/main/java/com/troblecodings/signals/parser/PredicateHolder.java +++ b/src/main/java/com/troblecodings/signals/parser/PredicateHolder.java @@ -63,46 +63,34 @@ public static Predicate speed(final StringInteger stringInt) { final int speed = stringInt.integer; switch (values) { case GREATER: - return s -> { - return s > speed; - }; + return s -> s > speed; case GREATEREQUALS: - return s -> { - return s >= speed; - }; + return s -> s >= speed; case EQUALS: - return s -> { - return s == speed; - }; + return s -> s == speed; case SMALLEREQUALS: - return s -> { - return s <= speed; - }; + return s -> s <= speed; case SMALLER: - return s -> { - return s < speed; - }; + return s -> s < speed; case UNEQUALS: - return s -> { - return s != speed; - }; + return s -> s != speed; default: - return s -> { - return s == speed; - }; + return s -> s == speed; } } public static Predicate zs2Value(final String value) { - return s -> { - return s.equalsIgnoreCase(value); - }; + return s -> s.equalsIgnoreCase(value); + } + + public static Predicate signalRepeater(final boolean state) { + return s -> s.booleanValue() == state; } } diff --git a/src/main/java/com/troblecodings/signals/signalbox/MainSignalIdentifier.java b/src/main/java/com/troblecodings/signals/signalbox/MainSignalIdentifier.java new file mode 100644 index 000000000..ac081c425 --- /dev/null +++ b/src/main/java/com/troblecodings/signals/signalbox/MainSignalIdentifier.java @@ -0,0 +1,36 @@ +package com.troblecodings.signals.signalbox; + +import java.util.Objects; + +import net.minecraft.core.BlockPos; + +public class MainSignalIdentifier { + + public final Point point; + public final ModeSet mode; + public final BlockPos pos; + + public MainSignalIdentifier(Point point, ModeSet mode, BlockPos pos) { + this.point = point; + this.mode = mode; + this.pos = pos; + } + + @Override + public int hashCode() { + return Objects.hash(mode, point, pos); + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + MainSignalIdentifier other = (MainSignalIdentifier) obj; + return Objects.equals(mode, other.mode) && Objects.equals(point, other.point) + && Objects.equals(pos, other.pos); + } +} \ No newline at end of file diff --git a/src/main/java/com/troblecodings/signals/signalbox/OtherSignalIdentifier.java b/src/main/java/com/troblecodings/signals/signalbox/OtherSignalIdentifier.java new file mode 100644 index 000000000..66a953fad --- /dev/null +++ b/src/main/java/com/troblecodings/signals/signalbox/OtherSignalIdentifier.java @@ -0,0 +1,36 @@ +package com.troblecodings.signals.signalbox; + +import java.util.Objects; + +import net.minecraft.core.BlockPos; + +public class OtherSignalIdentifier extends MainSignalIdentifier { + + public final boolean isRepeater; + + public OtherSignalIdentifier(Point point, ModeSet mode, BlockPos pos, + final boolean isRepeater) { + super(point, mode, pos); + this.isRepeater = isRepeater; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = super.hashCode(); + result = prime * result + Objects.hash(isRepeater); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (!super.equals(obj)) + return false; + if (getClass() != obj.getClass()) + return false; + OtherSignalIdentifier other = (OtherSignalIdentifier) obj; + return isRepeater == other.isRepeater && super.equals(obj); + } +} \ No newline at end of file diff --git a/src/main/java/com/troblecodings/signals/signalbox/PathwayHolder.java b/src/main/java/com/troblecodings/signals/signalbox/PathwayHolder.java index 415847895..ea73d9dc3 100644 --- a/src/main/java/com/troblecodings/signals/signalbox/PathwayHolder.java +++ b/src/main/java/com/troblecodings/signals/signalbox/PathwayHolder.java @@ -167,7 +167,7 @@ private void updateToNet(final SignalBoxPathway pathway) { return; final List nodes = pathway.getListOfNodes(); final WriteBuffer buffer = new WriteBuffer(); - buffer.putByte((byte) SignalBoxNetwork.SEND_PW_UPDATE.ordinal()); + buffer.putEnumValue(SignalBoxNetwork.SEND_PW_UPDATE); buffer.putInt(nodes.size()); nodes.forEach(node -> { node.getPoint().writeNetwork(buffer); diff --git a/src/main/java/com/troblecodings/signals/signalbox/SignalBoxPathway.java b/src/main/java/com/troblecodings/signals/signalbox/SignalBoxPathway.java index 95d4ba8a0..549144307 100644 --- a/src/main/java/com/troblecodings/signals/signalbox/SignalBoxPathway.java +++ b/src/main/java/com/troblecodings/signals/signalbox/SignalBoxPathway.java @@ -49,9 +49,10 @@ public class SignalBoxPathway { private Point lastPoint = new Point(); private int speed = -1; private String zs2Value = ""; - private Optional> signalPositions = Optional.empty(); - private Optional lastSignal = Optional.empty(); - private ImmutableList distantSignalPositions = ImmutableList.of(); + private Optional> signalPositions = Optional + .empty(); + private Optional lastSignal = Optional.empty(); + private ImmutableList distantSignalPositions = ImmutableList.of(); private Map modeGrid = null; private boolean emptyOrBroken = false; private Level world; @@ -86,7 +87,7 @@ public SignalBoxPathway(final Map modeGrid, private void initalize() { final AtomicInteger atomic = new AtomicInteger(Integer.MAX_VALUE); final AtomicReference zs2Value = new AtomicReference<>((byte) -1); - final Builder distantPosBuilder = ImmutableList.builder(); + final Builder distantPosBuilder = ImmutableList.builder(); mapOfBlockingPositions.clear(); mapOfResetPositions.clear(); foreachEntry((optionEntry, node) -> { @@ -102,19 +103,25 @@ private void initalize() { final Rotation rotation = SignalBoxUtil .getRotationFromDelta(node.getPoint().delta(path.point1)); for (final EnumGuiMode mode : Arrays.asList(EnumGuiMode.VP, EnumGuiMode.RS)) { - node.getOption(new ModeSet(mode, rotation)) - .ifPresent(option -> option.getEntry(PathEntryType.SIGNAL) - .ifPresent(position -> distantPosBuilder.add(position))); + final ModeSet modeSet = new ModeSet(mode, rotation); + node.getOption(modeSet).ifPresent( + option -> option.getEntry(PathEntryType.SIGNAL).ifPresent(position -> { + final Optional repeaterOption = option + .getEntry(PathEntryType.SIGNAL_REPEATER); + distantPosBuilder.add( + new OtherSignalIdentifier(node.getPoint(), modeSet, position, + repeaterOption.isPresent() && repeaterOption.get())); + })); } }, null); this.distantSignalPositions = distantPosBuilder.build(); final SignalBoxNode firstNode = this.listOfNodes.get(this.listOfNodes.size() - 1); this.firstPoint = firstNode.getPoint(); - final BlockPos firstPos = makeFromNext(type, firstNode, + final MainSignalIdentifier firstPos = makeFromNext(type, firstNode, this.listOfNodes.get(this.listOfNodes.size() - 2), Rotation.NONE); final SignalBoxNode lastNode = this.listOfNodes.get(0); this.lastPoint = lastNode.getPoint(); - final BlockPos lastPos = makeFromNext(type, lastNode, this.listOfNodes.get(1), + final MainSignalIdentifier lastPos = makeFromNext(type, lastNode, this.listOfNodes.get(1), Rotation.CLOCKWISE_180); if (lastPos != null) { lastSignal = Optional.of(lastPos); @@ -128,15 +135,16 @@ private void initalize() { this.zs2Value = JsonEnumHolder.ZS32.getObjFromID(Byte.toUnsignedInt(zs2Value.get())); } - private BlockPos makeFromNext(final PathType type, final SignalBoxNode first, + private MainSignalIdentifier makeFromNext(final PathType type, final SignalBoxNode first, final SignalBoxNode next, final Rotation pRotation) { final Point delta = first.getPoint().delta(next.getPoint()); final Rotation rotation = SignalBoxUtil.getRotationFromDelta(delta).getRotated(pRotation); for (final EnumGuiMode mode : type.getModes()) { - final BlockPos possiblePosition = first.getOption(new ModeSet(mode, rotation)) + final ModeSet modeSet = new ModeSet(mode, rotation); + final BlockPos possiblePosition = first.getOption(modeSet) .flatMap(option -> option.getEntry(PathEntryType.SIGNAL)).orElse(null); if (possiblePosition != null) - return possiblePosition; + return new MainSignalIdentifier(first.getPoint(), modeSet, possiblePosition); } return null; } @@ -239,26 +247,26 @@ public void updatePathwaySignals() { final PosIdentifier identifier = new PosIdentifier(tilePos, world); SignalStateInfo lastInfo = null; if (lastSignal.isPresent()) { - final Signal nextSignal = SignalBoxHandler.getSignal(identifier, lastSignal.get()); + final Signal nextSignal = SignalBoxHandler.getSignal(identifier, lastSignal.get().pos); if (nextSignal != null) - lastInfo = new SignalStateInfo(world, lastSignal.get(), nextSignal); + lastInfo = new SignalStateInfo(world, lastSignal.get().pos, nextSignal); } final SignalStateInfo lastSignalInfo = lastInfo; this.signalPositions.ifPresent(entry -> { if (isBlocked) return; - final Signal first = SignalBoxHandler.getSignal(identifier, entry.getKey()); + final Signal first = SignalBoxHandler.getSignal(identifier, entry.getKey().pos); if (first == null) return; - final SignalStateInfo firstInfo = new SignalStateInfo(world, entry.getKey(), first); + final SignalStateInfo firstInfo = new SignalStateInfo(world, entry.getKey().pos, first); SignalConfig.change(new ConfigInfo(firstInfo, lastSignalInfo, speed, zs2Value, type)); }); distantSignalPositions.forEach(position -> { - final Signal current = SignalBoxHandler.getSignal(identifier, position); + final Signal current = SignalBoxHandler.getSignal(identifier, position.pos); if (current == null) return; - SignalConfig.change(new ConfigInfo(new SignalStateInfo(world, position, current), - lastSignalInfo, speed, zs2Value, type)); + SignalConfig.change(new ConfigInfo(new SignalStateInfo(world, position.pos, current), + lastSignalInfo, speed, zs2Value, type, position.isRepeater)); }); } @@ -269,20 +277,20 @@ public void resetPathway() { private void resetFirstSignal() { this.signalPositions.ifPresent(entry -> { final Signal current = SignalBoxHandler.getSignal(new PosIdentifier(tilePos, world), - entry.getKey()); + entry.getKey().pos); if (current == null) return; - SignalConfig.reset(new SignalStateInfo(world, entry.getKey(), current)); + SignalConfig.reset(new SignalStateInfo(world, entry.getKey().pos, current)); }); } private void resetOther() { distantSignalPositions.forEach(position -> { final Signal current = SignalBoxHandler.getSignal(new PosIdentifier(tilePos, world), - position); + position.pos); if (current == null) return; - SignalConfig.reset(new SignalStateInfo(world, position, current)); + SignalConfig.reset(new SignalStateInfo(world, position.pos, current)); }); } diff --git a/src/main/java/com/troblecodings/signals/signalbox/config/ConfigInfo.java b/src/main/java/com/troblecodings/signals/signalbox/config/ConfigInfo.java index c7e09381b..de7b3498f 100644 --- a/src/main/java/com/troblecodings/signals/signalbox/config/ConfigInfo.java +++ b/src/main/java/com/troblecodings/signals/signalbox/config/ConfigInfo.java @@ -10,13 +10,21 @@ public class ConfigInfo { public final int speed; public final String zs2Value; public final PathType type; + public final boolean isSignalRepeater; public ConfigInfo(final SignalStateInfo currentinfo, final SignalStateInfo nextinfo, final int speed, final String zs2Value, final PathType type) { + this(currentinfo, nextinfo, speed, zs2Value, type, false); + } + + public ConfigInfo(final SignalStateInfo currentinfo, final SignalStateInfo nextinfo, + final int speed, final String zs2Value, final PathType type, + final boolean isSignalRepeater) { this.currentinfo = currentinfo; this.nextinfo = nextinfo; this.speed = speed; this.zs2Value = zs2Value; this.type = type; + this.isSignalRepeater = isSignalRepeater; } } \ No newline at end of file diff --git a/src/main/java/com/troblecodings/signals/signalbox/config/SignalConfig.java b/src/main/java/com/troblecodings/signals/signalbox/config/SignalConfig.java index b49775ac9..8a082c378 100644 --- a/src/main/java/com/troblecodings/signals/signalbox/config/SignalConfig.java +++ b/src/main/java/com/troblecodings/signals/signalbox/config/SignalConfig.java @@ -70,6 +70,7 @@ private static void changeIfPresent(final List values, final Con } object.put(Integer.class, info.speed); object.put(String.class, info.zs2Value); + object.put(Boolean.class, info.isSignalRepeater); final Map propertiesToSet = new HashMap<>(); values.forEach(property -> { if (property.test(object)) { diff --git a/src/main/java/com/troblecodings/signals/signalbox/entrys/BoolEntry.java b/src/main/java/com/troblecodings/signals/signalbox/entrys/BoolEntry.java index ab3e7d471..3a1affb26 100644 --- a/src/main/java/com/troblecodings/signals/signalbox/entrys/BoolEntry.java +++ b/src/main/java/com/troblecodings/signals/signalbox/entrys/BoolEntry.java @@ -60,11 +60,11 @@ public void accept(final int value) { @Override public void readNetwork(final ReadBuffer buffer) { - value = buffer.getByte() != 0; + value = buffer.getBoolean(); } @Override public void writeNetwork(final WriteBuffer buffer) { - buffer.putByte((byte) (value ? 1 : 0)); + buffer.putBoolean(value); } } \ No newline at end of file diff --git a/src/main/java/com/troblecodings/signals/signalbox/entrys/PathEntryType.java b/src/main/java/com/troblecodings/signals/signalbox/entrys/PathEntryType.java index 873a2ef02..7d6bf5a1e 100644 --- a/src/main/java/com/troblecodings/signals/signalbox/entrys/PathEntryType.java +++ b/src/main/java/com/troblecodings/signals/signalbox/entrys/PathEntryType.java @@ -41,6 +41,9 @@ private PathEntryType(final Class> entryClass, final Str public static final PathEntryType ZS2 = new PathEntryType<>(ByteEntry.class, "zs2"); + public static final PathEntryType SIGNAL_REPEATER = new PathEntryType<>( + BoolEntry.class, "signal_repeater"); + private static final class EnumPathUsageEntry extends EnumEntry { public EnumPathUsageEntry() { diff --git a/src/main/resources/assets/opensignals/signalconfigs/change/hv_hv_config.json b/src/main/resources/assets/opensignals/signalconfigs/change/hv_hv_config.json index 28a2fb098..8bb91f8f9 100644 --- a/src/main/resources/assets/opensignals/signalconfigs/change/hv_hv_config.json +++ b/src/main/resources/assets/opensignals/signalconfigs/change/hv_hv_config.json @@ -26,6 +26,7 @@ "(config(zs3.Z13) || config(zs3plate.Z13))": ["zs3v.Z13"], "(config(zs3.Z14) || config(zs3plate.Z14))": ["zs3v.Z14"], "(config(zs3.Z15) || config(zs3plate.Z15))": ["zs3v.Z15"], + "signalRepeater(true)": ["VRLIGHT.TRUE"], "speed(<.1) || speed(>.15)": ["stopsignal.HP1", "hphome.HP1", "hpblock.HP1"], "speed(==.1)": ["zs3.Z1", "stopsignal.HP2", "hphome.HP2", "hpblock.HP1"], diff --git a/src/main/resources/assets/opensignals/signalconfigs/change/ks_ks_config.json b/src/main/resources/assets/opensignals/signalconfigs/change/ks_ks_config.json index 025fa1757..7eee750b8 100644 --- a/src/main/resources/assets/opensignals/signalconfigs/change/ks_ks_config.json +++ b/src/main/resources/assets/opensignals/signalconfigs/change/ks_ks_config.json @@ -24,8 +24,10 @@ "(config(zs3.Z15) || config(zs3plate.Z15))": ["zs3v.Z15"], "map(stop)": ["kombisignal.KS2", "kombisignal_main.KS1", "kombisignal_distant.KS2", "zs3v.OFF", "zs2v.OFF"], + "map(stop) && signalRepeater(true)": ["kombisignal_distant.KS2_REPEAT"], "map(drive)": ["kombisignal.KS1", "kombisignal_main.KS1", "kombisignal_distant.KS1"], "map(drive) && map(zs3)": ["kombisignal.KS1_BLINK", "kombisignal_main.KS1", "kombisignal_distant.KS1_BLINK"], + "map(drive) && map(zs3) && signalRepeater(true)": ["kombisignal_distant.KS1_BLINK_REPEAT"], "speed(==.1)": ["zs3.Z1"], "speed(==.2)": ["zs3.Z2"],