Exemple #1
0
        public static void CopyPlots(this SFXSaveGameFile target, List <CopyPlot> toCopy)
        {
            foreach (var plot in toCopy)
            {
                switch (plot.Type)
                {
                case SFXPlotType.Boolean:
                {
                    target.Plot.SetBoolVariable(plot.TId, target.Plot.GetBoolVariable(plot.SId));
                    break;
                }

                case SFXPlotType.Integer:
                {
                    target.Plot.SetIntVariable(plot.TId, target.Plot.GetIntVariable(plot.SId));
                    break;
                }

                case SFXPlotType.Float:
                {
                    target.Plot.SetFloatVariable(plot.TId, target.Plot.GetFloatVariable(plot.SId));
                    break;
                }
                }
            }
        }
Exemple #2
0
        public static void ClearAllVariables(
            this SFXSaveGameFile target,
            bool persistMe1Me2Plots)
        {
            throw new NotImplementedException();

            // TODO: figure this out...

            if (persistMe1Me2Plots == false)
            {
                target.Plot.BoolVariables.Length = 0;
                target.Plot.IntVariables.Clear();
                target.Plot.FloatVariables.Clear();
            }
            else
            {
                target.Plot.BoolVariables.Length = Constants.ME1PlotTable_Bool_CutoffIndex + 1;
                for (var i = 0;
                     i < target.Plot.BoolVariables.Length &&
                     i < Constants.ME1PlotTable_IndexOffset;
                     i++)
                {
                    target.Plot.BoolVariables[i] = false;
                }

                target.Plot.IntVariables.RemoveAll(iv => iv.Index <Constants.ME1PlotTable_IndexOffset ||
                                                                   iv.Index> Constants.ME1PlotTable_Int_CutoffIndex);
                target.Plot.FloatVariables.RemoveAll(iv => iv.Index <Constants.ME1PlotTable_IndexOffset ||
                                                                     iv.Index> Constants.ME1PlotTable_Float_CutoffIndex);
            }
        }
Exemple #3
0
        internal static Squad.PlayerClass GetPlayerClassInfo(SFXSaveGameFile saveGame)
        {
            var friendlyName = saveGame.Player.ClassFriendlyName;

            //var playerClass = (PlayerCharacterClass) friendlyName;

            return(LoadoutData.PlayerClasses.Find(p => p.DisplayName == friendlyName));
        }
Exemple #4
0
 public static void SetPlayerPlotData(
     this SFXSaveGameFile target)
 {
     target.Plot.SetBoolVariable(Constants.ME3_Plots_Utility_Player_Info_Female_Player,
                                 target.Player.IsFemale);
     target.Plot.SetIntVariable(Constants.ME3_Plots_Utility_Player_Info_Childhood, (int)target.Player.Origin);
     target.Plot.SetIntVariable(Constants.ME3_Plots_Utility_Player_Info_Reputation,
                                (int)target.Player.Notoriety);
 }
Exemple #5
0
        internal static void ResetPlayerWeaponMods(SFXSaveGameFile saveGame)
        {
            // Assault Rifles
            saveGame.Player.WeaponMods = GetPlayerWeaponMods(WeaponClassType.AssaultRifle).ToList();

            // Pistols
            saveGame.Player.WeaponMods.AddRange(GetPlayerWeaponMods(WeaponClassType.Pistol));

            // Shotguns
            saveGame.Player.WeaponMods.AddRange(GetPlayerWeaponMods(WeaponClassType.Shotgun));

            // SMG's
            saveGame.Player.WeaponMods.AddRange(GetPlayerWeaponMods(WeaponClassType.SMG));

            // Sniper Rifles
            saveGame.Player.WeaponMods.AddRange(GetPlayerWeaponMods(WeaponClassType.SniperRifle));
        }
