So, I sort of have costume hashes computing, but things are not matching up. First problem I noticed: what is in a costume file is not necessarily what is in the costume. I took the costume that I saved on the last day of the game, loaded it into Paragon Chat, then immediately resaved it. The two files are not identical. There are some subtle differences (in particular, upper/lower cases changes) and a few major ones (an unused part disappeared in the newly saved version, which implies I24 had different costume part checking than I23). To eliminate these problems I loaded and saved a costume file and hashed that. The hashes still don't match.
Question: since hashing is case sensitive, is case forced all up or all lower for consistency? The sample suggested it was not ("Leather" retained its capitalization). Also, this probably has nothing to do with anything, but I24 itself *created* a Part that was not in the I23 costume file, and weirdly its not a functional part entry: it looks like this in Part 25:
CostumePart ""
{
Geometry none
Texture1 none
Texture2 none
DisplayName P546439883
RegionName "Lower Body"
BodySetName NewSkirts
Color1 0, 0, 0
Color2 0, 0, 0
Color3 0, 0, 0
Color4 0, 0, 0
}
Here's the costume in question (the I24 version):
{
BoneScale -0.85
ChestScale -0.53
WaistScale -0.78
HeadScales 0, 0, 0
BrowScales 0, 0, 0
CheekScales 0, 0, 0
ChinScales 0, 0, 0
CraniumScales 0, 0, 0
JawScales 0, 0, 0
NoseScales 0, 0, 0
SkinColor 246, 187, 170
NumParts 28
BodyType 1
CostumePart ""
{
Geometry shorts
Texture1 skin_tights
Texture2 miniskirt_1
DisplayName P1525729866
RegionName "Lower Body"
BodySetName NewSkirts
Color1 255, 0, 0
Color2 0, 69, 204
Color3 0, 0, 0
Color4 0, 0, 0
}
CostumePart ""
{
Geometry Tight
Texture1 skin_tights
Texture2 Top_5
DisplayName P566009771
RegionName "Upper Body"
BodySetName Tights/Skin
Color1 255, 0, 88
Color2 212, 0, 0
Color3 0, 0, 0
Color4 0, 0, 0
}
CostumePart ""
{
Geometry V_fem_Head.GEO/GEO_Head_V_Asym_Standard
Texture1 !v_sf_face_skin_head_10
Texture2 none
DisplayName P687117166
RegionName Head
BodySetName standard
Color1 255, 101, 205
Color2 204, 202, 0
Color3 0, 0, 0
Color4 0, 0, 0
}
CostumePart ""
{
Geometry Bracer_02
Texture1 Skin_Bracer_02a
Texture2 Skin_Bracer_02b
DisplayName P3937616722
RegionName "Upper Body"
BodySetName Tights/Skin
Color1 255, 253, 0
Color2 212, 0, 0
Color3 0, 0, 0
Color4 0, 0, 0
}
CostumePart ""
{
Geometry Hi_Heels_02
Texture1 skin_Hi_Heels_02a
Texture2 skin_Hi_Heels_02b
DisplayName P2104750136
RegionName "Lower Body"
BodySetName NewSkirts
Color1 153, 0, 49
Color2 0, 0, 255
Color3 0, 0, 0
Color4 0, 0, 0
}
CostumePart ""
{
Geometry standard
Texture1 MARTIAL_ARTS_01
Texture2 none
DisplayName P177456852
RegionName "Upper Body"
BodySetName Tights/Skin
Color1 153, 0, 49
Color2 31, 0, 0
Color3 0, 0, 0
Color4 0, 0, 0
}
CostumePart ""
{
Geometry Long_04
Texture1 Long_01a
Texture2 Long_01b
DisplayName P2681220175
RegionName Head
BodySetName standard
Color1 255, 0, 0
Color2 170, 56, 0
Color3 0, 0, 0
Color4 0, 0, 0
}
CostumePart ""
{
Fx none
Geometry none
Texture1 none
Texture2 none
Color1 0, 0, 0
Color2 0, 0, 0
Color3 0, 0, 0
Color4 0, 0, 0
}
CostumePart ""
{
Geometry Tiara_01
Texture1 Tiara_01a
Texture2 Tiara_01b
DisplayName P2793026233
RegionName Head
BodySetName standard
Color1 204, 202, 0
Color2 212, 0, 0
Color3 0, 0, 0
Color4 0, 0, 0
}
CostumePart ""
{
Geometry Tight
Texture1 Base
Texture2 Star_10
DisplayName P2281134661
RegionName "Upper Body"
BodySetName Tights/Skin
Color1 0, 0, 0
Color2 255, 253, 76
Color3 0, 0, 0
Color4 0, 0, 0
}
CostumePart ""
{
Geometry none
Texture1 none
Texture2 none
DisplayName P772741860
RegionName "Upper Body"
BodySetName Tights/Skin
Color1 0, 0, 0
Color2 0, 0, 0
Color3 0, 0, 0
Color4 0, 0, 0
}
CostumePart ""
{
Fx none
Geometry none
Texture1 none
Texture2 none
Color1 0, 0, 0
Color2 0, 0, 0
Color3 0, 0, 0
Color4 0, 0, 0
}
CostumePart ""
{
Fx none
Geometry none
Texture1 none
Texture2 none
Color1 31, 31, 31
Color2 227, 227, 227
Color3 31, 31, 31
Color4 227, 227, 227
}
CostumePart ""
{
Geometry none
Texture1 none
Texture2 none
DisplayName P2371314042
RegionName Head
BodySetName standard
Color1 0, 0, 0
Color2 0, 0, 0
Color3 0, 0, 0
Color4 0, 0, 0
}
CostumePart ""
{
Fx none
Geometry none
Texture1 none
Texture2 none
Color1 0, 0, 0
Color2 0, 0, 0
Color3 0, 0, 0
Color4 0, 0, 0
}
CostumePart ""
{
Geometry Full
Texture1 Cape_Top_01
Texture2 none
DisplayName P1987928225
RegionName Capes
BodySetName FullMantle
Color1 255, 0, 88
Color2 255, 0, 88
Color3 255, 0, 88
Color4 255, 0, 88
}
CostumePart ""
{
Geometry none
Texture1 none
Texture2 none
DisplayName P33398819
RegionName Capes
BodySetName FullMantle
Color1 0, 0, 0
Color2 0, 0, 0
Color3 0, 0, 0
Color4 0, 0, 0
}
CostumePart ""
{
Fx capes/CapeLongFem.fx
Geometry none
Texture1 !X_Valkyrie_Cape_01
Texture2 !Cape_Valkyrie_01_Mask
DisplayName P4269015351
RegionName Capes
BodySetName FullMantle
Color1 255, 0, 88
Color2 255, 0, 88
Color3 255, 0, 88
Color4 255, 0, 88
}
CostumePart ""
{
Fx none
Geometry none
Texture1 none
Texture2 none
Color1 0, 0, 0
Color2 0, 0, 0
Color3 0, 0, 0
Color4 0, 0, 0
}
CostumePart ""
{
Geometry ShortSkirt_01
Texture1 pleated
Texture2 plaid_01b
DisplayName P3930658043
RegionName "Lower Body"
BodySetName NewSkirts
Color1 255, 0, 88
Color2 255, 0, 88
Color3 0, 0, 0
Color4 0, 0, 0
}
CostumePart ""
{
Fx none
Geometry none
Texture1 none
Texture2 none
Color1 0, 0, 0
Color2 0, 0, 0
Color3 0, 0, 0
Color4 0, 0, 0
}
CostumePart ""
{
Fx none
Geometry none
Texture1 none
Texture2 none
Color1 0, 0, 0
Color2 0, 0, 0
Color3 0, 0, 0
Color4 0, 0, 0
}
CostumePart ""
{
Geometry none
Texture1 none
Texture2 none
DisplayName P1848153390
RegionName Head
BodySetName standard
Color1 0, 0, 0
Color2 0, 0, 0
Color3 0, 0, 0
Color4 0, 0, 0
}
CostumePart ""
{
Fx none
Geometry none
Texture1 none
Texture2 none
Color1 0, 0, 0
Color2 0, 0, 0
Color3 0, 0, 0
Color4 0, 0, 0
}
CostumePart ""
{
Fx none
Geometry none
Texture1 none
Texture2 none
Color1 0, 0, 0
Color2 0, 0, 0
Color3 0, 0, 0
Color4 0, 0, 0
}
CostumePart ""
{
Fx none
Geometry none
Texture1 none
Texture2 none
Color1 0, 0, 0
Color2 0, 0, 0
Color3 0, 0, 0
Color4 0, 0, 0
}
CostumePart ""
{
Fx none
Geometry none
Texture1 none
Texture2 none
Color1 0, 0, 0
Color2 0, 0, 0
Color3 0, 0, 0
Color4 0, 0, 0
}
CostumePart ""
{
Geometry none
Texture1 none
Texture2 none
DisplayName P546439883
RegionName "Lower Body"
BodySetName NewSkirts
Color1 0, 0, 0
Color2 0, 0, 0
Color3 0, 0, 0
Color4 0, 0, 0
}
CostumePart ""
{
Color1 0, 0, 0
Color2 0, 0, 0
Color3 0, 0, 0
Color4 0, 0, 0
}
CostumePart ""
{
Color1 0, 0, 0
Color2 0, 0, 0
Color3 0, 0, 0
Color4 0, 0, 0
}
}
Paragon Chat seems to be advertising the hash as: Lxdw1TQl8g/dEYfAJNh7LE7oe6c=
I am calculating it as: ycY42S40EIPgvh6GaGWYI+H/tdk=
For the record, the string of data being hashed looks like this:
1f6bbaaff-0.85-0.53-0.780shortsskin_tightsminiskirt_11ff0000ff20045ccff1Tightskin_tightsTop_51ff0058ff2d40000ff2V_fem_Head.GEO/GEO_Head_V_Asym_Standard!v_sf_face_skin_head_101ff65cdff2ccca00ff3Bracer_02Skin_Bracer_02aSkin_Bracer_02b1fffd00ff2d40000ff4Hi_Heels_02skin_Hi_Heels_02askin_Hi_Heels_02b1990031ff20000ffff5standardMARTIAL_ARTS_011990031ff21f0000ff6Long_04Long_01aLong_01b1ff0000ff2aa3800ff8Tiara_01Tiara_01aTiara_01b1ccca00ff2d40000ff9TightBaseStar_102fffd4cff15FullCape_Top_011ff0058ff2ff0058ff3ff0058ff4ff0058ff17!X_Valkyrie_Cape_01!Cape_Valkyrie_01_Maskcapes/CapeLongFem.fx1ff0058ff2ff0058ff3ff0058ff4ff0058ff19ShortSkirt_01pleatedplaid_01b1ff0058ff2ff0058ff
And if you want to see what my parser is reading and writing and tossing:
Debug: adding element: BodyType with value: 1
Debug: adding element: SkinColor with value: f6bbaaff
Debug: skipping element: Scale
Debug: adding element: BoneScale with value: -0.85
Debug: skipping element: HeadScale
Debug: skipping element: ShoulderScale
Debug: adding element: ChestScale with value: -0.53
Debug: adding element: WaistScale with value: -0.78
Debug: skipping element: HipScale
Debug: skipping element: LegScale
Debug: skipping element: HeadScales
Debug: skipping element: BrowScales
Debug: skipping element: CheekScales
Debug: skipping element: ChinScales
Debug: skipping element: CraniumScales
Debug: skipping element: JawScales
Debug: skipping element: NoseScales
Debug: adding Part: 0
Debug: adding element: Geometry with value: shorts
Debug: adding element: Texture1 with value: skin_tights
Debug: adding element: Texture2 with value: miniskirt_1
Debug: skipping element: Fx
Debug: adding color: Color1 with value: 1ff0000ff
Debug: adding color: Color2 with value: 20045ccff
Debug: skipping color: Color3
Debug: skipping color: Color4
Debug: adding Part: 1
Debug: adding element: Geometry with value: Tight
Debug: adding element: Texture1 with value: skin_tights
Debug: adding element: Texture2 with value: Top_5
Debug: skipping element: Fx
Debug: adding color: Color1 with value: 1ff0058ff
Debug: adding color: Color2 with value: 2d40000ff
Debug: skipping color: Color3
Debug: skipping color: Color4
Debug: adding Part: 2
Debug: adding element: Geometry with value: V_fem_Head.GEO/GEO_Head_V_Asym_Standard
Debug: adding element: Texture1 with value: !v_sf_face_skin_head_10
Debug: skipping element: Texture2
Debug: skipping element: Fx
Debug: adding color: Color1 with value: 1ff65cdff
Debug: adding color: Color2 with value: 2ccca00ff
Debug: skipping color: Color3
Debug: skipping color: Color4
Debug: adding Part: 3
Debug: adding element: Geometry with value: Bracer_02
Debug: adding element: Texture1 with value: Skin_Bracer_02a
Debug: adding element: Texture2 with value: Skin_Bracer_02b
Debug: skipping element: Fx
Debug: adding color: Color1 with value: 1fffd00ff
Debug: adding color: Color2 with value: 2d40000ff
Debug: skipping color: Color3
Debug: skipping color: Color4
Debug: adding Part: 4
Debug: adding element: Geometry with value: Hi_Heels_02
Debug: adding element: Texture1 with value: skin_Hi_Heels_02a
Debug: adding element: Texture2 with value: skin_Hi_Heels_02b
Debug: skipping element: Fx
Debug: adding color: Color1 with value: 1990031ff
Debug: adding color: Color2 with value: 20000ffff
Debug: skipping color: Color3
Debug: skipping color: Color4
Debug: adding Part: 5
Debug: adding element: Geometry with value: standard
Debug: adding element: Texture1 with value: MARTIAL_ARTS_01
Debug: skipping element: Texture2
Debug: skipping element: Fx
Debug: adding color: Color1 with value: 1990031ff
Debug: adding color: Color2 with value: 21f0000ff
Debug: skipping color: Color3
Debug: skipping color: Color4
Debug: adding Part: 6
Debug: adding element: Geometry with value: Long_04
Debug: adding element: Texture1 with value: Long_01a
Debug: adding element: Texture2 with value: Long_01b
Debug: skipping element: Fx
Debug: adding color: Color1 with value: 1ff0000ff
Debug: adding color: Color2 with value: 2aa3800ff
Debug: skipping color: Color3
Debug: skipping color: Color4
Debug: skipping Part: 7
Debug: adding Part: 8
Debug: adding element: Geometry with value: Tiara_01
Debug: adding element: Texture1 with value: Tiara_01a
Debug: adding element: Texture2 with value: Tiara_01b
Debug: skipping element: Fx
Debug: adding color: Color1 with value: 1ccca00ff
Debug: adding color: Color2 with value: 2d40000ff
Debug: skipping color: Color3
Debug: skipping color: Color4
Debug: adding Part: 9
Debug: adding element: Geometry with value: Tight
Debug: adding element: Texture1 with value: Base
Debug: adding element: Texture2 with value: Star_10
Debug: skipping element: Fx
Debug: skipping color: Color1
Debug: adding color: Color2 with value: 2fffd4cff
Debug: skipping color: Color3
Debug: skipping color: Color4
Debug: skipping Part: 10
Debug: skipping Part: 11
Debug: skipping Part: 12
Debug: skipping Part: 13
Debug: skipping Part: 14
Debug: adding Part: 15
Debug: adding element: Geometry with value: Full
Debug: adding element: Texture1 with value: Cape_Top_01
Debug: skipping element: Texture2
Debug: skipping element: Fx
Debug: adding color: Color1 with value: 1ff0058ff
Debug: adding color: Color2 with value: 2ff0058ff
Debug: adding color: Color3 with value: 3ff0058ff
Debug: adding color: Color4 with value: 4ff0058ff
Debug: skipping Part: 16
Debug: adding Part: 17
Debug: skipping element: Geometry
Debug: adding element: Texture1 with value: !X_Valkyrie_Cape_01
Debug: adding element: Texture2 with value: !Cape_Valkyrie_01_Mask
Debug: adding element: Fx with value: capes/CapeLongFem.fx
Debug: adding color: Color1 with value: 1ff0058ff
Debug: adding color: Color2 with value: 2ff0058ff
Debug: adding color: Color3 with value: 3ff0058ff
Debug: adding color: Color4 with value: 4ff0058ff
Debug: skipping Part: 18
Debug: adding Part: 19
Debug: adding element: Geometry with value: ShortSkirt_01
Debug: adding element: Texture1 with value: pleated
Debug: adding element: Texture2 with value: plaid_01b
Debug: skipping element: Fx
Debug: adding color: Color1 with value: 1ff0058ff
Debug: adding color: Color2 with value: 2ff0058ff
Debug: skipping color: Color3
Debug: skipping color: Color4
Debug: skipping Part: 20
Debug: skipping Part: 21
Debug: skipping Part: 22
Debug: skipping Part: 23
Debug: skipping Part: 24
Debug: skipping Part: 25
Debug: skipping Part: 26
Debug: skipping Part: 27
I'll keep banging on it, but Codewalker if you could pass this costume through your hash algorithm manually and tell me what your code passes to SHA1 (I know you do it incrementally but a concatenation of what you toss into the hash algorithm would be appreciated) then a diff of the two might tell me where your algorithm diverges from mine.
Edit: a horrifying thought crossed my mind: what if the internal representation of the costume is not identical to what the game saves to costume files? All it takes is one word capitalized differently, and the hash will fail. Ugh, I might have to implement the Iq costume request just to be able to compare the two. If that's the case, costume files have a major fail.