public TaeEditTaeHeaderForm(TAE tae) { Tae = tae; //copyOfOriginalHeader = new TAEHeader(); //copyOfOriginalHeader.FileID = tae.Header.FileID; //copyOfOriginalHeader.FileID2 = tae.Header.FileID2; //copyOfOriginalHeader.FileID3 = tae.Header.FileID3; //copyOfOriginalHeader.Version = tae.Header.Version; //copyOfOriginalHeader.IsBigEndian = tae.Header.IsBigEndian; //copyOfOriginalHeader.UnknownB00 = tae.Header.UnknownB00; //copyOfOriginalHeader.UnknownB01 = tae.Header.UnknownB01; //copyOfOriginalHeader.UnknownB02 = tae.Header.UnknownB02; //copyOfOriginalHeader.UnknownB03 = tae.Header.UnknownB03; //copyOfOriginalHeader.UnknownC = tae.Header.UnknownC; //copyOfOriginalHeader.UnknownE00 = tae.Header.UnknownE00; //copyOfOriginalHeader.UnknownE01 = tae.Header.UnknownE01; //copyOfOriginalHeader.UnknownE02 = tae.Header.UnknownE02; //copyOfOriginalHeader.UnknownE03 = tae.Header.UnknownE03; //copyOfOriginalHeader.UnknownE04 = tae.Header.UnknownE04; //copyOfOriginalHeader.UnknownE07 = tae.Header.UnknownE07; //copyOfOriginalHeader.UnknownE08 = tae.Header.UnknownE08; //copyOfOriginalHeader.UnknownE09 = tae.Header.UnknownE09; //copyOfOriginalHeader.UnknownFlags = new byte[tae.Header.UnknownFlags.Length]; //for (int i = 0; i < tae.Header.UnknownFlags.Length; i++) //{ // copyOfOriginalHeader.UnknownFlags[i] = tae.Header.UnknownFlags[i]; //} InitializeComponent(); //Text = $"Editing Header of {Path.GetFileName(Tae.FilePath ?? Tae.VirtualUri)}"; }
void AddFadingAnimations() { foreach (int chrID in Mod.Characters.Keys) { if (chrID == 0) { continue; } TAE enemyTAE = Mod[chrID].GetTAE(chrID); TAE.Animation standing = enemyTAE.Animations[0]; TAE.Animation fadeIn = new TAE.Animation(10, standing.MiniHeader, standing.AnimFileName); fadeIn.CloneReference(standing, 0, true); TAE.Event fadeInEvent = new TAE.Event(0.0f, 2.0f, 193, 0, false, DS1[0][193]); fadeInEvent.Parameters["GhostVal1"] = 0.0f; fadeInEvent.Parameters["GhostVal2"] = 1.0f; fadeIn.Events.Add(fadeInEvent); enemyTAE.Animations.Add(fadeIn); TAE.Animation fadeOut = new TAE.Animation(11, standing.MiniHeader, standing.AnimFileName); fadeOut.CloneReference(standing, 0, true); TAE.Event fadeOutEvent = new TAE.Event(0.0f, 2.0f, 193, 0, false, DS1[0][193]); fadeOutEvent.Parameters["GhostVal1"] = 1.0f; fadeOutEvent.Parameters["GhostVal2"] = 0.0f; TAE.Event invisibleEvent = new TAE.Event(2.0f, 10.0f, 193, 0, false, DS1[0][193]); invisibleEvent.Parameters["GhostVal1"] = 0.0f; invisibleEvent.Parameters["GhostVal2"] = 0.0f; fadeOut.Events.Add(fadeOutEvent); fadeOut.Events.Add(invisibleEvent); enemyTAE.Animations.Add(fadeOut); } }
public AnimHandler(int m, TAE t, AnimationRef a) { MoveSet = m; TAE = t; Anim = a; OriginalEvents = GUI.CloneEventList(Anim.EventList); }
public TAE.Animation GetAnimInTAE(TAE tae, long id) { foreach (var a in tae.Animations) { if (a.ID == id) { return(a); } } return(null); }
public static void SetIsModified(this TAE tae, bool v, bool updateGui = true) { lock (isModified_TAE) { if (!isModified_TAE.ContainsKey(tae)) { isModified_TAE.Add(tae, false); } isModified_TAE[tae] = v; } }
public static bool GetIsModified(this TAE tae) { lock (isModified_TAE) { if (!isModified_TAE.ContainsKey(tae)) { isModified_TAE.Add(tae, false); } return(isModified_TAE[tae]); } }
public void LoadFromPath(string file) { ReloadType = TaeFileContainerReloadType.None; containerBND3 = null; containerBND4 = null; taeInBND.Clear(); hkxInBND.Clear(); if (BND3.Is(file)) { ContainerType = TaeFileContainerType.BND3; containerBND3 = BND3.Read(file); foreach (var f in containerBND3.Files) { if (TAE.Is(f.Bytes)) { taeInBND.Add(f.Name, TAE.Read(f.Bytes)); } else if (f.Name.ToUpper().EndsWith(".HKX")) { hkxInBND.Add(f.Name, f.Bytes); } } } else if (BND4.Is(file)) { ContainerType = TaeFileContainerType.BND4; containerBND4 = BND4.Read(file); foreach (var f in containerBND4.Files) { if (TAE.Is(f.Bytes)) { taeInBND.Add(f.Name, TAE.Read(f.Bytes)); } else if (f.Name.ToUpper().EndsWith(".HKX")) { hkxInBND.Add(f.Name, f.Bytes); } } } else if (TAE.Is(file)) { ContainerType = TaeFileContainerType.TAE; taeInBND.Add(file, TAE.Read(file)); } filePath = file; //SFTODO ReloadType = TaeFileContainerReloadType.None; }
static void Main(string[] args) { const string basePath = @"D:\Program Files (x86)\Steam\steamapps\common\DARK SOULS III\Game"; const string actionSetupPath = "Res/TaeToWeaponKind.yml"; TAEAnalyzerData analyzerData = new YamlDotNet.Serialization.Deserializer().Deserialize <TAEAnalyzerData>(new System.IO.StreamReader(actionSetupPath)); var reader = new BND4Reader(System.IO.Path.Combine(basePath, "chr/c0000.anibnd.dcx")); const int jumpTableEventType = 0; const int attackEventType = 1; int[] comboBehSubIds = new[] { 4, 116 }; var taeTemplate = TAE.Template.ReadXMLFile(@"Res/TAE.Template.DS3.xml"); var jumpTableEventTemplate = taeTemplate[21][jumpTableEventType]; var attackEventTemplate = taeTemplate[21][attackEventType]; var analyzedWeapons = analyzerData.weapons.Select(weaponKvp => (kvp: weaponKvp, taeFileHeader: reader.Files // get all TAE headers .Where(header => header.Name.EndsWith("tae")) .Single(header => System.IO.Path.GetFileName(header.Name) == $"a{weaponKvp.Key}.tae"))) .Select(weaponData => (weaponData: weaponData, fileContents: reader.ReadFile(weaponData.taeFileHeader))) .Where(weaponData => TAE.Is(weaponData.fileContents)) .Select((weaponData) => (kvp: weaponData.weaponData.kvp, weaponTae: TAE.Read(weaponData.fileContents))) .SelectMany(myTuple => analyzerData.animKind.Select(animKindKvp => (weaponKindKvp: myTuple.kvp, animKindKvp: animKindKvp, weaponTae: myTuple.weaponTae))) .SelectMany(myTuple => { var attackTimings = myTuple.weaponTae.Animations.Select(anim => { bool didFind = myTuple.animKindKvp.Value.TryGetDetails(myTuple.animKindKvp.Key, anim, out string details); return(found: didFind, myTuple: myTuple, anim, details); }) .Where(d => d.found) .Select(anim => (anim, events: anim.anim.Events.Where(taeEvent => taeEvent.Type == attackEventType || taeEvent.Type == jumpTableEventType))) .Where(events => events.events.Any()) .Select(anim => anim.events.Aggregate(new AttackInfo(), (attackInfo, taeEvent) => { attackInfo.anim = anim.anim.anim; attackInfo.details = anim.anim.details; if (taeEvent.Type == attackEventType) { taeEvent.ApplyTemplate(false, attackEventTemplate); if (taeEvent.Parameters["Unk04"].Equals(0)) { attackInfo.Attacks.Add((attackStart: taeEvent.StartTime, attackEnd: taeEvent.EndTime)); } }
void ResetSpeedInDeathAnimations() { foreach (int chrID in Mod.Characters.Keys) { if (chrID != 0) { TAE enemyTAE = Mod[chrID].GetTAE(chrID); foreach (TAE.Animation deathAnim in enemyTAE.Animations.Where(anim => 2200 >= anim.ID && anim.ID < 2210)) { deathAnim.ApplyEffect(SpeedEffects[1.0f], 0.0f, 1.0f); } } } }
/// <summary> /// Returns an enumerable containing all distinct FFX IDs referenced in the TAE. /// </summary> public static IEnumerable <int> GetAllFFXIDs(this TAE tae, int variation, GameParamHandler gParam) { List <int> FFX = new List <int>(); foreach (Animation anim in tae.Animations) { foreach (Event evt in anim.Events) { if (evt.Type >= 96 && evt.Type <= 121 && evt.Type != 116 && evt.Type != 120) { FFX.Add(Convert.ToInt32(evt.Parameters["FFXID"])); } else if (evt.Type == 2) { int subID = Convert.ToInt32(evt.Parameters["BehaviorSubID"]); int behID = 200000000 + (variation * 1000) + subID; if (!gParam.BehaviorsNPC.ContainsKey(behID)) { continue; } Behavior beh = gParam.BehaviorsNPC[behID]; if (beh.ReferenceType != 1) { continue; } if (!gParam.Bullets.ContainsKey(beh.RefID)) { continue; } Bullet bullet = gParam.Bullets[beh.RefID]; FFX.Add(bullet.FlickFX); FFX.Add(bullet.ImpactFX); FFX.Add(bullet.ProjectileFX); while (bullet.BulletOnHit != -1) { if (!gParam.Bullets.ContainsKey(bullet.BulletOnHit)) { break; // missing child bullet } bullet = gParam.Bullets[bullet.BulletOnHit]; FFX.Add(bullet.FlickFX); FFX.Add(bullet.ImpactFX); FFX.Add(bullet.ProjectileFX); } } } } return(FFX.Distinct().Where(i => i > -1)); }
void RandomizeEnemySpeed(int enemyID) { // Randomizes speeds of relevant animations in enemy TAE. Also adjusts attack damage based on new speed (excludes Bullets). if (enemyID == 0) { throw new ArgumentException("`RandomizeEnemySpeed` is not for the player."); } TAE tae = Mod[enemyID].GetTAE(enemyID); foreach (var animation in tae.Animations) { var info = new NPCAnimationInfo(animation, enemyID, Mod); if (info.HasInvokeBehaviorEvent && 3000 <= animation.ID && animation.ID <= 3999) { RandomizeBehaviorAnimationSpeed(animation, info); } } }
private void saveANIBNDToolStripMenuItem_Click(object sender, EventArgs e) { if (ANIBND == null) { return; } try { TAE.Save(); ANIBND.Write(FilePath); UTIL.WriteLog(Path.GetFileName(FilePath) + " saved."); forceInGameReloadToolStripMenuItem_Click(sender, e); } catch (Exception ex) { UTIL.LogException("Error saving ANIBND", ex); } }
public static void SetIsModified(this TAE tae, bool v, bool updateGui = true) { lock (isModified_TAE) { if (!isModified_TAE.ContainsKey(tae)) { isModified_TAE.Add(tae, false); } //if (v) //{ // Console.WriteLine("REEE"); //} isModified_TAE[tae] = v; if (updateGui) { Main.TAE_EDITOR.UpdateIsModifiedStuff(); } } }
private void AnimDataGrid_PropertyValueChanged(object s, PropertyValueChangedEventArgs e) { TAE.Save(); }
public void LoadFromPath(string file) { filePath = file; containerANIBND = null; taeInBND.Clear(); hkxInBND.Clear(); if (BND3.Is(file)) { ContainerType = TaeFileContainerType.ANIBND; containerANIBND = BND3.Read(file); } else if (BND4.Is(file)) { ContainerType = TaeFileContainerType.ANIBND; containerANIBND = BND4.Read(file); } else if (TAE.Is(file)) { CheckGameVersionForTaeInterop(file); ContainerType = TaeFileContainerType.TAE; taeInBND.Add(file, TAE.Read(file)); } void DoBnd(IBinder bnd) { } if (ContainerType == TaeFileContainerType.ANIBND) { LoadingTaskMan.DoLoadingTaskSynchronous("TaeFileContainer_ANIBND", "Loading all TAE files in ANIBND...", innerProgress => { double i = 0; foreach (var f in containerANIBND.Files) { innerProgress.Report(++i / containerANIBND.Files.Count); CheckGameVersionForTaeInterop(f.Name); if (BND3.Is(f.Bytes)) { ContainerType = TaeFileContainerType.OBJBND; containerOBJBND = containerANIBND; containerANIBND = BND3.Read(f.Bytes); anibndPathInsideObjbnd = f.Name; break; } else if (BND4.Is(f.Bytes)) { ContainerType = TaeFileContainerType.OBJBND; containerOBJBND = containerANIBND; containerANIBND = BND4.Read(f.Bytes); anibndPathInsideObjbnd = f.Name; break; } else if (TAE.Is(f.Bytes)) { taeInBND.Add(f.Name, TAE.Read(f.Bytes)); } else if (f.Name.ToUpper().EndsWith(".HKX")) { hkxInBND.Add(f.Name, f.Bytes); } } innerProgress.Report(1); if (ContainerType == TaeFileContainerType.OBJBND) { i = 0; foreach (var f in containerANIBND.Files) { innerProgress.Report(++i / containerANIBND.Files.Count); CheckGameVersionForTaeInterop(f.Name); if (TAE.Is(f.Bytes)) { taeInBND.Add(f.Name, TAE.Read(f.Bytes)); } else if (f.Name.ToUpper().EndsWith(".HKX")) { hkxInBND.Add(f.Name, f.Bytes); } } innerProgress.Report(1); } }); } }
public void LoadFromPath(string file) { StandardTAE = null; PlayerTAE = null; file = file.ToUpper(); var fileNoDcx = file; IsDcx = false; if (file.EndsWith(".DCX")) { IsDcx = true; fileNoDcx = file.Substring(0, file.Length - 4); } if (fileNoDcx.EndsWith(".ANIBND")) { if (IsDcx) { dataANIBND = DataFile.LoadFromFile <ANIBND>(file, loadDcxVersion: true); } else { dataANIBND = DataFile.LoadFromFile <ANIBND>(fileNoDcx); } StandardTAE = dataANIBND.StandardTAE; PlayerTAE = dataANIBND.PlayerTAE; ContainerType = TaeFileContainerType.Anibnd; } else if (fileNoDcx.EndsWith(".OBJBND")) { if (IsDcx) { dataEntityBND = DataFile.LoadFromFile <EntityBND>(file, loadDcxVersion: true); } else { dataEntityBND = DataFile.LoadFromFile <EntityBND>(fileNoDcx); } StandardTAE = new Dictionary <int, TAE>(); PlayerTAE = new Dictionary <int, TAE>(); foreach (var m in dataEntityBND.Models) { if (m.AnimContainer != null) { foreach (var tae in m.AnimContainer.StandardTAE) { StandardTAE.Add(tae.Key, tae.Value); } foreach (var tae in m.AnimContainer.PlayerTAE) { PlayerTAE.Add(tae.Key, tae.Value); } } } ContainerType = TaeFileContainerType.Objbnd; } else if (file.EndsWith(".REMOBND")) { if (IsDcx) { dataREMOBND = DataFile.LoadFromFile <REMOBND>(file, loadDcxVersion: true); } else { dataREMOBND = DataFile.LoadFromFile <REMOBND>(fileNoDcx); } ContainerType = TaeFileContainerType.Remobnd; } else if (fileNoDcx.EndsWith(".TAE")) { if (IsDcx) { dataTAE = DataFile.LoadFromFile <TAE>(file, loadDcxVersion: true); } else { dataTAE = DataFile.LoadFromFile <TAE>(fileNoDcx); } ContainerType = TaeFileContainerType.Tae; } }