Exemple #6
0
        public static void MergeMe1PlotRecord(
            this SFXSaveGameFile target,
            ME1PlotTable me1Plots)
        {
            for (var i = 0;
                 i < me1Plots.BoolVariables.Length

                 /*&&
                  * PlotConstants.ME1PlotTable_IndexOffset + i < PlotConstants.ME1PlotTable_Bool_CutoffIndex*/;
                 i++)
            {
                target.Plot.SetBoolVariable(
                    Constants.ME1PlotTable_IndexOffset + i,
                    me1Plots.BoolVariables[i]);
            }

            for (var i = 0;
                 i < me1Plots.IntVariables.Count

                 /*&&
                  * PlotConstants.ME1PlotTable_IndexOffset + i < PlotConstants.ME1PlotTable_Int_CutoffIndex*/;
                 i++)
            {
                target.Plot.SetIntVariable(
                    Constants.ME1PlotTable_IndexOffset + i,
                    me1Plots.IntVariables[i]);
            }

            for (var i = 0;
                 i < me1Plots.FloatVariables.Count

                 /*&&
                  * PlotConstants.ME1PlotTable_IndexOffset + i < PlotConstants.ME1PlotTable_Float_CutoffIndex*/;
                 i++)
            {
                target.Plot.SetFloatVariable(
                    Constants.ME1PlotTable_IndexOffset + i,
                    me1Plots.FloatVariables[i]);
            }
        }
Exemple #7
0
        public static void DoMe2PlotImport(
            this SFXSaveGameFile target,
            SFXSaveGameFile legacyImport)
        {
            if (legacyImport.ME1Plot.BoolVariables.Length > 0 ||
                legacyImport.ME1Plot.IntVariables.Count > 0 ||
                legacyImport.ME1Plot.FloatVariables.Count > 0)
            {
                target.MergeMe1PlotRecord(legacyImport.ME1Plot);
                target.FixMe1PlotsDuringMe2PlotImport();
                target.CopyPlots(Me1ToMe3PlotCopy);
                target.Plot.SetBoolVariable(Constants.ME3_Plots_Bool_Is_ME1_Import, true);
            }
            else
            {
                target.ApplyCanonPlots(Me1CanonPlotVariables);
                target.DoDarkHorseMe1PlotCopyAndPlotLogicFix();
            }

            target.CopyPlots(Me2ToMe3PlotCopy);
            target.Plot.SetBoolVariable(Constants.ME3_Plots_Bool_Is_ME2_Import, true);
        }
Exemple #8
0
 public static void SetNewGamePlotStates(
     this SFXSaveGameFile target,
     SFXSaveGameFile legacyImport,
     SFXSaveGameFile plusImport)
 {
     if (legacyImport != null)
     {
         target.CopyMe2PlotData(legacyImport);
         target.SetPlayerPlotData();
         target.DoMe2PlotImport(legacyImport);
     }
     else if (plusImport != null)
     {
         target.DoMe3NewGamePlusImport(plusImport);
         target.SetPlayerPlotData();
     }
     else
     {
         target.SetPlayerPlotData();
         target.ApplyCanonPlots(Me1CanonPlotVariables);
         target.ApplyCanonPlots(Me2CanonPlotVariables);
     }
 }
Exemple #9
0
        internal static void ResetHenchmenWeaponMods(SFXSaveGameFile saveGame)
        {
            var previous = saveGame.Henchmen;

            saveGame.Henchmen = new List <Henchman>();

            foreach (var henchman in LoadoutData.HenchmenClasses)
            {
                var hench = previous.Find(h => h.Tag == henchman.Tag);

                if (hench != null)
                {
                    ResetHenchmanWeaponMods(saveGame, hench);
                }
                else
                {
                    hench = ResetHenchman(saveGame, henchman);
                    hench.Powers.Clear();
                }

                saveGame.Henchmen.Add(hench);
            }
        }
