diff --git a/FreeCam/Components/CustomLookAround.cs b/FreeCam/Components/CustomLookAround.cs index 8504cc2..ed4d9bc 100644 --- a/FreeCam/Components/CustomLookAround.cs +++ b/FreeCam/Components/CustomLookAround.cs @@ -12,7 +12,10 @@ public class CustomLookAround : MonoBehaviour private float _moveY; private float _moveZ; - private float _moveSpeed = 1f; + private float _moveSpeed = 5f; + public float MoveSpeed { + get { return _moveSpeed; } + } void Start() => Cursor.lockState = CursorLockMode.Locked; @@ -23,29 +26,40 @@ void Update() return; } - var scrollInOut = Mouse.current.scroll.y.ReadValue(); - _moveSpeed = Math.Max(_moveSpeed + scrollInOut * 0.05f, 0f); + var scrollInOut = + Math.Max(-1f, Math.Min(1f, Mouse.current.scroll.y.ReadValue())) + + InputLibrary.toolOptionUp.GetValue() - InputLibrary.toolOptionDown.GetValue(); + _moveSpeed = (float)Math.Pow(Math.E, Math.Log(_moveSpeed) + scrollInOut * 0.1f); if (Keyboard.current[Key.DownArrow].wasPressedThisFrame) { - _moveSpeed = 0.1f; + _moveSpeed = 5f; } - var look = InputLibrary.look.GetAxisValue(true); - _degreesY = look.y * 2f; - _degreesX = look.x * 2f; + var lookRate = OWInput.UsingGamepad() ? PlayerCameraController.GAMEPAD_LOOK_RATE_Y : PlayerCameraController.LOOK_RATE; + + // Possibly this should use the ship input version? Since the freecam controls are more like flight + var look = OWInput.GetAxisValue(InputLibrary.look, InputMode.All); + _degreesY = look.y * lookRate * Time.unscaledDeltaTime; + _degreesX = look.x * lookRate * Time.unscaledDeltaTime; var move = InputLibrary.moveXZ.GetAxisValue(false); - _moveX = move.x; - _moveZ = move.y; + _moveX = move.x * _moveSpeed * Time.unscaledDeltaTime; + _moveZ = move.y * _moveSpeed * Time.unscaledDeltaTime; - _moveY = OWInput.GetValue(InputLibrary.thrustUp) - OWInput.GetValue(InputLibrary.thrustDown); + _moveY = (OWInput.GetValue(InputLibrary.thrustUp) - OWInput.GetValue(InputLibrary.thrustDown)) * _moveSpeed * Time.unscaledDeltaTime; - transform.Rotate(Vector3.up, _degreesX); + if (OWInput.IsPressed(InputLibrary.rollMode)) { + transform.Rotate(Vector3.forward, -_degreesX); + } + else { + transform.Rotate(Vector3.up, _degreesX); + } transform.Rotate(Vector3.right, -_degreesY); - transform.position += _moveZ * (transform.forward * 0.02f * _moveSpeed); - transform.position += _moveX * (transform.right * 0.02f * _moveSpeed); - transform.position += _moveY * (transform.up * 0.02f * _moveSpeed); + + transform.position += _moveZ * transform.forward; + transform.position += _moveX * transform.right; + transform.position += _moveY * transform.up; if (Keyboard.current[Key.Q].isPressed) { diff --git a/FreeCam/Components/FreeCamController.cs b/FreeCam/Components/FreeCamController.cs index 6a6583e..aa4c13f 100644 --- a/FreeCam/Components/FreeCamController.cs +++ b/FreeCam/Components/FreeCamController.cs @@ -28,9 +28,12 @@ public class FreeCamController : MonoBehaviour }; public const Key TeleportKey = Key.T; + public const Key ReparentKey = Key.Y; public static bool HoldingTeleport { get; private set; } + public void Start() => ParentToPlayer(true); + public void Update() { if (Keyboard.current[Key.NumpadDivide].wasPressedThisFrame || Keyboard.current[Key.Comma].wasPressedThisFrame) @@ -49,14 +52,13 @@ public void Update() } HoldingTeleport = false; - if (Keyboard.current[TeleportKey].isPressed) + if (Keyboard.current[TeleportKey].isPressed || Keyboard.current[ReparentKey].isPressed) { HoldingTeleport = true; if (Keyboard.current[CenterOnPlayerKey].wasPressedThisFrame || Keyboard.current[CenterOnPlayerKeyAlt].wasPressedThisFrame) { - transform.parent = Locator.GetPlayerTransform(); - transform.position = Locator.GetPlayerTransform().position; + ParentToPlayer(Keyboard.current[TeleportKey].isPressed); } foreach (var planet in CenterOnPlanetKey.Keys) @@ -64,9 +66,7 @@ public void Update() var (key, alt) = CenterOnPlanetKey[planet]; if (Keyboard.current[key].wasPressedThisFrame || Keyboard.current[alt].wasPressedThisFrame) { - var go = Locator.GetAstroObject(planet).gameObject.transform; - transform.parent = go; - transform.position = go.position; + ParentToAstroObject(Locator.GetAstroObject(planet), Keyboard.current[TeleportKey].isPressed); } } } @@ -81,4 +81,23 @@ public void Update() MainClass.ToggleFreeCam(); } } + + public void ParentToPlayer(bool warp = false) + { + var playerCameraTransform = Locator.GetPlayerCamera().transform; + transform.parent = playerCameraTransform; + if (warp) { + transform.position = playerCameraTransform.position; + transform.rotation = playerCameraTransform.rotation; + } + } + + public void ParentToAstroObject(AstroObject astroObject, bool warp = false) + { + var astroObjectTransform = astroObject.gameObject.transform; + transform.parent = astroObjectTransform; + if (warp) { + transform.position = astroObjectTransform.position; + } + } } diff --git a/FreeCam/Components/PromptController.cs b/FreeCam/Components/PromptController.cs index d13a470..aa8f8e4 100644 --- a/FreeCam/Components/PromptController.cs +++ b/FreeCam/Components/PromptController.cs @@ -7,15 +7,15 @@ namespace FreeCam.Components; public class PromptController : MonoBehaviour { - private ScreenPrompt _togglePrompt, _guiPrompt, _teleportOptions, _scrollPrompt, _rotatePrompt, _horizontalPrompt, _verticalPrompt; - private ScreenPrompt _centerPrompt; - private List _planetPrompts; - - private List _timePrompts; - - private ScreenPrompt _flashlightPrompt, _flashlightRangePrompt, _flashlightSpeedPrompt; + private ScreenPrompt + _togglePrompt, _guiPrompt, _teleportOptions, _centerPlayerPrompt, + _scrollPromptKeyboard, _scrollPromptGamepad, _speedPrompt, + _rotatePrompt, _horizontalPrompt, _verticalPrompt, _lookPrompt, + _flashlightPrompt, _flashlightRangePrompt, _flashlightSpeedPrompt; + private List _planetPrompts, _timePrompts; private CustomFlashlight _customFlashlight; + private CustomLookAround _customLookAround; private static readonly UIInputCommands _rotateLeftCmd = new("FREECAM - RotateLeft", KeyCode.Q); private static readonly UIInputCommands _rotateRightCmd = new("FREECAM - RotateRight", KeyCode.E); @@ -27,66 +27,74 @@ public class PromptController : MonoBehaviour private void Start() { _customFlashlight = GetComponent(); - + _customLookAround = GetComponent(); + // Top right _togglePrompt = AddPrompt("Toggle FreeCam", PromptPosition.UpperLeft, FreeCamController.ToggleKey); _guiPrompt = AddPrompt("Hide HUD", PromptPosition.UpperLeft, FreeCamController.GUIKey); - _scrollPrompt = new ScreenPrompt(_scrollCmd, _resetCmd, "Movement speed Reset ", ScreenPrompt.MultiCommandType.CUSTOM_BOTH); - Locator.GetPromptManager().AddScreenPrompt(_scrollPrompt, PromptPosition.UpperLeft, false); - - _horizontalPrompt = new ScreenPrompt(InputLibrary.moveXZ, "Move "); - Locator.GetPromptManager().AddScreenPrompt(_horizontalPrompt, PromptPosition.UpperLeft, false); + _scrollPromptKeyboard = AddPrompt("Change speed Reset ", PromptPosition.UpperLeft, [_scrollCmd, _resetCmd], ScreenPrompt.MultiCommandType.CUSTOM_BOTH); + _scrollPromptGamepad = AddPrompt("Change speed ", PromptPosition.UpperLeft, [InputLibrary.toolOptionUp, InputLibrary.toolOptionDown], ScreenPrompt.MultiCommandType.POS_NEG); + _speedPrompt = AddPrompt("Speed: " + _customLookAround.MoveSpeed + " m/s", PromptPosition.UpperLeft); - _verticalPrompt = new ScreenPrompt(InputLibrary.thrustUp, InputLibrary.thrustDown, "Up/Down ", ScreenPrompt.MultiCommandType.POS_NEG); - Locator.GetPromptManager().AddScreenPrompt(_verticalPrompt, PromptPosition.UpperLeft, false); + _rotatePrompt = AddPrompt( + UITextLibrary.GetString(UITextType.RollPrompt) + " " + UITextLibrary.GetString(UITextType.HoldPrompt) + " +", PromptPosition.UpperLeft, + [InputLibrary.rollMode, InputLibrary.look], ScreenPrompt.MultiCommandType.CUSTOM_BOTH + ); - _rotatePrompt = new ScreenPrompt(_rotateLeftCmd, _rotateRightCmd, "Rotate ", ScreenPrompt.MultiCommandType.CUSTOM_BOTH); - Locator.GetPromptManager().AddScreenPrompt(_rotatePrompt, PromptPosition.UpperLeft, false); + _lookPrompt = AddPrompt(UITextLibrary.GetString(UITextType.LookPrompt) + " ", PromptPosition.UpperLeft, InputLibrary.look); + _horizontalPrompt = AddPrompt(UITextLibrary.GetString(UITextType.MovePrompt) + " ", PromptPosition.UpperLeft, InputLibrary.moveXZ); + _verticalPrompt = AddPrompt("Up/Down ", PromptPosition.UpperLeft, [InputLibrary.thrustUp, InputLibrary.thrustDown], ScreenPrompt.MultiCommandType.POS_NEG); // Top Left _teleportOptions = AddPrompt("Parent options " + UITextLibrary.GetString(UITextType.HoldPrompt), PromptPosition.UpperRight, FreeCamController.TeleportKey); - _centerPrompt = AddPrompt("Player", PromptPosition.UpperRight, FreeCamController.CenterOnPlayerKey); + _centerPlayerPrompt = AddPrompt("Player", PromptPosition.UpperRight, FreeCamController.CenterOnPlayerKey); - _planetPrompts = new(); + _planetPrompts = []; foreach (var planet in FreeCamController.CenterOnPlanetKey.Keys) { _planetPrompts.Add(AddPrompt(AstroObject.AstroObjectNameToString(planet), PromptPosition.UpperRight, FreeCamController.CenterOnPlanetKey[planet].key)); } // Flashlight - _flashlightPrompt = new ScreenPrompt(InputLibrary.flashlight, UITextLibrary.GetString(UITextType.FlashlightPrompt) + " " + UITextLibrary.GetString(UITextType.PressPrompt)); - Locator.GetPromptManager().AddScreenPrompt(_flashlightPrompt, PromptPosition.UpperLeft, false); - - _flashlightRangePrompt = new ScreenPrompt(_rangeDown, _rangeUp, "Flashlight range ", ScreenPrompt.MultiCommandType.CUSTOM_BOTH); - Locator.GetPromptManager().AddScreenPrompt(_flashlightRangePrompt, PromptPosition.UpperLeft, false); - + _flashlightPrompt = AddPrompt(UITextLibrary.GetString(UITextType.FlashlightPrompt) + " " + UITextLibrary.GetString(UITextType.PressPrompt), PromptPosition.UpperLeft, InputLibrary.flashlight); + _flashlightRangePrompt = AddPrompt("Flashlight range ", PromptPosition.UpperLeft, [_rangeDown, _rangeUp], ScreenPrompt.MultiCommandType.CUSTOM_BOTH); _flashlightSpeedPrompt = AddPrompt("Adjust range faster " + UITextLibrary.GetString(UITextType.HoldPrompt), PromptPosition.UpperLeft, Key.RightShift); - _timePrompts = new() - { + _timePrompts = [ AddPrompt("0% game speed", PromptPosition.LowerLeft, Key.Comma), AddPrompt("50% game speed", PromptPosition.LowerLeft, Key.Period), AddPrompt("100% game speed", PromptPosition.LowerLeft, Key.Slash) - }; + ]; } private void Update() { - var visible = !OWTime.IsPaused() && !GUIMode.IsHiddenMode() && MainClass.ShowPrompts; + var visible = !OWTime.IsPaused() && !GUIMode.IsHiddenMode() && PlayerData.GetPromptsEnabled() && MainClass.ShowPrompts; // Top right _togglePrompt.SetVisibility(visible); - _guiPrompt.SetVisibility(visible && MainClass.InFreeCam); - _scrollPrompt.SetVisibility(visible && MainClass.InFreeCam); + + var usingGamepad = Locator.GetPromptManager()._usingGamepad; + _scrollPromptGamepad.SetVisibility(visible && MainClass.InFreeCam && usingGamepad); + _scrollPromptKeyboard.SetVisibility(visible && MainClass.InFreeCam && !usingGamepad); + + _speedPrompt.SetVisibility(visible && MainClass.InFreeCam); + var moveSpeed = _customLookAround.MoveSpeed; + string moveSpeedString; + if (moveSpeed < 0.01f || moveSpeed > 100f) { moveSpeedString = moveSpeed.ToString("0.000e0"); } + else { moveSpeedString = moveSpeed.ToString("0.000"); } + _speedPrompt.SetText("Speed: " + moveSpeedString + " m/s"); + + _rotatePrompt.SetVisibility(visible && MainClass.InFreeCam); + _lookPrompt.SetVisibility(visible && MainClass.InFreeCam); _horizontalPrompt.SetVisibility(visible && MainClass.InFreeCam); _verticalPrompt.SetVisibility(visible && MainClass.InFreeCam); - _rotatePrompt.SetVisibility(visible && MainClass.InFreeCam); // Top left _teleportOptions.SetVisibility(visible && MainClass.InFreeCam); - _centerPrompt.SetVisibility(visible && MainClass.InFreeCam && FreeCamController.HoldingTeleport); + _centerPlayerPrompt.SetVisibility(visible && MainClass.InFreeCam && FreeCamController.HoldingTeleport); foreach (var planetPrompt in _planetPrompts) { planetPrompt.SetVisibility(visible && MainClass.InFreeCam && FreeCamController.HoldingTeleport); @@ -107,7 +115,6 @@ private void Update() private static ScreenPrompt AddPrompt(string text, PromptPosition position, Key key) { Enum.TryParse(key.ToString().Replace("Digit", "Alpha"), out KeyCode keyCode); - return AddPrompt(text, position, keyCode); } @@ -122,4 +129,25 @@ private static ScreenPrompt AddPrompt(string text, PromptPosition position, KeyC return prompt; } + + private static ScreenPrompt AddPrompt(string text, PromptPosition position, IInputCommands cmd) + { + var prompt = new ScreenPrompt(cmd, text); + Locator.GetPromptManager().AddScreenPrompt(prompt, position, false); + return prompt; + } + + private static ScreenPrompt AddPrompt(string text, PromptPosition position) + { + var prompt = new ScreenPrompt(text); + Locator.GetPromptManager().AddScreenPrompt(prompt, position, false); + return prompt; + } + + private static ScreenPrompt AddPrompt(string text, PromptPosition position, List commands, ScreenPrompt.MultiCommandType cmdType) + { + var prompt = new ScreenPrompt(commands, text, cmdType); + Locator.GetPromptManager().AddScreenPrompt(prompt, position, false); + return prompt; + } }