new-horizons/NewHorizons/Patches/AudioSignalPatches.cs
2022-10-02 12:34:35 -04:00

225 lines
9.0 KiB
C#

using HarmonyLib;
using NewHorizons.Builder.Props;
using NewHorizons.External;
using NewHorizons.Handlers;
using System;
using UnityEngine;
namespace NewHorizons.Patches
{
[HarmonyPatch]
public static class AudioSignalPatches
{
[HarmonyPrefix]
[HarmonyPatch(typeof(AudioSignal), nameof(AudioSignal.SignalNameToString))]
public static bool AudioSignal_SignalNameToString(SignalName __0, ref string __result)
{
var customSignalName = SignalBuilder.GetCustomSignalName(__0);
if (customSignalName == null) return true;
else
{
__result = TranslationHandler.GetTranslation(customSignalName, TranslationHandler.TextType.UI).ToUpper();
return false;
}
}
[HarmonyPrefix]
[HarmonyPatch(typeof(AudioSignal), nameof(AudioSignal.FrequencyToIndex))]
public static bool AudioSignal_FrequencyToIndex(SignalFrequency __0, ref int __result)
{
switch (__0)
{
case (SignalFrequency.Default):
__result = 0;
break;
case (SignalFrequency.Traveler):
__result = 1;
break;
case (SignalFrequency.Quantum):
__result = 2;
break;
case (SignalFrequency.EscapePod):
__result = 3;
break;
case (SignalFrequency.WarpCore):
__result = 4;
break;
case (SignalFrequency.HideAndSeek):
__result = 5;
break;
case (SignalFrequency.Radio):
__result = 6;
break;
case (SignalFrequency.Statue):
__result = 7;
break;
default:
// Frequencies are in powers of 2
__result = (int)(Mathf.Log((float)__0) / Mathf.Log(2f));
break;
}
return false;
}
[HarmonyPrefix]
[HarmonyPatch(typeof(AudioSignal), nameof(AudioSignal.IndexToFrequency))]
public static bool AudioSignal_IndexToFrequency(int __0, ref SignalFrequency __result)
{
switch (__0)
{
case 0:
__result = SignalFrequency.Default;
break;
case 1:
__result = SignalFrequency.Traveler;
break;
case 2:
__result = SignalFrequency.Quantum;
break;
case 3:
__result = SignalFrequency.EscapePod;
break;
case 4:
__result = SignalFrequency.WarpCore;
break;
case 5:
__result = SignalFrequency.HideAndSeek;
break;
case 6:
__result = SignalFrequency.Radio;
break;
case 7:
__result = SignalFrequency.Statue;
break;
default:
__result = (SignalFrequency)(Math.Pow(2, __0));
break;
}
return false;
}
[HarmonyPrefix]
[HarmonyPatch(typeof(AudioSignal), nameof(AudioSignal.FrequencyToString))]
public static bool AudioSignal_FrequencyToString(SignalFrequency __0, ref string __result)
{
var customName = SignalBuilder.GetCustomFrequencyName(__0);
if (customName != null && customName != "")
{
if (NewHorizonsData.KnowsFrequency(customName)) __result = TranslationHandler.GetTranslation(customName, TranslationHandler.TextType.UI).ToUpper();
else __result = UITextLibrary.GetString(UITextType.SignalFreqUnidentified);
return false;
}
return true;
}
[HarmonyPrefix]
[HarmonyPatch(typeof(AudioSignal), nameof(AudioSignal.UpdateSignalStrength))]
public static bool AudioSignal_UpdateSignalStrength(AudioSignal __instance, Signalscope scope, float distToClosestScopeObstruction)
{
if (!SignalBuilder.Initialized) return true;
var isCloaked = SignalBuilder.IsCloaked(__instance._name);
var isOnQuantumMoon = SignalBuilder.IsOnQuantumMoon(__instance._name);
if (!isCloaked && !isOnQuantumMoon) return true;
__instance._canBePickedUpByScope = false;
if (__instance._sunController != null && __instance._sunController.IsPointInsideSupernova(__instance.transform.position))
{
__instance._signalStrength = 0f;
__instance._degreesFromScope = 180f;
return false;
}
// This part is modified from the original to include all QM signals
if (Locator.GetQuantumMoon() != null && Locator.GetQuantumMoon().IsPlayerInside() && !isOnQuantumMoon)
{
__instance._signalStrength = 0f;
__instance._degreesFromScope = 180f;
return false;
}
if (!__instance._active || !__instance.gameObject.activeInHierarchy || __instance._outerFogWarpVolume != PlayerState.GetOuterFogWarpVolume() || (scope.GetFrequencyFilter() & __instance._frequency) != __instance._frequency)
{
__instance._signalStrength = 0f;
__instance._degreesFromScope = 180f;
return false;
}
__instance._scopeToSignal = __instance.transform.position - scope.transform.position;
__instance._distToScope = __instance._scopeToSignal.magnitude;
if (__instance._outerFogWarpVolume == null && distToClosestScopeObstruction < 1000f && __instance._distToScope > 1000f)
{
__instance._signalStrength = 0f;
__instance._degreesFromScope = 180f;
return false;
}
__instance._canBePickedUpByScope = true;
if (__instance._distToScope < __instance._sourceRadius)
{
__instance._signalStrength = 1f;
}
else
{
__instance._degreesFromScope = Vector3.Angle(scope.GetScopeDirection(), __instance._scopeToSignal);
float t = Mathf.InverseLerp(2000f, 1000f, __instance._distToScope);
float a = Mathf.Lerp(45f, 90f, t);
float a2 = 57.29578f * Mathf.Atan2(__instance._sourceRadius, __instance._distToScope);
float b = Mathf.Lerp(Mathf.Max(a2, 5f), Mathf.Max(a2, 1f), scope.GetZoomFraction());
__instance._signalStrength = Mathf.Clamp01(Mathf.InverseLerp(a, b, __instance._degreesFromScope));
}
// If it's a cloaked signal we don't want to hear it outside the cloak field
if (isCloaked)
{
if (!PlayerState.InCloakingField())
{
__instance._signalStrength = 0f;
__instance._degreesFromScope = 180f;
return false;
}
}
else
{
// This part is taken from the regular method
if (Locator.GetCloakFieldController() != null)
{
float num = 1f - Locator.GetCloakFieldController().playerCloakFactor;
__instance._signalStrength *= num;
if (OWMath.ApproxEquals(num, 0f, 0.001f))
{
__instance._signalStrength = 0f;
__instance._degreesFromScope = 180f;
return false;
}
}
}
if (__instance._distToScope < __instance._identificationDistance + __instance._sourceRadius && __instance._signalStrength > 0.9f)
{
if (!PlayerData.KnowsFrequency(__instance._frequency) && !__instance._preventIdentification)
{
__instance.IdentifyFrequency();
}
if (!PlayerData.KnowsSignal(__instance._name) && !__instance._preventIdentification)
{
__instance.IdentifySignal();
}
if (__instance._revealFactID.Length > 0)
{
Locator.GetShipLogManager().RevealFact(__instance._revealFactID, true, true);
}
}
return false;
}
[HarmonyPrefix]
[HarmonyPatch(typeof(TravelerAudioManager), nameof(TravelerAudioManager.Update))]
public static void TravelerAudioManager_Update(TravelerAudioManager __instance)
{
__instance._signals.RemoveAll(signal => signal == null || signal.gameObject == null || signal._owAudioSource == null || signal._owAudioSource._audioSource == null);
}
}
}