Exemple #10
0
        public static void FixMe1PlotsDuringMe2PlotImport(this SFXSaveGameFile target)
        {
            var councilIsAlive =
                target.Plot.GetBoolVariable(Constants.ME2__ME1_Plots_for_ME2__CH4_Star_Citadel__Council_Alive);

            target.Plot.SetBoolVariable(
                Constants.ME3__ME1_Plots_for_ME3__CH4_Star_Citadel__Final_Choice__Choice_Is_Made__Save_the_Council,
                councilIsAlive);
            target.Plot.SetBoolVariable(
                Constants.
                ME3__ME1_Plots_for_ME3__CH4_Star_Citadel__Final_Choice__Choice_Is_Made__Destroy_the_Council,
                councilIsAlive == false);

            var andersonIsABro =
                target.Plot.GetBoolVariable(Constants.ME2__ME1_Plots_for_ME2__CH4_Star_Citadel__Anderson_chosen);

            target.Plot.SetBoolVariable(
                Constants.ME3__ME1_Plots_for_ME3__CH4_Star_Citadel__Final_Choice__Chose_ambassador,
                andersonIsABro == false);
            target.Plot.SetBoolVariable(
                Constants.ME3__ME1_Plots_for_ME3__CH4_Star_Citadel__Final_Choice__Chose_Anderson,
                andersonIsABro);
        }
Exemple #11
0
        internal static Henchman ResetHenchman(SFXSaveGameFile saveGame, HenchmanClass henchmanClass, bool resetDefaults = false)
        {
            var hench = new Henchman
            {
                CharacterLevel = saveGame.Player.Level,
                Grenades       = 0,
                LoadoutWeapons = new Loadout
                {
                    AssaultRifle  = "None",
                    HeavyWeapon   = "None",
                    Pistol        = "None",
                    Shotgun       = "None",
                    SubmachineGun = "None",
                    SniperRifle   = "None"
                },
                MappedPower = "None",
                Tag         = henchmanClass.Tag
            };

            ResetHenchmanPowers(saveGame, hench, resetDefaults);
            ResetHenchmanWeaponMods(saveGame, hench);

            return(hench);
        }
Exemple #12
0
        internal static void ResetHenchmanWeaponMods(SFXSaveGameFile saveGame, Henchman henchman)
        {
            var henchProperty = LoadoutData.HenchmenClasses.Single(pair => pair.Tag == henchman.Tag);

            henchman.WeaponMods = new List <WeaponMod>();

            // Assault Rifles
            if (henchProperty.Weapons.Contains(WeaponClassType.AssaultRifle))
            {
                henchman.WeaponMods.AddRange(GetHenchmanWeaponMods(WeaponClassType.AssaultRifle));
            }

            // Pistols
            if (henchProperty.Weapons.Contains(WeaponClassType.Pistol))
            {
                henchman.WeaponMods.AddRange(GetHenchmanWeaponMods(WeaponClassType.Pistol));
            }

            // Shotguns
            if (henchProperty.Weapons.Contains(WeaponClassType.Shotgun))
            {
                henchman.WeaponMods.AddRange(GetHenchmanWeaponMods(WeaponClassType.Shotgun));
            }

            // SMG's
            if (henchProperty.Weapons.Contains(WeaponClassType.SMG))
            {
                henchman.WeaponMods.AddRange(GetHenchmanWeaponMods(WeaponClassType.SMG));
            }

            // Sniper Rifles
            if (henchProperty.Weapons.Contains(WeaponClassType.SniperRifle))
            {
                henchman.WeaponMods.AddRange(GetHenchmanWeaponMods(WeaponClassType.SniperRifle));
            }
        }
Exemple #13
0
 public static void CopyMe2PlotData(
     this SFXSaveGameFile target,
     SFXSaveGameFile legacyImport)
 {
     throw new NotImplementedException();
 }
