diff --git a/SCANassets/SCANsat.version b/SCANassets/SCANsat.version index 0bded6139..e15b29246 100644 --- a/SCANassets/SCANsat.version +++ b/SCANassets/SCANsat.version @@ -11,21 +11,21 @@ "MAJOR":1, "MINOR":1, "PATCH":4, - "BUILD":2 + "BUILD":3 }, "KSP_VERSION":{ "MAJOR":1, "MINOR":0, - "PATCH":4 + "PATCH":5 }, "KSP_VERSION_MIN":{ "MAJOR":1, "MINOR":0, - "PATCH":2 + "PATCH":5 }, "KSP_VERSION_MAX":{ "MAJOR":1, "MINOR":0, - "PATCH":4 + "PATCH":5 } } diff --git a/SCANmechjeb/Properties/AssemblyInfo.cs b/SCANmechjeb/Properties/AssemblyInfo.cs index 5ef8b46f7..8fbc3b671 100644 --- a/SCANmechjeb/Properties/AssemblyInfo.cs +++ b/SCANmechjeb/Properties/AssemblyInfo.cs @@ -32,9 +32,9 @@ // 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.0.2")] -[assembly: AssemblyFileVersion("1.4.0.2")] -[assembly: AssemblyInformationalVersion ("v14.2")] +[assembly: AssemblyVersion("1.4.0.3")] +[assembly: AssemblyFileVersion("1.4.0.3")] +[assembly: AssemblyInformationalVersion ("v14.3")] [assembly: KSPAssembly ("SCANmechjeb", 0, 3)] [assembly: KSPAssemblyDependency ("SCANsat", 1, 4)] diff --git a/SCANsat/CHANGELOG.txt b/SCANsat/CHANGELOG.txt index 18afc3114..dc9af413d 100644 --- a/SCANsat/CHANGELOG.txt +++ b/SCANsat/CHANGELOG.txt @@ -1,3 +1,25 @@ +Version 14.3 - 2015-11-10 +------------------------ +- Update for KSP 1.0.5 + +- In-Game Help Function + - Help section for Settings window, Resource Settings window, and Color Selection window + - Activate help mode with the question mark button in the top right + +- Localization project + - All help function strings are included in a config file + - Local translations can be added to this file to replace the English text + +- Misc and Bug Fixes + - Fix bug while switching vessels from the small map vessel list + - Fix planetary overlay tooltips while in the tracking station + - Fix a potential loading error + - Fix bug generating terrain height maps on planets with PQS errors; prevents endless NRE spam + - Fix some problems with the background terrain height map generator + - Power usage works correctly up to 10000X time warp, instead of 1000X + - Remove debug log messages during planetary overlay map generation + - Change the default anomaly marker and close box icons to standard text + Version 14.2 - 2015-8-29 ------------------------ diff --git a/SCANsat/Properties/AssemblyInfo.cs b/SCANsat/Properties/AssemblyInfo.cs index 7ed058665..4631822db 100644 --- a/SCANsat/Properties/AssemblyInfo.cs +++ b/SCANsat/Properties/AssemblyInfo.cs @@ -14,9 +14,9 @@ // The assembly version has the format "{Major}.{Minor}.{Build}.{Revision}". // The form "{Major}.{Minor}.*" will automatically update the build and revision, // and "{Major}.{Minor}.{Build}.*" will update just the revision. -[assembly: AssemblyVersion ("1.4.0.2")] -[assembly: AssemblyFileVersion ("1.4.0.2")] -[assembly: AssemblyInformationalVersion ("v14.2")] +[assembly: AssemblyVersion ("1.4.0.3")] +[assembly: AssemblyFileVersion ("1.4.0.3")] +[assembly: AssemblyInformationalVersion ("v14.3")] [assembly: KSPAssembly ("SCANsat", 1, 4)] diff --git a/SCANsat/SCAN_Data/SCANdata.cs b/SCANsat/SCAN_Data/SCANdata.cs index 9d07cea33..f4d807265 100644 --- a/SCANsat/SCAN_Data/SCANdata.cs +++ b/SCANsat/SCAN_Data/SCANdata.cs @@ -36,7 +36,7 @@ public class SCANdata private Int32[,] coverage; private CelestialBody body; private SCANterrainConfig terrainConfig; - private bool building, externalBuilding, built; + private bool mapBuilding, overlayBuilding, controllerBuilding, built; private float[,] tempHeightMap; @@ -96,6 +96,9 @@ public float HeightMapValue(int i, int lon, int lat, bool useTemp = false) if (body.pqsController == null) return 0; + if (heightMaps[i].Length < 10) + return 0; + return heightMaps[i][lon, lat]; } @@ -116,16 +119,22 @@ public bool Disabled internal set { disabled = value; } } - public bool Building + public bool MapBuilding + { + get { return mapBuilding; } + internal set { mapBuilding = value; } + } + + public bool OverlayBuilding { - get { return building; } - internal set { building = value; } + get { return overlayBuilding; } + internal set { overlayBuilding = value; } } - public bool ExternalBuilding + public bool ControllerBuilding { - get { return externalBuilding; } - internal set { externalBuilding = value; } + get { return controllerBuilding; } + internal set { controllerBuilding = value; } } public bool Built @@ -247,7 +256,7 @@ public List Waypoints if (orbit == null) continue; - if (orbit.targetBody == body) + if (orbit.TargetBody == body) { for (int j = 0; j < stationary[i].AllParameters.Count(); j++) { @@ -377,13 +386,33 @@ internal void generateHeightMap(ref int step, ref int xStart, int width) if (body.pqsController == null) { built = true; - building = false; - externalBuilding = false; + mapBuilding = false; + overlayBuilding = false; + controllerBuilding = false; if (!heightMaps.ContainsKey(body.flightGlobalsIndex)) heightMaps.Add(body.flightGlobalsIndex, new float[1, 1]); return; } + if (step <= 0) + { + try + { + double d = SCANUtil.getElevation(body, 0, 0); + } + catch (Exception e) + { + Debug.LogError("[SCANsat] Error In Detecting Terrain Height Map; Stopping Height Map Generator\n" + e); + built = true; + mapBuilding = false; + overlayBuilding = false; + controllerBuilding = false; + if (!heightMaps.ContainsKey(body.flightGlobalsIndex)) + heightMaps.Add(body.flightGlobalsIndex, new float[1, 1]); + return; + } + } + if (tempHeightMap == null) { tempHeightMap = new float[360, 180]; @@ -394,8 +423,9 @@ internal void generateHeightMap(ref int step, ref int xStart, int width) step = 0; xStart = 0; built = true; - building = false; - externalBuilding = false; + mapBuilding = false; + overlayBuilding = false; + controllerBuilding = false; if (!heightMaps.ContainsKey(body.flightGlobalsIndex)) heightMaps.Add(body.flightGlobalsIndex, tempHeightMap); tempHeightMap = null; diff --git a/SCANsat/SCAN_Data/SCANwaypoint.cs b/SCANsat/SCAN_Data/SCANwaypoint.cs index dec8b376b..393f4e00c 100644 --- a/SCANsat/SCAN_Data/SCANwaypoint.cs +++ b/SCANsat/SCAN_Data/SCANwaypoint.cs @@ -23,7 +23,7 @@ public class SCANwaypoint { internal SCANwaypoint(SurveyWaypointParameter p) { - way = reflectWaypoint(p); + way = p.wp; if (way != null) { band = reflectFlightBand(p); @@ -127,14 +127,6 @@ public bool LandingTarget get { return landingTarget; } } - private Waypoint reflectWaypoint(SurveyWaypointParameter p) - { - if (SCANmainMenuLoader.FinePrintWaypoint) - return SCANreflection.FinePrintWaypointObject(p); - - return null; - } - private Waypoint reflectWaypoint(StationaryPointParameter p) { if (SCANmainMenuLoader.FinePrintStationaryWaypoint) diff --git a/SCANsat/SCAN_PartModules/SCANsat.cs b/SCANsat/SCAN_PartModules/SCANsat.cs index e986280c0..7f63ec9cd 100644 --- a/SCANsat/SCAN_PartModules/SCANsat.cs +++ b/SCANsat/SCAN_PartModules/SCANsat.cs @@ -112,7 +112,10 @@ public override void OnUpdate() Events["stopScan"].active = scanning; if (sensorType != 32) Fields["alt_indicator"].guiActive = scanning; + } + public override void OnFixedUpdate() + { if (powerIsProblem) { addStatic(); @@ -130,9 +133,9 @@ public override void OnUpdate() { if (sensorType != 0 || SCANcontroller.controller.isVesselKnown(vessel.id, (SCANtype)sensorType)) { - if (TimeWarp.CurrentRate < 1500) + if (TimeWarp.CurrentRate < 15000) { - float p = power * TimeWarp.deltaTime; + float p = power * TimeWarp.fixedDeltaTime; float e = part.RequestResource("ElectricCharge", p); if (e < p) { @@ -141,7 +144,6 @@ public override void OnUpdate() } else { - registerScanner(); powerIsProblem = false; } } @@ -153,6 +155,7 @@ public override void OnUpdate() } else unregisterScanner(); + alt_indicator = scanAlt(); } } @@ -522,6 +525,16 @@ public ScienceData[] GetData() return storedData.ToArray(); } + public void ReturnData(ScienceData data) + { + if (data == null) + return; + + storedData.Clear(); + + storedData.Add(data); + } + private void KeepData(ScienceData data) { expDialog = null; diff --git a/SCANsat/SCAN_Platform/SCAN_ConfigNodeStorage.cs b/SCANsat/SCAN_Platform/SCAN_ConfigNodeStorage.cs index 1dbe32647..d6ae97970 100644 --- a/SCANsat/SCAN_Platform/SCAN_ConfigNodeStorage.cs +++ b/SCANsat/SCAN_Platform/SCAN_ConfigNodeStorage.cs @@ -62,6 +62,31 @@ public bool Load(string fileFullName) } } + public bool LoadSavedCopy() + { + try + { + Log.Debug("Loading ConfigNode"); + if (FileExists) + { + ConfigNode cnToLoad = ConfigNode.Load(FilePath); + ConfigNode cnUnwrapped = cnToLoad.GetNode(this.GetType().Name); + ConfigNode.LoadObjectFromConfig(this, cnUnwrapped); + return true; + } + else + { + Log.Now("File could not be found to load after saving new copy ({0})", FilePath); + return false; + } + } + catch (Exception ex) + { + Log.Now("Failed to Load ConfigNode from file after saving ({0}) - Error:{1}", FilePath, ex.Message); + return false; + } + } + public bool Save() { Log.Debug("Saving ConfigNode"); diff --git a/SCANsat/SCAN_Platform/SCAN_MBW.cs b/SCANsat/SCAN_Platform/SCAN_MBW.cs index 8d3e4ee7a..a2cc21bdb 100644 --- a/SCANsat/SCAN_Platform/SCAN_MBW.cs +++ b/SCANsat/SCAN_Platform/SCAN_MBW.cs @@ -151,7 +151,7 @@ public Rect GetWindowRect private Rect _TooltipPosition = new Rect(); public bool TooltipsEnabled = false; - internal Int32 TooltipDisplayForSecs = 15; + protected Int32 TooltipDisplayForSecs = 15; protected Int32 TooltipMaxWidth = 250; private string strToolTipText = ""; private string strLastTooltipText = ""; diff --git a/SCANsat/SCAN_UI/SCANcolorSelection.cs b/SCANsat/SCAN_UI/SCANcolorSelection.cs index 59998e06c..68c63ee99 100644 --- a/SCANsat/SCAN_UI/SCANcolorSelection.cs +++ b/SCANsat/SCAN_UI/SCANcolorSelection.cs @@ -66,6 +66,29 @@ class SCANcolorSelection: SCAN_MBW private static SCANmap bigMap; private CelestialBody body; + private string colorTerrainHelpMin = ""; + private string colorTerrainHelpMax = ""; + private string colorTerrainHelpClampToggle = ""; + private string colorTerrainHelpClamp = ""; + private string colorTerrainHelpReverse = ""; + private string colorTerrainHelpDiscrete = ""; + private string colorTerrainHelpPaletteSize = ""; + private string colorBiomeHelpStock = ""; + private string colorBiomeHelpWhiteBorder = ""; + private string colorBiomeHelpTransparency = ""; + private string colorPickerHelpLow = ""; + private string colorPickerHelpHigh = ""; + private string colorPickerHelpValue = ""; + private string colorResourceHelpFineControl = ""; + private string colorResourceHelpMin = ""; + private string colorResourceHelpMax = ""; + private string colorResourceHelpTransparency = ""; + private string colorResourceHelpApply = ""; + private string colorResourceHelpApplyAll = ""; + private string colorResourceHelpDefault = ""; + private string colorResourceHelpDefaultAll = ""; + private string colorHelpSaveToConfig = ""; + protected override void Awake() { WindowCaption = "S.C.A.N. Color Management"; @@ -74,6 +97,9 @@ protected override void Awake() WindowOptions = new GUILayoutOption[2] { GUILayout.Width(780), GUILayout.Height(360) }; Visible = false; DragEnabled = true; + TooltipMouseOffset = new Vector2d(-10, -25); + TooltipMaxWidth = 350; + TooltipDisplayForSecs = 60; ClampToScreenOffset = new RectOffset(-450, -450, -250, -250); SCAN_SkinsLibrary.SetCurrent("SCAN_Unity"); @@ -83,6 +109,11 @@ protected override void Awake() protected override void Start() { + TooltipsEnabled = false; + + if (SCANconfigLoader.languagePack != null) + loadStrings(); + if (HighLogic.LoadedScene == GameScenes.SPACECENTER || HighLogic.LoadedScene == GameScenes.TRACKSTATION) { kscMapObj = (SCANkscMap)SCANcontroller.controller.kscMap; @@ -111,21 +142,21 @@ protected override void Start() stockBiomes = SCANcontroller.controller.useStockBiomes; biomeBorders = SCANcontroller.controller.biomeBorder; - minTerrainSlider = new SCANuiSlider(currentTerrain.DefaultMinHeight - SCANconfigLoader.SCANNode.RangeBelowMinHeight, currentTerrain.MaxTerrain - 100, currentTerrain.MinTerrain, "Min: ", "m", -2); - maxTerrainSlider = new SCANuiSlider(currentTerrain.MinTerrain + 100, currentTerrain.DefaultMaxHeight + SCANconfigLoader.SCANNode.RangeAboveMaxHeight, currentTerrain.MaxTerrain, "Max: ", "m", -2); - clampTerrainSlider = new SCANuiSlider(currentTerrain.MinTerrain + 10, currentTerrain.MaxTerrain - 10, currentTerrain.ClampTerrain ?? currentTerrain.MinTerrain + 10, "Clamp: ", "m", -1); - paletteSizeSlider = new SCANuiSlider(3, 12, currentTerrain.PalSize, "Palette Size: ", "", 0); + minTerrainSlider = new SCANuiSlider(currentTerrain.DefaultMinHeight - SCANconfigLoader.SCANNode.RangeBelowMinHeight, currentTerrain.MaxTerrain - 100, currentTerrain.MinTerrain, "Min: ", "m", colorTerrainHelpMin, -2); + maxTerrainSlider = new SCANuiSlider(currentTerrain.MinTerrain + 100, currentTerrain.DefaultMaxHeight + SCANconfigLoader.SCANNode.RangeAboveMaxHeight, currentTerrain.MaxTerrain, "Max: ", "m", colorTerrainHelpMax, -2); + clampTerrainSlider = new SCANuiSlider(currentTerrain.MinTerrain + 10, currentTerrain.MaxTerrain - 10, currentTerrain.ClampTerrain ?? currentTerrain.MinTerrain + 10, "Clamp: ", "m", colorTerrainHelpClamp, -1); + paletteSizeSlider = new SCANuiSlider(3, 12, currentTerrain.PalSize, "Palette Size: ", "", colorTerrainHelpPaletteSize, 0); - slopeColorPickerLow = new SCANuiColorPicker(SCANcontroller.controller.lowSlopeColorOne, SCANcontroller.controller.highSlopeColorOne, true); - slopeColorPickerHigh = new SCANuiColorPicker(SCANcontroller.controller.lowSlopeColorTwo, SCANcontroller.controller.highSlopeColorTwo, true); + slopeColorPickerLow = new SCANuiColorPicker(SCANcontroller.controller.lowSlopeColorOne, SCANcontroller.controller.highSlopeColorOne, colorPickerHelpLow, colorPickerHelpHigh, colorPickerHelpValue, true); + slopeColorPickerHigh = new SCANuiColorPicker(SCANcontroller.controller.lowSlopeColorTwo, SCANcontroller.controller.highSlopeColorTwo, colorPickerHelpLow, colorPickerHelpHigh, colorPickerHelpValue, true); slopeColorPickerLow.updateOldSwatches(); slopeColorPickerHigh.updateOldSwatches(); bTrans = SCANcontroller.controller.biomeTransparency; - biomeTransSlider = new SCANuiSlider(0, 80, bTrans, "Ter. Trans: ", "%", 0); + biomeTransSlider = new SCANuiSlider(0, 80, bTrans, "Ter. Trans: ", "%", colorBiomeHelpTransparency, 0); - biomeColorPicker = new SCANuiColorPicker(SCANcontroller.controller.lowBiomeColor, SCANcontroller.controller.highBiomeColor, true); + biomeColorPicker = new SCANuiColorPicker(SCANcontroller.controller.lowBiomeColor, SCANcontroller.controller.highBiomeColor, colorPickerHelpLow, colorPickerHelpHigh, colorPickerHelpValue, true); biomeColorPicker.updateOldSwatches(); @@ -137,11 +168,11 @@ protected override void Start() if (currentResource != null) { - resourceMinSlider = new SCANuiSlider(0, currentResource.CurrentBody.MinValue - 0.1f, currentResource.CurrentBody.MinValue, "Min: ", "%", 1); - resourceMaxSlider = new SCANuiSlider(currentResource.CurrentBody.MinValue + 0.1f, 100, currentResource.CurrentBody.MaxValue, "Max: ", "%", 1); - resourceTransSlider = new SCANuiSlider(0, 80, currentResource.Transparency, "Trans: ", "%", 0); + resourceMinSlider = new SCANuiSlider(0, currentResource.CurrentBody.MinValue - 0.1f, currentResource.CurrentBody.MinValue, "Min: ", "%", colorResourceHelpMin, 1); + resourceMaxSlider = new SCANuiSlider(currentResource.CurrentBody.MinValue + 0.1f, 100, currentResource.CurrentBody.MaxValue, "Max: ", "%", colorResourceHelpMax, 1); + resourceTransSlider = new SCANuiSlider(0, 80, currentResource.Transparency, "Trans: ", "%", colorResourceHelpTransparency, 0); - resourceColorPicker = new SCANuiColorPicker(currentResource.MinColor, currentResource.MaxColor, true); + resourceColorPicker = new SCANuiColorPicker(currentResource.MinColor, currentResource.MaxColor, colorPickerHelpLow, colorPickerHelpHigh, colorPickerHelpValue, true); } } @@ -153,9 +184,36 @@ protected override void Start() setSizeSlider(currentTerrain.ColorPal.kind); } + private void loadStrings() + { + colorTerrainHelpMin = SCANconfigLoader.languagePack.colorTerrainHelpMin; + colorTerrainHelpMax = SCANconfigLoader.languagePack.colorTerrainHelpMax; + colorTerrainHelpClampToggle = SCANconfigLoader.languagePack.colorTerrainHelpClampToggle; + colorTerrainHelpClamp = SCANconfigLoader.languagePack.colorTerrainHelpClamp; + colorTerrainHelpReverse = SCANconfigLoader.languagePack.colorTerrainHelpReverse; + colorTerrainHelpDiscrete = SCANconfigLoader.languagePack.colorTerrainHelpDiscrete; + colorTerrainHelpPaletteSize = SCANconfigLoader.languagePack.colorTerrainHelpPaletteSize; + colorBiomeHelpStock = SCANconfigLoader.languagePack.colorBiomeHelpStock; + colorBiomeHelpWhiteBorder = SCANconfigLoader.languagePack.colorBiomeHelpWhiteBorder; + colorBiomeHelpTransparency = SCANconfigLoader.languagePack.colorBiomeHelpTransparency; + colorPickerHelpLow = SCANconfigLoader.languagePack.colorPickerHelpLow; + colorPickerHelpHigh = SCANconfigLoader.languagePack.colorPickerHelpHigh; + colorPickerHelpValue = SCANconfigLoader.languagePack.colorPickerHelpValue; + colorResourceHelpFineControl = SCANconfigLoader.languagePack.colorResourceHelpFineControl; + colorResourceHelpMin = SCANconfigLoader.languagePack.colorResourceHelpMin; + colorResourceHelpMax = SCANconfigLoader.languagePack.colorResourceHelpMax; + colorResourceHelpTransparency = SCANconfigLoader.languagePack.colorResourceHelpTransparency; + colorResourceHelpApply = SCANconfigLoader.languagePack.colorResourceHelpApply; + colorResourceHelpApplyAll = SCANconfigLoader.languagePack.colorResourceHelpApplyAll; + colorResourceHelpDefault = SCANconfigLoader.languagePack.colorResourceHelpDefault; + colorResourceHelpDefaultAll = SCANconfigLoader.languagePack.colorResourceHelpDefaultAll; + colorHelpSaveToConfig = SCANconfigLoader.languagePack.colorHelpSaveToConfig; + } + protected override void OnDestroy() { removeControlLocks(); + TooltipsEnabled = false; } internal void removeControlLocks() @@ -447,11 +505,19 @@ private void versionLabel(int id) //Draw the close button in the upper right corner private void closeBox(int id) { - Rect r = new Rect(WindowRect.width - 20, 1, 18, 18); + Rect r = new Rect(WindowRect.width - 42, 1, 18, 18); + if (GUI.Button(r, textWithTT("?", "Show Help Tips"), SCANskins.SCAN_closeButton)) + { + TooltipsEnabled = !TooltipsEnabled; + } + + r.x += 22; + if (GUI.Button(r, SCANcontroller.controller.closeBox, SCANskins.SCAN_closeButton)) { removeControlLocks(); Visible = false; + TooltipsEnabled = false; } } @@ -583,7 +649,7 @@ private void paletteOptions(int id) if (dropDown) GUILayout.Label("Clamp Terrain", SCANskins.SCAN_settingsToggle, GUILayout.Width(100)); else - clampState = GUILayout.Toggle(clampState, "Clamp Terrain", SCANskins.SCAN_settingsToggle, GUILayout.Width(100)); + clampState = GUILayout.Toggle(clampState, textWithTT("Clamp Terrain", colorTerrainHelpClampToggle), SCANskins.SCAN_settingsToggle, GUILayout.Width(100)); fillS(); stopE(); if (clampState) @@ -612,9 +678,9 @@ private void paletteOptions(int id) } else { - currentTerrain.PalRev = GUILayout.Toggle(currentTerrain.PalRev, " Reverse Order", SCANskins.SCAN_boldToggle, GUILayout.Width(120)); + currentTerrain.PalRev = GUILayout.Toggle(currentTerrain.PalRev, textWithTT(" Reverse Order", colorTerrainHelpReverse), SCANskins.SCAN_boldToggle, GUILayout.Width(120)); fillS(10); - currentTerrain.PalDis = GUILayout.Toggle(currentTerrain.PalDis, " Discrete Gradient", SCANskins.SCAN_boldToggle, GUILayout.Width(140)); + currentTerrain.PalDis = GUILayout.Toggle(currentTerrain.PalDis, textWithTT(" Discrete Gradient", colorTerrainHelpDiscrete), SCANskins.SCAN_boldToggle, GUILayout.Width(140)); } stopE(); @@ -698,7 +764,7 @@ private void paletteConfirmation(int id) fillS(8); if (!dropDown) { - if (GUILayout.Button("Save Values To Config", GUILayout.Width(180))) + if (GUILayout.Button(textWithTT("Save Values To Config", colorHelpSaveToConfig), GUILayout.Width(180))) { dropDown = true; saveWarning = true; @@ -714,9 +780,9 @@ private void biomeOptions(int id) GUILayout.Label("Biome Options", SCANskins.SCAN_headline, GUILayout.Width(300)); fillS(20); - stockBiomes = GUILayout.Toggle(stockBiomes, "Use Stock Biome Maps", SCANskins.SCAN_toggle); + stockBiomes = GUILayout.Toggle(stockBiomes, textWithTT("Use Stock Biome Maps", colorBiomeHelpStock), SCANskins.SCAN_toggle, GUILayout.Width(200)); fillS(8); - biomeBorders = GUILayout.Toggle(biomeBorders, "White Biome Borders", SCANskins.SCAN_toggle); + biomeBorders = GUILayout.Toggle(biomeBorders, textWithTT("White Biome Borders", colorBiomeHelpWhiteBorder), SCANskins.SCAN_toggle, GUILayout.Width(190)); fillS(8); growE(); fillS(10); @@ -769,7 +835,7 @@ private void resourceOptions(int id) if (dropDown) GUILayout.Label(" Fine Control Mode", SCANskins.SCAN_boldToggle, GUILayout.Width(140)); else - fineControlMode = GUILayout.Toggle(fineControlMode, " Fine Control Mode", SCANskins.SCAN_boldToggle, GUILayout.Width(140)); + fineControlMode = GUILayout.Toggle(fineControlMode, textWithTT(" Fine Control Mode", colorResourceHelpFineControl), SCANskins.SCAN_boldToggle, GUILayout.Width(140)); stopE(); growE(); fillS(10); @@ -828,7 +894,7 @@ private void biomeConfirm(int id) stockBiomes = SCANcontroller.controller.useStockBiomes; biomeBorders = SCANcontroller.controller.biomeBorder; - biomeColorPicker = new SCANuiColorPicker(SCANcontroller.controller.lowBiomeColor, SCANcontroller.controller.highBiomeColor, biomeColorPicker.LowColorChange); + biomeColorPicker = new SCANuiColorPicker(SCANcontroller.controller.lowBiomeColor, SCANcontroller.controller.highBiomeColor, colorPickerHelpLow, colorPickerHelpHigh, colorPickerHelpValue, biomeColorPicker.LowColorChange); biomeColorPicker.updateOldSwatches(); @@ -851,7 +917,7 @@ private void biomeConfirm(int id) fillS(8); if (!dropDown) { - if (GUILayout.Button("Save Values To Config", GUILayout.Width(180))) + if (GUILayout.Button(textWithTT("Save Values To Config", colorHelpSaveToConfig), GUILayout.Width(180))) { dropDown = true; saveWarning = true; @@ -900,8 +966,8 @@ private void slopeConfirm(int id) SCANcontroller.controller.lowSlopeColorTwo32 = SCANconfigLoader.SCANNode.TopLowSlopeColor; SCANcontroller.controller.highSlopeColorTwo32 = SCANconfigLoader.SCANNode.TopHighSlopeColor; - slopeColorPickerLow = new SCANuiColorPicker(SCANcontroller.controller.lowSlopeColorOne, SCANcontroller.controller.highSlopeColorOne, slopeColorPickerLow.LowColorChange); - slopeColorPickerHigh = new SCANuiColorPicker(SCANcontroller.controller.lowSlopeColorTwo, SCANcontroller.controller.highSlopeColorTwo, slopeColorPickerHigh.LowColorChange); + slopeColorPickerLow = new SCANuiColorPicker(SCANcontroller.controller.lowSlopeColorOne, SCANcontroller.controller.highSlopeColorOne, colorPickerHelpLow, colorPickerHelpHigh, colorPickerHelpValue, slopeColorPickerLow.LowColorChange); + slopeColorPickerHigh = new SCANuiColorPicker(SCANcontroller.controller.lowSlopeColorTwo, SCANcontroller.controller.highSlopeColorTwo, colorPickerHelpLow, colorPickerHelpHigh, colorPickerHelpValue, slopeColorPickerHigh.LowColorChange); slopeColorPickerLow.updateOldSwatches(); slopeColorPickerHigh.updateOldSwatches(); @@ -915,7 +981,7 @@ private void slopeConfirm(int id) fillS(80); - if (GUILayout.Button("Save Values To Config", GUILayout.Width(180))) + if (GUILayout.Button(textWithTT("Save Values To Config", colorHelpSaveToConfig), GUILayout.Width(180))) { dropDown = true; saveWarning = true; @@ -937,7 +1003,7 @@ private void resourceConfirm(int id) growE(); if (!dropDown) { - if (GUILayout.Button("Apply Values", GUILayout.Width(110))) + if (GUILayout.Button(textWithTT("Apply Values", colorResourceHelpApply), GUILayout.Width(110))) { currentResource.MinColor = resourceColorPicker.ColorLow; currentResource.MaxColor = resourceColorPicker.ColorHigh; @@ -952,7 +1018,7 @@ private void resourceConfirm(int id) fillS(6); - if (GUILayout.Button("Apply To All Planets", GUILayout.Width(200))) + if (GUILayout.Button(textWithTT("Apply To All Planets", colorResourceHelpApplyAll), GUILayout.Width(200))) { for (int i = 0; i < currentResource.getBodyCount; i++) { @@ -986,7 +1052,7 @@ private void resourceConfirm(int id) growE(); if (!dropDown) { - if (GUILayout.Button("Default Values", GUILayout.Width(110))) + if (GUILayout.Button(textWithTT("Default Values", colorResourceHelpDefault), GUILayout.Width(110))) { currentResource.CurrentBody.MinValue = currentResource.CurrentBody.DefaultMinValue; currentResource.CurrentBody.MaxValue = currentResource.CurrentBody.DefaultMaxValue; @@ -1004,7 +1070,7 @@ private void resourceConfirm(int id) fillS(6); - if (GUILayout.Button("Default Values For All Planets", GUILayout.Width(200))) + if (GUILayout.Button(textWithTT("Default Values For All Planets", colorResourceHelpDefaultAll), GUILayout.Width(200))) { currentResource.MinColor = currentResource.DefaultLowColor; currentResource.MaxColor = currentResource.DefaultHighColor; @@ -1038,7 +1104,7 @@ private void resourceConfirm(int id) fillS(8); if (!dropDown) { - if (GUILayout.Button("Save Values To Config", GUILayout.Width(180))) + if (GUILayout.Button(textWithTT("Save Values To Config", colorHelpSaveToConfig), GUILayout.Width(180))) { dropDown = true; saveWarning = true; @@ -1185,7 +1251,7 @@ private void updateUI() highRCutoff = currentResource.CurrentBody.MaxValue; rTrans = currentResource.Transparency; - resourceColorPicker = new SCANuiColorPicker(currentResource.MinColor, currentResource.MaxColor, resourceColorPicker.LowColorChange); + resourceColorPicker = new SCANuiColorPicker(currentResource.MinColor, currentResource.MaxColor, colorPickerHelpLow, colorPickerHelpHigh, colorPickerHelpValue, resourceColorPicker.LowColorChange); resourceColorPicker.updateOldSwatches(); diff --git a/SCANsat/SCAN_UI/SCANmainMap.cs b/SCANsat/SCAN_UI/SCANmainMap.cs index 2165ba96d..52ae188b6 100644 --- a/SCANsat/SCAN_UI/SCANmainMap.cs +++ b/SCANsat/SCAN_UI/SCANmainMap.cs @@ -149,7 +149,7 @@ private void mainMap(int id) mapRect = new Rect(10, 20, 360, 180); GUI.DrawTexture(mapRect, drawBiome ? drawBiomeMap(sensors) : drawPartialMap(sensors)); - if (data.Building || data.ExternalBuilding) + if (data.MapBuilding || data.OverlayBuilding || data.ControllerBuilding) { flash = (int)(Time.realtimeSinceStartup % 2) == 0; SCANuiUtil.drawLabel(new Rect(mapRect.x + 80, mapRect.y + 50, 200, 60), "Building Database...", SCANskins.SCAN_insColorLabel, true, SCANskins.SCAN_insColorLabelShadow, flash, SCANskins.SCAN_insWhiteLabel); @@ -165,7 +165,8 @@ private void scannerInfo(int id) if (!repainting) infoText = SCANuiUtil.InfoText(v, data, notMappingToday); - SCANuiUtil.readableLabel(infoText, false); + if (!string.IsNullOrEmpty(infoText)) + SCANuiUtil.readableLabel(infoText, false); } //Draw the SCANsat window buttons with icons @@ -276,14 +277,14 @@ private Texture2D drawPartialMap(SCANtype type) { bool pqsController = data.Body.pqsController != null; - if (data.ExternalBuilding) + if (data.ControllerBuilding || data.OverlayBuilding) { return map_small; } if (!data.Built) { - data.Building = true; + data.MapBuilding = true; data.generateHeightMap(ref scanline, ref scanstep, 360); return map_small; } diff --git a/SCANsat/SCAN_UI/SCANoverlayController.cs b/SCANsat/SCAN_UI/SCANoverlayController.cs index 5a31b9a2d..887701d24 100644 --- a/SCANsat/SCAN_UI/SCANoverlayController.cs +++ b/SCANsat/SCAN_UI/SCANoverlayController.cs @@ -74,6 +74,7 @@ protected override void Start() { GameEvents.onShowUI.Add(showUI); GameEvents.onHideUI.Add(hideUI); + GameEvents.onGameSceneSwitchRequested.Add(switchScene); resources = SCANcontroller.setLoadedResourceList(); @@ -99,13 +100,17 @@ protected override void Update() } } + private void switchScene(GameEvents.FromToAction FT) + { + removeOverlay(); + } + protected override void OnDestroy() { GameEvents.onShowUI.Remove(showUI); GameEvents.onHideUI.Remove(hideUI); + GameEvents.onGameSceneSwitchRequested.Remove(switchScene); - if (mapOverlay != null) - Destroy(mapOverlay); resourcePixels = null; biomePixels = null; terrainPixels = null; @@ -334,7 +339,8 @@ private void removeOverlay() { OverlayGenerator.Instance.ClearDisplay(); - Destroy(mapOverlay); + if (mapOverlay != null) + Destroy(mapOverlay); mapOverlay = null; } @@ -471,18 +477,13 @@ private IEnumerator setOverlayMap() SCANresourceGlobal resourceCopy = new SCANresourceGlobal(currentResource); resourceCopy.CurrentBodyConfig(body.name); - SCANUtil.SCANlog("Starting Resource Thread"); - Thread t = new Thread(() => resourceThreadRun(SCANcontroller.controller.overlayMapHeight, SCANcontroller.controller.overlayInterpolation, SCANcontroller.controller.overlayTransparency, new System.Random(ResourceScenario.Instance.gameSettings.Seed), copy, resourceCopy)); threadRunning = true; threadFinished = false; t.Start(); - SCANUtil.SCANlog("Resource Thread Started..."); - while (threadRunning && timer < 1000) { - SCANUtil.SCANlog("Resource Thread Running..."); timer++; yield return null; } @@ -493,6 +494,7 @@ private IEnumerator setOverlayMap() if (timer >= 1000) { + Debug.LogError("[SCANsat] Something went wrong when drawing the SCANsat resource map overlay..."); t.Abort(); threadRunning = false; yield break; @@ -500,11 +502,10 @@ private IEnumerator setOverlayMap() if (!threadFinished) { + Debug.LogError("[SCANsat] Something went wrong when drawing the SCANsat resource map overlay..."); yield break; } - SCANUtil.SCANlog("Resource Thread Finished; {0} Frames Used", timer); - if (mapOverlay == null || mapOverlay.height != SCANcontroller.controller.overlayMapHeight) mapOverlay = new Texture2D(SCANcontroller.controller.overlayMapHeight * 2, SCANcontroller.controller.overlayMapHeight, TextureFormat.ARGB32, true); @@ -541,9 +542,9 @@ private IEnumerator setTerrainMap() while (!data.Built && timer < 2000) { mapGenerating = true; - if (!data.Building) + if (!data.ControllerBuilding && !data.MapBuilding) { - data.ExternalBuilding = true; + data.OverlayBuilding = true; data.generateHeightMap(ref mapStep, ref mapStart, 360); } timer++; @@ -561,18 +562,13 @@ private IEnumerator setTerrainMap() SCANdata copy = new SCANdata(data); int index = data.Body.flightGlobalsIndex; - SCANUtil.SCANlog("Starting Terrain Thread"); - Thread t = new Thread( () => terrainThreadRun(copy, index)); threadFinished = false; threadRunning = true; t.Start(); - SCANUtil.SCANlog("Terrain Thread Started..."); - while (threadRunning && timer < 1000) { - SCANUtil.SCANlog("Terrain Thread Running..."); timer++; yield return null; } @@ -582,6 +578,7 @@ private IEnumerator setTerrainMap() if (timer >= 1000) { + Debug.LogError("[SCANsat] Something went wrong when drawing the SCANsat terrain map overlay..."); t.Abort(); threadRunning = false; yield break; @@ -589,11 +586,10 @@ private IEnumerator setTerrainMap() if (!threadFinished) { + Debug.LogError("[SCANsat] Something went wrong when drawing the SCANsat terrain map overlay..."); yield break; } - SCANUtil.SCANlog("Terrain Thread Finished; {0} Frames Used", timer); - if (mapOverlay == null) mapOverlay = new Texture2D(1440, 720, TextureFormat.ARGB32, true); @@ -637,9 +633,9 @@ private IEnumerator setSlopeMap() while (!data.Built && timer < 2000) { mapGenerating = true; - if (!data.Building) + if (!data.ControllerBuilding && !data.MapBuilding) { - data.ExternalBuilding = true; + data.OverlayBuilding = true; data.generateHeightMap(ref mapStep, ref mapStart, 360); } timer++; diff --git a/SCANsat/SCAN_UI/SCANresourceSettings.cs b/SCANsat/SCAN_UI/SCANresourceSettings.cs index bd299aac9..d74695577 100644 --- a/SCANsat/SCAN_UI/SCANresourceSettings.cs +++ b/SCANsat/SCAN_UI/SCANresourceSettings.cs @@ -31,6 +31,18 @@ class SCANresourceSettings : SCAN_MBW private const string lockID = "resourceSettingLockID"; private Rect warningRect; + private string resourceSettingsHelpOverlayWindow = ""; + private string resourceSettingsHelpBiomeLock = ""; + private string resourceSettingsHelpInstant = ""; + private string resourceSettingsHelpNarrowBand = ""; + private string resourceSettingsHelpDisableStock = ""; + private string resourceSettingsHelpResetSCANsatResource = ""; + private string resourceSettingsHelpResetStockResource = ""; + private string resourceSettingsHelpOverlayInterpolation = ""; + private string resourceSettingsHelpOverlayHeight = ""; + private string resourceSettingsHelpOverlayBiomeHeight = ""; + private string resourceSettingsHelpOverlayTransparency = ""; + protected override void Awake() { WindowCaption = "S.C.A.N. Resources Settings"; @@ -39,6 +51,9 @@ protected override void Awake() WindowOptions = new GUILayoutOption[2] { GUILayout.Width(300), GUILayout.Height(270) }; Visible = false; DragEnabled = true; + TooltipMouseOffset = new Vector2d(-10, -25); + TooltipMaxWidth = 350; + TooltipDisplayForSecs = 60; ClampToScreenOffset = new RectOffset(-200, -200, -200, -200); SCAN_SkinsLibrary.SetCurrent("SCAN_Unity"); @@ -52,6 +67,26 @@ protected override void Start() mapHeight = SCANcontroller.controller.overlayMapHeight; transparency = SCANcontroller.controller.overlayTransparency; interpolationScale = SCANcontroller.controller.overlayInterpolation; + + TooltipsEnabled = false; + + if (SCANconfigLoader.languagePack != null) + loadStrings(); + } + + private void loadStrings() + { + resourceSettingsHelpOverlayWindow = SCANconfigLoader.languagePack.resourceSettingsHelpOverlayWindow; + resourceSettingsHelpBiomeLock = SCANconfigLoader.languagePack.resourceSettingsHelpBiomeLock; + resourceSettingsHelpInstant = SCANconfigLoader.languagePack.resourceSettingsHelpInstant; + resourceSettingsHelpNarrowBand = SCANconfigLoader.languagePack.resourceSettingsHelpNarrowBand; + resourceSettingsHelpDisableStock = SCANconfigLoader.languagePack.resourceSettingsHelpDisableStock; + resourceSettingsHelpResetSCANsatResource = SCANconfigLoader.languagePack.resourceSettingsHelpResetSCANsatResource; + resourceSettingsHelpResetStockResource = SCANconfigLoader.languagePack.resourceSettingsHelpResetStockResource; + resourceSettingsHelpOverlayInterpolation = SCANconfigLoader.languagePack.resourceSettingsHelpOverlayInterpolation; + resourceSettingsHelpOverlayHeight = SCANconfigLoader.languagePack.resourceSettingsHelpOverlayHeight; + resourceSettingsHelpOverlayBiomeHeight = SCANconfigLoader.languagePack.resourceSettingsHelpOverlayBiomeHeight; + resourceSettingsHelpOverlayTransparency = SCANconfigLoader.languagePack.resourceSettingsHelpOverlayTransparency; } internal void removeControlLocks() @@ -141,11 +176,18 @@ private void versionLabel(int id) //Draw the close button in the upper right corner private void closeBox(int id) { - Rect r = new Rect(WindowRect.width - 20, 1, 18, 18); + Rect r = new Rect(WindowRect.width - 42, 1, 18, 18); + if (GUI.Button(r, textWithTT("?", "Show Help Tips"), SCANskins.SCAN_closeButton)) + { + TooltipsEnabled = !TooltipsEnabled; + } + + r.x += 22; if (GUI.Button(r, SCANcontroller.controller.closeBox, SCANskins.SCAN_closeButton)) { removeControlLocks(); Visible = false; + TooltipsEnabled = false; } } @@ -154,7 +196,7 @@ private void resourceController(int id) if (SCANcontroller.controller.resourceOverlay == null) return; - if (GUILayout.Button("Planetary Overlay Window")) + if (GUILayout.Button(textWithTT("Planetary Overlay Window", resourceSettingsHelpOverlayWindow))) { SCANcontroller.controller.resourceOverlay.Visible = !SCANcontroller.controller.resourceOverlay.Visible; } @@ -164,20 +206,20 @@ private void resourceSettings(int id) { GUILayout.Label("Resource Settings", SCANskins.SCAN_headline); growE(); - SCANcontroller.controller.resourceBiomeLock = GUILayout.Toggle(SCANcontroller.controller.resourceBiomeLock, "Resource Biome Lock", SCANskins.SCAN_settingsToggle); + SCANcontroller.controller.resourceBiomeLock = GUILayout.Toggle(SCANcontroller.controller.resourceBiomeLock, textWithTT("Resource Biome Lock", resourceSettingsHelpBiomeLock), SCANskins.SCAN_settingsToggle); if (SCANcontroller.controller.disableStockResource) - GUILayout.Toggle(false, "Instant Resource Scan", SCANskins.SCAN_settingsToggle); + GUILayout.Toggle(false, textWithTT("Instant Resource Scan", resourceSettingsHelpInstant + "[Disabled]"), SCANskins.SCAN_settingsToggle); else - SCANcontroller.controller.easyModeScanning = GUILayout.Toggle(SCANcontroller.controller.easyModeScanning, "Instant Resource Scan", SCANskins.SCAN_settingsToggle); + SCANcontroller.controller.easyModeScanning = GUILayout.Toggle(SCANcontroller.controller.easyModeScanning, textWithTT("Instant Resource Scan", resourceSettingsHelpInstant), SCANskins.SCAN_settingsToggle); stopE(); growE(); fillS(); - SCANcontroller.controller.needsNarrowBand = GUILayout.Toggle(SCANcontroller.controller.needsNarrowBand, "Requires Narrow Band Scanner", SCANskins.SCAN_settingsToggle); + SCANcontroller.controller.needsNarrowBand = GUILayout.Toggle(SCANcontroller.controller.needsNarrowBand, textWithTT("Requires Narrow Band Scanner", resourceSettingsHelpNarrowBand), SCANskins.SCAN_settingsToggle); fillS(); stopE(); growE(); fillS(); - SCANcontroller.controller.disableStockResource = GUILayout.Toggle(SCANcontroller.controller.disableStockResource, "Disable Stock Scanning", SCANskins.SCAN_settingsToggle); + SCANcontroller.controller.disableStockResource = GUILayout.Toggle(SCANcontroller.controller.disableStockResource, textWithTT("Disable Stock Scanning", resourceSettingsHelpDisableStock), SCANskins.SCAN_settingsToggle); fillS(); stopE(); GUILayout.Label("Resource Scan Data", SCANskins.SCAN_headline); @@ -192,7 +234,7 @@ private void resourceSettings(int id) } else { - if (GUILayout.Button("Reset SCANsat Resource Coverage")) + if (GUILayout.Button(textWithTT("Reset SCANsat Resource Coverage", resourceSettingsHelpResetSCANsatResource))) { popup = !popup; warningResource = !warningResource; @@ -200,7 +242,7 @@ private void resourceSettings(int id) if (SCANcontroller.controller.disableStockResource) { fillS(8); - if (GUILayout.Button("Reset Stock Resource Scanning")) + if (GUILayout.Button(textWithTT("Reset Stock Resource Scanning", resourceSettingsHelpResetStockResource))) { popup = !popup; warningStockResource = !warningStockResource; @@ -213,17 +255,17 @@ private void overlayOptions(int id) { GUILayout.Label("Overlay Map Quality", SCANskins.SCAN_headline); growE(); - GUILayout.Label("Interpolation:", SCANskins.SCAN_labelSmallLeft); + GUILayout.Label(textWithTT("Interpolation:", resourceSettingsHelpOverlayInterpolation), SCANskins.SCAN_labelSmallLeft); fillS(); - if (GUILayout.Button("-", SCANskins.SCAN_buttonSmall, GUILayout.Width(18))) + if (GUILayout.Button(textWithTT("-", resourceSettingsHelpOverlayInterpolation), SCANskins.SCAN_buttonSmall, GUILayout.Width(18))) { interpolationScale = Math.Max(2, interpolationScale / 2); refreshMap(); } - GUILayout.Label(interpolationScale.ToString(), SCANskins.SCAN_labelSmall, GUILayout.Width(36)); - if (GUILayout.Button("+", SCANskins.SCAN_buttonSmall, GUILayout.Width(18))) + GUILayout.Label(textWithTT(interpolationScale.ToString(), resourceSettingsHelpOverlayInterpolation), SCANskins.SCAN_labelSmall, GUILayout.Width(36)); + if (GUILayout.Button(textWithTT("+", resourceSettingsHelpOverlayInterpolation), SCANskins.SCAN_buttonSmall, GUILayout.Width(18))) { interpolationScale = Math.Min(32, interpolationScale * 2); refreshMap(); @@ -231,17 +273,17 @@ private void overlayOptions(int id) stopE(); growE(); - GUILayout.Label("Map Height:", SCANskins.SCAN_labelSmallLeft); + GUILayout.Label(textWithTT("Map Height:", resourceSettingsHelpOverlayHeight), SCANskins.SCAN_labelSmallLeft); fillS(); - if (GUILayout.Button("-", SCANskins.SCAN_buttonSmall, GUILayout.Width(18))) + if (GUILayout.Button(textWithTT("-", resourceSettingsHelpOverlayHeight), SCANskins.SCAN_buttonSmall, GUILayout.Width(18))) { mapHeight = Math.Max(64, mapHeight / 2); refreshMap(); } - GUILayout.Label(mapHeight.ToString(), SCANskins.SCAN_labelSmall, GUILayout.Width(36)); - if (GUILayout.Button("+", SCANskins.SCAN_buttonSmall, GUILayout.Width(18))) + GUILayout.Label(textWithTT(mapHeight.ToString(), resourceSettingsHelpOverlayHeight), SCANskins.SCAN_labelSmall, GUILayout.Width(36)); + if (GUILayout.Button(textWithTT("+", resourceSettingsHelpOverlayHeight), SCANskins.SCAN_buttonSmall, GUILayout.Width(18))) { mapHeight = Math.Min(1024, mapHeight * 2); refreshMap(); @@ -249,17 +291,17 @@ private void overlayOptions(int id) stopE(); growE(); - GUILayout.Label("Coverage Transparency:", SCANskins.SCAN_labelSmallLeft); + GUILayout.Label(textWithTT("Coverage Transparency:", resourceSettingsHelpOverlayTransparency), SCANskins.SCAN_labelSmallLeft); fillS(); - if (GUILayout.Button("-", SCANskins.SCAN_buttonSmall, GUILayout.Width(18))) + if (GUILayout.Button(textWithTT("-", resourceSettingsHelpOverlayTransparency), SCANskins.SCAN_buttonSmall, GUILayout.Width(18))) { transparency = Mathf.Max(0f, transparency - 0.1f); refreshMap(); } - GUILayout.Label(transparency.ToString("P0"), SCANskins.SCAN_labelSmall, GUILayout.Width(36)); - if (GUILayout.Button("+", SCANskins.SCAN_buttonSmall, GUILayout.Width(18))) + GUILayout.Label(textWithTT(transparency.ToString("P0"), resourceSettingsHelpOverlayTransparency), SCANskins.SCAN_labelSmall, GUILayout.Width(36)); + if (GUILayout.Button(textWithTT("+", resourceSettingsHelpOverlayTransparency), SCANskins.SCAN_buttonSmall, GUILayout.Width(18))) { transparency = Mathf.Min(1f, transparency + 0.1f); refreshMap(); @@ -267,17 +309,17 @@ private void overlayOptions(int id) stopE(); growE(); - GUILayout.Label("Biome Map Height:", SCANskins.SCAN_labelSmallLeft); + GUILayout.Label(textWithTT("Biome Map Height:", resourceSettingsHelpOverlayBiomeHeight), SCANskins.SCAN_labelSmallLeft); fillS(); - if (GUILayout.Button("-", SCANskins.SCAN_buttonSmall, GUILayout.Width(18))) + if (GUILayout.Button(textWithTT("-", resourceSettingsHelpOverlayBiomeHeight), SCANskins.SCAN_buttonSmall, GUILayout.Width(18))) { biomeMapHeight = Math.Max(256, biomeMapHeight / 2); refreshMap(); } - GUILayout.Label(biomeMapHeight.ToString(), SCANskins.SCAN_labelSmall, GUILayout.Width(36)); - if (GUILayout.Button("+", SCANskins.SCAN_buttonSmall, GUILayout.Width(18))) + GUILayout.Label(textWithTT(biomeMapHeight.ToString(), resourceSettingsHelpOverlayBiomeHeight), SCANskins.SCAN_labelSmall, GUILayout.Width(36)); + if (GUILayout.Button(textWithTT("+", resourceSettingsHelpOverlayBiomeHeight), SCANskins.SCAN_buttonSmall, GUILayout.Width(18))) { biomeMapHeight = Math.Min(1024, biomeMapHeight * 2); refreshMap(); diff --git a/SCANsat/SCAN_UI/SCANsettingsUI.cs b/SCANsat/SCAN_UI/SCANsettingsUI.cs index b57f46208..0f40a7317 100644 --- a/SCANsat/SCAN_UI/SCANsettingsUI.cs +++ b/SCANsat/SCAN_UI/SCANsettingsUI.cs @@ -26,6 +26,20 @@ namespace SCANsat.SCAN_UI { class SCANsettingsUI: SCAN_MBW { + private string settingsHelpAnomalies = ""; + private string settingsHelpBackground = ""; + private string settingsHelpTimeWarp = ""; + private string settingsHelpGroundTracks = ""; + private string settingsHelpGroundTracksActive = ""; + private string settingsHelpOverlayTooltips = ""; + private string settingsHelpWindowTooltips = ""; + private string settingsHelpStockToolbar = ""; + private string settingsHelpMechJeb = ""; + private string settingsHelpResetWindows = ""; + private string settingsHelpResetPlanetData = ""; + private string settingsHelpResetAllData = ""; + private string settingsHelpVessels = ""; + /* UI: a list of glyphs that are used for something */ private string[] exmarks = { "✗", "✘", "×", "✖", "x", "X", "∇", "☉", "★", "*", "•", "º", "+" }; @@ -48,6 +62,8 @@ protected override void Awake() Visible = false; DragEnabled = true; TooltipMouseOffset = new Vector2d(-10, -25); + TooltipMaxWidth = 350; + TooltipDisplayForSecs = 60; ClampToScreenOffset = new RectOffset(-280, -280, -600, -600); SCAN_SkinsLibrary.SetCurrent("SCAN_Unity"); @@ -58,6 +74,7 @@ protected override void Awake() protected override void OnDestroy() { removeControlLocks(); + TooltipsEnabled = false; } internal void removeControlLocks() @@ -68,8 +85,29 @@ internal void removeControlLocks() protected override void Start() { - oldTooltips = TooltipsEnabled = SCANcontroller.controller.toolTips; + oldTooltips = SCANcontroller.controller.toolTips; + TooltipsEnabled = false; stockToolbar = SCANcontroller.controller.useStockAppLauncher; + + if (SCANconfigLoader.languagePack != null) + loadStrings(); + } + + private void loadStrings() + { + settingsHelpAnomalies = SCANconfigLoader.languagePack.settingsHelpAnomalies; + settingsHelpBackground = SCANconfigLoader.languagePack.settingsHelpBackground; + settingsHelpTimeWarp = SCANconfigLoader.languagePack.settingsHelpTimeWarp; + settingsHelpGroundTracks = SCANconfigLoader.languagePack.settingsHelpGroundTracks; + settingsHelpGroundTracksActive = SCANconfigLoader.languagePack.settingsHelpGroundTracksActive; + settingsHelpOverlayTooltips = SCANconfigLoader.languagePack.settingsHelpOverlayTooltips; + settingsHelpWindowTooltips = SCANconfigLoader.languagePack.settingsHelpWindowTooltips; + settingsHelpStockToolbar = SCANconfigLoader.languagePack.settingsHelpStockToolbar; + settingsHelpMechJeb = SCANconfigLoader.languagePack.settingsHelpMechJeb; + settingsHelpResetWindows = SCANconfigLoader.languagePack.settingsHelpResetWindows; + settingsHelpResetPlanetData = SCANconfigLoader.languagePack.settingsHelpResetPlanetData; + settingsHelpResetAllData = SCANconfigLoader.languagePack.settingsHelpResetAllData; + settingsHelpVessels = SCANconfigLoader.languagePack.settingsHelpVesselsSensorsPasses; } protected override void DrawWindowPre(int id) @@ -181,11 +219,19 @@ private void versionLabel(int id) //Draw the close button in the upper right corner private void closeBox(int id) { - Rect r = new Rect(WindowRect.width - 20, 1, 18, 18); + Rect r = new Rect(WindowRect.width - 42, 1, 18, 18); + if (GUI.Button(r, textWithTT("?", "Show Help Tips"), SCANskins.SCAN_closeButton)) + { + TooltipsEnabled = !TooltipsEnabled; + } + + r.x += 22; + if (GUI.Button(r, SCANcontroller.controller.closeBox, SCANskins.SCAN_closeButton)) { removeControlLocks(); Visible = false; + TooltipsEnabled = false; } } @@ -193,18 +239,18 @@ private void closeBox(int id) private void gui_settings_xmarks(int id) { fillS(8); - GUILayout.Label("Anomaly Marker", SCANskins.SCAN_headline); + GUILayout.Label(textWithTT("Anomaly Marker", settingsHelpAnomalies), SCANskins.SCAN_headline); growE(); for (int i = 0; i < exmarks.Length; ++i) { if (SCANcontroller.controller.anomalyMarker == exmarks[i]) { - if (GUILayout.Button(exmarks[i], SCANskins.SCAN_closeButton)) + if (GUILayout.Button(textWithTT(exmarks[i], settingsHelpAnomalies), SCANskins.SCAN_closeButton)) SCANcontroller.controller.anomalyMarker = exmarks[i]; } else { - if (GUILayout.Button(exmarks[i], SCANskins.SCAN_buttonBorderless)) + if (GUILayout.Button(textWithTT(exmarks[i], settingsHelpAnomalies), SCANskins.SCAN_buttonBorderless)) SCANcontroller.controller.anomalyMarker = exmarks[i]; } } @@ -216,16 +262,16 @@ private void gui_settings_xmarks(int id) private void gui_settings_toggle_body_scanning(int id) { - GUILayout.Label("Background Scanning", SCANskins.SCAN_headline); + GUILayout.Label(textWithTT("Background Scanning", settingsHelpBackground), SCANskins.SCAN_headline); // scan background - SCANcontroller.controller.scan_background = GUILayout.Toggle(SCANcontroller.controller.scan_background, "Scan all active celestials", SCANskins.SCAN_settingsToggle); + SCANcontroller.controller.scan_background = GUILayout.Toggle(SCANcontroller.controller.scan_background, textWithTT("Scan all active celestials", settingsHelpBackground), SCANskins.SCAN_settingsToggle); // scanning for individual SoIs growE(); int count = 0; foreach (SCANdata data in SCANcontroller.controller.GetAllData) { if (count == 0) growS(); - data.Disabled = !GUILayout.Toggle(!data.Disabled, string.Format("{0} ({1:N1}%)", data.Body.name, SCANUtil.getCoveragePercentage(data, SCANtype.Nothing)), SCANskins.SCAN_settingsToggle); + data.Disabled = !GUILayout.Toggle(!data.Disabled, textWithTT(string.Format("{0} ({1:N1}%)", data.Body.name, SCANUtil.getCoveragePercentage(data, SCANtype.Nothing)), settingsHelpBackground), SCANskins.SCAN_settingsToggle); switch (count) { case 5: stopS(); count = 0; break; @@ -240,19 +286,19 @@ private void gui_settings_toggle_body_scanning(int id) //Control scanning resolution private void gui_settings_timewarp(int id) { - GUILayout.Label("Time Warp Resolution", SCANskins.SCAN_headline); + GUILayout.Label(textWithTT("Time Warp Resolution", settingsHelpTimeWarp), SCANskins.SCAN_headline); growE(); for (int i = 0; i < twnames.Length; ++i) { if (SCANcontroller.controller.timeWarpResolution == twvals[i]) { - if (GUILayout.Button(twnames[i], SCANskins.SCAN_buttonActive)) + if (GUILayout.Button(textWithTT(twnames[i], settingsHelpTimeWarp), SCANskins.SCAN_buttonActive)) SCANcontroller.controller.timeWarpResolution = twvals[i]; } else { - if (GUILayout.Button(twnames[i])) + if (GUILayout.Button(textWithTT(twnames[i], settingsHelpTimeWarp))) SCANcontroller.controller.timeWarpResolution = twvals[i]; } } @@ -267,7 +313,7 @@ private void gui_settings_numbers(int id) string s = "Vessels: " + SCANcontroller.controller.ActiveVessels.ToString() + " Sensors: " + SCANcontroller.controller.ActiveSensors + " Passes: " + SCANcontroller.controller.ActualPasses.ToString(); - GUILayout.Label(s, SCANskins.SCAN_whiteReadoutLabel); + GUILayout.Label(textWithTT(s, settingsHelpVessels), SCANskins.SCAN_whiteReadoutLabel); fillS(16); } @@ -288,12 +334,12 @@ private void gui_settings_data_resets(int id) } else { - if (GUILayout.Button("Reset map of " + thisBody.theName)) + if (GUILayout.Button(textWithTT("Reset map of " + thisBody.theName, settingsHelpResetPlanetData))) { popup = !popup; warningBoxOne = !warningBoxOne; } - if (GUILayout.Button("Reset all data")) + if (GUILayout.Button(textWithTT("Reset all data", settingsHelpResetAllData))) { popup = !popup; warningBoxAll = !warningBoxAll; @@ -311,22 +357,22 @@ private void gui_settings_window_resets_tooltips(int id) SCANcontroller.controller.trueGreyScale = GUILayout.Toggle(SCANcontroller.controller.trueGreyScale, "Use True Grey Scale", SCANskins.SCAN_settingsToggle); #endif growE(); - SCANcontroller.controller.groundTracks = GUILayout.Toggle(SCANcontroller.controller.groundTracks, "Show Ground Tracks", SCANskins.SCAN_settingsToggle); + SCANcontroller.controller.groundTracks = GUILayout.Toggle(SCANcontroller.controller.groundTracks, textWithTT("Show Ground Tracks", settingsHelpGroundTracks), SCANskins.SCAN_settingsToggle); if (SCANcontroller.controller.groundTracks) - SCANcontroller.controller.groundTrackActiveOnly = GUILayout.Toggle(SCANcontroller.controller.groundTrackActiveOnly, "Active Vessel Only", SCANskins.SCAN_settingsToggle); + SCANcontroller.controller.groundTrackActiveOnly = GUILayout.Toggle(SCANcontroller.controller.groundTrackActiveOnly, textWithTT("Active Vessel Only", settingsHelpGroundTracksActive), SCANskins.SCAN_settingsToggle); stopE(); growE(); - SCANcontroller.controller.planetaryOverlayTooltips = GUILayout.Toggle(SCANcontroller.controller.planetaryOverlayTooltips, "Planetary Overlay Tooltips", SCANskins.SCAN_settingsToggle); + SCANcontroller.controller.planetaryOverlayTooltips = GUILayout.Toggle(SCANcontroller.controller.planetaryOverlayTooltips, textWithTT("Planetary Overlay Tooltips", settingsHelpOverlayTooltips), SCANskins.SCAN_settingsToggle); - SCANcontroller.controller.toolTips = GUILayout.Toggle(SCANcontroller.controller.toolTips, "Window Tooltips", SCANskins.SCAN_settingsToggle); + SCANcontroller.controller.toolTips = GUILayout.Toggle(SCANcontroller.controller.toolTips, textWithTT("Window Tooltips", settingsHelpWindowTooltips), SCANskins.SCAN_settingsToggle); stopE(); growE(); - SCANcontroller.controller.useStockAppLauncher = GUILayout.Toggle(SCANcontroller.controller.useStockAppLauncher, "Stock Toolbar", SCANskins.SCAN_settingsToggle); + SCANcontroller.controller.useStockAppLauncher = GUILayout.Toggle(SCANcontroller.controller.useStockAppLauncher, textWithTT("Stock Toolbar", settingsHelpStockToolbar), SCANskins.SCAN_settingsToggle); if (SCANmainMenuLoader.MechJebLoaded) - SCANcontroller.controller.mechJebTargetSelection = GUILayout.Toggle(SCANcontroller.controller.mechJebTargetSelection, "MechJeb Target Selection", SCANskins.SCAN_settingsToggle); + SCANcontroller.controller.mechJebTargetSelection = GUILayout.Toggle(SCANcontroller.controller.mechJebTargetSelection, textWithTT("MechJeb Target Selection", settingsHelpMechJeb), SCANskins.SCAN_settingsToggle); stopE(); fillS(8); if (popup) @@ -335,7 +381,7 @@ private void gui_settings_window_resets_tooltips(int id) } else { - if (GUILayout.Button("Reset window positions")) + if (GUILayout.Button(textWithTT("Reset window positions", settingsHelpResetWindows))) { if (HighLogic.LoadedSceneIsFlight) { diff --git a/SCANsat/SCAN_UI/UI_Framework/SCAN_Localization.cs b/SCANsat/SCAN_UI/UI_Framework/SCAN_Localization.cs new file mode 100644 index 000000000..b5a3ccea4 --- /dev/null +++ b/SCANsat/SCAN_UI/UI_Framework/SCAN_Localization.cs @@ -0,0 +1,46 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using SCANsat.SCAN_Platform; + +namespace SCANsat.SCAN_UI.UI_Framework +{ + public class SCAN_Localization : SCAN_ConfigNodeStorage + { + private SCANlanguagePack activePack; + + [Persistent] + private List Language_Packs = new List(); + + public SCAN_Localization(string path, string node) + { + FilePath = path; + TopNodeName = path + "/" + node; + + if (!Load()) + { + activePack = new SCANlanguagePack(); + Language_Packs.Add(activePack); + Save(); + LoadSavedCopy(); + } + else + { + SCANUtil.SCANlog("Language File Loaded..."); + } + } + + public override void OnDecodeFromConfigNode() + { + activePack = Language_Packs.FirstOrDefault(l => l.activePack); + + if (activePack == null) + activePack = new SCANlanguagePack(); + } + + public SCANlanguagePack ActivePack + { + get { return activePack; } + } + } +} diff --git a/SCANsat/SCAN_UI/UI_Framework/SCANlanguagePack.cs b/SCANsat/SCAN_UI/UI_Framework/SCANlanguagePack.cs new file mode 100644 index 000000000..84a4581c9 --- /dev/null +++ b/SCANsat/SCAN_UI/UI_Framework/SCANlanguagePack.cs @@ -0,0 +1,160 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using SCANsat.SCAN_Platform; +using System.Text.RegularExpressions; +using System.Reflection; + +namespace SCANsat.SCAN_UI.UI_Framework +{ + public class SCANlanguagePack : SCAN_ConfigNodeStorage + { + [Persistent] + public bool activePack = true; + [Persistent] + public string language = "English (USA)"; + + //Settings Window Help Tooltips + [Persistent] + public string settingsHelpAnomalies = "Select the marker used to display anomalies on the map."; + [Persistent] + public string settingsHelpBackground = "Toggle background scanning on some or all celestial bodies."; + [Persistent] + public string settingsHelpTimeWarp = "Adjust the scanning frequency during TimeWarp. Higher settings result in fewer gaps in the maps but may have a performance impact at high TimeWarp."; + [Persistent] + public string settingsHelpGroundTracks = "Display a visible indicator of scanning activity in map mode."; + [Persistent] + public string settingsHelpGroundTracksActive = "The ground track indicator can be limited to only be displayed for the active vessel."; + [Persistent] + public string settingsHelpOverlayTooltips = "Displays tooltips for the current mouse position when a planetary overlay map is activated. These tooltips include The cursor coordinates, terrain height, slope, biome name, and resource abundance, depending on scanning coverage."; + [Persistent] + public string settingsHelpWindowTooltips = "Display tooltips on some map window buttons. These are primarily used to identify icon buttons."; + [Persistent] + public string settingsHelpStockToolbar = "Use the stock toolbar. Only one stock button is available. Can be used concurrently with the Blizzy78 Toolbar."; + [Persistent] + public string settingsHelpMechJeb = "The SCANsat zoom map target selection mode can be used to select a MechJeb landing site."; + [Persistent] + public string settingsHelpResetWindows = "Reset all window positions. Use this in case a window has been dragged completely off screen or if any windows are not visible."; + [Persistent] + public string settingsHelpResetPlanetData = "Resets all SCANsat data for the current celestial body. A confirmation window will open before activating Cannot be reversed."; + [Persistent] + public string settingsHelpResetAllData = "Resets all SCANsat data for all celestial bodies. A confirmation window will open before activating. Cannot be reversed."; + [Persistent] + public string settingsHelpVesselsSensorsPasses = "Information about the currently active SCANsat sensors. Vessels indicates the number of vessels with active sensors. Sensors indicates the total number of sensors; instruments with multiple sensor types count each individual sensor. Passes indicates the number of sensor updates performed per second This value is affected by the TimeWarp Resolution setting."; + + //Resource Settings Window Help Tooltips + [Persistent] + public string resourceSettingsHelpOverlayWindow = "Open the planetary overlay map control window."; + [Persistent] + public string resourceSettingsHelpBiomeLock = "Circumvents the requirement for stock surface biome scans SCANsat displays will show the full accuracy for resource abundance with or without any surface biome scans."; + [Persistent] + public string resourceSettingsHelpInstant = "By default, the stock M700 resource scanner's orbital survey will fill in all SCANsat resource maps this can be disabled, requiring standard SCANsat methods for all resource scanning Disabled automatically when stock resource scanning is disabled."; + [Persistent] + public string resourceSettingsHelpNarrowBand = "Numerous SCANsat functions require a Narrow-Band resource scanner on-board the current vessel or in orbit of a celestial body for fully accurate resource abundance data. Disable this to circumvent these restrictions."; + [Persistent] + public string resourceSettingsHelpDisableStock = "Disables all stock resource scanning functions SCANsat scanning methods will be required for all resource data. Replaces several stock resource functions with SCANsat tools. These include The right-click readouts, the high resolution narrow-band scanner map, and the planetary overlay maps."; + [Persistent] + public string resourceSettingsHelpResetSCANsatResource = "Resets all SCANsat resource data for the current celestial body. Other SCANsat data is not affected. A confirmation window will open before activating. Cannot be reversed."; + [Persistent] + public string resourceSettingsHelpResetStockResource = "Resets the stock resource scanning coverage for the current celestial body. A reload or scene change may be required for all changes to take effect. A confirmation window will open before activating. Cannot be reversed."; + [Persistent] + public string resourceSettingsHelpOverlayInterpolation = "Change the number of resource abundance measurements used in constructing the planetary overlay and big map resource overlay. Decrease the value to increase the accuracy of the map Lower values will result in slower map generation."; + [Persistent] + public string resourceSettingsHelpOverlayHeight = "Change the texture size (map width is 2XHeight) used in constructing the planetary overlay and big map resource overlay. Increase the value to increase the quality and accuracy of the map. Higher values will result in slower map generation."; + [Persistent] + public string resourceSettingsHelpOverlayBiomeHeight = "Change the texture size (map width is 2XHeight) used in constructing the planetary overlay biome map. Increase the value to increase the quality and accuracy of the map. Higher values will result in slower map generation."; + [Persistent] + public string resourceSettingsHelpOverlayTransparency = "Create a grey background for planetary overlay resource maps. Used to make clear which sections of the celestial body have been scanned but contain no resources."; + + //Color Config Window Help Tooltips + [Persistent] + public string colorTerrainHelpMin = "Defines the low altitude cutoff for the terrain color palette. Anything below this altitude will be shown with the lowest color."; + [Persistent] + public string colorTerrainHelpMax = "Defines the high altitude cutoff for the terrain color palette. Anything above this altitude will be shown with the highest color."; + [Persistent] + public string colorTerrainHelpClampToggle = "Used to define a cutoff between the low and high altitude values. This is particularly useful for ocean planets where it helps to define a sharp distinction between land and ocean."; + [Persistent] + public string colorTerrainHelpClamp = "Defines the clamp altitude cutoff. Anything below the cutoff will be represented by the first two colors in the selected color palette. Anything above the cutoff will be represented with the remaining colors."; + [Persistent] + public string colorTerrainHelpReverse = "Reverses the order of the currently selected color palette."; + [Persistent] + public string colorTerrainHelpDiscrete = "Draws the map using only the specific colors defined by each palette, instead of smoothly interpolating between them."; + [Persistent] + public string colorTerrainHelpPaletteSize = "Adjust the number of colors available in the currently selected color palette."; + [Persistent] + public string colorBiomeHelpStock = "Use the stock biome color scheme for SCANsat biome maps."; + [Persistent] + public string colorBiomeHelpWhiteBorder = "Draw a white border between biomes. Does not apply to the planetary overlay biome maps."; + [Persistent] + public string colorBiomeHelpTransparency = "Adjust the transparency of biome maps. Terrain elevation is shown behind the biome maps Set to 0% to disable terrain drawing."; + [Persistent] + public string colorPickerHelpLow = "The top color swatch shows the updated color selection for the low end of this color spectrum. The bottom color swatch shows the currently active color."; + [Persistent] + public string colorPickerHelpHigh = "The top color swatch shows the updated color selection for the high end of this color spectrum. The bottom color swatch shows the currently active color."; + [Persistent] + public string colorPickerHelpValue = "This slider adjusts the Value (in HSV color terms) or. Brightness for the currently selected color."; + [Persistent] + public string colorResourceHelpFineControl = "Activates Fine Control Mode where the sliders will only show values within 5% of the current selection."; + [Persistent] + public string colorResourceHelpMin = "The low cutoff for resource concentration on the selected celestial body. Resource deposits at this level will be displayed using the low end of the current resource overlay color spectrum Resource deposits below this value will not be shown."; + [Persistent] + public string colorResourceHelpMax = "The high cutoff for resource concentration on the selected celestial body. Resource deposits above this value will be shown using the high end of the current resource overlay color spectrum."; + [Persistent] + public string colorResourceHelpTransparency = "Defines the level of transparency for resource overlays. Increase to allow more of the underlying terrain, slope, or biome map to be visible. This also affect the transparency of resource deposits on the planetary overlay resource map."; + [Persistent] + public string colorResourceHelpApply = "Applies the current values for the selected resource and celestial body only."; + [Persistent] + public string colorResourceHelpApplyAll = "Applies the current values for the selected resource for all celestial bodies."; + [Persistent] + public string colorResourceHelpDefault = "Reverts to the default values for the selected resource and celestial body only."; + [Persistent] + public string colorResourceHelpDefaultAll = "Reverts to the default values for the selected resource for all celestial bodies."; + [Persistent] + public string colorHelpSaveToConfig = "Save all color configuration values to the config file found in your SCANsat/Resources folder These values serve as the defaults for new saves and for all. Revert To Default buttons Values do not need to be saved to the config file to be applied for this save file."; + + public override void OnDecodeFromConfigNode() + { + Regex openBracket = new Regex(@"\[(?=\d+:?\w?\d?\])"); + + Regex closeBraket = new Regex(@"(?<=\{\d+:?\w?\d?)\]"); + + Regex newLines = new Regex(@"\\n"); + + var stringFields = this.GetType().GetFields(BindingFlags.Instance | BindingFlags.Public).Where(a => a.FieldType == typeof(string)).ToList(); + + for (int i = 0; i < stringFields.Count(); i++) + { + FieldInfo f = stringFields[i]; + + f.SetValue(this, openBracket.Replace((string)f.GetValue(this), "{")); + + f.SetValue(this, closeBraket.Replace((string)f.GetValue(this), "}")); + + f.SetValue(this, newLines.Replace((string)f.GetValue(this), Environment.NewLine)); + } + } + + public override void OnEncodeToConfigNode() + { + Regex openCurlyBracket = new Regex(@"\{(?=\d+:?\w?\d?\})"); + + Regex closeCurlyBraket = new Regex(@"(?<=\[\d+:?\w?\d?)\}"); + + Regex newLines = new Regex(@"\n"); + + var stringFields = this.GetType().GetFields(BindingFlags.Instance | BindingFlags.Public).Where(a => a.FieldType == typeof(string)).ToList(); + + for (int i = 0; i < stringFields.Count(); i++) + { + FieldInfo f = stringFields[i]; + + f.SetValue(this, openCurlyBracket.Replace((string)f.GetValue(this), "[")); + + f.SetValue(this, closeCurlyBraket.Replace((string)f.GetValue(this), "]")); + + f.SetValue(this, newLines.Replace((string)f.GetValue(this), @"\n")); + } + } + + } +} diff --git a/SCANsat/SCAN_UI/UI_Framework/SCANlocalization.cs b/SCANsat/SCAN_UI/UI_Framework/SCANlocalization.cs new file mode 100644 index 000000000..b3da537fe --- /dev/null +++ b/SCANsat/SCAN_UI/UI_Framework/SCANlocalization.cs @@ -0,0 +1,41 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using SCANsat.SCAN_Platform; + +namespace SCANsat.SCAN_UI.UI_Framework +{ + public class SCANlocalization : SCAN_ConfigNodeStorage + { + private SCANlanguagePack activePack; + + [Persistent] + private List languagePacks = new List(); + + public SCANlocalization(string path, string node) + { + FilePath = path; + TopNodeName = node; + + if (!Load()) + { + activePack = new SCANlanguagePack(); + languagePacks.Add(activePack); + Save(); + } + } + + public override void OnDecodeFromConfigNode() + { + activePack = languagePacks.FirstOrDefault(l => l.activePack); + + if (activePack == null) + activePack = new SCANlanguagePack(); + } + + public SCANlanguagePack ActivePack + { + get { return activePack; } + } + } +} diff --git a/SCANsat/SCAN_UI/UI_Framework/SCANuiColorPicker.cs b/SCANsat/SCAN_UI/UI_Framework/SCANuiColorPicker.cs index 7aef1d423..9f1d8879e 100644 --- a/SCANsat/SCAN_UI/UI_Framework/SCANuiColorPicker.cs +++ b/SCANsat/SCAN_UI/UI_Framework/SCANuiColorPicker.cs @@ -19,6 +19,7 @@ public class SCANuiColorPicker { private float valSlider, oldValSlider; private bool lowColorChange, oldColorState; + private string lowToolTip, highToolTip, valueToolTip; private Color c = new Color(); private Color colorLow = new Color(); private Color colorHigh = new Color(); @@ -42,11 +43,14 @@ public bool LowColorChange get { return lowColorChange; } } - internal SCANuiColorPicker (Color low, Color high, bool changeLow) + internal SCANuiColorPicker (Color low, Color high, string tipLow, string tipHigh, string tipValue, bool changeLow) { colorLow = c= low; c = colorLow.maxBright(); colorHigh = high; + lowToolTip = tipLow; + highToolTip = tipHigh; + valueToolTip = tipValue; lowColorChange = oldColorState = changeLow; valSlider = oldValSlider = colorLow.Brightness().Mathf_Round(2) * 100f; } @@ -64,12 +68,15 @@ internal void drawColorSelector(Rect R) GUILayout.EndVertical(); Rect s = new Rect(r.x + 170, r.y + 100, 80, 30); - GUI.Label(s, "Value: " + valSlider.ToString("N0") + "%", SCANskins.SCAN_whiteReadoutLabel); + GUI.Label(s, new GUIContent("Value: " + valSlider.ToString("N0") + "%", valueToolTip), SCANskins.SCAN_whiteReadoutLabel); s.x += 80; s.y -= 90; s.width = 30; s.height = 200; + + GUI.Label(s, new GUIContent("", valueToolTip)); + valSlider = GUI.VerticalSlider(s, valSlider, 100, 0, SCANskins.SCAN_vertSlider, SCANskins.SCAN_sliderThumb).Mathf_Round(0); SCANuiUtil.drawVerticalSliderLabel(s, "0%", "100%"); @@ -92,10 +99,10 @@ internal void drawColorSelector(Rect R) r.width = 60; r.height = 30; - colorSwatches(r, "Low", ref lowColorChange, true, minColorPreview, minColorOld, colorLow); + colorSwatches(r, "Low", lowToolTip, ref lowColorChange, true, minColorPreview, minColorOld, colorLow); r.x += 150; - colorSwatches(r, "High", ref lowColorChange, false, maxColorPreview, maxColorOld, colorHigh); + colorSwatches(r, "High", highToolTip, ref lowColorChange, false, maxColorPreview, maxColorOld, colorHigh); r.x -= 60; r.y += 30; @@ -105,7 +112,7 @@ internal void drawColorSelector(Rect R) GUI.Label(r, "Old", SCANskins.SCAN_headlineSmall); } - private void colorSwatches(Rect R, string Title, ref bool Active, bool Low, Texture2D Preview, Texture2D Current, Color New) + private void colorSwatches(Rect R, string Title, string ToolTip, ref bool Active, bool Low, Texture2D Preview, Texture2D Current, Color New) { bool active; if (Low) @@ -113,7 +120,7 @@ private void colorSwatches(Rect R, string Title, ref bool Active, bool Low, Text else active = !Active; - active = GUI.Toggle(R, active, Title); + active = GUI.Toggle(R, active, new GUIContent(Title, ToolTip)); if (Low) Active = active; diff --git a/SCANsat/SCAN_UI/UI_Framework/SCANuiSlider.cs b/SCANsat/SCAN_UI/UI_Framework/SCANuiSlider.cs index 3424b8005..6a1421a28 100644 --- a/SCANsat/SCAN_UI/UI_Framework/SCANuiSlider.cs +++ b/SCANsat/SCAN_UI/UI_Framework/SCANuiSlider.cs @@ -19,7 +19,7 @@ public class SCANuiSlider { private float minValue, maxValue, currentValue; private float oldValue; - private string title, units; + private string title, units, tooltip; private int precision; public float MinValue @@ -48,7 +48,7 @@ internal set // internal set { currentValue = value; } //} - public SCANuiSlider(float Min, float Max, float Value, string Title, string Units, int Prec) + public SCANuiSlider(float Min, float Max, float Value, string Title, string Units, string Tooltip, int Prec) { minValue = Min; maxValue = Max; @@ -56,12 +56,14 @@ public SCANuiSlider(float Min, float Max, float Value, string Title, string Unit oldValue = Value; title = Title; units = Units; + tooltip = Tooltip; precision = Prec; } public float drawSlider(bool under, ref float value) { - GUILayout.Label(title + value + units, SCANskins.SCAN_whiteReadoutLabel); + string s = title + value + units; + GUILayout.Label(under ? new GUIContent(s) : new GUIContent(s, tooltip), SCANskins.SCAN_whiteReadoutLabel); Rect r = GUILayoutUtility.GetLastRect(); r.x += 110; diff --git a/SCANsat/SCANconfigLoader.cs b/SCANsat/SCANconfigLoader.cs index b5816a4a0..2a427a7e4 100644 --- a/SCANsat/SCANconfigLoader.cs +++ b/SCANsat/SCANconfigLoader.cs @@ -17,6 +17,7 @@ using SCANsat.SCAN_Platform.Palettes; using SCANsat.SCAN_Platform.Palettes.ColorBrewer; using SCANsat.SCAN_Platform.Palettes.FixedColors; +using SCANsat.SCAN_UI.UI_Framework; using UnityEngine; using palette = SCANsat.SCAN_UI.UI_Framework.SCANpalette; @@ -30,13 +31,22 @@ public static class SCANconfigLoader private const string configFile = "SCANsat/Resources/SCANcolors"; private const string configNodeName = "SCAN_Color_Config"; + private const string localizationFile = "SCANsat/Resources/SCANlocalization"; + private const string localizationNode = "SCAN_Localization"; + private static SCAN_Color_Config SCANnode; + private static SCAN_Localization localNode; public static SCAN_Color_Config SCANNode { get { return SCANnode; } } + public static SCANlanguagePack languagePack + { + get { return localNode.ActivePack; } + } + public static bool GlobalResource { get { return globalResource; } @@ -54,6 +64,8 @@ internal static void configLoader() SCANnode = new SCAN_Color_Config(configFile, configNodeName); loadResources(); + + localNode = new SCAN_Localization(localizationFile, localizationNode); } private static void loadSCANtypes() diff --git a/SCANsat/SCANcontroller.cs b/SCANsat/SCANcontroller.cs index 3bb9bdcf6..1a309f244 100644 --- a/SCANsat/SCANcontroller.cs +++ b/SCANsat/SCANcontroller.cs @@ -66,8 +66,8 @@ public static SCANcontroller controller [KSPField(isPersistant = true)] public int map_y = 50; [KSPField(isPersistant = true)] - public string anomalyMarker = "✗"; - public string closeBox = "✖"; + public string anomalyMarker = "X"; + public string closeBox = "X"; [KSPField(isPersistant = true)] public bool legend = false; [KSPField(isPersistant = true)] @@ -860,14 +860,10 @@ private void Start() private void Update() { if (scan_background && loaded) - { scanFromAllVessels(); - } if (!heightMapsBuilt) - { checkHeightMapStatus(); - } if (!HighLogic.LoadedSceneIsFlight && HighLogic.LoadedScene != GameScenes.TRACKSTATION) return; @@ -926,30 +922,57 @@ private void Update() } private int dataStep, dataStart; + private bool currentlyBuilding; + private SCANdata buildingData; private void checkHeightMapStatus() { - for (int i = 0; i < FlightGlobals.Bodies.Count; i++) + if (!currentlyBuilding) { - SCANdata data = getData(i); + for (int i = 0; i < body_data.Count; i++) + { + buildingData = getData(i); - if (data == null) - continue; + if (buildingData == null) + continue; - if (data.Built) - continue; + if (buildingData.Built) + continue; + + if (buildingData.MapBuilding || buildingData.OverlayBuilding) + continue; - if (data.Building) + buildingData.ControllerBuilding = true; + currentlyBuilding = true; + + return; + } + } + else + { + if (buildingData == null) + { + currentlyBuilding = false; return; + } - data.ExternalBuilding = true; - data.generateHeightMap(ref dataStep, ref dataStart, 120); + if (buildingData.Built) + { + currentlyBuilding = false; + buildingData.ControllerBuilding = false; + return; + } - return; + if (buildingData.ControllerBuilding) + { + buildingData.generateHeightMap(ref dataStep, ref dataStart, 120); + return; + } } SCANUtil.SCANlog("All Height Maps Generated"); + buildingData = null; heightMapsBuilt = true; } @@ -1373,7 +1396,14 @@ private void registerSensor(Guid id, SCANtype sensors, double fov, double min_al knownVessels[id] = new SCANvessel(); SCANvessel sv = knownVessels[id]; sv.id = id; - sv.vessel = FlightGlobals.Vessels.FirstOrDefault(a => a.id == id); + try + { + sv.vessel = FlightGlobals.Vessels.FirstOrDefault(a => a.id == id); + } + catch (Exception e) + { + Debug.LogError("[SCANsat] Something went wrong while trying to load this SCANsat vessel; moving on the next vessel... \n" + e); + } if (sv.vessel == null) { knownVessels.Remove(id); diff --git a/SCANsat/SCANmainMenuLoader.cs b/SCANsat/SCANmainMenuLoader.cs index 097e4fc96..8367d7b37 100644 --- a/SCANsat/SCANmainMenuLoader.cs +++ b/SCANsat/SCANmainMenuLoader.cs @@ -26,7 +26,6 @@ public class SCANmainMenuLoader : MonoBehaviour private string[] Assemblies = new string[7] { "SCANsatKethane", "RasterPropMonitor", "MechJebRPM", "MechJeb2", "ContractConfigurator", "CC_SCANsat", "SCANmechjeb" }; internal static string SCANsatVersion = ""; - internal static bool FinePrintWaypoint = false; internal static bool FinePrintFlightBand = false; internal static bool FinePrintStationaryWaypoint = false; public static bool MechJebLoaded = false; @@ -36,7 +35,6 @@ public class SCANmainMenuLoader : MonoBehaviour private void Start() { findAssemblies(Assemblies); - FinePrintWaypoint = SCANreflection.FinePrintWaypointReflection(); FinePrintStationaryWaypoint = SCANreflection.FinePrintStationaryWaypointReflection(); FinePrintFlightBand = SCANreflection.FinePrintFlightBandReflection(); SCANconfigLoader.configLoader(); diff --git a/SCANsat/SCANreflection.cs b/SCANsat/SCANreflection.cs index b0146b832..d07d3e626 100644 --- a/SCANsat/SCANreflection.cs +++ b/SCANsat/SCANreflection.cs @@ -22,29 +22,12 @@ namespace SCANsat { static class SCANreflection { - private static bool FinePrintWaypointRun = false; private static bool FinePrintFlightBandRun = false; private static bool FinePrintStationaryWaypointRun = false; - private static FieldInfo _FinePrintWaypoint; private static FieldInfo _FinePrintFlightBand; private static FieldInfo _FinePrintStationaryWaypoint; - internal static Waypoint FinePrintWaypointObject(SurveyWaypointParameter p) - { - Waypoint w = null; - try - { - w = (Waypoint)_FinePrintWaypoint.GetValue(p); - } - catch (Exception e) - { - SCANUtil.SCANlog("Error in detecting FinePrint Waypoint object: {0}", e); - } - - return w; - } - internal static Waypoint FinePrintStationaryWaypointObject(StationaryPointParameter p) { Waypoint w = null; @@ -75,42 +58,6 @@ internal static FlightBand FinePrintFlightBandValue(SurveyWaypointParameter p) return b; } - internal static bool FinePrintWaypointReflection() - { - if (_FinePrintWaypoint != null) - return true; - - if (FinePrintWaypointRun) - return false; - - FinePrintWaypointRun = true; - - try - { - Type sType = typeof(SurveyWaypointParameter); - - var field = sType.GetFields(BindingFlags.NonPublic | BindingFlags.Instance); - - _FinePrintWaypoint = field[0]; - - if (_FinePrintWaypoint == null) - { - SCANUtil.SCANlog("FinePrint Waypoint Field Not Found"); - return false; - } - - SCANUtil.SCANlog("FinePrint Waypoint Field Assigned"); - - return _FinePrintWaypoint != null; - } - catch (Exception e) - { - SCANUtil.SCANlog("Error in assigning FinePrint Waypoint method: {0}", e); - } - - return false; - } - internal static bool FinePrintStationaryWaypointReflection() { if (_FinePrintStationaryWaypoint != null) @@ -137,7 +84,7 @@ internal static bool FinePrintStationaryWaypointReflection() SCANUtil.SCANlog("FinePrint Stationary Waypoint Field Assigned"); - return _FinePrintWaypoint != null; + return _FinePrintStationaryWaypoint != null; } catch (Exception e) { @@ -163,7 +110,7 @@ internal static bool FinePrintFlightBandReflection() var field = sType.GetFields(BindingFlags.NonPublic | BindingFlags.Instance); - _FinePrintFlightBand = field[3]; + _FinePrintFlightBand = field[2]; if (_FinePrintFlightBand == null) { diff --git a/SCANsat/SCANsat.csproj b/SCANsat/SCANsat.csproj index c50557582..50585b18a 100644 --- a/SCANsat/SCANsat.csproj +++ b/SCANsat/SCANsat.csproj @@ -99,6 +99,8 @@ + + @@ -129,7 +131,7 @@ - ..\..\..\KSP Dev Build\Kerbal Space Program\KSP_Data\Managed\Assembly-CSharp.dll + ..\..\KSP Dev\Kerbal Space Program\KSP_Data\Managed\Assembly-CSharp.dll False @@ -139,7 +141,7 @@ ..\..\..\KSP_Data\Managed\mscorlib.dll - ..\..\..\KSP Dev Build\Kerbal Space Program\KSP_Data\Managed\UnityEngine.dll + ..\..\KSP Dev\Kerbal Space Program\KSP_Data\Managed\UnityEngine.dll False diff --git a/SCANsat/SCANutil.cs b/SCANsat/SCANutil.cs index 3202f9f00..b8a1845f3 100644 --- a/SCANsat/SCANutil.cs +++ b/SCANsat/SCANutil.cs @@ -499,24 +499,43 @@ internal static bool MouseIsOverWindow() Vector2 pos = new Vector2(Input.mousePosition.x, Screen.height - Input.mousePosition.y); - if (SCANcontroller.controller.mainMapVisible && SCANcontroller.controller.mainMap.GetWindowRect.Contains(pos)) - return true; - else if (SCANcontroller.controller.bigMapVisible && SCANcontroller.controller.BigMap.GetWindowRect.Contains(pos)) - return true; - else if (SCANcontroller.controller.BigMap.spotMap != null && SCANcontroller.controller.BigMap.spotMap.Visible && SCANcontroller.controller.BigMap.spotMap.GetWindowRect.Contains(pos)) - return true; - else if (SCANcontroller.controller.hiDefMap != null && SCANcontroller.controller.hiDefMap.Visible && SCANcontroller.controller.hiDefMap.GetWindowRect.Contains(pos)) - return true; - else if (SCANcontroller.controller.settingsWindow.Visible && SCANcontroller.controller.settingsWindow.GetWindowRect.Contains(pos)) - return true; - else if (SCANcontroller.controller.resourceSettings.Visible && SCANcontroller.controller.resourceSettings.GetWindowRect.Contains(pos)) - return true; - else if (SCANcontroller.controller.instrumentsWindow.Visible && SCANcontroller.controller.instrumentsWindow.GetWindowRect.Contains(pos)) - return true; - else if (SCANcontroller.controller.resourceOverlay.Visible && SCANcontroller.controller.resourceOverlay.GetWindowRect.Contains(pos)) - return true; - else if (SCANcontroller.controller.colorManager.Visible && SCANcontroller.controller.colorManager.GetWindowRect.Contains(pos)) - return true; + switch (HighLogic.LoadedScene) + { + case GameScenes.FLIGHT: + if (SCANcontroller.controller.mainMapVisible && SCANcontroller.controller.mainMap != null && SCANcontroller.controller.mainMap.GetWindowRect.Contains(pos)) + return true; + else if (SCANcontroller.controller.bigMapVisible && SCANcontroller.controller.BigMap != null && SCANcontroller.controller.BigMap.GetWindowRect.Contains(pos)) + return true; + else if (SCANcontroller.controller.BigMap != null && SCANcontroller.controller.BigMap.spotMap != null && SCANcontroller.controller.BigMap.spotMap.Visible && SCANcontroller.controller.BigMap.spotMap.GetWindowRect.Contains(pos)) + return true; + else if (SCANcontroller.controller.hiDefMap != null && SCANcontroller.controller.hiDefMap.Visible && SCANcontroller.controller.hiDefMap.GetWindowRect.Contains(pos)) + return true; + else if (SCANcontroller.controller.settingsWindow != null && SCANcontroller.controller.settingsWindow.Visible && SCANcontroller.controller.settingsWindow.GetWindowRect.Contains(pos)) + return true; + else if (SCANcontroller.controller.resourceSettings != null && SCANcontroller.controller.resourceSettings.Visible && SCANcontroller.controller.resourceSettings.GetWindowRect.Contains(pos)) + return true; + else if (SCANcontroller.controller.instrumentsWindow != null && SCANcontroller.controller.instrumentsWindow.Visible && SCANcontroller.controller.instrumentsWindow.GetWindowRect.Contains(pos)) + return true; + else if (SCANcontroller.controller.resourceOverlay != null && SCANcontroller.controller.resourceOverlay.Visible && SCANcontroller.controller.resourceOverlay.GetWindowRect.Contains(pos)) + return true; + else if (SCANcontroller.controller.colorManager != null && SCANcontroller.controller.colorManager.Visible && SCANcontroller.controller.colorManager.GetWindowRect.Contains(pos)) + return true; + break; + case GameScenes.TRACKSTATION: + if (SCANcontroller.controller.kscMapVisible && SCANcontroller.controller.kscMap != null && SCANcontroller.controller.kscMap.GetWindowRect.Contains(pos)) + return true; + else if (SCANcontroller.controller.kscMap != null && SCANcontroller.controller.kscMap.spotMap != null && SCANcontroller.controller.kscMap.spotMap.Visible && SCANcontroller.controller.kscMap.spotMap.GetWindowRect.Contains(pos)) + return true; + else if (SCANcontroller.controller.settingsWindow != null && SCANcontroller.controller.settingsWindow.Visible && SCANcontroller.controller.settingsWindow.GetWindowRect.Contains(pos)) + return true; + else if (SCANcontroller.controller.resourceSettings != null && SCANcontroller.controller.resourceSettings.Visible && SCANcontroller.controller.resourceSettings.GetWindowRect.Contains(pos)) + return true; + else if (SCANcontroller.controller.resourceOverlay != null && SCANcontroller.controller.resourceOverlay.Visible && SCANcontroller.controller.resourceOverlay.GetWindowRect.Contains(pos)) + return true; + else if (SCANcontroller.controller.colorManager != null && SCANcontroller.controller.colorManager.Visible && SCANcontroller.controller.colorManager.GetWindowRect.Contains(pos)) + return true; + break; + } return false; }