Elite Force 2 Skin Tutorial

version 1.22
Last Updated: April 12, 2010
With lots of info by Bobo The Seal (former Ritual employee) and the Ritual Uber Docs.

Tutorial Sections


Tools

  • Graphics Program
  • DDS Tool (something to work with DirectDraw Surface files)
  • Zip Program
    • WinZip, Pakscape (for extracting and creating pk3 files)
      If you are on Windows ME/2000/XP or newer you won't need this since pk3 files are just zip files renamed
  • Text editor
    • Notepad++, Notepad, etc.
      Be sure NOT to use anything that puts formatting into the file such as Word, WordPad or Works

Optional Tools


Let's Get Started

This is a quick tutorial on creating a skin for Munro's head (without messing with the dds files) and basic editing of a tiki file.
NOTE: This will work for any texture linked by a tiki in the game.

Extract Pack20.pk3 to your base folder using WinZip or whatever Zip Program you are using. Make sure “Use folder names” is checked.

Editing the tiki:
Go into base/models/char and open hazardteam_munro.tik with your preferred text editing software. I usually use Notepad.

.tik is what we refer to as a tiki file. It's a text file that contains most of the parameters for assets within the game.

Here is an example of some of the areas we can play with. I've made notes within ( ).
Note I'm just going to touch on a few items that deal with appearance at this time:

scale 1.00 (controls the scale of the character)
fade_dist_mod 1
lod 200 1.0 3000 .2 6144
headoffset 25 0 -90
radius 35 (controls the size of the shadow)

texturepath models/char/hazardteam/base-male (location of texture within the games directory structure)
surface material2 shader base-male-body-red.tga (targa associated with particular material id. Note the .tga at the end. If this is left off, the engine looks for a shader)

surface material5 shader base-male-gear-red.tga
surface material6 shader base-male-gear-red.tga
surface material7 shader base-male-gear-red.tga
surface material8 shader base-male-gear-red.tga
surface material9 shader base-male-gear-red.tga
surface material10 shader base-male-gear-red.tga
surface material11 shader base-male-body-red.tga
surface material12 shader base-male-body-red.tga
surface material13 shader leg_strap.tga
surface material14 shader leg_strap.tga
surface material15 shader b-male-display-red.tga


surface material36 shader base-male-body-yellow.tga
surface material37 shader base-male-body-yellow.tga
surface material38 shader base-male-body-yellow.tga
surface material39 shader base-male-body-yellow.tga


texturepath models/char/hazardteam/munro
surface material1 shader head.tga
surface material35 shader munrohairalpha (Note the absence of a .tga. this indicates that this material has a shader on it by the name munrohairalpha. We will get into shaders at a later time)

texturepath models/char/face
surface material3 shader munro-face.tga flags nocustomshader

texturepath models/char/misc
surface material28 shader comm_badge
surface material29 shader lieutenant


