diff --git a/Components/LiveSplit.Skyrim.dll b/Components/LiveSplit.Skyrim.dll index 6ecdad7..23089ad 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 04a0b9c..91b0bd7 100644 --- a/Components/update.LiveSplit.Skyrim.xml +++ b/Components/update.LiveSplit.Skyrim.xml @@ -1,4 +1,20 @@ + + + + + + + Added autosplits for every split in any%. + + + Removed the Alternate Timing layout component. It's now its own component and works for all games. + + + Redesigned settings. + + + diff --git a/GameMemory.cs b/GameMemory.cs index 8ec886e..683907e 100644 --- a/GameMemory.cs +++ b/GameMemory.cs @@ -14,10 +14,28 @@ public enum SplitArea : int { None, Helgen, - DarkBrotherhoodQuestlineCompleted, + Whiterun, + ThalmorEmbassy, + Esbern, + Riverwood, + TheWall, + Septimus, + MzarkTower, + ClearSky, + HorseClimb, + CutsceneStart, + CutsceneEnd, + Alduin1, + HighHrothgar, + Solitude, + Windhelm, + Council, + Odahviing, + EnterSovngarde, + CollegeOfWinterholdQuestlineCompleted, CompanionsQuestlineCompleted, + DarkBrotherhoodQuestlineCompleted, ThievesGuildQuestlineCompleted, - CollegeQuestlineCompleted, AlduinDefeated } @@ -34,6 +52,7 @@ public enum SplitArea : int private CancellationTokenSource _cancelSource; private SynchronizationContext _uiThread; private List _ignorePIDs; + private SkyrimSettings _settings; private DeepPointer _isLoadingPtr; private DeepPointer _isLoadingScreenPtr; @@ -43,17 +62,38 @@ public enum SplitArea : int private DeepPointer _world_YPtr; private DeepPointer _isAlduinDefeatedPtr; private DeepPointer _questlinesCompleted; + private DeepPointer _collegeOfWinterholdQuestsCompletedPtr; private DeepPointer _companionsQuestsCompletedPtr; - private DeepPointer _collegeQuestsCompletedPtr; private DeepPointer _darkBrotherhoodQuestsCompletedPtr; private DeepPointer _thievesGuildQuestsCompletedPtr; private DeepPointer _isInEscapeMenuPtr; + private DeepPointer _mainQuestsCompletedPtr; + private DeepPointer _wordsOfPowerLearnedPtr; + private DeepPointer _Alduin1HealthPtr; + private DeepPointer _locationsDiscoveredPtr; + private DeepPointer _arePlayerControlsDisablePtr; private enum Locations { Tamriel = 0x0000003C, Sovngarde = 0x0002EE41, HelgenKeep01 = 0x0005DE24, + WhiterunWorld = 0x0001A26F, + ThalmorEmbassy02 = 0x0007DCFC, + WhiterunDragonsreach = 0x000165A3, + RiftenWorld = 0x00016BB4, + RiftenRatway01 = 0x0003B698, + RiverwoodSleepingGiantInn = 0x000133C6, + KarthspireRedoubtWorld = 0x00035699, + SkyHavenTemple = 0x000161EB, + SeptimusSignusOutpost = 0x0002D4E4, + TowerOfMzark = 0x0002D4E3, + HighHrothgar = 0x00087764, + SolitudeWorld = 0x00037EDF, + SolitudeCastleDour = 0x000213A0, + WindhelmWorld = 0x0001691D, + WindhelmPalaceoftheKings = 0x0001677C, + SkuldafnWorld = 0x000278DD, } private enum ExpectedDllSizes @@ -63,6 +103,10 @@ private enum ExpectedDllSizes } public bool[] splitStates { get; set; } + bool isSkyHavenTempleVisited = false; + bool isAlduin1Defeated = false; + int leaveSleepingGiantInnCounter = 0; + bool isCouncilDone = false; public void resetSplitStates() { @@ -70,10 +114,15 @@ public void resetSplitStates() { splitStates[i] = false; } + isSkyHavenTempleVisited = false; + isAlduin1Defeated = false; + leaveSleepingGiantInnCounter = 0; + isCouncilDone = false; } - public GameMemory() + public GameMemory(SkyrimSettings componentSettings) { + _settings = componentSettings; splitStates = new bool[(int)SplitArea.AlduinDefeated + 1]; // Loads @@ -89,11 +138,16 @@ public GameMemory() // Game state _isAlduinDefeatedPtr = new DeepPointer(0x1711608); // == 1 when last blow is struck on alduin _questlinesCompleted = new DeepPointer(0x00EE6C34, 0x3F0); // number of questlines completed (from ingame stats) + _collegeOfWinterholdQuestsCompletedPtr = new DeepPointer(0x00EE6C34, 0x38c); // number of college of winterhold quests 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) + _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 + _mainQuestsCompletedPtr = new DeepPointer(0x00EE6C34, 0x350); // number of main quests completed (from ingame stats) + _wordsOfPowerLearnedPtr = new DeepPointer(0x00EE6C34, 0x558); // "Words Of Power Learned" from ingame stats + _Alduin1HealthPtr = new DeepPointer(0x00F41764, 0x74, 0x30, 0x30, 0x1c); // Alduin 1's health (if it's at 0 it's 99% of the time because it can't be found) + _locationsDiscoveredPtr = new DeepPointer(0x00EE6C34, 0x170); // number of locations discovered (from ingame stats) + _arePlayerControlsDisablePtr = new DeepPointer(0x172EF30, 0xf); // == 1 when player controls have been disabled (not necessarily all controls) resetSplitStates(); @@ -154,18 +208,29 @@ void MemoryReadThread() bool prevIsLoading = false; bool prevIsLoadingScreen = false; bool prevIsInFadeOut = false; - bool prevIsAlduinDefeated = false; + bool prevIsAlduin2Defeated = false; int prevQuestlinesCompleted = 0; + int prevCollegeOfWinterholdQuestsCompleted = 0; int prevCompanionsQuestsCompleted = 0; - int prevCollegeQuestsCompleted = 0; int prevDarkBrotherhoodQuestsCompleted = 0; int prevThievesGuildQuestsCompleted = 0; bool prevIsInEscapeMenu = false; int prevLocationID = 0; + int prevWorld_X = 0; + int prevWorld_Y = 0; + int prevMainQuestsCompleted = 0; + int prevLocationsDiscovered = 0; + bool prevArePlayerControlsDisabled = false; bool loadingStarted = false; bool loadingScreenStarted = false; bool loadScreenFadeoutStarted = false; + bool isLoadingSaveFromMenu = false; + int loadScreenStartLocationID = 0; + int loadScreenStartWorld_X = 0; + int loadScreenStartWorld_Y = 0; + bool isWaitingLocationOrCoordsUpdate = false; + bool isWaitingLocationIDUpdate = false; SplitArea lastQuestCompleted = SplitArea.None; uint lastQuestframeCounter = 0; @@ -195,18 +260,18 @@ void MemoryReadThread() int world_Y; _world_YPtr.Deref(game, out world_Y); - bool isAlduinDefeated; - _isAlduinDefeatedPtr.Deref(game, out isAlduinDefeated); + bool isAlduin2Defeated; + _isAlduinDefeatedPtr.Deref(game, out isAlduin2Defeated); int questlinesCompleted; _questlinesCompleted.Deref(game, out questlinesCompleted); + int collegeOfWinterholdQuestsCompleted; + _collegeOfWinterholdQuestsCompletedPtr.Deref(game, out collegeOfWinterholdQuestsCompleted); + int companionsQuestsCompleted; _companionsQuestsCompletedPtr.Deref(game, out companionsQuestsCompleted); - int collegeQuestsCompleted; - _collegeQuestsCompletedPtr.Deref(game, out collegeQuestsCompleted); - int darkBrotherhoodQuestsCompleted; _darkBrotherhoodQuestsCompletedPtr.Deref(game, out darkBrotherhoodQuestsCompleted); @@ -216,6 +281,21 @@ void MemoryReadThread() bool isInEscapeMenu; _isInEscapeMenuPtr.Deref(game, out isInEscapeMenu); + int mainquestsCompleted; + _mainQuestsCompletedPtr.Deref(game, out mainquestsCompleted); + + int wordsOfPowerLearned; + _wordsOfPowerLearnedPtr.Deref(game, out wordsOfPowerLearned); + + float alduin1Health; + _Alduin1HealthPtr.Deref(game, out alduin1Health); + + int locationsDiscovered; + _locationsDiscoveredPtr.Deref(game, out locationsDiscovered); + + bool arePlayerControlsDisabled; + _arePlayerControlsDisablePtr.Deref(game, out arePlayerControlsDisabled); + if (isLoading != prevIsLoading) { if (isLoading) @@ -223,7 +303,6 @@ void MemoryReadThread() Trace.WriteLine(String.Format("[NoLoads] Load Start - {0}", frameCounter)); loadingStarted = true; - // pause game timer _uiThread.Post(d => { @@ -241,6 +320,14 @@ void MemoryReadThread() { loadingStarted = false; + if (!loadScreenFadeoutStarted) + { + if (locationID == (int)Locations.Tamriel && world_X == 13 && (world_Y == -10 || world_Y == -9) && wordsOfPowerLearned == 3) + { + Split(SplitArea.ClearSky, frameCounter); + } + } + // unpause game timer _uiThread.Post(d => { @@ -257,39 +344,60 @@ void MemoryReadThread() { if (isLoadingScreen) { - Trace.WriteLine(String.Format("[NoLoads] LoadScreen Start - {0}", frameCounter)); + Trace.WriteLine(String.Format("[NoLoads] LoadScreen Start at {0} X: {1} Y: {2} - {3}", locationID.ToString("X8"), world_X, world_Y, frameCounter)); loadingScreenStarted = true; + loadScreenStartLocationID = locationID; + loadScreenStartWorld_X = world_X; + loadScreenStartWorld_Y = world_Y; if (isInFadeOut) { loadScreenFadeoutStarted = true; } - // nothing currently - // _uiThread.Post(d => - // { - // if (this.OnLoadScreenStarted != null) - // { - // this.OnLoadScreenStarted(this, EventArgs.Empty); - // } - // }, null); + if (isInEscapeMenu) + { + isLoadingSaveFromMenu = true; + } // if it isn't a loadscreen from loading a save - if (!isInEscapeMenu) + if (!isLoadingSaveFromMenu) { + isWaitingLocationOrCoordsUpdate = true; + isWaitingLocationIDUpdate = true; + // if loadscreen starts while leaving helgen - if (locationID == (int)Locations.HelgenKeep01 && world_X == -2 && world_Y == -5) + if (loadScreenStartLocationID == (int)Locations.HelgenKeep01 && loadScreenStartWorld_X == -2 && loadScreenStartWorld_Y == -5) { // Helgen split - _uiThread.Post(d => - { - if (this.OnSplitCompleted != null) - { - this.OnSplitCompleted(this, SplitArea.Helgen, frameCounter); - } - }, null); + Split(SplitArea.Helgen, frameCounter); } + // if loadscreen starts in around the carriage of Whiterun Stables + else if (loadScreenStartLocationID == (int)Locations.Tamriel && loadScreenStartWorld_X == 4 && (loadScreenStartWorld_Y == -3 || loadScreenStartWorld_Y == -4) && + _settings.AnyPercentTemplate == SkyrimSettings.TEMPLATE_DRTCHOPS) + { + Split(SplitArea.Whiterun, frameCounter); + } + // if loadscreen starts in Karthspire and Sky Haven Temple has been entered at least once + else if (loadScreenStartLocationID == (int)Locations.KarthspireRedoubtWorld && isSkyHavenTempleVisited && + (_settings.AnyPercentTemplate == SkyrimSettings.TEMPLATE_MRWALRUS || _settings.AnyPercentTemplate == SkyrimSettings.TEMPLATE_DRTCHOPS || _settings.AnyPercentTemplate == SkyrimSettings.TEMPLATE_DALLETH)) + { + Split(SplitArea.TheWall, frameCounter); + } + // if loadscreen starts in Paarthurnax' mountain whereabouts + else if (isAlduin1Defeated && loadScreenStartLocationID == (int)Locations.Tamriel && ((loadScreenStartWorld_X == 14 && loadScreenStartWorld_Y == -12) || + (loadScreenStartWorld_X == 14 && loadScreenStartWorld_Y == -13) || (loadScreenStartWorld_X == 13 && loadScreenStartWorld_Y == -12) || + (loadScreenStartWorld_X == 13 && loadScreenStartWorld_Y == -13)) && + (_settings.AnyPercentTemplate == SkyrimSettings.TEMPLATE_DRTCHOPS || _settings.AnyPercentTemplate == SkyrimSettings.TEMPLATE_GR3YSCALE || _settings.AnyPercentTemplate == SkyrimSettings.TEMPLATE_DALLETH)) + { + Split(SplitArea.Alduin1, frameCounter); + } + } + else + { + isWaitingLocationOrCoordsUpdate = false; + isWaitingLocationIDUpdate = false; } } else @@ -299,15 +407,7 @@ void MemoryReadThread() if (loadingScreenStarted) { loadingScreenStarted = false; - - // nothing currently - // _uiThread.Post(d => - // { - // if (this.OnLoadScreenFinished != null) - // { - // this.OnLoadScreenFinished(this, EventArgs.Empty); - // } - // }, null); + isLoadingSaveFromMenu = false; } } } @@ -326,8 +426,8 @@ void MemoryReadThread() { Debug.WriteLine(String.Format("[NoLoads] Fadeout ended - {0}", frameCounter)); // if loadscreen fadeout finishes in helgen - if (prevIsInFadeOut && loadScreenFadeoutStarted - && 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)); @@ -353,17 +453,241 @@ void MemoryReadThread() } } - // if alduin is defeated in sovngarde - if (isAlduinDefeated != prevIsAlduinDefeated && isAlduinDefeated && locationID == (int)Locations.Sovngarde) + if ((locationID != prevLocationID || world_X != prevWorld_X || world_Y != prevWorld_Y) && isWaitingLocationOrCoordsUpdate) { - // AlduinDefeated split - _uiThread.Post(d => + isWaitingLocationOrCoordsUpdate = false; + + // if loadscreen starts while in front of the door of Thalmor Embassy and doesn't end inside the Embassy + if (loadScreenStartLocationID == (int)Locations.Tamriel && loadScreenStartWorld_X == -20 && loadScreenStartWorld_Y == 28 && + locationID != (int)Locations.ThalmorEmbassy02 && + (_settings.AnyPercentTemplate == SkyrimSettings.TEMPLATE_MRWALRUS || _settings.AnyPercentTemplate == SkyrimSettings.TEMPLATE_DRTCHOPS || _settings.AnyPercentTemplate == SkyrimSettings.TEMPLATE_DALLETH)) { - if (this.OnSplitCompleted != null) + Split(SplitArea.ThalmorEmbassy, frameCounter); + } + // if loadscreen starts while in front of the Sleeping Giant Inn and doesn't end inside it + else if (loadScreenStartLocationID == (int)Locations.Tamriel && loadScreenStartWorld_X == 5 && loadScreenStartWorld_Y == -11 && + locationID != (int)Locations.RiverwoodSleepingGiantInn && + (_settings.AnyPercentTemplate == SkyrimSettings.TEMPLATE_MRWALRUS || _settings.AnyPercentTemplate == SkyrimSettings.TEMPLATE_DRTCHOPS || _settings.AnyPercentTemplate == SkyrimSettings.TEMPLATE_DALLETH)) + { + Split(SplitArea.Riverwood, frameCounter); + } + // if loadscreen starts outside Septimus' Outpost and doesn't end inside it + else if (loadScreenStartLocationID == (int)Locations.Tamriel && loadScreenStartWorld_X == 28 && loadScreenStartWorld_Y == 34 && + locationID != (int)Locations.SeptimusSignusOutpost && + (_settings.AnyPercentTemplate == SkyrimSettings.TEMPLATE_MRWALRUS || _settings.AnyPercentTemplate == SkyrimSettings.TEMPLATE_DRTCHOPS || _settings.AnyPercentTemplate == SkyrimSettings.TEMPLATE_DALLETH)) + { + Split(SplitArea.Septimus, frameCounter); + } + // if loadscreen starts outside Mzark Tower and doesn't end inside it + else if (loadScreenStartLocationID == (int)Locations.Tamriel && loadScreenStartWorld_X == 6 && loadScreenStartWorld_Y == 11 && + locationID != (int)Locations.TowerOfMzark && + (_settings.AnyPercentTemplate == SkyrimSettings.TEMPLATE_MRWALRUS || _settings.AnyPercentTemplate == SkyrimSettings.TEMPLATE_DRTCHOPS || _settings.AnyPercentTemplate == SkyrimSettings.TEMPLATE_DALLETH)) + { + Split(SplitArea.MzarkTower, frameCounter); + } + // if loadscreen starts in High Hrothgar's whereabouts and doesn't end inside + else if (loadScreenStartLocationID == (int)Locations.Tamriel && loadScreenStartWorld_X == 13 && + (loadScreenStartWorld_Y == -9 || loadScreenStartWorld_Y == -10) && + locationID != (int)Locations.HighHrothgar) + { + if (!splitStates[(int)SplitArea.HighHrothgar]) + { + Split(SplitArea.HighHrothgar, frameCounter); + } + else if (_settings.AnyPercentTemplate == SkyrimSettings.TEMPLATE_DRTCHOPS || _settings.AnyPercentTemplate == SkyrimSettings.TEMPLATE_DALLETH) { - this.OnSplitCompleted(this, SplitArea.AlduinDefeated, frameCounter); + Split(SplitArea.Council, frameCounter); } - }, null); + } + } + + if (locationID != prevLocationID && isWaitingLocationIDUpdate) + { + isWaitingLocationIDUpdate = false; + + if (locationID == (int)Locations.SkyHavenTemple) + { + isSkyHavenTempleVisited = true; + } + + // if loadscreen starts in dragonsreach and ends in whiterun + if (loadScreenStartLocationID == (int)Locations.WhiterunDragonsreach && + locationID == (int)Locations.WhiterunWorld && world_X == 6 && world_Y == 0 && + _settings.AnyPercentTemplate == SkyrimSettings.TEMPLATE_GR3YSCALE) + { + Split(SplitArea.Whiterun, frameCounter); + } + // if loadscreen starts in whiterun and doesn't end in dragonsreach + else if (loadScreenStartLocationID == (int)Locations.WhiterunWorld && loadScreenStartWorld_X == 6 && loadScreenStartWorld_Y == 0 && + locationID != (int)Locations.WhiterunDragonsreach && + (_settings.AnyPercentTemplate == SkyrimSettings.TEMPLATE_MRWALRUS || _settings.AnyPercentTemplate == SkyrimSettings.TEMPLATE_DALLETH)) + { + Split(SplitArea.Whiterun, frameCounter); + } + // if loadscreen starts Thalmor Embassy and ends in front of its door + else if (loadScreenStartLocationID == (int)Locations.ThalmorEmbassy02 && + locationID == (int)Locations.Tamriel && world_X == -20 && world_Y == 28 && + _settings.AnyPercentTemplate == SkyrimSettings.TEMPLATE_GR3YSCALE) + { + Split(SplitArea.ThalmorEmbassy, frameCounter); + } + // if loadscreen starts while in front of the ratway door and doesn't end inside it + else if (loadScreenStartLocationID == (int)Locations.RiftenWorld && loadScreenStartWorld_X == 42 && loadScreenStartWorld_Y == -24 && + locationID != (int)Locations.RiftenRatway01 && + (_settings.AnyPercentTemplate == SkyrimSettings.TEMPLATE_MRWALRUS || _settings.AnyPercentTemplate == SkyrimSettings.TEMPLATE_DRTCHOPS || _settings.AnyPercentTemplate == SkyrimSettings.TEMPLATE_DALLETH)) + { + Split(SplitArea.Esbern, frameCounter); + } + // if loadscreen starts inside the ratway and ends in front of its door + else if (loadScreenStartLocationID == (int)Locations.RiftenRatway01 && + locationID == (int)Locations.RiftenWorld && world_X == 42 && world_Y == -24 && + _settings.AnyPercentTemplate == SkyrimSettings.TEMPLATE_GR3YSCALE) + { + Split(SplitArea.Esbern, frameCounter); + } + // if loadscreen starts while leaving the Sleeping Giant Inn and ends in front of its door + else if (loadScreenStartLocationID == (int)Locations.RiverwoodSleepingGiantInn && + locationID == (int)Locations.Tamriel && world_X == 5 && world_Y == -11 && + _settings.AnyPercentTemplate == SkyrimSettings.TEMPLATE_GR3YSCALE) + { + leaveSleepingGiantInnCounter++; + if (leaveSleepingGiantInnCounter == 2) + { + Split(SplitArea.Riverwood, frameCounter); + } + } + // if loadingscren starts in Sky Haven Temple and ends in Karthspire + else if (loadScreenStartLocationID == (int)Locations.SkyHavenTemple && + locationID == (int)Locations.KarthspireRedoubtWorld && + _settings.AnyPercentTemplate == SkyrimSettings.TEMPLATE_GR3YSCALE) + { + Split(SplitArea.TheWall, frameCounter); + } + // if loadscreen starts inside Septimus' Outpost and ends in front of its door + else if (loadScreenStartLocationID == (int)Locations.SeptimusSignusOutpost && + locationID == (int)Locations.Tamriel && world_X == 28 && world_Y == 34 && + _settings.AnyPercentTemplate == SkyrimSettings.TEMPLATE_GR3YSCALE) + { + Split(SplitArea.Septimus, frameCounter); + } + // if loadscreen starts inside Mzark Tower and ends outside of it + else if (loadScreenStartLocationID == (int)Locations.TowerOfMzark && + locationID == (int)Locations.Tamriel && world_X == 6 && world_Y == 11 && + _settings.AnyPercentTemplate == SkyrimSettings.TEMPLATE_GR3YSCALE) + { + Split(SplitArea.MzarkTower, frameCounter); + } + // if loadscreen starts in high hrothgar and ends in front of one of its doors + else if (loadScreenStartLocationID == (int)Locations.HighHrothgar && + locationID == (int)Locations.Tamriel && world_X == 13 && (world_Y == -9 || world_Y == -10) && + (_settings.AnyPercentTemplate == SkyrimSettings.TEMPLATE_DRTCHOPS || _settings.AnyPercentTemplate == SkyrimSettings.TEMPLATE_GR3YSCALE)) + { + if (!isCouncilDone) + { + Split(SplitArea.ClearSky, frameCounter); + } + else if (isCouncilDone && _settings.AnyPercentTemplate == SkyrimSettings.TEMPLATE_GR3YSCALE) + { + Split(SplitArea.Council, frameCounter); + } + } + // if loadscreen starts in Solitude in front of the door of Castle Dour and doesn't end inside it + else if (loadScreenStartLocationID == (int)Locations.SolitudeWorld && loadScreenStartWorld_X == -16 && loadScreenStartWorld_Y == 26 && + locationID != (int)Locations.SolitudeCastleDour && + (_settings.AnyPercentTemplate == SkyrimSettings.TEMPLATE_MRWALRUS || _settings.AnyPercentTemplate == SkyrimSettings.TEMPLATE_DRTCHOPS || _settings.AnyPercentTemplate == SkyrimSettings.TEMPLATE_DALLETH)) + { + Split(SplitArea.Solitude, frameCounter); + } + // if loadscreen starts in Solitude Castle Dour and ends outside in front of its door + else if (loadScreenStartLocationID == (int)Locations.SolitudeCastleDour && + locationID == (int)Locations.SolitudeWorld && world_X == -16 && world_Y == 26 && + _settings.AnyPercentTemplate == SkyrimSettings.TEMPLATE_GR3YSCALE) + { + Split(SplitArea.Solitude, frameCounter); + } + // if loadscreen starts in Windhelm and doesn't end inside + else if (loadScreenStartLocationID == (int)Locations.WindhelmWorld && loadScreenStartWorld_X == 32 && loadScreenStartWorld_Y == 10 && + locationID != (int)Locations.WindhelmPalaceoftheKings && + (_settings.AnyPercentTemplate == SkyrimSettings.TEMPLATE_MRWALRUS || _settings.AnyPercentTemplate == SkyrimSettings.TEMPLATE_DRTCHOPS || _settings.AnyPercentTemplate == SkyrimSettings.TEMPLATE_DALLETH)) + { + Split(SplitArea.Windhelm, frameCounter); + } + // if loadscreen starts in Windhelm's Palace of the Kings and ends outside + else if (loadScreenStartLocationID == (int)Locations.WindhelmPalaceoftheKings && + locationID == (int)Locations.WindhelmWorld && world_X == 32 && world_Y == 10 && + _settings.AnyPercentTemplate == SkyrimSettings.TEMPLATE_GR3YSCALE) + { + Split(SplitArea.Windhelm, frameCounter); + } + // if loadscreen ends in Skuldafn. + else if (locationID == (int)Locations.SkuldafnWorld) + { + Split(SplitArea.Odahviing, frameCounter); + } + // if loadscreen ends in Sovngarde + else if (locationID == (int)Locations.Sovngarde) + { + Split(SplitArea.EnterSovngarde, frameCounter); + } + } + + if (locationsDiscovered != prevLocationsDiscovered) + { + if (locationID == (int)Locations.Tamriel && ((world_X == 14 && world_Y == -12) || (world_X == 14 && world_Y == -13) || (world_X == 13 && world_Y == -12) || + (world_X == 13 && world_Y == -13)) && + _settings.AnyPercentTemplate == SkyrimSettings.TEMPLATE_GR3YSCALE) + { + Split(SplitArea.HorseClimb, frameCounter); + } + } + + if (arePlayerControlsDisabled != prevArePlayerControlsDisabled && !isInEscapeMenu) + { + if (arePlayerControlsDisabled) + { + if (locationID == (int)Locations.Tamriel && world_X == 13 && world_Y == -12 && + (_settings.AnyPercentTemplate == SkyrimSettings.TEMPLATE_DRTCHOPS || _settings.AnyPercentTemplate == SkyrimSettings.TEMPLATE_DALLETH)) + { + Split(SplitArea.CutsceneStart, frameCounter); + } + } + else + { + if (locationID == (int)Locations.Tamriel && world_X == 13 && world_Y == -12 && + (_settings.AnyPercentTemplate == SkyrimSettings.TEMPLATE_GR3YSCALE || _settings.AnyPercentTemplate == SkyrimSettings.TEMPLATE_DALLETH)) + { + Split(SplitArea.CutsceneEnd, frameCounter); + } + } + } + + if (alduin1Health < 0 && !isAlduin1Defeated) + { + Debug.WriteLine(String.Format("[NoLoads] Alduin 1 has been defeated. HP: {1} - {0}", frameCounter, alduin1Health)); + isAlduin1Defeated = true; + + if (_settings.AnyPercentTemplate == SkyrimSettings.TEMPLATE_MRWALRUS) + { + Split(SplitArea.Alduin1, frameCounter); + } + } + + // the only mainquest you can complete here is the council so when a quest completes, walrus' council split + if (mainquestsCompleted == prevMainQuestsCompleted + 1 && locationID == (int)Locations.HighHrothgar) + { + isCouncilDone = true; + + if (_settings.AnyPercentTemplate == SkyrimSettings.TEMPLATE_MRWALRUS) + { + Split(SplitArea.Council, frameCounter); + } + } + + // if alduin is defeated in sovngarde + if (isAlduin2Defeated != prevIsAlduin2Defeated && isAlduin2Defeated && locationID == (int)Locations.Sovngarde) + { + // AlduinDefeated split + Split(SplitArea.AlduinDefeated, frameCounter); } // reset lastQuest 100 frames (1.5 seconds) after a completion to avoid splitting on a wrong questline. @@ -372,16 +696,10 @@ void MemoryReadThread() lastQuestCompleted = SplitArea.None; } - if (darkBrotherhoodQuestsCompleted > prevDarkBrotherhoodQuestsCompleted) + if (collegeOfWinterholdQuestsCompleted > prevCollegeOfWinterholdQuestsCompleted) { - 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; + Debug.WriteLine(String.Format("[NoLoads] A College of Winterhold quest has been completed - {0}", frameCounter)); + lastQuestCompleted = SplitArea.CollegeOfWinterholdQuestlineCompleted; lastQuestframeCounter = frameCounter; } else if (companionsQuestsCompleted > prevCompanionsQuestsCompleted) @@ -390,10 +708,16 @@ void MemoryReadThread() lastQuestCompleted = SplitArea.CompanionsQuestlineCompleted; lastQuestframeCounter = frameCounter; } - else if (collegeQuestsCompleted > prevCollegeQuestsCompleted) + else if (darkBrotherhoodQuestsCompleted > prevDarkBrotherhoodQuestsCompleted) { - Debug.WriteLine(String.Format("[NoLoads] A College of Winterhold quest has been completed - {0}", frameCounter)); - lastQuestCompleted = SplitArea.CollegeQuestlineCompleted; + 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; } @@ -401,29 +725,30 @@ void MemoryReadThread() if (questlinesCompleted > prevQuestlinesCompleted) { Debug.WriteLineIf(lastQuestCompleted == SplitArea.None, String.Format("[NoLoads] A questline has been completed. - {0}", frameCounter)); - _uiThread.Post(d => - { - if (this.OnSplitCompleted != null) - { - this.OnSplitCompleted(this, lastQuestCompleted, frameCounter); - } - }, null); + Split(lastQuestCompleted, frameCounter); } - Debug.WriteLineIf(locationID != prevLocationID, String.Format("[NoLoads] LocationID changed from {0} to {1} - {2}", prevLocationID.ToString("X8"), locationID.ToString("X8"), frameCounter)); + + Debug.WriteLineIf(locationID != prevLocationID, String.Format("[NoLoads] Location changed to {0} - {1}", locationID.ToString("X8"), frameCounter)); + Debug.WriteLineIf(world_X != prevWorld_X || world_Y != prevWorld_Y, String.Format("[NoLoads] Coords changed to X: {0} Y: {1} - {2}", world_X, world_Y, frameCounter)); Debug.WriteLineIf(isInEscapeMenu != prevIsInEscapeMenu, String.Format("[NoLoads] isInEscapeMenu changed to {0} - {1}", isInEscapeMenu, frameCounter)); prevIsLoading = isLoading; prevIsLoadingScreen = isLoadingScreen; prevIsInFadeOut = isInFadeOut; - prevIsAlduinDefeated = isAlduinDefeated; + prevIsAlduin2Defeated = isAlduin2Defeated; prevQuestlinesCompleted = questlinesCompleted; + prevCollegeOfWinterholdQuestsCompleted = collegeOfWinterholdQuestsCompleted; prevCompanionsQuestsCompleted = companionsQuestsCompleted; - prevCollegeQuestsCompleted = collegeQuestsCompleted; prevDarkBrotherhoodQuestsCompleted = darkBrotherhoodQuestsCompleted; prevThievesGuildQuestsCompleted = thievesGuildQuestsCompleted; prevIsInEscapeMenu = isInEscapeMenu; prevLocationID = locationID; + prevWorld_X = world_X; + prevWorld_Y = world_Y; + prevMainQuestsCompleted = mainquestsCompleted; + prevLocationsDiscovered = locationsDiscovered; + prevArePlayerControlsDisabled = arePlayerControlsDisabled; frameCounter++; Thread.Sleep(15); @@ -442,6 +767,17 @@ void MemoryReadThread() } } + private void Split(SplitArea split, uint frame) + { + _uiThread.Post(d => + { + if (this.OnSplitCompleted != null) + { + this.OnSplitCompleted(this, split, frame); + } + }, null); + } + Process GetGameProcess() { Process game = Process.GetProcesses().FirstOrDefault(p => p.ProcessName.ToLower() == "tesv" diff --git a/Properties/AssemblyInfo.cs b/Properties/AssemblyInfo.cs index 92103b5..daf1d24 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.2.0")] -[assembly: AssemblyFileVersion("1.4.2.0")] +[assembly: AssemblyVersion("2.0.0.0")] +[assembly: AssemblyFileVersion("2.0.0.0")] [assembly: ComponentFactory(typeof(SkyrimFactory))] diff --git a/README.md b/README.md index 57cba6f..a665e01 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ -LiveSplit.Skyrim v1.4.2 -======================= +LiveSplit.Skyrim v2.0 +===================== LiveSplit.Skyrim is a [LiveSplit](http://livesplit.org/) component for The Elder Scrolls V: Skyrim. @@ -7,7 +7,7 @@ Features -------- * Keeps track of Game Time to get rid of loading times. * Auto start/stop/reset the timer. - * Splits when you finish Helgen and default Alduin 2. (configurable) + * Splits when you finish each split in Any%. (configurable) # Splits when you finish each guild. (configurable) Install @@ -16,17 +16,21 @@ Starting with LiveSplit 1.4, you can download and install LiveSplit.Skyrim autom If the plugin is not working with this process, download the plugin from the [releases page](https://github.com/drtchops/LiveSplit.Skyrim/releases) and place the LiveSplit.Skyrim.dll in your Components directory of LiveSplit. +Upgrade +------- +You may have issues when upgrading from a version prior to 2.0. Try deactiving the autosplitter from the splits editor, removing it from the layout editor, and restarting LiveSplit before upgrading. If the problem persists, delete the LiveSplit.Skyrim.dll from your Components folder and try again. + Configure --------- -Due to bugs in LiveSplit 1.4.0, it's recommended to deactivate LiveSplit.Skyrim in the Splits Editor after activating (downloading) it the first time. Instead, you should activate it in the Layout Editor, under the "Control" category. Double-click "Skyrim" after adding it to your layout to bring up the settings. +Open your Splits Editor and active the autosplitter. If this is not working, leave it deactivated and manually add it in the Layout Editor. You can configure the settings in whichever editor it has been enabled in. -After configuring everything you'll most likely want to turn on game time as primary timing, so that your splits will run off game time. You can do this by right-clicking LiveSplit and going to Compare Against->Game Time. +After configuring everything you'll most likely want to turn on game time as primary timing, so that your splits will run off game time. You can do this by right-clicking LiveSplit and going to Compare Against -> Game Time. #### Auto Split -The default settings are to automatically reset, start, and end the splits (the first and last splits). You can enable Helgen and guild autosplitting here. +The default settings are to automatically reset, start, and end the splits (the first and last splits). You can enable individual splits here. #### Alternate Timing Method -This makes it show Real Time when comparing against Game Time, and vice versa. Doesn't work when LiveSplit.Skyrim is activated via the Splits Editor. +If you wish to show Real Time on your layout, download AlternateTimingMethod from the [LiveSplit Components page](http://livesplit.org/components/) or its own [Github page](https://github.com/Dalet/LiveSplit.AlternateTimingMethod/releases). Change Log ---------- diff --git a/SkyrimComponent.cs b/SkyrimComponent.cs index 54360ab..c1f9d74 100644 --- a/SkyrimComponent.cs +++ b/SkyrimComponent.cs @@ -11,15 +11,13 @@ namespace LiveSplit.Skyrim { - class SkyrimComponent : IComponent + class SkyrimComponent : LogicComponent { - public string ComponentName + public override string ComponentName { get { return "Skyrim"; } } - public IDictionary ContextMenuControls { get; protected set; } - protected InfoTimeComponent InternalComponent { get; set; } public SkyrimSettings Settings { get; set; } public bool Disposed { get; private set; } @@ -28,7 +26,6 @@ public string ComponentName private TimerModel _timer; private GameMemory _gameMemory; private LiveSplitState _state; - private GraphicsCache _cache; public SkyrimComponent(LiveSplitState state, bool isLayoutComponent) { @@ -36,80 +33,35 @@ public SkyrimComponent(LiveSplitState state, bool isLayoutComponent) this.IsLayoutComponent = isLayoutComponent; this.Settings = new SkyrimSettings(); - this.ContextMenuControls = new Dictionary(); - this.InternalComponent = new InfoTimeComponent(null, null, new RegularTimeFormatter(TimeAccuracy.Hundredths)); - _cache = new GraphicsCache(); - _timer = new TimerModel { CurrentState = state }; + _timer = new TimerModel { CurrentState = state }; - _gameMemory = new GameMemory(); + _gameMemory = new GameMemory(this.Settings); _gameMemory.OnFirstLevelLoading += gameMemory_OnFirstLevelLoading; _gameMemory.OnPlayerGainedControl += gameMemory_OnPlayerGainedControl; _gameMemory.OnLoadStarted += gameMemory_OnLoadStarted; _gameMemory.OnLoadFinished += gameMemory_OnLoadFinished; - // _gameMemory.OnLoadScreenStarted += gameMemory_OnLoadScreenStarted; - // _gameMemory.OnLoadScreenFinished += gameMemory_OnLoadScreenFinished; _gameMemory.OnSplitCompleted += gameMemory_OnSplitCompleted; - state.OnReset += state_OnReset; + state.OnStart += State_OnStart; _gameMemory.StartMonitoring(); } - public void Dispose() + public override void Dispose() { this.Disposed = true; - _state.OnReset -= state_OnReset; + _state.OnStart -= State_OnStart; if (_gameMemory != null) { _gameMemory.Stop(); } - } - - void state_OnReset(object sender, TimerPhase e) - { - _gameMemory.resetSplitStates(); - } - - public void Update(IInvalidator invalidator, LiveSplitState state, float width, float height, LayoutMode mode) - { - if (!this.Settings.DrawWithoutLoads) - { - return; - } - this.InternalComponent.TimeValue = - state.CurrentTime[state.CurrentTimingMethod == TimingMethod.GameTime - ? TimingMethod.RealTime : TimingMethod.GameTime]; - this.InternalComponent.InformationName = state.CurrentTimingMethod == TimingMethod.GameTime - ? "Real Time" : "Without Loads"; - - _cache.Restart(); - _cache["TimeValue"] = this.InternalComponent.ValueLabel.Text; - _cache["TimingMethod"] = state.CurrentTimingMethod; - if (invalidator != null && _cache.HasChanged) - { - invalidator.Invalidate(0f, 0f, width, height); - } } - public void DrawVertical(Graphics g, LiveSplitState state, float width, Region region) + void State_OnStart(object sender, EventArgs e) { - this.PrepareDraw(state); - this.InternalComponent.DrawVertical(g, state, width, region); - } - - public void DrawHorizontal(Graphics g, LiveSplitState state, float height, Region region) - { - this.PrepareDraw(state); - this.InternalComponent.DrawHorizontal(g, state, height, region); - } - - void PrepareDraw(LiveSplitState state) - { - this.InternalComponent.NameLabel.ForeColor = state.LayoutSettings.TextColor; - this.InternalComponent.ValueLabel.ForeColor = state.LayoutSettings.TextColor; - this.InternalComponent.NameLabel.HasShadow = this.InternalComponent.ValueLabel.HasShadow = state.LayoutSettings.DropShadows; + _gameMemory.resetSplitStates(); } void gameMemory_OnFirstLevelLoading(object sender, EventArgs e) @@ -138,55 +90,57 @@ void gameMemory_OnLoadFinished(object sender, EventArgs e) _state.IsGameTimePaused = false; } - // void gameMemory_OnLoadScreenStarted(object sender, EventArgs e) - // { - // // Nothing to do - // } - - // void gameMemory_OnLoadScreenFinished(object sender, EventArgs e) - // { - // // Nothing to do - // } - 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] && + Debug.WriteLineIf(split != GameMemory.SplitArea.None, String.Format("[NoLoads] Trying to split {0} with {1} template, State: {2} - {3}", split, this.Settings.AnyPercentTemplate, _gameMemory.splitStates[(int)split], frame)); + if (_state.CurrentPhase == TimerPhase.Running && !_gameMemory.splitStates[(int)split] && ((split == GameMemory.SplitArea.Helgen && this.Settings.Helgen) || - (split == GameMemory.SplitArea.DarkBrotherhoodQuestlineCompleted && this.Settings.DarkBrotherhood) || + (split == GameMemory.SplitArea.Whiterun && this.Settings.Whiterun) || + (split == GameMemory.SplitArea.ThalmorEmbassy && this.Settings.ThalmorEmbassy) || + (split == GameMemory.SplitArea.Esbern && this.Settings.Esbern) || + (split == GameMemory.SplitArea.Riverwood && this.Settings.Riverwood) || + (split == GameMemory.SplitArea.TheWall && this.Settings.TheWall) || + (split == GameMemory.SplitArea.Septimus && this.Settings.Septimus) || + (split == GameMemory.SplitArea.MzarkTower && this.Settings.MzarkTower) || + (split == GameMemory.SplitArea.ClearSky && this.Settings.ClearSky) || + (split == GameMemory.SplitArea.HorseClimb && this.Settings.HorseClimb) || + (split == GameMemory.SplitArea.CutsceneEnd && this.Settings.CutsceneEnd) || + (split == GameMemory.SplitArea.CutsceneStart && this.Settings.CutsceneStart) || + (split == GameMemory.SplitArea.Alduin1 && this.Settings.Alduin1) || + (split == GameMemory.SplitArea.HighHrothgar && this.Settings.HighHrothgar) || + (split == GameMemory.SplitArea.Solitude && this.Settings.Solitude) || + (split == GameMemory.SplitArea.Windhelm && this.Settings.Windhelm) || + (split == GameMemory.SplitArea.Council && this.Settings.Council) || + (split == GameMemory.SplitArea.Odahviing && this.Settings.Odahviing) || + (split == GameMemory.SplitArea.EnterSovngarde && this.Settings.EnterSovngarde) || + (split == GameMemory.SplitArea.CollegeOfWinterholdQuestlineCompleted && this.Settings.CollegeOfWinterhold) || (split == GameMemory.SplitArea.CompanionsQuestlineCompleted && this.Settings.Companions) || - (split == GameMemory.SplitArea.CollegeQuestlineCompleted && this.Settings.CollegeOfWinterhold) || + (split == GameMemory.SplitArea.DarkBrotherhoodQuestlineCompleted && this.Settings.DarkBrotherhood) || (split == GameMemory.SplitArea.ThievesGuildQuestlineCompleted && this.Settings.ThievesGuild) || (split == GameMemory.SplitArea.AlduinDefeated && this.Settings.AlduinDefeated))) { + Trace.WriteLine(String.Format("[NoLoads] {0} Split with {2} template - {1}", split, frame, this.Settings.AnyPercentTemplate)); _timer.Split(); _gameMemory.splitStates[(int)split] = true; } } - public XmlNode GetSettings(XmlDocument document) + public override XmlNode GetSettings(XmlDocument document) { return this.Settings.GetSettings(document); } - public Control GetSettingsControl(LayoutMode mode) + public override Control GetSettingsControl(LayoutMode mode) { return this.Settings; } - public void SetSettings(XmlNode settings) + public override void SetSettings(XmlNode settings) { this.Settings.SetSettings(settings); } - public float VerticalHeight { get { return this.Settings.DrawWithoutLoads ? this.InternalComponent.VerticalHeight : 0; } } - public float HorizontalWidth { get { return this.Settings.DrawWithoutLoads ? this.InternalComponent.HorizontalWidth : 0; } } - public float MinimumWidth { get { return this.InternalComponent.MinimumWidth; } } - public float MinimumHeight { get { return this.InternalComponent.MinimumHeight; } } - public float PaddingLeft { get { return this.Settings.DrawWithoutLoads ? this.InternalComponent.PaddingLeft : 0; } } - public float PaddingRight { get { return this.Settings.DrawWithoutLoads ? this.InternalComponent.PaddingRight : 0; } } - public float PaddingTop { get { return this.Settings.DrawWithoutLoads ? this.InternalComponent.PaddingTop : 0; } } - public float PaddingBottom { get { return this.Settings.DrawWithoutLoads ? this.InternalComponent.PaddingBottom : 0; } } - public void RenameComparison(string oldName, string newName) { } + public override void Update(IInvalidator invalidator, LiveSplitState state, float width, float height, LayoutMode mode) { } + public override void RenameComparison(string oldName, string newName) { } } } diff --git a/SkyrimSettings.Designer.cs b/SkyrimSettings.Designer.cs index cce91a7..acbe52c 100644 --- a/SkyrimSettings.Designer.cs +++ b/SkyrimSettings.Designer.cs @@ -33,58 +33,90 @@ private void InitializeComponent() this.tlpStartSplits = new System.Windows.Forms.TableLayoutPanel(); this.chkHelgen = new System.Windows.Forms.CheckBox(); this.chkAutoStart = new System.Windows.Forms.CheckBox(); - this.gbEndSplits = new System.Windows.Forms.GroupBox(); - this.tlpEndSplits = new System.Windows.Forms.TableLayoutPanel(); - this.chkAlduinDefeated = new System.Windows.Forms.CheckBox(); - this.chkCollege = new System.Windows.Forms.CheckBox(); + this.gbGuildsSplits = new System.Windows.Forms.GroupBox(); + this.tlpGuildsSplits = new System.Windows.Forms.TableLayoutPanel(); + this.chkCollegeOfWinterhold = 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.chkThievesGuild = new System.Windows.Forms.CheckBox(); + this.gb_AnyPercentSplits = new System.Windows.Forms.GroupBox(); + this.tlpAnyPercentSplits = new System.Windows.Forms.TableLayoutPanel(); + this.gbAnyPercentTemplate = new System.Windows.Forms.GroupBox(); + this.tlpAnyPercentTemplate = new System.Windows.Forms.TableLayoutPanel(); + this.rbMrwalrus = new System.Windows.Forms.RadioButton(); + this.rbDrtchops = new System.Windows.Forms.RadioButton(); + this.rbDalleth = new System.Windows.Forms.RadioButton(); + this.rbGr3yscale = new System.Windows.Forms.RadioButton(); + this.flp_AnyPercentSplits = new System.Windows.Forms.FlowLayoutPanel(); + this.chkWhiterun = new System.Windows.Forms.CheckBox(); + this.chkThalmorEmbassy = new System.Windows.Forms.CheckBox(); + this.chkEsbern = new System.Windows.Forms.CheckBox(); + this.chkRiverwood = new System.Windows.Forms.CheckBox(); + this.chkTheWall = new System.Windows.Forms.CheckBox(); + this.chkSeptimus = new System.Windows.Forms.CheckBox(); + this.chkMzarkTower = new System.Windows.Forms.CheckBox(); + this.chkClearSky = new System.Windows.Forms.CheckBox(); + this.chkHorseClimb = new System.Windows.Forms.CheckBox(); + this.chkCutsceneStart = new System.Windows.Forms.CheckBox(); + this.chkCutsceneEnd = new System.Windows.Forms.CheckBox(); + this.chkAlduin1 = new System.Windows.Forms.CheckBox(); + this.chkHighHrothgar = new System.Windows.Forms.CheckBox(); + this.chkSolitude = new System.Windows.Forms.CheckBox(); + this.chkWindhelm = new System.Windows.Forms.CheckBox(); + this.chkCouncil = new System.Windows.Forms.CheckBox(); + this.chkOdahviing = new System.Windows.Forms.CheckBox(); + this.chkEnterSovngarde = new System.Windows.Forms.CheckBox(); + this.chkAlduinDefeated = new System.Windows.Forms.CheckBox(); + this.llCheckAll = new System.Windows.Forms.LinkLabel(); this.tlpMain.SuspendLayout(); this.gbStartSplits.SuspendLayout(); this.tlpStartSplits.SuspendLayout(); - this.gbEndSplits.SuspendLayout(); - this.tlpEndSplits.SuspendLayout(); - this.gbDisplayAlternateTiming.SuspendLayout(); - this.tlpDisplayAlternateTiming.SuspendLayout(); + this.gbGuildsSplits.SuspendLayout(); + this.tlpGuildsSplits.SuspendLayout(); + this.gb_AnyPercentSplits.SuspendLayout(); + this.tlpAnyPercentSplits.SuspendLayout(); + this.gbAnyPercentTemplate.SuspendLayout(); + this.tlpAnyPercentTemplate.SuspendLayout(); + this.flp_AnyPercentSplits.SuspendLayout(); this.SuspendLayout(); - // + // // tlpMain - // + // + this.tlpMain.AutoSize = true; + this.tlpMain.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; this.tlpMain.ColumnCount = 1; this.tlpMain.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F)); 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.Controls.Add(this.gbGuildsSplits, 0, 2); + this.tlpMain.Controls.Add(this.gb_AnyPercentSplits, 0, 1); this.tlpMain.Dock = System.Windows.Forms.DockStyle.Top; this.tlpMain.Location = new System.Drawing.Point(0, 0); this.tlpMain.Name = "tlpMain"; - this.tlpMain.RowCount = 3; + this.tlpMain.RowCount = 4; + 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.RowStyles.Add(new System.Windows.Forms.RowStyle()); - 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.Size = new System.Drawing.Size(450, 489); this.tlpMain.TabIndex = 0; - // + // // gbStartSplits - // + // this.gbStartSplits.AutoSize = true; + this.gbStartSplits.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; this.gbStartSplits.Controls.Add(this.tlpStartSplits); this.gbStartSplits.Dock = System.Windows.Forms.DockStyle.Top; this.gbStartSplits.Location = new System.Drawing.Point(3, 3); this.gbStartSplits.Name = "gbStartSplits"; - this.gbStartSplits.Size = new System.Drawing.Size(470, 65); + this.gbStartSplits.Size = new System.Drawing.Size(444, 65); this.gbStartSplits.TabIndex = 5; this.gbStartSplits.TabStop = false; this.gbStartSplits.Text = "Start Auto-splits"; - // + // // tlpStartSplits - // + // this.tlpStartSplits.AutoSize = true; + this.tlpStartSplits.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; this.tlpStartSplits.BackColor = System.Drawing.Color.Transparent; this.tlpStartSplits.ColumnCount = 1; this.tlpStartSplits.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F)); @@ -96,11 +128,11 @@ private void InitializeComponent() this.tlpStartSplits.RowCount = 2; this.tlpStartSplits.RowStyles.Add(new System.Windows.Forms.RowStyle()); this.tlpStartSplits.RowStyles.Add(new System.Windows.Forms.RowStyle()); - this.tlpStartSplits.Size = new System.Drawing.Size(464, 46); + this.tlpStartSplits.Size = new System.Drawing.Size(438, 46); this.tlpStartSplits.TabIndex = 4; - // + // // chkHelgen - // + // this.chkHelgen.AutoSize = true; this.chkHelgen.Location = new System.Drawing.Point(3, 26); this.chkHelgen.Name = "chkHelgen"; @@ -108,9 +140,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; @@ -120,155 +152,493 @@ 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; - this.gbEndSplits.Location = new System.Drawing.Point(3, 74); - this.gbEndSplits.Name = "gbEndSplits"; - this.gbEndSplits.Size = new System.Drawing.Size(470, 134); - 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.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"; - this.tlpEndSplits.RowCount = 5; - this.tlpEndSplits.RowStyles.Add(new System.Windows.Forms.RowStyle()); - this.tlpEndSplits.RowStyles.Add(new System.Windows.Forms.RowStyle()); - this.tlpEndSplits.RowStyles.Add(new System.Windows.Forms.RowStyle()); - this.tlpEndSplits.RowStyles.Add(new System.Windows.Forms.RowStyle()); - 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; - this.chkAlduinDefeated.Location = new System.Drawing.Point(3, 3); - this.chkAlduinDefeated.Name = "chkAlduinDefeated"; - this.chkAlduinDefeated.Size = new System.Drawing.Size(160, 17); - this.chkAlduinDefeated.TabIndex = 5; - this.chkAlduinDefeated.Text = "Alduin\'s Defeat (Main Quest)"; - this.chkAlduinDefeated.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; - // + // + // gbGuildsSplits + // + this.gbGuildsSplits.AutoSize = true; + this.gbGuildsSplits.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; + this.gbGuildsSplits.Controls.Add(this.tlpGuildsSplits); + this.gbGuildsSplits.Dock = System.Windows.Forms.DockStyle.Top; + this.gbGuildsSplits.Location = new System.Drawing.Point(3, 327); + this.gbGuildsSplits.Name = "gbGuildsSplits"; + this.gbGuildsSplits.Size = new System.Drawing.Size(444, 111); + this.gbGuildsSplits.TabIndex = 7; + this.gbGuildsSplits.TabStop = false; + this.gbGuildsSplits.Text = "Guilds Auto-splits"; + // + // tlpGuildsSplits + // + this.tlpGuildsSplits.AutoSize = true; + this.tlpGuildsSplits.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; + this.tlpGuildsSplits.BackColor = System.Drawing.Color.Transparent; + this.tlpGuildsSplits.ColumnCount = 1; + this.tlpGuildsSplits.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F)); + this.tlpGuildsSplits.Controls.Add(this.chkCollegeOfWinterhold, 0, 0); + this.tlpGuildsSplits.Controls.Add(this.chkCompanions, 0, 1); + this.tlpGuildsSplits.Controls.Add(this.chkThievesGuild, 0, 3); + this.tlpGuildsSplits.Controls.Add(this.chkDarkBrotherhood, 0, 2); + this.tlpGuildsSplits.Dock = System.Windows.Forms.DockStyle.Fill; + this.tlpGuildsSplits.Location = new System.Drawing.Point(3, 16); + this.tlpGuildsSplits.Name = "tlpGuildsSplits"; + this.tlpGuildsSplits.RowCount = 4; + this.tlpGuildsSplits.RowStyles.Add(new System.Windows.Forms.RowStyle()); + this.tlpGuildsSplits.RowStyles.Add(new System.Windows.Forms.RowStyle()); + this.tlpGuildsSplits.RowStyles.Add(new System.Windows.Forms.RowStyle()); + this.tlpGuildsSplits.RowStyles.Add(new System.Windows.Forms.RowStyle()); + this.tlpGuildsSplits.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F)); + this.tlpGuildsSplits.Size = new System.Drawing.Size(438, 92); + this.tlpGuildsSplits.TabIndex = 4; + // + // chkCollegeOfWinterhold + // + this.chkCollegeOfWinterhold.AutoSize = true; + this.chkCollegeOfWinterhold.Location = new System.Drawing.Point(3, 3); + this.chkCollegeOfWinterhold.Name = "chkCollegeOfWinterhold"; + this.chkCollegeOfWinterhold.Size = new System.Drawing.Size(318, 17); + this.chkCollegeOfWinterhold.TabIndex = 10; + this.chkCollegeOfWinterhold.Text = "College of Winterhold questline completion"; + this.chkCollegeOfWinterhold.UseVisualStyleBackColor = true; + // // chkCompanions - // + // this.chkCompanions.AutoSize = true; - this.chkCompanions.Location = new System.Drawing.Point(3, 49); + this.chkCompanions.Location = new System.Drawing.Point(3, 26); 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.Text = "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.Location = new System.Drawing.Point(3, 49); 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.Text = "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; - // + // + // chkThievesGuild + // + this.chkThievesGuild.AutoSize = true; + this.chkThievesGuild.Location = new System.Drawing.Point(3, 72); + this.chkThievesGuild.Name = "chkThievesGuild"; + this.chkThievesGuild.Size = new System.Drawing.Size(284, 17); + this.chkThievesGuild.TabIndex = 9; + this.chkThievesGuild.Text = "Thieves Guild questline completion"; + this.chkThievesGuild.UseVisualStyleBackColor = true; + // + // gb_AnyPercentSplits + // + this.gb_AnyPercentSplits.AutoSize = true; + this.gb_AnyPercentSplits.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; + this.gb_AnyPercentSplits.Controls.Add(this.tlpAnyPercentSplits); + this.gb_AnyPercentSplits.Dock = System.Windows.Forms.DockStyle.Top; + this.gb_AnyPercentSplits.Location = new System.Drawing.Point(3, 74); + this.gb_AnyPercentSplits.Name = "gb_AnyPercentSplits"; + this.gb_AnyPercentSplits.Size = new System.Drawing.Size(444, 247); + this.gb_AnyPercentSplits.TabIndex = 10; + this.gb_AnyPercentSplits.TabStop = false; + this.gb_AnyPercentSplits.Text = "Any% Auto-splits"; + // + // tlpAnyPercentSplits + // + this.tlpAnyPercentSplits.AutoSize = true; + this.tlpAnyPercentSplits.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; + this.tlpAnyPercentSplits.ColumnCount = 1; + this.tlpAnyPercentSplits.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); + this.tlpAnyPercentSplits.Controls.Add(this.gbAnyPercentTemplate, 0, 0); + this.tlpAnyPercentSplits.Controls.Add(this.flp_AnyPercentSplits, 0, 2); + this.tlpAnyPercentSplits.Controls.Add(this.llCheckAll, 0, 1); + this.tlpAnyPercentSplits.Dock = System.Windows.Forms.DockStyle.Top; + this.tlpAnyPercentSplits.Location = new System.Drawing.Point(3, 16); + this.tlpAnyPercentSplits.Name = "tlpAnyPercentSplits"; + this.tlpAnyPercentSplits.RowCount = 3; + this.tlpAnyPercentSplits.RowStyles.Add(new System.Windows.Forms.RowStyle()); + this.tlpAnyPercentSplits.RowStyles.Add(new System.Windows.Forms.RowStyle()); + this.tlpAnyPercentSplits.RowStyles.Add(new System.Windows.Forms.RowStyle()); + this.tlpAnyPercentSplits.Size = new System.Drawing.Size(438, 228); + this.tlpAnyPercentSplits.TabIndex = 0; + // + // gbAnyPercentTemplate + // + this.gbAnyPercentTemplate.AutoSize = true; + this.gbAnyPercentTemplate.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; + this.gbAnyPercentTemplate.Controls.Add(this.tlpAnyPercentTemplate); + this.gbAnyPercentTemplate.Dock = System.Windows.Forms.DockStyle.Top; + this.gbAnyPercentTemplate.Location = new System.Drawing.Point(3, 3); + this.gbAnyPercentTemplate.Name = "gbAnyPercentTemplate"; + this.gbAnyPercentTemplate.Size = new System.Drawing.Size(432, 42); + this.gbAnyPercentTemplate.TabIndex = 19; + this.gbAnyPercentTemplate.TabStop = false; + this.gbAnyPercentTemplate.Text = "Split Template"; + // + // tlpAnyPercentTemplate + // + this.tlpAnyPercentTemplate.AutoSize = true; + this.tlpAnyPercentTemplate.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; + this.tlpAnyPercentTemplate.ColumnCount = 4; + this.tlpAnyPercentTemplate.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 25.00062F)); + this.tlpAnyPercentTemplate.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 25.00062F)); + this.tlpAnyPercentTemplate.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 25.00062F)); + this.tlpAnyPercentTemplate.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 24.99813F)); + this.tlpAnyPercentTemplate.Controls.Add(this.rbMrwalrus, 0, 0); + this.tlpAnyPercentTemplate.Controls.Add(this.rbDrtchops, 1, 0); + this.tlpAnyPercentTemplate.Controls.Add(this.rbDalleth, 3, 0); + this.tlpAnyPercentTemplate.Controls.Add(this.rbGr3yscale, 2, 0); + this.tlpAnyPercentTemplate.Dock = System.Windows.Forms.DockStyle.Fill; + this.tlpAnyPercentTemplate.Location = new System.Drawing.Point(3, 16); + this.tlpAnyPercentTemplate.Name = "tlpAnyPercentTemplate"; + this.tlpAnyPercentTemplate.RowCount = 1; + this.tlpAnyPercentTemplate.RowStyles.Add(new System.Windows.Forms.RowStyle()); + this.tlpAnyPercentTemplate.Size = new System.Drawing.Size(426, 23); + this.tlpAnyPercentTemplate.TabIndex = 0; + // + // rbMrwalrus + // + this.rbMrwalrus.AutoSize = true; + this.rbMrwalrus.Checked = true; + this.rbMrwalrus.Location = new System.Drawing.Point(3, 3); + this.rbMrwalrus.Name = "rbMrwalrus"; + this.rbMrwalrus.Size = new System.Drawing.Size(70, 17); + this.rbMrwalrus.TabIndex = 0; + this.rbMrwalrus.TabStop = true; + this.rbMrwalrus.Text = "MrWalrus"; + this.rbMrwalrus.UseVisualStyleBackColor = true; + this.rbMrwalrus.CheckedChanged += new System.EventHandler(this.templateRadioButtonChanged); + // + // rbDrtchops + // + this.rbDrtchops.AutoSize = true; + this.rbDrtchops.Location = new System.Drawing.Point(109, 3); + this.rbDrtchops.Name = "rbDrtchops"; + this.rbDrtchops.Size = new System.Drawing.Size(73, 17); + this.rbDrtchops.TabIndex = 1; + this.rbDrtchops.Text = "DrTChops"; + this.rbDrtchops.UseVisualStyleBackColor = true; + this.rbDrtchops.CheckedChanged += new System.EventHandler(this.templateRadioButtonChanged); + // + // rbDalleth + // + this.rbDalleth.AutoSize = true; + this.rbDalleth.Location = new System.Drawing.Point(321, 3); + this.rbDalleth.Name = "rbDalleth"; + this.rbDalleth.Size = new System.Drawing.Size(58, 17); + this.rbDalleth.TabIndex = 2; + this.rbDalleth.Text = "Dalleth"; + this.rbDalleth.UseVisualStyleBackColor = true; + this.rbDalleth.CheckedChanged += new System.EventHandler(this.templateRadioButtonChanged); + // + // rbGr3yscale + // + this.rbGr3yscale.AutoSize = true; + this.rbGr3yscale.Location = new System.Drawing.Point(215, 3); + this.rbGr3yscale.Name = "rbGr3yscale"; + this.rbGr3yscale.Size = new System.Drawing.Size(70, 17); + this.rbGr3yscale.TabIndex = 3; + this.rbGr3yscale.Text = "gr3yscale"; + this.rbGr3yscale.UseVisualStyleBackColor = true; + this.rbGr3yscale.CheckedChanged += new System.EventHandler(this.templateRadioButtonChanged); + // + // flp_AnyPercentSplits + // + this.flp_AnyPercentSplits.AutoSize = true; + this.flp_AnyPercentSplits.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; + this.flp_AnyPercentSplits.Controls.Add(this.chkWhiterun); + this.flp_AnyPercentSplits.Controls.Add(this.chkThalmorEmbassy); + this.flp_AnyPercentSplits.Controls.Add(this.chkEsbern); + this.flp_AnyPercentSplits.Controls.Add(this.chkRiverwood); + this.flp_AnyPercentSplits.Controls.Add(this.chkTheWall); + this.flp_AnyPercentSplits.Controls.Add(this.chkSeptimus); + this.flp_AnyPercentSplits.Controls.Add(this.chkMzarkTower); + this.flp_AnyPercentSplits.Controls.Add(this.chkClearSky); + this.flp_AnyPercentSplits.Controls.Add(this.chkHorseClimb); + this.flp_AnyPercentSplits.Controls.Add(this.chkCutsceneStart); + this.flp_AnyPercentSplits.Controls.Add(this.chkCutsceneEnd); + this.flp_AnyPercentSplits.Controls.Add(this.chkAlduin1); + this.flp_AnyPercentSplits.Controls.Add(this.chkHighHrothgar); + this.flp_AnyPercentSplits.Controls.Add(this.chkSolitude); + this.flp_AnyPercentSplits.Controls.Add(this.chkWindhelm); + this.flp_AnyPercentSplits.Controls.Add(this.chkCouncil); + this.flp_AnyPercentSplits.Controls.Add(this.chkOdahviing); + this.flp_AnyPercentSplits.Controls.Add(this.chkEnterSovngarde); + this.flp_AnyPercentSplits.Controls.Add(this.chkAlduinDefeated); + this.flp_AnyPercentSplits.Dock = System.Windows.Forms.DockStyle.Top; + this.flp_AnyPercentSplits.FlowDirection = System.Windows.Forms.FlowDirection.TopDown; + this.flp_AnyPercentSplits.Location = new System.Drawing.Point(3, 64); + this.flp_AnyPercentSplits.MaximumSize = new System.Drawing.Size(432, 170); + this.flp_AnyPercentSplits.Name = "flp_AnyPercentSplits"; + this.flp_AnyPercentSplits.Size = new System.Drawing.Size(432, 161); + this.flp_AnyPercentSplits.TabIndex = 21; + // + // chkWhiterun + // + this.chkWhiterun.AutoSize = true; + this.chkWhiterun.Dock = System.Windows.Forms.DockStyle.Top; + this.chkWhiterun.Location = new System.Drawing.Point(3, 3); + this.chkWhiterun.Margin = new System.Windows.Forms.Padding(3, 3, 50, 3); + this.chkWhiterun.Name = "chkWhiterun"; + this.chkWhiterun.Size = new System.Drawing.Size(109, 17); + this.chkWhiterun.TabIndex = 0; + this.chkWhiterun.Text = "Whiterun"; + this.chkWhiterun.UseVisualStyleBackColor = true; + // + // chkThalmorEmbassy + // + this.chkThalmorEmbassy.AutoSize = true; + this.chkThalmorEmbassy.Dock = System.Windows.Forms.DockStyle.Top; + this.chkThalmorEmbassy.Location = new System.Drawing.Point(3, 26); + this.chkThalmorEmbassy.Margin = new System.Windows.Forms.Padding(3, 3, 50, 3); + this.chkThalmorEmbassy.Name = "chkThalmorEmbassy"; + this.chkThalmorEmbassy.Size = new System.Drawing.Size(109, 17); + this.chkThalmorEmbassy.TabIndex = 1; + this.chkThalmorEmbassy.Text = "Thalmor Embassy"; + this.chkThalmorEmbassy.UseVisualStyleBackColor = true; + // + // chkEsbern + // + this.chkEsbern.AutoSize = true; + this.chkEsbern.Dock = System.Windows.Forms.DockStyle.Top; + this.chkEsbern.Location = new System.Drawing.Point(3, 49); + this.chkEsbern.Margin = new System.Windows.Forms.Padding(3, 3, 50, 3); + this.chkEsbern.Name = "chkEsbern"; + this.chkEsbern.Size = new System.Drawing.Size(109, 17); + this.chkEsbern.TabIndex = 6; + this.chkEsbern.Text = "Esbern in Riften"; + this.chkEsbern.UseVisualStyleBackColor = true; + // + // chkRiverwood + // + this.chkRiverwood.AutoSize = true; + this.chkRiverwood.Dock = System.Windows.Forms.DockStyle.Top; + this.chkRiverwood.Location = new System.Drawing.Point(3, 72); + this.chkRiverwood.Margin = new System.Windows.Forms.Padding(3, 3, 50, 3); + this.chkRiverwood.Name = "chkRiverwood"; + this.chkRiverwood.Size = new System.Drawing.Size(109, 17); + this.chkRiverwood.TabIndex = 7; + this.chkRiverwood.Text = "Riverwood"; + this.chkRiverwood.UseVisualStyleBackColor = true; + // + // chkTheWall + // + this.chkTheWall.AutoSize = true; + this.chkTheWall.Dock = System.Windows.Forms.DockStyle.Top; + this.chkTheWall.Location = new System.Drawing.Point(3, 95); + this.chkTheWall.Margin = new System.Windows.Forms.Padding(3, 3, 50, 3); + this.chkTheWall.Name = "chkTheWall"; + this.chkTheWall.Size = new System.Drawing.Size(109, 17); + this.chkTheWall.TabIndex = 8; + this.chkTheWall.Text = "The Wall"; + this.chkTheWall.UseVisualStyleBackColor = true; + // + // chkSeptimus + // + this.chkSeptimus.AutoSize = true; + this.chkSeptimus.Dock = System.Windows.Forms.DockStyle.Top; + this.chkSeptimus.Location = new System.Drawing.Point(3, 118); + this.chkSeptimus.Margin = new System.Windows.Forms.Padding(3, 3, 50, 3); + this.chkSeptimus.Name = "chkSeptimus"; + this.chkSeptimus.Size = new System.Drawing.Size(109, 17); + this.chkSeptimus.TabIndex = 9; + this.chkSeptimus.Text = "Septimus"; + this.chkSeptimus.UseVisualStyleBackColor = true; + // + // chkMzarkTower + // + this.chkMzarkTower.AutoSize = true; + this.chkMzarkTower.Dock = System.Windows.Forms.DockStyle.Top; + this.chkMzarkTower.Location = new System.Drawing.Point(3, 141); + this.chkMzarkTower.Margin = new System.Windows.Forms.Padding(3, 3, 50, 3); + this.chkMzarkTower.Name = "chkMzarkTower"; + this.chkMzarkTower.Size = new System.Drawing.Size(109, 17); + this.chkMzarkTower.TabIndex = 10; + this.chkMzarkTower.Text = "Mzark Tower"; + this.chkMzarkTower.UseVisualStyleBackColor = true; + // + // chkClearSky + // + this.chkClearSky.AutoSize = true; + this.chkClearSky.Dock = System.Windows.Forms.DockStyle.Top; + this.chkClearSky.Location = new System.Drawing.Point(165, 3); + this.chkClearSky.Margin = new System.Windows.Forms.Padding(3, 3, 50, 3); + this.chkClearSky.Name = "chkClearSky"; + this.chkClearSky.Size = new System.Drawing.Size(96, 17); + this.chkClearSky.TabIndex = 11; + this.chkClearSky.Text = "Clear Sky"; + this.chkClearSky.UseVisualStyleBackColor = true; + // + // chkHorseClimb + // + this.chkHorseClimb.AutoSize = true; + this.chkHorseClimb.Location = new System.Drawing.Point(165, 26); + this.chkHorseClimb.Name = "chkHorseClimb"; + this.chkHorseClimb.Size = new System.Drawing.Size(79, 17); + this.chkHorseClimb.TabIndex = 21; + this.chkHorseClimb.Text = "HorseClimb"; + this.chkHorseClimb.UseVisualStyleBackColor = true; + // + // chkCutsceneStart + // + this.chkCutsceneStart.AutoSize = true; + this.chkCutsceneStart.Dock = System.Windows.Forms.DockStyle.Top; + this.chkCutsceneStart.Location = new System.Drawing.Point(165, 49); + this.chkCutsceneStart.Margin = new System.Windows.Forms.Padding(3, 3, 50, 3); + this.chkCutsceneStart.Name = "chkCutsceneStart"; + this.chkCutsceneStart.Size = new System.Drawing.Size(96, 17); + this.chkCutsceneStart.TabIndex = 20; + this.chkCutsceneStart.Text = "Cutscene Start"; + this.chkCutsceneStart.UseVisualStyleBackColor = true; + // + // chkCutsceneEnd + // + this.chkCutsceneEnd.AutoSize = true; + this.chkCutsceneEnd.Location = new System.Drawing.Point(165, 72); + this.chkCutsceneEnd.Name = "chkCutsceneEnd"; + this.chkCutsceneEnd.Size = new System.Drawing.Size(93, 17); + this.chkCutsceneEnd.TabIndex = 22; + this.chkCutsceneEnd.Text = "Cutscene End"; + this.chkCutsceneEnd.UseVisualStyleBackColor = true; + // + // chkAlduin1 + // + this.chkAlduin1.AutoSize = true; + this.chkAlduin1.Dock = System.Windows.Forms.DockStyle.Top; + this.chkAlduin1.Location = new System.Drawing.Point(165, 95); + this.chkAlduin1.Margin = new System.Windows.Forms.Padding(3, 3, 50, 3); + this.chkAlduin1.Name = "chkAlduin1"; + this.chkAlduin1.Size = new System.Drawing.Size(96, 17); + this.chkAlduin1.TabIndex = 18; + this.chkAlduin1.Text = "Alduin 1"; + this.chkAlduin1.UseVisualStyleBackColor = true; + // + // chkHighHrothgar + // + this.chkHighHrothgar.AutoSize = true; + this.chkHighHrothgar.Dock = System.Windows.Forms.DockStyle.Top; + this.chkHighHrothgar.Location = new System.Drawing.Point(165, 118); + this.chkHighHrothgar.Margin = new System.Windows.Forms.Padding(3, 3, 50, 3); + this.chkHighHrothgar.Name = "chkHighHrothgar"; + this.chkHighHrothgar.Size = new System.Drawing.Size(96, 17); + this.chkHighHrothgar.TabIndex = 12; + this.chkHighHrothgar.Text = "High Hrothgar"; + this.chkHighHrothgar.UseVisualStyleBackColor = true; + // + // chkSolitude + // + this.chkSolitude.AutoSize = true; + this.chkSolitude.Dock = System.Windows.Forms.DockStyle.Top; + this.chkSolitude.Location = new System.Drawing.Point(165, 141); + this.chkSolitude.Margin = new System.Windows.Forms.Padding(3, 3, 50, 3); + this.chkSolitude.Name = "chkSolitude"; + this.chkSolitude.Size = new System.Drawing.Size(96, 17); + this.chkSolitude.TabIndex = 13; + this.chkSolitude.Text = "Solitude"; + this.chkSolitude.UseVisualStyleBackColor = true; + // + // chkWindhelm + // + this.chkWindhelm.AutoSize = true; + this.chkWindhelm.Dock = System.Windows.Forms.DockStyle.Top; + this.chkWindhelm.Location = new System.Drawing.Point(314, 3); + this.chkWindhelm.Margin = new System.Windows.Forms.Padding(3, 3, 50, 3); + this.chkWindhelm.Name = "chkWindhelm"; + this.chkWindhelm.Size = new System.Drawing.Size(106, 17); + this.chkWindhelm.TabIndex = 14; + this.chkWindhelm.Text = "Windhelm"; + this.chkWindhelm.UseVisualStyleBackColor = true; + // + // chkCouncil + // + this.chkCouncil.AutoSize = true; + this.chkCouncil.Dock = System.Windows.Forms.DockStyle.Top; + this.chkCouncil.Location = new System.Drawing.Point(314, 26); + this.chkCouncil.Margin = new System.Windows.Forms.Padding(3, 3, 50, 3); + this.chkCouncil.Name = "chkCouncil"; + this.chkCouncil.Size = new System.Drawing.Size(106, 17); + this.chkCouncil.TabIndex = 15; + this.chkCouncil.Text = "Council"; + this.chkCouncil.UseVisualStyleBackColor = true; + // + // chkOdahviing + // + this.chkOdahviing.AutoSize = true; + this.chkOdahviing.Dock = System.Windows.Forms.DockStyle.Top; + this.chkOdahviing.Location = new System.Drawing.Point(314, 49); + this.chkOdahviing.Margin = new System.Windows.Forms.Padding(3, 3, 50, 3); + this.chkOdahviing.Name = "chkOdahviing"; + this.chkOdahviing.Size = new System.Drawing.Size(106, 17); + this.chkOdahviing.TabIndex = 16; + this.chkOdahviing.Text = "Odahviing"; + this.chkOdahviing.UseVisualStyleBackColor = true; + // + // chkEnterSovngarde + // + this.chkEnterSovngarde.AutoSize = true; + this.chkEnterSovngarde.Dock = System.Windows.Forms.DockStyle.Top; + this.chkEnterSovngarde.Location = new System.Drawing.Point(314, 72); + this.chkEnterSovngarde.Margin = new System.Windows.Forms.Padding(3, 3, 50, 3); + this.chkEnterSovngarde.Name = "chkEnterSovngarde"; + this.chkEnterSovngarde.Size = new System.Drawing.Size(106, 17); + this.chkEnterSovngarde.TabIndex = 17; + this.chkEnterSovngarde.Text = "Enter Sovngarde"; + this.chkEnterSovngarde.UseVisualStyleBackColor = true; + // + // chkAlduinDefeated + // + this.chkAlduinDefeated.AutoSize = true; + this.chkAlduinDefeated.Checked = true; + this.chkAlduinDefeated.CheckState = System.Windows.Forms.CheckState.Checked; + this.chkAlduinDefeated.Dock = System.Windows.Forms.DockStyle.Top; + this.chkAlduinDefeated.Location = new System.Drawing.Point(314, 95); + this.chkAlduinDefeated.Margin = new System.Windows.Forms.Padding(3, 3, 50, 3); + this.chkAlduinDefeated.Name = "chkAlduinDefeated"; + this.chkAlduinDefeated.Size = new System.Drawing.Size(106, 17); + this.chkAlduinDefeated.TabIndex = 5; + this.chkAlduinDefeated.Text = "Alduin\'s Defeat"; + this.chkAlduinDefeated.UseVisualStyleBackColor = true; + // + // llCheckAll + // + this.llCheckAll.AutoSize = true; + this.llCheckAll.Dock = System.Windows.Forms.DockStyle.Right; + this.llCheckAll.Location = new System.Drawing.Point(318, 48); + this.llCheckAll.Name = "llCheckAll"; + this.llCheckAll.Size = new System.Drawing.Size(117, 13); + this.llCheckAll.TabIndex = 22; + this.llCheckAll.TabStop = true; + this.llCheckAll.Text = "Activate/Deactivate All"; + this.llCheckAll.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.llCheckAll_LinkClicked); + // // SkyrimSettings - // + // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.Controls.Add(this.tlpMain); this.Name = "SkyrimSettings"; - this.Size = new System.Drawing.Size(476, 443); + this.Size = new System.Drawing.Size(450, 487); this.tlpMain.ResumeLayout(false); this.tlpMain.PerformLayout(); this.gbStartSplits.ResumeLayout(false); this.gbStartSplits.PerformLayout(); this.tlpStartSplits.ResumeLayout(false); this.tlpStartSplits.PerformLayout(); - this.gbEndSplits.ResumeLayout(false); - 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.gbGuildsSplits.ResumeLayout(false); + this.gbGuildsSplits.PerformLayout(); + this.tlpGuildsSplits.ResumeLayout(false); + this.tlpGuildsSplits.PerformLayout(); + this.gb_AnyPercentSplits.ResumeLayout(false); + this.gb_AnyPercentSplits.PerformLayout(); + this.tlpAnyPercentSplits.ResumeLayout(false); + this.tlpAnyPercentSplits.PerformLayout(); + this.gbAnyPercentTemplate.ResumeLayout(false); + this.gbAnyPercentTemplate.PerformLayout(); + this.tlpAnyPercentTemplate.ResumeLayout(false); + this.tlpAnyPercentTemplate.PerformLayout(); + this.flp_AnyPercentSplits.ResumeLayout(false); + this.flp_AnyPercentSplits.PerformLayout(); this.ResumeLayout(false); + this.PerformLayout(); } @@ -276,18 +646,43 @@ private void InitializeComponent() private System.Windows.Forms.TableLayoutPanel tlpMain; private System.Windows.Forms.GroupBox gbStartSplits; - private System.Windows.Forms.GroupBox gbEndSplits; - private System.Windows.Forms.TableLayoutPanel tlpEndSplits; + private System.Windows.Forms.GroupBox gbGuildsSplits; + private System.Windows.Forms.TableLayoutPanel tlpGuildsSplits; private System.Windows.Forms.CheckBox chkAlduinDefeated; private System.Windows.Forms.TableLayoutPanel tlpStartSplits; private System.Windows.Forms.CheckBox chkHelgen; private System.Windows.Forms.CheckBox chkAutoStart; - private System.Windows.Forms.CheckBox chkDarkBrotherhood; + private System.Windows.Forms.CheckBox chkCollegeOfWinterhold; private System.Windows.Forms.CheckBox chkCompanions; - private System.Windows.Forms.CheckBox chkDisplayWithoutLoads; + private System.Windows.Forms.CheckBox chkDarkBrotherhood; private System.Windows.Forms.CheckBox chkThievesGuild; - private System.Windows.Forms.CheckBox chkCollege; - private System.Windows.Forms.GroupBox gbDisplayAlternateTiming; - private System.Windows.Forms.TableLayoutPanel tlpDisplayAlternateTiming; + private System.Windows.Forms.GroupBox gb_AnyPercentSplits; + private System.Windows.Forms.TableLayoutPanel tlpAnyPercentSplits; + private System.Windows.Forms.CheckBox chkWhiterun; + private System.Windows.Forms.CheckBox chkThalmorEmbassy; + private System.Windows.Forms.CheckBox chkEsbern; + private System.Windows.Forms.CheckBox chkRiverwood; + private System.Windows.Forms.CheckBox chkTheWall; + private System.Windows.Forms.CheckBox chkSeptimus; + private System.Windows.Forms.CheckBox chkMzarkTower; + private System.Windows.Forms.CheckBox chkClearSky; + private System.Windows.Forms.CheckBox chkHighHrothgar; + private System.Windows.Forms.CheckBox chkSolitude; + private System.Windows.Forms.CheckBox chkWindhelm; + private System.Windows.Forms.CheckBox chkCouncil; + private System.Windows.Forms.CheckBox chkOdahviing; + private System.Windows.Forms.CheckBox chkEnterSovngarde; + private System.Windows.Forms.CheckBox chkAlduin1; + private System.Windows.Forms.RadioButton rbMrwalrus; + private System.Windows.Forms.RadioButton rbDrtchops; + private System.Windows.Forms.GroupBox gbAnyPercentTemplate; + private System.Windows.Forms.TableLayoutPanel tlpAnyPercentTemplate; + private System.Windows.Forms.RadioButton rbDalleth; + private System.Windows.Forms.CheckBox chkCutsceneStart; + private System.Windows.Forms.FlowLayoutPanel flp_AnyPercentSplits; + private System.Windows.Forms.LinkLabel llCheckAll; + private System.Windows.Forms.RadioButton rbGr3yscale; + private System.Windows.Forms.CheckBox chkHorseClimb; + private System.Windows.Forms.CheckBox chkCutsceneEnd; } } diff --git a/SkyrimSettings.cs b/SkyrimSettings.cs index ea79068..707d27f 100644 --- a/SkyrimSettings.cs +++ b/SkyrimSettings.cs @@ -7,46 +7,122 @@ namespace LiveSplit.Skyrim { public partial class SkyrimSettings : UserControl { - public bool DrawWithoutLoads { get; set; } public bool AutoStart { get; set; } public bool AlduinDefeated { get; set; } public bool Helgen { get; set; } - public bool DarkBrotherhood { get; set; } + public bool Whiterun { get; set; } + public bool ThalmorEmbassy { get; set; } + public bool Esbern { get; set; } + public bool Riverwood { get; set; } + public bool TheWall { get; set; } + public bool Septimus { get; set; } + public bool MzarkTower { get; set; } + public bool ClearSky { get; set; } + public bool HorseClimb { get; set; } + public bool CutsceneStart { get; set; } + public bool CutsceneEnd { get; set; } + public bool Alduin1 { get; set; } + public bool HighHrothgar{ get; set; } + public bool Solitude { get; set; } + public bool Windhelm { get; set; } + public bool Council { get; set; } + public bool Odahviing { get; set; } + public bool EnterSovngarde{ get; set; } + public bool CollegeOfWinterhold { get; set; } public bool Companions { get; set; } + public bool DarkBrotherhood { get; set; } public bool ThievesGuild { get; set; } - public bool CollegeOfWinterhold { get; set; } + public string AnyPercentTemplate { get; set; } + + public const string TEMPLATE_MRWALRUS = "MrWalrus"; + public const string TEMPLATE_DRTCHOPS = "DrTChops"; + public const string TEMPLATE_GR3YSCALE = "gr3yscale"; + public const string TEMPLATE_DALLETH = "Dalleth"; - 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_DARKBROTHERHOOD = false; + private const bool DEFAULT_WHITERUN = false; + private const bool DEFAULT_THALMOREMBASSY = false; + private const bool DEFAULT_ESBERN = false; + private const bool DEFAULT_RIVERWOOD = false; + private const bool DEFAULT_THEWALL = false; + private const bool DEFAULT_SEPTIMUS = false; + private const bool DEFAULT_MZARKTOWER = false; + private const bool DEFAULT_CLEARSKY = false; + private const bool DEFAULT_HORSECLIMB = false; + private const bool DEFAULT_CUTSCENESTART = false; + private const bool DEFAULT_CUTSCENEEND = false; + private const bool DEFAULT_ALDUIN1 = false; + private const bool DEFAULT_HIGHHROTHGAR = false; + private const bool DEFAULT_SOLITUDE = false; + private const bool DEFAULT_WINDHELM = false; + private const bool DEFAULT_COUNCIL = false; + private const bool DEFAULT_ODAHVIING = false; + private const bool DEFAULT_ENTERSOVNGARDE = false; + private const bool DEFAULT_COLLEGEOFWINTERHOLD = false; private const bool DEFAULT_COMPANIONS = false; + private const bool DEFAULT_DARKBROTHERHOOD = false; private const bool DEFAULT_THIEVESGUILD = false; - private const bool DEFAULT_COLLEGEOFWINTERHOLD = false; + private const string DEFAULT_ANYPERCENTTEMPLATE = TEMPLATE_MRWALRUS; public SkyrimSettings() { InitializeComponent(); - this.chkDisplayWithoutLoads.DataBindings.Add("Checked", this, "DrawWithoutLoads", false, DataSourceUpdateMode.OnPropertyChanged); 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.chkDarkBrotherhood.DataBindings.Add("Checked", this, "DarkBrotherhood", false, DataSourceUpdateMode.OnPropertyChanged); + this.chkWhiterun.DataBindings.Add("Checked", this, "Whiterun", false, DataSourceUpdateMode.OnPropertyChanged); + this.chkThalmorEmbassy.DataBindings.Add("Checked", this, "ThalmorEmbassy", false, DataSourceUpdateMode.OnPropertyChanged); + this.chkEsbern.DataBindings.Add("Checked", this, "Esbern", false, DataSourceUpdateMode.OnPropertyChanged); + this.chkRiverwood.DataBindings.Add("Checked", this, "Riverwood", false, DataSourceUpdateMode.OnPropertyChanged); + this.chkTheWall.DataBindings.Add("Checked", this, "TheWall", false, DataSourceUpdateMode.OnPropertyChanged); + this.chkSeptimus.DataBindings.Add("Checked", this, "Septimus", false, DataSourceUpdateMode.OnPropertyChanged); + this.chkMzarkTower.DataBindings.Add("Checked", this, "MzarkTower", false, DataSourceUpdateMode.OnPropertyChanged); + this.chkClearSky.DataBindings.Add("Checked", this, "ClearSky", false, DataSourceUpdateMode.OnPropertyChanged); + this.chkHorseClimb.DataBindings.Add("Checked", this, "HorseClimb", false, DataSourceUpdateMode.OnPropertyChanged); + this.chkCutsceneStart.DataBindings.Add("Checked", this, "CutsceneStart", false, DataSourceUpdateMode.OnPropertyChanged); + this.chkCutsceneEnd.DataBindings.Add("Checked", this, "CutsceneEnd", false, DataSourceUpdateMode.OnPropertyChanged); + this.chkAlduin1.DataBindings.Add("Checked", this, "Alduin1", false, DataSourceUpdateMode.OnPropertyChanged); + this.chkHighHrothgar.DataBindings.Add("Checked", this, "HighHrothgar", false, DataSourceUpdateMode.OnPropertyChanged); + this.chkSolitude.DataBindings.Add("Checked", this, "Solitude", false, DataSourceUpdateMode.OnPropertyChanged); + this.chkWindhelm.DataBindings.Add("Checked", this, "Windhelm", false, DataSourceUpdateMode.OnPropertyChanged); + this.chkCouncil.DataBindings.Add("Checked", this, "Council", false, DataSourceUpdateMode.OnPropertyChanged); + this.chkOdahviing.DataBindings.Add("Checked", this, "Odahviing", false, DataSourceUpdateMode.OnPropertyChanged); + this.chkEnterSovngarde.DataBindings.Add("Checked", this, "EnterSovngarde", false, DataSourceUpdateMode.OnPropertyChanged); + this.chkCollegeOfWinterhold.DataBindings.Add("Checked", this, "CollegeOfWinterhold", false, DataSourceUpdateMode.OnPropertyChanged); this.chkCompanions.DataBindings.Add("Checked", this, "Companions", false, DataSourceUpdateMode.OnPropertyChanged); + this.chkDarkBrotherhood.DataBindings.Add("Checked", this, "DarkBrotherhood", 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.DarkBrotherhood = DEFAULT_DARKBROTHERHOOD; - this.Companions = DEFAULT_COMPANIONS; + this.Whiterun = DEFAULT_WHITERUN; + this.ThalmorEmbassy = DEFAULT_THALMOREMBASSY; + this.Esbern = DEFAULT_ESBERN; + this.Riverwood = DEFAULT_RIVERWOOD; + this.TheWall = DEFAULT_THEWALL; + this.Septimus = DEFAULT_SEPTIMUS; + this.MzarkTower = DEFAULT_MZARKTOWER; + this.ClearSky = DEFAULT_CLEARSKY; + this.HorseClimb = DEFAULT_HORSECLIMB; + this.CutsceneStart = DEFAULT_CUTSCENESTART; + this.CutsceneEnd = DEFAULT_CUTSCENEEND; + this.Alduin1 = DEFAULT_ALDUIN1; + this.HighHrothgar = DEFAULT_HIGHHROTHGAR; + this.Solitude = DEFAULT_SOLITUDE; + this.Windhelm = DEFAULT_WINDHELM; + this.Council = DEFAULT_COUNCIL; + this.Odahviing = DEFAULT_ODAHVIING; + this.EnterSovngarde = DEFAULT_ENTERSOVNGARDE; this.CollegeOfWinterhold = DEFAULT_COLLEGEOFWINTERHOLD; + this.Companions = DEFAULT_COMPANIONS; + this.DarkBrotherhood = DEFAULT_DARKBROTHERHOOD; this.ThievesGuild = DEFAULT_THIEVESGUILD; + this.AnyPercentTemplate = DEFAULT_ANYPERCENTTEMPLATE; } public XmlNode GetSettings(XmlDocument doc) @@ -55,28 +131,83 @@ public XmlNode GetSettings(XmlDocument doc) settingsNode.AppendChild(ToElement(doc, "Version", Assembly.GetExecutingAssembly().GetName().Version.ToString(3))); - settingsNode.AppendChild(ToElement(doc, "DrawWithoutLoads", this.DrawWithoutLoads)); 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, "DarkBrotherhood", this.DarkBrotherhood)); + settingsNode.AppendChild(ToElement(doc, "Whiterun", this.Whiterun)); + settingsNode.AppendChild(ToElement(doc, "ThalmorEmbassy", this.ThalmorEmbassy)); + settingsNode.AppendChild(ToElement(doc, "Esbern", this.Esbern)); + settingsNode.AppendChild(ToElement(doc, "Riverwood", this.Riverwood)); + settingsNode.AppendChild(ToElement(doc, "TheWall", this.TheWall)); + settingsNode.AppendChild(ToElement(doc, "Septimus", this.Septimus)); + settingsNode.AppendChild(ToElement(doc, "MzarkTower", this.MzarkTower)); + settingsNode.AppendChild(ToElement(doc, "ClearSky", this.ClearSky)); + settingsNode.AppendChild(ToElement(doc, "HorseClimb", this.HorseClimb)); + settingsNode.AppendChild(ToElement(doc, "CutsceneStart", this.CutsceneStart)); + settingsNode.AppendChild(ToElement(doc, "CutsceneEnd", this.CutsceneEnd)); + settingsNode.AppendChild(ToElement(doc, "Alduin1", this.Alduin1)); + settingsNode.AppendChild(ToElement(doc, "HighHrothgar", this.HighHrothgar)); + settingsNode.AppendChild(ToElement(doc, "Solitude", this.Solitude)); + settingsNode.AppendChild(ToElement(doc, "Windhelm", this.Windhelm)); + settingsNode.AppendChild(ToElement(doc, "Council", this.Council)); + settingsNode.AppendChild(ToElement(doc, "Odahviing", this.Odahviing)); + settingsNode.AppendChild(ToElement(doc, "EnterSovngarde", this.EnterSovngarde)); + settingsNode.AppendChild(ToElement(doc, "CollegeOfWinterhold", this.CollegeOfWinterhold)); settingsNode.AppendChild(ToElement(doc, "Companions", this.Companions)); + settingsNode.AppendChild(ToElement(doc, "DarkBrotherhood", this.DarkBrotherhood)); settingsNode.AppendChild(ToElement(doc, "ThievesGuild", this.ThievesGuild)); - settingsNode.AppendChild(ToElement(doc, "CollegeOfWinterhold", this.CollegeOfWinterhold)); + settingsNode.AppendChild(ToElement(doc, "AnyPercentTemplate", this.AnyPercentTemplate)); return settingsNode; } public void SetSettings(XmlNode settings) { - this.DrawWithoutLoads = ParseBool(settings, "DrawWithoutLoads", DEFAULT_DRAWWITHOUTLOADS); + var element = (XmlElement)settings; + this.AutoStart = ParseBool(settings, "AutoStart", DEFAULT_AUTOSTART); this.AlduinDefeated = ParseBool(settings, "AlduinDefeated", DEFAULT_ALDUINDEFEATED); this.Helgen = ParseBool(settings, "Helgen", DEFAULT_HELGEN); - this.DarkBrotherhood = ParseBool(settings, "DarkBrotherhood", DEFAULT_DARKBROTHERHOOD); + this.Whiterun = ParseBool(settings, "Whiterun", DEFAULT_WHITERUN); + this.ThalmorEmbassy = ParseBool(settings, "ThalmorEmbassy", DEFAULT_THALMOREMBASSY); + this.Esbern = ParseBool(settings, "Esbern", DEFAULT_ESBERN); + this.Riverwood = ParseBool(settings, "Riverwood", DEFAULT_RIVERWOOD); + this.TheWall = ParseBool(settings, "TheWall", DEFAULT_THEWALL); + this.Septimus = ParseBool(settings, "Septimus", DEFAULT_SEPTIMUS); + this.MzarkTower = ParseBool(settings, "MzarkTower", DEFAULT_RIVERWOOD); + this.ClearSky = ParseBool(settings, "ClearSky", DEFAULT_CLEARSKY); + this.HorseClimb = ParseBool(settings, "HorseClimb", DEFAULT_HORSECLIMB); + this.CutsceneStart = ParseBool(settings, "CutsceneStart", DEFAULT_CUTSCENESTART); + this.CutsceneEnd = ParseBool(settings, "CutsceneEnd", DEFAULT_CUTSCENEEND); + this.Alduin1 = ParseBool(settings, "Alduin1", DEFAULT_ALDUIN1); + this.HighHrothgar = ParseBool(settings, "HighHrothgar", DEFAULT_HIGHHROTHGAR); + this.Solitude = ParseBool(settings, "Solitude", DEFAULT_SOLITUDE); + this.Windhelm = ParseBool(settings, "Windhelm", DEFAULT_WINDHELM); + this.Council = ParseBool(settings, "Council", DEFAULT_COUNCIL); + this.Odahviing = ParseBool(settings, "Odahviing", DEFAULT_ODAHVIING); + this.EnterSovngarde = ParseBool(settings, "EnterSovngarde", DEFAULT_ENTERSOVNGARDE); + this.CollegeOfWinterhold = ParseBool(settings, "CollegeOfWinterhold", DEFAULT_COLLEGEOFWINTERHOLD); this.Companions = ParseBool(settings, "Companions", DEFAULT_COMPANIONS); + this.DarkBrotherhood = ParseBool(settings, "DarkBrotherhood", DEFAULT_DARKBROTHERHOOD); this.ThievesGuild = ParseBool(settings, "ThievesGuild", DEFAULT_THIEVESGUILD); - this.CollegeOfWinterhold = ParseBool(settings, "CollegeOfWinterhold", DEFAULT_COLLEGEOFWINTERHOLD); + + if (element["AnyPercentTemplate"] != null) + { + this.AnyPercentTemplate = element["AnyPercentTemplate"].InnerText.Equals(TEMPLATE_MRWALRUS) || element["AnyPercentTemplate"].InnerText.Equals(TEMPLATE_DRTCHOPS) || + element["AnyPercentTemplate"].InnerText.Equals(TEMPLATE_GR3YSCALE) || element["AnyPercentTemplate"].InnerText.Equals(TEMPLATE_DALLETH) + ? element["AnyPercentTemplate"].InnerText + : DEFAULT_ANYPERCENTTEMPLATE; + } + else + { + this.AnyPercentTemplate = DEFAULT_ANYPERCENTTEMPLATE; + } + + this.rbMrwalrus.Checked = this.AnyPercentTemplate == TEMPLATE_MRWALRUS; + this.rbDrtchops.Checked = this.AnyPercentTemplate == TEMPLATE_DRTCHOPS; + this.rbGr3yscale.Checked = this.AnyPercentTemplate == TEMPLATE_GR3YSCALE; + this.rbDalleth.Checked = this.AnyPercentTemplate == TEMPLATE_DALLETH; + UpdateTemplate(); } static bool ParseBool(XmlNode settings, string setting, bool default_ = false) @@ -93,5 +224,76 @@ static XmlElement ToElement(XmlDocument document, string name, T value) str.InnerText = value.ToString(); return str; } + + private void UpdateTemplate() + { + if (rbMrwalrus.Checked) + { + this.AnyPercentTemplate = TEMPLATE_MRWALRUS; + } + else if (rbDrtchops.Checked) + { + this.AnyPercentTemplate = TEMPLATE_DRTCHOPS; + } + else if (rbDalleth.Checked) + { + this.AnyPercentTemplate = TEMPLATE_DALLETH; + } + else if (rbGr3yscale.Checked) + { + this.AnyPercentTemplate = TEMPLATE_GR3YSCALE; + } + this.chkHorseClimb.Enabled = this.AnyPercentTemplate == TEMPLATE_GR3YSCALE; + this.chkCutsceneStart.Enabled = (this.AnyPercentTemplate == TEMPLATE_DRTCHOPS || this.AnyPercentTemplate == TEMPLATE_DALLETH); + this.chkCutsceneEnd.Enabled = (this.AnyPercentTemplate == TEMPLATE_GR3YSCALE || this.AnyPercentTemplate == TEMPLATE_DALLETH); + } + + private void templateRadioButtonChanged(object sender, EventArgs e) + { + UpdateTemplate(); + } + + private void llCheckAll_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) + { + if (!AreAllEnabledCheckboxChecked(flp_AnyPercentSplits.Controls)) + { + checkAll(flp_AnyPercentSplits.Controls); + } + else + { + checkAll(flp_AnyPercentSplits.Controls, false); + } + } + + private bool AreAllEnabledCheckboxChecked(ControlCollection collection, bool state = true) + { + foreach (Control c in collection) + { + if (c.GetType().Equals(typeof(CheckBox))) + { + CheckBox checkBox = (CheckBox)c; + if (checkBox.Checked != state && checkBox.Enabled) + { + return false; + } + } + } + return true; + } + + private void checkAll(ControlCollection collection, bool state = true) + { + foreach (Control c in collection) + { + if (c.GetType().Equals(typeof(CheckBox))) + { + CheckBox checkBox = (CheckBox)c; + if (checkBox.Checked != state && checkBox.Enabled) + { + checkBox.Checked = state; + } + } + } + } } } diff --git a/config/TESV.CT b/config/TESV.CT index d84b5c9..bf4539e 100644 --- a/config/TESV.CT +++ b/config/TESV.CT @@ -2,41 +2,121 @@ - 0 - "isPaused" - + 52 + "Location" + 80000008 - Byte -
"TESV.exe"+172E85F
-
- - 1 - "isLoading" - - 80000008 - Byte -
"TESV.exe"+17337CC
-
- - 3 - "isLoadscreen" - - 80000008 - Byte -
"TESV.exe"+EE3561
+ 1 + + + 9 + "X world coord" + + 80000008 + 4 Bytes +
"TESV.exe"+0172E864
+ + 64 + +
+ + 11 + "Y world coord" + + 80000008 + 4 Bytes +
"TESV.exe"+0172E864
+ + 68 + +
+ + 26 + "Location ID" + + 1 + 80000008 + 4 Bytes +
"TESV.exe"+01738308
+ + EC + 670 + 78 + 4 + +
+ + 18 + "isInTamriel" + + 80000008 + Byte +
TESV.exe+173815C
+
+
- 5 - "IsInFadeOut" - + 53 + "Game state" + 80000008 - Byte -
TESV.exe+172EE2E
+ 1 + + 1 + "isLoading" + + 80000008 + Byte +
"TESV.exe"+17337CC
+
+ + 3 + "isLoadscreen" + + 80000008 + Byte +
"TESV.exe"+EE3561
+
+ + 5 + "IsInFadeOut" + + 80000008 + Byte +
TESV.exe+172EE2E
+
+ + 27 + "isInEscapeMenu" + + 80000008 + Byte +
TESV.exe+172E85E
+
+ + 0 + "isPaused" + + 80000008 + Byte +
"TESV.exe"+172E85F
+
+ + 58 + "ArePlayerControlsDisabled" + + 80000008 + Byte +
TESV.exe+172EF30
+ + F + +
4 "AreHandsTied?" - + 80000008 Byte
TESV.exe+172EE2C
@@ -44,121 +124,3417 @@
- 12 - "IsAlduinDead?" - + 48 + "Ingame Stats" + 80000008 - Byte -
TESV.exe+1711608
-
- - 9 - "X world coord" - - 80000008 - 4 Bytes -
"TESV.exe"+0172E864
- - 64 - -
- - 11 - "Y world coord" - - 80000008 - 4 Bytes -
"TESV.exe"+0172E864
- - 68 - + 1 + + + 51 + "General" + + 80000008 + 1 + + + 47 + "locationsDiscovered" + + 80000008 + 4 Bytes +
"TESV.exe"+00EE6C34
+ + 170 + +
+
+
+ + 49 + "Quest" + + 80000008 + 1 + + + 38 + "mainQuestsCompleted" + + 80000008 + 4 Bytes +
"TESV.exe"+00EE6C34
+ + 350 + +
+ + 29 + "collegeOfWinterholdQuestsCompleted" + + 80000008 + 4 Bytes +
"TESV.exe"+00EE6C34
+ + 38C + +
+ + 28 + "companionsQuestsCompleted" + + 80000008 + 4 Bytes +
"TESV.exe"+00EE6C34
+ + 378 + +
+ + 31 + "darkBrotherhoodQuestsCompleted" + + 80000008 + 4 Bytes +
"TESV.exe"+00EE6C34
+ + 3B4 + +
+ + 34 + "thievesGuildQuestsCompleted" + + 80000008 + 4 Bytes +
"TESV.exe"+00EE6C34
+ + 3A0 + +
+ + 20 + "questLinesCompleted" + + 80000008 + 4 Bytes +
"TESV.exe"+00EE6C34
+ + 3F0 + +
+
+
+ + 50 + "Magic" + + 80000008 + 1 + + + 41 + "wordsOfPowerLearned" + + 80000008 + 4 Bytes +
"TESV.exe"+00EE6C34
+ + 558 + +
+
+
+
- 18 - "isInTamriel" - + 12 + "IsAlduinDead?" + 80000008 Byte -
TESV.exe+173815C
+
TESV.exe+1711608
- 20 - "questLinesCompleted" + 43 + "Alduin 1 health" 80000008 - 4 Bytes -
"TESV.exe"+00EE6C34
+ Float +
"TESV.exe"+00F41764
- 3F0 + 1C + 30 + 30 + 74
- 26 - "Location ID" + 45 + "Alduin 2 health" - 1 80000008 - 4 Bytes -
"TESV.exe"+01738308
+ Float +
"TESV.exe"+00F5F0F4
- EC - 670 - 78 - 4 + 1C + 30 + 30 + 74
- 27 - "isInEscapeMenu" - + 36 + "IslastDialogue???" + 80000008 Byte -
TESV.exe+172E85E
-
- - 28 - "companionsQuestsCompleted" - - 80000008 - 4 Bytes -
"TESV.exe"+00EE6C34
- - 378 - -
- - 29 - "collegeQuestsCompleted" - - 80000008 - 4 Bytes -
"TESV.exe"+00EE6C34
- - 38C - -
- - 31 - "darkBrotherhoodQuestsCompleted" - - 80000008 - 4 Bytes -
"TESV.exe"+00EE6C34
- - 3B4 - -
- - 34 - "thievesGuildQuestsCompleted" - - 80000008 - 4 Bytes -
"TESV.exe"+00EE6C34
- - 3A0 - +
TESV.exe+1732BF2
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +