From ad70af4279320d0a4687a636a64b7792a743ad8c Mon Sep 17 00:00:00 2001
From: alterdekim <alterwain@protonmail.com>
Date: Sat, 4 Jan 2025 23:39:51 +0300
Subject: [PATCH] Decompiler improvement, compiler improvement x3

---
 .../java/com/alterdekim/flash/decompiler/Main.java     |  4 ++--
 .../flash/decompiler/compiler/FlashCompiler.java       |  2 +-
 .../com/alterdekim/flash/decompiler/tag/DoAction.java  | 10 ++++++----
 .../com/alterdekim/flash/decompiler/util/ByteUtil.java |  4 ++--
 4 files changed, 11 insertions(+), 9 deletions(-)

diff --git a/src/main/java/com/alterdekim/flash/decompiler/Main.java b/src/main/java/com/alterdekim/flash/decompiler/Main.java
index dd57da6..8628317 100644
--- a/src/main/java/com/alterdekim/flash/decompiler/Main.java
+++ b/src/main/java/com/alterdekim/flash/decompiler/Main.java
@@ -17,7 +17,7 @@ import java.nio.file.StandardOpenOption;
 public class Main {
     public static void main(String[] args) throws Exception {
         FlashDecompiler decompiler = new FlashDecompiler();
-        ShockwaveFile file = decompiler.loadFromFile(new File("catalogs.swf")); // D:\Documents\FlashProjects\Untitled-2.swf
+        ShockwaveFile file = decompiler.loadFromFile(new File("D:\\Documents\\FlashProjects\\Untitled-2.swf")); //
 
         DoAction da = (DoAction) file.getTags()
                 .stream()
@@ -30,6 +30,6 @@ public class Main {
         if( out.exists() ) out.delete();
         //objectMapper.writeValue(out, new Flash2Java(da).convert());
         var j2f = new Java2Flash().convert(new Flash2Java(da).convert());
-        Files.write(Path.of("./export1.swf"), new FlashCompiler(j2f).compile(), StandardOpenOption.CREATE);
+        Files.write(Path.of("export1.swf"), new FlashCompiler(j2f).compile(), StandardOpenOption.CREATE);
     }
 }
\ No newline at end of file
diff --git a/src/main/java/com/alterdekim/flash/decompiler/compiler/FlashCompiler.java b/src/main/java/com/alterdekim/flash/decompiler/compiler/FlashCompiler.java
index c0e613e..c8afb3e 100644
--- a/src/main/java/com/alterdekim/flash/decompiler/compiler/FlashCompiler.java
+++ b/src/main/java/com/alterdekim/flash/decompiler/compiler/FlashCompiler.java
@@ -33,7 +33,7 @@ public class FlashCompiler {
         d1.addAll(new End().compile());
         // fileSize u32
         log.info("fileSize u32: {}", d1.size());
-        data.addAll(ByteUtil.intToBytes32(d1.size()));
+        data.addAll(ByteUtil.intToBytes32(d1.size()+data.size()+4));
         data.addAll(d1);
         return ByteUtil.toPrimitive(data);
     }
diff --git a/src/main/java/com/alterdekim/flash/decompiler/tag/DoAction.java b/src/main/java/com/alterdekim/flash/decompiler/tag/DoAction.java
index 5eb0d4e..1ff74be 100644
--- a/src/main/java/com/alterdekim/flash/decompiler/tag/DoAction.java
+++ b/src/main/java/com/alterdekim/flash/decompiler/tag/DoAction.java
@@ -35,10 +35,10 @@ public class DoAction extends ShockwaveTag implements CompileObject {
         List<Byte> bytes = new ArrayList<>();
         this.actions.forEach(action -> {
             bytes.add(action.getType().id);
+            List<Byte> data = new ArrayList<>();
             switch(action.getType()) {
                 case Push:
                     ActionPush push = (ActionPush) action;
-                    List<Byte> data = new ArrayList<>();
                     push.getItems().forEach(item -> {
                         data.add((byte) item.getType().type);
                         switch (item.getType()) {
@@ -65,17 +65,19 @@ public class DoAction extends ShockwaveTag implements CompileObject {
                     break;
                 case ConstantPool:
                     ActionConstantPool pool = (ActionConstantPool) action;
-                    bytes.addAll(ByteUtil.intToBytes(pool.getPool().size())); // maybe there should also be u8 size of data
+                    data.addAll(ByteUtil.intToBytes(pool.getPool().size()));
                     pool.getPool().forEach(s -> {
-                        bytes.addAll(fromString(s));
+                        data.addAll(fromString(s));
                     });
+                    bytes.addAll(ByteUtil.intToBytes(data.size()));
+                    bytes.addAll(data);
                     break;
             }
         });
         bytes.add((byte) 0x0);
         int val = getType().getId() << 6;
         val |= 63; // 265955
-        return Stream.of( ByteUtil.intToBytes(val), ByteUtil.intToBytes32(bytes.size()+6), bytes ).flatMap(Collection::stream).collect(Collectors.toList());
+        return Stream.of( ByteUtil.intToBytes(val), ByteUtil.intToBytes32(bytes.size()), bytes ).flatMap(Collection::stream).collect(Collectors.toList());
     }
 
     private List<Byte> fromString(String s) {
diff --git a/src/main/java/com/alterdekim/flash/decompiler/util/ByteUtil.java b/src/main/java/com/alterdekim/flash/decompiler/util/ByteUtil.java
index b3c4e52..d38b623 100644
--- a/src/main/java/com/alterdekim/flash/decompiler/util/ByteUtil.java
+++ b/src/main/java/com/alterdekim/flash/decompiler/util/ByteUtil.java
@@ -69,10 +69,10 @@ public class ByteUtil {
     }
 
     public static List<Byte> doubleToBytes(double d) {
-        byte[] b = ByteBuffer.allocate(8).putDouble(d).array();
+        byte[] b = ByteBuffer.allocate(8).order(ByteOrder.LITTLE_ENDIAN).putDouble(d).array();
         byte[] b1 = new byte[8];
-        System.arraycopy(b, 0, b1, 4, 4);
         System.arraycopy(b, 4, b1, 0, 4);
+        System.arraycopy(b, 0, b1, 4, 4);
         return fromPrimitive(b1);
     }
 }