diff --git a/craftbook-sponge/src/main/java/com/sk89q/craftbook/sponge/mechanics/ics/ICManager.java b/craftbook-sponge/src/main/java/com/sk89q/craftbook/sponge/mechanics/ics/ICManager.java index e7a22ae3e5..327053fe82 100644 --- a/craftbook-sponge/src/main/java/com/sk89q/craftbook/sponge/mechanics/ics/ICManager.java +++ b/craftbook-sponge/src/main/java/com/sk89q/craftbook/sponge/mechanics/ics/ICManager.java @@ -21,6 +21,7 @@ import com.sk89q.craftbook.sponge.mechanics.ics.chips.logic.CombinationLock; import com.sk89q.craftbook.sponge.mechanics.ics.chips.logic.Counter; import com.sk89q.craftbook.sponge.mechanics.ics.chips.logic.Dispatcher; +import com.sk89q.craftbook.sponge.mechanics.ics.chips.logic.DownCounter; import com.sk89q.craftbook.sponge.mechanics.ics.chips.logic.EdgeTriggerDFlipFlop; import com.sk89q.craftbook.sponge.mechanics.ics.chips.logic.FullAdder; import com.sk89q.craftbook.sponge.mechanics.ics.chips.logic.FullSubtractor; @@ -100,6 +101,7 @@ class ICManager { registerICType(new ICType<>("MC3050", "COMBO", "Combination Lock", "Outputs high if the correct combination is inputed", new CombinationLock.Factory(), "3ISO")); + registerICType(new ICType<>("MC3101", "DOWN COUNTER", "Down Counter", "Decrements on redstone signal, outputs high when reset.", new DownCounter.Factory(), "3ISO")); registerICType(new ICType<>("MC3102", "COUNTER", "Counter", "Increments on redstone signal, outputs high when reset.", new Counter.Factory(), "3ISO")); registerICType(new ICType<>("MC3300", "ROM SET", "ROM Set", "Sets the memory state for a file for usage in the MemorySetter/Access IC group.", new MemorySetter.Factory(), "3ISO")); diff --git a/craftbook-sponge/src/main/java/com/sk89q/craftbook/sponge/mechanics/ics/chips/logic/DownCounter.java b/craftbook-sponge/src/main/java/com/sk89q/craftbook/sponge/mechanics/ics/chips/logic/DownCounter.java new file mode 100644 index 0000000000..822c10ec09 --- /dev/null +++ b/craftbook-sponge/src/main/java/com/sk89q/craftbook/sponge/mechanics/ics/chips/logic/DownCounter.java @@ -0,0 +1,144 @@ +/* + * CraftBook Copyright (C) 2010-2017 sk89q + * CraftBook Copyright (C) 2011-2017 me4502 + * CraftBook Copyright (C) Contributors + * + * This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public + * License as published by the Free + * Software Foundation, either version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this program. If not, + * see . + */ +package com.sk89q.craftbook.sponge.mechanics.ics.chips.logic; + +import com.sk89q.craftbook.core.util.RegexUtil; +import com.sk89q.craftbook.sponge.mechanics.ics.IC; +import com.sk89q.craftbook.sponge.mechanics.ics.InvalidICException; +import com.sk89q.craftbook.sponge.mechanics.ics.factory.ICFactory; +import com.sk89q.craftbook.sponge.util.SignUtil; +import org.spongepowered.api.entity.living.player.Player; +import org.spongepowered.api.text.Text; +import org.spongepowered.api.world.Location; +import org.spongepowered.api.world.World; + +import java.util.List; + +public class DownCounter extends IC { + + private int resetVal; + private boolean inf; + + public DownCounter(ICFactory icFactory, Location block) { + super(icFactory, block); + } + + @Override + public void create(Player player, List lines) throws InvalidICException { + super.create(player, lines); + + String[] config = RegexUtil.COLON_PATTERN.split(SignUtil.getTextRaw(lines.get(2))); + + resetVal = 0; + inf = false; + try { + resetVal = Integer.parseInt(config[0]); + inf = config[1].equals("INF"); + } catch (NumberFormatException e) { + resetVal = 5; + } catch (ArrayIndexOutOfBoundsException e) { + inf = false; + } catch (Exception ignored) { + } + + lines.set(2, Text.of(resetVal + (inf ? ":INF" : ""))); + } + + @Override + public void load() { + super.load(); + + String[] config = RegexUtil.COLON_PATTERN.split(getLine(2)); + + resetVal = 0; + inf = false; + try { + resetVal = Integer.parseInt(config[0]); + inf = config[1].equals("INF"); + } catch (NumberFormatException e) { + resetVal = 5; + } catch (ArrayIndexOutOfBoundsException e) { + inf = false; + } catch (Exception ignored) { + } + setLine(2, Text.of(resetVal + (inf ? ":INF" : ""))); + } + + @Override + public void trigger() { + int curVal; + + try { + curVal = Integer.parseInt(getLine(3)); + } catch (Exception e) { + curVal = 0; + } + + int oldVal = curVal; + // If clock input triggered + if (getPinSet().getInput(0, this)) { + if (curVal == 0) { // If we've gotten to 0, reset if infinite mode + if (inf) { + curVal = resetVal; + } + } else { + curVal --; + } + + // Set output to high if we're at 0, otherwise low + getPinSet().setOutput(0, curVal == 0, this); + } else if (getPinSet().getInput(1, this)) { + curVal = resetVal; + getPinSet().setOutput(0, false, this); + } + + // Update counter value stored on sign if it's changed + if (curVal != oldVal) { + setLine(3, Text.of(String.valueOf(curVal))); + } + } + + public static class Factory implements ICFactory { + + @Override + public DownCounter createInstance(Location location) { + return new DownCounter(this, location); + } + + @Override + public String[] getLineHelp() { + return new String[] { + "Start Value{:INF}", + "Current Value" + }; + } + + @Override + public String[][] getPinHelp() { + return new String[][] { + new String[] { + "Decrement Counter", + "Reset Counter", + "Nothing" + }, + new String[] { + "High on Counter Complete" + } + }; + } + } +} diff --git a/docs b/docs index 4fd21f86f5..d822fc9f2d 160000 --- a/docs +++ b/docs @@ -1 +1 @@ -Subproject commit 4fd21f86f52a5fee8f0ea4fff4e5901cdd6c1d6b +Subproject commit d822fc9f2db7a075f16925266436e8c3827de1bc