diff --git a/CHANGELOG.md b/CHANGELOG.md index 572b21663..45d592556 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,8 +20,9 @@ All notable changes to this project will be documented in this file. - [#2095] AS3 Changing script when debugging - [#223] AS2 Detecting uninitialized class fields - Embed tag not properly escaped on obfuscated files -- [#116] AS3 Cyclic typenames protection +- [#116] AS3 Cyclic typenames - [#116] AS3 Do not parse DoABC tags inside sprites +- [#116] Cyclic buttons ## [19.0.0] - 2023-10-01 ### Added diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DefineButton2Tag.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DefineButton2Tag.java index 34afdb2e1..d792203c7 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DefineButton2Tag.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DefineButton2Tag.java @@ -258,7 +258,9 @@ public class DefineButton2Tag extends ButtonTag implements ASMSourceContainer { Frame frameOver = new Frame(timeline, 0); Frame frameHit = new Frame(timeline, 0); for (BUTTONRECORD r : this.characters) { - + if (swf.getCyclicCharacters().contains(r.characterId)) { + continue; + } DepthState layer = new DepthState(swf, null); layer.colorTransForm = r.colorTransform; layer.blendMode = r.blendMode; @@ -312,5 +314,12 @@ public class DefineButton2Tag extends ButtonTag implements ASMSourceContainer { @Override public void setFrameCount(int frameCount) { throw new UnsupportedOperationException("Not supported yet."); - } + } + + @Override + public void getNeededCharacters(Set needed, SWF swf) { + for (BUTTONRECORD rec: characters) { + needed.add(rec.characterId); + } + } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DefineButtonTag.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DefineButtonTag.java index e8f8ca929..894f2dc25 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DefineButtonTag.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DefineButtonTag.java @@ -248,7 +248,9 @@ public class DefineButtonTag extends ButtonTag implements ASMSourceContainer { Frame frameOver = new Frame(timeline, 0); Frame frameHit = new Frame(timeline, 0); for (BUTTONRECORD r : this.characters) { - + if (swf.getCyclicCharacters().contains(r.characterId)) { + continue; + } DepthState layer = new DepthState(swf, null); layer.colorTransForm = clrTrans; layer.blendMode = r.blendMode; @@ -303,5 +305,12 @@ public class DefineButtonTag extends ButtonTag implements ASMSourceContainer { @Override public void setFrameCount(int frameCount) { throw new UnsupportedOperationException("Not supported yet."); - } + } + + @Override + public void getNeededCharacters(Set needed, SWF swf) { + for (BUTTONRECORD rec: characters) { + needed.add(rec.characterId); + } + } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/Tag.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/Tag.java index c3f8997c0..9a2fc1cd4 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/Tag.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/Tag.java @@ -645,14 +645,14 @@ public abstract class Tag implements NeedsCharacters, Exportable, Serializable { public void getNeededCharactersDeep(Set needed) { Set needed2 = new LinkedHashSet<>(); getNeededCharacters(needed2, swf); - List needed3 = new ArrayList<>(needed2); + List needed3 = new ArrayList<>(needed2); for (int i = 0; i < needed3.size(); i++) { int characterId = needed3.get(i); if (swf == null) { return; } - if (swf.getCharacters().containsKey(characterId)) { + if (swf.getCharacters().containsKey(characterId) && !swf.getCyclicCharacters().contains(characterId)) { Set needed4 = new LinkedHashSet<>(); CharacterTag character = swf.getCharacter(characterId); character.getNeededCharacters(needed4, swf); diff --git a/src/com/jpexs/decompiler/flash/gui/MainPanel.java b/src/com/jpexs/decompiler/flash/gui/MainPanel.java index 4587f7945..3c01ef918 100644 --- a/src/com/jpexs/decompiler/flash/gui/MainPanel.java +++ b/src/com/jpexs/decompiler/flash/gui/MainPanel.java @@ -5226,7 +5226,7 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se } else { previewPanel.setParametersPanelVisible(false); } - } else if (treeItem instanceof BUTTONRECORD) { + } else if ((treeItem instanceof BUTTONRECORD) && (!((BUTTONRECORD) treeItem).getSwf().getCyclicCharacters().contains(((BUTTONRECORD) treeItem).characterId))) { BUTTONRECORD buttonRecord = (BUTTONRECORD) treeItem; previewPanel.setParametersPanelVisible(false); SWF swf = new SWF(buttonRecord.getSwf().getCharset());