1st Step: Preparing YOUR MIND! | ||
Fighters and RPGs are two completely different genres. Although apparently un-mixable, you can have a bit of that
super-deep-and-thoughtful-story vibe with your fighter. Before each fight starts and after the final fight, you have
the possibility to use one of those eponymous story boards. To allow ultra-flexibility, all this Story Board does is
give you full control over five textures, two text boxes and two sound effects (at least while I'm writing this,
ha!). There are some basic rules which you need to consider: First, Story Boards are based on actions. Actions can be anything, ranging from loading new textures or changing existing textures to loading new text-boxes. Furthermore, actions have a fixed duration, and once an action is over, the next one is loaded immediately. Pressing the A button during a story board immediately advances the Story Board by one action, pressing the Start button ends the whole thing immediately and pressing the normal Dreamcast Return-To-Title-Screen button combo... returns the game to the title screen. | ||
2nd Step: Preparing the sprites! | ||
The sprites to be used with Story Boards must be PNG-files which have a power of two (64/128/256/etc). This time around,
palettes are not supported. Just take care when naming your textures: Every name must be EXACTLY eight letters long. In
addition to that, animated textures need to have the frame's number added to the name. So the second frame of an
animated texture called BLACKOUT would be called: BLACKOUT2.png A "normal" unanimated texture which is named MESSAGES would be called: MESSAGES.png The main tool here, the Story-Board-Dolmexiler, takes care of conversions and everything, so end this step by putting all textures in the same folder. |
Pure Sexiness. | |
2-and-a-halfth Step: Preparing the Sound Effects! | ||
Sound Effects have to be in the .wav format. This can either be the Microsoft Wave format everyone loves and knows, or
the Yamaha ADPCM format, the converter for which comes bundled with KallistiOS. There are some limits though:
The sound effect's quality and type are restricting the maximum length a sound effect may have. 44kHz - Stereo - Microsoft WAVE = 1.5 seconds. 22kHz - Stereo - Microsoft WAVE = 3 seconds. 44kHz - Mono - Microsoft WAVE = 3 seconds. 22kHz - Mono - Microsoft WAVE = 6 seconds. 44kHz - Stereo - YAMAHA ADPCM = 6 seconds. 22kHz - Stereo - YAMAHA ADPCM = 12 seconds. 44kHz - Mono - YAMAHA ADPCM = 12 seconds. 22kHz - Mono - YAMAHA ADPCM = 24 seconds. As you can see, the Yamaha format lasts about four times longer than the Microsoft format. It loses some of its quality, although the difference is hardly noticable, especially for sound effects. As far as naming conventions go, each sound effect name must consist of EXACTLY eight letters and must end with the file extension .wav, no matter the type (Both Microsoft WAVE and Yamaha ADPCM files end with .wav). So an acceptable file name would be: CLICKING.wav. Stuff the sound effects in the same folder you put the textures in and follow the next step, bro. | No, I did NOT forget that step earlier. Two and a half is a perfectly legit number! | |
3rd Step: Preparing the Dolmexiler! | ||
This would be a good time to download the Story-Board-Dolmexiler. It comes as two files: The executable and the
TOOLS.cfg. In case you already have experience with making stages, you can simply reuse the Stage-Dolmexiler's
TOOLS.cfg. Should you not have a prepared TOOLS.cfg yet, here is how you have to modify it: Open the TOOLS.cfg. There, define the command line used to call genromfs, the KOMPRESSOR (available at the downloads section) and kmgenc. Notice how I did not mean simply the programs location, but rather the line necessary to perform the desired option. Here is an example how the three parts could be filled: KMGENC = [/home/captaindc/kos/utils/kmgenc/kmgenc -a4] GENROMFS = [/home/captaindc/dc/kos/utils/genromfs/genromfs] KOMPRESSOR = [/home/captaindc/Desktop/kos/KOMPRESSOR/kompressor] Yup, the -a4 option has to be included in the kmgenc line. Now that you have finished setting up the tool, open a new text file with the barebone ASCII editor of your choice (Windows: Editor; Linux: Mousepad) and ready yourself for the next step. | ||
4th Step: Preparing the Header! | ||
With that empty textfile you should have in front of you now, you are going to accomplish the near-impossible mission:
Declare enough values to enable the Dolmexiler to turn those sprites of yours into the Story Board you have in mind.
But first things first, in order to actually declare values, you need to stick to the following formula: An initiator,
followed by a single space, an equal sign, another single space and finally the value in brackets. So if you had an
initiator called SUPERCOOLVALUE which takes numbers as its input, it would be: SUPERCOOLVALUE = [42] The spaces are very important, so never fiddle with those. Before starting with the actual "actions", you need to declare some values for the header. Check the list below to see what you need to include: --- CHARACTER NAME = [STICKLER] The character this Story Board will be used with. Your Story Board would still work, even if you put some gibberish here. Story Boards are freely interchangeable between characters. To conclude, include this line if you want, it might become compulsory for later versions, but right now it is optional. In case you want to include it, please keep in mind that the name has to be EXACTLY eight letters long --- WHICH STORYBOARD = [1] This one deals with the filename of the final .sbd file to be created. So in that example, the final file would be named 1.sbd. Additionally, this value is used to refer to the Story Board in the Story Mode Tutorial. Feel free to rename the file later on: If you rename 1.sbd to 2.sbd, its identifier value would become [2]. | ||
5th Step: Preparing the "Actions"! | ||
That was a short header. Now, it is time to declare data for each "action". The data of each section starts with three
number signs (###), followed by the DURATION and finally the data for single textures/text/sound effect that is changed,
with each one starting with three minuses (---). But let's do this step by step, once again, here is a comprehensive
list with everything that needs to be done for each action: --- ### Every action needs to start with those number signs. Weird enough, some people like to call them "pound signs". So what do these people call the sign representing the currency "pound"? This guide can't answer that, but I'll tell you that as long as you always put these three signs in front of each action, you're good to go. --- DURATION = [30] This is basically the time until the next action is executed. Please note that this value is in frames, so with the engine running a 60 frames per second, the next action in this example would be loaded in half a second. The value ranges from 0 to 65535. It can be very useful to set it to a near-infinite duration (e.g. 30000) in order to prompt button input from the player (The A button advances the Story Board by one action, remember?). Be creative, the DURATION can be a very flexible tool if used in a snazzy way. --- SOUND TRACK = [7] You can include this line if you want to start playing a certain track from the CD. Let me remind you that the first six tracks of the Engine are reserved for the various modes, so the lowest track you can use is [7]. Those tracks are not burned to the disc until the final Create-A-Disc tutorial, so keep the track (which should be a 44kHz Stereo Microsoft WAVE file by the way) and put it somewhere else 'till then. If you don't want to change anything about the track playing, simply leave out this line. --- --- Now you have to define the data for everything you want to change/load/destroy. Each texture, text and sound effect is addressed independently, with every single chunk of data starting with those three minuses above. Let's say you want to change Texture #2, Texture #5 and Sound Effect #1. In that case, you had three chunks of data, each one starting with three minuses. By the way, you have to declare ALL the Texture stuff you want to do first, after that ALL the Text stuff and finally the sound effect things. You can address as many things as you want in a single action, the only limit is the amount of textures, texts and sound effects available. --- INFO TYPE = [TEXTURE] This tells the Dolmexiler whether you are going to declare things for a [TEXTURE], a [TEXT] or a [SOUND EFFECT]. Always stick to that order: First, declare all the [TEXTURE] things you want to declare, afterwards declare all [TEXT]s and finally declare all [SOUND EFFECT]s. --- TEXTURE ID = [0] Only if INFO TYPE = [TEXTURE]. You have five texures available, their IDs ranging from 0-4. This is where you declare which of these textures you are going to address. --- TEXTURE ACTION = [LOAD] Only if INFO TYPE = [TEXTURE]. This deals with what you are going to do with the texture. You can [LOAD] a new texture (while also declaring its data), [CHANGE] the data of a texture that is already loaded or [DESTROY] (= deactivate) a texture that has been loaded before. --- WHICH TEXTURE FRAME = [0] Only if INFO TYPE = [TEXTURE]. If your texture is animated, use this value to determine which frame is displayed first. If your texture is not animated, set it to [0], or leave it out entirely. --- TEXTURE FRAME AMOUNT = [1] Only if INFO TYPE = [TEXTURE]. If your texture is animated, this value determines how many frames your texture has. In case your texture is not animated, set it to [1], or just leave out the line. --- TEXTURE SPEED = [60] Only if INFO TYPE = [TEXTURE], although the whole "TEXTURE" SPEED thing gives it away. Anyway, if your texture is animated, this value deals with how long each frame is displayed. It is in Frames, so keep in mind that the engine is running at 60 frames per second. Alas, a value of 60 would evaluate to one second. Cool, isn't it? Uhhh, anyway, if your texture is not animated, you can exclude this line. --- TEXTURE LOOP = [YES] Only if INFO TYPE = [TEXTURE], but you'd never think TEXTURE LOOP was something a sound effect would use, would you? This line is only important for animated textures, as it deals with the thing to happen once the FRAME AMOUNT frame has been displayed: The animation can either restart with frame #1, or it can remain inactive, portraying the final frame and not really doing much else with it. Oh, by the way: Unanimated textures don't need this line. Convenient, huh? --- TEXTURE POSITION X-AXIS = [250] Only if INFO TYPE = [TEXTURE], else instant death. To put it simple, this is where your texture will be drawn to. This value's unit is "pixels", so remember that the screen is 640 pixels. --- TEXTURE POSITION Y-AXIS = [20] oNLY iF INFO TYPE = [TEXTURE], cAPSLOCK iS fUN. Much like the value above, this is where your texture is drawn to. Just remember that unlike with mathematics taught in schools, the screen's Y-AXIS runs from the top (0) to the bottom (480). --- TEXTURE POSITION Z-AXIS = [1] Only if INFO TYPE = [TEXTURE], else ninjas will capture your first-born child. The Z-AXIS is pretty straightforward: Textures with a higher value are drawn above textures with lower numbers. Not sure if there's a limit here, the normal Fight screen uses about 17 layers. So yeah, let's say 20. Although you may find it a tad difficult to fill 20 layers with the five textures available, heh. --- TEXTURE SIZE X-AXIS = [250] Only if INFO TYPE = [TEXTURE], I'm repeating this 'till you know it by heart! The size with which te texture is drawn to the screen. This is NOT the real size of the images you have used, only the size with which they are DRAWN to the screen. The screen is still 640 pixels, twice as large as most fighters, but hey, this neither the time nor the place to show off. --- TEXTURE SIZE Y-AXIS = [250] I've told you so often to "Only [use it] if INFO TYPE = [TEXTURE]", so I'm not going to say it this time. Either way, an average manual would tell you that this value is just like TEXTURE SIZE X-AXIS. Not this manual though, the fine subtle difference here is that the screen's size is 480 pixels. Oh, and it runs from the top (0) to the bottom (480). Tricky. --- TEXTURE MOVEMENT X-AXIS = [-3] Only if INFO TYPE = [TEXTURE], only if that is the case, OKAY? Anyway, this value declares how fast the texture moves per frame. So the value is added 60 times a second to the texture's position. --- TEXTURE MOVEMENT Y-AXIS = [3] Only if INFO TYPE = [TEXTURE], should this manual ever turn into a musical number, that will be the refrain. Just like the value above. Positive values mean the texture moves down, negative values move the texture up. --- TEXTURE REAL SIZE X-AXIS = [256] Only if INFO TYPE = [TEXTURE], why are the images in a game called "texture" anyway, there's neither text nor... ure-stuff. This value refers to the actual width of the image. Like you (hopefully) know already, it has to be a power of two (64/128/256/etc). If your image size is not a power of two, this is the time to throw your fists in the air and curse the fact that you have apparently misread step 2. --- TEXTURE REAL SIZE Y-AXIS = [256] Only if INFO TYPE = [TEXTURE], we are getting closer to the end of the texture stuff though. Works just like the one above, but deals with the image's height. --- LEFT INTERNAL TEXTURE POSITION = [0] Only if INFO TYPE = [TEXTURE], did you actually believe in what I said last time? Anyway, this value deals with what part of the original image is actually drawn. With this one, you can tell the engine at which percentage the left side of the texture that is to be drawn is located. If you want to draw the entire Texture, just set it to [0]% --- RIGHT INTERNAL TEXTURE POSITION = [100] Only if INFO TYPE = [TEXTURE], you are far from done, buddy. This value belongs to the LEFT INTERNAL TEXTURE POSITION one. Like the one above, it deals with the location (in percentage) within the image, which is drawn at the right. To draw the entire texture, just set it to [100]%. --- UPPER INTERNAL TEXTURE POSITION = [0] Only if INFO TYPE = [TEXTURE], nah, I was just messing with you, I don't know myself how many values you still need to declare for this texture. Ongoing jokes aside, this one works just like LEFT INTERNAL TEXTURE POSITION, but deals with the Y-AXIS instead. So yeah, like with the other one, set it to [0]% to display the entire texture. --- LOWER INTERNAL TEXTURE POSITION = [100] Only if INFO TYPE = [TEXTURE], the finish line is just ahead... Okay, here is a pop quiz: If UPPER INTERNAL TEXTURE POSITION is the Y-AXIS equivalent of LEFT INTERNAL TEXTURE POSITION, how does LOWER INTERNAL TEXTURE POSITION relate to RIGHT INTERNAL TEXTURE POSITION. Hint: Set this value to [100]% to just display all of the texture. --- TEXTURE NAME = [MESSAGES] If INFO TYPE = [TEXTURE] is only, young padawan. The final texture-related value, this one is nothing but the name you have given to the image back in step #2. Eight letters only, mind you! --- TEXT ID = [0] If INFO TYPE = [TEXT]. All values from now on are for text boxes. You have two text boxes available, one with the ID [0] and one with the ID [1]. With this line you tell the engine which text you are going to address now. --- TEXT ACTION = [CHANGE] Only if INFO TYPE = [TEXT]. Here, you reveal just what you are going to do with the text box. You can either [LOAD] (= activate), [CHANGE] (= change. Wow.) or [DESTROY] (= deactivate) the text box. --- TEXT FONT COLOR = [BLACK] Only if INFO TYPE = [TEXT], a brand new stack of values, isn't this fabulous? Well, like expected, this is the color (or colour) your text has. Colo(u)rs available are: [BLACK], [RED], [GREEN], [BLUE], [YELLOW] and [WHITE]. My rainbow isn't quite as colorful, you see? --- TEXT BUILD UP = [YES] Only if INFO TYPE = [TEXT], this value has a unique twist to it: Basically, it means that the text is not immediately drawn to the screen in its entirety, but rather adding a new character every TEXT BUILD UP SPEEDth frame (the next value). It's just like a typewriter, someone is typing the text to the screen as you are watching it. Yup, that is a nice comparison. --- TEXT BUILD UP SPEED = [3] Only if INFO TYPE = [TEXT], oh, and only if TEXT BUILD UP is set to [YES]. This declares how fast a new character is added to the text drawn to the screen. Like with most SPEED-type-values, it's unit is frames. So keep in mind the engine is running at 60 frames per second. --- TEXT POSITION X-AXIS = [20] Only if INFO TYPE = [TEXT], it's still a little while 'till we get to the Sound Effect stuff. This value deals with the position of the text BOX, the position on the screen where each new line of text is started. --- TEXT POSITION Y-AXIS = [300] Only if INFO TYPE = [TEXT], let's do this. Deals with the position of the text box, this is where the first line of text is drawn. --- TEXT POSITION Z-AXIS = [2] Only if INFO TYPE = [TEXT], I wonder which guide will be longer, this one or the one for creating characters. Text boxes with higher numbers are drawn above other things with lower numbers. The Z-AXIS applies for textures and text boxes. Not really for sound effects though. --- TEXT SIZE X-AXIS = [600] Only if INFO TYPE = [TEXT], just imagine if I had forgotten to tell you, you would have been a goner for sure! Deals with the size of the entire text box, once a word exceeds the text box size, a new line is started. That way, you w on' t ha ve weir d stuff like this. --- TEXT BREAK SIZE Y-AXIS = [5] Only if INFO TYPE = [TEXT], sound effects won't profit from this line! WARNING, do not confuse this value with TEXT SIZE Y-AXIS. That one does exist, but serves no real purpose anymore so it was left out. No, this value deals with the breaks between lines. Some fonts (for example the D-Engine default font) look really messy if the next line is started right below the line above. To cope with that, my army of Oonka-Loonka programmers came up with this value which adds some space between lines. --- TEXT FONT SIZE X-AXIS = [19] Only if INFO TYPE = [TEXT], like the friendly capitalized TEXT in the identifier tells us. This one is the size of each single character. Kinda simple and boring, but hey, they can't all be space-ninja-apocalypse-values. --- TEXT FONT SIZE Y-AXIS = [19] Only if INFO TYPE = [TEXT], not as fancy as textures, but they are just as cool as them. The height of each single character. There, THAT value's interesting, bazinga! --- ACTUAL TEXT = [I'm so freaking awesome bro, I know how to make STORY BOARDS by heart!] Only if INFO TYPE = [TEXT], as you can see, the most interesting values are always saved 'till the very end. This is where you text goes. Whatever that text box is supposed to contain goes here. The text must not be longer than 256 characters and does not support those äüö characters found in some languages, but does support pretty much every key featured on the standard QWERTY keyboard. --- SOUND EFFECT ID = [0] Only if INFO TYPE = [SOUND EFFECT]. We are getting to the final declarations, you're almost done (for this action anyway...), so let's get cracking: Like the other two ID identifiers, this value tells the Dolmexiler which Sound Effect you are going to address. Like mentioned a wall of text ago, you have two sound effects available, which limits the IDs you can use to [0] and [1]. --- SOUND EFFECT ACTION = [DESTROY] Only if INFO TYPE = [SOUND EFFECT], just a few more. If you have been reading this for a while, this might seem familiar to you. This value declares what you want to do with the Sound Effect, you can [LOAD] (= activate), or destroy a previously loaded sound effect. If the sound effect is played, it is automatically [DESTROY]ed, so you don't have to use that one often. --- SOUND EFFECT NAME = [CLICKING] Only if INFO TYPE = [SOUND EFFECT], just imagine what sound would come up if the engine was trying to load a texture as a sound effect, haha. The sound effect's name. Like the section dealing with sound effects must have spoiled already, this name must be exactly eight letters long. Maybe one day I will explain why all names must be eight letters long, probably not though. --- SOUND EFFECT PLAY TIME = [0] Only if INFO TYPE = [SOUND EFFECT], the final value you need to know. Consider this an offset: The frames to pass after the action has been loaded before the sound effect is played. Set it to [0], like I did, to have it play immediately. --- | ||
6th Step: Dolmexiling! | ||
Welcome back, are you done with all the actions already? Then close and save the text file (probably not in that
order) to finish everything with one last command line. The Story-Board-Dolmexiler takes several input flags, check this
list to check 'em out: -i = This flag is followed by text file you just made. -d = The folder where your textures and sound effects are located. -o = The output folder where you .sbd file will be created. So if you text file is located at "/home/captaindc/INPUT.txt", your texture/sound effect folder is located at "/home/captaindc/RAW/" and your output folder is "/home/captaindc/OUTPUT/", the correct command line would be: S-BOARD -i /home/captaindc/INPUT.txt -d /home/captaindc/RAW/ -o /home/captaindc/OUTPUT/ There you go, this should have created your Storyboard. If it hasn't, check the command line output to check if you have forgotten to include a compulsory line or something. Anyway, once you have that .sbd file, keep it around for the final tutorial, which deals with putting together a complete Dolmexica disc. I hope you had success with creating your own perfect story. If there are still problems, check out one of the example files or try to contact me personally. See you around! |