package li.cil.oc.api.nanomachines; /** * The nanomachine controller is responsible for keeping track of the current * layout of neural connections (i.e. how nanomachine "inputs" connect to * behaviors, directly or indirectly). * <p/> * Each input can connect to one or more nodes. A node can either be a * behavior, or an indirect connection, which in turn is connected to one * or more behaviors (there is at maximum one layer of indirection). Each * indirection may trigger one or more behaviors, but may also require one * or more inputs to activate its outputs. * <p/> * Each node, input or indirection, will only connect to one or two other * nodes, to keep randomization at a somewhat manageable level, but to still * allow for some optimization by re-rolling the connections. * <p/> * This interface is not meant to be implemented externally. To get a reference * to a controller, use {@link li.cil.oc.api.Nanomachines#getController}. */ public interface Controller { /** * Reconfigure the neural connections managed by this controller. This * will lead to the system being unavailable for a short while, in which * the neural connections are rebuilt in a new configuration. In addition, * some debuffs will be applied to the player. * <p/> * This will reset all inputs to disabled and deactivate all previously * active behaviors. * * @return the controller itself, for chaining / convenience. */ Controller reconfigure(); /** * Get the number of inputs available. * <p/> * This number depends on the total number of behaviors available, to keep * randomization at a manageable level. It is computed internally and * based on a configuration value. * * @return the total number of available inputs. */ int getTotalInputCount(); /** * Get the number of inputs that may be active at the same time * before negative effects are applied to the player. * <p/> * The number of active inputs may exceed this value, but this will * have negative effects on the player. * * @return the number of inputs that may safely be active at a time. */ int getSafeActiveInputs(); /** * Get the total number of inputs that may be active at the same time. * <p/> * The number of active inputs cannot exceed this value. * * @return the number of inputs that may be active at a time. */ int getMaxActiveInputs(); /** * Get whether the input with the specified index is active. * * @param index the input index. * @return whether the input is active. * @throws IndexOutOfBoundsException if <code>index < 0</code> or <code>index >= getInputCount</code>. */ boolean getInput(int index); /** * Set the state of the input with the specified index. * <p/> * This will fail if too many inputs are active already. It will also * always fail when called on the client. * * @param index the input index. * @param value whether the input should be active. * @return whether the input was changed successfully. * @throws IndexOutOfBoundsException if <code>index < 0</code> or <code>index >= getInputCount</code>. */ boolean setInput(int index, boolean value); /** * Get the list of currently active behaviors, based on the current input states. * <p/> * Note that behaviors may behave differently depending on how many active * inputs they have. Behaviors in the returned list will have at least one * active input. * * @return the list of currently active behaviors. Never <tt>null</tt>. */ Iterable<Behavior> getActiveBehaviors(); /** * Get the number of active inputs for the specified behavior. * * @param behavior the behavior to get the number of inputs for. * @return the number of inputs active for the specified behavior. */ int getInputCount(Behavior behavior); // ----------------------------------------------------------------------- // /** * The amount of energy stored by this nanomachine controller. */ double getLocalBuffer(); /** * The maximum amount of energy stored by this nanomachine controller. */ double getLocalBufferSize(); /** * Try to apply the specified delta to the controller's buffer. * <p/> * A negative value will drain energy from the buffer, a positive value * will inject energy into the buffer. * * @param delta the amount of energy to consume or store. * @return the remainder of the delta that could not be applied. */ double changeBuffer(double delta); }