Skip to content

Basic Modding Tutorial

eArmada8 edited this page Dec 14, 2025 · 1 revision

Basic Modding Tutorial

Here is a basic modding tutorial for folks who want to get started modding characters in Tales of Vesperia. While I have written the toolset to accomodate complex modding, understanding what is going on under the hood is not necessary for most simple mods. Here we will do a basic mesh delete, mesh modification (partial delete in this case) and texture replacement. This tutorial does not have any major spoilers.

Note that this is not a tutorial on how to use tools like Blender or Paint.NET. I will not be teaching basic universal skills - please refer to other tutorials such as those on YouTube etc. I particularly recommend watching "3DMigoto Costume Mod Tutorial for Fairy Tail (PC)" by Ikaros; while it was made for 3DMigoto, I learned 90% of what I know from that video alone. I will put some basic steps so that you can still follow along, even if you have no Blender skills, but this tutorial will be much easier with some basic skills.

Basic Setup

  1. Install Python 3, if you don't have it already. (www.python.org/downloads, I'm using python 3.13 but any version newer should work.) Be sure python is included in PATH when installing!
  2. Install Blender (free!) in Steam. Optional: change to 4.2 LTS (right click Blender in steam, select Properties -> Betas -> 4.2 stable LTS).
  3. Download DarkStarSword's plugin here (Right Click, Save As)
  4. Install the plugin (Blender -> Edit menu at top -> Preferences -> Add-ons -> Install, click the link for video.)
  5. For altering textures, I will be using Paint.NET, and I will be using the 'Color Matrix' Adjustment Plugin by midora and the Apply Alpha Mask plugin by BoltBait.
  6. Download the Vesperia Model Tool.

Obtaining and decompiling a model

Unpacking the game archives

First, let's get ourselves a model! I want to mod Yuri's default costume today.

First, we need to unpack the game assets. The base assets are in {Steam}\Tales of Vesperia Definitive Edition\Data64\ (which I will call the "base {Data64} folder" for short). Put vesperia_extract_svo.py in this folder.

Drag chara.svo on to vesperia_extract_svo.py to extract its contents into a {Steam}\Tales of Vesperia Definitive Edition\Data64\chara folder. Rename chara.svo to chara.svo.original to prevent the game from choosing the .svo archive over the extracted files.

Finding the model files

Go into the chara folder that we extracted. The model files are generally the first three letters in the character's name, followed by an underscore and Cxxx where C000 is generally the default costume. So, for example, Yuri's default costume is YUR_C000.DAT. We will also need BASEBONES.DAT (which contains the skeletons for all the models).

Decompiling the model

Make a folder somewhere, which I will refer to as the work folder, and copy both YUR_C000.DAT and BASEBONES.DAT into that folder along with the files from the Vesperia Model Toolset. Your folder should look like this:

Double click vesperia_export_model.py and it will unpack your model. When it is done, you will have a new folder, YUR_C000 with the unpacked model inside.

NOTE: Instead I actually recommend running vesperia_export_model.py from the command line. Type cmd into the address bar of the windows explorer menu, then type:

python vesperia_export_model.py YUR_C000.DAT

Python will not report any errors if the script crashes when you double-click the script, and no one will be able to help you. Run from the command line for helpful error messages.

Inside the {Work Folder}/YUR_C000/ folder, you will see a bunch of folders with the names of body parts, e.g. YUR_C000_CHEST, YUR_C000_HAIR, and so forth. Models in Vesperia are actually comprised of several sub-models.

NOTE: Only the files inside the {Work Folder}/YUR_C000/ will be used for modding. The .glb file, as well as the contents of the /textures folder, are for model viewing only. They will be ignored by the model importer.

NOTE: You can actually replace a submodel with another submodel. Just delete the contents of the folder you wish to replace, and replace it. For example, if you want to move over the CHEST of the alternate costume YUR_C001.DAT, then extract that file and replace the contents of YUR_C000_CHEST with the contents of YUR_C001_CHEST.

In each sub-model folder, you will find 1. all the meshes (.fmt/.ib/.vb/.vgmap files), 2. all the textures (.dds files), 3. the materials (material_info.json), 4. the mesh structure including bone palettes and material assignements (mesh_info.json), 5. the bone palette (bonemap.json) and 6. two files used by the importer that cannot be edited directly (model_skeleton_info.json and zz_base_model.bin).

Re-compiling the model and loading it into the game

Model recompile

Before doing any mods, I am actually going to go through repacking the model. This is a good exercise to make sure you know how to get working a model file from your unpacked model. In addition, all subsequent mods below will refer back to this step.

If you followed the above steps, you will have your original model files file, vesperia_export_model.py, vesperia_import_model.py, lib_fmtibvb.py, the pyffi_tstrip folder and the YUR_C000 folder which contains your model files.

