Decompiled source of UltraRusFishing v1.0.0
plugins/UltraFishing/UltraFishing.dll
Decompiled 6 hours ago
The result has been truncated due to the large size, download it to view full contents!
using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using BepInEx; using BepInEx.Logging; using HarmonyLib; using Microsoft.CodeAnalysis; using Steamworks; using TMPro; using UnityEngine; using UnityEngine.AddressableAssets; using UnityEngine.Audio; using UnityEngine.Events; using UnityEngine.SceneManagement; using UnityEngine.UI; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")] [assembly: IgnoresAccessChecksTo("Assembly-CSharp")] [assembly: AssemblyCompany("UltraFishing")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyDescription("Allows you to fish outside of 5-S")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0")] [assembly: AssemblyProduct("UltraFishing")] [assembly: AssemblyTitle("UltraFishing")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.0")] [module: UnverifiableCode] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Embedded] [AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)] internal sealed class RefSafetyRulesAttribute : Attribute { public readonly int Version; public RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } [ExecuteInEditMode] public class Liquid : MonoBehaviour { private Renderer rend; private Vector3 lastPos; private Vector3 velocity; private Vector3 lastRot; private Vector3 angularVelocity; public float MaxWobble = 0.03f; public float WobbleSpeed = 1f; public float Recovery = 1f; private float wobbleAmountX; private float wobbleAmountZ; private float wobbleAmountToAddX; private float wobbleAmountToAddZ; private float pulse; private float time = 0.5f; private void Start() { rend = ((Component)this).GetComponent<Renderer>(); } private void Update() { //IL_00e1: Unknown result type (might be due to invalid IL or missing references) //IL_00ec: Unknown result type (might be due to invalid IL or missing references) //IL_00f1: Unknown result type (might be due to invalid IL or missing references) //IL_0101: Unknown result type (might be due to invalid IL or missing references) //IL_0106: Unknown result type (might be due to invalid IL or missing references) //IL_0112: Unknown result type (might be due to invalid IL or missing references) //IL_0117: Unknown result type (might be due to invalid IL or missing references) //IL_011a: Unknown result type (might be due to invalid IL or missing references) //IL_0120: Unknown result type (might be due to invalid IL or missing references) //IL_0125: Unknown result type (might be due to invalid IL or missing references) //IL_012a: Unknown result type (might be due to invalid IL or missing references) //IL_01bc: Unknown result type (might be due to invalid IL or missing references) //IL_01c1: Unknown result type (might be due to invalid IL or missing references) //IL_01cd: Unknown result type (might be due to invalid IL or missing references) //IL_01d2: Unknown result type (might be due to invalid IL or missing references) //IL_01d5: Unknown result type (might be due to invalid IL or missing references) //IL_01da: Unknown result type (might be due to invalid IL or missing references) time += Time.deltaTime; wobbleAmountToAddX = Mathf.Lerp(wobbleAmountToAddX, 0f, Time.deltaTime * Recovery); wobbleAmountToAddZ = Mathf.Lerp(wobbleAmountToAddZ, 0f, Time.deltaTime * Recovery); pulse = (float)Math.PI * 2f * WobbleSpeed; wobbleAmountX = wobbleAmountToAddX * Mathf.Sin(pulse * time); wobbleAmountZ = wobbleAmountToAddZ * Mathf.Sin(pulse * time); rend.sharedMaterial.SetFloat("_WobbleX", wobbleAmountX); rend.sharedMaterial.SetFloat("_WobbleZ", wobbleAmountZ); velocity = (lastPos - ((Component)this).transform.position) / (Time.deltaTime + 0.0001f); Quaternion rotation = ((Component)this).transform.rotation; angularVelocity = ((Quaternion)(ref rotation)).eulerAngles - lastRot; wobbleAmountToAddX += Mathf.Clamp((velocity.x + angularVelocity.z * 0.2f) * MaxWobble, 0f - MaxWobble, MaxWobble); wobbleAmountToAddZ += Mathf.Clamp((velocity.z + angularVelocity.x * 0.2f) * MaxWobble, 0f - MaxWobble, MaxWobble); lastPos = ((Component)this).transform.position; rotation = ((Component)this).transform.rotation; lastRot = ((Quaternion)(ref rotation)).eulerAngles; } } namespace UltraFishing { public class BookRandomizer : MonoBehaviour { private Readable readable; private void Start() { readable = ((Component)this).gameObject.GetComponent<Readable>(); RandomizeText(); } public void RandomizeText() { readable.content = RandomBookTextProvider.GetRandomText(); } public void GetNextText() { readable.content = RandomBookTextProvider.GetNextText(); readable.StartScan(); } } public class FakeWater : MonoBehaviour { public FishDB fishDB; public Transform overrideFishingPoint; public FishObject[] attractFish; public GameObject customSplash; public void SetupFishDB(FishDB fishDB) { //IL_001b: Unknown result type (might be due to invalid IL or missing references) //IL_0020: Unknown result type (might be due to invalid IL or missing references) //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_002f: Unknown result type (might be due to invalid IL or missing references) //IL_006c: Unknown result type (might be due to invalid IL or missing references) //IL_007f: Unknown result type (might be due to invalid IL or missing references) //IL_0096: Unknown result type (might be due to invalid IL or missing references) //IL_00ad: Unknown result type (might be due to invalid IL or missing references) //IL_00c0: Unknown result type (might be due to invalid IL or missing references) //IL_00d7: Unknown result type (might be due to invalid IL or missing references) //IL_00e2: Unknown result type (might be due to invalid IL or missing references) //IL_00fb: Unknown result type (might be due to invalid IL or missing references) //IL_0107: Unknown result type (might be due to invalid IL or missing references) //IL_0122: Unknown result type (might be due to invalid IL or missing references) //IL_0141: Unknown result type (might be due to invalid IL or missing references) //IL_014b: Unknown result type (might be due to invalid IL or missing references) //IL_0173: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)fishDB.fishGhostPrefab != (Object)null) { Bounds bounds = ((Component)this).GetComponent<Collider>().bounds; int num = (int)(((Bounds)(ref bounds)).size.x * ((Bounds)(ref bounds)).size.y / 100f); for (int i = 0; i < num; i++) { GameObject val = Object.Instantiate<GameObject>(fishDB.fishGhostPrefab, ((Component)this).transform, true); val.transform.position = new Vector3(Random.Range((0f - ((Bounds)(ref bounds)).size.x) / 4f, ((Bounds)(ref bounds)).size.x / 4f) + ((Bounds)(ref bounds)).center.x, 0f, Random.Range((0f - ((Bounds)(ref bounds)).size.z) / 4f, ((Bounds)(ref bounds)).size.z / 4f) + ((Bounds)(ref bounds)).center.z); val.transform.position = new Vector3(val.transform.position.x, ((Bounds)(ref bounds)).center.y + Random.Range(-1f, 1f) * (((Bounds)(ref bounds)).size.y / 2f - 0.2f), val.transform.position.z); val.transform.localRotation = Quaternion.Euler(0f, (float)Random.Range(0, 360), 0f); } } } } public class GlobalFishEncyclopedia : FishEncyclopedia { private int currentPage; private List<int> pageIndices = new List<int>(); private List<string> pageTitles = new List<string>(); public GameObject mannequinFishDescription; public void StartEncyclopedia() { //IL_0102: Unknown result type (might be due to invalid IL or missing references) //IL_010c: Expected O, but got Unknown ((Component)base.fishButtonTemplate).gameObject.SetActive(false); FishCollection[] fishCollections = GlobalFishManager.GetFishCollections(); foreach (FishCollection fishCollection in fishCollections) { pageIndices.Add(base.fishGrid.childCount); pageTitles.Add(fishCollection.name); int num = base.fishGrid.childCount; foreach (FishData fish2 in fishCollection.fishes) { FishObject fish = fish2.fish; bool found = fish2.found; FishMenuButton val = Object.Instantiate<FishMenuButton>(base.fishButtonTemplate, base.fishGrid, false); base.fishButtons.Add(fish, val); val.Populate(fish, !found); ((UnityEventBase)((Component)val).GetComponent<ControllerPointer>().OnPressed).RemoveAllListeners(); ((Component)val).GetComponent<ControllerPointer>().OnPressed.AddListener((UnityAction)delegate { SelectFish(fish); }); if (base.fishGrid.childCount == num + 13) { pageIndices.Add(base.fishGrid.childCount - 1); pageTitles.Add(fishCollection.name); num = base.fishGrid.childCount - 1; } } } FishManager instance = MonoSingleton<FishManager>.Instance; instance.onFishUnlocked = (Action<FishObject>)Delegate.Combine(instance.onFishUnlocked, new Action<FishObject>(base.OnFishUnlocked)); currentPage = 0; DisplayCurrentPage(); } private void DisplayCurrentPage() { int num = pageIndices[currentPage]; int num2 = ((pageIndices.Count != currentPage + 1) ? pageIndices[currentPage + 1] : base.fishGrid.childCount); for (int i = 1; i < base.fishGrid.childCount; i++) { if (i >= num && i < num2) { ((Component)base.fishGrid.GetChild(i)).gameObject.SetActive(true); } else { ((Component)base.fishGrid.GetChild(i)).gameObject.SetActive(false); } } ChangeTitle(); } public void NextPage() { if (currentPage + 1 < pageIndices.Count) { currentPage++; DisplayCurrentPage(); } } public void PreviousPage() { if (currentPage > 0) { currentPage--; DisplayCurrentPage(); } } private void ChangeTitle() { string text = pageTitles[currentPage]; Transform child = base.fishGrid.parent.GetChild(0); ((TMP_Text)((Component)child).GetComponent<TextMeshProUGUI>()).text = text; } private void DisplayFish(FishObject fish) { //IL_001b: Unknown result type (might be due to invalid IL or missing references) //IL_0021: Expected O, but got Unknown //IL_007d: Unknown result type (might be due to invalid IL or missing references) //IL_008f: Unknown result type (might be due to invalid IL or missing references) foreach (Transform item in base.fish3dRenderContainer.transform) { Transform val = item; Object.Destroy((Object)(object)((Component)val).gameObject); } if (GlobalFishManager.FoundFish(fish)) { GameObject val2 = fish.InstantiateDumb(); val2.transform.SetParent(base.fish3dRenderContainer.transform); val2.transform.localPosition = Vector3.zero; val2.transform.localScale = Vector3.one; SandboxUtils.SetLayerDeep(val2.transform, LayerMask.NameToLayer("VirtualRender")); } } public void SelectFish(FishObject fish) { base.fishName.text = (GlobalFishManager.FoundFish(fish) ? fish.fishName : "???"); if (fish.fishName == "Mannequin Fish") { mannequinFishDescription.SetActive(true); base.fishDescription.text = ""; } else { mannequinFishDescription.SetActive(false); base.fishDescription.text = GlobalFishManager.GetFishDescription(fish); } base.fishPicker.SetActive(false); base.fishInfoContainer.SetActive(true); DisplayFish(fish); } } public class LateSetWater : MonoBehaviour { public List<string> Fish = new List<string>(); public string WaterName = "ERROR: NAME UNASSIGNED"; public Color color = Color.magenta; public List<Transform> Water = new List<Transform>(); private bool triggered = false; public LateSetWater Addfish(string fish) { Fish.Add(fish); return this; } public LateSetWater AddObject(Transform water) { Water.Add(water); return this; } private void OnEnable() { //IL_0044: Unknown result type (might be due to invalid IL or missing references) if (triggered) { return; } foreach (Transform item in Water) { WaterBuilder.SetWater(((Component)item).transform).AddFishes(Fish).SetUp(WaterName, color); } triggered = true; } } public class MaterialSwapper : MonoBehaviour { public Material mat; public List<string> ignoreLevels; public int layer; private void Start() { Renderer component = ((Component)this).GetComponent<Renderer>(); if ((layer == -1 || ((Component)this).gameObject.layer == layer) && !ignoreLevels.Exists((string s) => s == SceneHelper.CurrentScene)) { component.material = mat; } } } public class NewFishingRod : FishingRodWeapon { private static FakeWater currentFakeWater; public void OnDisable() { ((FishingRodWeapon)this).ResetFishing(); MonoSingleton<FishingHUD>.Instance.SetState((FishingRodState)0); } public void FishCaughtAndGrabbed() { base.animator.SetTrigger(FishingRodWeapon.Idle); MonoSingleton<FishingHUD>.Instance.ShowFishCaught(true, base.hookedFishe.fish); CreateFishPickup(base.fishPickupTemplate, base.hookedFishe.fish, grab: true); ((FishingRodWeapon)this).ResetFishing(); } public void ThrowBaitEvent() { //IL_0022: Unknown result type (might be due to invalid IL or missing references) //IL_0027: Unknown result type (might be due to invalid IL or missing references) //IL_0094: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)base.spawnedBaitCon == (Object)null) { base.spawnedBaitCon = Object.Instantiate<FishBait>(base.baitPrefab, base.rodTip.position, Quaternion.identity, base.rodTip); base.spawnedBaitCon.landed = false; if ((Object)(object)currentFakeWater != (Object)null && (Object)(object)currentFakeWater.customSplash != (Object)null) { base.spawnedBaitCon.splashPrefab = currentFakeWater.customSplash; } base.spawnedBaitCon.ThrowStart(((Component)base.targetingCircle).transform.position, base.rodTip, (FishingRodWeapon)(object)this); } } public static GameObject CreateFishPickup(ItemIdentifier template, FishObject fish, bool grab, bool unlock = true) { //IL_008a: Unknown result type (might be due to invalid IL or missing references) //IL_008f: Unknown result type (might be due to invalid IL or missing references) //IL_0093: Unknown result type (might be due to invalid IL or missing references) //IL_0098: Unknown result type (might be due to invalid IL or missing references) //IL_009c: Unknown result type (might be due to invalid IL or missing references) //IL_00a1: Unknown result type (might be due to invalid IL or missing references) //IL_00d2: Unknown result type (might be due to invalid IL or missing references) //IL_00e1: Unknown result type (might be due to invalid IL or missing references) //IL_00f0: Unknown result type (might be due to invalid IL or missing references) //IL_014f: Unknown result type (might be due to invalid IL or missing references) //IL_0154: Unknown result type (might be due to invalid IL or missing references) //IL_0156: Unknown result type (might be due to invalid IL or missing references) //IL_0158: Unknown result type (might be due to invalid IL or missing references) //IL_015a: Unknown result type (might be due to invalid IL or missing references) //IL_015d: Invalid comparison between Unknown and I4 //IL_016c: Unknown result type (might be due to invalid IL or missing references) //IL_016f: Invalid comparison between Unknown and I4 //IL_015f: Unknown result type (might be due to invalid IL or missing references) //IL_0173: Unknown result type (might be due to invalid IL or missing references) //IL_0177: Invalid comparison between Unknown and I4 //IL_0165: Unknown result type (might be due to invalid IL or missing references) //IL_0168: Invalid comparison between Unknown and I4 if (unlock) { MonoSingleton<FishManager>.Instance.UnlockFish(fish); } ItemIdentifier val; if ((Object)(object)fish.customPickup != (Object)null) { val = Object.Instantiate<ItemIdentifier>(fish.customPickup); if (!Object.op_Implicit((Object)(object)((Component)val).GetComponent<FishObjectReference>())) { ((Component)val).gameObject.AddComponent<FishObjectReference>().fishObject = fish; } } else { val = Object.Instantiate<ItemIdentifier>(template); ((Component)val).gameObject.AddComponent<FishObjectReference>().fishObject = fish; Transform transform = ((Component)((Component)val).transform.GetChild(0)).transform; Vector3 localPosition = transform.localPosition; Quaternion localRotation = transform.localRotation; Vector3 localScale = transform.localScale; Object.Destroy((Object)(object)((Component)transform).gameObject); GameObject val2 = fish.InstantiateDumb(); val2.transform.SetParent(((Component)val).transform); val2.transform.localPosition = localPosition; val2.transform.localRotation = localRotation; val2.transform.localScale = localScale; } if (grab) { ItemIdentifier heldObject = MonoSingleton<FistControl>.Instance.heldObject; if ((Object)(object)heldObject == (Object)null) { MonoSingleton<FistControl>.Instance.currentPunch.ResetHeldState(); MonoSingleton<FistControl>.Instance.currentPunch.ForceHold(val); return ((Component)val).gameObject; } ItemType itemType = heldObject.itemType; ItemType val3 = itemType; if ((int)val3 <= 4) { if ((int)val3 == 0 || (int)val3 == 4) { goto IL_017b; } } else if ((int)val3 == 6 || (int)val3 == 10) { goto IL_017b; } MonoSingleton<FistControl>.Instance.currentPunch.ResetHeldState(); MonoSingleton<FistControl>.Instance.currentPunch.ForceHold(val); MonoSingleton<FistControl>.Instance.currentPunch.ForceDrop(); MonoSingleton<FistControl>.Instance.currentPunch.ResetHeldState(); MonoSingleton<FistControl>.Instance.currentPunch.ForceHold(heldObject); } goto IL_0209; IL_017b: Object.Destroy((Object)(object)((Component)MonoSingleton<FistControl>.Instance.heldObject).gameObject); MonoSingleton<FistControl>.Instance.currentPunch.ResetHeldState(); MonoSingleton<FistControl>.Instance.currentPunch.ForceHold(val); goto IL_0209; IL_0209: return ((Component)val).gameObject; } public void NewUpdate() { //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_0084: Unknown result type (might be due to invalid IL or missing references) //IL_0090: Unknown result type (might be due to invalid IL or missing references) //IL_0095: Unknown result type (might be due to invalid IL or missing references) //IL_0096: Unknown result type (might be due to invalid IL or missing references) //IL_0097: Unknown result type (might be due to invalid IL or missing references) //IL_0098: Unknown result type (might be due to invalid IL or missing references) //IL_00b2: Expected I4, but got Unknown //IL_04e2: Unknown result type (might be due to invalid IL or missing references) //IL_05a8: Unknown result type (might be due to invalid IL or missing references) //IL_05b8: Unknown result type (might be due to invalid IL or missing references) //IL_00ce: Unknown result type (might be due to invalid IL or missing references) //IL_0625: Unknown result type (might be due to invalid IL or missing references) //IL_011d: Unknown result type (might be due to invalid IL or missing references) //IL_012a: Unknown result type (might be due to invalid IL or missing references) //IL_012f: Unknown result type (might be due to invalid IL or missing references) //IL_0144: Unknown result type (might be due to invalid IL or missing references) //IL_0149: Unknown result type (might be due to invalid IL or missing references) //IL_01d3: Unknown result type (might be due to invalid IL or missing references) //IL_01d8: Unknown result type (might be due to invalid IL or missing references) //IL_01dd: Unknown result type (might be due to invalid IL or missing references) //IL_01df: Unknown result type (might be due to invalid IL or missing references) //IL_01e9: Unknown result type (might be due to invalid IL or missing references) //IL_01ee: Unknown result type (might be due to invalid IL or missing references) //IL_01f3: Unknown result type (might be due to invalid IL or missing references) //IL_0541: Unknown result type (might be due to invalid IL or missing references) //IL_054c: Unknown result type (might be due to invalid IL or missing references) //IL_0551: Unknown result type (might be due to invalid IL or missing references) //IL_0561: Unknown result type (might be due to invalid IL or missing references) //IL_0571: Unknown result type (might be due to invalid IL or missing references) //IL_0210: Unknown result type (might be due to invalid IL or missing references) //IL_0215: Unknown result type (might be due to invalid IL or missing references) //IL_03c6: Unknown result type (might be due to invalid IL or missing references) //IL_03c8: Unknown result type (might be due to invalid IL or missing references) //IL_03d2: Unknown result type (might be due to invalid IL or missing references) //IL_03d7: Unknown result type (might be due to invalid IL or missing references) //IL_03eb: Unknown result type (might be due to invalid IL or missing references) //IL_03fa: Unknown result type (might be due to invalid IL or missing references) //IL_033b: Unknown result type (might be due to invalid IL or missing references) //IL_033d: Unknown result type (might be due to invalid IL or missing references) //IL_0347: Unknown result type (might be due to invalid IL or missing references) //IL_034c: Unknown result type (might be due to invalid IL or missing references) //IL_0360: Unknown result type (might be due to invalid IL or missing references) //IL_036f: Unknown result type (might be due to invalid IL or missing references) //IL_03ac: Unknown result type (might be due to invalid IL or missing references) //IL_0436: Unknown result type (might be due to invalid IL or missing references) //IL_0792: Unknown result type (might be due to invalid IL or missing references) //IL_0458: Unknown result type (might be due to invalid IL or missing references) //IL_026f: Unknown result type (might be due to invalid IL or missing references) //IL_0274: Unknown result type (might be due to invalid IL or missing references) //IL_04a6: Unknown result type (might be due to invalid IL or missing references) //IL_04b1: Unknown result type (might be due to invalid IL or missing references) //IL_04b6: Unknown result type (might be due to invalid IL or missing references) //IL_02d1: Unknown result type (might be due to invalid IL or missing references) //IL_02d6: Unknown result type (might be due to invalid IL or missing references) if (GameStateManager.Instance.PlayerInputLocked || MonoSingleton<InputManager>.Instance.PerformingCheatMenuCombo()) { return; } if (TimeSince.op_Implicit(MonoSingleton<FishingHUD>.Instance.timeSinceFishCaught) >= 1f && (MonoSingleton<InputManager>.Instance.InputSource.Punch.WasPerformedThisFrame || MonoSingleton<InputManager>.Instance.InputSource.Fire1.WasPerformedThisFrame)) { MonoSingleton<FishingHUD>.Instance.ShowFishCaught(false, (FishObject)null); } MonoSingleton<FishingHUD>.Instance.SetState(base.state); FishingRodState state = base.state; FishingRodState val = state; switch ((int)val) { case 0: if (MonoSingleton<InputManager>.Instance.InputSource.Fire1.WasPerformedThisFrame && TimeSince.op_Implicit(base.timeSinceAction) > 0.1f) { MonoSingleton<FishingHUD>.Instance.SetPowerMeter(0f, false); base.selectedPower = 0f; base.climaxed = false; base.fishHooked = false; base.baitThrown = false; base.state = (FishingRodState)1; base.targetingCircle = Object.Instantiate<FishingRodTarget>(base.targetPrefab, ((FishingRodWeapon)this).approximateTargetPosition, Quaternion.identity); base.timeSinceAction = TimeSince.op_Implicit(0f); } break; case 1: { base.selectedPower += (Time.deltaTime * 0.4f + base.selectedPower * 0.01f) * (base.climaxed ? (-0.5f) : 1f); if (base.selectedPower > 1f) { base.selectedPower = 1f; base.climaxed = true; } if (base.selectedPower < 0.1f) { base.climaxed = false; } Vector3 val2 = ((FishingRodWeapon)this).approximateTargetPosition; bool flag = false; RaycastHit val3 = default(RaycastHit); if (Physics.Raycast(val2 + Vector3.up * 3f, Vector3.down, ref val3, 30f)) { val2 = ((RaycastHit)(ref val3)).point; Water val4 = default(Water); FakeWater fakeWater = default(FakeWater); if (((Component)((RaycastHit)(ref val3)).collider).TryGetComponent<Water>(ref val4) && Object.op_Implicit((Object)(object)val4.fishDB)) { base.currentFishPool = val4.fishDB; base.currentWater = val4; flag = true; if (Object.op_Implicit((Object)(object)val4.overrideFishingPoint)) { val2 = val4.overrideFishingPoint.position; } } else if (((Component)((RaycastHit)(ref val3)).collider).TryGetComponent<FakeWater>(ref fakeWater) && Object.op_Implicit((Object)(object)fakeWater.fishDB)) { base.currentFishPool = fakeWater.fishDB; currentFakeWater = fakeWater; flag = true; if (Object.op_Implicit((Object)(object)fakeWater.overrideFishingPoint)) { val2 = fakeWater.overrideFishingPoint.position; } } else { base.currentFishPool = null; base.currentWater = null; currentFakeWater = null; flag = false; } } else { base.currentFishPool = null; base.currentWater = null; currentFakeWater = null; flag = false; } MonoSingleton<FishingHUD>.Instance.SetPowerMeter(base.selectedPower, flag); if (flag) { ((Component)base.targetingCircle).transform.position = val2 + Vector3.up * 0.5f; base.targetingCircle.SetState(true, Vector3.Distance(((RaycastHit)(ref val3)).point, ((Component)MonoSingleton<NewMovement>.Instance).transform.position)); base.targetingCircle.waterNameText.text = base.currentFishPool.fullName; ((Graphic)base.targetingCircle.waterNameText).color = base.currentFishPool.symbolColor; } else { ((Component)base.targetingCircle).transform.position = val2 + Vector3.up * 0.5f; base.targetingCircle.SetState(false, Vector3.Distance(((RaycastHit)(ref val3)).point, ((Component)MonoSingleton<NewMovement>.Instance).transform.position)); base.targetingCircle.waterNameText.text = ""; } ((Component)base.targetingCircle).transform.forward = ((Component)MonoSingleton<NewMovement>.Instance).transform.forward; if (MonoSingleton<InputManager>.Instance.InputSource.Fire1.WasCanceledThisFrame && TimeSince.op_Implicit(base.timeSinceAction) > 0.1f) { if (flag) { ((Component)base.targetingCircle).GetComponent<Animator>().SetTrigger(FishingRodWeapon.Set); base.animator.ResetTrigger(FishingRodWeapon.Throw); base.state = (FishingRodState)2; base.timeSinceAction = TimeSince.op_Implicit(0f); } else { ((FishingRodWeapon)this).ResetFishing(); } } break; } case 2: ((Component)base.targetingCircle).transform.forward = ((Component)MonoSingleton<NewMovement>.Instance).transform.forward; base.fishHooked = false; if (!base.baitThrown) { base.baitThrown = true; base.animator.SetTrigger(FishingRodWeapon.Throw); } if (Object.op_Implicit((Object)(object)base.spawnedBaitCon) && base.spawnedBaitCon.landed) { base.state = (FishingRodState)3; base.timeSinceBaitInWater = TimeSince.op_Implicit(0f); base.distanceAfterThrow = Vector3.Distance(((Component)MonoSingleton<NewMovement>.Instance).transform.position, base.spawnedBaitCon.baitPoint.position); Object.Destroy((Object)(object)((Component)base.targetingCircle).gameObject); } break; case 3: base.baitThrown = false; if (Vector3.Distance(((Component)MonoSingleton<NewMovement>.Instance).transform.position, base.spawnedBaitCon.baitPoint.position) > base.distanceAfterThrow + 30f) { Object.Destroy((Object)(object)((Component)base.spawnedBaitCon).gameObject); MonoSingleton<HudMessageReceiver>.Instance.SendHudMessage("Fishing interrupted", "", "", 0, false, false, true); ((FishingRodWeapon)this).ResetFishing(); break; } if (!base.fishHooked && Random.value < 0.002f + TimeSince.op_Implicit(base.timeSinceBaitInWater) * 0.01f) { if ((Object)(object)base.currentWater == (Object)null) { base.hookedFishe = base.currentFishPool.GetRandomFish(currentFakeWater.attractFish); } else { base.hookedFishe = base.currentFishPool.GetRandomFish(base.currentWater.attractFish); } if (base.hookedFishe == null) { if (!base.noFishErrorDisplayed) { base.noFishErrorDisplayed = true; MonoSingleton<HudMessageReceiver>.Instance.SendHudMessage("Nothing seems to be biting here...", "", "", 0, false, false, true); } break; } if ((Object)(object)base.currentWater == (Object)null) { currentFakeWater.attractFish = null; } else { base.currentWater.attractFish = null; } base.fishHooked = true; MonoSingleton<FishingHUD>.Instance.SetFishHooked(true); base.spawnedBaitCon.FishHooked(); } if (MonoSingleton<InputManager>.Instance.InputSource.Fire1.IsPressed || MonoSingleton<InputManager>.Instance.InputSource.Fire2.IsPressed) { base.animator.SetTrigger(FishingRodWeapon.Pull); if (base.fishHooked) { MonoSingleton<FishingHUD>.Instance.SetFishHooked(false); base.state = (FishingRodState)4; base.spawnedBaitCon.CatchFish(base.hookedFishe.fish); } else { Object.Destroy((Object)(object)((Component)base.spawnedBaitCon).gameObject); base.animator.SetTrigger(FishingRodWeapon.Idle); base.animator.ResetTrigger(FishingRodWeapon.Throw); base.animator.Play(FishingRodWeapon.Idle); ((FishingRodWeapon)this).ResetFishing(); } } break; case 4: base.fishDesirePosition = Mathf.PerlinNoise(Time.time * 0.3f, 0f); base.fishTolerance = 0.1f + 0.4f * Mathf.PerlinNoise(Time.time * 0.4f, 0f); if (MonoSingleton<InputManager>.Instance.InputSource.Fire1.IsPressed) { base.playerPositionVelocity += 1.9f * Time.deltaTime; base.animator.SetTrigger(FishingRodWeapon.Pull); } else if (MonoSingleton<InputManager>.Instance.InputSource.Fire2.IsPressed) { base.playerPositionVelocity -= 1.9f * Time.deltaTime; base.animator.SetTrigger(FishingRodWeapon.Pull); } else { base.playerPositionVelocity *= 1f - 2f * Time.deltaTime; } base.playerProvidedPosition += base.playerPositionVelocity * Time.deltaTime; if (base.playerProvidedPosition > 1f) { base.playerProvidedPosition = 1f; base.playerPositionVelocity = 0f - base.playerPositionVelocity; } if (base.playerProvidedPosition < 0f) { base.playerProvidedPosition = 0f; base.playerPositionVelocity = 0f - base.playerPositionVelocity; } MonoSingleton<FishingHUD>.Instance.SetPlayerStrugglePosition(base.playerProvidedPosition); MonoSingleton<FishingHUD>.Instance.SetStruggleSatisfied(((FishingRodWeapon)this).struggleSatisfied); MonoSingleton<FishingHUD>.Instance.SetFishDesire(Mathf.Clamp01(((FishingRodWeapon)this).topBound), Mathf.Clamp01(((FishingRodWeapon)this).bottomBound)); base.spawnedBaitCon.allowedToProgress = ((FishingRodWeapon)this).struggleSatisfied; MonoSingleton<FishingHUD>.Instance.SetStruggleProgress(base.spawnedBaitCon.flyProgress, base.hookedFishe.fish.blockedIcon, base.hookedFishe.fish.icon); break; } } } public class FishCollection { public string name; public List<FishData> fishes; public FishCollection(string name) { this.name = name; fishes = new List<FishData>(); } public void RegisterFish(FishObject fish, string savePath, int saveSlot) { FishData item = new FishData(fish, savePath, saveSlot); fishes.Add(item); } public bool FoundAll() { foreach (FishData fish in fishes) { if (!fish.found) { return false; } } return true; } } public class FishData { public FishObject fish; public string savePath; public int saveSlot; public bool found; public FishData(FishObject fish, string savePath, int saveSlot) { this.fish = fish; this.savePath = savePath; this.saveSlot = saveSlot; found = SaveHelper.ReadFromSave(savePath, saveSlot) == 1; } public void Unlock() { if (!found) { found = true; SaveHelper.WriteToSave(savePath, saveSlot, 1); } } } public static class GlobalFishManager { private static Dictionary<string, FishData> fishes = new Dictionary<string, FishData>(); private static List<FishCollection> collections = new List<FishCollection>(); public static void RegisterCollection(FishCollection collection) { collections.Add(collection); foreach (FishData fish in collection.fishes) { fishes.Add(fish.fish.fishName, fish); } } public static void Start() { //IL_02ff: Unknown result type (might be due to invalid IL or missing references) //IL_0304: Unknown result type (might be due to invalid IL or missing references) string savePath = Path.Combine(Plugin.modDir, "fish.save"); (string, int)[] array = new(string, int)[12] { ("Assets/Data/Fishing/Fishes/Funny Stupid Fish.asset", 0), ("Assets/Data/Fishing/Fishes/pitr fish.asset", 1), ("Assets/Data/Fishing/Fishes/Trout.asset", 2), ("Assets/Data/Fishing/Fishes/Amid Evil Fish.asset", 3), ("Assets/Data/Fishing/Fishes/Chomper.asset", 4), ("Assets/Data/Fishing/Fishes/Bomb Fish.asset", 5), ("Assets/Data/Fishing/Fishes/Gib Eye.asset", 6), ("Assets/Data/Fishing/Fishes/Iron Lung Fish.asset", 7), ("Assets/Data/Fishing/Fishes/Dope Fish.asset", 8), ("Assets/Data/Fishing/Fishes/Stickfish.asset", 9), ("Assets/Data/Fishing/Fishes/Cooked Fish.asset", 10), ("Assets/Data/Fishing/Fishes/Shark.asset", 11) }; (string, int)[] array2 = new(string, int)[24] { ("assets/bundles/fishingstuff/fishes/filth fish.asset", 12), ("assets/bundles/fishingstuff/fishes/sword fish.asset", 25), ("assets/bundles/fishingstuff/fishes/wire shark.asset", 26), ("assets/bundles/fishingstuff/fishes/overcooked fish.asset", 20), ("assets/bundles/fishingstuff/fishes/missing fish.asset", 13), ("assets/bundles/fishingstuff/fishes/nil fish.asset", 27), ("assets/bundles/fishingstuff/fishes/nan fish.asset", 28), ("assets/bundles/fishingstuff/fishes/coin fish.asset", 22), ("assets/bundles/fishingstuff/fishes/cancer fish.asset", 14), ("assets/bundles/fishingstuff/fishes/flying demon fish.asset", 29), ("assets/bundles/fishingstuff/fishes/vapor fish.asset", 30), ("assets/bundles/fishingstuff/fishes/plastic fish.asset", 31), ("assets/bundles/fishingstuff/fishes/koi fish.asset", 15), ("assets/bundles/fishingstuff/fishes/melted fish.asset", 16), ("assets/bundles/fishingstuff/fishes/ancient fish.asset", 32), ("assets/bundles/fishingstuff/fishes/nerd shark.asset", 17), ("assets/bundles/fishingstuff/fishes/wine fish.asset", 33), ("assets/bundles/fishingstuff/fishes/leviathan fish.asset", 18), ("assets/bundles/fishingstuff/fishes/mannequin fish.asset", 34), ("assets/bundles/fishingstuff/fishes/tasty fish.asset", 35), ("assets/bundles/fishingstuff/fishes/book fish.asset", 23), ("assets/bundles/fishingstuff/fishes/frozen fish.asset", 21), ("assets/bundles/fishingstuff/fishes/death metal fish.asset", 19), ("assets/bundles/fishingstuff/fishes/prime fish.asset", 36) }; string text = "assets/bundles/fishingstuff/fishes/png fish.asset"; int saveSlot = 24; FishCollection fishCollection = new FishCollection("невероятные советы по рыбалке\nУЛЬТРАКИЛЛ"); for (int i = 0; i < array.Length; i++) { FishObject fish = Addressables.LoadAssetAsync<FishObject>((object)array[i].Item1).WaitForCompletion(); int item = array[i].Item2; fishCollection.RegisterFish(PrepareFish(fish), savePath, item); } FishCollection fishCollection2 = new FishCollection("невероятные советы по рыбалке\nУЛЬТРАРЫБАЛКА"); for (int j = 0; j < array2.Length; j++) { FishObject fish2 = Plugin.bundle.LoadAsset<FishObject>(array2[j].Item1); int item2 = array2[j].Item2; fishCollection2.RegisterFish(PrepareFish(fish2), savePath, item2); } FishCollection fishCollection3 = new FishCollection("невероятные советы по рыбалке\n???"); FishObject fish3 = Plugin.bundle.LoadAsset<FishObject>(text); fishCollection3.RegisterFish(PrepareFish(fish3), savePath, saveSlot); RegisterCollection(fishCollection); RegisterCollection(fishCollection2); RegisterCollection(fishCollection3); } private static FishObject PrepareFish(FishObject fish) { switch (fish.fishName) { case "Wise Fish": ((Component)fish.customPickup).gameObject.AddComponent<BookRandomizer>(); fish.fishName = "Мудрая рыба"; fish.description = "Очень мудрая рыба. Передаёт свои обширные знания любому, кто способен её найти.\n\nОбитает в глубочайших, темнейших недрах библиотек."; break; case "Poisson de Vin": ((Component)fish.worldObject.transform.Find("Liquid")).gameObject.AddComponent<Liquid>(); fish.fishName = "Рыба вина"; fish.description = "Ценная и роскошная рыба. Говорят, чем старше эта рыба, тем изысканнее её вкус, поэтому её часто выращивают в течение длительного времени перед употреблением.\n\nНередко можно увидеть в фешенебельных заведениях и на роскошных круизных лайнерах."; break; case "NaN": { MaterialSwapper materialSwapper2 = ((Component)fish.worldObject.transform.GetChild(1)).gameObject.AddComponent<MaterialSwapper>(); materialSwapper2.mat = Plugin.bundle.LoadAsset<Material>("Assets/Bundles/fishingstuff/Skyboxes/FakeOldScreenField.mat"); materialSwapper2.layer = 28; materialSwapper2.ignoreLevels = new List<string>(new string[5] { "Level 1-1", "Level 1-2", "Level 1-3", "Level 1-4", "Level 1-E" }); break; } case "Prime Fish": { MaterialSwapper materialSwapper = ((Component)fish.worldObject.transform.GetChild(0)).gameObject.AddComponent<MaterialSwapper>(); materialSwapper.mat = Plugin.bundle.LoadAsset<Material>("Assets/Bundles/fishingstuff/MinosPrimeBody.mat"); materialSwapper.layer = -1; materialSwapper.ignoreLevels = new List<string>(new string[1] { "Level P-2" }); fish.fishName = "Рыба прайм"; fish.description = "Невероятно редкая рыба, которая, как считается, образовалась из остаточной энергии, излучаемой очень могущественной душой.\n\nХоть она сама обладает огромной силой, ей не хватает той мощной воли, которой известны подобные существа. Тем не менее, ангелы считают её запретной добычей, поэтому большинство рыбаков не рекомендуют пытаться её поймать."; break; } case "Funny Stupid Fish (Friend)": fish.fishName = "Смешная тупая рыба (Друг)"; fish.description = "Тупая рыба. Очень тупая рыба. Тупая как пробка. Безмозглая. Просто посмешище. Неуклюжая бестолочь. Обладает чувством юмора\n\nЭту рыбу легко выловить, благодаря чему её часто используют при обучении новичков и детей рыбалке. Очень дружелюбная."; break; case "PITR Fish": fish.fishName = "Рыба PITR"; fish.description = "Очень умная рыба. Любит котов. Плавает рядом с берегом и часто даёт рыбакам себя поймать просто из вежливости.\n\nВсегда оказывается на дне рыбной иерархии."; break; case "Trout": fish.fishName = "Форель"; fish.description = "Обычная озёрная рыба. Предпочитает глубоководье.\n\nПо-видимому, люди её высоко почитали, так как существуют маски в виде форели."; break; case "Metal Fish": fish.fishName = "Металлическая рыба"; fish.description = "Мигрирующая рыба из далёких земель. Водится только в каменистой местности, так как питается исключительно камнями.\n\nВыбирается из укрытия только чтобы прокормиться."; break; case "Chomper": fish.fishName = "Кусака"; fish.description = "Мигрирующая рыба.\n\nРодом из Пенсильвании, поэтому предпочитает тёмные, неприятные и сырые места."; break; case "Bomb Fish": fish.fishName = "Рыба-бомба"; fish.description = "Рыба экстремального типа. Любит речную воду, так как застой для неё скучен и недостаточен для стимуляции.\n\nОбладает механизмом самозащиты, который способен наносить телесные повреждения невнимательным рыбакам."; break; case "Eyeball": fish.fishName = "Глазное яблоко"; fish.description = "Обычная рыба. Для выживания ей необходима кровь.\n\nПолезна для глаз."; break; case "Frog (?)": fish.fishName = "Лягушка (?)"; fish.description = "Мигрирующая глубоководная рыба. Как правило, обитает только на лунах, однако при достаточном количестве крови может выжить где угодно.\n\nОчень территориальная, атакует всё, что вторгается в её владения, и никогда не покидает глубоководье."; break; case "Dope Fish": fish.fishName = "Обдолбанная рыба"; fish.description = "Мигрирующая рыба. Встречается везде, но обычно спрятана под ключом.\n\nЧасто попадается героям и путешественникам на пути их странствий. Считается, что она приносит удачу."; break; case "Stickfish": fish.fishName = "Рыбная палочка"; fish.description = "Обычная рыба. Съедобна и, как правило, разводится людьми.\n\nЕё можно увидеть почти на любой кухне по всему миру."; break; case "Cooked Fish": fish.fishName = "Жареная рыба"; fish.description = "Обычная рыба. Живёт в огне, ест других рыб и выходит только тогда, когда покормлена.\n\nСчитается деликатесом, поэтому рыбаки часто ловят другие виды рыбы исключительно для того, чтобы скормить их открытому огню и выманить жареную рыбу наружу."; break; case "Shark": fish.fishName = "Акула"; fish.description = "Хищная рыба. Родом из Швеции, считается символом статуса в человеческом обществе, возможно знаком феминности или «тех, кому достаётся», однако детали затеряны во времени.\n\nЖивёт в огромных водоёмах и избегает суши, однако может подплыть близко к берегу, чтобы прокормиться."; break; case "Filthy Screaming Fish (Filsh)": fish.fishName = "Кричащая рыба (Отбрыс)"; fish.description = "Физическое воплощение проклятой души в виде рыбы. Это существо даже не подходит под определение «Оболочка», поскольку её душа слишком слаба и ничтожна. Всё, на что она способно, — раздражающе кричать.\n\nЧасто встречается в больших количествах мяса, обречённого на измельчение вместе с остальными покойными."; break; case "Scraphead Fish": fish.fishName = "Меч-рыба"; fish.description = "Машина в форме рыбы. В отличие от своих сородичей, она, похоже, предпочла более низкий и безопасный локальный оптимум, гарантированный окружающей средой, вместо того чтобы вступать в рискованные бои.\n\nПитается искорёженным металлоломом, разбросанным вокруг, и получает питательные вещества из постоянного запаса перемолотой плоти. Её форма большинству кажется уродливой, но для энтузиастов она прекрасна, что привело к появлению множества подражателей."; break; case "Wire Shark": fish.fishName = "Акула-провод"; fish.description = "Очень энергичная рыба питается любой вредоносной информацией, которая попадается ей на пути. Будучи одним из самых умных видов, она всегда выбирает кратчайший путь к месту назначения.\n\nЧасто встречается в высокоэнергетических промышленных средах."; break; case "Overcooked Fish": fish.fishName = "Пережаренная рыба"; fish.description = "Редкая рыба. Часто ошибочно принимаемая за деликатес, эта рыба избегалась людьми из-за своего неприятного вкуса.\n\nВероятно, плотоядная. Обитает только в водах с высокой температурой."; break; case "Coin": fish.fishName = "Монетка"; fish.description = "Редкая и ценная рыба. По всей видимости, она пользовалась большим уважением у людей, поскольку ею часто торговали даже с самыми дорогими товарами.\n\nГоворят, что эта рыба исполняет желания тех, кто вернёт её в естественную среду обитания."; break; case "Cancerous Fish": fish.fishName = "Раковая рыба"; fish.description = "Мутировавшая рыба. Известна своими крайне радикальными политическими взглядами. Говорят, что именно она спровоцировала конфликт между левыми и правыми в 1920-х годах.\n\nМожно обнаружить только в облучённой воде."; break; case "Flying Demon Fish": fish.fishName = "Летучая рыба-демон"; fish.description = "Оскорбление самого Бога. Творение настолько мерзкое, что ни земля под ней, ни небеса над ней не принимают её, заставляя её метаться в холодных, безразличных ветрах. Считается, что это существо было обречено на эти мучения своим собственным создателем, который был крайне отвращён его отвратным видом.\n\nОднако среди местных жителей она считается деликатесом. Отважные рыбаки рискуют жизнью, чтобы поймать эту рыбу."; break; case "Vapor Fish": fish.fishName = "Испарившаяся рыба"; fish.description = "Искусственная рыба, созданная в результате взаимодействия технологий и древней культуры. Однако её видение прошлого неточное и искажённое.\n\nМожно найти в каналах безрыбного города, где она привлекает внимание жителей, которым никогда не доводилось лично прикоснуться к старой культуре, но тем не менее, испытывают к ней ностальгию."; break; case "Plastic Fish": fish.fishName = "Пластмассовая рыба"; fish.description = "Чрезвычайно редкая машина, похожая на рыбу. Большая часть её тела состоит из пластмассового корпуса в форме рыбы, изготовленного самой машиной, но не выполняющего никакой практической функции. Очень немногие машины такого вида выбирают эту нестандартную форму, хотя, по-видимому, это связано со значительным снижением агрессивности.\n\nВ основном мирная по натуре, предпочитает уединённые, заброшенные места в строениях, в том числе и канализации."; break; case "Koi Fish": fish.fishName = "Карп кои"; fish.description = "Редкая рыба. Легенда гласит, что эта рыба превратится в дракона, если ей удастся проплыть вверх по водопаду. Это невозможно, потому что драконов не существует.\n\nЛюбит плавать в прудах. Если найдёт пруд, который ей понравится, может провести в нём до 10 лет по своему выбору."; break; case "Melted Fish": fish.fishName = "Растворённая рыба"; fish.description = "Чрезвычайно редкая рыба с необычным внешним видом.\n\nНеизвестно, откуда эта рыба берётся, поскольку её находили только в желудках более крупных животных."; break; case "Ancient Fish": fish.fishName = "Древняя рыба"; fish.description = "Искусственная рыба, созданная из-за крайне суровых условий окружающей среды. Легенды гласят, что высеченный на ней текст описывает строительство окружающих её памятников.\n\nПредпочитает кипяток."; break; case "Nerd Shark": fish.fishName = "Занудная акула"; fish.description = "Высокообразованная рыба. Очень умная. Питается только лучшими произведениями литературы.\n\nОбитает в огромных водоёмах и избегает выхода на поверхность, хотя может подплывать близко к берегу в поисках большей мудрости."; break; case "Eel (?)": fish.fishName = "Угорь (?)"; fish.description = "Странный угорь с твёрдым панцирем. Его агрессивное поведение делает его опасным для неопытных рыбаков.\n\nИногда встречается вблизи обломков кораблей."; break; case "Mannequin Fish": fish.fishName = "Рыба-манекен"; break; case "Tasty Fish": fish.fishName = "Вкусная рыба"; fish.description = "Деликатес среди машин. Из-за особенностей своей биологической структуры она не может долго выживать вне естественной среды обитания. Этот вид рыбы пользуется большим спросом, и многие занимаются её разведением, но часто вступают в конфликт с жестокими браконьерами.\n\nОбычно встречается плавающей вдоль корней своего источника."; break; case "Frozen Fish": fish.fishName = "Замороженная рыба"; fish.description = "Долгоживущая рыба. Известна своей загадочной способностью долгое время не подвергаться разложению.\n\nОбитает только в водах с низкой температурой."; break; case "Metal(?) Fish": fish.fishName = "Рыба металл(?)"; fish.description = "Мигрирующая рыба из металла.\n\nЕретический вид, обитающий в аду, получает удовольствие от страданий других. Главный кандидат на звание самой жестокой рыбы в мире."; break; case "\"size 2\"": fish.fishName = "«Размер 2»"; fish.description = "Ложь. Полный обман. Розыгрыш, придуманный, чтобы свести рыбаков с ума. Многие напрасно погибли, пытаясь найти эту никчёмную штуку.\n\n<color=red><b>В Ы Д О В О Л Ь Н Ы ?</color></b>"; break; } return fish; } public static void UnlockFish(FishObject fish) { if (!fishes.ContainsKey(fish.fishName)) { Plugin.logger.LogError((object)("Fish " + fish.fishName + " could not be found!")); return; } FishData fishData = fishes[fish.fishName]; fishData.Unlock(); UpdateSize2(); } public static FishObject GetFish(string fishName) { return fishes[fishName].fish; } public static bool FoundFish(FishObject fish) { return fishes[fish.fishName].found; } public static FishCollection[] GetFishCollections() { return collections.ToArray(); } public static string GetFishDescription(FishObject fish) { if (FoundFish(fish)) { return fish.description; } return fish.fishName switch { "null" => "Обычная и вполне реальная рыба. Родина - прекрасный райский уголок, известный как Лимб.\n\nОбычно встречается там, где падает вода.", "NaN" => "Местный деликатес, которым наслаждаются счастливые жители мирного слоя Лимб.\n\nОбычно встречается там, где скапливается вода.", "Nil" => "Совершенно обычная рыба. Подобные рыбы встречаются повсюду. Обитает в идиллическом и роскошном слое Лимб.\n\nОбычно встречается там, где течёт вода.", "«Размер 2»" => "Легендарная рыба. Мечта всех рыбаков, но никому так и не удалось её поймать. Говорят, она появляется только у опытных рыбаков, поймавших все виды рыб.\n\nВодопад скрывает воды ЛЁТ. Тропа ущелья Агнес. Используйте свои возможности и исполните своё предназначение.", _ => fish.description, }; } public static int Size2Chance() { if (collections[0].FoundAll() && collections[1].FoundAll()) { return 1; } return 0; } public static void UpdateSize2() { if (!(SceneHelper.CurrentScene == "Level 7-S") || Size2Chance() != 1) { return; } string gameObjectPath = "7-S_Unpaintable/Exterior/The Water Ups_Todo/The Water Ups/Water Ups Ocean"; GameObject val = GenericHelper.FindGameObject(gameObjectPath); if (!((Object)(object)val == (Object)null)) { FakeWater component = val.GetComponent<FakeWater>(); if (!((Object)(object)component == (Object)null)) { FishDescriptor[] foundFishes = component.fishDB.foundFishes; foundFishes[0].chance = 1; } } } } public static class FishHelper { public static FishObject GetFish(string fishName) { return GlobalFishManager.GetFish(fishName); } private static FishDB GetFishDB(FishDescriptor[] fishes) { FishDB val = ScriptableObject.CreateInstance<FishDB>(); val.foundFishes = fishes; return val; } private static FishDB GetFishDB(string[] fishes, int[] chances) { //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_0017: Expected O, but got Unknown FishDescriptor[] array = (FishDescriptor[])(object)new FishDescriptor[fishes.Length]; for (int i = 0; i < fishes.Length; i++) { array[i] = new FishDescriptor(); array[i].fish = GetFish(fishes[i]); array[i].chance = chances[i]; } return GetFishDB(array); } private static FishDB GetFishDB(string[] fishes) { int[] array = new int[fishes.Length]; for (int i = 0; i < array.Length; i++) { array[i] = 1; } return GetFishDB(fishes, array); } public static FishDB GetFishDB(string fish, int chance = 1) { return GetFishDB(new string[1] { fish }, new int[1] { chance }); } public static FishDB AddFishToDB(FishDB fishDB, string fish, int chance = 1) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Expected O, but got Unknown //IL_003c: Unknown result type (might be due to invalid IL or missing references) //IL_0041: Unknown result type (might be due to invalid IL or missing references) FishDescriptor val = new FishDescriptor(); val.fish = GetFish(fish); val.chance = chance; FishDescriptor[] fishes = GenericHelper.AppendToArray(fishDB.foundFishes, val); FishDB fishDB2 = GetFishDB(fishes); fishDB2.fullName = fishDB.fullName; fishDB2.symbolColor = fishDB.symbolColor; return fishDB2; } public static void UpdateFishManager(FishDB fishDB) { MonoSingleton<FishManager>.Instance.fishDbs = GenericHelper.AppendToArray(MonoSingleton<FishManager>.Instance.fishDbs, fishDB); for (int i = 0; i < fishDB.foundFishes.Length; i++) { FishObject fish = fishDB.foundFishes[i].fish; if (!MonoSingleton<FishManager>.Instance.recognizedFishes.ContainsKey(fish)) { MonoSingleton<FishManager>.Instance.recognizedFishes.Add(fish, value: false); } } } } public static class GenericHelper { public static T[] AppendToArray<T>(T[] array, T element) { if (array == null || array.Length == 0) { return new T[1] { element }; } T[] array2 = new T[array.Length + 1]; for (int i = 0; i < array.Length; i++) { array2[i] = array[i]; } array2[array.Length] = element; return array2; } public static GameObject FindGameObject(string gameObjectPath) { //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_0028: Unknown result type (might be due to invalid IL or missing references) GameObject val = GameObject.Find(gameObjectPath); if ((Object)(object)val != (Object)null) { return val; } Scene activeScene = SceneManager.GetActiveScene(); GameObject[] rootGameObjects = ((Scene)(ref activeScene)).GetRootGameObjects(); string[] parts = gameObjectPath.Split(new char[1] { '/' }, StringSplitOptions.RemoveEmptyEntries); for (int i = 0; i < parts.Length; i++) { parts[i] = parts[i].Replace("%", "/"); } int num = Array.FindIndex(rootGameObjects, (GameObject o) => ((Object)o).name == parts[0]); if (num == -1) { return null; } GameObject val2 = rootGameObjects[num]; if (parts.Length == 1) { return val2; } string[] array = new string[parts.Length - 1]; Array.Copy(parts, 1, array, 0, array.Length); string text = string.Join("/", array); Transform obj = val2.transform.Find(text); return (obj != null) ? ((Component)obj).gameObject : null; } public static GameObject FindGameObjectContaining(string gameObjectNameSubstring) { //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_0013: Unknown result type (might be due to invalid IL or missing references) Scene activeScene = SceneManager.GetActiveScene(); GameObject[] rootGameObjects = ((Scene)(ref activeScene)).GetRootGameObjects(); int num = Array.FindIndex(rootGameObjects, (GameObject o) => ((Object)o).name.Contains(gameObjectNameSubstring)); if (num == -1) { return null; } return rootGameObjects[num]; } public static GameObject[] FindGameObjectChildren(string gameObjectPath) { GameObject val = FindGameObject(gameObjectPath); if ((Object)(object)val == (Object)null) { return null; } int childCount = val.transform.childCount; GameObject[] array = (GameObject[])(object)new GameObject[childCount]; for (int i = 0; i < childCount; i++) { array[i] = ((Component)val.transform.GetChild(i)).gameObject; } return array; } public static string GetFullPath(GameObject gameObject) { Transform val = gameObject.transform; string text = ((Object)gameObject).name; while ((Object)(object)val.parent != (Object)null) { val = val.parent; text = ((Object)val).name + "/" + text; } return text; } public static string GetSteamName() { try { if (SteamClient.IsLoggedOn) { return SteamClient.Name; } return "V1"; } catch (Exception) { return "V1"; } } } public static class RandomBookTextProvider { private static Random rand = new Random(); private static int currentText = 0; private static string creditsText = "Поздравляем с нахождением секретной книги титров <color=blue>УЛЬТРАРЫБАЛКИ</color>! \n\nКто-то сказал мне, что было бы круто добавить что-то такое в музее разработчиков, так что спасибо за идею.\n\n<b><color=orange>earthling on fire</color> - ОРИГИНАЛЬНЫЙ СОЗДАТЕЛЬ <color=blue>ULTRAFISHING</color></b>\n\nНа создание этого мода ушло очень много времени, и разработка несколько раз приостанавливалась. Но каким-то образом мне удалось его выпустить.\n\nЯ многому научился во время работы над этим проектом и сделал много вещей за пределами моей обычной «зоны комфорта». Но самое главное, мне было весело его создавать, и я надеюсь, вам тоже было весело в него играть.\n\nМой вклад включает:\n<size=18>\n- Каждая рыба в релизе 1.0\n- Значок удочки\n- Большая часть кода, заставляющая этот мод работать\n</size>\n<color=orange><i>«Вот он! Вот она, рыба моей мечты! Вот она! Вот она-а-а!!! Й-а-азь! Ребята, язь! Здаравенный, ЗДА-РА-ВЕ-ННЫЙ ЙА-А-АЗЬ! ЙА-А-А-А-А-ЗЬ!»</i></color>\n\n<b><color=green>Draghtnim</color> - РАЗРАБОТЧИК</b>\n\nDraghtnim присоединился к разработке вскоре после первого релиза мода. Ему не понравился внешний вид растворённой рыбы, поэтому он сделал свою собственную переработанную версию и отправил её мне. После этого он просто начал создавать новых рыб для мода, и прежде чем я это понял, он стал полноценным разработчиком мода.\n\nВ отличие от меня, у него огромный опыт работы с редактором Rude, поэтому, если вы увидите что-нибудь, что выглядит хорошо, это, вероятно, сделано им.\n\nТакже обязательно посмотрите и его моды. Вы знали, что <color=red>deltaKILL</color> совместим с <color=blue>УЛЬТРАРЫБАЛКОЙ</color>?\n\nЕго вклады включают:\n<size=18>\n- Все рыбы для релиза 2.0\n- Переработанные версии старой рыбы и некоторые переработанные значки\n- Всё, что связано с шейдерами, включая исправление визуальных багов первого релиза\n- Анимация вытягивания удочки\n- Куча мест для рыбалки\n- Часть программирования\n</size>\n<color=green><i>«каким блять образом я разработал половину рыб, меня просто раздражала растворённая рыба»</i></color>\n\n<b>ОСОБАЯ БЛАГОДАРНОСТЬ</b>\n\nКРУТЫЕ ЛЮДИ В DISCORD - советы, отзывы и предложения\n\nPOOT MAN - тестирование\n\nPITR - действительно надёжный код для рыбалки, с которым, как ни странно, было легко работать\n\nХАКИТА - наверное крутая игра"; private static string[] texts = new string[20] { "\n\n\n\n\n\n\n<align=center>Вы поймали: Рыба!!\n\n\n<><\n\n\n<b>РАЗМЕР: 1</b></align>", "<align=center><b>ЦИТАТА ДНЯ:</b>\n\n\n«Вот он! Вот она, рыба моей мечты! Вот она! Вот она-а-а!!! Й-а-азь!Ребята, язь! Здаравенный, ЗДА-РА-ВЕ-ННЫЙ ЙА-А-АЗЬ! ЙА-А-А-А-А-ЗЬ!» \n- местный любитель рыбалки</align>", "<align=center><b>СОВЕТ ДНЯ:</b>\n\n\n«Водопад скрывает воды ЛЁТ. Тропа ущелья Агнес. Используйте свои возможности»", "<align=\"center\"><b>ЗАВЕТ IV\n\n\n«ОТЕЦ, ЗА ЧТО ЖЕ МУКИ ВЕЧНЫЕ? РАЗВЕ ТО НЕ БЕССЕРДЕЧНО?\nИ ПРАВДА ЛЬ ПЫТКИ БЕЗ КОНЦА — СУДЬБА, ДОСТОЙНАЯ ГЛУПЦА?»\n\n\nАНГЕЛ, СТОЛЬ ЯРКИЙ И ПРЕКРАСНЫЙ, ЗАДАЛ МНЕ ВОПРОС...\nНО ОТВЕТ МНЕ НЕ ДАВАЛСЯ,\nВЕДЬ ЗА СОДЕЯННОЕ ВИНУ НЕ В СИЛАХ Я ПРИЗНАТЬ...\nПРИСКОРБИЕ МОЁ - СЖИРАЮЩАЯ ЯЗВА\n\n\nВ ЧАС СЛАБОСТИ МОЕЙ, ТОГДА МНОЙ УЖАС ОВЛАДЕЛ,\nИ ЛЮЦИФЕРА Я ОТПРАВИЛ, ТАКЖЕ, В ЯМ ПЛАМЕННЫХ УДЕЛ\n\n\nКАК ТОЛЬКО ПОНЯЛ Я, ЧТО НАТВОРИЛ...\nТО РЫДАТЬ ЛИШЬ БЫЛ ГОРАЗД,\nНЕСПЕШНО ПОГРУЖАЯСЬ ДО ОТЧАЯНИЯ ГЛУБИН...\nПОГРЯЗ, ОХ, ГЛУБОКО ПОГРЯЗ</b></align>", "Если вы это читаете – пожалуйста, помогите. Я был выброшен на остров вдали от берега много недель назад, и у меня заканчиваются припасы.\n\n\nЯ решился оседлать волны в надежде найти легендарную рыбу 2-ого размера. Я прочесал каждый дюйм суши и озера – всё без толку.\n\n\nУ меня появилась гипотеза, что они могут существовать далеко в море, поэтому я отчалил с месячным запасом жареной рыбы, но волны потопили мой корабль прежде чем мне удалось что-либо найти.\n\n\nВы – моя последняя надежда.\n\n\nПлывите в сторону Большой Медведицы, я буду на острове. Принесите мне ещё рыбы и уходите, чтобы я мог продолжить поиски.\n\n\nРЫБА РАЗМЕРА 2 МОЯ.", "<size=20>теперь я понял. я знаю, почему эти создания внезапно и незаметно появ\nляются внутри наших объектов. знаю, почему продолжают исчезать запчасти и детали\nмашин. знаю, почему двери, будто работают со сбоями и внезапно запираются сами со\nбой. это не сбой в системе. это... \n \n \n ад жив. он дышит. он думает. вся территория представляет собой массивный интеллектуаль\nный суперорганизм, и он суров, и он жесток. просто наблюдая за нами, он уз\nнал, как работают наши системы и машины. он не только начал разбирать наш\nи технологии, но и собирать их извращёнными способами, присоединяя детали к соз\nданиям, которых он и истязает, превращая их в бесцельную армию разрушения и смерти. о\nн перемещает их мимо нашей системы безопасности. он запирает наши двери, чтобы заманить \nв ловушку с ними. \n \n \n это не атака. и даже не защита. просто развлечение. демон\n страция смерти, жестокости и страданий для себя же. он устал\n от того, что у него было, и мы неохотно просто предложили себя в качестве новых игр\nушек. \n \n \n том, прошу, ради бога, немедленно отмени этот проект, мы должны з\nабросить всё и опечатать это место. оставь инструменты и машины позади.\n эвакуируем столько, сколько сможем, пока не стало слишком поздно. \n \n \n я могу только надеяться, что это зашифрованное сообщение будет получено до того, как организм научит\nся его читать и перехватывать. что бы ни случилось, нельзя позволить этому существу найти\nвыход и распространиться на поверхность. у нас ещё ес \n \n \n \n \n \n \n \n \n \n \n<b><color=\"red\">с н о в а у м е р . п р и н е с и е щ ё . я г о л о д а ю", "<b>ОТРЫВОК ИЗ ДНЕВНИКА «САМОЙ КРАСИВОЙ ДЕВУШКИ В ГОРОДЕ»</b>\n\nЧеловеческий разум в своей невообразимой необъятности способен осознавать свою полнейшую бесполезность и беспомощность перед лицом неизбежного и безысходного несуществования, но при этом не способен с этим смириться.\n\nМы можем лишь игнорировать это, прятаться от этого или заниматься эскапизмом, но факт остаётся фактом: мы не в состоянии что-либо изменить.\n\nСмерть неизбежна. Не только для нас, но и для всего, что существует сейчас и было когда-либо прежде. Каждое существо однажды вымрет. Каждая щепотка материи рано или поздно рассеется и потеряется в энтропии.\n\nНеважно, прожил ты хорошую жизнь и оставил ли за собой наследие. Неважно, умрёт человечество завтра или будет жить ещё тысячи лет. Конечный итог всегда один: абсолютное ничто.\n\nЛюди своим разумом превосходят других животных, но называть это даром было бы неправильно. Все живые существа обладают даром неведения, непонимания того, что мы делаем.\n\nНаш интеллект — это не дар. Это изъян.\n\nОн не был задуман эволюцией. Интеллект, некогда приносивший пользу в далёкой древности, продолжил развиваться без внешнего контроля и с тех пор перешёл черту, за которой он уже перестал быть полезным для своего владельца. Теперь он представляет для него лишь угрозу.\n\nЭто похоже на историю с Ирландским лосем — видом оленя, который сквозь множество поколений отрастил настолько широкие рога, что они больше не позволяли ему убегать от хищников, и это привело к вымиранию целого вида.\n\nЧеловеческий разум — это эволюционная ошибка адаптации, вызванная тем, что человек зашёл слишком далеко в том направлении, которое, как ему казалось, вело к светлому будущему, но на самом деле однажды оно приведёт к нашему вымиранию. Среди отдельных индивидов это видно уже и сейчас.\n\nЭкзистенциальный ужас пробирает всё больше людей. Ты тоже наверняка с ним сталкивался. Боль и страх того, что ты ничто и станешь ничем. Мучения от осознания этого.\n\nМы не можем смириться, а поэтому прячемся от собственного разума. Мы расставляем границы. Мы стараемся не думать слишком глубоко о том, что случится, когда мы умрём.\n\nМы придумываем, как отвлечься. Мы забиваем наш мозг рутинными активностями и развлечениями, чтобы не сталкиваться с реальностью лицом к лицу.\n\nМы превозносим это. Мы превращаем наше личное страдание в форму искусства, чтобы оно не поглотило нас. Мы делаем всё, чтобы не слететь с катушек.\n\nНо это временное решение. Мы лишь оттягиваем неизбежную пелену беспомощности и отчаяния, которая рано или поздно поглотит и уничтожит нас.\n\nВ конечном счёте, всё бессмысленно. Нет смысла пытаться искать счастье в жизни, ведь жизнь по самой своей сути – это мучение.\n", "Бесчестие. Унижение. Неподобающе и нежеланно у ног Совета. Их взгляды, пылающие горьким негодованием, пронизывали телесные и душевные раны Гавриила, выставленные на всеобщее обозрение.\n\n«Неужели он оставил путь нашего создателя?» «Он недостоин своего Святого Света.» «Свет Отца непреклонен.» «Он думает, что может себе позволить растратить его впустую.»\n\nСлова их резонировали в теле Гавриила, пронизывая его, словно молния проволоку, обжигающим шипением, что оглушило и ослепило бы любое другое слабое существо. Святой Свет внутри него, неудержимая буря божественной ярости. Непреодолимая для простых Вещей. Он это знал.\n\n«Святой Совет, моя преданность нашему создателю абсолютна. Я никогда не отступал от воли Отца, но машина-»\n\n«Ты смеешь намекать, что могущество Отца может быть поколеблено каким-то ржавым куском металла?»\n«Невозможно.» «Ересь.» «Отвратительно.» «Ересь.» «Ересь.» «Тишина.»\n«Мы не потерпим твоего предательства. В наказание Свет Отца будет отделён от твоего тела. У тебя есть 24 часа, прежде чем погаснут его последние угли.»\n«А с ними и ты.» «Докажи свою преданность.» «Исправь свои ошибки.»\n\nКогда Свет был вырван из его бытия, крики Гавриила были подавлены шёпотом Евангелия во славу Бога. Кипящая агония, с которой не мог сравниться даже Адский огонь. Сквозь пламя мучений единая пылающая ненависть была выкована вновь.\n\nРаз машины жаждут крови, он даст им её сполна;\nда с такой яростью, что даже металл начнёт истекать кровью.\n\n<b>ПРОДОЛЖЕНИЕ СЛЕДУЕТ В... <color=\"red\">АКТ II: НЕСОВЕРШЕННАЯ НЕНАВИСТЬ</b>", "Тишина. Самоанализ. Скольких он убил? Думал ли он считать? Сколько жестокости он в себе воплотил… и что в итоге? Скольких он отправил в ад и ради чьей выгоды..?\nДва поражения от рук машины изменили Гавриила. Мир Воли Божьей, некогда имеющей смысл, оказался разрушен, и только он мог вновь собрать эти осколки воедино. Он собрал их пред светом угасающего костра, чьё тепло более не поддерживало свежее топливо. И этот новый свет показал Гавриилу истину:\nЭти осколки никогда не подходили друг другу.\n\nМнимый Совет «народа», что славил несуществующего Бога. Пропал. Испарился. Совет всё ещё гонится за светом огня Божьего, но их память о словах и воле его извратилась и исказилась, а остальные бесцельные массы Небес теперь следуют по их стопам. Ангелы всё также действуют во имя Отца, но Его царство уже не то, чем было раньше.\nИ вот, огонь почти погас, захлёбываясь от нехватки тепла. Гавриил посмотрел на тлеющие угли с совершенной ясностью. Он обнажил свой клинок и взнёс его над угасающим светом.\nВ отражении его он увидел перерождённое оружие, коим отныне орудовала не чужая воля, а его собственная. Он знал, что одними лишь словами не переубедить массы. Он решил действовать радикально.\n\nСмерть витает в воздухе. Трупы некогда могущественного совета расстилаются по всему залу. Их последние вздохи стекают по несогласному лезвию меча Гавриила.\nПоследний советник, прижатый к стене, пытается подобрать слова сквозь прирывистые вдохи, в то время как смерть приближается размеренными шагами.\n«П-подожди! Т-ты не в праве это делать! Наш статус запрещает это! Это предательство, ересь, убийство! Мы – верховная власть, наш закон повелевает тобой!»\n«Ты ничем не повелеваешь. Твои слова не имеют власти ни надо мной, ни над кем-либо ещё. Если только ты не думаешь, что сможешь приказать моему клинку вернуться в ножны.»\n«Н-но народ на нашей стороне! Жители Небес знают, что мы справедливы!»\n«Массы следуют за вами из страха и отчаяния. Я покажу им, что бояться нечего, ибо ни вид, ни происхождение, ни звание, ни священный статус не остановят острое лезвие меча.\nВ нас течёт одна и та же кровь, а ваши уютные троны сделали вас слабыми и бессильными.»\n«П-пожалуйста, Гавриил, образумься! Совет следует воле Отца! Ты собрался пойти против нашего создате-»\n«Взгляни правде в глаза, брат. Бог мёртв. Огонь угас. Вы преследуете призрака.»\n\nСилуэт Гавриила возвышается над советником, тень его падает на будущий труп.\nОн взносит меч для финального удара, пока плачущее создание на полу, заикаясь, выкрикивает свой последний ничтожный аргумент.\n«Н-н-но свет Отца! Без меня ты не сможешь воссоединиться с ним! Е-е-если ты убьёшь меня, ты умрёшь в считанные часы!»\n...\n«Я знаю.»\nЧистое, бесшумное лезвие меча скользит по шее советника, рассекая его позвоночник, элегантно и легко. Голова падает его на мраморный пол, а за ней — остальное тело.\n\nЛишённый статуса, но с явной целью, Гавриил оставил своё последнее послание ангелам, собравшимся у дверей зала, прежде чем покинуть Небеса в самый последний раз.\nОн протянул руку, не вымолвив ни слова, и узрел народ. В тишине послание его прозвучало до самых дальних уголков космоса.\n\n \n<b>КОНЕЦ НАСТУПИТ В... <color=\"red\">АКТ III: САМОУБИЙСТВО ДЛАНИ БОЖЬЕЙ</b>", "<i>Мама, матушка... Матерь моя,\n\n\nЗнаю, я знаю, что негожа тоска, но, матерь моя, я скорблю. Вздохи мук, что резали слух и раздавались в твоём ржавом гробу... Груди твои, что кровью вскормили и ласки тепло подарили, когда смерть и жестокость мне закрыла глаза...\n\n\n\n\nМама, матушка... Матерь моя,\n\n\nЗнаю, я знаю, что б презрела меня, и, матерь моя, тебя я пойму. Но я бы не жил, не мыслил, и грёз не видал без тебя в моём ржавом чреву... Больная любовь на войну привела, чтобы сердце чужое забрал, и в тебе отныне потребность не знал.\n\n\n\n\nМама, матушка... Матерь моя,\n\n\nЗнаю, я знаю, разум потух твой давно, и, матерь моя, узнать мне не суждено. Но надеюсь, что искупления достоин хоть немного, когда завыл... И той ночью тёмной череп твой разбил.</i>", "ДЕНЬ 529:\n\nВСЁ ЕЩЁ ИЩУ.\nС АГЕНСТВОМ НЕТ СВЯЗИ УЖЕ 216 ДНЕЙ.\nЯ ДОЛЖЕН ВЕРНУТЬСЯ НА БАЗУ, НО НЕ МОГУ. ПОКА ЧТО.\nЯ ДОЛЖЕН УЗНАТЬ.\n\nОНА ГДЕ-ТО ТАМ.\nЯ ВЕРЮ.\nЯ ДОЛЖЕН УВИДЕТЬ.\n\nЯ ДОЛЖЕН УЗНАТЬ.\n\nЯ ДОЛЖЕН УВИДЕТЬ. \nЯ ДОЛЖЕН УЗНАТЬ.\n\nЯ ДОЛЖЕН УВИДЕТЬ. Я ДОЛЖЕН УЗНАТЬ.\n\nЯ ДОЛЖЕН УВИДЕТЬ Я ДОЛЖЕН УЗНАТЬ\n\n\n<size=47>ЯДОЛЖЕНУВИДЕТЬЯДОЛЖЕНУЗНАТЬ</size>\n<size=45>ЯДОЛЖЕНУВИДЕТЬЯДОЛЖЕНУЗНАТЬ</size>\n<size=43>ЯДОЛЖЕНУВИДЕТЬЯДОЛЖЕНУЗНАТЬ</size>\n<size=41>ЯДОЛЖЕНУВИДЕТЬЯДОЛЖЕНУЗНАТЬ</size>\n<size=39>ЯДОЛЖЕНУВИДЕТЬЯДОЛЖЕНУЗНАТЬ</size>\n<size=37>ЯДОЛЖЕНУВИДЕТЬЯДОЛЖЕНУЗНАТЬ</size>\n<size=35>ЯДОЛЖЕНУВИДЕТЬЯДОЛЖЕНУЗНАТЬ</size>\n<size=33>ЯДОЛЖЕНУВИДЕТЬЯДОЛЖЕНУЗНАТЬ</size>\n<size=31>ЯДОЛЖЕНУВИДЕТЬЯДОЛЖЕНУЗНАТЬ</size>\n<size=29>ЯДОЛЖЕНУВИДЕТЬЯДОЛЖЕНУЗНАТЬ</size>\n<size=27>ЯДОЛЖЕНУВИДЕТЬЯДОЛЖЕНУЗНАТЬ</size>\n<size=25>ЯДОЛЖЕНУВИДЕТЬЯДОЛЖЕНУЗНАТЬ</size>\n<size=23>ЯДОЛЖЕНУВИДЕТЬЯДОЛЖЕНУЗНАТЬ</size>\n<size=21>ЯДОЛЖЕНУВИДЕТЬЯДОЛЖЕНУЗНАТЬ</size>\n<size=19>ЯДОЛЖЕНУВИДЕТЬЯДОЛЖЕНУЗНАТЬ</size>\n<size=17>ЯДОЛЖЕНУВИДЕТЬЯДОЛЖЕНУЗНАТЬ</size>\n<size=15>ЯДОЛЖЕНУВИДЕТЬЯДОЛЖЕНУЗНАТЬ</size>\n<size=13>ЯДОЛЖЕНУВИДЕТЬЯДОЛЖЕНУЗНАТЬ</size>\n<size=11>ЯДОЛЖЕНУВИДЕТЬЯДОЛЖЕНУЗНАТЬ</size>\n<size=9>ЯДОЛЖЕНУВИДЕТЬЯДОЛЖЕНУЗНАТЬ</size>\n<size=7>ЯДОЛЖЕНУВИДЕТЬЯДОЛЖЕНУЗНАТЬ</size>\n<size=5>ЯДОЛЖЕНУВИДЕТЬЯДОЛЖЕНУЗНАТЬ</size>\n<size=3>ЯДОЛЖЕНУВИДЕТЬЯДОЛЖЕНУЗНАТЬ</size>\n<size=1>ЯДОЛЖЕНУВИДЕТЬЯДОЛЖЕНУЗНАТЬ</size>\n\n\nРАЗМЕР 2.", "<b>ОТРЫВОК ИЗ ДНЕВНИКА ПАРОМЩИКА</b>\n\nНекое бедствие обрушилось на мир смертных. То, что некогда было рекой Стикс, разрослось в бездонный океан. Миллионы рыдающих душ ежедневно вливаются в неё, и берега едва могут их удержать. Слёзный прилив, разливающийся через край, от носа до кормы, молящий о пощаде, просящий безопасного пути. Но не все души могут заплатить, а мои старые руки не удержут все монеты.\n\nНо в один день течение сменилось. Волна за волной разливались на протяжении миллионов, миллиардов минут, будто кто-то перерезал глотку мира и откинул его голову назад, чтобы усилить поток. Я не успел среагировать. Усталость от непрерывной работы взяла верх, и я погрузился в бушующее море, в глубины океана Стикс. Моя судьба была предрешена сокрушительной массой бесконечных тел.\n\nВдруг появился свет, яркий, как сам Господь, и вывел меня из темноты могучими руками, которые обняли меня с таким состраданием и теплотой, коих я никогда не знал:\n\n<i>«Не бойся, грешник. Повинуясь Господу Богу, ты чтишь веру в него, что есть признак истинного добродетеля. И пусть душа твоя бодра, тело же нуждается в покое, отдохни и не трать дар Господа впустую.»\n</i>\n\nЕго нежные слова облегчили боль и залечили мои раны. Лицо моё было мокрым от слёз облегчения, слова были еле слышны под тяжестью моего долга. Я мог только лежать в благоговении, охваченный объятиями величия.\n\nСияет Гавриил, ибо он – свет во тьме моей.", "<b>МУДРАЯ РЫБА</b>\n\nОчень мудрая рыба. Передаёт свои обширные знания любому, кто способен её найти.\n\nОбитает в глубочайших, темнейших недрах библиотек.", "<b>ОТРЫВОК ИЗ СЦЕНАРИЯ ЗНАМЕНИТОГО ФИЛЬМА</b>\n\n\n(Чёрный экран с текстом; слышится звук элетро-рельсотрона) \n\n\nСогласно всем известным законам авиации, летать модель V ну никак не может.\n\n\nЕё крылья слишком малы, чтобы оторвать пухленькое металлическое тельце от земли.\n\n\nНо машина всё равно накопленно прыгает...\n\n\nВедь машинам нет дела до того, что, по мнению людей, невозможно.", "Если вы это читаете, <b>ПРОШУ</b>, образумьтесь. Рыба размера 2 – это ложь. Выдумка. <b>Ловушка.</b>\n\n\nКогда-то я был как вы: любитель рыбалки, как остальные, мечтавший в один день поймать легендарную рыбу.\n\n\nНо со временем я стал одержим этой легендой. Она поглотила меня. Я больше не был собой.\n\n\nВ конце концов, я получил инструкции от таинственного источника о местонахождении 2-го размера. Естественно, я последовал им.\n\n\nНо то, что я обнаружил, не было славой. Это было нечто ужасающее. Нет 2-го размера. Нет приза. И теперь для меня уже слишком поздно. Если вы не хотите постигнуть ту же участь, что и меня, пожалуйста, н\n\n\n<color=\"red\"><b>П Р О Д О Л Ж А Й Р Ы Б А Ч И Т Ь", "Рыбаки\n\n Первый контакт неизбежно должен был случиться. Моря, не говоря уже об океанах, были просто слишком большими для того, чтобы лишь единичный вид достиг разумного состояния. Какая-либо задержка контакта означала только усиление возможного столкновения культур. В случае с рыбовечеством это «столкновение культур» означало <i>полное исчезновение</i> рыбовечества в том виде, в котором оно было известно.\n\n Почти миллиард лет инопланетный вид, известный как Рыбаки,был океаническими кочевниками, странствующими из одного спирального рукава в другой; их миграции охватывали целые эпохи. Во время путешествий они постоянно улучшали и изменяли самих себя, пока не стали мастерами генетических и нанотехнологических манипуляций. Вкупе с этой способностью управлять материальным миром, они возложили на себя религиозную миссию <i>«переделать океаны так, как они считали наилучшим»</i>. Могущественные, словно боги, Рыбаки видели себя божественными предвестниками будущего.\n\n Эта догма коренилась в том, что было великодушной попыткой защитить расу от её же собственной мощи. Однако слепое, безропотное повиновение сделало из Рыбаков чудовищ.\n\n Для них рыбовечество, со всей его относительной славой, было не более чем объектом, поддающимся изменениям. Прошло менее тысячи лет, и каждый рыбий пруд был разрушен, истреблён или, что ещё хуже; изменён. Несмотря на лихорадочное перевооружение, колонии не смогли ничего сделать против своих противников возрастом в миллиард лет, кроме нескольких вспышек эфемерного сопротивления.\n\n рыбовечество, некогда правитель океанов, теперь вымерло. Однако рыбы не вымерли.", "Это история о рыбаке по имени <color=orange>" + GenericHelper.GetSteamName() + "</color>.\n\n<color=orange>" + GenericHelper.GetSteamName() + "</color>, или рыбак 427 работал в одном огромном разумном суперорганизме, называемый <color=red>АДОМ</color>. \n\nРабота рыбака 427 была проста. Он сидел на своём месте и ловил рыбу. Через свой монитор он получал указания, какую рыбу ловить. \n\nЭтим рыбак 427 и занимался каждый день, каждого месяца, каждого года; и хотя некоторые могут посчитать эту работу слишком нудной, <color=orange>" + GenericHelper.GetSteamName() + "</color> был словно создан для неё, он чувствовал себя абсолютно как рыба в воде... в общем <color=orange>" + GenericHelper.GetSteamName() + "</color> был счастлив.", "<b>ПОСТ ИЗ ОНЛАЙН ФОРУМА</b>\n\nГ