Skip to content

Commit 38bd635

Browse files
committed
Beta v2.3.3.6b
1 parent 94e9bed commit 38bd635

File tree

12 files changed

+746
-26
lines changed

12 files changed

+746
-26
lines changed

xivModdingFramework/General/CMP.cs

Lines changed: 136 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,136 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Dynamic;
4+
using System.IO;
5+
using System.Text;
6+
using System.Text.RegularExpressions;
7+
using System.Threading.Tasks;
8+
using xivModdingFramework.Cache;
9+
using xivModdingFramework.General.DataContainers;
10+
using xivModdingFramework.General.Enums;
11+
using xivModdingFramework.Helpers;
12+
using xivModdingFramework.Items.DataContainers;
13+
using xivModdingFramework.Mods;
14+
using xivModdingFramework.Mods.DataContainers;
15+
using xivModdingFramework.SqPack.DataContainers;
16+
using xivModdingFramework.SqPack.FileTypes;
17+
18+
namespace xivModdingFramework.General
19+
{
20+
/// <summary>
21+
/// Class for manipulating FFXIV CharaMakeParameter files.
22+
/// </summary>
23+
public static class CMP
24+
{
25+
const string HumanCmpPath = "chara/xls/charamake/human.cmp";
26+
const string RgspPathFormat = "chara/xls/charamake/rgsp/{0}-{1}.rgsp";
27+
static readonly Regex RgspPathExtractFormat = new Regex("^chara\\/xls\\/charamake\\/rgsp\\/([0-9]+)-([0-9]+).rgsp$");
28+
29+
30+
/// <summary>
31+
/// Applies a custom .rgsp file to the main Human.CMP file.
32+
/// </summary>
33+
/// <param name="filePath"></param>
34+
/// <param name="index"></param>
35+
/// <param name="modlist"></param>
36+
/// <returns></returns>
37+
internal static async Task ApplyRgspFile(string filePath, IndexFile index = null, ModList modlist = null)
38+
{
39+
var _dat = new Dat(XivCache.GameInfo.GameDirectory);
40+
var rgspData = await _dat.GetType2Data(filePath, false, index, modlist);
41+
42+
var rgsp = new RacialGenderScalingParameter(rgspData);
43+
44+
await SetScalingParameter(rgsp, index, modlist);
45+
}
46+
47+
internal static async Task RestoreDefaultScaling(string rgspPath, IndexFile index = null, ModList modlist = null)
48+
{
49+
var match = RgspPathExtractFormat.Match(rgspPath);
50+
if (!match.Success) throw new InvalidDataException("Invalid .RGSP file path.");
51+
52+
var race = (XivSubRace) Int32.Parse(match.Groups[1].Value);
53+
var gender = (XivGender) Int32.Parse(match.Groups[2].Value);
54+
55+
await RestoreDefaultScaling(race, gender, index, modlist);
56+
}
57+
58+
/// <summary>
59+
/// Restores the default settings back into the CMP file.
60+
/// Does NOT delete .rgsp entry.
61+
/// </summary>
62+
/// <param name="race"></param>
63+
/// <param name="gender"></param>
64+
/// <param name="index"></param>
65+
/// <param name="modlist"></param>
66+
/// <returns></returns>
67+
internal static async Task RestoreDefaultScaling(XivSubRace race, XivGender gender, IndexFile index = null, ModList modlist = null)
68+
{
69+
var defaults = await GetScalingParameter(race, gender, true, index, modlist);
70+
await SetScalingParameter(defaults, index, modlist);
71+
}
72+
73+
/// <summary>
74+
/// Saves a racial scaling entry to file.
75+
/// </summary>
76+
/// <param name="rgsp"></param>
77+
/// <param name=""></param>
78+
/// <returns></returns>
79+
public static async Task SaveScalingParameter(RacialGenderScalingParameter rgsp, string sourceApplication, IndexFile index = null, ModList modlist = null)
80+
{
81+
var subraceId = (int) rgsp.Race;
82+
var genderId = (int)rgsp.Gender;
83+
84+
// Write the .rgsp file and let the DAT functions handle applying it.
85+
var rgspFilePath = String.Format(RgspPathFormat, subraceId, genderId);
86+
87+
var bytes = rgsp.GetBytes();
88+
89+
90+
var dummyItem = new XivGenericItemModel();
91+
dummyItem.Name = rgsp.Race.GetDisplayName();
92+
dummyItem.SecondaryCategory = "Racial Scaling";
93+
94+
var _dat = new Dat(XivCache.GameInfo.GameDirectory);
95+
await _dat.ImportType2Data(bytes, rgspFilePath, sourceApplication, dummyItem , index, modlist);
96+
}
97+
98+
99+
100+
public static async Task<RacialGenderScalingParameter> GetScalingParameter(XivSubRace race, XivGender gender, bool forceOriginal = false, IndexFile index = null, ModList modlist = null)
101+
{
102+
var cmp = await GetCharaMakeParameterSet(forceOriginal, index, modlist);
103+
104+
return cmp.GetScalingParameter(race, gender);
105+
}
106+
107+
private static async Task SetScalingParameter(RacialGenderScalingParameter data, IndexFile index = null, ModList modlist = null)
108+
{
109+
var cmp = await GetCharaMakeParameterSet(false, index, modlist);
110+
cmp.SetScalingParameter(data);
111+
await SaveCharaMakeParameterSet(cmp, index, modlist);
112+
}
113+
114+
private static async Task<CharaMakeParameterSet> GetCharaMakeParameterSet(bool forceOriginal = false, IndexFile index = null, ModList modlist = null)
115+
{
116+
var _dat = new Dat(XivCache.GameInfo.GameDirectory);
117+
118+
var data = await _dat.GetType2Data(HumanCmpPath, forceOriginal, index, modlist);
119+
var cmp = new CharaMakeParameterSet(data);
120+
121+
122+
return cmp;
123+
}
124+
125+
private static async Task SaveCharaMakeParameterSet(CharaMakeParameterSet cmp, IndexFile index = null, ModList modlist = null)
126+
{
127+
var _dat = new Dat(XivCache.GameInfo.GameDirectory);
128+
var dummyItem = new XivGenericItemModel();
129+
dummyItem.Name = "human.cmp";
130+
dummyItem.SecondaryCategory = Constants.InternalModSourceName;
131+
132+
await _dat.ImportType2Data(cmp.GetBytes(), HumanCmpPath, Constants.InternalModSourceName, dummyItem, index, modlist);
133+
}
134+
135+
}
136+
}

0 commit comments

Comments
 (0)