Note: The model importer expects working .DAT file to already be in the folder. It will use the working .DAT file as a template, and copy over portions of the .DAT file that are not in the meshes / metadata folder.

Repack YUR_C000.DAT by double-clicking vesperia_import_model.py.

NOTE: Again I actually recommend running python vesperia_import_model.py from the command line.

NOTE: It is normal for the tool to skip over rebuilding the face meshes, since it does not support morph targets. Textures can still be changed.

If the repack was successful, there should now be shiny new YUR_C000.DAT file in your folder! (The original will be backed up as YUR_C000.DAT.bak.)

Put your new YUR_C000.DAT into {Steam}\Tales of Vesperia Definitive Edition\Data64\chara, overwriting the original.

NOTE: In case you missed it above, do not forget to rename or remove chara.svo or it will use the .svo file rather than the individual loose files.

Load the game to see the result!

Basic Mesh Delete

First, we will do a very simple mod - removing an entire submesh. Blender is not involved, but we will use it to preview what will happen.

Load Yuri's chest meshes into Blender. (File menu -> Import -> 3DMigoto raw buffers (.vb + .ib)) The meshes are in {Work Folder}/YUR_C000/YUR_C000_CHEST/. To maintain Blender's forward axis, set Forward Axis to Z-forward and Up Axis to Y-Up.

Note: The game engine and Blender interpret the X-axis in opposite directions, so what is on the left in Blender will be on the right in the game and vice-versa.

02_CHEST_YUR_C00SHAPE0.vb are his arms, we will delete that. For this mod we do not need Blender at all, except to identify the mesh.

Go into {Work Folder}/YUR_C000/YUR_C000_CHEST/ and delete 02_CHEST_YUR_C00SHAPE0.vb. (I recommend backing up your files first.)

Compile and test your model. Congratulations on your first mod! (Yes, it is a ridiculous mod.)

Basic Mesh Modification

This time I want to shorten Yuri's jacket. This will not be as easy as removing the arms, but of course it will be a much more functional mod. Here I've loaded up the meshes from {Work Folder}/YUR_C000/YUR_C000_CHEST/ (and also {Work Folder}/YUR_C000/YUR_C000_LEG/ so I can see what overlaps).

The cape is part of 00_CHEST_YUR_C00SHAPE0.vb. Select 00_CHEST_YUR_C00SHAPE0.vb, go into Edit Mode, select the parts of the belt you want to delete in Blender, and delete. (Again, this is not a Blender tutorial, although the basic steps are below. Please watch the video linked above or reference any Blender tutorial you like.)

Step by step: (Video tutorial here)

A. In the Topbar, go into the Layout workspace (tabs at top -> Layout), if you are not already there. Make sure you are in the 3D Viewport (Shift-F5). In the upper left you can see the current mode, which is likely Object Mode. If you are not in Object Mode, switch into Object Mode (from the drop down, or Ctrl-Tab)

B. In the Outliner, aka the box in the upper right with all the meshes and other objects, hide all the meshes except Yuri's jacket (00_CHEST_YUR_C00SHAPE0.vb). Select each one and press H (or click the eye icon on the right). Select 00_CHEST_YUR_C00SHAPE0.vb. Yuri's jacket should now be selected. Change Object Mode to Edit Mode with the upper left dropdown in the viewport.

C. Three icons will appear directly to the right of Edit Mode, which are Vertex Select, Edge Select and Face Select modes. Switch to Face Select mode.

D. Unselect everything (Select menu -> None, or Alt-A.)

E. With your cursor in the viewport (middle of the screen), hold down mouse wheel click (MWC) and move your mouse to pan and tilt the camera around the model. Hold down Shift-MWC and move your mouse to move shift the camera position (i.e. to strafe across the screen). Use Mouse wheel scroll (MWS) to zoom in and out.

F. Switch to Circle select (Select menu -> Circle Select, or press C). MWS to adjust the size of your "brush" for selecting polygons. Hold down the left mouse button (LMB) to select polygons. Hold down MWC to unselect polygons. Click the right mouse button (RMB) to leave circle select mode. You will need to do this to pan the camera.

G. Repeatedly do this until you have selected the polygons you plan to delete. Press C, MWS to adjust size, LMB to select some polygons, MWC to unselect ones you accidentally set, RMB to go back to camera mode, MWC/Shift-MWC to adjust the camera, press C again to select or unselect some more...

H. When you are done, delete those faces. (Mesh menu -> Delete -> Faces, or RMC in the viewport {when not in circle select} and select "Delete Faces") Want to do something else besides just delete? Try transforming! (Mesh menu -> Transform -> Move / Rotate / Scale, or one of the specialized tools like Push / Pull or Shrink / Fatten.) Just remember to consider how your changes will affect pose / animation.

Go back into Object Mode.

