Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found
Select Git revision

Target

Select target project
  • KartKrew/kartmaker
  • retrobunny999/kartmaker
  • BenchBenchie/followermaker
  • ultrasonic2025/followermaker
  • ariboxmerk/followermaker
  • Superstarxalien/kartmaker
  • brosasaki/kartmaker
7 results
Select Git revision
Show changes
Commits on Source (48)
Showing
with 1329 additions and 0 deletions
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 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.
Then, copy every angle of the animation you want to increase at once, and paste it directly below the original. Make sure the top of your new rows are flush with the bottom of the original! If you've kept the checkerboard background, doing this should naturally preserve the pattern, no matter how many frames you're adding to which animations. This isn't mandatory, but it is helpful for ensuring you haven't misaligned anything.
Do this for each state you want to add frames to. Different states can have different frame counts; for instance, if you want a flying follower to flap its wings in movement, it's not mandatory to add the same number of frames to states where they stand still.
In this properties file, for each new frame of an animation, copy a set of layers and paste it at the end of that state. "A set of layers" refers here to every angle of a frame: essentially, after the name of the state you want to edit, copy everything with the same letter. An example is provided at the end of this file. Now change it in the following ways: firstly, change your new frame's letter to the letter corresponding to the what frame of the animation this is. For instance, because the original templates end at B, the first new set would be C, and the second would be D. Note that this caps at Z, with 26 frames of animation. Then, change the second number in layers for each sprite. As with the letter, this should correspond with when in the animation the frame plays, except this number should be subtracted by one, because the count starts at zero. For instance, for the first new set for the idle state, layers should read [[0, 2]], [[1, 2]], [[2,2]] and so on. Do not change the left number, as copy/pasting leaves it as already correct.
There is one more very important point: After every instance of coordinates for layers, you will observe a right curly bracket and comma. Like so:
},
There is an exception, though. The final angle of the final frame of any state should not have a comma after it. Conversely, every other angle must have one. By default, the relevant angles of each template ("B5" for symmetrical and "B7" for asymmetrical) do not have commas. For any animation you add frames to, you must add this comma to their former final angle, and ensure the new final angle does not have one.
Lastly, ensure that you do not move any pre-existing sprites: you should not need to, and leaving them in place ensures you do not need to edit anything further in this template.",
FAQ and troubleshooting:
"What are the lines on the grid for?"
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:
- 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 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.
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:
Here is an example of adding a single new frame of animation to the "following" state, on the symmetrical template.
"C1": {
"offset": [64, 112],
"layers": [[5, 2]]
},
"C2C8": {
"offset": [64, 112],
"layers": [[6, 2]]
},
"C3C7": {
"offset": [64, 112],
"layers": [[7, 2]]
},
"C4C6": {
"offset": [64, 112],
"layers": [[8, 2]]
},
"C5": {
"offset": [64, 112],
"layers": [[9, 2]]
}
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.
\ No newline at end of file
{
"transparent_colors": [
115, 115, 255,
82, 82, 255
],
"transparent_colors_explanation": "The above colors will be made transparent upon processing the template image for sprite conversion. You can add up to 4 colors to be set to transparent.",
"name": "example",
"name_explanation": "The name of your follower. The names of followers appear on the main menu, upon toggling \"extrainfo mode\" with the drift button. For character names with spaces, use underscores instead of spaces: underscores will be interpreted as spaces in-game, while spaces won't work.",
"prefix": "EXMP",
"prefix_explanation": "A set of 4 characters used to internally identify your follower, mainly used for its files.",
"category": "Fanworks",
"category_explanation": "The category your follower will appear under. Followermaker doesn't allow for the creation of custom categories, though you can still enter one.",
"prefcolor": "red",
"prefcolor_explanation": "Default follower color. Must use the name of a spray can, as seen on the main menu in extrainfo mode.",
"mode": 0,
"mode_explanation": "If floating (0) or on the ground (1).",
"scale": 1,
"scale_explanation": "(in Fracunits) Scale relative to the player's. Value entered will be inserted as [value] * FRACUNIT",
"bubblescale": 0,
"bubblescale_explanation": "(in Fracunits) Bubble scale relative to the player scale. If not set, no bubble will spawn.",
"atangle": 230,
"atangle_explanation": "Angle the follower will be at around the player. The follower will always face the same direction as the player.",
"distance": 40,
"distance_explanation": "(in Fracunits) Distance relative to the player (in a circle).",
"height": 32,
"height_explanation": "(in Fracunits) Height of the follower, this is mostly important for Z-flipping.",
"zoffs": 32,
"zoffs_explanation": "(in Fracunits) Z-offset relative to the player's height. Cannot be negative.",
"horzlag": 3,
"horzlag_explanation": "(in Fracunits) Lag for X/Y displacement. Must be > 0 because we divide by this number.",
"vertlag": 6,
"verlag_explanation": "(in Fracunits) Lag for Z displacement. Must be > 0 because we divide by this number.",
"anglelag": 8,
"anglelag_explanation": "(in Fracunits) Angle rotation lag. Must be > 0 because we divide by this number.",
"bobamp": 4,
"bobamp_explanation": "(in Fracunits) Bob amplitude.",
"bobspeed": 70,
"bobspeed_explanation": "(in Tics) Arbitrary modifier for bobbing speed. Default is TICRATE*2 (70 Tics = 2 seconds)",
"hitconfirmtime": 1,
"hitconfirmtime_explanation": "(in Tics) Time to keep the hit confirm state playing for.",
"idle_animation_speed": 35,
"idle_animation_speed_explanation": "(in Tics) Number of Tics it takes to cycle through an animated sprite in the idle state.",
"following_animation_speed": 35,
"following_animation_speed_explanation": "(in Tics) Number of Tics it takes to cycle through an animated sprite in the following state.",
"hurt_animation_speed": 35,
"hurt_animation_speed_explanation": "(in Tics) Number of Tics it takes to cycle through an animated sprite in the hurt state.",
"lose_animation_speed": 35,
"lose_animation_speed_explanation": "(in Tics) Number of Tics it takes to cycle through an animated sprite in the lose state.",
"win_animation_speed": 35,
"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 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.",
"template_explanation": "This specific template is designed for followers with all seven states a follower can have, each having 2-frame animations and 8 unique degrees of rotation.",
"sprite_size": [128, 128],
"layer_step_size": [128, 128],
"sprites": {
"idle": {
"A1": {
"offset": [64, 112],
"layers": [[0, 0]]
},
"A2": {
"offset": [64, 112],
"layers": [[1, 0]]
},
"A3": {
"offset": [64, 112],
"layers": [[2, 0]]
},
"A4": {
"offset": [64, 112],
"layers": [[3, 0]]
},
"A5": {
"offset": [64, 112],
"layers": [[4, 0]]
},
"A6": {
"offset": [64, 112],
"layers": [[5, 0]]
},
"A7": {
"offset": [64, 112],
"layers": [[6, 0]]
},
"A8": {
"offset": [64, 112],
"layers": [[7, 0]]
},
"B1": {
"offset": [64, 112],
"layers": [[0, 1]]
},
"B2": {
"offset": [64, 112],
"layers": [[1, 1]]
},
"B3": {
"offset": [64, 112],
"layers": [[2, 1]]
},
"B4": {
"offset": [64, 112],
"layers": [[3, 1]]
},
"B5": {
"offset": [64, 112],
"layers": [[4, 1]]
},
"B6": {
"offset": [64, 112],
"layers": [[5, 1]]
},
"B7": {
"offset": [64, 112],
"layers": [[6, 1]]
},
"B8": {
"offset": [64, 112],
"layers": [[7, 1]]
}
},
"following": {
"A1": {
"offset": [64, 112],
"layers": [[8, 0]]
},
"A2": {
"offset": [64, 112],
"layers": [[9, 0]]
},
"A3": {
"offset": [64, 112],
"layers": [[10, 0]]
},
"A4": {
"offset": [64, 112],
"layers": [[11, 0]]
},
"A5": {
"offset": [64, 112],
"layers": [[12, 0]]
},
"A6": {
"offset": [64, 112],
"layers": [[13, 0]]
},
"A7": {
"offset": [64, 112],
"layers": [[14, 0]]
},
"A8": {
"offset": [64, 112],
"layers": [[15, 0]]
},
"B1": {
"offset": [64, 112],
"layers": [[8, 1]]
},
"B2": {
"offset": [64, 112],
"layers": [[9, 1]]
},
"B3": {
"offset": [64, 112],
"layers": [[10, 1]]
},
"B4": {
"offset": [64, 112],
"layers": [[11, 1]]
},
"B5": {
"offset": [64, 112],
"layers": [[12, 1]]
},
"B6": {
"offset": [64, 112],
"layers": [[13, 1]]
},
"B7": {
"offset": [64, 112],
"layers": [[14, 1]]
},
"B8": {
"offset": [64, 112],
"layers": [[15, 1]]
}
},
"hurt": {
"A1": {
"offset": [64, 112],
"layers": [[16, 0]]
},
"A2": {
"offset": [64, 112],
"layers": [[17, 0]]
},
"A3": {
"offset": [64, 112],
"layers": [[18, 0]]
},
"A4": {
"offset": [64, 112],
"layers": [[19, 0]]
},
"A5": {
"offset": [64, 112],
"layers": [[20, 0]]
},
"A6": {
"offset": [64, 112],
"layers": [[21, 0]]
},
"A7": {
"offset": [64, 112],
"layers": [[22, 0]]
},
"A8": {
"offset": [64, 112],
"layers": [[23, 0]]
},
"B1": {
"offset": [64, 112],
"layers": [[16, 1]]
},
"B2": {
"offset": [64, 112],
"layers": [[17, 1]]
},
"B3": {
"offset": [64, 112],
"layers": [[18, 1]]
},
"B4": {
"offset": [64, 112],
"layers": [[19, 1]]
},
"B5": {
"offset": [64, 112],
"layers": [[20, 1]]
},
"B6": {
"offset": [64, 112],
"layers": [[21, 1]]
},
"B7": {
"offset": [64, 112],
"layers": [[22, 1]]
},
"B8": {
"offset": [64, 112],
"layers": [[23, 1]]
}
},
"lose": {
"A1": {
"offset": [64, 112],
"layers": [[24, 0]]
},
"A2": {
"offset": [64, 112],
"layers": [[25, 0]]
},
"A3": {
"offset": [64, 112],
"layers": [[26, 0]]
},
"A4": {
"offset": [64, 112],
"layers": [[27, 0]]
},
"A5": {
"offset": [64, 112],
"layers": [[28, 0]]
},
"A6": {
"offset": [64, 112],
"layers": [[29, 0]]
},
"A7": {
"offset": [64, 112],
"layers": [[30, 0]]
},
"A8": {
"offset": [64, 112],
"layers": [[31, 0]]
},
"B1": {
"offset": [64, 112],
"layers": [[24, 1]]
},
"B2": {
"offset": [64, 112],
"layers": [[25, 1]]
},
"B3": {
"offset": [64, 112],
"layers": [[26, 1]]
},
"B4": {
"offset": [64, 112],
"layers": [[27, 1]]
},
"B5": {
"offset": [64, 112],
"layers": [[28, 1]]
},
"B6": {
"offset": [64, 112],
"layers": [[29, 1]]
},
"B7": {
"offset": [64, 112],
"layers": [[30, 1]]
},
"B8": {
"offset": [64, 112],
"layers": [[31, 1]]
}
},
"win": {
"A1": {
"offset": [64, 112],
"layers": [[32, 0]]
},
"A2": {
"offset": [64, 112],
"layers": [[33, 0]]
},
"A3": {
"offset": [64, 112],
"layers": [[34, 0]]
},
"A4": {
"offset": [64, 112],
"layers": [[35, 0]]
},
"A5": {
"offset": [64, 112],
"layers": [[36, 0]]
},
"A6": {
"offset": [64, 112],
"layers": [[37, 0]]
},
"A7": {
"offset": [64, 112],
"layers": [[38, 0]]
},
"A8": {
"offset": [64, 112],
"layers": [[39, 0]]
},
"B1": {
"offset": [64, 112],
"layers": [[32, 1]]
},
"B2": {
"offset": [64, 112],
"layers": [[33, 1]]
},
"B3": {
"offset": [64, 112],
"layers": [[34, 1]]
},
"B4": {
"offset": [64, 112],
"layers": [[35, 1]]
},
"B5": {
"offset": [64, 112],
"layers": [[36, 1]]
},
"B6": {
"offset": [64, 112],
"layers": [[37, 1]]
},
"B7": {
"offset": [64, 112],
"layers": [[38, 1]]
},
"B8": {
"offset": [64, 112],
"layers": [[39, 1]]
}
},
"hitconfirm": {
"A1": {
"offset": [64, 112],
"layers": [[40, 0]]
},
"A2": {
"offset": [64, 112],
"layers": [[41, 0]]
},
"A3": {
"offset": [64, 112],
"layers": [[42, 0]]
},
"A4": {
"offset": [64, 112],
"layers": [[43, 0]]
},
"A5": {
"offset": [64, 112],
"layers": [[44, 0]]
},
"A6": {
"offset": [64, 112],
"layers": [[45, 0]]
},
"A7": {
"offset": [64, 112],
"layers": [[46, 0]]
},
"A8": {
"offset": [64, 112],
"layers": [[47, 0]]
},
"B1": {
"offset": [64, 112],
"layers": [[40, 1]]
},
"B2": {
"offset": [64, 112],
"layers": [[41, 1]]
},
"B3": {
"offset": [64, 112],
"layers": [[42, 1]]
},
"B4": {
"offset": [64, 112],
"layers": [[43, 1]]
},
"B5": {
"offset": [64, 112],
"layers": [[44, 1]]
},
"B6": {
"offset": [64, 112],
"layers": [[45, 1]]
},
"B7": {
"offset": [64, 112],
"layers": [[46, 1]]
},
"B8": {
"offset": [64, 112],
"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": [[7178, 10]]
}
}
}
}
\ No newline at end of file
{
"transparent_colors": [
115, 115, 255,
82, 82, 255
],
"transparent_colors_explanation": "The above colors will be made transparent upon processing the template image for sprite conversion. You can add up to 4 colors to be set to transparent.",
"name": "example",
"name_explanation": "The name of your follower. The names of followers appear on the main menu, upon toggling \"extrainfo mode\" with the drift button. For character names with spaces, use underscores instead of spaces: underscores will be interpreted as spaces in-game, while spaces won't work.",
"prefix": "EXMP",
"prefix_explanation": "A set of 4 characters used to internally identify your follower, mainly used for its files.",
"category": "Fanworks",
"category_explanation": "The category your follower will appear under. Followermaker doesn't allow for the creation of custom categories, though you can still enter one.",
"prefcolor": "red",
"prefcolor_explanation": "Default follower color. Must use the name of a spray can, as seen on the main menu in extrainfo mode.",
"mode": 0,
"mode_explanation": "If floating (0) or on the ground (1).",
"scale": 1,
"scale_explanation": "(in Fracunits) Scale relative to the player's. Value entered will be inserted as [value] * FRACUNIT",
"bubblescale": 0,
"bubblescale_explanation": "(in Fracunits) Bubble scale relative to the player scale. If not set, no bubble will spawn.",
"atangle": 230,
"atangle_explanation": "Angle the follower will be at around the player. The follower will always face the same direction as the player.",
"distance": 40,
"distance_explanation": "(in Fracunits) Distance relative to the player (in a circle).",
"height": 32,
"height_explanation": "(in Fracunits) Height of the follower, this is mostly important for Z-flipping.",
"zoffs": 32,
"zoffs_explanation": "(in Fracunits) Z-offset relative to the player's height. Cannot be negative.",
"horzlag": 3,
"horzlag_explanation": "(in Fracunits) Lag for X/Y displacement. Must be > 0 because we divide by this number.",
"vertlag": 6,
"verlag_explanation": "(in Fracunits) Lag for Z displacement. Must be > 0 because we divide by this number.",
"anglelag": 8,
"anglelag_explanation": "(in Fracunits) Angle rotation lag. Must be > 0 because we divide by this number.",
"bobamp": 4,
"bobamp_explanation": "(in Fracunits) Bob amplitude.",
"bobspeed": 70,
"bobspeed_explanation": "(in Tics) Arbitrary modifier for bobbing speed. Default is TICRATE*2 (70 Tics = 2 seconds)",
"hitconfirmtime": 1,
"hitconfirmtime_explanation": "(in Tics) Time to keep the hit confirm state playing for.",
"idle_animation_speed": 35,
"idle_animation_speed_explanation": "(in Tics) Number of Tics it takes to cycle through an animated sprite in the idle state.",
"following_animation_speed": 35,
"following_animation_speed_explanation": "(in Tics) Number of Tics it takes to cycle through an animated sprite in the following state.",
"hurt_animation_speed": 35,
"hurt_animation_speed_explanation": "(in Tics) Number of Tics it takes to cycle through an animated sprite in the hurt state.",
"lose_animation_speed": 35,
"lose_animation_speed_explanation": "(in Tics) Number of Tics it takes to cycle through an animated sprite in the lose state.",
"win_animation_speed": 35,
"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 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.",
"template_explanation": "This specific template is designed for followers with all seven states a follower can have, each having 2-frame animations 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.",
"sprite_size": [128, 128],
"layer_step_size": [128, 128],
"sprites": {
"idle": {
"A1": {
"offset": [64, 112],
"layers": [[0, 0]]
},
"A2A8": {
"offset": [64, 112],
"layers": [[1, 0]]
},
"A3A7": {
"offset": [64, 112],
"layers": [[2, 0]]
},
"A4A6": {
"offset": [64, 112],
"layers": [[3, 0]]
},
"A5": {
"offset": [64, 112],
"layers": [[4, 0]]
},
"B1": {
"offset": [64, 112],
"layers": [[0, 1]]
},
"B2B8": {
"offset": [64, 112],
"layers": [[1, 1]]
},
"B3B7": {
"offset": [64, 112],
"layers": [[2, 1]]
},
"B4B6": {
"offset": [64, 112],
"layers": [[3, 1]]
},
"B5": {
"offset": [64, 112],
"layers": [[4, 1]]
}
},
"following": {
"A1": {
"offset": [64, 112],
"layers": [[5, 0]]
},
"A2A8": {
"offset": [64, 112],
"layers": [[6, 0]]
},
"A3A7": {
"offset": [64, 112],
"layers": [[7, 0]]
},
"A4A6": {
"offset": [64, 112],
"layers": [[8, 0]]
},
"A5": {
"offset": [64, 112],
"layers": [[9, 0]]
},
"B1": {
"offset": [64, 112],
"layers": [[5, 1]]
},
"B2B8": {
"offset": [64, 112],
"layers": [[6, 1]]
},
"B3B7": {
"offset": [64, 112],
"layers": [[7, 1]]
},
"B4B6": {
"offset": [64, 112],
"layers": [[8, 1]]
},
"B5": {
"offset": [64, 112],
"layers": [[9, 1]]
}
},
"hurt": {
"A1": {
"offset": [64, 112],
"layers": [[10, 0]]
},
"A2A8": {
"offset": [64, 112],
"layers": [[11, 0]]
},
"A3A7": {
"offset": [64, 112],
"layers": [[12, 0]]
},
"A4A6": {
"offset": [64, 112],
"layers": [[13, 0]]
},
"A5": {
"offset": [64, 112],
"layers": [[14, 0]]
},
"B1": {
"offset": [64, 112],
"layers": [[10, 1]]
},
"B2B8": {
"offset": [64, 112],
"layers": [[11, 1]]
},
"B3B7": {
"offset": [64, 112],
"layers": [[12, 1]]
},
"B4B6": {
"offset": [64, 112],
"layers": [[13, 1]]
},
"B5": {
"offset": [64, 112],
"layers": [[14, 1]]
}
},
"lose": {
"A1": {
"offset": [64, 112],
"layers": [[15, 0]]
},
"A2A8": {
"offset": [64, 112],
"layers": [[16, 0]]
},
"A3A7": {
"offset": [64, 112],
"layers": [[17, 0]]
},
"A4A6": {
"offset": [64, 112],
"layers": [[18, 0]]
},
"A5": {
"offset": [64, 112],
"layers": [[19, 0]]
},
"B1": {
"offset": [64, 112],
"layers": [[15, 0]]
},
"B2B8": {
"offset": [64, 112],
"layers": [[16, 0]]
},
"B3B7": {
"offset": [64, 112],
"layers": [[17, 0]]
},
"B4B6": {
"offset": [64, 112],
"layers": [[18, 0]]
},
"B5": {
"offset": [64, 112],
"layers": [[19, 0]]
}
},
"win": {
"A1": {
"offset": [64, 112],
"layers": [[20, 0]]
},
"A2A8": {
"offset": [64, 112],
"layers": [[21, 0]]
},
"A3A7": {
"offset": [64, 112],
"layers": [[22, 0]]
},
"A4A6": {
"offset": [64, 112],
"layers": [[23, 0]]
},
"A5": {
"offset": [64, 112],
"layers": [[24, 0]]
},
"B1": {
"offset": [64, 112],
"layers": [[20, 1]]
},
"B2B8": {
"offset": [64, 112],
"layers": [[21, 1]]
},
"B3B7": {
"offset": [64, 112],
"layers": [[22, 1]]
},
"B4B6": {
"offset": [64, 112],
"layers": [[23, 1]]
},
"B5": {
"offset": [64, 112],
"layers": [[24, 1]]
}
},
"hitconfirm": {
"A1": {
"offset": [64, 112],
"layers": [[25, 0]]
},
"A2A8": {
"offset": [64, 112],
"layers": [[26, 0]]
},
"A3A7": {
"offset": [64, 112],
"layers": [[27, 0]]
},
"A4A6": {
"offset": [64, 112],
"layers": [[28, 0]]
},
"A5": {
"offset": [64, 112],
"layers": [[29, 0]]
},
"B1": {
"offset": [64, 112],
"layers": [[25, 1]]
},
"B2B8": {
"offset": [64, 112],
"layers": [[26, 1]]
},
"B3B7": {
"offset": [64, 112],
"layers": [[27, 1]]
},
"B4B6": {
"offset": [64, 112],
"layers": [[28, 1]]
},
"B5": {
"offset": [64, 112],
"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": [[4490, 10]]
}
}
}
}
\ No newline at end of file
{
"transparent_colors": [
115, 115, 255,
82, 82, 255
],
"transparent_colors_explanation": "The above colors will be made transparent upon processing the template image for sprite conversion. You can add up to 4 colors to be set to transparent.",
"name": "example",
"name_explanation": "The name of your follower. The names of followers appear on the main menu, upon toggling \"extrainfo mode\" with the drift button. For character names with spaces, use underscores instead of spaces: underscores will be interpreted as spaces in-game, while spaces won't work.",
"prefix": "EXMP",
"prefix_explanation": "A set of 4 characters used to internally identify your follower, mainly used for its files.",
"category": "Fanworks",
"category_explanation": "The category your follower will appear under. Followermaker doesn't allow for the creation of custom categories, though you can still enter one.",
"prefcolor": "red",
"prefcolor_explanation": "Default follower color. Must use the name of a spray can, as seen on the main menu in extrainfo mode.",
"mode": 0,
"mode_explanation": "If floating (0) or on the ground (1).",
"scale": 1,
"scale_explanation": "(in Fracunits) Scale relative to the player's. Value entered will be inserted as [value] * FRACUNIT",
"bubblescale": 0,
"bubblescale_explanation": "(in Fracunits) Bubble scale relative to the player scale. If not set, no bubble will spawn.",
"atangle": 230,
"atangle_explanation": "Angle the follower will be at around the player. The follower will always face the same direction as the player.",
"distance": 40,
"distance_explanation": "(in Fracunits) Distance relative to the player (in a circle).",
"height": 32,
"height_explanation": "(in Fracunits) Height of the follower, this is mostly important for Z-flipping.",
"zoffs": 32,
"zoffs_explanation": "(in Fracunits) Z-offset relative to the player's height. Cannot be negative.",
"horzlag": 3,
"horzlag_explanation": "(in Fracunits) Lag for X/Y displacement. Must be > 0 because we divide by this number.",
"vertlag": 6,
"verlag_explanation": "(in Fracunits) Lag for Z displacement. Must be > 0 because we divide by this number.",
"anglelag": 8,
"anglelag_explanation": "(in Fracunits) Angle rotation lag. Must be > 0 because we divide by this number.",
"bobamp": 4,
"bobamp_explanation": "(in Fracunits) Bob amplitude.",
"bobspeed": 70,
"bobspeed_explanation": "(in Tics) Arbitrary modifier for bobbing speed. Default is TICRATE*2 (70 Tics = 2 seconds)",
"template_explanation": "This specific template is designed for the simplest follower that can be made for the game, only requiring a single sprite that will be seen from any camera angle.",
"sprite_size": [128, 128],
"layer_step_size": [128, 128],
"sprites": {
"idle": {
"A0": {
"offset": [64, 112],
"layers": [[0, 0]]
}
},
"graphics": {
"icon": {
"overwrite_sprite_size": [16, 16],
"overwrite_layer_step_size": [1, 1],
"layers": [[10, 138]]
}
}
}
}
\ No newline at end of file
Basic templates/example/sprites.png

