Hello everybody, this is yet another tutorial about vertex hacking.

I don't know about you, but I've always found Vertex hacking ... very complicated and not really user-friendly. Lots of steps, easy to miss something or don't click on the right thing ... At least until now.
Two new ways of vertex hacking have been made and released recently. The DD Vertex Box 2 a few days ago, and mk64n's method without patching in June, for which he released
some days ago too.
So, right now, anyone can get into Vertex hacking, I guess. It's still more tedious than some other forms of hacking, but it's very bearable.
I'm going to make a written tutorial about MK64n's last method, and giving a few beginner tips on how to 3DS MAX for some simple manipulations. The goal of this tutorial is to reach even the most newbie of the beginners, and is very detailled, especially for someone who has already used other methods of vertexing.
If you desire a tutorial about DDVB 2, search in this section, there are a few for different 3D softwares.-----------------------------------------------------------------------------
You will need 3DS MAX 8 ! Not 2008, not 2009, not 2010, not 2011.
3DS MAX 9 apparently works too (Thanks br3compactor for that info ! <3 )1- Download
AIS and install it.
Effect : Will transform your BRRES files into DAE files, usable by 3DS MAX.
2- Download
COLLADA et install it as well.
Effect : Let's 3DS MAX import DAE files.
[Note : If the Installer can't detect 3DS MAX 8 on Windows 7 x64, try the
3.04 Installer.]
3- Open the PAC file you need to edit, with BrawlBox. Myself, I'll take Zelda and ... make her boots bigger, give her a bigger bust and put a comb on her head.
You can try and just follow the same steps as me if it's your very first time. :3
Click on ModelData[0] => 3DModels => FitZelda00 => Right-click and
Preview.

Find the polygon you need to edit by checking/unchecking the polygons on the left side. Myself, i'll take polygon0.
4- Now, we need to get the Vertex Set of this polygon.. Go to FitZelda00.mdl0 => Polygons.Find your polygon, and look for its
VertexSet in its Properties.

Close the Polygons folder, and look into the Vertices one, for a file whose
ID is the number you've just noted down.

Right-click, and export this file in a new folder you have made just for this vertex hack, where we'll put all our stuff.

Note down the
MDL0 Offset too.

Now, let's export more stuff ... Exportz the
FitZelda00.mdl0 file, the
ModelData[0].brres file, and finally
all the textures (TextureData[0] => Textures).
Textures are not necessary, but it's better to see them in 3DS MAX. :3

