Skip to content

Commit

Permalink
[PlaybackSerialiser] Moved parts of filecommand handling to the registry
Browse files Browse the repository at this point in the history
  • Loading branch information
ScribbleTAS committed Jun 8, 2024
1 parent bda3d7f commit d935813
Show file tree
Hide file tree
Showing 6 changed files with 108 additions and 21 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -661,8 +661,8 @@ public boolean equals(Object other) {

public static class CommentContainer implements Serializable{

List<String> inlineComments;
List<String> endlineComments;
private List<String> inlineComments;
private List<String> endlineComments;

public CommentContainer() {
this(new ArrayList<>(), new ArrayList<>());
Expand All @@ -684,6 +684,10 @@ public void addEndlineComment(String endlineComment) {
public List<String> getInlineComments() {
return inlineComments;
}

public List<String> getEndlineComments() {
return endlineComments;
}
}

/**
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
package com.minecrafttas.tasmod.playback.filecommands;

import java.util.List;
import java.util.Queue;

import com.minecrafttas.tasmod.playback.PlaybackControllerClient.TickContainer;
import com.minecrafttas.tasmod.playback.filecommands.PlaybackFileCommand.PlaybackFileCommandExtension;

public class PlaybackFileCommand{

Expand Down Expand Up @@ -41,11 +43,11 @@ public String[] controlByteNames() {

public void onPlayback(long tick, TickContainer container) {};

public List<PlaybackFileCommand> onSerialiseInlineComment(long tick, TickContainer container) {
protected Queue<PlaybackFileCommand> onSerialiseInlineComment(long tick, TickContainer container) {
return null;
}

public List<PlaybackFileCommand> onSerialiseEndlineComment(long currentTick, TickContainer container) {
protected Queue<PlaybackFileCommand> onSerialiseEndlineComment(long currentTick, TickContainer container) {
return null;
}

Expand All @@ -67,6 +69,14 @@ public void setEnabled(boolean enabled) {
this.enabled = enabled;
}

public static Queue<PlaybackFileCommand> getQueueInlineComment(PlaybackFileCommandExtension extension, long currentTick, TickContainer container) {
return extension.onSerialiseInlineComment(currentTick, container);
}

public static Queue<PlaybackFileCommand> getQueueEndlineComment(PlaybackFileCommandExtension extension, long currentTick, TickContainer container) {
return extension.onSerialiseEndlineComment(currentTick, container);
}

}
}

Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,14 @@
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Queue;

import com.minecrafttas.mctcommon.registry.AbstractRegistry;
import com.minecrafttas.tasmod.TASmod;
import com.minecrafttas.tasmod.events.EventPlaybackClient;
import com.minecrafttas.tasmod.playback.PlaybackControllerClient.TickContainer;
import com.minecrafttas.tasmod.playback.filecommands.PlaybackFileCommand.PlaybackFileCommandExtension;
import com.minecrafttas.tasmod.util.TASmodRegistry;

public class PlaybackFileCommandsRegistry extends AbstractRegistry<String, PlaybackFileCommandExtension> implements EventPlaybackClient.EventRecordTick, EventPlaybackClient.EventPlaybackTick {

Expand Down Expand Up @@ -80,4 +82,47 @@ public void onRecordTick(long index, TickContainer container) {
extension.onPlayback(index, container);
});
}

public List<List<PlaybackFileCommand>> handleOnSerialiseInline(long currentTick, TickContainer container) {
return onSerialise(currentTick, container, PlaybackFileCommandExtension::getQueueInlineComment);
}

public List<List<PlaybackFileCommand>> handleOnSerialiseEndline(long currentTick, TickContainer container) {
return onSerialise(currentTick, container, PlaybackFileCommandExtension::getQueueEndlineComment);
}

private List<List<PlaybackFileCommand>> onSerialise(long currentTick, TickContainer container, OnSerialise serialisationMethod){
List<List<PlaybackFileCommand>> out = new ArrayList<>();
List<PlaybackFileCommandExtension> enabledExtensions = getEnabled();

List<Queue<PlaybackFileCommand>> commandQueues = new ArrayList<>();
for (PlaybackFileCommandExtension playbackFileCommandExtension : enabledExtensions) {
Queue<PlaybackFileCommand> fileCommandQueue = serialisationMethod.accept(playbackFileCommandExtension, currentTick, container);
if(fileCommandQueue!=null)
commandQueues.add(fileCommandQueue);
}

int biggestSize = 0;
for (Queue<PlaybackFileCommand> queue : commandQueues) {
if(queue.size()>biggestSize) {
biggestSize = queue.size();
}
}

for (int i = 0; i < biggestSize; i++) {
List<PlaybackFileCommand> commandListForOneLine = new ArrayList<>();
for (Queue<PlaybackFileCommand> queue : commandQueues) {
PlaybackFileCommand fc = queue.poll();
if(fc!=null)
commandListForOneLine.add(fc);
}
out.add(commandListForOneLine);
}
return out;
}

@FunctionalInterface
private interface OnSerialise{
Queue<PlaybackFileCommand> accept(PlaybackFileCommandExtension extension, long currentTick, TickContainer container);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ public static void saveToFile(File file, BigArrayList<TickContainer> container,
writerThread.addLine(line);
}

BigArrayList<String> tickLines = flavor.serialise(container, filecommandextensionList);
BigArrayList<String> tickLines = flavor.serialise(container);
for (long i = 0; i < tickLines.size(); i++) {
writerThread.addLine(tickLines.get(i));
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,12 @@
package com.minecrafttas.tasmod.playback.tasfile.flavor;

import java.io.Serializable;
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Queue;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
Expand Down Expand Up @@ -105,27 +104,31 @@ protected void serialiseMetadataValue(List<String> out, LinkedHashMap<String, St
});
}

public BigArrayList<String> serialise(BigArrayList<TickContainer> inputs, List<PlaybackFileCommandExtension> filecommandextensionList) {
public BigArrayList<String> serialise(BigArrayList<TickContainer> inputs) {
BigArrayList<String> out = new BigArrayList<>();

for (int i = 0; i < inputs.size(); i++) {
currentTick = i;
TickContainer container = inputs.get(i);
serialiseContainer(out, container, filecommandextensionList);
serialiseContainer(out, container);
}
return out;
}

protected void serialiseContainer(BigArrayList<String> out, TickContainer container, List<PlaybackFileCommandExtension> filecommandExtensionList) {
protected void serialiseContainer(BigArrayList<String> out, TickContainer container) {
List<String> serialisedKeyboard = serialiseKeyboard(container.getKeyboard());
List<String> serialisedMouse = serialiseMouse(container.getMouse());
List<String> serialisedCameraAngle = serialiseCameraAngle(container.getCameraAngle());

List<List<PlaybackFileCommand>> fileCommandsInline = new ArrayList<>();
List<List<PlaybackFileCommand>> fileCommandsEndline = new ArrayList<>();
List<List<PlaybackFileCommand>> fileCommandsInline = TASmodRegistry.PLAYBACK_FILE_COMMAND.handleOnSerialiseInline(currentTick, container);
List<List<PlaybackFileCommand>> fileCommandsEndline = TASmodRegistry.PLAYBACK_FILE_COMMAND.handleOnSerialiseEndline(currentTick, container);

List<String> serialisedInlineCommments = serialiseInlineComments(container.getComments(), fileCommandsInline);
List<String> serialisedEndlineComments = serialiseEndlineComments(container.getComments(), fileCommandsEndline);
CommentContainer comments = container.getComments();
if(comments == null) {
comments = new CommentContainer(new ArrayList<>(), new ArrayList<>());
}
List<String> serialisedInlineCommments = serialiseInlineComments(comments.getInlineComments(), fileCommandsInline);
List<String> serialisedEndlineComments = serialiseEndlineComments(comments.getEndlineComments(), fileCommandsEndline);


addAll(out, serialisedInlineCommments);
Expand All @@ -136,6 +139,14 @@ protected void serialiseContainer(BigArrayList<String> out, TickContainer contai
protected String serialiseFileCommand(PlaybackFileCommand fileCommand) {
return String.format("$%s(%s);", fileCommand.getName(), String.join(", ", fileCommand.getArgs()));
}

protected String serialiseMultipleFileCommands(List<PlaybackFileCommand> fileCommands) {
List<String> serialisedCommands = new ArrayList<>();
for(PlaybackFileCommand command : fileCommands) {
serialisedCommands.add(serialiseFileCommand(command));
}
return String.join(" ", serialisedCommands);
}

protected List<String> serialiseKeyboard(VirtualKeyboard keyboard) {
List<String> out = new ArrayList<>();
Expand All @@ -162,21 +173,33 @@ protected List<String> serialiseCameraAngle(VirtualCameraAngle cameraAngle) {
return out;
}

protected List<String> serialiseInlineComments(CommentContainer container, List<List<PlaybackFileCommand>> fileCommandsInline) {
protected List<String> serialiseInlineComments(List<String> inlineComments, List<List<PlaybackFileCommand>> fileCommandsInline) {
List<String> out = new ArrayList<>();
if (container == null) {
if (inlineComments == null) {
return out;
}
for (String comment : container.getInlineComments()) {

Queue<List<PlaybackFileCommand>> fcListQueue = new ConcurrentLinkedQueue<>(fileCommandsInline);

for (String comment : inlineComments) {
String serialisedFileCommand = serialiseMultipleFileCommands(fcListQueue.poll());

if (comment != null) {
out.add("// " + comment);
out.add(String.format("// %s %s", serialisedFileCommand, comment));
}
}

while (!fcListQueue.isEmpty()) {
String serialisedFileCommand = serialiseMultipleFileCommands(fcListQueue.poll());

out.add(String.format("// %s", serialisedFileCommand));
}

return out;
}

protected List<String> serialiseEndlineComments(CommentContainer container, List<List<PlaybackFileCommand>> fileCommandsEndline) {
return serialiseInlineComments(container, fileCommandsEndline);
protected List<String> serialiseEndlineComments(List<String> endlineComments, List<List<PlaybackFileCommand>> fileCommandsEndline) {
return serialiseInlineComments(endlineComments, fileCommandsEndline);
}

protected void mergeInputs(BigArrayList<String> out, List<String> serialisedKeyboard, List<String> serialisedMouse, List<String> serialisedCameraAngle, List<String> serialisedEndlineComments) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,11 @@ void testSerialiseFlavorname() {
assertIterableEquals(expected, actual);
}

@Test
void testSerialiseHeaderStart() {
assertEquals("##################### TASFile ####################", headerStart());
}

/**
* Test serialising metadata part of the header
*/
Expand Down Expand Up @@ -163,7 +168,7 @@ void testSerialiseContainer() {
// Create container and fill actual
TickContainer container = new TickContainer(keyboard, mouse, angle);
BigArrayList<String> actual = new BigArrayList<>();
serialiseContainer(actual, container, new ArrayList<>());
serialiseContainer(actual, container);

// Fill expected
BigArrayList<String> expected = new BigArrayList<>();
Expand Down

0 comments on commit d935813

Please sign in to comment.