diff --git a/SatisfactorySaveEditor/Cheats/CouponChangerCheat.cs b/SatisfactorySaveEditor/Cheats/CouponChangerCheat.cs index 703c86c..2579f33 100644 --- a/SatisfactorySaveEditor/Cheats/CouponChangerCheat.cs +++ b/SatisfactorySaveEditor/Cheats/CouponChangerCheat.cs @@ -17,12 +17,14 @@ public class CouponChangerCheat : ICheat private long pointsRequiredFromTicketCount(int tickets) { - //equation for ticket count from points is y={x>3:(ceil(x/3)^2)*1000, x<4:1000} where x is ticket count and y is points required. from here: https://satisfactory.gamepedia.com/AWESOME_Sink - //OLD ticket cost function for pre-0.3.3 AWESOME sink --TODO update to new ticket cost function once that is determined + // see ticket equations https://satisfactory.gamepedia.com/AWESOME_Sink + // ticket cost pre-0.3.3 was Pow(Ceiling(tickets / 3.0), 2) * 1000 + // ticket cost U7 is (Pow(Ceiling(tickets / 3.0)-1, 2) * 500) + 1000 + // TODO: keep the cost function up to date. if (tickets < 4) return 1000; else - return (long) (Pow(Ceiling(tickets / 3.0), 2) * 1000); + return (long) (Pow(Ceiling(tickets / 3.0)-1, 2) * 500) + 1000; } public bool Apply(SaveObjectModel rootItem, SatisfactorySave saveGame) @@ -35,7 +37,17 @@ public bool Apply(SaveObjectModel rootItem, SatisfactorySave saveGame) } var pointsTowardsCurrentTicket = sinkSubsystem.FindOrCreateField("mTotalResourceSinkPoints"); - var mCurrentPointLevel = sinkSubsystem.FindOrCreateField("mCurrentPointLevel"); + //var mCurrentPointLevel = sinkSubsystem.FindOrCreateField("mCurrentPointLevel"); + + // how many tickets are currently printable from sink. + var numResourceSinkCoupons = sinkSubsystem.FindOrCreateField("mNumResourceSinkCoupons"); + + // which ticket point level (modulo 3) the sink currently is (points, alien DNA). + var pointLevels = sinkSubsystem.FindOrCreateField("mCurrentPointLevels"); + + // the accumulated points the sink currently has (points, alien DNA). + var accumulatedPoints = sinkSubsystem.FindOrCreateField("mTotalPoints"); + var dialog = new StringPromptWindow { @@ -45,7 +57,8 @@ public bool Apply(SaveObjectModel rootItem, SatisfactorySave saveGame) cvm.WindowTitle = "Enter earned ticket count"; cvm.PromptMessage = "Tickets"; cvm.ValueChosen = "0"; - cvm.OldValueMessage = $"Sets the AWESOME Sink ticket prices as if you had earned N tickets.\nFor example, entering 0 sets the price for the next ticket back to 1,000\nCurrent tickets earned: {mCurrentPointLevel.Value}\nMore info on AWESOME Sink wiki page"; + //mCurrentPointLevel.Value + cvm.OldValueMessage = $"Sets the AWESOME Sink ticket prices as if you had earned N tickets.\nFor example, entering 0 sets the price for the next ticket back to 1,000\nCurrent tickets earned: {((IntPropertyViewModel)pointLevels.Elements[0]).Value}\nMore info on AWESOME Sink wiki page"; dialog.ShowDialog(); int requestedTicketCount = 0; @@ -65,14 +78,15 @@ public bool Apply(SaveObjectModel rootItem, SatisfactorySave saveGame) return false; } - mCurrentPointLevel.Value = requestedTicketCount; //"point level" is 0 if no tickets have been earned, 1 if one ticket has, etc. + //mCurrentPointLevel.Value = requestedTicketCount; //"point level" is 0 if no tickets have been earned, 1 if one ticket has, etc. + ((IntPropertyViewModel)pointLevels.Elements[0]).Value = requestedTicketCount; + pointsTowardsCurrentTicket.Value = 0; //reset progress towards the current ticket so the game GUI doesn't get confused - long calculatedPointsCount = pointsRequiredFromTicketCount(requestedTicketCount); + long calculatedPointsCountNextTicket = pointsRequiredFromTicketCount(requestedTicketCount+1); - MessageBox.Show($"Earned ticket count set to {requestedTicketCount}.", "Success", MessageBoxButton.OK, MessageBoxImage.Information); - //MessageBox.Show($"Ticket count set to {requestedTicketCount}. The next ticket will take {calculatedPointsCount} points to earn.", "Success", MessageBoxButton.OK, MessageBoxImage.Information); + MessageBox.Show($"Earned ticket count set to {requestedTicketCount}. The next ticket will take {calculatedPointsCountNextTicket} points to earn.", "Success", MessageBoxButton.OK, MessageBoxImage.Information); return true; } catch (Exception) diff --git a/SatisfactorySaveEditor/Cheats/DeleteEnemiesCheat.cs b/SatisfactorySaveEditor/Cheats/DeleteEnemiesCheat.cs index 035ca89..7842df3 100644 --- a/SatisfactorySaveEditor/Cheats/DeleteEnemiesCheat.cs +++ b/SatisfactorySaveEditor/Cheats/DeleteEnemiesCheat.cs @@ -1,16 +1,14 @@ -using SatisfactorySaveEditor.Model; +using System; +using System.Collections.Generic; +using System.IO; +using System.Windows; +using SatisfactorySaveEditor.Model; using SatisfactorySaveEditor.ViewModel.Property; using SatisfactorySaveEditor.ViewModel.Struct; using SatisfactorySaveParser; using SatisfactorySaveParser.PropertyTypes; using SatisfactorySaveParser.PropertyTypes.Structs; using SatisfactorySaveParser.Structures; -using System; -using System.Diagnostics; -using System.IO; -using System.Windows; -using Vector = SatisfactorySaveParser.PropertyTypes.Structs.Vector; -using Vector3 = SatisfactorySaveParser.Structures.Vector3; namespace SatisfactorySaveEditor.Cheats { @@ -91,7 +89,7 @@ public bool AddDoggo(SaveObjectModel rootItem, SatisfactorySave saveGame) } var player = (SaveEntityModel)hostPlayerModel.Items[0]; - SaveComponent healthComponent = new SaveComponent("/Script/FactoryGame.FGHealthComponent", "Persistent_Level", $"Persistent_Level:PersistentLevel.Char_SpaceRabbit_C_{currentDoggoID}.HealthComponent") + SaveComponent healthComponent = new SaveComponent(saveGame.Header.MapName, "/Script/FactoryGame.FGHealthComponent", "Persistent_Level", $"Persistent_Level:PersistentLevel.Char_SpaceRabbit_C_{currentDoggoID}.HealthComponent") { DataFields = new SerializedFields(), ParentEntityName = $"Persistent_Level:PersistentLevel.Char_SpaceRabbit_C_{currentDoggoID}" @@ -100,14 +98,14 @@ public bool AddDoggo(SaveObjectModel rootItem, SatisfactorySave saveGame) SaveComponent inventoryComponent; using (BinaryReader reader = new BinaryReader(new MemoryStream(bytes))) { - inventoryComponent = new SaveComponent("/Script/FactoryGame.FGInventoryComponent", "Persistent_Level", $"Persistent_Level:PersistentLevel.Char_SpaceRabbit_C_{currentDoggoID}.mInventory") + inventoryComponent = new SaveComponent(saveGame.Header.MapName, "/Script/FactoryGame.FGInventoryComponent", "Persistent_Level", $"Persistent_Level:PersistentLevel.Char_SpaceRabbit_C_{currentDoggoID}.mInventory") { DataFields = new SerializedFields() { new ArrayProperty("mInventoryStacks") { Type = StructProperty.TypeName, - Elements = new System.Collections.Generic.List() + Elements = new List() { SerializedProperty.Parse(reader, saveGame.Header.BuildVersion) } @@ -115,7 +113,7 @@ public bool AddDoggo(SaveObjectModel rootItem, SatisfactorySave saveGame) new ArrayProperty("mArbitrarySlotSizes") { Type = IntProperty.TypeName, - Elements = new System.Collections.Generic.List() + Elements = new List() { new IntProperty("Element") { Value = 0 } } @@ -123,7 +121,7 @@ public bool AddDoggo(SaveObjectModel rootItem, SatisfactorySave saveGame) new ArrayProperty("mAllowedItemDescriptors") { Type = ObjectProperty.TypeName, - Elements = new System.Collections.Generic.List() + Elements = new List() { new ObjectProperty("Element") { LevelName = "", PathName = "" } } @@ -132,7 +130,7 @@ public bool AddDoggo(SaveObjectModel rootItem, SatisfactorySave saveGame) ParentEntityName = $"Persistent_Level:PersistentLevel.Char_SpaceRabbit_C_{currentDoggoID}" }; } - SaveEntity doggo = new SaveEntity("/Game/FactoryGame/Character/Creature/Wildlife/SpaceRabbit/Char_SpaceRabbit.Char_SpaceRabbit_C", "Persistent_Level", $"Persistent_Level:PersistentLevel.Char_SpaceRabbit_C_{currentDoggoID}") + SaveEntity doggo = new SaveEntity(saveGame.Header.MapName, "/Game/FactoryGame/Character/Creature/Wildlife/SpaceRabbit/Char_SpaceRabbit.Char_SpaceRabbit_C", "Persistent_Level", $"Persistent_Level:PersistentLevel.Char_SpaceRabbit_C_{currentDoggoID}") { NeedTransform = true, Rotation = ((SaveEntity)player.Model).Rotation, @@ -147,10 +145,10 @@ public bool AddDoggo(SaveObjectModel rootItem, SatisfactorySave saveGame) ParentObjectName = "", ParentObjectRoot = "" }; - doggo.Components = new System.Collections.Generic.List() + doggo.Components = new List() { - new SatisfactorySaveParser.Structures.ObjectReference() {LevelName = "Persistent_Level", PathName = $"Persistent_Level:PersistentLevel.Char_SpaceRabbit_C_{currentDoggoID}.mInventory"}, - new SatisfactorySaveParser.Structures.ObjectReference() {LevelName = "Persistent_Level", PathName = $"Persistent_Level:PersistentLevel.Char_SpaceRabbit_C_{currentDoggoID}.HealthComponent"} + new ObjectReference() {LevelName = "Persistent_Level", PathName = $"Persistent_Level:PersistentLevel.Char_SpaceRabbit_C_{currentDoggoID}.mInventory"}, + new ObjectReference() {LevelName = "Persistent_Level", PathName = $"Persistent_Level:PersistentLevel.Char_SpaceRabbit_C_{currentDoggoID}.HealthComponent"} }; byte[] emptyDynamicStructData = { 0x05, 0x00, 0x00, 0x00, 0x4e, 0x6f, 0x6e, 0x65 }; // Length prefixed "None" using (BinaryReader binaryReader = new BinaryReader(new MemoryStream(emptyDynamicStructData))) @@ -192,6 +190,7 @@ public bool Apply(SaveObjectModel rootItem, SatisfactorySave saveGame) return false; } + float offset = -50000; var hostPlayerModel = rootItem.FindChild("Char_Player.Char_Player_C", false); if (hostPlayerModel == null || hostPlayerModel.Items.Count < 1) @@ -211,11 +210,13 @@ public bool Apply(SaveObjectModel rootItem, SatisfactorySave saveGame) { foreach (StructPropertyViewModel elem in arrayProperty.Elements) { - ((Vector)((StructProperty)((DynamicStructDataViewModel)elem.StructData).Fields[0].Model).Data).Data.Z += offset; // Move the spawn point under the map + // Set WasKilled to true so they don't respawn after deleting them - ((BoolPropertyViewModel)((DynamicStructDataViewModel)elem.StructData).Fields[2]).Value = true; + ((BoolPropertyViewModel)((DynamicStructDataViewModel)elem.StructData).Fields[1]).Value = true; + // Set NumTimesKilled to at least 1 i guess. Better to increment. + ((IntPropertyViewModel)((DynamicStructDataViewModel)elem.StructData).Fields[2]).Value += 1; // Set KilledOnDayNumber to a huge number (some far away animals respawn if the number is too small) - ((IntPropertyViewModel)((DynamicStructDataViewModel)elem.StructData).Fields[3]).Value = (int)(Distance(playerPosition, ((Vector)((StructProperty)((DynamicStructDataViewModel)elem.StructData).Fields[0].Model).Data).Data) /10000); + ((IntPropertyViewModel)((DynamicStructDataViewModel)elem.StructData).Fields[3]).Value = (int)(Distance(playerPosition, ((SaveEntityModel)animalSpawner).Position) /10000); } }); } diff --git a/SatisfactorySaveEditor/Cheats/EverythingBoxCheat.cs b/SatisfactorySaveEditor/Cheats/EverythingBoxCheat.cs index 4c1c6ce..a5ae044 100644 --- a/SatisfactorySaveEditor/Cheats/EverythingBoxCheat.cs +++ b/SatisfactorySaveEditor/Cheats/EverythingBoxCheat.cs @@ -1,16 +1,13 @@ -using SatisfactorySaveEditor.Model; +using System; +using System.Collections.Generic; +using System.IO; +using System.Windows; +using SatisfactorySaveEditor.Model; using SatisfactorySaveEditor.View; using SatisfactorySaveEditor.ViewModel; -using SatisfactorySaveEditor.ViewModel.Property; using SatisfactorySaveParser; using SatisfactorySaveParser.Data; using SatisfactorySaveParser.PropertyTypes; -using SatisfactorySaveParser.PropertyTypes.Structs; -using SatisfactorySaveParser.Structures; -using System; -using System.Collections.Generic; -using System.IO; -using System.Windows; namespace SatisfactorySaveEditor.Cheats { @@ -101,7 +98,7 @@ public bool Apply(SaveObjectModel rootItem, SatisfactorySave saveGame) } //Use Mass Dismantle Cheat's crate creation function to package the items into a crate entity - MassDismantleCheat.CreateCrateEntityFromInventory(rootItem, inventory, saveGame.Header.BuildVersion); + MassDismantleCheat.CreateCrateEntityFromInventory(saveGame.Header.MapName, rootItem, inventory, saveGame.Header.BuildVersion); //MessageBox.Show("Player name " + playerEntityModel.Title); MessageBox.Show($"Crate created.\nNote that normally unstackable items will visually display as being stacked to 1. Use Ctrl+Click to transfer items out of the crate without deleting part of the stack.\n\nSkipped the following items marked as radioactive:\n\n{skipped}", $"Processed {resourceStrings.Count} resource paths"); diff --git a/SatisfactorySaveEditor/Cheats/KillPlayersCheat.cs b/SatisfactorySaveEditor/Cheats/KillPlayersCheat.cs index f8b2e4b..f69ec5d 100644 --- a/SatisfactorySaveEditor/Cheats/KillPlayersCheat.cs +++ b/SatisfactorySaveEditor/Cheats/KillPlayersCheat.cs @@ -37,13 +37,13 @@ public bool Apply(SaveObjectModel rootItem, SatisfactorySave saveGame) if (!InventoryEmpty(inventoryComponent)) { currentStorageID = GetNextStorageID(currentStorageID, rootItem); - SaveComponent newInventory = new SaveComponent(inventoryComponent.TypePath, inventoryComponent.RootObject, $"Persistent_Level:PersistentLevel.BP_Crate_C_{currentStorageID}.inventory") + SaveComponent newInventory = new SaveComponent(saveGame.Header.MapName, inventoryComponent.TypePath, inventoryComponent.RootObject, $"Persistent_Level:PersistentLevel.BP_Crate_C_{currentStorageID}.inventory") { ParentEntityName = $"Persistent_Level:PersistentLevel.BP_Crate_C_{currentStorageID}", DataFields = inventoryComponent.DataFields }; rootItem.FindChild("FactoryGame.FGInventoryComponent", false).Items.Add(new SaveComponentModel(newInventory)); - SaveEntity newSaveObject = new SaveEntity("/Game/FactoryGame/-Shared/Crate/BP_Crate.BP_Crate_C", "Persistent_Level", $"Persistent_Level:PersistentLevel.BP_Crate_C_{currentStorageID}") + SaveEntity newSaveObject = new SaveEntity(saveGame.Header.MapName, "/Game/FactoryGame/-Shared/Crate/BP_Crate.BP_Crate_C", "Persistent_Level", $"Persistent_Level:PersistentLevel.BP_Crate_C_{currentStorageID}") { NeedTransform = true, Rotation = ((SaveEntity)player.Model).Rotation, diff --git a/SatisfactorySaveEditor/Cheats/MassDismantleCheat.cs b/SatisfactorySaveEditor/Cheats/MassDismantleCheat.cs index f45867c..2f4fcda 100644 --- a/SatisfactorySaveEditor/Cheats/MassDismantleCheat.cs +++ b/SatisfactorySaveEditor/Cheats/MassDismantleCheat.cs @@ -217,16 +217,16 @@ public bool Apply(SaveObjectModel rootItem, SatisfactorySave saveGame) MessageBoxResult result = MessageBox.Show($"Dismantled {countFactory} factory buildings, {countBuilding} foundations and {countCrate} crates. Drop the items (including items in storages) in a single crate?", "Dismantled", MessageBoxButton.YesNo, MessageBoxImage.Question); if (result == MessageBoxResult.Yes) { - CreateCrateEntityFromInventory(rootItem, inventory, saveGame.Header.BuildVersion); + CreateCrateEntityFromInventory(saveGame.Header.MapName, rootItem, inventory, saveGame.Header.BuildVersion); } return true; } - public static SaveEntityModel CreateCrateEntityFromInventory(SaveObjectModel rootItem, ArrayProperty inventory, int buildVersion) + public static SaveEntityModel CreateCrateEntityFromInventory(string levelname, SaveObjectModel rootItem, ArrayProperty inventory, int buildVersion) { inventory = ArrangeInventory(inventory, buildVersion); int currentStorageID = GetNextStorageID(0, rootItem); - SaveComponent newInventory = new SaveComponent("/Script/FactoryGame.FGInventoryComponent", "Persistent_Level", $"Persistent_Level:PersistentLevel.BP_Crate_C_{currentStorageID}.inventory") + SaveComponent newInventory = new SaveComponent(levelname, "/Script/FactoryGame.FGInventoryComponent", "Persistent_Level", $"Persistent_Level:PersistentLevel.BP_Crate_C_{currentStorageID}.inventory") { ParentEntityName = $"Persistent_Level:PersistentLevel.BP_Crate_C_{currentStorageID}", DataFields = new SerializedFields() @@ -250,7 +250,7 @@ public static SaveEntityModel CreateCrateEntityFromInventory(SaveObjectModel roo }; rootItem.FindChild("FactoryGame.FGInventoryComponent", false).Items.Add(new SaveComponentModel(newInventory)); SaveEntity player = (SaveEntity)rootItem.FindChild("Char_Player.Char_Player_C", false).DescendantSelf[0]; - SaveEntity newSaveObject = new SaveEntity("/Game/FactoryGame/-Shared/Crate/BP_Crate.BP_Crate_C", "Persistent_Level", $"Persistent_Level:PersistentLevel.BP_Crate_C_{currentStorageID}") + SaveEntity newSaveObject = new SaveEntity(levelname, "/Game/FactoryGame/-Shared/Crate/BP_Crate.BP_Crate_C", "Persistent_Level", $"Persistent_Level:PersistentLevel.BP_Crate_C_{currentStorageID}") { NeedTransform = true, Rotation = player.Rotation, diff --git a/SatisfactorySaveEditor/Cheats/RemoveSlugsCheat.cs b/SatisfactorySaveEditor/Cheats/RemoveSlugsCheat.cs index 1e19e9a..68f6bd8 100644 --- a/SatisfactorySaveEditor/Cheats/RemoveSlugsCheat.cs +++ b/SatisfactorySaveEditor/Cheats/RemoveSlugsCheat.cs @@ -1,11 +1,6 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - +using System.Linq; +using System.Windows; using SatisfactorySaveEditor.Model; - using SatisfactorySaveParser; using SatisfactorySaveParser.Structures; @@ -17,21 +12,35 @@ public class RemoveSlugsCheat : ICheat public bool Apply(SaveObjectModel rootItem, SatisfactorySave saveGame) { + MessageBox.Show("Can only remove already discovered slugs on the map. Continue?", "Remove slugs?", MessageBoxButton.YesNo); + var slugTypes = new[] { "/Game/FactoryGame/Resource/Environment/Crystal/BP_Crystal.BP_Crystal_C", "/Game/FactoryGame/Resource/Environment/Crystal/BP_Crystal_mk2.BP_Crystal_mk2_C", "/Game/FactoryGame/Resource/Environment/Crystal/BP_Crystal_mk3.BP_Crystal_mk3_C" }; + + var slugsMk1 = rootItem.FindChild("BP_Crystal.BP_Crystal_C", false); + var slugsMk2 = rootItem.FindChild("BP_Crystal_mk2.BP_Crystal_mk2_C", false); + var slugsMk3 = rootItem.FindChild("BP_Crystal_mk3.BP_Crystal_mk3_C", false); - var slugs = saveGame.Entries.Where(x => slugTypes.Contains(x.TypePath)); - - saveGame.CollectedObjects.RemoveAll(x => x.PathName.Contains("PersistentLevel.BP_Crystal")); - saveGame.CollectedObjects.AddRange(slugs.Select(s => new ObjectReference + foreach (SaveLevel level in saveGame.Levels) { - LevelName = s.RootObject, - PathName = s.InstanceName - })); + var slugsForLevel = level.Entries.Where(x => slugTypes.Contains(x.TypePath)); + var readyToCollectSlugs = slugsForLevel.Where(slug => !slug.RootObject.Equals("Persistent_Exploration_2")); + + level.CollectedObjects.AddRange(readyToCollectSlugs.Select(s => new ObjectReference + { + LevelName = s.RootObject, + PathName = s.InstanceName + })); + } + + slugsMk1.Items.Clear(); + slugsMk2.Items.Clear(); + slugsMk3.Items.Clear(); + MessageBox.Show("Removed discovered slugs on the map.", "Removed slugs.", MessageBoxButton.OK); return true; } } diff --git a/SatisfactorySaveEditor/Cheats/RestoreSlugsCheat.cs b/SatisfactorySaveEditor/Cheats/RestoreSlugsCheat.cs index 9c880df..e34523d 100644 --- a/SatisfactorySaveEditor/Cheats/RestoreSlugsCheat.cs +++ b/SatisfactorySaveEditor/Cheats/RestoreSlugsCheat.cs @@ -1,6 +1,6 @@  +using System.Windows; using SatisfactorySaveEditor.Model; - using SatisfactorySaveParser; namespace SatisfactorySaveEditor.Cheats @@ -11,7 +11,12 @@ public class RestoreSlugsCheat : ICheat public bool Apply(SaveObjectModel rootItem, SatisfactorySave saveGame) { - saveGame.CollectedObjects.RemoveAll(x => x.PathName.Contains("PersistentLevel.BP_Crystal")); + foreach (var level in saveGame.Levels) + { + level.CollectedObjects.RemoveAll(x => x.PathName.Contains("PersistentLevel.BP_Crystal")); + } + + MessageBox.Show("Restored all slugs on the map.", "Restored Slugs.", MessageBoxButton.OK); return true; } } diff --git a/SatisfactorySaveEditor/Cheats/SpawnDoggoCheat.cs b/SatisfactorySaveEditor/Cheats/SpawnDoggoCheat.cs index ce5e446..a266dd6 100644 --- a/SatisfactorySaveEditor/Cheats/SpawnDoggoCheat.cs +++ b/SatisfactorySaveEditor/Cheats/SpawnDoggoCheat.cs @@ -1,17 +1,9 @@ -using SatisfactorySaveEditor.Model; +using System; +using System.Windows; +using SatisfactorySaveEditor.Model; using SatisfactorySaveEditor.View; using SatisfactorySaveEditor.ViewModel; using SatisfactorySaveParser; -using SatisfactorySaveParser.PropertyTypes; -using SatisfactorySaveParser.PropertyTypes.Structs; -using SatisfactorySaveParser.Structures; -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using System.Windows; namespace SatisfactorySaveEditor.Cheats { diff --git a/SatisfactorySaveEditor/Cheats/UndoDeleteEnemiesCheat.cs b/SatisfactorySaveEditor/Cheats/UndoDeleteEnemiesCheat.cs index 5359c98..aac7f11 100644 --- a/SatisfactorySaveEditor/Cheats/UndoDeleteEnemiesCheat.cs +++ b/SatisfactorySaveEditor/Cheats/UndoDeleteEnemiesCheat.cs @@ -58,11 +58,10 @@ public bool Apply(SaveObjectModel rootItem, SatisfactorySave save) { foreach (StructPropertyViewModel elem in arrayProperty.Elements) { - if (probablyEdited) - ((Vector)((StructProperty)((DynamicStructDataViewModel)elem.StructData).Fields[0].Model).Data).Data.Z -= offset; // Move the spawn point under the map - // Set WasKilled to true so they don't respawn after deleting them - ((BoolPropertyViewModel)((DynamicStructDataViewModel)elem.StructData).Fields[2]).Value = false; + ((BoolPropertyViewModel)((DynamicStructDataViewModel)elem.StructData).Fields[1]).Value = false; + // Set NumTimesKilled to at least 1 i guess. Better to increment. + ((IntPropertyViewModel)((DynamicStructDataViewModel)elem.StructData).Fields[2]).Value -= 1; // Set KilledOnDayNumber to a huge number (some far away animals respawn if the number is too small) ((IntPropertyViewModel)((DynamicStructDataViewModel)elem.StructData).Fields[3]).Value = (int)0; } diff --git a/SatisfactorySaveEditor/Model/SaveObjectModel.cs b/SatisfactorySaveEditor/Model/SaveObjectModel.cs index d5652e7..84826e5 100644 --- a/SatisfactorySaveEditor/Model/SaveObjectModel.cs +++ b/SatisfactorySaveEditor/Model/SaveObjectModel.cs @@ -16,6 +16,7 @@ namespace SatisfactorySaveEditor.Model { public class SaveObjectModel : ViewModelBase { + private string levelName; private string title; private string rootObject; private string type; @@ -63,6 +64,12 @@ public List DescendantSelfViewModel } } + public string LevelName + { + get => levelName; + set { Set(() => LevelName, ref levelName, value); } + } + public string Title { get => title; @@ -98,6 +105,7 @@ public bool IsExpanded public SaveObjectModel(SaveObject model) { Model = model; + LevelName = model.LevelName; Title = model.InstanceName; RootObject = model.RootObject; Type = model.TypePath.Split('/').Last(); diff --git a/SatisfactorySaveEditor/View/MainWindow.xaml b/SatisfactorySaveEditor/View/MainWindow.xaml index c3f3240..12955ee 100644 --- a/SatisfactorySaveEditor/View/MainWindow.xaml +++ b/SatisfactorySaveEditor/View/MainWindow.xaml @@ -298,27 +298,30 @@ + -