5- Double-click on the .brres file and AIS should convert it and create a DAE. If not, try to drag-and-drop it in AIS.exe.
6- Start 3DS MAX 8. You should ease your life by enlarging as musch as possible the view you have on the bottom-right.
Click on MAXScript in the taskbar, and on
New Script. Then copy MK64n's Script :
fn readBEshort fstream = (
short = readshort fstream #unsigned
short = bit.swapBytes short 1 2
return short
)
fn readBElong fstream = (
long = readlong fstream
long = bit.swapBytes long 1 4
long = bit.swapBytes long 2 3
return long
)
fn ReadBEfloat fstream = (
fpt=readfloat fstream
itger = bit.floatAsInt fpt
hih = bit.intashex itger
while hih.count < 8 do hih = "0" + hih
shn = (substring hih 7 2) + \
(substring hih 5 2) + \
(substring hih 3 2) + \
(substring hih 1 2)
bit.intAsFloat (bit.hexasint shn)
)
fn WriteBEFloat fnum = (
intgr = bit.floatAsInt fnum
honey = bit.intashex intgr
while honey.count < 8
do honey = "0" + honey
sign = (substring honey 7 2) + \
(substring honey 5 2) + \
(substring honey 3 2) + \
(substring honey 1 2)
xintgr=bit.intAsFloat (bit.hexasint sign)
return xintgr
)
rollout DDV "Brawl VertexHacker Tool" width:311 height:257
(
button btn1 "Import Verts" pos:[9,10] width:144 height:40
label lbl0 "-Mario_Kart64n, (Aug 11, 2010)" pos:[153,238] width:156 height:23
button btn2 "Export Verts" pos:[8,56] width:144 height:40
checkbox chk1 "Checkbox" pos:[165,59] width:14 height:13 enabled:false checked:false
label lbl1 "Save as 3DS File" pos:[182,58] width:119 height:15 enabled:false
checkbox chk2 "Checkbox" pos:[165,76] width:14 height:13 enabled:false checked:false
label lbl2 "Save As Seperate Files" pos:[182,75] width:119 height:15 enabled:false
checkbox chk3 "Checkbox" pos:[165,94] width:14 height:13 enabled:true checked:true
label lbl3 "Save Changes to MDL0" pos:[180,93] width:119 height:15
checkbox chk4 "Checkbox" pos:[165,112] width:14 height:13 enabled:true checked:true
label lbl4 "Read Offset from File" pos:[180,111] width:119 height:15
editText edt1 " MDL0 Offset:" pos:[162,129] width:130 height:16
groupBox grp1 "Export Options" pos:[157,7] width:143 height:147
radioButtons rdo1 "" pos:[165,21] width:147 height:32 labels:#("Vertices", "Texture Corrdinates") default:1 columns:1
button btn3 "Create" pos:[15,138] width:60 height:30
button btn4 "Patch" pos:[81,138] width:60 height:30
label lbl8 "Don't Use EditPoly" pos:[31,119] width:119 height:15 enabled:false
groupBox grp3 "Patching Options" pos:[7,101] width:143 height:76
checkbox chk8 "Checkbox" pos:[15,120] width:14 height:13 enabled:false checked:false
button btn5 "Fix AiS Import" pos:[165,205] width:128 height:25
groupBox grp2 "AiS Fixing Options" pos:[155,154] width:143 height:79
checkbox chk5 "Checkbox" pos:[166,173] width:14 height:13 enabled:true checked:false
label lbl5 "Selected Only" pos:[182,172] width:111 height:15 enabled:true
checkbox chk6 "Checkbox" pos:[167,189] width:14 height:13 checked:true
label lbl6 "Scale" pos:[183,188] width:44 height:15
checkbox chk7 "Checkbox" pos:[222,189] width:14 height:13 enabled:false checked:true
label lbl7 "Rotate" pos:[239,188] width:44 height:15
button btn6 "Import" pos:[14,198] width:60 height:30 enabled:false
button btn7 "Export" pos:[80,198] width:60 height:30 enabled:false
groupBox grp4 "VertexWeighting" pos:[6,180] width:143 height:72 enabled:false
label lbl9 "Dump to LogFile" pos:[38,232] width:105 height:15 enabled:false
checkbox chk9 "Checkbox" pos:[22,233] width:14 height:13 enabled:false checked:false
local typedOffset=""
on edt1 entered txt do(
if txt != "" do(
typedOffset=txt as float
if typedOffset==undefined do(
typedOffset=0
messageBox "Error: User Input \n Value Cannot be Identified \n as either a dec or hex number"
)
if typedOffset<=0 do(
typedOffset=typedOffset*-1
)
local typedOffset
)
)
on btn1 pressed do(
fsource = GetOpenFileName \
caption:"Brawl Vert Import" types: \
"All files (*.*)|*.*|"
if fsource!=undefined do(
f= fopen fsource "rb"
fpath= getFilenamePath fsource
fname = getFilenameFile fsource
vertArray=#()
uvwArray=#()
faceArray=#()
fSize=readBElong f
mdlOffset=readBElong f
dataOffset=readBElong f
strOffset=readBElong f
vertID=readBElong f
vUkn1=readBElong f --flag? is XYZ?
dataType=readBElong f
entryStride=readBEshort f
numVertices=readBEshort f
eMinX=readBEfloat f
eMinY=readBEfloat f
eMinZ=readBEfloat f
eMaxX=readBEfloat f
eMaxY=readBEfloat f
eMaxZ=readBEfloat f
pad=readBElong f
pad=readBElong f
if entryStride==12 then(
for x = 1 to numVertices do(
vX=readBEfloat f
vY=readBEfloat f
vZ=readBEfloat f
append vertArray[vX,vY,vZ]
append uvwArray[0,0,0]
)
)
else(
for x = 1 to numVertices do(
vX=readBEfloat f
vY=readBEfloat f
vZ=0
append vertArray[vX,vY,vZ]
append uvwArray[0,0,0]
)
)
msh = mesh vertices:vertArray faces:faceArray --build mesh
msh.numTVerts = vertArray.count
msh.name=fname
buildTVfaces msh
select msh
messageBox "Done !"
gc()
fclose f
)
)
on btn2 pressed do(
doVerts=chk8.checked
doUVs=rdo1.state
do3DS=chk1.checked
doDUMP=chk2.checked
doMDL=chk3.checked
doOffset=chk4.checked
if doUVs==1 do(
obj=getCurrentSelection()
obj.pos = [0,0,0]
obj.rotation = quat 0 0 0 0
local mdlSize=""
local mdlOffset=""
local numEntrtices=""
--
if doOffset==true then(
fsource = GetOpenFileName \
caption:"Select UVSet to Replace" types: \
"All files (*.*)|*.*|"
if fsource!=undefined do(
f=fopen fsource "rb"
mdlSize=readBElong f-64
mdlOffset=(readBElong f*-1)+64
dataOffset=readBElong f
strOffset=readBElong f
vertID=readBElong f
vUkn1=readBElong f --flag? is XYZ?
dataType=readBElong f
entryStride=readBEshort f
numEntrtices=readBEshort f
fclose f
)
)
else(
for g = 1 to obj.count do(
tmesh = snapshotAsMesh obj[g]
num_verts = tmesh.numverts
num_uvws = tmesh.numtverts
num_faces = tmesh.numfaces
mdlSize=(num_verts*12)+64
mdlOffset= typedOffset+64
numEntrtices=num_verts
delete tmesh
)
)
--
fsource = GetOpenFileName \
caption:"Select the MDL0 to inject to" types: \
"MDL0(*mdl0)|*.mdl0|All files (*.*)|*.*|"
if fsource!=undefined do(
fext= getFilenameType fsource
fsize= getFileSize fsource
fpath= getFilenamePath fsource
fname= getFilenameFile fsource
fclose f
--
deleteFile (fpath+fname+"_backup"+fext)
copyFile fsource (fpath+fname+"_backup"+fext)
f=fopen (fpath+fname+"_backup"+fext) "rb"
s = fopen fsource "wb"
print "ffff"
print mdlOffset
for wr = 1 to mdlOffset do(
read=readbyte f
write=writebyte s read
)
fseek f -34 #seek_cur
lenCheck=readBEshort f
fseek f 32 #seek_cur
if numEntrtices==lenCheck then(
for g = 1 to obj.count do(
tmesh = snapshotAsMesh obj[g]
num_verts = tmesh.numverts
num_uvws = tmesh.numtverts
num_faces = tmesh.numfaces
padding=((mdlSize/8)-numEntrtices)
for t = 1 to numEntrtices do(
tv=getVert tmesh t
nSwap=writeBEfloat tv[1]
write=writelong s (bit.floatasint nSwap)
nSwap=writeBEfloat tv[2]
write=writelong s (bit.floatasint nSwap)
nSwap=writeBEfloat tv[3]
write=writelong s (bit.floatasint nSwap)
)
-- for p = 1 to padding do(
-- write=writelong s 0
-- write=writelong s 0
-- )
delete tmesh
)
fseek f (mdlOffset+(numEntrtices*12)) #seek_set
for wr = 1 to (fsize-(mdlOffset+(numEntrtices*12))) do(
read=readbyte f #unsigned
write=writebyte s read
)
messageBox "DONE!"
)
else(
gc()
fclose f
fclose s
deleteFile (fpath+fname+fext)
renameFile (fpath+fname+"_backup"+fext) (fpath+fname+fext)
messageBox "ERROR! Wrong Offset?"
)
)
)
if doUVs==2 do(
obj=getCurrentSelection()
obj.pos = [0,0,0]
obj.rotation = quat 0 0 0 0
--
if doOffset==true then(
fsource = GetOpenFileName \
caption:"Select UVSet to Replace" types: \
"All files (*.*)|*.*|"
if fsource!=undefined do(
f=fopen fsource "rb"
mdlSize=readBElong f-64
mdlOffset=(readBElong f*-1)+64
dataOffset=readBElong f
strOffset=readBElong f
vertID=readBElong f
vUkn1=readBElong f --flag? is XYZ?
dataType=readBElong f
entryStride=readBEshort f
numEntrtices=readBEshort f
fclose f
)
)
else(
for g = 1 to obj.count do(
tmesh = snapshotAsMesh obj[g]
num_verts = tmesh.numverts
num_uvws = tmesh.numtverts
num_faces = tmesh.numfaces
padding=((mdlSize/8)-numEntrtices)
mdlSize=num_verts*8
mdlOffset= typedOffset+64
numEntrtices=num_verts
delete tmesh
)
)
--
fsource = GetOpenFileName \
caption:"Select the MDL0 to inject to" types: \
"MDL0(*mdl0)|*.mdl0|All files (*.*)|*.*|"
if fsource!=undefined do(
fext= getFilenameType fsource
fsize= getFileSize fsource
fpath= getFilenamePath fsource
fname= getFilenameFile fsource
fclose f
--
deleteFile (fpath+fname+"_backup"+fext)
copyFile fsource (fpath+fname+"_backup"+fext)
f=fopen (fpath+fname+"_backup"+fext) "rb"
s = fopen fsource "wb"
print "ffff"
print mdlOffset
for wr = 1 to mdlOffset do(
read=readbyte f
write=writebyte s read
)
for g = 1 to obj.count do(
tmesh = snapshotAsMesh obj[g]
num_verts = tmesh.numverts
num_uvws = tmesh.numtverts
num_faces = tmesh.numfaces
padding=((mdlSize/8)-numEntrtices)
if num_uvws!=0 then(
for t = 1 to numEntrtices do(
tv=getTVert tmesh t
nSwap=writeBEfloat tv[1]
write=writelong s (bit.floatasint nSwap)
nSwap=writeBEfloat tv[2]
write=writelong s (bit.floatasint nSwap)
)
)
else(
for t = 1 to numEntrtices do(
tv=getVert tmesh t
nSwap=writeBEfloat tv[1]
write=writelong s (bit.floatasint nSwap)
nSwap=writeBEfloat tv[2]
write=writelong s (bit.floatasint nSwap)
)
)
-- for p = 1 to padding do(
-- write=writelong s 0
-- write=writelong s 0
-- )
delete tmesh
)
fseek f (mdlOffset+(numEntrtices*8)) #seek_set
for wr = 1 to (fsize-(mdlOffset+(numEntrtices*8))) do(
read=readbyte f #unsigned
write=writebyte s read
)
)
)
gc()
fclose f
fclose s
)
on btn3 pressed do(
fsource = GetOpenFileName \
caption:"Brawl Vert Import" types: \
"All files (*.*)|*.*|"
if fsource!=undefined do(
f= fopen fsource "rb"
fpath= getFilenamePath fsource
fname = getFilenameFile fsource
vertArray=#()
uvwArray=#()
faceArray=#()
fSize=readBElong f
mdlOffset=readBElong f
dataOffset=readBElong f
strOffset=readBElong f
vertID=readBElong f
vUkn1=readBElong f --flag? is XYZ?
dataType=readBElong f
entryStride=readBEshort f
numVertices=readBEshort f
eMinX=readBEfloat f
eMinY=readBEfloat f
eMinZ=readBEfloat f
eMaxX=readBEfloat f
eMaxY=readBEfloat f
eMaxZ=readBEfloat f
pad=readBElong f
pad=readBElong f
for x = 1 to numVertices do(
vX=readBEfloat f
vY=readBEfloat f
vZ=readBEfloat f
append vertArray[vX,vY,vZ]
append uvwArray[0,0,0]
)
obj=getCurrentSelection()
obj.pos = [0,0,0]
obj.rotation = quat 0 0 0 0
max modify mode
addModifier obj (edit_poly())
subobjectLevel = 1
-- modPanel.setCurrentObject obj.modifiers[#Edit_Poly]
diffArray=#()
directionArray=#()
for x = 1 to numVertices do(
$.modifiers[#Edit_Poly].SetSelection #Vertex #{}
$.modifiers[#Edit_Poly].Select #Vertex #{x}
vert=$.modifiers[#Edit_Poly].GetVertex x
-- $.modifiers[#Edit_Poly].SetOperation #Transform
mX=(vertArray[x][1])-(vert[1])
mY=(vertArray[x][2])-(vert[2])
mZ=(vertArray[x][3])-(vert[3])
append diffArray[mX,mY,mZ]
)
deleteModifier obj 1
createFile (fpath+fname+"_patch.pta")
s = fopen (fpath+fname+"_patch.pta") "ab"
vcount=writelong s numVertices
for x = 1 to numVertices do(
write=writefloat s (diffArray[x][1])
write=writefloat s (diffArray[x][2])
write=writefloat s (diffArray[x][3])
write=writelong s 0x0
)
messageBox ("Patch Created !" +"\n"+
"\n"+
"File Saved To:" +"\n"+
(fpath+fname+"_patch.pta")
)
gc()
fclose s
fclose f
)
)
on btn4 pressed do(
fsource = GetOpenFileName \
caption:"Brawl Vert Patcher" types: \
"Patch(*pta)|*.pta|All files (*.*)|*.*|"
if fsource!=undefined do(
f= fopen fsource "rb"
fpath= getFilenamePath fsource
vertArray=#()
vcount=readlong f #unsigned
for x = 1 to vcount do(
vX=readfloat f
vY=readfloat f
vZ=readfloat f
dmy=readshort f #unsigned
side=readshort f #unsigned
append vertArray[vX,vY,vZ,side]
)
obj=getCurrentSelection()
obj.pos = [0,0,0]
obj.rotation = quat 0 0 0 0
max modify mode
addModifier obj (edit_poly())
subobjectLevel = 1
--modPanel.setCurrentObject obj.modifiers[#Edit_Poly]
for x = 1 to vcount do(
$.modifiers[#Edit_Poly].SetSelection #Vertex #{}
$.modifiers[#Edit_Poly].Select #Vertex #{x}
vert=$.modifiers[#Edit_Poly].GetVertex x
$.modifiers[#Edit_Poly].SetOperation #Transform
mX=(vertArray[x][1])
mY=(vertArray[x][2])
mZ=(vertArray[x][3])
$.modifiers[#Edit_Poly].MoveSelection [mX,mY,mZ]
$.modifiers[#Edit_Poly].Commit ()
$.modifiers[#Edit_Poly].SetSelection #Vertex #{}
)
subobjectLevel = 0
--modPanel.setCurrentObject obj.modifiers[#Edit_Poly]
messageBox "Patched !"
gc()
fclose f
)
)
on btn5 pressed do(
disableSceneRedraw()
st = timestamp() --get start time in milliseconds
undo off(
delete $helpers
if chk7.checked==true then(
geo=getCurrentSelection()
delete $helpers
stuff=#()
if geo.count!=0 do(
for x = 1 to geo.count do(
addModifier geo[x] (Normalmodifier ())
geo[x].modifiers[#Normal].flip = on
addModifier geo[x] (smooth ())
geo[x].modifiers[#Smooth].smoothingBits = 1
collapseStack geo[x]
if chk6.checked==true do(
--rotate geo[x] (quat -1 0 0 0)
geo[x].scale = [2.54,2.54,2.54]
)
-- aBox = Box length:0.2 width:0.2 height:0.2 name:"dummy"
aBox = Box()
aBox.rotation = quat 0.707107 0 0 0.707107
aBox.name = (geo[x].name) as string
convertTo aBox TriMeshGeometry
-- convertTo geo[x] TriMeshGeometry
attach aBox geo[x]
-- update aBox geometry:true
delete aBox.verts[#{1..8}]
addModifier aBox (Morpher ())
append stuff aBox
)
addModifier stuff (Edit_Mesh ())
)
)
else(
geo=$polygon*
for x = 1 to geo.count do(
addModifier geo[x] (Normalmodifier ())
geo[x].modifiers[#Normal].flip = on
addModifier geo[x] (smooth ())
geo[x].modifiers[#Smooth].smoothingBits = 1
collapseStack geo[x]
if chk6.checked==true do(
--rotate geo[x] (quat -1 0 0 0)
geo[x].scale = [2.54,2.54,2.54]
)
)
delete $helpers
for x = 1 to geo.count do(
-- aBox = Box length:0.2 width:0.2 height:0.2 name:"dummy"
aBox = Box()
aBox.rotation = quat 0.707107 0 0 0.707107
convertTo aBox TriMeshGeometry
)
dmy=$Box*
myBoxes=#()
myMeshes=#()
for x = 1 to geo.count do(
objA= dmy[x]
objB= geo[x]
append myBoxes objA
append myMeshes objB
)
for x = 1 to geo.count do(
myBoxes[x].name = myMeshes[x].name
attach myBoxes[x] myMeshes[x]
)
for x = 1 to geo.count do(
for i = 1 to 8 do(
delete geo[x].verts[#{1}]
)
addModifier geo[x] (Morpher ())
)
addModifier $Polygon* (Edit_Mesh ())
)
)
et = timestamp() --get end time in milliseconds
enableSceneRedraw()
gc()
print ("Operation Completed In: "+(((et-st)/60)as string)+" Seconds") --print time to finish
)
)
createDialog DDV
Save it with a pretty name (
vertex ?), in a folder that you access quickly. Then do MAXScript =>
Run Script and choose your
vertex.ms file. A window will pop out.
http://a.imageshack.us/img831/5205/41130057.png7- Put this window aside, we'll get back to it later. :3
In 3DS MAX itself, do File =>
Import and choose COLLADA in the file types. Load the DAE, making sure that the next two options are checked.


[Note : it has been reported that the COLLADA plugin might have problems under Windows Seven ... try to run it as XP if nothing shows up here.]
Your character will look quite weird, so click on
Fix AIS Import in the script's window, making sure that
Scale is checked.

8- Select your polygon, then Right-click =>
Hide Unselected.

9- Now, let's start with the vertexing. :3
Camera Controls : Use the Mouse wheel to zoom in and zoom out.
Hold the "Mouse-wheel button" and move your mouse around to translate the camera. Hold the Alt button + the "Mouse-wheel button" to rotate the camera around your object.
Select an item (polygon, vertex, group of vertexes, "element" ...) and click on the little white cube in the bottom-right of the window, and the camera will now turn around that item.

Select your polygon, then click on the sort of blue rainbow on the top-right, and on
Edit Mesh. Activate the button with the three red dots if it's not already done.

10- Modify the position of each vertices to make your hack !

(The next three appendix are the detail of the three typical modifications that I'm going to make, and their goal is only to help you learn to use 3DS MAX better. Don't hesitate to skip them if you have mastered the sofware of course. Otherwise, I highly suggest you to take a look at those.)
A1 - Let's start with the basics : moving a vertex.
Click on a vertex, and you should get this king of marker :

It is a
Select marker.
To get a
Move marker, right-click on the vertex, and choose
Move :

You get a three-dimensional marker that lets you move your vertex along each of the three axis, or each of the three planes at a time (your screen being bidimensionnal, it's impossible for you to make a 3D move in one step).
Drag-and-drop to modify your vertex's position. Just click on another vertex to move it the same way. You can also select multiple vertices at once with a selection frame, or by holding CTRL and clicking them one by one.
It's an elementary manipulation of 3DS MAX. Learn how to use it fast and easily. :grin:

(And here's a nice-looking Zelda.

)
A2- Let's try something else now : resizing.
We're going to enlarge Zelda's boots. Select all the vertices of her boots, then right-click and
Scale to get the
Scale cursor.
Then, just like for the
Move cursor, you can enlarge/reduce the boots following an axis, a plane, or as a whole (just point the center of the marker).

Tip : If you don't feel like selecting ALL of the vertices from the same element, unfold the
Edit Meshon the top-right, and select
Element to select element by element, then click again on
Vertices to select and moify the vertices of these elements.
http://a.imageshack.us/img826/6500/26668862.pngEnd Result :

A3- Now, let's try to give a little more "bust" to Zelda. It would take an eternity and a half to move each vertex one by one, and the
Scale function would probably lead to a terrible result.
So we're going to use the
Soft Selection. here's the basic concept : when you select a vertex and move it, this move will also be passed on to the neaby vertices, but to a lesser extent, in a radius that can be set.
To activate it, look into the right-hand menu :

Check the matching box, and lower the
Falloff and
Bubble. They respectively control the impact of the distortion on the sides of the " distortion bubble", and the radius of said bubble.
You can check on the model the radius of the bubble according to the color of the vertices, that ranges from Red (100% of the distortion) to Blue (0%).

So now, move the vertex in the middle of your distortion, and see how it looks.

11- Once you've finished all the tedious editing ...
SAVE YOUR WORK !!!File =>
Save to do this.
12- Now, you need to conform your model to the game's polygons. Right-click on your polygon (not a vertice, but your polygon) then
Clone.
Choose
Copy in the window that pops up and name it
mod as an example.

Right now, the copy is overlapping your starting polygon. Move it aside (check that in the top-right, above the
Edit Mesh, that you're indeed moving the
mod).

Let's undo the modifications of your initial polygon0. For that, just click on it, then on the little bulb next to the
Edit Mesh.

(Clicking on the bulb again will put back your modifications. :3 )
From now on, the light bulb near the "Edit Mesh" of the model that you've edited should be OFF all the time !! You need to remove the edits on your base file before morphing it with the copy and vertex set. Always.
13- In the script's window, click on
Import Verts and select the Vertex Set you had extracted in the beginning of this tutorial. It appears at the feet of the polygon0, but invisible.
14- Now, it's time to "patch" ! Click on the
polygon0, and on
Morpher (under
Edit Mesh).
Right-click on
-empty- then
Pick From scene, and click on your
mod.
Right-click on the second
-empty-, and
Pick from scene. The vertex set being invisible, just hit
H on your keyboard to see all the elements of the scene. Choose the vertex set and then
Pick.

Up the number near the
mod box to 100. Your polygon0 should take the shape of your mod.
Now up the number near the vertex set to 100. Your polygon0 will start looking like a melted blob.
Don't panic, it's normal !
15- DIn the script's window, uncheck
Read Offset from file, and just under it write the MDL0 Offset you had noted in the beginning. :3
Make sure that the polygon0 is still selected,
close all your BrawlBox windows and click on
Export Verts in the script's window, then choose your
FitZelda.mdl0.

DONE ! It will lay the polygon0 on its back but it doesn't matter. XD
16- Open your FitZelda00.pac, go to the mdl0 and right-click =>
Replace with the shiny mdl0 from your folder. Then
Save As ... to get your modified PAC.
And if we preview it ...

-----------------------------------------------------------------------------
Double patching :

17- 17- But if we look at her feet ... something's wrong, baby. Modifying the legs/feet or arms/hands will cause a distortion on the left side. You'll need to re-patch to correct this.
Of course, there's no need to double-patch if you don't have any issue.
Just like in the beginning of the tutorial, you ned to extract the mdl0, brres and textures of your new PAC. (Create a sub-folder for the double-patching, you wion't get lost, that way.

).
Convertyour new .BRRES into a DAE (which i'll just call "the new DAE" from now on).
18- Back into 3DS MAX, click on your melting blob and
Hide Unselected.
Import the new DAE, push OK in all the windows saying there's an
Import Name Conflict.
19- In the script's window, check
Selected Only and click on
Fix AIS Import.

Click on the polygon you're working on, hold CRTL and click on the melting blob. Do another
Hide Unselected. There should be only the
polygon03 (fron the warped new DAE) and the blob.
Move the
polygon03 aside.
20- Click on the blob, go to
Morpher, right-click on the
mod box =>
Delete Channel, then right-click =>
Pick From Scene and click on the
polygon03.

Up its value to 100. Leave the vertex set's box as it it : at 100.
21- Click on the blob again, again
Export Verts (with the same MDL0 Offset). And select the mdl0 of your modified PAC (the one with the one-legged Zelda).
DONE !
22- Open your modified FitZelda00.pac, replace its mdl0 with your shiny doube-patched mdl0 that is in your sub-folder. Just
Save As ... to get your final modified PAC.
End result :

A wonderful big-breasted Zelda, with a comb and giant boots. Definitely a great piece of art.

Well, that's it. You can use it in your game if you want.
Have a good day. And I hope you enjoyed.

-----------------------------------------------------------------------------
ADDENDUMS : Triple/Quadruple/Multiple patching : If double patching still doesn't work, you may have to keep patching it again and again and see if there is any improvement.
BEWARE: NEVER TOUCH THE X BUTTON OR THE O BUTTON WHEN USING 3DSMAX (Thanks to br3compactor again for testing this himself.

)