User:Digiku/Character WAD

From SRB2 Wiki
Jump to navigation Jump to search

A Character WAD is a WAD file used in Sonic Robo Blast 2 that contain playable characters. These can be loaded up, and usually, they will be selectable in the Character Select screen to be played as through the levels. Examples include those that are part of SRB2, such as Sonic, Tails, and Knuckles. Examples that are more in the conventional sense include addon characters, such as Amy, Shadow, and Metal Sonic.

As of v1.09.4, 272 frames total can be dedicated to a character. A completed character WAD, though, can be considered to have up to 170 frames, made possible due to the abridged system of handling sprites. The sheer number of sprites alone contributes to the history of completed Character WADs, notorious for having few results being yielded. Nonetheless, several completed Character WADs do exist; the majority are those edited from the official sprites, while those made — to some degree — from scratch, also exist.

To edit and create Character WADs, one uses lump editors such as XWE and DeePsea. The wadder draws the amount of sprites their Character WAD requires, and then they add them to the WADfile using such aforementioned lump editors.

Format

A Character WAD, collectively, consists of a series of lumps. The lumps seen in a Character WAD are the following:

  • S_SKIN1 - The defining lump of a playable character. This is a text lump containing attributes which are tweaked to the character's intended properties.
  • Player Sprites - The entire series of sprites that make up the character. There may be 272 in all; 170 sprites alone may be made for a complete character WAD using the "abridged" sprite naming scheme. See List of Frames below.
  • OBJCTCFG - Essentially an SOC which defines how the playable character is displayed on the Single Player Character Select screen. This is optional, though it's needed if the character is to be used in Single Player.
  • BOXINDEX - The two sprites which are called by the BOXINDEX set in S_SKIN1. This is optional.

S_SKIN1

Constructing the S_SKIN1 lump may possibly be the easiest place to start. If you already know how fast you want your character to run, what ability they can do, how high they can jump, etc., you can start by making an S_SKIN1 lump to set the appropriate attributes.

As with level headers and other SOCs, the attribute names themselves of S_SKIN1 are not case-sensitive. That means "facename" can be identified as "facename", "FACENAME", "FaceName", or even "FaCeNaMe", and it will still mean the same.

The format for an S_SKIN1 lump is as follows:

name = 
face = 
facename = 
ability = 
normalspeed = 
thrustfactor = 
accelstart = 
acceleration = 
spin = 
startcolor = 
prefcolor =
jumpheight = 
boxindex = 
highres = 
runspeed =
runonwater =
allowsuper =
superspin =
supercolor =
nojumpspin =
superanims = 
multiability =  
lightdash =   
homing =  
ringslinger =  
slingitem =  
spinitem = 
thokitem =
actionspd =
waterskip =
mindash =
maxdash =

Attributes for S_SKIN1

name

The name of the character, for identification purposes. It shows up in the Multiplayer Character Select screen, and it's also used with the SKIN command in the console. Spaces are not allowed; use underscores instead.

Example: name = Metal_Sonic

face

The lumpname to the life icon used for the character. The life icon is a 32x32 picture shown at the bottom-left of the screen as part of the HUD. Although the value is not case-sensitive (values "STLIFE", "stlife", and "StLiFe" all point to the lump "STLIFE"), it's very highly recommended to input the value in all caps, to match that the lumpname is presumably all caps as well. It's more elegant and accepted this way.

Example: face = METALIFE

facename

The lumpname to the life icon name used for the character. The life icon name is the graphic used next to the life icon which displays the character's name in some way. As with face, while the lumpname value is not case-sensitive, one should really type the lumpname in all capitals for elegance, to match exactly with the name of the lump.

Example: facename = MESONIC

ability

The character's special ability, such as Sonic's thok, or Tails's flying ability. Only one may be selected; the Level Header rule of adding numbers to combine properties does not apply here. The values possible are as follows:

