From f814a641a91d98bb659fc506799e2eca0dae76eb Mon Sep 17 00:00:00 2001 From: Superstarxalien <ernesto_vallenilla@hotmail.com> Date: Wed, 15 May 2024 19:11:21 -0400 Subject: [PATCH] add support for ring state added in 2.2 additionally, added more comments to code and some minor tweaks to the advanced instructions as well --- Advanced templates/advanced_instructions.txt | 27 +++---- .../sprites.png | Bin 27947 -> 0 bytes .../follower_sound.ogg | Bin .../properties.txt | 72 +++++++++++++++++- .../sprites.png | Bin 0 -> 31948 bytes .../sprites.png | Bin 21085 -> 0 bytes .../follower_sound.ogg | Bin .../properties.txt | 48 +++++++++++- .../sprites.png | Bin 0 -> 24076 bytes .../properties.txt | 2 +- src/main.c | 59 ++++++++++++-- 11 files changed, 182 insertions(+), 26 deletions(-) delete mode 100644 Advanced templates/example_asymmetricalrotation_6states_animated/sprites.png rename Advanced templates/{example_asymmetricalrotation_6states_animated => example_asymmetricalrotation_7states_animated}/follower_sound.ogg (100%) rename Advanced templates/{example_asymmetricalrotation_6states_animated => example_asymmetricalrotation_7states_animated}/properties.txt (87%) create mode 100644 Advanced templates/example_asymmetricalrotation_7states_animated/sprites.png delete mode 100644 Advanced templates/example_symmetricalrotation_6states_animated/sprites.png rename Advanced templates/{example_symmetricalrotation_6states_animated => example_symmetricalrotation_7states_animated}/follower_sound.ogg (100%) rename Advanced templates/{example_symmetricalrotation_6states_animated => example_symmetricalrotation_7states_animated}/properties.txt (87%) create mode 100644 Advanced templates/example_symmetricalrotation_7states_animated/sprites.png diff --git a/Advanced templates/advanced_instructions.txt b/Advanced templates/advanced_instructions.txt index d563a50..6db0755 100644 --- a/Advanced templates/advanced_instructions.txt +++ b/Advanced templates/advanced_instructions.txt @@ -1,6 +1,6 @@ This text file provides instructions on how to edit templates under the "advanced" folder. It contains instructions, FAQ and troubleshooting, and an example of how to do it. -The advanced templates are designed to allow it to be edited by users, in order to add more frames to any follower state's animation. It provides every possible distinct sprite: all six states (idle, following, hurt, lose, win, hitconfirm), and an asymmetrical appearance. +The advanced templates are designed to allow it to be edited by users, in order to add more frames to any follower state's animation. It provides every possible distinct sprite: all seven states (idle, following, hurt, lose, win, hitconfirm, ring), and frames for a follower of either symmetrical or asymmetrical appearance. By default, each animation lasts for two frames. To add more, first increase the height of your spritesheet by 128 for each frame you want to add. If you're adding frames to several animations, increase the height based on whichever has the most. For example, if your most fluid animation is 4 frames, you'll be adding two new frames: that's two counts of 128, plus the original height of 256, which means your final spritesheet height should be 512. @@ -22,23 +22,23 @@ FAQ and troubleshooting: The solid horizontal line represents the origin point for sprites. You can treat it as "ground level" if you'd like, but it's not mandatory. The vertical dotted line simply indicates the center of each sprite's 128x128 box, to help with symmetry. "Followermaker.exe won't open/won't read my file." -Opening followermaker is possible, but not required: dragging a completed folder onto it in your file explorer is enough. If you've done this, and it still will not create a .wad, check the following: -That your commas are properly placed in properties.txt -That your files are named: -followersound.ogg -properties.txt -sprites.png -That your followersound is a .ogg file, as opposed to a .wav or .mp4 or other file type +Opening Followermaker is possible, but not required: dragging a completed folder onto it in your file explorer is enough. If you've done this, and it still will not create a .wad, check the following: +- That your commas are properly placed in properties.txt +- That your files are named: + - follower_sound.ogg + - properties.txt + - sprites.png +- That your follower_sound is a .ogg file, as opposed to a .wav or .mp4 or other file type If none of these work, then feel free to shout Superstarxalien about it on Discord or Twitter -"Does followermaker support 16 angle rotation?" -16 angle rotation is not supported, but it is possible. Essentially, if you can work out how to name the frames and order the template, you can do it: however, followermaker does not currently have a template or guide for it. +"Does Followermaker support 16 angle rotation?" +16 angle rotation is supported by the program, though there aren't any templates included with it. Essentially, if you can work out how to name the frames and order the template, you can do it. "Can I edit the simple templates in the same way as the advanced ones?" The short answer is no. The simple templates are in a grid format that's easier on the eyes, but the animations not being horizontally uniform on the spritesheet means adding new frames would either involve creating entire new rows or moving existing ones: the former means you would have to figure out layer steps on your own, and the latter breaks the sheet entirely unless you redid the whole thing. If you want a follower with more frames but less states, simply take an advanced template and remove the states you don't want from .properties. You don't even have to remove the relevant sections from your sprites.png: indeed, you should probably keep them, because the states you keep will be expecting their sprites to be in the same place, and so maintaining the empty space at exactly the same size can cause confusion. "Is 128x128 the maximum size? What about the intended size?" -Ring racers does not inherently have a maximum size. However, followermaker's templates use 128x128 because it is the largest any base game followers use, and upscaling the templates will cause them to break. If you're set on making a follower greater than 128x128, you'll need to alter "sprite_size" and "layer_step_size" to the new max size of your frames, and you'll need to substantially alter the template in order to make it the same size. (Multiplying the scale of the template skips having to rearrange it yourself, but you'll still have to change sprite_size and layer_step_size.) If you do alter the template like this, or in any way that involves changing the width of the template, remember to set graphics_icon back to normal. To change graphics_icon's location, simply indicate the coordinates of the top left of its box, and followermaker will take a 16x16 space starting from there as the follower's icon. graphics_icon overides layer steps, so "the coordinates" are the actual pixel coordinates on your sheet. +Ring racers does not inherently have a maximum size. However, Followermaker's templates use 128x128 because it is the largest any base game followers use, and upscaling the templates will cause them to break. If you're set on making a follower greater than 128x128, you'll need to alter "sprite_size" and "layer_step_size" to the new max size of your frames, and you'll need to substantially alter the template in order to make it the same size. (Multiplying the scale of the template skips having to rearrange it yourself, but you'll still have to change sprite_size and layer_step_size.) If you do alter the template like this, or in any way that involves changing the width of the template, remember to set graphics_icon back to normal. To change graphics_icon's location, simply indicate the coordinates of the top left of its box, and Followermaker will take a 16x16 space starting from there as the follower's icon. graphics_icon overides layer steps, so "the coordinates" are the actual pixel coordinates on your sheet. As for the intended size, it trends much smaller. For reference, a "small" follower might be something like 40x40. Really, though, it depends on your follower, so use your best judgement. Example: @@ -68,7 +68,4 @@ Here is an example of adding a single new frame of animation to the "following" On the symmetrical template, the left number in Layers starts at 5 and ends at 9, and so has been left unchanged. Because the template has a default of 2 frames, this is the 3rd, so the right number in Layers is 3 - 1, which is 2. Each instance of "A" has been replaced with "C." Which letter you choose to copy is not particularly relevant, but it is easier to always copy "A", so that when making many frames you only need to remove one comma. As opposed to copying "B", where you would need to add a comma to almost every new frame. The offset is unchanged, and should never be changed unless you're altering the size of the 128x128 box, which is not recommended unless you know what you're doing. -Finally, because this is the only new frame being added to "following", the final right square brackets does not a comma. It is not depicted here, but "B5" should have a comma added to it in this instance. - - - +Finally, because this is the only new frame being added to "following", the final right square brackets does not a comma. It is not depicted here, but "B5" should have a comma added to it in this instance. \ No newline at end of file diff --git a/Advanced templates/example_asymmetricalrotation_6states_animated/sprites.png b/Advanced templates/example_asymmetricalrotation_6states_animated/sprites.png deleted file mode 100644 index ab205c4f1b219e8baa353ee22940468c0d3d66fc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27947 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 diff --git a/Advanced templates/example_asymmetricalrotation_6states_animated/follower_sound.ogg b/Advanced templates/example_asymmetricalrotation_7states_animated/follower_sound.ogg similarity index 100% rename from Advanced templates/example_asymmetricalrotation_6states_animated/follower_sound.ogg rename to Advanced templates/example_asymmetricalrotation_7states_animated/follower_sound.ogg diff --git a/Advanced templates/example_asymmetricalrotation_6states_animated/properties.txt b/Advanced templates/example_asymmetricalrotation_7states_animated/properties.txt similarity index 87% rename from Advanced templates/example_asymmetricalrotation_6states_animated/properties.txt rename to Advanced templates/example_asymmetricalrotation_7states_animated/properties.txt index 784aa3d..0b1ead9 100644 --- a/Advanced templates/example_asymmetricalrotation_6states_animated/properties.txt +++ b/Advanced templates/example_asymmetricalrotation_7states_animated/properties.txt @@ -52,9 +52,11 @@ "win_animation_speed_explanation": "(in Tics) Number of Tics it takes to cycle through an animated sprite in the win state.", "hitconfirm_animation_speed": 35, "hitconfirm_animation_speed_explanation": "(in Tics) Number of Tics it takes to cycle through an animated sprite in the hit confirm state.", + "ring_animation_speed": 35, + "ring_animation_speed_explanation": "(in Tics) Number of Tics it takes to cycle through an animated sprite in the ring state.", - "follower_states_help": "As you may know, followers have several animations for things that can occur during the race; these are described as \"states\". Followers can have up to 6 states, in order: an idle state, a following state (as in, following the player), a hurt state (when you get hit by an item), a lose state (when you lose the race), a win state (win the race), and a \"hit confirm\" state (occurs when you hit another racer with an item). Of these, the idle state is obligatory in all followers. Additionally, the duration of the hit confirm state is controlled by a variable which can be edited above.", + "follower_states_help": "As you may know, followers have several animations for things that can occur during the race; these are described as \"states\". Followers can have up to 7 states, in order: an idle state, a following state (as in, following the player), a hurt state (when you get hit by an item), a lose state (when you lose the race), a win state (win the race), a \"hit confirm\" state (occurs when you hit another racer with an item), and a \"ring\" state (used whenever Auto Ring is enabled as the follower spends your rings). Of these, the idle state is obligatory in all followers. Additionally, the duration of the hit confirm state is controlled by a variable which can be edited above.", "sprite_help": "The template is divided into several regions, each for a unique sprite, described by the below values. These sprite regions are each categorized according to the follower state in which they belong, and are further split into frames detailing both the rotation angle (indicated by numbers) and animation index (indicated by letters) of the follower. The \"sprite_size\" field determines the general size for each sprite region. \"Layers\" refers to the exact location of each sprite, with \"layer_step_size\" indicating how many pixels are stepped over for the position of the layer; layers also allow for literal layer functionality, allowing you to insert up to four sets of sprite locations, with the first sprite location being applied on top of following locations. You can also edit the offset of sprites, with the default templates providing automatic X axis centering for sprites, offset 16 pixels down on the Y axis.", @@ -459,12 +461,78 @@ "layers": [[47, 1]] } }, + "ring": { + "A1": { + "offset": [64, 112], + "layers": [[48, 0]] + }, + "A2": { + "offset": [64, 112], + "layers": [[49, 0]] + }, + "A3": { + "offset": [64, 112], + "layers": [[50, 0]] + }, + "A4": { + "offset": [64, 112], + "layers": [[51, 0]] + }, + "A5": { + "offset": [64, 112], + "layers": [[52, 0]] + }, + "A6": { + "offset": [64, 112], + "layers": [[53, 0]] + }, + "A7": { + "offset": [64, 112], + "layers": [[54, 0]] + }, + "A8": { + "offset": [64, 112], + "layers": [[55, 0]] + }, + "B1": { + "offset": [64, 112], + "layers": [[48, 1]] + }, + "B2": { + "offset": [64, 112], + "layers": [[49, 1]] + }, + "B3": { + "offset": [64, 112], + "layers": [[50, 1]] + }, + "B4": { + "offset": [64, 112], + "layers": [[51, 1]] + }, + "B5": { + "offset": [64, 112], + "layers": [[52, 1]] + }, + "B6": { + "offset": [64, 112], + "layers": [[53, 1]] + }, + "B7": { + "offset": [64, 112], + "layers": [[54, 1]] + }, + "B8": { + "offset": [64, 112], + "layers": [[55, 1]] + } + }, "graphics": { "icon": { "overwrite_sprite_size": [16, 16], "overwrite_layer_step_size": [1, 1], - "layers": [[6154, 10]] + "layers": [[7178, 10]] } } } diff --git a/Advanced templates/example_asymmetricalrotation_7states_animated/sprites.png b/Advanced templates/example_asymmetricalrotation_7states_animated/sprites.png new file mode 100644 index 0000000000000000000000000000000000000000..3a3e4201bd3b08de800bc8582a6f2906b1f8a531 GIT binary patch literal 31948 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 KpUXO@geCyUOR~%W literal 0 HcmV?d00001 diff --git a/Advanced templates/example_symmetricalrotation_6states_animated/sprites.png b/Advanced templates/example_symmetricalrotation_6states_animated/sprites.png deleted file mode 100644 index adfaef7e8b79441143bb18318f20842ac35e9dce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21085 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 T!;f-_f#S&1)z4*}Q$iB}%E}rx diff --git a/Advanced templates/example_symmetricalrotation_6states_animated/follower_sound.ogg b/Advanced templates/example_symmetricalrotation_7states_animated/follower_sound.ogg similarity index 100% rename from Advanced templates/example_symmetricalrotation_6states_animated/follower_sound.ogg rename to Advanced templates/example_symmetricalrotation_7states_animated/follower_sound.ogg diff --git a/Advanced templates/example_symmetricalrotation_6states_animated/properties.txt b/Advanced templates/example_symmetricalrotation_7states_animated/properties.txt similarity index 87% rename from Advanced templates/example_symmetricalrotation_6states_animated/properties.txt rename to Advanced templates/example_symmetricalrotation_7states_animated/properties.txt index 8676dc6..4097e3f 100644 --- a/Advanced templates/example_symmetricalrotation_6states_animated/properties.txt +++ b/Advanced templates/example_symmetricalrotation_7states_animated/properties.txt @@ -52,9 +52,11 @@ "win_animation_speed_explanation": "(in Tics) Number of Tics it takes to cycle through an animated sprite in the win state.", "hitconfirm_animation_speed": 35, "hitconfirm_animation_speed_explanation": "(in Tics) Number of Tics it takes to cycle through an animated sprite in the hit confirm state.", + "ring_animation_speed": 35, + "ring_animation_speed_explanation": "(in Tics) Number of Tics it takes to cycle through an animated sprite in the ring state.", - "follower_states_help": "As you may know, followers have several animations for things that can occur during the race; these are described as \"states\". Followers can have up to 6 states, in order: an idle state, a following state (as in, following the player), a hurt state (when you get hit by an item), a lose state (when you lose the race), a win state (win the race), and a \"hit confirm\" state (occurs when you hit another racer with an item). Of these, the idle state is obligatory in all followers. Additionally, the duration of the hit confirm state is controlled by a variable which can be edited above.", + "follower_states_help": "As you may know, followers have several animations for things that can occur during the race; these are described as \"states\". Followers can have up to 7 states, in order: an idle state, a following state (as in, following the player), a hurt state (when you get hit by an item), a lose state (when you lose the race), a win state (win the race), a \"hit confirm\" state (occurs when you hit another racer with an item), and a \"ring\" state (used whenever Auto Ring is enabled as the follower spends your rings). Of these, the idle state is obligatory in all followers. Additionally, the duration of the hit confirm state is controlled by a variable which can be edited above.", "sprite_help": "The template is divided into several regions, each for a unique sprite, described by the below values. These sprite regions are each categorized according to the follower state in which they belong, and are further split into frames detailing both the rotation angle (indicated by numbers) and animation index (indicated by letters) of the follower. The \"sprite_size\" field determines the general size for each sprite region. \"Layers\" refers to the exact location of each sprite, with \"layer_step_size\" indicating how many pixels are stepped over for the position of the layer; layers also allow for literal layer functionality, allowing you to insert up to four sets of sprite locations, with the first sprite location being applied on top of following locations. You can also edit the offset of sprites, with the default templates providing automatic X axis centering for sprites, offset 16 pixels down on the Y axis.", @@ -315,12 +317,54 @@ "layers": [[29, 1]] } }, + "ring": { + "A1": { + "offset": [64, 112], + "layers": [[30, 0]] + }, + "A2A8": { + "offset": [64, 112], + "layers": [[31, 0]] + }, + "A3A7": { + "offset": [64, 112], + "layers": [[32, 0]] + }, + "A4A6": { + "offset": [64, 112], + "layers": [[33, 0]] + }, + "A5": { + "offset": [64, 112], + "layers": [[34, 0]] + }, + "B1": { + "offset": [64, 112], + "layers": [[30, 1]] + }, + "B2B8": { + "offset": [64, 112], + "layers": [[31, 1]] + }, + "B3B7": { + "offset": [64, 112], + "layers": [[32, 1]] + }, + "B4B6": { + "offset": [64, 112], + "layers": [[33, 1]] + }, + "B5": { + "offset": [64, 112], + "layers": [[34, 1]] + } + }, "graphics": { "icon": { "overwrite_sprite_size": [16, 16], "overwrite_layer_step_size": [1, 1], - "layers": [[3850, 10]] + "layers": [[4490, 10]] } } } diff --git a/Advanced templates/example_symmetricalrotation_7states_animated/sprites.png b/Advanced templates/example_symmetricalrotation_7states_animated/sprites.png new file mode 100644 index 0000000000000000000000000000000000000000..81671dff44b4dc187d15bb3467d30b7a5fbb4d6e GIT binary patch literal 24076 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 HQ$iB}yrMoE literal 0 HcmV?d00001 diff --git a/Basic templates/example_symmetricalrotation_2states_animated/properties.txt b/Basic templates/example_symmetricalrotation_2states_animated/properties.txt index 1ac4726..e54b26e 100644 --- a/Basic templates/example_symmetricalrotation_2states_animated/properties.txt +++ b/Basic templates/example_symmetricalrotation_2states_animated/properties.txt @@ -44,7 +44,7 @@ "following_animation_speed_explanation": "(in Tics) Number of Tics it takes to cycle through an animated sprite in the following state.", - "follower_states_help": "As you may know, followers have several animations for things that can occur during the race; these are described as \"states\". Followers can have up to 6 states, in order: an idle state, a following state (as in, following the player), a hurt state (when you get hit by an item), a lose state (when you lose the race), a win state (win the race), and a \"hit confirm\" state (occurs when you hit another racer with an item). Of these, the idle state is obligatory in all followers.", + "follower_states_help": "As you may know, followers have several animations for things that can occur during the race; these are described as \"states\". Followers can have up to 7 states, in order: an idle state, a following state (as in, following the player), a hurt state (when you get hit by an item), a lose state (when you lose the race), a win state (win the race), a \"hit confirm\" state (occurs when you hit another racer with an item), and a \"ring\" state (used whenever Auto Ring is enabled as the follower spends your rings). Of these, the idle state is obligatory in all followers.", "template_explanation": "This specific template is designed for followers with an idle and following state, with 2-frame animations for each state and 5 unique degrees of rotation. The second, third, and fourth rotation sprites are duplicated and mirrored, thus this template assumes a follower of symmetrical appearance.", diff --git a/src/main.c b/src/main.c index 77fbb31..c5c0cca 100644 --- a/src/main.c +++ b/src/main.c @@ -78,10 +78,11 @@ struct followerstructthingwhatever { char loseanimationspeed; char winanimationspeed; char hitconfirmanimationspeed; + char ringanimationspeed; char numstates; uint8_t highestanimframeletter; - uint8_t followerstateanimframestart[6]; + uint8_t followerstateanimframestart[7]; struct state { uint8_t idle:1; uint8_t following:1; @@ -89,7 +90,8 @@ struct followerstructthingwhatever { uint8_t lose:1; uint8_t win:1; uint8_t hitconfirm:1; - uint8_t padding:2; + uint8_t ring:1; + uint8_t padding:1; } states; }; @@ -224,6 +226,7 @@ void SetDefaultFollowerValues(void) kfollower.loseanimationspeed = 35; kfollower.winanimationspeed = 35; kfollower.hitconfirmanimationspeed = 35; + kfollower.ringanimationspeed = 35; kfollower.numstates = 0; kfollower.highestanimframeletter = 0x41; @@ -234,6 +237,7 @@ void SetDefaultFollowerValues(void) kfollower.states.lose = 0; kfollower.states.win = 0; kfollower.states.hitconfirm = 0; + kfollower.states.ring = 0; } // processes sprites on the template, which are separated by regions (usually visualized on the template image as squares) @@ -301,6 +305,8 @@ void processSprites(void) { kfollower.states.win = 1; if (strcmp(item->string, "hitconfirm") == 0) kfollower.states.hitconfirm = 1; + if (strcmp(item->string, "ring") == 0) + kfollower.states.ring = 1; } lastanimframeletterinstate = 0; @@ -367,8 +373,11 @@ void processSprites(void) { lastanimframeletterinstate = nesteditem->string[0]; + // once all alphabet letters are exhausted in the JSON file, the program simply uses whatever's next on the ascii table + // obviously the game won't like that, so those entries get converted to the proper format after the fact nesteditem->string[0] = getFixedAnimationIndex(curanimframeletter); + // for flipped sprites (e.g. A2A8) if (strlen(nesteditem->string) > 3) nesteditem->string[2] = nesteditem->string[0]; } @@ -691,6 +700,7 @@ unsigned char* imageInDoomFormat(struct RGB_Sprite* image, size_t* size) return img; } +// generate SOC void addFollower(struct wadfile* wad) { char buf[1<<16]; @@ -771,6 +781,8 @@ void addFollower(struct wadfile* wad) kfollower.winanimationspeed = cJSON_GetObjectItem(metadata, "win_animation_speed")->valueint; if (cJSON_GetObjectItem(metadata, "hitconfirm_animation_speed")) kfollower.hitconfirmanimationspeed = cJSON_GetObjectItem(metadata, "hitconfirm_animation_speed")->valueint; + if (cJSON_GetObjectItem(metadata, "ring_animation_speed")) + kfollower.winanimationspeed = cJSON_GetObjectItem(metadata, "ring_animation_speed")->valueint; sprintf(prebuf, "FREESLOT\nSPR_%s\nsfx_FH%s\nS_%sIDLE\n", prefix, prefix, prefix); @@ -784,6 +796,8 @@ void addFollower(struct wadfile* wad) sprintf(prebuf, "%sS_%sWIN\n", prebuf, prefix); if (kfollower.states.hitconfirm) sprintf(prebuf, "%sS_%sHITCONFIRM\n", prebuf, prefix); + if (kfollower.states.ring) + sprintf(prebuf, "%sS_%sRING\n", prebuf, prefix); if (kfollower.highestanimframeletter > 0x41 && !(kfollower.numstates > 0)) { @@ -934,18 +948,49 @@ void addFollower(struct wadfile* wad) } if (kfollower.states.hitconfirm) { - if (kfollower.highestanimframeletter > kfollower.followerstateanimframestart[5]) + if (kfollower.numstates > 5) + { + if ((kfollower.followerstateanimframestart[6] - kfollower.followerstateanimframestart[5]) > 1) + { + sprintf(ff_animate, "A|FF_ANIMATE"); + var1 = (kfollower.followerstateanimframestart[6] - kfollower.followerstateanimframestart[5]) - 1; + } + else + { + sprintf(ff_animate, "A"); + var1 = 0; + } + } + else + { + if (kfollower.highestanimframeletter > kfollower.followerstateanimframestart[5]) + { + sprintf(ff_animate, "A|FF_ANIMATE"); + var1 = kfollower.highestanimframeletter - kfollower.followerstateanimframestart[5]; + } + else + { + sprintf(ff_animate, "A"); + var1 = 0; + } + } + ff_animate[0] = getFixedAnimationIndex(kfollower.followerstateanimframestart[5]); + sprintf(prebuf, "%s\nSTATE S_%sHITCONFIRM\nSpriteName = SPR_%s\nSpriteFrame = %s\nDuration = -1\nVar1 = %d #no. of sprites (starts from 0)\nVar2 = %d #animation speed\nNext = S_%sHITCONFIRM\n", prebuf, prefix, prefix, ff_animate, var1, kfollower.hitconfirmanimationspeed, prefix); + } + if (kfollower.states.ring) + { + if (kfollower.highestanimframeletter > kfollower.followerstateanimframestart[6]) { sprintf(ff_animate, "A|FF_ANIMATE"); - var1 = kfollower.highestanimframeletter - kfollower.followerstateanimframestart[5]; + var1 = kfollower.highestanimframeletter - kfollower.followerstateanimframestart[6]; } else { sprintf(ff_animate, "A"); var1 = 0; } - ff_animate[0] = getFixedAnimationIndex(kfollower.followerstateanimframestart[5]); - sprintf(prebuf, "%s\nSTATE S_%sHITCONFIRM\nSpriteName = SPR_%s\nSpriteFrame = %s\nDuration = -1\nVar1 = %d #no. of sprites (starts from 0)\nVar2 = %d #animation speed\nNext = S_%sHITCONFIRM\n", prebuf, prefix, prefix, ff_animate, var1, kfollower.hitconfirmanimationspeed, prefix); + ff_animate[0] = getFixedAnimationIndex(kfollower.followerstateanimframestart[6]); + sprintf(prebuf, "%s\nSTATE S_%sRING\nSpriteName = SPR_%s\nSpriteFrame = %s\nDuration = -1\nVar1 = %d #no. of sprites (starts from 0)\nVar2 = %d #animation speed\nNext = S_%sRING\n", prebuf, prefix, prefix, ff_animate, var1, kfollower.ringanimationspeed, prefix); } } @@ -984,6 +1029,8 @@ void addFollower(struct wadfile* wad) sprintf(prebuf, "%sWinState = S_%sWIN\n", prebuf, prefix); if (kfollower.states.hitconfirm) sprintf(prebuf, "%sHitConfirmState = S_%sHITCONFIRM\n", prebuf, prefix); + if (kfollower.states.ring) + sprintf(prebuf, "%sRingState = S_%sRING\n", prebuf, prefix); } size = sprintf(buf, prebuf); -- GitLab