replacesurface material1 material1 models/char/hazardteam/munro/munro-base.skb models/char/hazardteam/munro/munro-morph.skm (This signifies a model swap. In this case we are swapping out material # 1 of munro's model file with material #1 of the hazard Team base file. All hazard team males share the same body model.)
replacesurface material3 material3 models/char/hazardteam/munro/munro-base.skb models/char/hazardteam/munro/munro-morph.skm
replacesurface material35 material35 models/char/hazardteam/munro/munro-base.skb models/char/hazardteam/munro/munro-morph.skm

}
//AI Data
$include models/aidata/teammate/teammate_aidata.tik
init
{
server
{
classname Actor
name "HazardTeamMunro"
archetype "HazardTeamMunro"

health 100
surface material36 +nodraw (this tells the engine not to draw specific materials #s)
surface material37 +nodraw
surface material38 +nodraw
surface material39 +nodraw

For this next tutorial we are going to focus on skinning the head. All we need to do is change the name of the head.tga to something like head1.tga. This is how we are going to get around the .dds issue. Instead of drawing head.tga the engine will place head1.tga (the image that we will create) onto the model in-game. You should have something like this:

texturepath models/char/hazardteam/munro
surface material1 shader head1.tga

Save the .tik and move on to the paint program of your choice.

Skinning:
Now if you want to skin over (or simply modify) the actual skin files from the game you will need convert the .dds to .tga
Here is a push in the right direction for that:
DDS texture tools or DDS converter 2.1 or Instant Texture Viewer (Instant Texture Viewer lets you view a DDS files instantly, even from inside a zip or pk3 file)

For this tutorial I'm just going to use the texture mesh for Munro's head. (We will release all of the MP characters texture meshes in a zip once the game comes out). Use this as a guide to paint your head skin.

head and face skin outlineeye and mouth skin outline
Here is a quick guide to help out:
skin parts
Material 1 makes up the majority of the head
Material 3 is the eyes and mouth
Material 35 is his hair

Simply create your skin in a paint program like Photoshop, Painter, or Paintshop Pro. Make sure that your skin is a multiple of 2 pixel resolution (16, 32, 64, 128, 256, 512, 1024, etc,,,). We use a 256x256 for the head and a 128x128 for the eyes and mouth texture.
Once you have something your happy with save the image to:
base/models/char/hazardteam/munro/
Name it head1.tga (or whatever you called it in the tiki)

Your good to go!

Heh, as an example I quickly took a photo of myself (Bobo the Seal) and pasted it on Munro.
bobo skin

SKINNIN HURT HEAD!!! BoBo MAD!! BoBo SMASH!!!!!!

um….yeah….

I also went into the tiki and changed his scale to 14:
scale 14

Munro's eyes to chells eyes:
surface material3 shader chell-face.tga flags nocustomshader

and set his hair to nodraw:
surface material35 +nodraw


Viewing Your Skin In Game

Some useful commands for viewing your character in game:
First put:

seta developer "1"

in your config.

Start a map and drop down the console by pushing ~ (tilde)

to view a character type in:

viewspawn char/tikiname

example: viewspawn char/hazardteam_munro.tik

To go into window mode hit alt + enter

To switch between EF2 and another program (Photoshop) hit alt + tab. You can make corrections to your skin without getting out of the game. Change what you want in Photoshop, save, and alt + tab back to EF2. Then vidrestart.

Type in vidrestart to flush the engine. This will load any new content. You will see your skin update.

Type in flushtikis if you make any adjustment to a tiki file while still in the game. You will see the model update.

We really have a lot of flexibility with how we display characters in the game. Play around and see what you can come up with.

The following commands allow one to test a TIK model inside the game

  • viewspawn <modelname>
    Spawns a viewthing with <modelname> as the model.

  • viewmodel <modelname>
    Sets the model of the current viewthing

  • viewthingnext
    Makes the next viewthing in your world the current one.

  • viewthingprev
    Makes the previous viewthing in your world the current one.

  • viewnext
    Increments the current frame of the current viewthing.

  • viewprev
    Decrements the current frame of the current viewthing.

  • viewnextanim
    Increments the current anim of the current viewthing.

  • viewprevanim
    Decrements the current anim of the current viewthing.

  • viewanimate
    Toggles the animation of the current viewthing. 4 states, off, on, on with movement, on with movement and looping.

  • viewscaleup
    Increments the current scale of the current viewthing.

  • viewscaledown
    Decrements the current scale of the current viewthing.

  • viewscale <scale>
    Sets the scale of the current viewthing.

  • viewyaw <angle>
    Sets the yaw of the current viewthing.

  • viewdelete
    Deletes the current viewthing.

  • viewattach <tag name> <fully realized path name of model to attach>
    Tag name is the name of the tag to attach to, fully realized path name would be like <models/grunt.tik>, normally on viewspawn and viewmodel commands you don't need to prepend models/, but in this case you do.

  • viewdetachall
    Detach and delete all my children.

  • vieworigin <x y z>
    Specifies an absolute position for the viewthing.

  • viewangles <pitch yaw roll>
    Specifies new angles for the viewthing.

  • R_lodscale
    Adjust the global LOD scale for all models, default is 5. Lower values increase LOD, higher values decrease LOD. You can easily bind two keys to change the CVAR like so:
    • Bind key1 “add r_loadscale 0.25”
    • Bind key2 “add r_loadscale –0.025”

TIKI Model System

The TIKI model system is designed primarily with modularity in mind. Traditional engines use a monolithic file format to represent their models which limits the use of a particular model or set of animations. The TIKI system solves this by creating an easy and convenient way of making many different models with the same set or subset of animations. The TIKI system works with either 3D Studio MAX or Lightwave.

Before the internals of the system are explained, it is very important that one learns how to use Visual SourceSafe effectively. Visual SourceSafe is an application that allows one to make multiple revisions of a file and log those changes so that at any time, one can access any previous version with a simple mouse click. The reason this is crucially important because as the assets increase it will become an ever-increasing job to maintain all the assets. Since the artists and modelers are the asset creators, it will be your job to make sure that the assets are kept up to date and correct. Here is a breakdown of concepts that are important with SourceSafe: checking in files, checking out files, Setting one's working folder, Showing history of a particular file. Since explaining these concepts has already been covered in the documentation for SourceSafe, they won't be covered here.

The TIKI model system employs three different kinds of assets: the TIK file, a number of TAN files and a number of TGA files. The TIK file is the main file of the TIKI model system, it defines all the different animations to be used for a model as well as which textures are to be used and any unique information for that model. The TAN file is a proprietary format that is created by LW2TAN for Lightwave and MAX2TAN for 3D Studio MAX 2. The TGA file is the native format for the textures used to comprise the skin of the model.

The TAN file

The TAN file is a TIKI animation file, it is the basic building block of all models. A TAN file can be created in one of two ways, using the LW2TAN utility for Lightwave or using the MAX2TAN exporter for 3D Studio MAX 2. Any animation can be converted to a TAN file provided that it meets the following requirements:

  • It must have texture coordinates assigned. Either through a uv file in Lightwave's case or have them present in the model for 3D Studio MAX.
  • All animations must match each other in terms of number of surfaces, number of triangles, number of vertices, and number of tags.

TAN files support a bunch of unique features including: tags (bones), origin and surfaces.


TIK File Format

The beginning of a TIK file must always start with the “TIKI” identifier. The rest of the TIK file is made up of sections. A TIK file is broken up into 3 distinct sections, the setup section, the init section and the Animations section. The setup section is the section in which all surface definitions are made as well as things like global scale and global origin offset. The Init section contains all setup events for a given model for both the client and the server. The Animations section is where all animations are defined. This section also contains the individual frame definitions for each animation in the model.

General .TIK Info

A TIK file can be created with any text editor. For those that do not have a preference, Notepad is a simple text editor included with Windows 95/NT.

The TIK file supports some unique parsing tools that can make one's life easier. First of all, a TIK file can contain any number of Setup, Init and Animation sections, there doesn't have to be just one of each. This has no real application for a single TIK file but makes more sense when one considers the next feature of TIK files. TIK files support two unique keywords which are $define and $include.

$define <macro_name> <macro_expansion>
This allows one to define a macro that will be automatically substituted in the TIK file. This feature is especially useful when one has a filename or some piece of text that is used over and over again and may change at any time. Macros can only be used in the file once they are defined, so a macro won't be substituted correctly until it has been defined. Macro definitions can be placed anywhere in the TIK file regardless of which section is currently being processed. Here is an example:

$define texpath textures/gorilla/head/

surface head shader $texpath$nostril.tga

When the shader definition for the head is parsed instead of getting “$texpath$nostril.tga” as a texture name. The macro would be properly substituted and one would get “textures/gorilla/head/nostril.tga”. Macros must be surrounded by the “$” to be properly substituted.

$include <filename>
This allows one to include another file into the current one. What this means is that the included file will be parsed from then on in the TIK file until the included file's end has been reached. This allows one to include a “common” TIK file that has the basic animations and setup information for a particular group of models and then make only a few minor changes in this TIK file.

Comments may be created in TIK files at any time simply by starting the comment out with “//”. Once the double slash is encountered, the rest of the line will automatically be skipped.

.TIK Setup Section

The format of the setup section is as follows:

Setup
{
<setup_keyword> …
.
.
.
}

The following are valid setup keywords: scale, path, origin and surface.

  • scale <global scale value>
    Allows one to globally scale the model, where 1.0 is the default scale.

  • path <subpath>
    This will be prepended to all TGA and TAN files. One can use the “path” command to specify a subdirectory where all the files are located.

  • origin <x y z>
    Apply a global origin offset to all animations. This allows one to re-position a model without having to re-export it.

  • lightoffset <x y z>
    When lighting the model, apply this offset to the lighting sample location. This can be used to fix models whose centroids occasionally drop below the origin.

  • surface <surface_name> flags <flag_keywords …>
    surface <surface_name> damage <damage_multiplier>
    surface <surface_name> shader <shader_name>


    • surface_name
      This is the name of the surface to modify. This can also be “all” to apply to all surfaces or utilitze the “*” to modify multiple surfaces at once. For example, given that we have a model with all the default surfaces defined. If the surface_name is “legs*”, then all surfaces beginning with “legs” will be modified.

    • flags
      This allows one to modify default surface attributes utilizing the following keywords: skin1, skin2, skin3, nodraw, twosided, nodamage, nomipmaps.

    • damage
      This allows one to specify how much the damage should be “amplified” or scaled when damage is inflicted upon this surface.

    • shader
      This allows you to specify which texture will be used on which surface. If the “shader_name” ends in a “.tga” then that texture will be used. If it does not end with an extension, then the “shader_name” will be assumed to be a valid shader registered in some other “.shader” file.

.TIK Init Section

The format of the init section is as follows:

Init
{
Client
{
.
.
.
}
Server
{
.
.
.
}
}

Client initialization events are executed when a model is registered on the client. Server initialization commands are executed when ever the model is spawned on the server

.TIK Animations Section

The format of the Animations section is as follows:

Animations
{
anim_alias <filename.TAN>
{
client
{
<frame_num> <events …>
.
.
.
}
server
{
<frame_num> <events …>
.
.
.
}
}
anim_alias <filename.TAN>
}

Each animation is defined by an anim_alias followed by a TAN file. The alias allows one to rename the animation so that it can adhere to a naming convention, without having to rename all the TAN files to the same name. It also allows the same animation to be used multiple times with different effects. The braced section following an animation define the events to be processed on the client or server at specific frames of the animations.

  • frame_num
    This is either a specific frame number from 0 to the number of frames in the animation minus one. This can also be one of the keywords: start, end, first, last, every, entry, and exit. The exit keyword means that that command will be executed whenever leaving that animation. The entry keyword means that the command will be executed the first time you enter an animation, all subsequent loops of the animation will not call this event. Both entry and exit can only be used on the client.

Sample TIK File

TIKI       // All TIKI files must have this at the
           // beginning of the file
setup      // The setup section
    {   
    scale 1.1  // specify a scale of 1.1
    path models/sample // set the path for all files to
                       // models/julia
    surface all shader eden_julia_dam5.tga // set all surfaces to use
                                           // eden_julia_dam5.tga as their
                                           // default texture
    }

        
$define playerdir player/julia/taunts

           // define a macro called playerdir
init       // The init section
    {   
    server // the server init events
        {       
        setsize "-16 -16 0" "16 16 40" // override the default bounding box

         //
         // create some default taunt sound aliases
         //
         aliascache snd_taunt1 $playerdir$/getbent.wav"
         aliascache snd_taunt2 $playerdir$/gtthrt.wav"
         aliascache snd_taunt3 $playerdir$/mkmybtc1.wav"
         aliascache snd_taunt4 $playerdir$/rcknrll2.wav"
         aliascache snd_taunt5 $playerdir$/rstnpcs.wav"
         aliascache snd_taunt6 $playerdir$/schldy.wav"
         aliascache snd_taunt7 $playerdir$/trynw1.wav"
         aliascache snd_taunt8 $playerdir$/whsyrdd1.wav"
         aliascache snd_taunt9 $playerdir$/harry.wav"
         }
    client // the client init events
        {
           // There are no initialization events for the client
         }
     }
animations
     {     // The animations section
    idle f_edenjulia2.tan       // create an animation called idle
    taunt f_edenjulia2.tan      // create an animation called taunt
        {
        
        client // client events for the taunt anim
            {   
            first playsound snd_taunt // on the first frame of idle play
                                      // a taunt sound
            }
         }
     }

Taking Screenshots & Viewing Skins

Information taken from a Ritualistic EF2 forum post (they changed their forum links so I dont have the exact page anymore and I couldn't find it when I searched, but the information is here).

To view models/skins, the best way to do it is via the viewspawn command. In the console, type

viewspawn models/pathto/themodel.tik

An example of a actual model would be:
viewspawn models/char/dm_attrexian-sf.tik


If this is a character then the model will stand up straight with arms on the side, you can walk around it to get a good angle/shot. EF2 also has a brilliant menu called Animate. Type this in the console:

bind x togglemenu animate

Press x on your keyboard and a little blue-ish menu will come at the bottom of the screen. With this, you can scale the model, change it's xyz angles, play it's various animations, etc.

To get a shot without your crosshair, you type

cg_crosshair 0

and then

cg_crosshair 1

to get it back.

You could also get 7o'nine's Cleanshot/Thirdperson Menu. It's good for taking screenshots without any of the HUD showing up (only works in Single Player mode and make sure you read the installation instructions).

Though this wont solve your problems of not being able to spawn your model. However, you can get shots of it by changing to that skin yourself, then going into 3rd person mode, in the console type:

cg_3rd_person 1

Next in the console type:

+cameralook

Now you can freely rotate around your character and get a good shot of it. You could also use 7o'nine's Cleanshot/Thirdperson Menu to get some nice screenshots without the HUD or crosshairs. To get back to normal, type the following in the console:

-cameralook
cg_3rd_person 0

NOTE: You might have to have cheats enabled to do some of these commands.


Shaders

Basically shaders allows for some great effects, such as glowing, textures pulsating, etc. They aren't necessary for a skin, but if used correctly they add great effects. Here are some good links on shaders
Q3ASE
Shader Docs


Photoshop 7 and TGAs

If you are having problems with tga files and you are using Photoshop 7, this is due to the fact that there is a bug in Photoshop 7. You can update Photoshop to 7.01 from Adobe's website or you can download the targa fix from here (it has the fix for Windows and Macintosh versions).


DDS Files

DDS files are DirectX compressed textures and is an abbreviation for DirectDraw Surface. Use the following plugins to work with DDS files.

DDS texture tools or DDS converter 2.1 or Instant Texture Viewer (Instant Texture Viewer lets you view a DDS files instantly, even from inside a zip or pk3 file)


Additional Information

The better you know how to edit images the better your skins will turn out. Most modern graphic programs allow for things such as layers, textures, adjusting gamma, brightness hues, and so on.

Consider this tutorial as a starting point and a reference. I recommend looking at Quake3 and even Quake2 tutorials out there that go into tips on how to make metal effects, armor textures, and so on.

Questions? Need help?
Search, read and post questions on the Ritualistic EF2 forums