Export the mesh. File menu -> Export -> 3DMigoto raw buffers (.vb + .ib) Overwrite the original 00_CHEST_YUR_C00SHAPE0.vb. (Again, I recommend backing up your files first.)

Note: If you are using the newer versions of the 3DMigoto plugin, it will output a .vb0 file instead of a .vb file. DO NOT RENAME THIS FILE. The import script knows to look for .vb0 instead of .vb, and will refuse to load the file if it has been renamed back to a .vb file!

Compile and test your model. Congratulations on your second mod!

Basic Texture Replacement

This time I will change the color of Yuri's outfit (00_CHEST_YUR_C00SHAPE0.vb). Be sure to have installed Paint.NET as well as both plugins I listed above.

Open {Work Folder}/YUR_C000/YUR_C000_CHEST/mesh_info.json in a text editor such as Notepad. We can see material assigned the mesh is CHEST_YUR_C000_MAT. NOTE: You can change which material each mesh is assigned to here.

Open {Work Folder}/YUR_C000/YUR_C000_CHEST/material_info.json in the work folder. Find CHEST_YUR_C000_MAT. We can see the diffuse (basic coloring) texture is C_CHEST00_YUR_C000. (the first texture listed is the color texture, and C_CHEST00_YUR_C000H is assigned to the second UV map - I do not know what it is for, but generally the first and second textures are identical and I replace them together.)

Open {Work Folder}/YUR_C000/YUR_C000_CHEST/C_CHEST00_YUR_C000.dds. As you can see, it is a texture that has non-transparency information in the alpha layer (probably ambient occlusion, or maybe specular). We will need to separate the color texture from the alpha texture.

Duplicate the current layer (Layers -> Duplicate Layer or Ctrl-Shift-D).

Select the top layer, and open Color Matrix. Select RGB (solid) and you will have the color layer. *Optional: Rename the layer Color Layer.

Hide the top layer so you can see the layer below, and open Color Matrix. Select Transparency to Gray (solid) and you will have the alpha layer. *Optional: Rename the layer Alpha Layer.

Hide the alpha layer, and unhide the color layer. Make your color changes to the color layer. (Again, this is not a Paint.NET tutorial, but the basic steps are below.)

Step by step:

A. The texture is on a single layer, duplicate that layer (Ctrl-Shift-D). You will now have two identical images on top of each other. Select the upper layer, by clicking on it in the Layers window. If you do not see the Layers window, press F7. If you still cannot see it, press Ctrl-Shift-F7 to reset it to its default position in the lower right. (Video tutorial on using layers here.)

B. Select the gray parts of the image. Press S to go into select mode, and to cycle between the four select modes (Rectangle select, lasso select, ellipse select and magic wand. Select part of the area that you want to start. Hold down the Ctrl key while selecting to add to your current selection, and the Alt key to subtract from your current selection.

C. Edit -> Invert selection (Ctrl-I), so that it is now selecting all the parts you do not want to change. Edit -> Erase selection (Press Del), so that all those parts are gone. Your image will not change, because those parts are still present on the lower layer! (You can see this in the layers window.)

D. Optional: I have more success doing recolor if I remove the existing color first. Adjustments menu -> Black and White (Ctrl-Shift-G). Even more optional but recommended: Duplicate this black and white layer a few times. You can try making a bunch of different colors, and then just drag the layers up and down and you will have variations to enjoy with minimal effort!

E. Switch to the Recolor Tool (Press R). Increase the brush size to something large, like 500. Increase the Tolerance to 100% (since we have already removed the areas we do not want recolored). In the Colors tool, select a new color. Drag-Click on the texture, and color the texture. (Note: Where you start will determine the color shift. So if your cursor is over a light area when you start, the entire recolor will be darker, and vice versa.) (Video tutorial on Recolor - This is worth a watch, it shows how to properly recolor and makes some of my steps above moot. But I like my method.)

Optional: Save as a pdn file before saving as a dds file. When you save as a dds file, it will need to flatten all your layers back into a single layer. If you have a pdn file, all the layers will be preserved, allowing you to keep making changes and variant textures.

With the alpha layer hidden and the color layer selected, use the Apply Alpha Mask plugin (Effects -> Object -> Apply Mask). The current layer should be the color layer. Set the Mask Layer to the alpha layer, the Mask Type to Shades of gray, and the Method should be Replace.

Delete the alpha layer. Save the file in .dds format in {Work Folder}/YUR_C000/YUR_C000_CHEST/. Be sure to save in BC7 (Linear, DX 11+) and have Generate Mip Maps selected as well. Give it a unique name, I used C_CHEST00_YUR_C000a.dds. Also save it to a second file, I used C_CHEST00_YUR_C000Ha.dds.

Change the texture pointers in {Work Folder}/YUR_C000/YUR_C000_CHEST/material_info.json.

Compile and test your model. Congratulations on your third mod, you have made it to the end of the basic tutorial!