Exemple #14
0
 public static void DoMe3NewGamePlusImport(
     this SFXSaveGameFile target,
     SFXSaveGameFile plusImport)
 {
     throw new NotImplementedException();
 }
        private void FindSaves(string savePath)
        {
            saveListView.BeginUpdate();

            saveListView.Items.Clear();
            if (FileMode == PickerMode.Save)
            {
                var item = new ListViewItem
                {
                    // ReSharper disable LocalizableElement
                    Name = "New Save",
                    // ReSharper restore LocalizableElement
                    Text = Localization.SavePicker_NewSaveLabel,
                    // ReSharper disable LocalizableElement
                    ImageKey = "New",
                    // ReSharper restore LocalizableElement
                };
                saveListView.Items.Add(item);
            }

            _HighestSaveNumber = 1;
            if (savePath != null)
            {
                if (Directory.Exists(FilePath))
                {
                    foreach (var inputPath in Directory
                             .GetFiles(savePath, "*.pcsav")
                             .OrderByDescending(Directory.GetLastWriteTime))
                    {
                        var baseName = Path.GetFileNameWithoutExtension(inputPath);
                        if (baseName != null &&
                            baseName.StartsWith("Save_") &&
                            baseName.Length == 9)
                        {
                            int saveNumber;
                            if (int.TryParse(baseName.Substring(5).TrimStart('0'), out saveNumber))
                            {
                                _HighestSaveNumber = Math.Max(saveNumber, _HighestSaveNumber);
                            }
                        }

                        SFXSaveGameFile saveFile = null;
                        try
                        {
                            using (var input = File.OpenRead(inputPath))
                            {
                                saveFile = SFXSaveGameFile.Read(input);
                            }
                        }
                        catch (Exception)
                        {
                            saveFile = null;
                        }

                        var item = new ListViewItem
                        {
                            Text     = Path.GetFileName(inputPath),
                            ImageKey = "",
                            Tag      = inputPath,
                        };
                        saveListView.Items.Add(item);
                    }
                }
            }

            saveListView.EndUpdate();

            if (saveListView.Items.Count > 0)
            {
                saveListView.Items[0].Selected = true;
            }
        }
Exemple #16
0
        public static void DoDarkHorseMe1PlotCopyAndPlotLogicFix(
            this SFXSaveGameFile target)
        {
            if (target.Plot.GetBoolVariable(Constants.PS3DarkHorseME1PlayedPlotCheck_Bool))
            {
                if (
                    target.Plot.GetBoolVariable(
                        Constants.ME2__ME1_Plots_for_ME2__Background_and_Relationships__Kaidan_romance_True))
                {
                    target.Plot.SetIntVariable(
                        Constants.ME3__ME1_Plots_for_ME3__Global_Plots__Henchman_Kaidan__Romance_Buddy_dialog_count,
                        4);
                    target.Plot.SetBoolVariable(
                        Constants.ME3__ME1_Plots_for_ME3__Global_Plots__Henchman_Kaidan__Romance_active, true);
                }

                if (
                    target.Plot.GetBoolVariable(
                        Constants.ME2__ME1_Plots_for_ME2__Background_and_Relationships__Ashley_romance_True))
                {
                    target.Plot.SetIntVariable(
                        Constants.ME3__ME1_Plots_for_ME3__Global_Plots__Henchman_Ash__Romance_Buddy_dialog_count, 4);
                    target.Plot.SetBoolVariable(
                        Constants.ME3__ME1_Plots_for_ME3__Global_Plots__Henchman_Ash__romance_active, true);
                }

                if (
                    target.Plot.GetBoolVariable(
                        Constants.ME2__ME1_Plots_for_ME2__Background_and_Relationships__Liara_romance_True))
                {
                    target.Plot.SetIntVariable(
                        Constants.ME3__ME1_Plots_for_ME3__Global_Plots__Henchman_Liara__Romance_Buddy_dialog_count,
                        4);
                    target.Plot.SetBoolVariable(
                        Constants.ME3__ME1_Plots_for_ME3__Global_Plots__Henchman_Liara__Romance_active, true);
                }

                if (target.Plot.GetBoolVariable(Constants.ME2__ME1_Plots_for_ME2__CH2_Virmire__Ash_died) &&
                    target.Plot.GetBoolVariable(Constants.ME2__ME1_Plots_for_ME2__CH2_Virmire__Kaidan_died))
                {
                    var isFemale = target.Plot.GetBoolVariable(Constants.ME3_Plots_Utility_Player_Info_Female_Player);
                    target.Plot.SetBoolVariable(
                        Constants.ME3__ME1_Plots_for_ME3__CH2_Virmire__The_Choice__Rescued_Kaidan, isFemale == false);
                    target.Plot.SetBoolVariable(
                        Constants.ME3__ME1_Plots_for_ME3__CH2_Virmire__The_Choice__Rescued_Ash, isFemale);
                }
                else
                {
                    var ashleyDied =
                        target.Plot.GetBoolVariable(Constants.ME2__ME1_Plots_for_ME2__CH2_Virmire__Ash_died);
                    target.Plot.SetBoolVariable(
                        Constants.ME3__ME1_Plots_for_ME3__CH2_Virmire__The_Choice__Rescued_Kaidan,
                        ashleyDied);
                    target.Plot.SetBoolVariable(
                        Constants.ME3__ME1_Plots_for_ME3__CH2_Virmire__The_Choice__Rescued_Ash, ashleyDied == false);
                }

                var rachniAreAlive =
                    target.Plot.GetBoolVariable(Constants.ME2__ME1_Plots_for_ME2__CH2_Noveria__Rachni_Alive);
                target.Plot.SetBoolVariable(
                    Constants.ME3__ME1_Plots_for_ME3__CH2_Noveria__Rachni_Queen__Queen_Dealt_With__Queen_Released,
                    rachniAreAlive);
                target.Plot.SetBoolVariable(
                    Constants.ME3__ME1_Plots_for_ME3__CH2_Noveria__Rachni_Queen__Queen_Dealt_With__Queen_eliminated,
                    rachniAreAlive == false);

                var wrexDied =
                    target.Plot.GetBoolVariable(Constants.ME2__ME1_Plots_for_ME2__CH2_Virmire_Wrex_Died);
                target.Plot.SetBoolVariable(
                    Constants.
                    ME3__ME1_Plots_for_ME3__CH2_Virmire__Krogan_conundrum__Failure__Failure_KilledBy_Player,
                    wrexDied);
                target.Plot.SetBoolVariable(Constants.ME3__ME1_Plots_for_ME3__Utility__Henchman__InParty__Krogan,
                                            wrexDied == false);

                target.FixMe1PlotsDuringMe2PlotImport();
            }
        }
