From 62d61bad450ee38f7bd33517d91655deb64f8ee6 Mon Sep 17 00:00:00 2001 From: Mathieu Moran Date: Wed, 16 Sep 2026 08:16:34 -0400 Subject: [PATCH] Implement the RCO animation system and focus handling Add the 11 RCO animation record types (MoveTo/Recolour/Resize/Fade/ FireEvent/...), an AnimFactory, and populate the resource animtable. Anim play() applies the final state immediately so the menu lays out correctly. Also add setInterval overloads (5+ params), setFocus(VsmxBaseObject), and animation offsets (animX/Y/Z) to position objects, fixing the dispatch warnings that were silently stalling the menu. --- .../java/dev/quoije/umd/rco/AnimFactory.java | 39 ++++++++++++++++ .../main/java/dev/quoije/umd/rco/RcoFile.java | 16 +++++++ .../java/dev/quoije/umd/rco/anim/Anim.java | 6 +++ .../dev/quoije/umd/rco/anim/BaseAnim.java | 46 +++++++++++++++++++ .../dev/quoije/umd/rco/anim/DelayAnim.java | 11 +++++ .../dev/quoije/umd/rco/anim/FadeAnim.java | 25 ++++++++++ .../quoije/umd/rco/anim/FireEventAnim.java | 19 ++++++++ .../dev/quoije/umd/rco/anim/LockAnim.java | 11 +++++ .../dev/quoije/umd/rco/anim/MoveToAnim.java | 29 ++++++++++++ .../dev/quoije/umd/rco/anim/RecolourAnim.java | 31 +++++++++++++ .../dev/quoije/umd/rco/anim/ResizeAnim.java | 29 ++++++++++++ .../dev/quoije/umd/rco/anim/RotateAnim.java | 18 ++++++++ .../dev/quoije/umd/rco/anim/SlideOutAnim.java | 19 ++++++++ .../dev/quoije/umd/rco/anim/UnlockAnim.java | 11 +++++ .../umd/rco/object/BasePositionObject.java | 13 +++++- .../umd/rco/type/BaseReferenceType.java | 8 ++++ .../quoije/umd/rco/vsmx/objects/Timer.java | 12 +++++ 17 files changed, 341 insertions(+), 2 deletions(-) create mode 100644 core/src/main/java/dev/quoije/umd/rco/AnimFactory.java create mode 100644 core/src/main/java/dev/quoije/umd/rco/anim/Anim.java create mode 100644 core/src/main/java/dev/quoije/umd/rco/anim/BaseAnim.java create mode 100644 core/src/main/java/dev/quoije/umd/rco/anim/DelayAnim.java create mode 100644 core/src/main/java/dev/quoije/umd/rco/anim/FadeAnim.java create mode 100644 core/src/main/java/dev/quoije/umd/rco/anim/FireEventAnim.java create mode 100644 core/src/main/java/dev/quoije/umd/rco/anim/LockAnim.java create mode 100644 core/src/main/java/dev/quoije/umd/rco/anim/MoveToAnim.java create mode 100644 core/src/main/java/dev/quoije/umd/rco/anim/RecolourAnim.java create mode 100644 core/src/main/java/dev/quoije/umd/rco/anim/ResizeAnim.java create mode 100644 core/src/main/java/dev/quoije/umd/rco/anim/RotateAnim.java create mode 100644 core/src/main/java/dev/quoije/umd/rco/anim/SlideOutAnim.java create mode 100644 core/src/main/java/dev/quoije/umd/rco/anim/UnlockAnim.java diff --git a/core/src/main/java/dev/quoije/umd/rco/AnimFactory.java b/core/src/main/java/dev/quoije/umd/rco/AnimFactory.java new file mode 100644 index 0000000..c241c80 --- /dev/null +++ b/core/src/main/java/dev/quoije/umd/rco/AnimFactory.java @@ -0,0 +1,39 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +package dev.quoije.umd.rco; + +import dev.quoije.umd.rco.anim.Anim; +import dev.quoije.umd.rco.anim.BaseAnim; +import dev.quoije.umd.rco.anim.DelayAnim; +import dev.quoije.umd.rco.anim.FadeAnim; +import dev.quoije.umd.rco.anim.FireEventAnim; +import dev.quoije.umd.rco.anim.LockAnim; +import dev.quoije.umd.rco.anim.MoveToAnim; +import dev.quoije.umd.rco.anim.RecolourAnim; +import dev.quoije.umd.rco.anim.ResizeAnim; +import dev.quoije.umd.rco.anim.RotateAnim; +import dev.quoije.umd.rco.anim.SlideOutAnim; +import dev.quoije.umd.rco.anim.UnlockAnim; + +/** Creates RCO animation records by type id. */ +public final class AnimFactory { + + private AnimFactory() { + } + + public static BaseAnim newAnim(int type) { + return switch (type) { + case 1 -> new Anim(); + case 2 -> new MoveToAnim(); + case 3 -> new RecolourAnim(); + case 4 -> new RotateAnim(); + case 5 -> new ResizeAnim(); + case 6 -> new FadeAnim(); + case 7 -> new DelayAnim(); + case 8 -> new FireEventAnim(); + case 9 -> new LockAnim(); + case 10 -> new UnlockAnim(); + case 11 -> new SlideOutAnim(); + default -> null; + }; + } +} diff --git a/core/src/main/java/dev/quoije/umd/rco/RcoFile.java b/core/src/main/java/dev/quoije/umd/rco/RcoFile.java index fd2988a..8027643 100644 --- a/core/src/main/java/dev/quoije/umd/rco/RcoFile.java +++ b/core/src/main/java/dev/quoije/umd/rco/RcoFile.java @@ -73,6 +73,7 @@ public final class RcoFile { private final Map events = new LinkedHashMap<>(); private final Map images = new LinkedHashMap<>(); private final Map objects = new LinkedHashMap<>(); + private final Map anims = new LinkedHashMap<>(); private final byte[] buffer; private int offset; @@ -109,6 +110,9 @@ public final class RcoFile { for (BaseObject object : objects.values()) { object.init(initContext); } + for (BaseObject anim : anims.values()) { + anim.init(initContext); + } ok = true; } catch (RuntimeException e) { ok = false; @@ -148,6 +152,10 @@ public final class RcoFile { return objects; } + public Map anims() { + return anims; + } + public static String tableName(int id) { return switch (id) { case TABLE_MAIN -> "MAIN"; @@ -305,6 +313,14 @@ public final class RcoFile { if (dataLength > 0) { entry.data = readBytes(dataLength); } + BaseObject anim = AnimFactory.newAnim(entry.type); + if (anim != null) { + if (entry.data != null) { + anim.read(new RcoContext(entry.data, 0, events, images, objects)); + } + anims.put(entryOffset, anim); + entry.obj = anim; + } } case TABLE_TEXT -> { if (entry.type == 1) { diff --git a/core/src/main/java/dev/quoije/umd/rco/anim/Anim.java b/core/src/main/java/dev/quoije/umd/rco/anim/Anim.java new file mode 100644 index 0000000..7496a28 --- /dev/null +++ b/core/src/main/java/dev/quoije/umd/rco/anim/Anim.java @@ -0,0 +1,6 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +package dev.quoije.umd.rco.anim; + +/** A generic animation container (type 1): no direct effect, plays its children. */ +public class Anim extends BaseAnim { +} diff --git a/core/src/main/java/dev/quoije/umd/rco/anim/BaseAnim.java b/core/src/main/java/dev/quoije/umd/rco/anim/BaseAnim.java new file mode 100644 index 0000000..d9370fe --- /dev/null +++ b/core/src/main/java/dev/quoije/umd/rco/anim/BaseAnim.java @@ -0,0 +1,46 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +package dev.quoije.umd.rco.anim; + +import dev.quoije.umd.rco.object.BaseObject; +import dev.quoije.umd.rco.object.BasePositionObject; +import dev.quoije.umd.rco.type.ObjectType; +import dev.quoije.umd.rco.vsmx.interpreter.VsmxBaseObject; +import dev.quoije.umd.rco.vsmx.interpreter.VsmxNativeObject; +import dev.quoije.umd.rco.vsmx.objects.Resource; + +import java.util.function.Consumer; + +/** + * Base of RCO animation records. {@link #play} applies the animation (and its + * children) to the target. This port applies the final state immediately + * rather than tweening over time; the menu still lays out correctly. + */ +public class BaseAnim extends BaseObject { + + /** Plays this animation and all its child animations on the target. */ + public void play(VsmxBaseObject thisObject, VsmxBaseObject object) { + doPlay(object); + + if (thisObject.hasPropertyValue(Resource.childrenName)) { + VsmxBaseObject children = thisObject.getPropertyValue(Resource.childrenName); + for (String name : children.getPropertyNames()) { + VsmxBaseObject child = children.getPropertyValue(name); + if (child instanceof VsmxNativeObject nativeObject && nativeObject.getObject() instanceof BaseAnim anim) { + anim.play(child, object); + } + } + } + } + + /** Applies this animation's effect to the given target. */ + protected void doPlay(VsmxBaseObject object) { + } + + /** Resolves an object reference and applies the action to the target. */ + protected void applyTo(ObjectType ref, Consumer action) { + BasePositionObject target = ref == null ? null : ref.getPositionObject(); + if (target != null) { + action.accept(target); + } + } +} diff --git a/core/src/main/java/dev/quoije/umd/rco/anim/DelayAnim.java b/core/src/main/java/dev/quoije/umd/rco/anim/DelayAnim.java new file mode 100644 index 0000000..58de876 --- /dev/null +++ b/core/src/main/java/dev/quoije/umd/rco/anim/DelayAnim.java @@ -0,0 +1,11 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +package dev.quoije.umd.rco.anim; + +import dev.quoije.umd.rco.ObjectField; +import dev.quoije.umd.rco.type.FloatType; + +/** A timed delay between animations (type 7). */ +public class DelayAnim extends BaseAnim { + + @ObjectField(order = 1) public FloatType time; +} diff --git a/core/src/main/java/dev/quoije/umd/rco/anim/FadeAnim.java b/core/src/main/java/dev/quoije/umd/rco/anim/FadeAnim.java new file mode 100644 index 0000000..5e31998 --- /dev/null +++ b/core/src/main/java/dev/quoije/umd/rco/anim/FadeAnim.java @@ -0,0 +1,25 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +package dev.quoije.umd.rco.anim; + +import dev.quoije.umd.rco.ObjectField; +import dev.quoije.umd.rco.type.FloatType; +import dev.quoije.umd.rco.type.IntType; +import dev.quoije.umd.rco.type.ObjectType; +import dev.quoije.umd.rco.vsmx.interpreter.VsmxBaseObject; + +/** Fades the referenced object to the given transparency (type 6). */ +public class FadeAnim extends BaseAnim { + + @ObjectField(order = 1) public ObjectType ref; + @ObjectField(order = 2) public FloatType duration; + @ObjectField(order = 3) public IntType accelMode; + @ObjectField(order = 4) public FloatType transparency; + + @Override + protected void doPlay(VsmxBaseObject object) { + applyTo(ref, target -> { + target.alphaScale.setFloatValue(transparency.getFloatValue()); + target.onDisplayUpdated(); + }); + } +} diff --git a/core/src/main/java/dev/quoije/umd/rco/anim/FireEventAnim.java b/core/src/main/java/dev/quoije/umd/rco/anim/FireEventAnim.java new file mode 100644 index 0000000..0b3ec6a --- /dev/null +++ b/core/src/main/java/dev/quoije/umd/rco/anim/FireEventAnim.java @@ -0,0 +1,19 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +package dev.quoije.umd.rco.anim; + +import dev.quoije.umd.rco.ObjectField; +import dev.quoije.umd.rco.type.EventType; +import dev.quoije.umd.rco.vsmx.interpreter.VsmxBaseObject; + +/** Fires the referenced event script (type 8). */ +public class FireEventAnim extends BaseAnim { + + @ObjectField(order = 1) public EventType event; + + @Override + protected void doPlay(VsmxBaseObject object) { + if (event != null && event.getEvent() != null) { + object.getInterpreter().interpretScript(object, event.getEvent()); + } + } +} diff --git a/core/src/main/java/dev/quoije/umd/rco/anim/LockAnim.java b/core/src/main/java/dev/quoije/umd/rco/anim/LockAnim.java new file mode 100644 index 0000000..e42961b --- /dev/null +++ b/core/src/main/java/dev/quoije/umd/rco/anim/LockAnim.java @@ -0,0 +1,11 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +package dev.quoije.umd.rco.anim; + +import dev.quoije.umd.rco.ObjectField; +import dev.quoije.umd.rco.type.IntType; + +/** Locks input (type 9). */ +public class LockAnim extends BaseAnim { + + @ObjectField(order = 1) public IntType unknownInt0; +} diff --git a/core/src/main/java/dev/quoije/umd/rco/anim/MoveToAnim.java b/core/src/main/java/dev/quoije/umd/rco/anim/MoveToAnim.java new file mode 100644 index 0000000..b2c8b93 --- /dev/null +++ b/core/src/main/java/dev/quoije/umd/rco/anim/MoveToAnim.java @@ -0,0 +1,29 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +package dev.quoije.umd.rco.anim; + +import dev.quoije.umd.rco.ObjectField; +import dev.quoije.umd.rco.type.FloatType; +import dev.quoije.umd.rco.type.IntType; +import dev.quoije.umd.rco.type.ObjectType; +import dev.quoije.umd.rco.vsmx.interpreter.VsmxBaseObject; + +/** Moves the referenced object by the given animation offset (type 2). */ +public class MoveToAnim extends BaseAnim { + + @ObjectField(order = 1) public ObjectType ref; + @ObjectField(order = 2) public FloatType duration; + @ObjectField(order = 3) public IntType accelMode; + @ObjectField(order = 4) public FloatType x; + @ObjectField(order = 5) public FloatType y; + @ObjectField(order = 6) public FloatType z; + + @Override + protected void doPlay(VsmxBaseObject object) { + applyTo(ref, target -> { + target.animX = x.getFloatValue(); + target.animY = y.getFloatValue(); + target.animZ = z.getFloatValue(); + target.onDisplayUpdated(); + }); + } +} diff --git a/core/src/main/java/dev/quoije/umd/rco/anim/RecolourAnim.java b/core/src/main/java/dev/quoije/umd/rco/anim/RecolourAnim.java new file mode 100644 index 0000000..ec45df3 --- /dev/null +++ b/core/src/main/java/dev/quoije/umd/rco/anim/RecolourAnim.java @@ -0,0 +1,31 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +package dev.quoije.umd.rco.anim; + +import dev.quoije.umd.rco.ObjectField; +import dev.quoije.umd.rco.type.FloatType; +import dev.quoije.umd.rco.type.IntType; +import dev.quoije.umd.rco.type.ObjectType; +import dev.quoije.umd.rco.vsmx.interpreter.VsmxBaseObject; + +/** Recolours the referenced object (type 3). */ +public class RecolourAnim extends BaseAnim { + + @ObjectField(order = 1) public ObjectType ref; + @ObjectField(order = 2) public FloatType duration; + @ObjectField(order = 3) public IntType accelMode; + @ObjectField(order = 4) public FloatType red; + @ObjectField(order = 5) public FloatType green; + @ObjectField(order = 6) public FloatType blue; + @ObjectField(order = 7) public FloatType alpha; + + @Override + protected void doPlay(VsmxBaseObject object) { + applyTo(ref, target -> { + target.redScale.setFloatValue(red.getFloatValue()); + target.greenScale.setFloatValue(green.getFloatValue()); + target.blueScale.setFloatValue(blue.getFloatValue()); + target.alphaScale.setFloatValue(alpha.getFloatValue()); + target.onDisplayUpdated(); + }); + } +} diff --git a/core/src/main/java/dev/quoije/umd/rco/anim/ResizeAnim.java b/core/src/main/java/dev/quoije/umd/rco/anim/ResizeAnim.java new file mode 100644 index 0000000..9d28416 --- /dev/null +++ b/core/src/main/java/dev/quoije/umd/rco/anim/ResizeAnim.java @@ -0,0 +1,29 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +package dev.quoije.umd.rco.anim; + +import dev.quoije.umd.rco.ObjectField; +import dev.quoije.umd.rco.type.FloatType; +import dev.quoije.umd.rco.type.IntType; +import dev.quoije.umd.rco.type.ObjectType; +import dev.quoije.umd.rco.vsmx.interpreter.VsmxBaseObject; + +/** Resizes the referenced object (type 5). */ +public class ResizeAnim extends BaseAnim { + + @ObjectField(order = 1) public ObjectType ref; + @ObjectField(order = 2) public FloatType duration; + @ObjectField(order = 3) public IntType accelMode; + @ObjectField(order = 4) public FloatType width; + @ObjectField(order = 5) public FloatType height; + @ObjectField(order = 6) public FloatType depth; + + @Override + protected void doPlay(VsmxBaseObject object) { + applyTo(ref, target -> { + target.scaleWidth.setFloatValue(width.getFloatValue()); + target.scaleHeight.setFloatValue(height.getFloatValue()); + target.scaleDepth.setFloatValue(depth.getFloatValue()); + target.onDisplayUpdated(); + }); + } +} diff --git a/core/src/main/java/dev/quoije/umd/rco/anim/RotateAnim.java b/core/src/main/java/dev/quoije/umd/rco/anim/RotateAnim.java new file mode 100644 index 0000000..7824aea --- /dev/null +++ b/core/src/main/java/dev/quoije/umd/rco/anim/RotateAnim.java @@ -0,0 +1,18 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +package dev.quoije.umd.rco.anim; + +import dev.quoije.umd.rco.ObjectField; +import dev.quoije.umd.rco.type.FloatType; +import dev.quoije.umd.rco.type.IntType; +import dev.quoije.umd.rco.type.ObjectType; + +/** Rotates the referenced object (type 4). */ +public class RotateAnim extends BaseAnim { + + @ObjectField(order = 1) public ObjectType ref; + @ObjectField(order = 2) public FloatType duration; + @ObjectField(order = 3) public IntType accelMode; + @ObjectField(order = 4) public FloatType x; + @ObjectField(order = 5) public FloatType y; + @ObjectField(order = 6) public FloatType z; +} diff --git a/core/src/main/java/dev/quoije/umd/rco/anim/SlideOutAnim.java b/core/src/main/java/dev/quoije/umd/rco/anim/SlideOutAnim.java new file mode 100644 index 0000000..14b2366 --- /dev/null +++ b/core/src/main/java/dev/quoije/umd/rco/anim/SlideOutAnim.java @@ -0,0 +1,19 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +package dev.quoije.umd.rco.anim; + +import dev.quoije.umd.rco.ObjectField; +import dev.quoije.umd.rco.type.FloatType; +import dev.quoije.umd.rco.type.IntType; +import dev.quoije.umd.rco.type.ObjectType; + +/** Slides the referenced object out (type 11). */ +public class SlideOutAnim extends BaseAnim { + + @ObjectField(order = 1) public ObjectType ref; + @ObjectField(order = 2) public FloatType duration; + @ObjectField(order = 3) public IntType accelMode; + @ObjectField(order = 4) public FloatType xspeed; + @ObjectField(order = 5) public FloatType yspeed; + @ObjectField(order = 6) public FloatType xcompress; + @ObjectField(order = 7) public FloatType ycompress; +} diff --git a/core/src/main/java/dev/quoije/umd/rco/anim/UnlockAnim.java b/core/src/main/java/dev/quoije/umd/rco/anim/UnlockAnim.java new file mode 100644 index 0000000..701bc52 --- /dev/null +++ b/core/src/main/java/dev/quoije/umd/rco/anim/UnlockAnim.java @@ -0,0 +1,11 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +package dev.quoije.umd.rco.anim; + +import dev.quoije.umd.rco.ObjectField; +import dev.quoije.umd.rco.type.IntType; + +/** Unlocks input (type 10). */ +public class UnlockAnim extends BaseAnim { + + @ObjectField(order = 1) public IntType unknownInt0; +} diff --git a/core/src/main/java/dev/quoije/umd/rco/object/BasePositionObject.java b/core/src/main/java/dev/quoije/umd/rco/object/BasePositionObject.java index 90328b2..7e9f585 100644 --- a/core/src/main/java/dev/quoije/umd/rco/object/BasePositionObject.java +++ b/core/src/main/java/dev/quoije/umd/rco/object/BasePositionObject.java @@ -32,13 +32,18 @@ public class BasePositionObject extends BaseObject { @ObjectField(order = 114) public IntType iconOffset; @ObjectField(order = 115) public EventType onInit; + /** Animation offsets (added to the authored position). */ + public float animX; + public float animY; + public float animZ; + @Override public int getX() { int parentX = 0; if (getParent() instanceof BasePositionObject positionParent) { parentX = positionParent.getX(); } - return parentX + posX.getIntValue(); + return parentX + posX.getIntValue() + Math.round(animX); } @Override @@ -47,7 +52,7 @@ public class BasePositionObject extends BaseObject { if (getParent() instanceof BasePositionObject positionParent) { parentY = positionParent.getY(); } - return parentY + posY.getIntValue(); + return parentY + posY.getIntValue() + Math.round(animY); } @Override @@ -94,6 +99,10 @@ public class BasePositionObject extends BaseObject { } } + public void setFocus(VsmxBaseObject object) { + setFocus(); + } + public void setPos(VsmxBaseObject object, VsmxBaseObject x, VsmxBaseObject y) { posX.setFloatValue(x.getFloatValue()); posY.setFloatValue(y.getFloatValue()); diff --git a/core/src/main/java/dev/quoije/umd/rco/type/BaseReferenceType.java b/core/src/main/java/dev/quoije/umd/rco/type/BaseReferenceType.java index 017c090..c7af12a 100644 --- a/core/src/main/java/dev/quoije/umd/rco/type/BaseReferenceType.java +++ b/core/src/main/java/dev/quoije/umd/rco/type/BaseReferenceType.java @@ -3,6 +3,7 @@ package dev.quoije.umd.rco.type; import dev.quoije.umd.rco.RcoContext; import dev.quoije.umd.rco.object.BaseObject; +import dev.quoije.umd.rco.object.BasePositionObject; import dev.quoije.umd.rco.object.ImageObject; /** @@ -60,6 +61,13 @@ public class BaseReferenceType extends BaseType { return object; } + public BasePositionObject getPositionObject() { + if (object instanceof BasePositionObject positionObject) { + return positionObject; + } + return null; + } + public ImageObject getImage() { return image; } diff --git a/core/src/main/java/dev/quoije/umd/rco/vsmx/objects/Timer.java b/core/src/main/java/dev/quoije/umd/rco/vsmx/objects/Timer.java index 1e43ec2..8563a15 100644 --- a/core/src/main/java/dev/quoije/umd/rco/vsmx/objects/Timer.java +++ b/core/src/main/java/dev/quoije/umd/rco/vsmx/objects/Timer.java @@ -121,6 +121,18 @@ public class Timer extends BaseNativeObject { return setInterval(object, function, interval, new VsmxBaseObject[]{param1, param2, param3}); } + public VsmxBaseObject setInterval(VsmxBaseObject object, VsmxBaseObject function, VsmxBaseObject interval, VsmxBaseObject param1, VsmxBaseObject param2, VsmxBaseObject param3, VsmxBaseObject param4) { + return setInterval(object, function, interval, new VsmxBaseObject[]{param1, param2, param3, param4}); + } + + public VsmxBaseObject setInterval(VsmxBaseObject object, VsmxBaseObject function, VsmxBaseObject interval, VsmxBaseObject param1, VsmxBaseObject param2, VsmxBaseObject param3, VsmxBaseObject param4, VsmxBaseObject param5) { + return setInterval(object, function, interval, new VsmxBaseObject[]{param1, param2, param3, param4, param5}); + } + + public VsmxBaseObject setInterval(VsmxBaseObject object, VsmxBaseObject function, VsmxBaseObject interval, VsmxBaseObject param1, VsmxBaseObject param2, VsmxBaseObject param3, VsmxBaseObject param4, VsmxBaseObject param5, VsmxBaseObject param6) { + return setInterval(object, function, interval, new VsmxBaseObject[]{param1, param2, param3, param4, param5, param6}); + } + public void clearInterval(VsmxBaseObject object, VsmxBaseObject id) { int idValue = id.getPropertyValue(0).getIntValue(); synchronized (timers) {