1.74 KiB

{
"transparent_colors": [
115, 115, 255,
82, 82, 255
],
"transparent_colors_explanation": "The above colors will be made transparent upon processing the template image for sprite conversion. You can add up to 4 colors to be set to transparent.",
"name": "example",
"name_explanation": "The name of your follower. The names of followers appear on the main menu, upon toggling \"extrainfo mode\" with the drift button. For character names with spaces, use underscores instead of spaces: underscores will be interpreted as spaces in-game, while spaces won't work.",
"prefix": "EXMP",
"prefix_explanation": "A set of 4 characters used to internally identify your follower, mainly used for its files.",
"category": "Fanworks",
"category_explanation": "The category your follower will appear under. Followermaker doesn't allow for the creation of custom categories, though you can still enter one.",
"prefcolor": "red",
"prefcolor_explanation": "Default follower color. Must use the name of a spray can, as seen on the main menu in extrainfo mode.",
"mode": 0,
"mode_explanation": "If floating (0) or on the ground (1).",
"scale": 1,
"scale_explanation": "(in Fracunits) Scale relative to the player's. Value entered will be inserted as [value] * FRACUNIT",
"bubblescale": 0,
"bubblescale_explanation": "(in Fracunits) Bubble scale relative to the player scale. If not set, no bubble will spawn.",
"atangle": 230,
"atangle_explanation": "Angle the follower will be at around the player. The follower will always face the same direction as the player.",
"distance": 40,
"distance_explanation": "(in Fracunits) Distance relative to the player (in a circle).",
"height": 32,
"height_explanation": "(in Fracunits) Height of the follower, this is mostly important for Z-flipping.",
"zoffs": 32,
"zoffs_explanation": "(in Fracunits) Z-offset relative to the player's height. Cannot be negative.",
"horzlag": 3,
"horzlag_explanation": "(in Fracunits) Lag for X/Y displacement. Must be > 0 because we divide by this number.",
"vertlag": 6,
"verlag_explanation": "(in Fracunits) Lag for Z displacement. Must be > 0 because we divide by this number.",
"anglelag": 8,
"anglelag_explanation": "(in Fracunits) Angle rotation lag. Must be > 0 because we divide by this number.",
"bobamp": 4,
"bobamp_explanation": "(in Fracunits) Bob amplitude.",
"bobspeed": 70,
"bobspeed_explanation": "(in Tics) Arbitrary modifier for bobbing speed. Default is TICRATE*2 (70 Tics = 2 seconds)",
"idle_animation_speed": 35,
"idle_animation_speed_explanation": "(in Tics) Number of Tics it takes to cycle through an animated sprite in the idle state.",
"template_explanation": "This specific template is designed for a follower with a 2-frame animated sprite that is seen from all camera angles.",
"sprite_size": [128, 128],
"layer_step_size": [128, 128],
"sprites": {
"idle": {
"A0": {
"offset": [64, 112],
"layers": [[0, 0]]
},
"B0": {
"offset": [64, 112],
"layers": [[0, 1]]
}
},
"graphics": {
"icon": {
"overwrite_sprite_size": [16, 16],
"overwrite_layer_step_size": [1, 1],
"layers": [[10, 266]]
}
}
}
}
\ No newline at end of file
Basic templates/example_animated/sprites.png

