From 5ac2fa37c28d257dc6a9d38b1dfd7269ccb69243 Mon Sep 17 00:00:00 2001 From: Stephane Dallongeville Date: Thu, 7 Nov 2024 00:20:10 +0100 Subject: [PATCH 1/4] Added support to define animation 'time' per frame for SPRITE resource --- bin/rescomp.jar | Bin 276725 -> 277481 bytes bin/rescomp.txt | 8 ++++++-- tools/rescomp/src/sgdk/rescomp/Launcher.java | 2 +- .../rescomp/processor/SpriteProcessor.java | 9 +++++++-- .../src/sgdk/rescomp/resource/Sprite.java | 4 ++-- .../resource/internal/SpriteAnimation.java | 4 ++-- 6 files changed, 18 insertions(+), 9 deletions(-) diff --git a/bin/rescomp.jar b/bin/rescomp.jar index 0acdf310ed5654cfc43b0c6814917e43fd803d23..d2397159d63ea4d077b6277795b0d6c57c28f15d 100644 GIT binary patch delta 20644 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 QkG<&ssuGE$MFU9sA3sbwOaK4? delta 19914 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 M5pxd5&4{4%e^1QZy#N3J diff --git a/bin/rescomp.txt b/bin/rescomp.txt index 692d899a..a0ad8b7a 100644 --- a/bin/rescomp.txt +++ b/bin/rescomp.txt @@ -1,4 +1,4 @@ -ResComp 3.85 (August 2024) +ResComp 3.87 (November 2024) Copyright Stephane Dallongeville https://github.com/Stephane-D/SGDK @@ -343,7 +343,11 @@ SPRITE name img_file width height [compression [time [collision [opt_type [opt_l 1 / APLIB = aplib library (good compression ratio but slow, don't use it for streamed sprite) 2 / FAST / LZ4W = custom lz4 compression (average compression ratio but fast, recommended for streamed sprite) time display frame time in 1/60 of second (time between each animation frame) - If this value is set to 0 (default) then auto animation is disabled + If this value is set to 0 (default) then auto animation is disabled + It can be set globally (single value) or independently for each frame of each animation + Example for a sprite sheet of 3 animations x 5 frames + [[3,3,3,4,4][4,5,5][2,3,3,4]]" + As you can see you can have empty value for empty frame collision collision type: CIRCLE, BOX or NONE (NONE by default) opt_type sprite cutting optimization strategy, accepted values: 0 / BALANCED = balance between used tiles and hardware sprites (default) diff --git a/tools/rescomp/src/sgdk/rescomp/Launcher.java b/tools/rescomp/src/sgdk/rescomp/Launcher.java index 427df1f9..bc9e0979 100644 --- a/tools/rescomp/src/sgdk/rescomp/Launcher.java +++ b/tools/rescomp/src/sgdk/rescomp/Launcher.java @@ -30,7 +30,7 @@ else if (dep && depTarget == null) depTarget = param; } - System.out.println("ResComp 3.86 - SGDK Resource Compiler - Copyright 2024 (Stephane Dallongeville)"); + System.out.println("ResComp 3.87 - SGDK Resource Compiler - Copyright 2024 (Stephane Dallongeville)"); if (fileName == null) { diff --git a/tools/rescomp/src/sgdk/rescomp/processor/SpriteProcessor.java b/tools/rescomp/src/sgdk/rescomp/processor/SpriteProcessor.java index cfc67135..e9c11ec0 100644 --- a/tools/rescomp/src/sgdk/rescomp/processor/SpriteProcessor.java +++ b/tools/rescomp/src/sgdk/rescomp/processor/SpriteProcessor.java @@ -38,6 +38,11 @@ public Resource execute(String[] fields) throws Exception System.out.println(" 1 / APLIB = aplib library (good compression ratio but slow)"); System.out.println(" 2 / FAST / LZ4W = custom lz4 compression (average compression ratio but fast)"); System.out.println(" time display frame time in 1/60 of second (time between each animation frame)"); + System.out.println(" If this value is set to 0 (default) then auto animation is disabled"); + System.out.println(" It can be set globally (single value) or independently for each frame of each animation"); + System.out.println(" Example for a sprite sheet of 3 animations x 5 frames:"); + System.out.println(" [[3,3,3,4,4][4,5,5][2,3,3,4]]"); + System.out.println(" As you can see you can have empty value for empty frame"); System.out.println(" collision collision type: CIRCLE, BOX or NONE (BOX by default)"); System.out.println(" opt_type sprite cutting optimization strategy, accepted values:"); System.out.println(" 0 / BALANCED = balance between used tiles and hardware sprites (default)"); @@ -90,9 +95,9 @@ public Resource execute(String[] fields) throws Exception if (fields.length >= 6) compression = Util.getCompression(fields[5]); // get frame time - int time = 0; + int[][] time = new int[][] {{ 0 }}; if (fields.length >= 7) - time = StringUtil.parseInt(fields[6], 0); + time = StringUtil.parseIntArray2D(fields[6], new int[][] {{ 0 }}); // get collision value CollisionType collision = CollisionType.NONE; if (fields.length >= 8) diff --git a/tools/rescomp/src/sgdk/rescomp/resource/Sprite.java b/tools/rescomp/src/sgdk/rescomp/resource/Sprite.java index 2f93b469..f1492956 100644 --- a/tools/rescomp/src/sgdk/rescomp/resource/Sprite.java +++ b/tools/rescomp/src/sgdk/rescomp/resource/Sprite.java @@ -34,7 +34,7 @@ public class Sprite extends Resource public final Palette palette; - public Sprite(String id, String imgFile, int wf, int hf, Compression compression, int time, CollisionType collision, OptimizationType optType, + public Sprite(String id, String imgFile, int wf, int hf, Compression compression, int[][] time, CollisionType collision, OptimizationType optType, OptimizationLevel optLevel, boolean showCut, boolean optDuplicate) throws Exception { super(id); @@ -108,7 +108,7 @@ public Sprite(String id, String imgFile, int wf, int hf, Compression compression for (int i = 0; i < numAnim; i++) { // build sprite animation - SpriteAnimation animation = new SpriteAnimation(id + "_animation" + i, image, wt, ht, i, wf, hf, time, collision, compression, optType, optLevel, optDuplicate); + SpriteAnimation animation = new SpriteAnimation(id + "_animation" + i, image, wt, ht, i, wf, hf, time[Math.min(time.length - 1, i)], collision, compression, optType, optLevel, optDuplicate); // check if empty if (!animation.isEmpty()) diff --git a/tools/rescomp/src/sgdk/rescomp/resource/internal/SpriteAnimation.java b/tools/rescomp/src/sgdk/rescomp/resource/internal/SpriteAnimation.java index c86ee77c..2812db77 100644 --- a/tools/rescomp/src/sgdk/rescomp/resource/internal/SpriteAnimation.java +++ b/tools/rescomp/src/sgdk/rescomp/resource/internal/SpriteAnimation.java @@ -39,7 +39,7 @@ public class SpriteAnimation extends Resource * height of frame in tile * @param showCuttingResult */ - public SpriteAnimation(String id, byte[] image8bpp, int w, int h, int animIndex, int wf, int hf, int time, CollisionType collision, Compression compression, + public SpriteAnimation(String id, byte[] image8bpp, int w, int h, int animIndex, int wf, int hf, int[] time, CollisionType collision, Compression compression, OptimizationType optType, OptimizationLevel optLevel, boolean optDuplicate) { super(id); @@ -117,7 +117,7 @@ public SpriteAnimation(String id, byte[] image8bpp, int w, int h, int animIndex, // frames.add(frame); // create sprite frame ('timer' is augmented by number of duplicate) - SpriteFrame frame = new SpriteFrame(id + "_frame" + i, frameImage, wf, hf, time * (duplicate + 1), collision, compression, optType, optLevel); + SpriteFrame frame = new SpriteFrame(id + "_frame" + i, frameImage, wf, hf, time[Math.min(time.length - 1, i)] * (duplicate + 1), collision, compression, optType, optLevel); // add as internal resource (get duplicate if exist) frame = (SpriteFrame) addInternalResource(frame); // bypass duplicates From c3eec5a8292d250ab70945da39db60e8c305c6b1 Mon Sep 17 00:00:00 2001 From: Stephane Dallongeville Date: Thu, 7 Nov 2024 00:28:10 +0100 Subject: [PATCH 2/4] Improve explanation --- bin/rescomp.txt | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/bin/rescomp.txt b/bin/rescomp.txt index a0ad8b7a..1b7cdb53 100644 --- a/bin/rescomp.txt +++ b/bin/rescomp.txt @@ -343,11 +343,11 @@ SPRITE name img_file width height [compression [time [collision [opt_type [opt_l 1 / APLIB = aplib library (good compression ratio but slow, don't use it for streamed sprite) 2 / FAST / LZ4W = custom lz4 compression (average compression ratio but fast, recommended for streamed sprite) time display frame time in 1/60 of second (time between each animation frame) - If this value is set to 0 (default) then auto animation is disabled - It can be set globally (single value) or independently for each frame of each animation - Example for a sprite sheet of 3 animations x 5 frames - [[3,3,3,4,4][4,5,5][2,3,3,4]]" - As you can see you can have empty value for empty frame + If this value is set to 0 (default) then auto animation is disabled. + It can be either set globally (single value) or independently for each frame of each animation. + Example for 3 anim x 5 frame sprite sheet: + [[3,3,3,4,4][4,5,5][2,3,3,4]] + No space allowed ! And you can have empty value for empty frame. collision collision type: CIRCLE, BOX or NONE (NONE by default) opt_type sprite cutting optimization strategy, accepted values: 0 / BALANCED = balance between used tiles and hardware sprites (default) From 26239432a0695f23113ebc95c83e5418c0bbd4d5 Mon Sep 17 00:00:00 2001 From: Lemur42332543632 <120027513+Lemur42332543632@users.noreply.github.com> Date: Thu, 7 Nov 2024 02:31:34 +0300 Subject: [PATCH 3/4] Improved the SYS_die function. (#366) Thanks for your contribution :) --- inc/sys.h | 13 +++++++------ src/sys.c | 24 +++++++++++++++++++----- 2 files changed, 26 insertions(+), 11 deletions(-) diff --git a/inc/sys.h b/inc/sys.h index 272ad369..e86a1162 100644 --- a/inc/sys.h +++ b/inc/sys.h @@ -41,13 +41,13 @@ /** * \brief - * Put function in .data (RAM) instead of the default .text + * Put function in .data (RAM) instead of the default .text */ -#define RAM_SECT __attribute__((section(".ramprog"))) +#define RAM_SECT __attribute__((section(".ramprog"))) /** * \brief - * Declare function for the hint callback (generate a RTE to return from interrupt instead of RTS) + * Declare function for the hint callback (generate a RTE to return from interrupt instead of RTS) */ #define HINTERRUPT_CALLBACK __attribute__ ((interrupt)) void @@ -489,10 +489,11 @@ bool SYS_isChecksumOk(void); /** * \brief * Die with the specified error message.
- * Program execution is interrupted. - * + * Program execution is interrupted.
+ * Accepts a list of strings. The list must end with a NULL value. + * * This actually display an error message and program ends execution. */ -void SYS_die(char *err); +void SYS_die(char *err, ...); #endif // _SYS_H_ diff --git a/src/sys.c b/src/sys.c index cdf367a9..92a6fd6a 100644 --- a/src/sys.c +++ b/src/sys.c @@ -1042,13 +1042,27 @@ bool SYS_isChecksumOk() } -void SYS_die(char *err) +void SYS_die(char *err, ...) { SYS_setInterruptMaskLevel(7); VDP_init(); - VDP_drawText("A fatal error occured !", 2, 2); - VDP_drawText("cannot continue...", 4, 3); - if (err) VDP_drawText(err, 0, 5); + VDP_setBackgroundColor(63); + VDP_drawText("A fatal error occured!", 9, 2); + VDP_drawText("cannot continue...", 11, 3); + + u8 y = 5; + va_list argptr; + va_start(argptr, err); + + const char* str = err; + while (str != NULL) + { + VDP_drawText(str, 1, y); + str = va_arg(argptr, const char*); + y++; + } + va_end(argptr); + while(1); -} +} \ No newline at end of file From 35d717884b63956f47a277eec1612b33d38fd090 Mon Sep 17 00:00:00 2001 From: werton Date: Thu, 7 Nov 2024 08:33:05 +0900 Subject: [PATCH 4/4] Fixed color overflow in PAL_doFadeStep (#360) Finally merged :p --- src/pal.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/pal.c b/src/pal.c index c2b8b948..0e1a7ffa 100644 --- a/src/pal.c +++ b/src/pal.c @@ -341,6 +341,10 @@ bool NO_INLINE PAL_initFade(u16 fromCol, u16 toCol, const u16* palSrc, const u16 bool NO_INLINE PAL_doFadeStep(void) { + // fading is done? --> exit + if (fadeCounter <= 0) + return FALSE; + // prepare fade palette for next frame s16* palR = fadeR; s16* palG = fadeG;