diff --git a/client/src/main/java/rt4/ClientScript.java b/client/src/main/java/rt4/ClientScript.java index 1e46c99..b88d6c4 100644 --- a/client/src/main/java/rt4/ClientScript.java +++ b/client/src/main/java/rt4/ClientScript.java @@ -7,25 +7,25 @@ import org.openrs2.deob.annotation.OriginalMember; public final class ClientScript extends SecondaryNode { @OriginalMember(owner = "client!qc", name = "I", descriptor = "I") - public int anInt4665; + public int intArgs; @OriginalMember(owner = "client!qc", name = "L", descriptor = "I") - public int anInt4667; + public int intLocals; @OriginalMember(owner = "client!qc", name = "N", descriptor = "I") - public int anInt4669; + public int stringArgs; @OriginalMember(owner = "client!qc", name = "O", descriptor = "[I") public int[] opcodes; @OriginalMember(owner = "client!qc", name = "Q", descriptor = "[Lclient!sc;") - public HashTable[] aClass133Array1; + public HashTable[] switchTables; @OriginalMember(owner = "client!qc", name = "R", descriptor = "Lclient!na;") public JagString name; @OriginalMember(owner = "client!qc", name = "S", descriptor = "I") - public int anInt4671; + public int stringLocals; @OriginalMember(owner = "client!qc", name = "T", descriptor = "[Lclient!na;") public JagString[] stringOperands; diff --git a/client/src/main/java/rt4/ClientScriptList.java b/client/src/main/java/rt4/ClientScriptList.java index ada204b..9407130 100644 --- a/client/src/main/java/rt4/ClientScriptList.java +++ b/client/src/main/java/rt4/ClientScriptList.java @@ -10,59 +10,57 @@ public class ClientScriptList { @OriginalMember(owner = "client!hc", name = "a", descriptor = "(IB)Lclient!qc;") public static ClientScript get(@OriginalArg(0) int id) { - @Pc(12) ClientScript local12 = (ClientScript) scripts.get((long) id); - if (local12 != null) { - return local12; + @Pc(12) ClientScript script = (ClientScript) scripts.get(id); + if (script != null) { + return script; } - @Pc(22) byte[] local22 = client.js5Archive12.fetchFile(id, 0); - if (local22 == null) { + @Pc(22) byte[] bytes = client.js5Archive12.fetchFile(id, 0); + if (bytes == null) { return null; } - local12 = new ClientScript(); - @Pc(42) Buffer local42 = new Buffer(local22); - local42.offset = local42.data.length - 2; - @Pc(53) int local53 = local42.g2(); - @Pc(63) int local63 = local42.data.length - local53 - 12 - 2; - local42.offset = local63; - @Pc(70) int local70 = local42.g4(); - local12.anInt4667 = local42.g2(); - local12.anInt4671 = local42.g2(); - local12.anInt4665 = local42.g2(); - local12.anInt4669 = local42.g2(); - @Pc(98) int local98 = local42.g1(); - @Pc(107) int local107; - @Pc(114) int local114; - if (local98 > 0) { - local12.aClass133Array1 = new HashTable[local98]; - for (local107 = 0; local107 < local98; local107++) { - local114 = local42.g2(); - @Pc(121) HashTable local121 = new HashTable(IntUtils.clp2(local114)); - local12.aClass133Array1[local107] = local121; - while (local114-- > 0) { - @Pc(136) int local136 = local42.g4(); - @Pc(140) int local140 = local42.g4(); - local121.put(new IntNode(local140), (long) local136); + script = new ClientScript(); + @Pc(42) Buffer buffer = new Buffer(bytes); + buffer.offset = buffer.data.length - 2; + @Pc(53) int trailerLen = buffer.g2(); + @Pc(63) int trailerPos = buffer.data.length - trailerLen - 12 - 2; + buffer.offset = trailerPos; + @Pc(70) int instructions = buffer.g4(); + script.intLocals = buffer.g2(); + script.stringLocals = buffer.g2(); + script.intArgs = buffer.g2(); + script.stringArgs = buffer.g2(); + @Pc(98) int switches = buffer.g1(); + if (switches > 0) { + script.switchTables = new HashTable[switches]; + for (int i = 0; i < switches; i++) { + int cases = buffer.g2(); + @Pc(121) HashTable table = new HashTable(IntUtils.clp2(cases)); + script.switchTables[i] = table; + while (cases-- > 0) { + @Pc(136) int value = buffer.g4(); + @Pc(140) int offset = buffer.g4(); + table.put(new IntNode(offset), value); } } } - local42.offset = 0; - local12.name = local42.fastgjstr(); - local12.opcodes = new int[local70]; - local12.stringOperands = new JagString[local70]; - local107 = 0; - local12.intOperands = new int[local70]; - while (local63 > local42.offset) { - local114 = local42.g2(); - if (local114 == 3) { - local12.stringOperands[local107] = local42.gjstr(); - } else if (local114 >= 100 || local114 == 21 || local114 == 38 || local114 == 39) { - local12.intOperands[local107] = local42.g1(); + buffer.offset = 0; + script.name = buffer.fastgjstr(); + script.opcodes = new int[instructions]; + script.stringOperands = new JagString[instructions]; + int i = 0; + script.intOperands = new int[instructions]; + while (trailerPos > buffer.offset) { + int cases = buffer.g2(); + if (cases == 3) { + script.stringOperands[i] = buffer.gjstr(); + } else if (cases >= 100 || cases == 21 || cases == 38 || cases == 39) { + script.intOperands[i] = buffer.g1(); } else { - local12.intOperands[local107] = local42.g4(); + script.intOperands[i] = buffer.g4(); } - local12.opcodes[local107++] = local114; + script.opcodes[i++] = cases; } - scripts.put(local12, (long) id); - return local12; + scripts.put(script, id); + return script; } } diff --git a/client/src/main/java/rt4/ScriptRunner.java b/client/src/main/java/rt4/ScriptRunner.java index bee210c..c0c5421 100644 --- a/client/src/main/java/rt4/ScriptRunner.java +++ b/client/src/main/java/rt4/ScriptRunner.java @@ -385,9 +385,9 @@ public final class ScriptRunner { @Pc(44) byte op = -1; @Pc(58) int cycles; try { - intLocals = new int[script.anInt4667]; + intLocals = new int[script.intLocals]; @Pc(50) int intLocalIndex = 0; - stringLocals = new JagString[script.anInt4671]; + stringLocals = new JagString[script.stringLocals]; @Pc(56) int stringLocalIndex = 0; @Pc(77) int id; @Pc(194) JagString value; @@ -571,16 +571,16 @@ public final class ScriptRunner { if (opcode == 40) { id = intOperands[pc]; @Pc(642) ClientScript local642 = ClientScriptList.get(id); - @Pc(646) int[] local646 = new int[local642.anInt4667]; - @Pc(650) JagString[] local650 = new JagString[local642.anInt4671]; - for (local652 = 0; local652 < local642.anInt4665; local652++) { - local646[local652] = intStack[local652 + isp - local642.anInt4665]; + @Pc(646) int[] local646 = new int[local642.intLocals]; + @Pc(650) JagString[] local650 = new JagString[local642.stringLocals]; + for (local652 = 0; local652 < local642.intArgs; local652++) { + local646[local652] = intStack[local652 + isp - local642.intArgs]; } - for (local652 = 0; local652 < local642.anInt4669; local652++) { - local650[local652] = stringStack[local652 + ssp - local642.anInt4669]; + for (local652 = 0; local652 < local642.stringArgs; local652++) { + local650[local652] = stringStack[local652 + ssp - local642.stringArgs]; } - isp -= local642.anInt4665; - ssp -= local642.anInt4669; + isp -= local642.intArgs; + ssp -= local642.stringArgs; @Pc(705) GoSubFrame local705 = new GoSubFrame(); local705.stringLocals = stringLocals; local705.intLocals = intLocals; @@ -667,7 +667,7 @@ public final class ScriptRunner { continue; } if (opcode == 51) { - @Pc(992) HashTable local992 = script.aClass133Array1[intOperands[pc]]; + @Pc(992) HashTable local992 = script.switchTables[intOperands[pc]]; isp--; @Pc(1002) IntNode local1002 = (IntNode) local992.get((long) intStack[isp]); if (local1002 != null) {