2.83 KiB

File added
{
"transparent_colors": [
115, 115, 255,
82, 82, 255
],
"transparent_colors_explanation": "The above colors will be made transparent upon processing the template image for sprite conversion. You can add up to 4 colors to be set to transparent.",
"name": "example",
"name_explanation": "The name of your follower. The names of followers appear on the main menu, upon toggling \"extrainfo mode\" with the drift button. For character names with spaces, use underscores instead of spaces: underscores will be interpreted as spaces in-game, while spaces won't work.",
"prefix": "EXMP",
"prefix_explanation": "A set of 4 characters used to internally identify your follower, mainly used for its files.",
"category": "Fanworks",
"category_explanation": "The category your follower will appear under. Followermaker doesn't allow for the creation of custom categories, though you can still enter one.",
"prefcolor": "red",
"prefcolor_explanation": "Default follower color. Must use the name of a spray can, as seen on the main menu in extrainfo mode.",
"mode": 0,
"mode_explanation": "If floating (0) or on the ground (1).",
"scale": 1,
"scale_explanation": "(in Fracunits) Scale relative to the player's. Value entered will be inserted as [value] * FRACUNIT",
"bubblescale": 0,
"bubblescale_explanation": "(in Fracunits) Bubble scale relative to the player scale. If not set, no bubble will spawn.",
"atangle": 230,
"atangle_explanation": "Angle the follower will be at around the player. The follower will always face the same direction as the player.",
"distance": 40,
"distance_explanation": "(in Fracunits) Distance relative to the player (in a circle).",
"height": 32,
"height_explanation": "(in Fracunits) Height of the follower, this is mostly important for Z-flipping.",
"zoffs": 32,
"zoffs_explanation": "(in Fracunits) Z-offset relative to the player's height. Cannot be negative.",
"horzlag": 3,
"horzlag_explanation": "(in Fracunits) Lag for X/Y displacement. Must be > 0 because we divide by this number.",
"vertlag": 6,
"verlag_explanation": "(in Fracunits) Lag for Z displacement. Must be > 0 because we divide by this number.",
"anglelag": 8,
"anglelag_explanation": "(in Fracunits) Angle rotation lag. Must be > 0 because we divide by this number.",
"bobamp": 4,
"bobamp_explanation": "(in Fracunits) Bob amplitude.",
"bobspeed": 70,
"bobspeed_explanation": "(in Tics) Arbitrary modifier for bobbing speed. Default is TICRATE*2 (70 Tics = 2 seconds)",
"template_explanation": "This specific template is designed for a follower of asymmetrical appearance, allowing for 8 unique degrees of rotation.",
"sprite_size": [128, 128],
"layer_step_size": [128, 128],
"sprites": {
"idle": {
"A1": {
"offset": [64, 112],
"layers": [[0, 0]]
},
"A2": {
"offset": [64, 112],
"layers": [[1, 0]]
},
"A3": {
"offset": [64, 112],
"layers": [[2, 0]]
},
"A4": {
"offset": [64, 112],
"layers": [[3, 0]]
},
"A5": {
"offset": [64, 112],
"layers": [[4, 0]]
},
"A6": {
"offset": [64, 112],
"layers": [[5, 0]]
},
"A7": {
"offset": [64, 112],
"layers": [[6, 0]]
},
"A8": {
"offset": [64, 112],
"layers": [[7, 0]]
}
},
"graphics": {
"icon": {
"overwrite_sprite_size": [16, 16],
"overwrite_layer_step_size": [1, 1],
"layers": [[10, 138]]
}
}
}
}
\ No newline at end of file
Basic templates/example_asymmetricalrotation/sprites.png