0. Sonic Speed Thok
1. Tails Fly
2. Knuckles Glide/Climb
3. Glide/No Climb
4. Double Jump
5. Super Sonic Float
6. Float with Slow Descent (similar to E-102 Gamma's booster powerup in Sonic Adventure)
7. Swim (basically the flying action only allowed underwater)

Example: ability = 0

multiability

Allows the use of the character's special ability multiple times in one jump; "0" stands for only one use of ability during a jump, and "1" stands for allow repeated use of ability during a jump. A good example of this is Sonic being able to perform his thok repeatedly in one jump. This was a former action in SRB2 before it was reduced to the current single thok. The former action can be restored with multiability.

Example: multiability = 1

actionspd

Defines the speed value of the character's special ability, or how fast the character can move when performing their special ability. This only applies for Thokking, Flying, Gliding, and Swimming. Cannot exceed 60.

Example: actionspd = 20
Defaults:
  • Sonic - 60
  • Tails - 1
  • Knuckles - 20

normalspeed

The character's normal running speed, without powerups. Cannot exceed 36.

Example: normalspeed = 32
Defaults:
  • Sonic - 36
  • Tails - 24
  • Knuckles - 32

accelstart

The rate that the character starts to accelerate at from when they first stand still. Once one first presses the key, the character's speed will increase by this much until they gain enough speed. Cannot exceed 192.

Example: accelstart = 128
Defaults:
  • Sonic - 64
  • Tails - 192
  • Knuckles - 128

acceleration

The rate the character accelerates once they are already moving. When moving, their speed will increase by this much per certain amount of time until it reaches the normalspeed. Cannot exceed 50.

Example: acceleration = 40
Defaults:
  • Sonic - 40
  • Tails - 50
  • Knuckles - 45

spin

Specifies whether the character can spin or not, "spin" meaning spinning on the ground. "0" stands for cannot spin, and "1" stands for can spin. Setting spin to "0" disallows the character from spinning on the ground, or even spindashing at all.

Example: spin = 1

mindash

Defines the minimum speed that the character can spin off after charging a spindash. Default is 15. Cannot exceed 60.

Example: mindash = 15

maxdash

Defines the maximum speed that the character can spin off after charging a spindash. Set to "0" to give the character a mêlée attack. Default is 60. Cannot exceed 60.

Example: maxdash = 60

thrustfactor

{{Template:Askaj}} Has to do with the character's speed. Literally, as found in the SRB2 source, "Thrust = thrustfactor * acceleration".

In other words, the character's other speed values are multiplied by whatever value thrustfactor is to give a complete picture of the character's speed. The higher the thrustfactor, the more speedy the character is. Think "thrust factor"; the character thrusts themselves forward by a factor of this much (whatever the value for this attribute is.)

Example: thrustfactor = 3
Defaults:
  • Sonic - 5
  • Tails - 3
  • Knuckles - 4

runspeed

Defines at which speed the character starts going into their running animation. This does not have to be within the confines of the character's normalspeed; a good example of this is Tails not being able to reach his running animation within his normalspeed, though he can if he has Super Sneakers. Therefore, his runspeed is higher than his normalspeed; he can reach his runspeed by use of Super Sneakers.

Example: runspeed = 30

nojumpspin

Defines whether the character goes into the default spin animation when they jump or whether they use the springing/falling animation. "0" stands for uses spinning animation when jumping, "1" stands for uses springing up animation when jumping and falling animation when descending. Note that even if the character uses their springing up animation, they still inflict damage when they jump as if they were rolling.

Example: nojumpspin = 1

runonwater

Allows the character to run on water when they are in their running animation. "0" stands for cannot run on water, and "1" stands for can run on water.

Example: runonwater = 1

waterskip

Defines whether or not the player can skip over water when spinning into a body of water fast enough, like Sonic, Tails, and Knuckles do. "0" stands for cannot skip over water, "1" stands for can skip over water.

Example: waterskip = 1

startcolor

Specifies the range of colors of the palette on the character's sprites that can change in Multiplayer mode. By default, this is a range of 16, starting from the specified startcolor. See About the Palette below.

Example: startcolor = 192

endcolor

Specifies the end of the range of colors of the palette on the character's sprites that can change in Multiplayer mode. Using this, the range can be as low as four colors, or much higher than the default range of 16. This attribute is optional; if not used, the range defaults to (startcolor) + 16. See About the Palette below.

Example: endcolor = 200

prefcolor

The default color for the character. This is especially useful (and practically required) in Single Player mode, where the color cannot be changed by the player. If this is set to "0" (or none), the character's color will look as it does on the sprites themselves; however, if spindash/thok trails were intended to appear, they won't appear if prefcolor is set to "0". The possible values are as follows:

0. None
1. Gray
2. Peach
3. Dark_Red
4. Silver
5. Orange
6. Red
7. Blue
8. Dark_Blue
9. Pink
10. Beige
11. Purple
12. Green
13. White
14. Gold
15. Yellow

Example: prefcolor = 7

highres

{{Laterwork}} If your skin has a sprite which is twice as large as a normal player sprite, highres will shrink it to half size for you. This is better then resizing the sprites by hand because it is both easier to set then resizing all 180-something sprites and it doesn't lose every other pixel in higher resolutions. Partially broken in 1.09; it works, but only sets itself when you switch to the skin or a player joins the game. To make it work again if it unsets itself, switch to a skin and switch back or toggle splitscreen on and then off again. This is fixed in 1.09.1 and SRB2JTE 1.69.5 and up. Also, the results will not look as intended in OpenGL (the character will be drawn in the wrong position, causing them to fly in the air or run through the ground), although they will function as normal. In addition, no color gets along well with this.

Example: highres = 1

boxindex

{{Laterwork}} The Extra Life Box icon your character uses. Normally, this is set to 0, displaying the standard "1-Up" box icon for the character, the sprites for which are named PRUPA0 and PRUPB0. The Extra Life Box can use custom icons for specific characters, too. Sonic's boxindex is 1, which uses the sprites PRUPC0 and PRUPD0. Tails's boxindex is 2, using the sprites PRUPE0 and PRUPF0. Knuckles's boxindex is 3, using the sprites PRUPG0 and PRUPH0. Custom characters can have their own Extra Life box icon by continuing this trend; for example, the character's boxindex could be 4, using the sprites PRUPI0 and PRUPJ0.

Example: boxindex = 4

allowsuper

Allows the character to transform into their supposed Super form when they have 50 Rings and 7 Chaos Emeralds, like Sonic can. Note that this may seem overpowering to the character in the eyes of critics. It's best to use this wisely. "0" stands for cannot turn Super, "1" stands for can turn Super.

Example: allowsuper = 1

superspin

Defines whether the Super character goes into their spinning animation when they jump/spindash or not. Super Sonic used to not show the spin animation when performing these actions, but rather his standing animation. "0" stands for does not display spinning animation, "1" stands for does display spinning animation.

Example: superspin = 1

supercolor

Defines what color the Super character will be. This is like the prefcolor attribute, but applies to the Super character. See "prefcolor" for possible values.

Example: supercolor = 15

superanims

Defines whether to use the designated Special Ability frames (animations U-Z) for the character's Super form, much like Sonic is set to. If not, the normal animations are used. "0" stands for use normal animations, "1" stands for use Special Ability animations.

If superanims = 1, then frames U and V are used for Super standing, frames W and X are used for Super running, frame Y is used for tipping on an edge, and frame is used for Z is for getting hurt while Super; the last effect is possible using the super turret SOC effect.

Example: superanims = 1

ringslinger

Allows the character to throw rings or other projectiles (see slingitem), even when the Gametype is not Match, Tag, or CTF mode. Basically, using this allows the character to throw projectiles in Single Player and other similar modes.

Example: ringslinger = 1

slingitem

Used in conjunction with ringslinger, though optional. Specifies which SOC Thing Entry to fire as a projectile. The values correspond not to the Thing #s used in a map, but those used within SOCs; "4" corresponds to the object "MT_ROCKET", or the Egg Mobile's missile. If this attribute isn't defined, SOC object "74", or the standard red ring, is the default.

Any SOC Thing Entry can be used; a complete list of the values possible can be found using the SRB2 SOC Editor, under the "Edit Things" button in the main menu. This puts up the "Thing Edit" window, which contains the complete list of SOC Thing Entries. Below is a list of perhaps the most typical things that can be used with ringslinger (note, however, that whatever is used still costs one ring from the character — even a Jetty-Syn bullet):

4 - MT_ROCKET (GFZ Boss Missile) 
74 - MT_REDRING (Standard Red Ring) (Default)
91 - MT_JETTBULLET (Jetty-Syn Gunner Bullet) 
152 - MT_FIREBALL (Fire-Flower Mario Fireball)
194 - MT_TURRETLASER (THZ Turret Laser/Bullet) 
124 - MT_THROWNHOMING (Homing Ring)
125 - MT_THROWNAUTOMATIC (Automatic Ring)
126 - MT_THROWNEXPLOSION (Explosion Ring)
Example: slingitem = 91

spinitem

Replaces the default translucent speed trail left behind by spindashing and spinning on the ground with the specified SOC Thing Entry. Note that this only applies to spindashing and spinning; it doesn't change the speed trail left behind by thokking. For thokking, see thokitem. As with slingitem, the value corresponds not to map Thing #s, but with Thing entries used within SOCs; use the SOC Editor to retrieve these.

Use this attribute wisely. A good deal of values won't produce the desired effect; setting spinitem = 4 (the GFZ Boss Missile), for instance, would appear not to spawn anything; in reality, though, the missile is spawned, but it's automatically destroyed when it collides with the player. All missiles follow this behavior. A bunch more objects (spinitem = 230, MT_HYPERSPARK) won't actually spawn at all, as they require parent objects. A lot of screwy effects can be achieved using this attribute; setting spinitem = 1 (the Blue Crawla) gives the player instant points and lives, and the player can also spin into mid-air and actually ascend due to destroying the spawning Blue Crawlas.

Example: spinitem = 1

thokitem

Replaces the default translucent speed trail left behind by thokking with the specified SOC Thing Entry. This applies only to thokking; for spindashing and spinning, see spinitem. As with slingitem and spinitem, the value corresponds not to map Thing #s, but with Thing entries used within SOCs; use the SOC Editor to retrieve these. This is reportedly useful for custom character abilities.

Use this attribute wisely. See the warning supplied in spinitem.

Example: thokitem = 194

lightdash

Allows the character to perform the lightdash, a la Sonic Adventure. "0" stands for no lightdash, "1" stands for allow lightdash.

Example: lightdash = 1

homing

If the character uses the Thok Special Ability, allows the character to home in on enemies when they are close to them, a la Sonic Adventure. "0" stands for no homing, "1" stands for allow homing.

Example: homing = 1

Implementing S_SKIN1

One can directly make S_SKIN1 by making a new lump in a lump editor such as XWE, and typing the details out. Another way is to open up an external text editor such as Notepad and construct the S_SKIN1 lump that way.

If an external editor is used to make the S_SKIN1, one can import it into the wadfile by saving the text file, and then, using a lump editor such as XWE, importing it into the Character WAD with the name S_SKIN1.

S_SKIN1's placement is very important. S_SKIN1 must be placed right before the first frame of the Character WAD. The reason for this is that once SRB2 reads an S_SKIN1 lump, it automatically tries to look for all of the character's frames — in order — directly after that lump. If they're not directly after S_SKIN1, and another lump is there (say, S_START is the lump after S_SKIN1 rather than PLAYA1,) the game gets confused and it sigsegvs out. Note that if your sprites appear between lump markers S_START and S_END, it's okay to put S_SKIN1 inbetween those lump markers. Just so long as S_SKIN1 appears directly before the first frame, SRB2 will understand it.

This is a typical example of what an S_SKIN1 lump may look like:

name = Idreia
face = IDRALIFE
facename = IDRANAME
ability = 6
normalspeed = 36
thrustfactor = 3
accelstart = 112
acceleration = 42
spin = 0
startcolor = 200
endcolor = 207
prefcolor = 8
jumpheight = 100
waterskip = 1
allowsuper = 0

Note that you don't have to supply all values in S_SKIN1, or even anything at all. Whatever is left out should default to Sonic's attributes, with the exceptions of name and boxindex.

OBJCTCFG

OBJCTCFG is required if you'd like to have your character selectable — and essentially playable — in Single Player, in the Character Select screen. OBJCTCFG is a text lump, the way S_SKIN1 is. In all truth, OBJCTCFG is really an SOC lump, almost exactly the same as MAINCFG, except it only applies to the specific addon WAD it's in. Because it's an SOC lump, the "Character" block can be put into MAINCFG, and the character addon it applies to depends on the "Character" and "SkinName" attributes below.

You'd go about making and importing it in about the same way. OBJCTCFG only has a small amount of variables, compared to S_SKIN1. The variables are:

SRB2 version = 

Character 
PlayerName = 
PicName = 
SkinName = 
Status = 
PlayerText = 

In some character WADs, you might see the attribute "MenuPosition = " in the OBJCTCFG. This is an obsolete value. See MenuPosition below.

Attributes of OBJCTCFG

SRB2 version

Determines which SRB2 version that the Character WAD is designed for. Presumedly, your character is designed for v1.09.4, so you'd want to fill this attribute with "109" (since v1.09.4 is a subset of v1.09.) You see this same variable in the MAINCFG lump, so if you're placing the Character block there, this attribute may already be on the MAINCFG lump.

Example: SRB2 version = 109

Character

Starts a "Character" block. Determines what number your character will appear in when loaded in SRB2 in the multiplayer select screen. This must be set. Simplest option would be to set it to "4".

Example: Character 4

PlayerName

The name of the character that will show up in the Single Player Character Select screen. This is where you would put the name of your character. As this determines what exactly appears on the Character Select screen, spaces and other such characters can be used here.

Example: PlayerName = Dr. Eggman

MenuPosition

{{Template:Askaj}} This, apparently, is an artifact of past SRB2 versions. Formerly, it determined where the character selection entry of the custom character would appear in the Single Player Character Select screen. However, since a new Character Select system was implemented in v1.09.4, this attribute is now obsolete. The new system automatically determines where the character entries would lie in the Character Select screen.

PicName

The name of the image lump that is displayed when the character option is highlighted in the Single Player Character Select screen. This image must be exactly 128 x 128 pixels in size. This value is case-sensitive; presumedly, one would type this value in all capitals, since lumpnames are typically in all capitals.

Example: PicName = EGGMPICS

SkinName

Tells SRB2 the name of the character you made. Use the same variable you used for Character.

Example: SkinName = 4

Status

Currently, its purpose is supposedly to enable or disable the display of the character's entry in the Character Select screen. "0" stands for don't display the character's entry, "32" stands for display the character's entry. "32" seems to give the typical function.

One valid use of this is enabling or disabling characters' entries using separate wadfiles. Say if a Character WAD, with entry Character 0 were initally playable at the start of the game. If another character, Character 1 were added to the play, a story element can occur where Character 0 is kidnapped, so they wouldn't be playable. A separate SOC can be added which defines for Character 0 only "Status = 0", and nothing else.

Example: Status = 32

PlayerText

The description that the character will have in the Single Player Character Select screen. Like in Cutscenes, the text does not automatically wrap. Use line breaks and spaces to accomodate. This attribute string is ended by the # character.

Note that the first three lines are prefixed by a series of spaces. This is to make way for the texts "Speed:", "Ability:", and "Notes:", which come before the respective three lines. Also note that this attribute can only take seven lines of text: one for the Speed, one for the Ability, and five for the Notes. If there are any more, the additional lines get trimmed off.

Example:
PlayerText =              Fastest
                 Speed Thok
             Not a good pick
for starters, but when
controlled properly,
Sonic is the most
powerful of the three.
      #

Implementing OBJCTCFG

Like S_SKIN1, OBJCTCFG is a text lump. The attributes of which can directly be inputted into a new lump in a lump editor such as XWE, or it can be typed up in an external editor program such as Notepad. Using an external editor program, save the OBJCTCFG as a text file, and then import it into the wadfile using a lump editor such as XWE.

This is a typical example of what an OBJCTCFG lump may look like:

SRB2 version = 109

Character 0
PlayerName = Idreia
PicName = IDRACHAR
SkinName = Idreia
Status = 32
PlayerText =              Fast
                 Float
             The visual
depiction of
knowledge, Idreia is
an omniscience ready
to take on the world!#

Frames

A Character WAD consists of a series of frames that make up the visual design of the character that's implemented into the game. At least 170 frames are needed to make a complete character WAD. 272 frames may be made in all.

Naming

Frames are defined in a Character WAD by a certain name format: "NAMEAx", where:

  • "NAME" is a four-letter prefix that's unique to your character
  • "A" is the animation that the frame consists of; see List of Animations below.
  • "x" is the rotation number that defines which rotation the frame consists of.

A Character WAD sprite is depicted in eight rotations. The rotation number defines which rotation the specific frame depicts. Since there are eight rotations, there are eight possible values for this: A1-A8 ("A" being the animation indicator.) One would think that, since there are 34 different animations and 8 different rotations, 272 sprites would have to be made to make a complete character WAD. Actually, one would not have to make nearly this many to make a complete product, as described in The Naming System and Rotations.

The Naming System and Rotations

For starters, SRB2's method of handling sprites allows for a condensed (or abridged) structure of sprites to be used in character WADs. There are eight rotations for a sprite, so one would deduct that there would be eight sprites. However, the way sprites are handled allows two rotations to be compacted into one sprite. The one sprite, which is drawn to depict only one rotation by itself, is merely flipped to serve as a depiction for the second rotation. It's very common — almost universal — practice to take advantage of this rule. If you take a look at a typical character WAD, you'll see listings that consist of lumpnames like these:

PLAYA1
PLAYA2A8
PLAYA3A7
PLAYA4A6
PLAYA5

Note how some of the frames define two rotations: PLAYA2A8, for example, defines that it can be used for rotations "A2" and "A8". The first rotation that's defined tells that the specific rotation is the one drawn in the sprite. The second rotation that's defined tells the game to flip the sprite to make that rotation. This is a good example showing such an action:

File:Characterwad rotflip.png

Adopting this condensed structure allows one to make a character WAD with only 170 sprites, rather than the 272 that the game supports total. It's a very good time-saver.

Note, however, that because the game flips the one sprite using this naming scheme, asymmetrical features would be flipped as well. For example, if the character carried a weapon on their right hand, it would also appear on their left hand by error when the game flips the sprite, as if they were "switching hands". This can be seen as problematic. Contrary to popular belief, however, it's actually possible to make a character with asymmetrical features by falling back onto the uncondensed naming structure of sprites, like so:

PLAYA1
PLAYA2
PLAYA3
PLAYA4
PLAYA5
PLAYA6
PLAYA7
PLAYA8

This way, different sprites can be drawn for all the rotations. PLAYA2 would show the character holding their weapon on their right hand — the one away from the camera, while PLAYA8 could still show the character holding their weapon on their right hand — in this case, the one towards the camera.

Lastly