From 74725aa48bd6c5dc4956ae821d29d56889ddc24b Mon Sep 17 00:00:00 2001 From: eulerscheZahl Date: Mon, 13 Apr 2026 18:04:32 +0200 Subject: [PATCH 1/2] SpriteAnimation: introduce imageRange --- .../module/entities/Serializer.java | 1 + .../module/entities/SpriteAnimation.java | 32 +++++++++++++++++-- .../resources/view/entity-module/Command.js | 1 + .../view/entity-module/SpriteAnimation.js | 15 +++++++++ .../view/entity-module/properties.js | 1 + 5 files changed, 48 insertions(+), 2 deletions(-) diff --git a/engine/modules/entities/src/main/java/com/codingame/gameengine/module/entities/Serializer.java b/engine/modules/entities/src/main/java/com/codingame/gameengine/module/entities/Serializer.java index f5b9ed95..5e9c5394 100644 --- a/engine/modules/entities/src/main/java/com/codingame/gameengine/module/entities/Serializer.java +++ b/engine/modules/entities/src/main/java/com/codingame/gameengine/module/entities/Serializer.java @@ -60,6 +60,7 @@ class Serializer { keys.put("zIndex", "z"); keys.put("blendMode", "b"); keys.put("images", "I"); + keys.put("imageRange", "IR"); keys.put("restarted", "rs"); keys.put("playing", "p"); keys.put("loop", "l"); diff --git a/engine/modules/entities/src/main/java/com/codingame/gameengine/module/entities/SpriteAnimation.java b/engine/modules/entities/src/main/java/com/codingame/gameengine/module/entities/SpriteAnimation.java index b39041f6..e5e30ff1 100644 --- a/engine/modules/entities/src/main/java/com/codingame/gameengine/module/entities/SpriteAnimation.java +++ b/engine/modules/entities/src/main/java/com/codingame/gameengine/module/entities/SpriteAnimation.java @@ -1,5 +1,6 @@ package com.codingame.gameengine.module.entities; +import java.util.Arrays; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -169,7 +170,9 @@ public SpriteAnimation setImages(String... images) { throw new IllegalArgumentException("Animation must contain at least 1 image."); } this.images = images; - set("images", Stream.of(images).collect(Collectors.joining(",")), null); + String[] compressed = compressImages(); + if (compressed == images) set("images", Stream.of(images).collect(Collectors.joining(",")), null); + else set("imageRange", compressed[0], null); return this; } @@ -181,4 +184,29 @@ public SpriteAnimation setImages(String... images) { public String[] getImages() { return images; } -} \ No newline at end of file + + private String[] compressImages() { + if (Stream.of(images).anyMatch(i -> i.contains("|"))) return images; + String uncompressed = Stream.of(images).collect(Collectors.joining(",")); + for (int prefixLength = images[0].length() - 1; prefixLength > 0; prefixLength--) { + String prefix = images[0].substring(0, prefixLength); + String numberText = images[0].substring(prefixLength); + int start = 0; + try { + start = Integer.parseInt(numberText); + } catch (NumberFormatException ex) { + break; // can't parse, no compression possible + } + boolean validPrefix = true; + for (int i = 1; i < images.length; i++) { + String suffix = String.format("%0" + numberText.length() + "d", start + i); // add leading zeros + if (!images[i].equals(prefix + suffix)) validPrefix = false; + } + if (!validPrefix) continue; + String compressed = prefix + "|" + numberText + "|" + images[images.length - 1].substring(prefixLength); + if (compressed.length() < uncompressed.length()) + return new String[]{compressed}; + } + return images; + } +} diff --git a/engine/modules/entities/src/main/resources/view/entity-module/Command.js b/engine/modules/entities/src/main/resources/view/entity-module/Command.js index 2c7f4cd1..1544eefc 100644 --- a/engine/modules/entities/src/main/resources/view/entity-module/Command.js +++ b/engine/modules/entities/src/main/resources/view/entity-module/Command.js @@ -38,6 +38,7 @@ const PROPERTY_KEY_MAP = { z: 'zIndex', b: 'blendMode', I: 'images', + IR: 'imageRange', rs: 'restarted', p: 'playing', l: 'loop', diff --git a/engine/modules/entities/src/main/resources/view/entity-module/SpriteAnimation.js b/engine/modules/entities/src/main/resources/view/entity-module/SpriteAnimation.js index 0df61d09..4c3a0ff0 100644 --- a/engine/modules/entities/src/main/resources/view/entity-module/SpriteAnimation.js +++ b/engine/modules/entities/src/main/resources/view/entity-module/SpriteAnimation.js @@ -10,6 +10,7 @@ export class SpriteAnimation extends TextureBasedEntity { super() Object.assign(this.defaultState, { images: '', + imageRange: '', loop: false, duration: 1000, playing: true, @@ -34,6 +35,20 @@ export class SpriteAnimation extends TextureBasedEntity { updateDisplay (state, changed, globalData, frame, progress) { super.updateDisplay(state, changed, globalData) + if (state.imageRange) { + let parts = state.imageRange.split('|') + let prefix = parts[0] + let startText = parts[1] + let lastImage = prefix + parts[2] + let images = [prefix + startText] + for (let i = 1; images[images.length - 1] !== lastImage; i++) { + let suffix = `${+startText + i}` + while (suffix.length < startText.length) suffix = '0' + suffix + images.push(prefix + suffix) + } + state.images = images.join(',') + } + if (state.images) { const images = state.images.split(',') diff --git a/engine/modules/entities/src/main/resources/view/entity-module/properties.js b/engine/modules/entities/src/main/resources/view/entity-module/properties.js index 23b5a114..25cb286d 100644 --- a/engine/modules/entities/src/main/resources/view/entity-module/properties.js +++ b/engine/modules/entities/src/main/resources/view/entity-module/properties.js @@ -77,6 +77,7 @@ export const PROPERTIES = { baseHeight: constOpts, image: stringOpts, images: stringOpts, + imageRange: stringOpts, scaleMode: stringOpts, restarted: { type: String, From fa3f2ac105631bc1279f13cfd142eb66cb7a0b87 Mon Sep 17 00:00:00 2001 From: eulerscheZahl Date: Thu, 30 Apr 2026 12:38:37 +0200 Subject: [PATCH 2/2] SpriteAnimation: reset either images or imageRange --- .../gameengine/module/entities/SpriteAnimation.java | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/engine/modules/entities/src/main/java/com/codingame/gameengine/module/entities/SpriteAnimation.java b/engine/modules/entities/src/main/java/com/codingame/gameengine/module/entities/SpriteAnimation.java index e5e30ff1..b16689a6 100644 --- a/engine/modules/entities/src/main/java/com/codingame/gameengine/module/entities/SpriteAnimation.java +++ b/engine/modules/entities/src/main/java/com/codingame/gameengine/module/entities/SpriteAnimation.java @@ -171,8 +171,14 @@ public SpriteAnimation setImages(String... images) { } this.images = images; String[] compressed = compressImages(); - if (compressed == images) set("images", Stream.of(images).collect(Collectors.joining(",")), null); - else set("imageRange", compressed[0], null); + if (compressed == images) { + set("images", Stream.of(images).collect(Collectors.joining(",")), null); + set("imageRange", ""); + } + else { + set("images", ""); + set("imageRange", compressed[0], null); + } return this; }