4.43 KiB

File added
{
"transparent_colors": [
115, 115, 255,
82, 82, 255
],
"transparent_colors_explanation": "The above colors will be made transparent upon processing the template image for sprite conversion. You can add up to 4 colors to be set to transparent.",
"name": "example",
"name_explanation": "The name of your follower. The names of followers appear on the main menu, upon toggling \"extrainfo mode\" with the drift button. For character names with spaces, use underscores instead of spaces: underscores will be interpreted as spaces in-game, while spaces won't work.",
"prefix": "EXMP",
"prefix_explanation": "A set of 4 characters used to internally identify your follower, mainly used for its files.",
"category": "Fanworks",
"category_explanation": "The category your follower will appear under. Followermaker doesn't allow for the creation of custom categories, though you can still enter one.",
"prefcolor": "red",
"prefcolor_explanation": "Default follower color. Must use the name of a spray can, as seen on the main menu in extrainfo mode.",
"mode": 0,
"mode_explanation": "If floating (0) or on the ground (1).",
"scale": 1,
"scale_explanation": "(in Fracunits) Scale relative to the player's. Value entered will be inserted as [value] * FRACUNIT",
"bubblescale": 0,
"bubblescale_explanation": "(in Fracunits) Bubble scale relative to the player scale. If not set, no bubble will spawn.",
"atangle": 230,
"atangle_explanation": "Angle the follower will be at around the player. The follower will always face the same direction as the player.",
"distance": 40,
"distance_explanation": "(in Fracunits) Distance relative to the player (in a circle).",
"height": 32,
"height_explanation": "(in Fracunits) Height of the follower, this is mostly important for Z-flipping.",
"zoffs": 32,
"zoffs_explanation": "(in Fracunits) Z-offset relative to the player's height. Cannot be negative.",
"horzlag": 3,
"horzlag_explanation": "(in Fracunits) Lag for X/Y displacement. Must be > 0 because we divide by this number.",
"vertlag": 6,
"verlag_explanation": "(in Fracunits) Lag for Z displacement. Must be > 0 because we divide by this number.",
"anglelag": 8,
"anglelag_explanation": "(in Fracunits) Angle rotation lag. Must be > 0 because we divide by this number.",
"bobamp": 4,
"bobamp_explanation": "(in Fracunits) Bob amplitude.",
"bobspeed": 70,
"bobspeed_explanation": "(in Tics) Arbitrary modifier for bobbing speed. Default is TICRATE*2 (70 Tics = 2 seconds)",
"idle_animation_speed": 35,
"idle_animation_speed_explanation": "(in Tics) Number of Tics it takes to cycle through an animated sprite in the idle state.",
"template_explanation": "This specific template is designed for a follower of asymmetrical appearance, allowing for 8 unique degrees of rotation, with a 2-frame animation.",
"sprite_size": [128, 128],
"layer_step_size": [128, 128],
"sprites": {
"idle": {
"A1": {
"offset": [64, 112],
"layers": [[0, 0]]
},
"A2": {
"offset": [64, 112],
"layers": [[1, 0]]
},
"A3": {
"offset": [64, 112],
"layers": [[2, 0]]
},
"A4": {
"offset": [64, 112],
"layers": [[3, 0]]
},
"A5": {
"offset": [64, 112],
"layers": [[4, 0]]
},
"A6": {
"offset": [64, 112],
"layers": [[5, 0]]
},
"A7": {
"offset": [64, 112],
"layers": [[6, 0]]
},
"A8": {
"offset": [64, 112],
"layers": [[7, 0]]
},
"B1": {
"offset": [64, 112],
"layers": [[0, 1]]
},
"B2": {
"offset": [64, 112],
"layers": [[1, 1]]
},
"B3": {
"offset": [64, 112],
"layers": [[2, 1]]
},
"B4": {
"offset": [64, 112],
"layers": [[3, 1]]
},
"B5": {
"offset": [64, 112],
"layers": [[4, 1]]
},
"B6": {
"offset": [64, 112],
"layers": [[5, 1]]
},
"B7": {
"offset": [64, 112],
"layers": [[6, 1]]
},
"B8": {
"offset": [64, 112],
"layers": [[7, 1]]
}
},
"graphics": {
"icon": {
"overwrite_sprite_size": [16, 16],
"overwrite_layer_step_size": [1, 1],
"layers": [[10, 266]]
}
}
}
}
\ No newline at end of file
Basic templates/example_asymmetricalrotation_animated/sprites.png

6.52 KiB

File added