Exemple #17
0
 public static void ApplyCanonPlots(this SFXSaveGameFile target, List <NewGameCanonPlot> aCanonPlotVariables)
 {
     throw new NotImplementedException();
 }
        private void FindCareers()
        {
            careerListView.BeginUpdate();

            careerListView.Items.Clear();

            if (Directory.Exists(FilePath))
            {
                foreach (var careerPath in Directory
                         .GetDirectories(FilePath)
                         .OrderByDescending(Directory.GetLastWriteTime))
                {
                    var careerFiles = Directory.GetFiles(careerPath, "*.pcsav");
                    if (careerFiles.Length == 0)
                    {
                        continue;
                    }

                    SFXSaveGameFile saveFile = null;
                    foreach (var careerFile in careerFiles)
                    {
                        try
                        {
                            using (var input = File.OpenRead(careerFile))
                            {
                                saveFile = SFXSaveGameFile.Read(input);
                            }

                            break;
                        }
                        catch (Exception)
                        {
                            saveFile = null;
                        }
                    }

                    // attempt to parse the directory name
                    string        name;
                    OriginType    originType;
                    NotorietyType reputationType;
                    string        className;
                    DateTime      date;

                    if (ParseCareerName(
                            Path.GetFileName(careerPath),
                            out name,
                            out originType,
                            out reputationType,
                            out className,
                            out date))
                    {
                        var classType = PlayerClass.Invalid;

                        if (saveFile != null)
                        {
                            classType = GetPlayerClassFromStringId(saveFile.Player.ClassFriendlyName);
                        }

                        if (classType == PlayerClass.Invalid && className != null)
                        {
                            classType = GetPlayerClassFromLocalizedName(className);
                        }

                        var displayName = "";
                        displayName += (saveFile == null ? name : saveFile.Player.FirstName) + "\n";
                        displayName += string.Format("{0}, {1}",
                                                     classType,
                                                     date.ToString("d"));
                        //displayName += date.ToString();

                        careerListView.Items.Add(new ListViewItem
                        {
                            Text = displayName,
                            // ReSharper disable LocalizableElement
                            ImageKey = "Class_" + classType,
                            // ReSharper restore LocalizableElement
                            Tag = careerPath,
                        });
                    }
                    else
                    {
                        careerListView.Items.Add(new ListViewItem
                        {
                            Text = Path.GetFileName(careerPath),
                            // ReSharper disable LocalizableElement
                            ImageKey = "Class_Unknown",
                            // ReSharper restore LocalizableElement
                            Tag = careerPath,
                        });
                    }
                }
            }

            if (FileMode == PickerMode.Save)
            {
                if (careerListView.Items.Count > 0)
                {
                    var item = new ListViewItem
                    {
                        // ReSharper disable LocalizableElement
                        Name = "New Career",
                        // ReSharper restore LocalizableElement
                        Text = Localization.SavePicker_NewCareerLabel,
                        // ReSharper disable LocalizableElement
                        ImageKey = "New",
                        // ReSharper restore LocalizableElement
                    };
                    careerListView.Items.Insert(1, item);
                }
                else
                {
                    var item = new ListViewItem
                    {
                        // ReSharper disable LocalizableElement
                        Name = "New Career",
                        // ReSharper restore LocalizableElement
                        Text = Localization.SavePicker_NewCareerLabel,
                        // ReSharper disable LocalizableElement
                        ImageKey = "New",
                        // ReSharper restore LocalizableElement
                    };
                    careerListView.Items.Add(item);
                }
            }

            careerListView.EndUpdate();

            if (careerListView.Items.Count > 0)
            {
                careerListView.Items[0].Selected = true;
            }
            else
            {
                FindSaves(null);
            }
        }
        public static SFXSaveGameFile Read(Stream input)
        {
            if (input == null)
            {
                throw new ArgumentNullException("input");
            }

            var save = new SFXSaveGameFile()
            {
                _Version = input.ReadValueU32(Endian.Little)
            };

            if (save._Version != 29 && save._Version.Swap() != 29 &&
                save._Version != 59 && save._Version.Swap() != 59)
            {
                throw new FormatException("unexpected version");
            }
            var endian = save._Version == 29 || save._Version == 59
                             ? Endian.Little
                             : Endian.Big;
            if (endian == Endian.Big)
            {
                save._Version = save._Version.Swap();
            }

            var reader = new Unreal.FileReader(input, save._Version, endian);
            save.Serialize(reader);

            if (save._Version >= 27)
            {
                if (input.Position != input.Length - 4)
                {
                    throw new FormatException("bad checksum position");
                }

                save._Checksum = input.ReadValueU32();
            }

            if (input.Position != input.Length)
            {
                throw new FormatException("did not consume entire file");
            }

            save.Endian = endian;
            return save;
        }
