Whoa, I just e-mailed you, and you had already replied here by the time I got the e-mail off.
I don't think the sword is an indexing error, because if I just use -U, it looks good, and if the index were off by 1, it would result in warped coordinates on a uniformly stretched surface like that. But, then again, I could be missing something there that would allow bad indexing to cause this. It could also be that the texture map is laid out such that the proper inverse bias could still allow the hilt to look correct while flipping the sword back around. That seems the most likely explanation, but I haven't yet studied the map in combination with the UV values to find out. I'm hoping I will find the magical scale-bias value and it will just fix itself.
Here are some of the character files:
Squall: File000854
The dude in the pic (I think he's some kind of special character in Dissidia, as he has everyone's weapon on him): File000899
Kefka: File001123
Tonyberry: File000895
The figures I gave to get the UV's for them are probably not exact, I just eyed it. Also for reference, the UV's are in the vertex array (which typically contains vertices of either size 14 or 16), and they are always the last two shorts of each vertex. Converting them to floating point UV's is a matter of f/65535.0f, but that 65535 could turn into another value for the scale-and-bias too, instead of it being a multiply factor. I've tried searching Squall for floats in the general 2.9-3.1 range, and shorts ranging from 21545 to 21945, but haven't found anything promising. I've also sniffed around all the headers for the surfaces, suface sub-meshes, and surface vertex arrays, and their tails (which seem to be non-existent, the next mesh/array always starts right after the triangle/vertex list, respectively).
If you need any help figuring out the chunks, let me know. For reference, here are the chunk types I've documented thus far:
0x0004 - Bone info
0x0005 - Surface (contains meshes and vertex arrays)
0x000a - Texture (each texture is in its own chunk)
0x0008 - Material list
0x000B - Mysterious, I think it may be arrays of data for bone indexing and/or vertex weights.
0x000F - Texture animation, for blinking characters and such. This could conceivably contain data needed to fix the UV's, but probably not. However, I haven't investigated it too much yet.
0x8015 - Unknown, seems to be a list of floats, but I don't think any are useful for the UV correction.
My chunk structure is as such:
WORD chunkType;
short unknownB;
int chunkSize;