diff --git a/Components/LiveSplit.Skyrim.dll b/Components/LiveSplit.Skyrim.dll index 061b4c9..6ecdad7 100644 Binary files a/Components/LiveSplit.Skyrim.dll and b/Components/LiveSplit.Skyrim.dll differ diff --git a/Components/update.LiveSplit.Skyrim.xml b/Components/update.LiveSplit.Skyrim.xml index 291e877..04a0b9c 100644 --- a/Components/update.LiveSplit.Skyrim.xml +++ b/Components/update.LiveSplit.Skyrim.xml @@ -1,4 +1,17 @@ + + + + + + + Fixed guild autosplits. + + + Fixed timer not starting on first run. + + + diff --git a/GameMemory.cs b/GameMemory.cs index f7cf7d3..8ec886e 100644 --- a/GameMemory.cs +++ b/GameMemory.cs @@ -12,11 +12,12 @@ class GameMemory { public enum SplitArea : int { + None, Helgen, - HailSithisCompleted, - GloryOfTheDeadCompleted, - UnderNewManagenementCompleted, - TheEyeOfMagnusCompleted, + DarkBrotherhoodQuestlineCompleted, + CompanionsQuestlineCompleted, + ThievesGuildQuestlineCompleted, + CollegeQuestlineCompleted, AlduinDefeated } @@ -26,7 +27,7 @@ public enum SplitArea : int public event EventHandler OnLoadFinished; // public event EventHandler OnLoadScreenStarted; // public event EventHandler OnLoadScreenFinished; - public delegate void SplitCompletedEventHandler(object sender, SplitArea type); + public delegate void SplitCompletedEventHandler(object sender, SplitArea type, uint frame); public event SplitCompletedEventHandler OnSplitCompleted; private Task _thread; @@ -36,24 +37,23 @@ public enum SplitArea : int private DeepPointer _isLoadingPtr; private DeepPointer _isLoadingScreenPtr; - private DeepPointer _isInLoadScreenFadeOutPtr; + private DeepPointer _isInFadeOutPtr; private DeepPointer _locationID; private DeepPointer _world_XPtr; private DeepPointer _world_YPtr; private DeepPointer _isAlduinDefeatedPtr; - private DeepPointer _guildsCompleted; - private DeepPointer _isGloryOfTheDeadCompleted; - private DeepPointer _isTheEyeOfMagnusCompleted; + private DeepPointer _questlinesCompleted; + private DeepPointer _companionsQuestsCompletedPtr; + private DeepPointer _collegeQuestsCompletedPtr; + private DeepPointer _darkBrotherhoodQuestsCompletedPtr; + private DeepPointer _thievesGuildQuestsCompletedPtr; + private DeepPointer _isInEscapeMenuPtr; private enum Locations { Tamriel = 0x0000003C, Sovngarde = 0x0002EE41, HelgenKeep01 = 0x0005DE24, - DawnstarSanctuary = 0x000193EE, - ThievesGuildHQ = 0x00016BD0, - YsgramorsTomb = 0x00015254, - HallOfTheElements = 0x0001380E } private enum ExpectedDllSizes @@ -79,8 +79,7 @@ public GameMemory() // Loads _isLoadingPtr = new DeepPointer(0x17337CC); // == 1 if a load is happening (any except loading screens in Helgen for some reason) _isLoadingScreenPtr = new DeepPointer(0xEE3561); // == 1 if in a loading screen - // _isPausedPtr = new DeepPointer(0x172E85F); // == 1 if in a menu or a loading screen - _isInLoadScreenFadeOutPtr = new DeepPointer(0x172EE2E); // == 1 from the fade out of a loading, it goes back to 0 once control is gained + _isInFadeOutPtr = new DeepPointer(0x172EE2E); // == 1 when in a fadeout, it goes back to 0 once control is gained // Position _locationID = new DeepPointer(0x01738308, 0x4, 0x78, 0x670, 0xEC); // ID of the current location (see http://steamcommunity.com/sharedfiles/filedetails/?id=148834641 or http://www.skyrimsearch.com/cells.php) @@ -89,10 +88,12 @@ public GameMemory() // Game state _isAlduinDefeatedPtr = new DeepPointer(0x1711608); // == 1 when last blow is struck on alduin - _guildsCompleted = new DeepPointer(0x00EE6C34, 0x3F0); // == 1 once Hail Sithis quest is completed - _isGloryOfTheDeadCompleted = new DeepPointer(0x00EE6C34, 0x378); - _isTheEyeOfMagnusCompleted = new DeepPointer(0x0172E2DC, 0x13c); - // _playerHasControlPtr = new DeepPointer(0x74814710); // == 1 when player has full control + _questlinesCompleted = new DeepPointer(0x00EE6C34, 0x3F0); // number of questlines completed (from ingame stats) + _companionsQuestsCompletedPtr = new DeepPointer(0x00EE6C34, 0x378); // number of companions quests completed (from ingame stats) + _collegeQuestsCompletedPtr = new DeepPointer(0x00EE6C34, 0x38c); // number of college of winterhold quests completed (from ingame stats) + _darkBrotherhoodQuestsCompletedPtr = new DeepPointer(0x00EE6C34, 0x3b4); // number of dark brotherhood quests completed (from ingame stats) + _thievesGuildQuestsCompletedPtr = new DeepPointer(0x00EE6C34, 0x3a0); // number of thieves' guild quests completed (from ingame stats) + _isInEscapeMenuPtr = new DeepPointer(0x172E85E); // == 1 when in the pause menu or level up menu resetSplitStates(); @@ -152,15 +153,22 @@ void MemoryReadThread() bool prevIsLoading = false; bool prevIsLoadingScreen = false; + bool prevIsInFadeOut = false; bool prevIsAlduinDefeated = false; - int prevGuildsCompleted = 0; - bool prevIsGloryOfTheDeadCompleted = false; - bool prevIsTheEyeOfMagnusCompleted = false; - bool prevIsInLoadScreenFadeOut = false; + int prevQuestlinesCompleted = 0; + int prevCompanionsQuestsCompleted = 0; + int prevCollegeQuestsCompleted = 0; + int prevDarkBrotherhoodQuestsCompleted = 0; + int prevThievesGuildQuestsCompleted = 0; + bool prevIsInEscapeMenu = false; + int prevLocationID = 0; bool loadingStarted = false; bool loadingScreenStarted = false; - bool helgenFadeoutStarted = false; + bool loadScreenFadeoutStarted = false; + + SplitArea lastQuestCompleted = SplitArea.None; + uint lastQuestframeCounter = 0; while (!game.HasExited) { @@ -175,8 +183,8 @@ void MemoryReadThread() isLoading = true; } - bool isInLoadScreenFadeOut; - _isInLoadScreenFadeOutPtr.Deref(game, out isInLoadScreenFadeOut); + bool isInFadeOut; + _isInFadeOutPtr.Deref(game, out isInFadeOut); int locationID; _locationID.Deref(game, out locationID); @@ -190,14 +198,23 @@ void MemoryReadThread() bool isAlduinDefeated; _isAlduinDefeatedPtr.Deref(game, out isAlduinDefeated); - int guildsCompleted; - _guildsCompleted.Deref(game, out guildsCompleted); + int questlinesCompleted; + _questlinesCompleted.Deref(game, out questlinesCompleted); + + int companionsQuestsCompleted; + _companionsQuestsCompletedPtr.Deref(game, out companionsQuestsCompleted); + + int collegeQuestsCompleted; + _collegeQuestsCompletedPtr.Deref(game, out collegeQuestsCompleted); + + int darkBrotherhoodQuestsCompleted; + _darkBrotherhoodQuestsCompletedPtr.Deref(game, out darkBrotherhoodQuestsCompleted); - bool isGloryOfTheDeadCompleted; - _isGloryOfTheDeadCompleted.Deref(game, out isGloryOfTheDeadCompleted); + int thievesGuildQuestsCompleted; + _thievesGuildQuestsCompletedPtr.Deref(game, out thievesGuildQuestsCompleted); - bool isTheEyeOfMagnusCompleted; - _isTheEyeOfMagnusCompleted.Deref(game, out isTheEyeOfMagnusCompleted); + bool isInEscapeMenu; + _isInEscapeMenuPtr.Deref(game, out isInEscapeMenu); if (isLoading != prevIsLoading) { @@ -208,7 +225,8 @@ void MemoryReadThread() loadingStarted = true; // pause game timer - _uiThread.Post(d => { + _uiThread.Post(d => + { if (this.OnLoadStarted != null) { this.OnLoadStarted(this, EventArgs.Empty); @@ -224,7 +242,8 @@ void MemoryReadThread() loadingStarted = false; // unpause game timer - _uiThread.Post(d => { + _uiThread.Post(d => + { if (this.OnLoadFinished != null) { this.OnLoadFinished(this, EventArgs.Empty); @@ -242,6 +261,11 @@ void MemoryReadThread() loadingScreenStarted = true; + if (isInFadeOut) + { + loadScreenFadeoutStarted = true; + } + // nothing currently // _uiThread.Post(d => // { @@ -251,18 +275,21 @@ void MemoryReadThread() // } // }, null); - // if loadscreen starts while leaving helgen - if (locationID == (int)Locations.HelgenKeep01 && world_X == -2 && world_Y == -5) + // if it isn't a loadscreen from loading a save + if (!isInEscapeMenu) { - // Helgen split - Trace.WriteLine(String.Format("[NoLoads] Helgen Split - {0}", frameCounter)); - _uiThread.Post(d => + // if loadscreen starts while leaving helgen + if (locationID == (int)Locations.HelgenKeep01 && world_X == -2 && world_Y == -5) { - if (this.OnSplitCompleted != null) + // Helgen split + _uiThread.Post(d => { - this.OnSplitCompleted(this, SplitArea.Helgen); - } - }, null); + if (this.OnSplitCompleted != null) + { + this.OnSplitCompleted(this, SplitArea.Helgen, frameCounter); + } + }, null); + } } } else @@ -285,22 +312,22 @@ void MemoryReadThread() } } - if (isInLoadScreenFadeOut != prevIsInLoadScreenFadeOut) + if (isInFadeOut != prevIsInFadeOut) { - if(isInLoadScreenFadeOut) + if (isInFadeOut) { - Trace.WriteLine(String.Format("[NoLoads] Fadeout started - {0}", frameCounter)); + Debug.WriteLine(String.Format("[NoLoads] Fadeout started - {0}", frameCounter)); if (isLoadingScreen) { - helgenFadeoutStarted = true; + loadScreenFadeoutStarted = true; } } else { - Trace.WriteLine(String.Format("[NoLoads] Fadeout ended - {0}", frameCounter)); + Debug.WriteLine(String.Format("[NoLoads] Fadeout ended - {0}", frameCounter)); // if loadscreen fadeout finishes in helgen - if (prevIsInLoadScreenFadeOut && helgenFadeoutStarted - && locationID == (int)Locations.Tamriel && world_X == 3 && world_Y == -20) + if (prevIsInFadeOut && loadScreenFadeoutStarted + && locationID == (int)Locations.Tamriel && world_X == 3 && world_Y == -20) { // reset Trace.WriteLine(String.Format("[NoLoads] Reset - {0}", frameCounter)); @@ -322,7 +349,7 @@ void MemoryReadThread() } }, null); } - helgenFadeoutStarted = false; + loadScreenFadeoutStarted = false; } } @@ -330,76 +357,73 @@ void MemoryReadThread() if (isAlduinDefeated != prevIsAlduinDefeated && isAlduinDefeated && locationID == (int)Locations.Sovngarde) { // AlduinDefeated split - Trace.WriteLine(String.Format("[NoLoads] AlduinDefeated Split - {0}", frameCounter)); _uiThread.Post(d => { if (this.OnSplitCompleted != null) { - this.OnSplitCompleted(this, SplitArea.AlduinDefeated); + this.OnSplitCompleted(this, SplitArea.AlduinDefeated, frameCounter); } }, null); } - // if a guild is completed - if (guildsCompleted == prevGuildsCompleted + 1) + // reset lastQuest 100 frames (1.5 seconds) after a completion to avoid splitting on a wrong questline. + if (frameCounter >= lastQuestframeCounter + 100 && lastQuestCompleted != SplitArea.None) { - // while in Dawnstar's Sanctuary - if (locationID == (int)Locations.DawnstarSanctuary) - { - Trace.WriteLine(String.Format("[NoLoads] HailSithisCompleted Split - {0}", frameCounter)); - _uiThread.Post(d => - { - if (this.OnSplitCompleted != null) - { - this.OnSplitCompleted(this, SplitArea.HailSithisCompleted); - } - }, null); - } - // while in the Thieves Guild Headquarters - else if (locationID == (int)Locations.ThievesGuildHQ) - { - Trace.WriteLine(String.Format("[NoLoads] UnderNewManagenementCompleted Split - {0}", frameCounter)); - _uiThread.Post(d => - { - if (this.OnSplitCompleted != null) - { - this.OnSplitCompleted(this, SplitArea.UnderNewManagenementCompleted); - } - }, null); - } - // while in Ysgramor's Tomb - else if (locationID == (int)Locations.YsgramorsTomb) - { - Trace.WriteLine(String.Format("[NoLoads] GloryOfTheDeadCompleted Split - {0}", frameCounter)); - _uiThread.Post(d => - { - if (this.OnSplitCompleted != null) - { - this.OnSplitCompleted(this, SplitArea.GloryOfTheDeadCompleted); - } - }, null); - } - // while in the Hall of the Elements - else if (locationID == (int)Locations.HallOfTheElements) + lastQuestCompleted = SplitArea.None; + } + + if (darkBrotherhoodQuestsCompleted > prevDarkBrotherhoodQuestsCompleted) + { + Debug.WriteLine(String.Format("[NoLoads] A Dark Brotherhood quest has been completed - {0}", frameCounter)); + lastQuestCompleted = SplitArea.DarkBrotherhoodQuestlineCompleted; + lastQuestframeCounter = frameCounter; + } + else if (thievesGuildQuestsCompleted > prevThievesGuildQuestsCompleted) + { + Debug.WriteLine(String.Format("[NoLoads] A Thieves' Guild quest has been completed - {0}", frameCounter)); + lastQuestCompleted = SplitArea.ThievesGuildQuestlineCompleted; + lastQuestframeCounter = frameCounter; + } + else if (companionsQuestsCompleted > prevCompanionsQuestsCompleted) + { + Debug.WriteLine(String.Format("[NoLoads] A Companions quest has been completed - {0}", frameCounter)); + lastQuestCompleted = SplitArea.CompanionsQuestlineCompleted; + lastQuestframeCounter = frameCounter; + } + else if (collegeQuestsCompleted > prevCollegeQuestsCompleted) + { + Debug.WriteLine(String.Format("[NoLoads] A College of Winterhold quest has been completed - {0}", frameCounter)); + lastQuestCompleted = SplitArea.CollegeQuestlineCompleted; + lastQuestframeCounter = frameCounter; + } + + // if a questline is completed + if (questlinesCompleted > prevQuestlinesCompleted) + { + Debug.WriteLineIf(lastQuestCompleted == SplitArea.None, String.Format("[NoLoads] A questline has been completed. - {0}", frameCounter)); + _uiThread.Post(d => { - Trace.WriteLine(String.Format("[NoLoads] TheEyeOfMagnusCompleted Split - {0}", frameCounter)); - _uiThread.Post(d => + if (this.OnSplitCompleted != null) { - if (this.OnSplitCompleted != null) - { - this.OnSplitCompleted(this, SplitArea.TheEyeOfMagnusCompleted); - } - }, null); - } + this.OnSplitCompleted(this, lastQuestCompleted, frameCounter); + } + }, null); } + Debug.WriteLineIf(locationID != prevLocationID, String.Format("[NoLoads] LocationID changed from {0} to {1} - {2}", prevLocationID.ToString("X8"), locationID.ToString("X8"), frameCounter)); + Debug.WriteLineIf(isInEscapeMenu != prevIsInEscapeMenu, String.Format("[NoLoads] isInEscapeMenu changed to {0} - {1}", isInEscapeMenu, frameCounter)); + prevIsLoading = isLoading; prevIsLoadingScreen = isLoadingScreen; + prevIsInFadeOut = isInFadeOut; prevIsAlduinDefeated = isAlduinDefeated; - prevGuildsCompleted = guildsCompleted; - prevIsGloryOfTheDeadCompleted = isGloryOfTheDeadCompleted; - prevIsTheEyeOfMagnusCompleted = isTheEyeOfMagnusCompleted; - prevIsInLoadScreenFadeOut = isInLoadScreenFadeOut; + prevQuestlinesCompleted = questlinesCompleted; + prevCompanionsQuestsCompleted = companionsQuestsCompleted; + prevCollegeQuestsCompleted = collegeQuestsCompleted; + prevDarkBrotherhoodQuestsCompleted = darkBrotherhoodQuestsCompleted; + prevThievesGuildQuestsCompleted = thievesGuildQuestsCompleted; + prevIsInEscapeMenu = isInEscapeMenu; + prevLocationID = locationID; frameCounter++; Thread.Sleep(15); diff --git a/Properties/AssemblyInfo.cs b/Properties/AssemblyInfo.cs index 823ed3d..92103b5 100644 --- a/Properties/AssemblyInfo.cs +++ b/Properties/AssemblyInfo.cs @@ -33,7 +33,7 @@ // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.4.1.0")] -[assembly: AssemblyFileVersion("1.4.1.0")] +[assembly: AssemblyVersion("1.4.2.0")] +[assembly: AssemblyFileVersion("1.4.2.0")] [assembly: ComponentFactory(typeof(SkyrimFactory))] diff --git a/README.md b/README.md index f1d5577..57cba6f 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ -LiveSplit.Skyrim v1.4 -===================== +LiveSplit.Skyrim v1.4.2 +======================= LiveSplit.Skyrim is a [LiveSplit](http://livesplit.org/) component for The Elder Scrolls V: Skyrim. diff --git a/SkyrimComponent.cs b/SkyrimComponent.cs index 2f09d1f..54360ab 100644 --- a/SkyrimComponent.cs +++ b/SkyrimComponent.cs @@ -7,6 +7,7 @@ using System.Drawing; using System.Xml; using System.Windows.Forms; +using System.Diagnostics; namespace LiveSplit.Skyrim { @@ -147,14 +148,15 @@ void gameMemory_OnLoadFinished(object sender, EventArgs e) // // Nothing to do // } - void gameMemory_OnSplitCompleted(object sender, GameMemory.SplitArea split) + void gameMemory_OnSplitCompleted(object sender, GameMemory.SplitArea split, uint frame) { + Trace.WriteLineIf(split != GameMemory.SplitArea.None, String.Format("[NoLoads] {0} Split - {1}", split, frame)); if (!_gameMemory.splitStates[(int)split] && ((split == GameMemory.SplitArea.Helgen && this.Settings.Helgen) || - (split == GameMemory.SplitArea.HailSithisCompleted && this.Settings.HailSithis) || - (split == GameMemory.SplitArea.GloryOfTheDeadCompleted && this.Settings.GloryOfTheDead) || - (split == GameMemory.SplitArea.TheEyeOfMagnusCompleted && this.Settings.TheEyeofMagnus) || - (split == GameMemory.SplitArea.UnderNewManagenementCompleted && this.Settings.UnderNewManagement) || + (split == GameMemory.SplitArea.DarkBrotherhoodQuestlineCompleted && this.Settings.DarkBrotherhood) || + (split == GameMemory.SplitArea.CompanionsQuestlineCompleted && this.Settings.Companions) || + (split == GameMemory.SplitArea.CollegeQuestlineCompleted && this.Settings.CollegeOfWinterhold) || + (split == GameMemory.SplitArea.ThievesGuildQuestlineCompleted && this.Settings.ThievesGuild) || (split == GameMemory.SplitArea.AlduinDefeated && this.Settings.AlduinDefeated))) { _timer.Split(); diff --git a/SkyrimSettings.Designer.cs b/SkyrimSettings.Designer.cs index 0603ed5..cce91a7 100644 --- a/SkyrimSettings.Designer.cs +++ b/SkyrimSettings.Designer.cs @@ -29,9 +29,6 @@ protected override void Dispose(bool disposing) private void InitializeComponent() { this.tlpMain = new System.Windows.Forms.TableLayoutPanel(); - this.gbLoadRemoval = new System.Windows.Forms.GroupBox(); - this.tlpLoadRemoval = new System.Windows.Forms.TableLayoutPanel(); - this.chkDisplayWithoutLoads = new System.Windows.Forms.CheckBox(); this.gbStartSplits = new System.Windows.Forms.GroupBox(); this.tlpStartSplits = new System.Windows.Forms.TableLayoutPanel(); this.chkHelgen = new System.Windows.Forms.CheckBox(); @@ -39,27 +36,29 @@ private void InitializeComponent() this.gbEndSplits = new System.Windows.Forms.GroupBox(); this.tlpEndSplits = new System.Windows.Forms.TableLayoutPanel(); this.chkAlduinDefeated = new System.Windows.Forms.CheckBox(); - this.chkTheEyeofMagnus = new System.Windows.Forms.CheckBox(); - this.chkGloryOfTheDead = new System.Windows.Forms.CheckBox(); - this.chkUnderNewManagement = new System.Windows.Forms.CheckBox(); - this.chkHailSithis = new System.Windows.Forms.CheckBox(); + this.chkCollege = new System.Windows.Forms.CheckBox(); + this.chkCompanions = new System.Windows.Forms.CheckBox(); + this.chkThievesGuild = new System.Windows.Forms.CheckBox(); + this.chkDarkBrotherhood = new System.Windows.Forms.CheckBox(); + this.gbDisplayAlternateTiming = new System.Windows.Forms.GroupBox(); + this.tlpDisplayAlternateTiming = new System.Windows.Forms.TableLayoutPanel(); + this.chkDisplayWithoutLoads = new System.Windows.Forms.CheckBox(); this.tlpMain.SuspendLayout(); - this.gbLoadRemoval.SuspendLayout(); - this.tlpLoadRemoval.SuspendLayout(); this.gbStartSplits.SuspendLayout(); this.tlpStartSplits.SuspendLayout(); this.gbEndSplits.SuspendLayout(); this.tlpEndSplits.SuspendLayout(); + this.gbDisplayAlternateTiming.SuspendLayout(); + this.tlpDisplayAlternateTiming.SuspendLayout(); this.SuspendLayout(); - // + // // tlpMain - // - this.tlpMain.AutoSize = true; + // this.tlpMain.ColumnCount = 1; this.tlpMain.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F)); - this.tlpMain.Controls.Add(this.gbLoadRemoval, 0, 2); this.tlpMain.Controls.Add(this.gbStartSplits, 0, 0); this.tlpMain.Controls.Add(this.gbEndSplits, 0, 1); + this.tlpMain.Controls.Add(this.gbDisplayAlternateTiming, 0, 2); this.tlpMain.Dock = System.Windows.Forms.DockStyle.Top; this.tlpMain.Location = new System.Drawing.Point(0, 0); this.tlpMain.Name = "tlpMain"; @@ -67,49 +66,12 @@ private void InitializeComponent() this.tlpMain.RowStyles.Add(new System.Windows.Forms.RowStyle()); this.tlpMain.RowStyles.Add(new System.Windows.Forms.RowStyle()); this.tlpMain.RowStyles.Add(new System.Windows.Forms.RowStyle()); - this.tlpMain.Size = new System.Drawing.Size(476, 259); + this.tlpMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F)); + this.tlpMain.Size = new System.Drawing.Size(476, 365); this.tlpMain.TabIndex = 0; - // - // gbLoadRemoval - // - this.gbLoadRemoval.AutoSize = true; - this.gbLoadRemoval.Controls.Add(this.tlpLoadRemoval); - this.gbLoadRemoval.Dock = System.Windows.Forms.DockStyle.Top; - this.gbLoadRemoval.Location = new System.Drawing.Point(3, 214); - this.gbLoadRemoval.Name = "gbLoadRemoval"; - this.gbLoadRemoval.Size = new System.Drawing.Size(470, 42); - this.gbLoadRemoval.TabIndex = 8; - this.gbLoadRemoval.TabStop = false; - this.gbLoadRemoval.Text = "Show Alternate Timing Time"; - // - // tlpLoadRemoval - // - this.tlpLoadRemoval.AutoSize = true; - this.tlpLoadRemoval.ColumnCount = 1; - this.tlpLoadRemoval.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F)); - this.tlpLoadRemoval.Controls.Add(this.chkDisplayWithoutLoads, 0, 0); - this.tlpLoadRemoval.Dock = System.Windows.Forms.DockStyle.Fill; - this.tlpLoadRemoval.Location = new System.Drawing.Point(3, 16); - this.tlpLoadRemoval.Name = "tlpLoadRemoval"; - this.tlpLoadRemoval.RowCount = 1; - this.tlpLoadRemoval.RowStyles.Add(new System.Windows.Forms.RowStyle()); - this.tlpLoadRemoval.Size = new System.Drawing.Size(464, 23); - this.tlpLoadRemoval.TabIndex = 0; - // - // chkDisplayWithoutLoads - // - this.chkDisplayWithoutLoads.AutoSize = true; - this.chkDisplayWithoutLoads.Checked = true; - this.chkDisplayWithoutLoads.CheckState = System.Windows.Forms.CheckState.Checked; - this.chkDisplayWithoutLoads.Location = new System.Drawing.Point(3, 3); - this.chkDisplayWithoutLoads.Name = "chkDisplayWithoutLoads"; - this.chkDisplayWithoutLoads.Size = new System.Drawing.Size(59, 17); - this.chkDisplayWithoutLoads.TabIndex = 0; - this.chkDisplayWithoutLoads.Text = "Enable"; - this.chkDisplayWithoutLoads.UseVisualStyleBackColor = true; - // + // // gbStartSplits - // + // this.gbStartSplits.AutoSize = true; this.gbStartSplits.Controls.Add(this.tlpStartSplits); this.gbStartSplits.Dock = System.Windows.Forms.DockStyle.Top; @@ -119,9 +81,9 @@ private void InitializeComponent() this.gbStartSplits.TabIndex = 5; this.gbStartSplits.TabStop = false; this.gbStartSplits.Text = "Start Auto-splits"; - // + // // tlpStartSplits - // + // this.tlpStartSplits.AutoSize = true; this.tlpStartSplits.BackColor = System.Drawing.Color.Transparent; this.tlpStartSplits.ColumnCount = 1; @@ -136,9 +98,9 @@ private void InitializeComponent() this.tlpStartSplits.RowStyles.Add(new System.Windows.Forms.RowStyle()); this.tlpStartSplits.Size = new System.Drawing.Size(464, 46); this.tlpStartSplits.TabIndex = 4; - // + // // chkHelgen - // + // this.chkHelgen.AutoSize = true; this.chkHelgen.Location = new System.Drawing.Point(3, 26); this.chkHelgen.Name = "chkHelgen"; @@ -146,9 +108,9 @@ private void InitializeComponent() this.chkHelgen.TabIndex = 7; this.chkHelgen.Text = "Helgen"; this.chkHelgen.UseVisualStyleBackColor = true; - // + // // chkAutoStart - // + // this.chkAutoStart.AutoSize = true; this.chkAutoStart.Checked = true; this.chkAutoStart.CheckState = System.Windows.Forms.CheckState.Checked; @@ -158,9 +120,9 @@ private void InitializeComponent() this.chkAutoStart.TabIndex = 4; this.chkAutoStart.Text = "Start / Reset"; this.chkAutoStart.UseVisualStyleBackColor = true; - // + // // gbEndSplits - // + // this.gbEndSplits.AutoSize = true; this.gbEndSplits.Controls.Add(this.tlpEndSplits); this.gbEndSplits.Dock = System.Windows.Forms.DockStyle.Top; @@ -170,18 +132,18 @@ private void InitializeComponent() this.gbEndSplits.TabIndex = 7; this.gbEndSplits.TabStop = false; this.gbEndSplits.Text = "End Auto-splits"; - // + // // tlpEndSplits - // + // this.tlpEndSplits.AutoSize = true; this.tlpEndSplits.BackColor = System.Drawing.Color.Transparent; this.tlpEndSplits.ColumnCount = 1; this.tlpEndSplits.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F)); this.tlpEndSplits.Controls.Add(this.chkAlduinDefeated, 0, 0); - this.tlpEndSplits.Controls.Add(this.chkTheEyeofMagnus, 0, 1); - this.tlpEndSplits.Controls.Add(this.chkGloryOfTheDead, 0, 2); - this.tlpEndSplits.Controls.Add(this.chkUnderNewManagement, 0, 4); - this.tlpEndSplits.Controls.Add(this.chkHailSithis, 0, 3); + this.tlpEndSplits.Controls.Add(this.chkCollege, 0, 1); + this.tlpEndSplits.Controls.Add(this.chkCompanions, 0, 2); + this.tlpEndSplits.Controls.Add(this.chkThievesGuild, 0, 4); + this.tlpEndSplits.Controls.Add(this.chkDarkBrotherhood, 0, 3); this.tlpEndSplits.Dock = System.Windows.Forms.DockStyle.Fill; this.tlpEndSplits.Location = new System.Drawing.Point(3, 16); this.tlpEndSplits.Name = "tlpEndSplits"; @@ -193,9 +155,9 @@ private void InitializeComponent() this.tlpEndSplits.RowStyles.Add(new System.Windows.Forms.RowStyle()); this.tlpEndSplits.Size = new System.Drawing.Size(464, 115); this.tlpEndSplits.TabIndex = 4; - // + // // chkAlduinDefeated - // + // this.chkAlduinDefeated.AutoSize = true; this.chkAlduinDefeated.Checked = true; this.chkAlduinDefeated.CheckState = System.Windows.Forms.CheckState.Checked; @@ -205,49 +167,88 @@ private void InitializeComponent() this.chkAlduinDefeated.TabIndex = 5; this.chkAlduinDefeated.Text = "Alduin\'s Defeat (Main Quest)"; this.chkAlduinDefeated.UseVisualStyleBackColor = true; - // - // chkTheEyeofMagnus - // - this.chkTheEyeofMagnus.AutoSize = true; - this.chkTheEyeofMagnus.Location = new System.Drawing.Point(3, 26); - this.chkTheEyeofMagnus.Name = "chkTheEyeofMagnus"; - this.chkTheEyeofMagnus.Size = new System.Drawing.Size(404, 17); - this.chkTheEyeofMagnus.TabIndex = 10; - this.chkTheEyeofMagnus.Text = "[EXPERIMENTAL] The Eye of Magnus quest completion (College of Winterhold)"; - this.chkTheEyeofMagnus.UseVisualStyleBackColor = true; - // - // chkGloryOfTheDead - // - this.chkGloryOfTheDead.AutoSize = true; - this.chkGloryOfTheDead.Location = new System.Drawing.Point(3, 49); - this.chkGloryOfTheDead.Name = "chkGloryOfTheDead"; - this.chkGloryOfTheDead.Size = new System.Drawing.Size(355, 17); - this.chkGloryOfTheDead.TabIndex = 8; - this.chkGloryOfTheDead.Text = "[EXPERIMENTAL] Glory of The Dead quest completion (Companions)"; - this.chkGloryOfTheDead.UseVisualStyleBackColor = true; - // - // chkUnderNewManagement - // - this.chkUnderNewManagement.AutoSize = true; - this.chkUnderNewManagement.Location = new System.Drawing.Point(3, 95); - this.chkUnderNewManagement.Name = "chkUnderNewManagement"; - this.chkUnderNewManagement.Size = new System.Drawing.Size(394, 17); - this.chkUnderNewManagement.TabIndex = 9; - this.chkUnderNewManagement.Text = "[EXPERIMENTAL] Under New Management quest completion (Thieves Guild)"; - this.chkUnderNewManagement.UseVisualStyleBackColor = true; - // - // chkHailSithis - // - this.chkHailSithis.AutoSize = true; - this.chkHailSithis.Location = new System.Drawing.Point(3, 72); - this.chkHailSithis.Name = "chkHailSithis"; - this.chkHailSithis.Size = new System.Drawing.Size(340, 17); - this.chkHailSithis.TabIndex = 7; - this.chkHailSithis.Text = "[EXPERIMENTAL] Hail Sithis quest completion (Dark Brotherhood)"; - this.chkHailSithis.UseVisualStyleBackColor = true; - // + // + // chkCollege + // + this.chkCollege.AutoSize = true; + this.chkCollege.Location = new System.Drawing.Point(3, 26); + this.chkCollege.Name = "chkCollege"; + this.chkCollege.Size = new System.Drawing.Size(318, 17); + this.chkCollege.TabIndex = 10; + this.chkCollege.Text = "[EXPERIMENTAL] College of Winterhold questline completion"; + this.chkCollege.UseVisualStyleBackColor = true; + // + // chkCompanions + // + this.chkCompanions.AutoSize = true; + this.chkCompanions.Location = new System.Drawing.Point(3, 49); + this.chkCompanions.Name = "chkCompanions"; + this.chkCompanions.Size = new System.Drawing.Size(275, 17); + this.chkCompanions.TabIndex = 8; + this.chkCompanions.Text = "[EXPERIMENTAL] Companions questline completion"; + this.chkCompanions.UseVisualStyleBackColor = true; + // + // chkThievesGuild + // + this.chkThievesGuild.AutoSize = true; + this.chkThievesGuild.Location = new System.Drawing.Point(3, 95); + this.chkThievesGuild.Name = "chkThievesGuild"; + this.chkThievesGuild.Size = new System.Drawing.Size(284, 17); + this.chkThievesGuild.TabIndex = 9; + this.chkThievesGuild.Text = "[EXPERIMENTAL] Thieves\' Guild questline completion"; + this.chkThievesGuild.UseVisualStyleBackColor = true; + // + // chkDarkBrotherhood + // + this.chkDarkBrotherhood.AutoSize = true; + this.chkDarkBrotherhood.Location = new System.Drawing.Point(3, 72); + this.chkDarkBrotherhood.Name = "chkDarkBrotherhood"; + this.chkDarkBrotherhood.Size = new System.Drawing.Size(301, 17); + this.chkDarkBrotherhood.TabIndex = 7; + this.chkDarkBrotherhood.Text = "[EXPERIMENTAL] Dark Brotherhood questline completion"; + this.chkDarkBrotherhood.UseVisualStyleBackColor = true; + // + // gbDisplayAlternateTiming + // + this.gbDisplayAlternateTiming.AutoSize = true; + this.gbDisplayAlternateTiming.Controls.Add(this.tlpDisplayAlternateTiming); + this.gbDisplayAlternateTiming.Dock = System.Windows.Forms.DockStyle.Top; + this.gbDisplayAlternateTiming.Location = new System.Drawing.Point(3, 214); + this.gbDisplayAlternateTiming.Name = "gbDisplayAlternateTiming"; + this.gbDisplayAlternateTiming.Size = new System.Drawing.Size(470, 42); + this.gbDisplayAlternateTiming.TabIndex = 9; + this.gbDisplayAlternateTiming.TabStop = false; + this.gbDisplayAlternateTiming.Text = "Show Alternate Timing Method"; + // + // tlpDisplayAlternateTiming + // + this.tlpDisplayAlternateTiming.AutoSize = true; + this.tlpDisplayAlternateTiming.ColumnCount = 1; + this.tlpDisplayAlternateTiming.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); + this.tlpDisplayAlternateTiming.Controls.Add(this.chkDisplayWithoutLoads, 0, 0); + this.tlpDisplayAlternateTiming.Dock = System.Windows.Forms.DockStyle.Fill; + this.tlpDisplayAlternateTiming.Location = new System.Drawing.Point(3, 16); + this.tlpDisplayAlternateTiming.Name = "tlpDisplayAlternateTiming"; + this.tlpDisplayAlternateTiming.RowCount = 1; + this.tlpDisplayAlternateTiming.RowStyles.Add(new System.Windows.Forms.RowStyle()); + this.tlpDisplayAlternateTiming.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F)); + this.tlpDisplayAlternateTiming.Size = new System.Drawing.Size(464, 23); + this.tlpDisplayAlternateTiming.TabIndex = 0; + // + // chkDisplayWithoutLoads + // + this.chkDisplayWithoutLoads.AutoSize = true; + this.chkDisplayWithoutLoads.Checked = true; + this.chkDisplayWithoutLoads.CheckState = System.Windows.Forms.CheckState.Checked; + this.chkDisplayWithoutLoads.Location = new System.Drawing.Point(3, 3); + this.chkDisplayWithoutLoads.Name = "chkDisplayWithoutLoads"; + this.chkDisplayWithoutLoads.Size = new System.Drawing.Size(59, 17); + this.chkDisplayWithoutLoads.TabIndex = 0; + this.chkDisplayWithoutLoads.Text = "Enable"; + this.chkDisplayWithoutLoads.UseVisualStyleBackColor = true; + // // SkyrimSettings - // + // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.Controls.Add(this.tlpMain); @@ -255,10 +256,6 @@ private void InitializeComponent() this.Size = new System.Drawing.Size(476, 443); this.tlpMain.ResumeLayout(false); this.tlpMain.PerformLayout(); - this.gbLoadRemoval.ResumeLayout(false); - this.gbLoadRemoval.PerformLayout(); - this.tlpLoadRemoval.ResumeLayout(false); - this.tlpLoadRemoval.PerformLayout(); this.gbStartSplits.ResumeLayout(false); this.gbStartSplits.PerformLayout(); this.tlpStartSplits.ResumeLayout(false); @@ -267,8 +264,11 @@ private void InitializeComponent() this.gbEndSplits.PerformLayout(); this.tlpEndSplits.ResumeLayout(false); this.tlpEndSplits.PerformLayout(); + this.gbDisplayAlternateTiming.ResumeLayout(false); + this.gbDisplayAlternateTiming.PerformLayout(); + this.tlpDisplayAlternateTiming.ResumeLayout(false); + this.tlpDisplayAlternateTiming.PerformLayout(); this.ResumeLayout(false); - this.PerformLayout(); } @@ -282,12 +282,12 @@ private void InitializeComponent() private System.Windows.Forms.TableLayoutPanel tlpStartSplits; private System.Windows.Forms.CheckBox chkHelgen; private System.Windows.Forms.CheckBox chkAutoStart; - private System.Windows.Forms.CheckBox chkHailSithis; - private System.Windows.Forms.CheckBox chkGloryOfTheDead; - private System.Windows.Forms.GroupBox gbLoadRemoval; - private System.Windows.Forms.TableLayoutPanel tlpLoadRemoval; + private System.Windows.Forms.CheckBox chkDarkBrotherhood; + private System.Windows.Forms.CheckBox chkCompanions; private System.Windows.Forms.CheckBox chkDisplayWithoutLoads; - private System.Windows.Forms.CheckBox chkUnderNewManagement; - private System.Windows.Forms.CheckBox chkTheEyeofMagnus; + private System.Windows.Forms.CheckBox chkThievesGuild; + private System.Windows.Forms.CheckBox chkCollege; + private System.Windows.Forms.GroupBox gbDisplayAlternateTiming; + private System.Windows.Forms.TableLayoutPanel tlpDisplayAlternateTiming; } } diff --git a/SkyrimSettings.cs b/SkyrimSettings.cs index 807aef9..ea79068 100644 --- a/SkyrimSettings.cs +++ b/SkyrimSettings.cs @@ -11,19 +11,19 @@ public partial class SkyrimSettings : UserControl public bool AutoStart { get; set; } public bool AlduinDefeated { get; set; } public bool Helgen { get; set; } - public bool HailSithis { get; set; } - public bool GloryOfTheDead { get; set; } - public bool UnderNewManagement { get; set; } - public bool TheEyeofMagnus { get; set; } + public bool DarkBrotherhood { get; set; } + public bool Companions { get; set; } + public bool ThievesGuild { get; set; } + public bool CollegeOfWinterhold { get; set; } private const bool DEFAULT_DRAWWITHOUTLOADS = true; private const bool DEFAULT_AUTOSTART = true; private const bool DEFAULT_ALDUINDEFEATED = true; private const bool DEFAULT_HELGEN = false; - private const bool DEFAULT_HAILSITHIS = false; - private const bool DEFAULT_GLORYOFTHEDEAD = false; - private const bool DEFAULT_UNDERNEWMANAGEMENT = false; - private const bool DEFAULT_THEEYEOFMAGNUS = false; + private const bool DEFAULT_DARKBROTHERHOOD = false; + private const bool DEFAULT_COMPANIONS = false; + private const bool DEFAULT_THIEVESGUILD = false; + private const bool DEFAULT_COLLEGEOFWINTERHOLD = false; public SkyrimSettings() { @@ -33,20 +33,20 @@ public SkyrimSettings() this.chkAutoStart.DataBindings.Add("Checked", this, "AutoStart", false, DataSourceUpdateMode.OnPropertyChanged); this.chkAlduinDefeated.DataBindings.Add("Checked", this, "AlduinDefeated", false, DataSourceUpdateMode.OnPropertyChanged); this.chkHelgen.DataBindings.Add("Checked", this, "Helgen", false, DataSourceUpdateMode.OnPropertyChanged); - this.chkHailSithis.DataBindings.Add("Checked", this, "HailSithis", false, DataSourceUpdateMode.OnPropertyChanged); - this.chkGloryOfTheDead.DataBindings.Add("Checked", this, "GloryOfTheDead", false, DataSourceUpdateMode.OnPropertyChanged); - this.chkUnderNewManagement.DataBindings.Add("Checked", this, "UnderNewManagement", false, DataSourceUpdateMode.OnPropertyChanged); - this.chkTheEyeofMagnus.DataBindings.Add("Checked", this, "TheEyeofMagnus", false, DataSourceUpdateMode.OnPropertyChanged); + this.chkDarkBrotherhood.DataBindings.Add("Checked", this, "DarkBrotherhood", false, DataSourceUpdateMode.OnPropertyChanged); + this.chkCompanions.DataBindings.Add("Checked", this, "Companions", false, DataSourceUpdateMode.OnPropertyChanged); + this.chkThievesGuild.DataBindings.Add("Checked", this, "ThievesGuild", false, DataSourceUpdateMode.OnPropertyChanged); + this.chkCollege.DataBindings.Add("Checked", this, "CollegeOfWinterhold", false, DataSourceUpdateMode.OnPropertyChanged); // defaults this.DrawWithoutLoads = DEFAULT_DRAWWITHOUTLOADS; this.AutoStart = DEFAULT_AUTOSTART; this.AlduinDefeated = DEFAULT_ALDUINDEFEATED; this.Helgen = DEFAULT_HELGEN; - this.HailSithis = DEFAULT_HAILSITHIS; - this.GloryOfTheDead = DEFAULT_GLORYOFTHEDEAD; - this.TheEyeofMagnus = DEFAULT_THEEYEOFMAGNUS; - this.UnderNewManagement = DEFAULT_UNDERNEWMANAGEMENT; + this.DarkBrotherhood = DEFAULT_DARKBROTHERHOOD; + this.Companions = DEFAULT_COMPANIONS; + this.CollegeOfWinterhold = DEFAULT_COLLEGEOFWINTERHOLD; + this.ThievesGuild = DEFAULT_THIEVESGUILD; } public XmlNode GetSettings(XmlDocument doc) @@ -59,10 +59,10 @@ public XmlNode GetSettings(XmlDocument doc) settingsNode.AppendChild(ToElement(doc, "AutoStart", this.AutoStart)); settingsNode.AppendChild(ToElement(doc, "AlduinDefeated", this.AlduinDefeated)); settingsNode.AppendChild(ToElement(doc, "Helgen", this.Helgen)); - settingsNode.AppendChild(ToElement(doc, "HailSithis", this.HailSithis)); - settingsNode.AppendChild(ToElement(doc, "GloryOfTheDead", this.GloryOfTheDead)); - settingsNode.AppendChild(ToElement(doc, "UnderNewManagement", this.UnderNewManagement)); - settingsNode.AppendChild(ToElement(doc, "TheEyeofMagnus", this.TheEyeofMagnus)); + settingsNode.AppendChild(ToElement(doc, "DarkBrotherhood", this.DarkBrotherhood)); + settingsNode.AppendChild(ToElement(doc, "Companions", this.Companions)); + settingsNode.AppendChild(ToElement(doc, "ThievesGuild", this.ThievesGuild)); + settingsNode.AppendChild(ToElement(doc, "CollegeOfWinterhold", this.CollegeOfWinterhold)); return settingsNode; } @@ -73,10 +73,10 @@ public void SetSettings(XmlNode settings) this.AutoStart = ParseBool(settings, "AutoStart", DEFAULT_AUTOSTART); this.AlduinDefeated = ParseBool(settings, "AlduinDefeated", DEFAULT_ALDUINDEFEATED); this.Helgen = ParseBool(settings, "Helgen", DEFAULT_HELGEN); - this.HailSithis = ParseBool(settings, "HailSithis", DEFAULT_HAILSITHIS); - this.GloryOfTheDead = ParseBool(settings, "GloryOfTheDead", DEFAULT_GLORYOFTHEDEAD); - this.UnderNewManagement = ParseBool(settings, "UnderNewManagement", DEFAULT_UNDERNEWMANAGEMENT); - this.TheEyeofMagnus = ParseBool(settings, "TheEyeofMagnus", DEFAULT_THEEYEOFMAGNUS); + this.DarkBrotherhood = ParseBool(settings, "DarkBrotherhood", DEFAULT_DARKBROTHERHOOD); + this.Companions = ParseBool(settings, "Companions", DEFAULT_COMPANIONS); + this.ThievesGuild = ParseBool(settings, "ThievesGuild", DEFAULT_THIEVESGUILD); + this.CollegeOfWinterhold = ParseBool(settings, "CollegeOfWinterhold", DEFAULT_COLLEGEOFWINTERHOLD); } static bool ParseBool(XmlNode settings, string setting, bool default_ = false) diff --git a/SkyrimSettings.resx b/SkyrimSettings.resx index 58a9e20..1af7de1 100644 --- a/SkyrimSettings.resx +++ b/SkyrimSettings.resx @@ -1,17 +1,17 @@  - @@ -117,4 +117,4 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + \ No newline at end of file diff --git a/config/TESV.CT b/config/TESV.CT index 4b19746..d84b5c9 100644 --- a/config/TESV.CT +++ b/config/TESV.CT @@ -4,7 +4,7 @@ 0 "isPaused" - + 80000008 Byte
"TESV.exe"+172E85F
@@ -12,7 +12,7 @@ 1 "isLoading" - + 80000008 Byte
"TESV.exe"+17337CC
@@ -20,31 +20,33 @@ 3 "isLoadscreen" - + 80000008 Byte
"TESV.exe"+EE3561
- - 4 - "AreHandsTied" - - 80000008 - Byte -
TESV.exe+172EE2C
-
5 "IsInFadeOut" - + 80000008 Byte
TESV.exe+172EE2E
+ + + 4 + "AreHandsTied?" + + 80000008 + Byte +
TESV.exe+172EE2C
+
+
12 - "IsAlduinDead" - + "IsAlduinDead?" + 80000008 Byte
TESV.exe+1711608
@@ -52,7 +54,7 @@ 9 "X world coord" - + 80000008 4 Bytes
"TESV.exe"+0172E864
@@ -63,7 +65,7 @@ 11 "Y world coord" - + 80000008 4 Bytes
"TESV.exe"+0172E864
@@ -74,15 +76,15 @@ 18 "isInTamriel" - + 80000008 Byte
TESV.exe+173815C
20 - "guildsCompleted" - + "questLinesCompleted" + 80000008 4 Bytes
"TESV.exe"+00EE6C34
@@ -91,40 +93,70 @@
- 23 - "isGloryOfTheDeadCompleted" - + 26 + "Location ID" + + 1 + 80000008 + 4 Bytes +
"TESV.exe"+01738308
+ + EC + 670 + 78 + 4 + +
+ + 27 + "isInEscapeMenu" + 80000008 Byte +
TESV.exe+172E85E
+
+ + 28 + "companionsQuestsCompleted" + + 80000008 + 4 Bytes
"TESV.exe"+00EE6C34
378
- 25 - "isTheEyeOfMagnusCompleted" - + 29 + "collegeQuestsCompleted" + 80000008 - Byte -
"TESV.exe"+0172E2DC
+ 4 Bytes +
"TESV.exe"+00EE6C34
- 13C + 38C
- 26 - "Location ID" - - 1 + 31 + "darkBrotherhoodQuestsCompleted" + 80000008 4 Bytes -
"TESV.exe"+01738308
+
"TESV.exe"+00EE6C34
- EC - 670 - 78 - 4 + 3B4 + +
+ + 34 + "thievesGuildQuestsCompleted" + + 80000008 + 4 Bytes +
"TESV.exe"+00EE6C34
+ + 3A0