Exemple #20
0
        internal static void ResetHenchmanPowers(SFXSaveGameFile saveGame, Henchman henchman, bool resetDefaults = false)
        {
            var henchProperty = LoadoutData.HenchmenClasses.FirstOrDefault(pair => pair.Tag.Equals(henchman.Tag, StringComparison.InvariantCultureIgnoreCase));

            if (henchProperty == null)
            {
                return;
            }

            henchman.Powers         = new List <Power>();
            henchman.CharacterLevel = saveGame.Player.Level;
            henchman.TalentPoints   = SquadVariables.GetHenchTalentPoints(henchman.CharacterLevel);

            foreach (var powerId in henchProperty.Powers)
            {
                PowerClass power = null;
                var        pId   = powerId;

                foreach (var powerClass in LoadoutData.PowerClasses.Where(powerClass => powerClass != null && powerClass.Name != null)
                         .Where(powerClass => powerClass.Name.Equals(pId, StringComparison.InvariantCultureIgnoreCase) ||
                                (powerClass.CustomName != null &&
                                 powerClass.CustomName.Equals(pId, StringComparison.InvariantCultureIgnoreCase))))
                {
                    power = powerClass;
                }

                if (power == null)
                {
                    continue;
                }

                henchman.Powers.Add(new Power(power.ClassName, power.Name));
            }

            if (!resetDefaults)
            {
                return;
            }

            foreach (var power in henchman.Powers)
            {
                var powerClass =
                    LoadoutData.PowerClasses.FirstOrDefault(
                        p => (p.ClassName != null && p.ClassName.Equals(power.ClassName, StringComparison.InvariantCultureIgnoreCase)));

                if (powerClass == null)
                {
                    continue;
                }

                if (!henchProperty.DefaultPowers.Any(s => s.Equals(powerClass.Name, StringComparison.InvariantCultureIgnoreCase) ||
                                                     s.Equals(powerClass.CustomName, StringComparison.InvariantCultureIgnoreCase)))
                {
                    continue;
                }

                power.CurrentRank = 1;

                if (powerClass.PowerType != PowerClassType.None)
                {
                    henchman.TalentPoints--;
                }
            }
        }
