use of mcjty.rftoolscontrol.api.code.Opcode in project RFToolsControl by McJty.
the class GuiProgrammer method handleNewIconOverlay.
// Try to make a connection to this one in case there are no connections yet
private void handleNewIconOverlay(IIcon icon, int x, int y) {
// We didn't move, do nothing
if (x == iconLeavesFromX && y == iconLeavesFromY) {
return;
}
Opcode opcode = Opcodes.OPCODES.get(icon.getID());
if (opcode.isEvent()) {
return;
}
tryConnectToThis(x - 1, y, icon, Connection.RIGHT);
tryConnectToThis(x + 1, y, icon, Connection.LEFT);
tryConnectToThis(x, y - 1, icon, Connection.DOWN);
tryConnectToThis(x, y + 1, icon, Connection.UP);
}
use of mcjty.rftoolscontrol.api.code.Opcode in project RFToolsControl by McJty.
the class GridInstance method readFromJson.
public static GridInstance readFromJson(JsonElement element) {
JsonObject gridObject = element.getAsJsonObject();
String id = gridObject.get("id").getAsString();
GridInstance.Builder builder = GridInstance.builder(id);
if (gridObject.has("primary")) {
String primary = gridObject.get("primary").getAsString();
builder.primaryConnection(Connection.getConnection(primary));
}
if (gridObject.has("secondary")) {
String secondary = gridObject.get("secondary").getAsString();
builder.secondaryConnection(Connection.getConnection(secondary));
}
Opcode opcode = Opcodes.OPCODES.get(id);
if (opcode == null) {
// Sanity check in case an opcode got removed
return null;
}
List<ParameterDescription> parameters = opcode.getParameters();
JsonArray parameterArray = gridObject.get("parameters").getAsJsonArray();
for (int i = 0; i < parameterArray.size(); i++) {
JsonObject parObject = parameterArray.get(i).getAsJsonObject();
Parameter parameter = ParameterTools.readFromJson(parObject);
if (parameter.getParameterType() != parameters.get(i).getType()) {
// Sanity check
builder.parameter(Parameter.builder().type(parameters.get(i).getType()).value(ParameterValue.constant(null)).build());
} else {
builder.parameter(parameter);
}
}
return builder.build();
}
use of mcjty.rftoolscontrol.api.code.Opcode in project RFToolsControl by McJty.
the class GridInstance method readFromNBT.
public static GridInstance readFromNBT(NBTTagCompound tag) {
String opcodeid = tag.getString("id");
GridInstance.Builder builder = GridInstance.builder(opcodeid);
if (tag.hasKey("prim")) {
builder.primaryConnection(Connection.getConnection(tag.getString("prim")));
}
if (tag.hasKey("sec")) {
builder.secondaryConnection(Connection.getConnection(tag.getString("sec")));
}
Opcode opcode = Opcodes.OPCODES.get(opcodeid);
if (opcode == null) {
// Sanity check in case an opcode got removed
return null;
}
List<ParameterDescription> parameters = opcode.getParameters();
NBTTagList parList = tag.getTagList("pars", Constants.NBT.TAG_COMPOUND);
for (int i = 0; i < parList.tagCount(); i++) {
NBTTagCompound parTag = (NBTTagCompound) parList.get(i);
Parameter parameter = ParameterTools.readFromNBT(parTag);
if (parameter.getParameterType() != parameters.get(i).getType()) {
// Sanity check
builder.parameter(Parameter.builder().type(parameters.get(i).getType()).value(ParameterValue.constant(null)).build());
} else {
builder.parameter(parameter);
}
}
return builder.build();
}
use of mcjty.rftoolscontrol.api.code.Opcode in project RFToolsControl by McJty.
the class CompiledCard method compile.
public static CompiledCard compile(ProgramCardInstance cardInstance) {
if (cardInstance == null) {
return null;
}
CompiledCard card = new CompiledCard();
Map<GridPos, GridInstance> gridInstances = cardInstance.getGridInstances();
// First find the indices of all compiled grid instances
Map<GridPos, Integer> posToIndex = new HashMap<>();
for (Map.Entry<GridPos, GridInstance> entry : gridInstances.entrySet()) {
GridPos location = entry.getKey();
posToIndex.put(location, posToIndex.size());
}
// Index of a dummy stop opcode that we can use to go too in case there is no real connection
int stopIdx = posToIndex.size();
for (Map.Entry<GridPos, GridInstance> entry : gridInstances.entrySet()) {
GridPos location = entry.getKey();
GridInstance grid = entry.getValue();
String id = grid.getId();
Opcode opcode = Opcodes.OPCODES.get(id);
GridPos primaryOutput = grid.getPrimaryConnection() != null ? grid.getPrimaryConnection().offset(location) : null;
GridPos secondaryOutput = grid.getSecondaryConnection() != null ? grid.getSecondaryConnection().offset(location) : null;
CompiledOpcode.Builder opcodeBuilder = CompiledOpcode.builder().opcode(opcode);
opcodeBuilder.grid(location.getX(), location.getY());
if (primaryOutput != null && posToIndex.containsKey(primaryOutput)) {
opcodeBuilder.primaryIndex(posToIndex.get(primaryOutput));
} else {
opcodeBuilder.primaryIndex(stopIdx);
}
if (secondaryOutput != null && posToIndex.containsKey(secondaryOutput)) {
opcodeBuilder.secondaryIndex(posToIndex.get(secondaryOutput));
} else {
opcodeBuilder.secondaryIndex(stopIdx);
}
List<ParameterDescription> parameters = opcode.getParameters();
boolean single = false;
for (int i = 0; i < grid.getParameters().size(); i++) {
Parameter parameter = grid.getParameters().get(i);
if (i < parameters.size() && "single".equals(parameters.get(i).getName())) {
single = TypeConverters.convertToBool(parameter);
}
opcodeBuilder.parameter(parameter);
}
if (opcode.isEvent()) {
card.events.putIfAbsent(opcode, new ArrayList<>());
card.events.get(opcode).add(new CompiledEvent(card.opcodes.size(), single));
}
card.opcodes.add(opcodeBuilder.build());
}
card.opcodes.add(CompiledOpcode.builder().opcode(Opcodes.DO_STOP_OR_RESUME).build());
for (Opcode opcode : Opcodes.OPCODES.values()) {
if (!card.events.containsKey(opcode)) {
card.events.put(opcode, Collections.emptyList());
}
}
return card;
}
Aggregations