Exemple #21
0
        internal static void ResetPlayerPowers(SFXSaveGameFile saveGame, bool resetDefaults = false)
        {
            var playerClass = GetPlayerClassInfo(saveGame);
            var previous    = saveGame.Player.Powers;

            saveGame.Player.Powers       = new List <Power>();
            saveGame.Player.TalentPoints = SquadVariables.GetPlayerTalentPoints(saveGame.Player.Level);

            foreach (var powerId in playerClass.Powers)
            {
                PowerClass power = null;
                var        pId   = powerId;

                foreach (var powerClass in LoadoutData.PowerClasses.Where(powerClass => powerClass != null && powerClass.Name != null)
                         .Where(powerClass => powerClass.Name.Equals(pId, StringComparison.InvariantCultureIgnoreCase) ||
                                (powerClass.CustomName != null &&
                                 powerClass.CustomName.Equals(pId, StringComparison.InvariantCultureIgnoreCase))))
                {
                    power = powerClass;
                }

                if (power == null)
                {
                    continue;
                }

                saveGame.Player.Powers.Add(new Power(power.ClassName, power.Name));
            }

            foreach (var power in previous)
            {
                if (saveGame.Player.Powers.FindIndex(pwr => pwr.Name.Equals(power.Name, StringComparison.InvariantCultureIgnoreCase)) >= 0)
                {
                    continue;
                }

                var firstOrDefault =
                    LoadoutData.PowerClasses.FirstOrDefault(
                        powerClass => (powerClass.Name.Equals(power.Name, StringComparison.InvariantCultureIgnoreCase)) ||
                        (powerClass.CustomName != null && powerClass.CustomName.Equals(power.Name, StringComparison.InvariantCultureIgnoreCase)));

                if (firstOrDefault != null && firstOrDefault.PowerType == PowerClassType.Bonus)
                {
                    saveGame.Player.Powers.Add(new Power(power.ClassName, power.Name));
                }

                //LoadoutData.PowerClasses.First(powerClass => powerClass.Name.Equals(power.Name, StringComparison.InvariantCultureIgnoreCase)).PowerType == PowerClassType.Bonus
                //LoadoutData.PowerClasses.First(powerClass => powerClass.CustomName != null && powerClass.CustomName.Equals(power.Name, StringComparison.InvariantCultureIgnoreCase)).PowerType == PowerClassType.Bonus

                /*if (LoadoutData.PowerClasses.First(powerClass => powerClass.Name.Equals(power.Name, StringComparison.InvariantCultureIgnoreCase)).PowerType == PowerClassType.Bonus)
                 * {
                 *      saveGame.Player.Powers.Add(new Power(power.ClassName, power.Name));
                 * }
                 * else if (LoadoutData.PowerClasses.First(powerClass => powerClass.CustomName != null && powerClass.CustomName.Equals(power.Name, StringComparison.InvariantCultureIgnoreCase)).PowerType == PowerClassType.Bonus)
                 * {
                 *      saveGame.Player.Powers.Add(new Power(power.ClassName, power.Name));
                 * }*/
            }

            if (!resetDefaults)
            {
                return;
            }

            foreach (var power in saveGame.Player.Powers)
            {
                var powerClass =
                    LoadoutData.PowerClasses.FirstOrDefault(
                        p => (p.ClassName != null && p.ClassName.Equals(power.ClassName, StringComparison.InvariantCultureIgnoreCase)));

                if (powerClass == null)
                {
                    continue;
                }

                if (!playerClass.DefaultPowers.Any(s => s.Equals(powerClass.Name, StringComparison.InvariantCultureIgnoreCase) ||
                                                   s.Equals(powerClass.CustomName, StringComparison.InvariantCultureIgnoreCase)) &&
                    powerClass.PowerType != PowerClassType.Bonus)
                {
                    continue;
                }

                power.CurrentRank = 1;

                if (powerClass.PowerType != PowerClassType.None)
                {
                    saveGame.Player.TalentPoints--;
                }
            }
        }
        public static void Write(SFXSaveGameFile save, Stream output)
        {
            if (save == null)
            {
                throw new ArgumentNullException("save");
            }

            if (output == null)
            {
                throw new ArgumentNullException("output");
            }

            using (var memory = new MemoryStream())
            {
                memory.WriteValueU32(save.Version, save._Endian);

                var writer = new Unreal.FileWriter(memory, save._Version, save._Endian);
                save.Serialize(writer);

                if (save._Version >= 27)
                {
                    memory.Position = 0;
                    uint checksum = 0;

                    var buffer = new byte[1024];
                    while (memory.Position < memory.Length)
                    {
                        int read = memory.Read(buffer, 0, 1024);
                        checksum = Crc32.Compute(buffer, 0, read, checksum);
                    }

                    save._Checksum = checksum;
                    memory.WriteValueU32(checksum, save._Endian);
                }

                memory.Position = 0;
                output.WriteFromStream(memory, memory.Length);
            }
        }
Exemple #23
0
        private void FindSaves(string savePath)
        {
            saveListView.BeginUpdate();

            saveListView.Items.Clear();

            if (FileMode == PickerMode.Save)
            {
                var item = new ListViewItem
                {
                    Name     = @"New Save",
                    Text     = Localization.SavePicker_NewSaveLabel,
                    ImageKey = @"New",
                };

                saveListView.Items.Add(item);
            }

            _highestSaveNumber = 1;

            if (savePath != null)
            {
                if (Directory.Exists(FilePath))
                {
                    foreach (var inputPath in Directory
                             .GetFiles(savePath, "*.pcsav")
                             .OrderByDescending(Directory.GetLastWriteTime))
                    {
                        var baseName = Path.GetFileNameWithoutExtension(inputPath);
                        if (baseName != null &&
                            baseName.StartsWith("Save_") &&
                            baseName.Length == 9)
                        {
                            int saveNumber;

                            if (int.TryParse(baseName.Substring(5).TrimStart('0'), out saveNumber))
                            {
                                _highestSaveNumber = Math.Max(saveNumber, _highestSaveNumber);
                            }
                        }

                        try
                        {
                            using (var input = File.OpenRead(inputPath))
                            {
                                SFXSaveGameFile.Read(input);
                            }
                        }
                        catch (Exception ex)
                        {
                            MessageBox.Show(ex.Message, Localization.Error, MessageBoxButtons.OK, MessageBoxIcon.Error);
                        }

                        var item = new ListViewItem
                        {
                            Text     = Path.GetFileName(inputPath),
                            ImageKey = "",
                            Tag      = inputPath,
                        };

                        saveListView.Items.Add(item);
                    }
                }
            }

            saveListView.EndUpdate();

            if (saveListView.Items.Count > 0)
            {
                saveListView.Items[0].Selected = true;
            }
        }