using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; // Dependency substitutes only. Production method bodies are in Generated.cs. public static class Probe { public static int RankCalls,HomeCalls,CameraWrites,VolumeAfterRelease,PoolCreates,Subscriptions,ReleasedHandles,UiCalls,Published,SubscriptionsAttempt,ThrowSubscriptionAt; public static bool ThrowVolume,ThrowPool; public static List> Seconds=new(); public static TaskCompletionSource Frame,Delay; public static void Reset(){RankCalls=HomeCalls=CameraWrites=VolumeAfterRelease=PoolCreates=Subscriptions=ReleasedHandles=UiCalls=Published=SubscriptionsAttempt=ThrowSubscriptionAt=0;ThrowVolume=ThrowPool=false;Seconds.Clear();Frame=new();Delay=new();Addressables.Pending.Clear();Addressables.All.Clear();GContext.container=new();UIManager.Instance=new();} } public static class Awaiters {public static Task NextFrame=>Probe.Frame.Task;public static Task SecondsRealtime(float _) => Probe.Delay.Task;public static Task Seconds(float _){var t=new TaskCompletionSource();Probe.Seconds.Add(t);return t.Task;}} public static class GContext {public static Container container;public static void Publish(T _){Probe.Published++;} public static EventStream OnEvent()=>new();} public class Container {public Dictionary Values=new();public void Unregister(){Values.Remove(typeof(T));} public T Resolve(){if(Values.TryGetValue(typeof(T),out var v))return (T)v; var a=Activator.CreateInstance();Values[typeof(T)]=a;return a;}} public class EventStream{public IDisposable Subscribe(Action action){Probe.SubscriptionsAttempt++;if(Probe.ThrowSubscriptionAt>0&&Probe.SubscriptionsAttempt==Probe.ThrowSubscriptionAt)throw new Exception("subscription failure");Probe.Subscriptions++;return new Subscription();}} public class Subscription:IDisposable{bool disposed;public void Dispose(){if(disposed)return;disposed=true;Probe.Subscriptions--;}} public class CompositeDisposable:IDisposable{public List Items=new();public void Dispose(){foreach(var x in Items)x.Dispose();Items.Clear();}} public static class RxExtensions{public static void AddTo(this IDisposable d,CompositeDisposable c)=>c.Items.Add(d);} public class GameObject {public bool Destroyed;public Transform transform=new();public int ActiveWrites;public void SetActive(bool _){ActiveWrites++;}public T GetComponent() where T:new()=>new();public static void Destroy(GameObject g){if(g!=null)g.Destroyed=true;}} public class HomePanel {public void OnStart()=>Probe.HomeCalls++;} public class UIManager {public static UIManager Instance;public TaskCompletionSource Ready=new();public Task RestartShowUI(object _) {Probe.UiCalls++;return Ready.Task;}} public static class UITypes {public static object HomePanel=new();} public class IDeferredRewardStashService{public void DisposeSubscriptions(){}} public class PlayerShopData{public TaskCompletionSource Pending;public Task ReleaseReplenishment()=>Pending?.Task??Task.CompletedTask;} public class FishingEventData{public void ShowRankTierChange()=>Probe.RankCalls++;} public class FishingData{public bool isMapBuff;public GameObject mainCamera=new();public BehaviorConf fishingBehaviorConf=new();} public class BehaviorConf{public float rodEnterMapDelay=.1f;} public class Behavior {public Rod RodBehaviour=new();public Animator cameraAnimator=new();} public class Rod {public GameObject gameObject=new();} public class Animator {public bool enabled;public Transform transform=new();public int speed{set{Probe.CameraWrites++;}}public void Play(string _,int __,int ___){Probe.CameraWrites++;}} public class Transform{public Vector3 localEulerAngles,localPosition;} public struct Vector3{public static Vector3 zero=>new();} public class PlayableDirector{public GameObject gameObject=new();public double duration=1;} public class MapData{public string BGM="bgm";} public class IUserService{public bool IsAuthorized=true;public CancellationTokenSource Lifetime=new();public CancellationToken LoginLifetime=>Lifetime.Token;} public class ShowHandEvent{public bool isShow;} public partial class GetUiSubject {public bool Destroyed;public FishingData fishingData=new();public bool IsHideHomeMap;public Behavior fishingBehavior=new();public MapData _curMapData=new();public void SetMapShow(bool _){} public static bool operator ==(GetUiSubject a,GetUiSubject b)=>ReferenceEquals(a,b)||(ReferenceEquals(a,null)&&!ReferenceEquals(b,null)&&b.Destroyed)||(ReferenceEquals(b,null)&&!ReferenceEquals(a,null)&&a.Destroyed);public static bool operator !=(GetUiSubject a,GetUiSubject b)=>!(a==b);public override bool Equals(object obj)=>ReferenceEquals(this,obj);public override int GetHashCode()=>base.GetHashCode();} namespace cfg{public class Tables{}} public class ISettingService{public bool Music=true,Sound=true;} public class AudioClip{} public class AudioMixer{public void GetFloat(string _,out float v){v=0;}public AudioMixerSnapshot FindSnapshot(string _)=>new();} public class AudioMixerSnapshot{} public class AudioMixerGroup{} public class Sound {public GameObject gameObject=new();public AudioSource audioSource=new();} public class AudioSource{public void Stop(){}} public class FakeSoundService { public bool Released;public int Releases;public TaskCompletionSource Pending;public Task InitAsync(){Released=false;return Pending?.Task??Task.CompletedTask;}public void Release(){Released=true;Releases++;}public void ReturnSound(Sound _){} void Volume(){if(Released)Probe.VolumeAfterRelease++;if(Probe.ThrowVolume)throw new Exception("volume failure");} public int BGMVol{set{Volume();}}public int SFXVol{set{Volume();}}public int VoiceVol{set{Volume();}} } public class EventUISound{} public class EventRewardSound{} public class EventFishingSound{} public class EventBGMSound{public EventBGMSound(string _) {}} public class FadeOutEvent{} public class AssetReferenceAudioClip{} public class AssetReferenceAudioVoiceClip{} public class ChangeRodDataEvent{} public class SoundMuteEvent{} public class OnSoundStateEvent{} public class LowpassEffectEvt{} public partial class ManagerSubject { private int initializationVersion; public FakeSoundService soundService=new();public cfg.Tables _tables;public string[] residentFish={"clip-a","clip-b"}; public Dictionary residentClip;public CompositeDisposable disposables;public Dictionary rewardSoundDic=new();public HashSet _activeFishingLoopSounds=new();public AudioClip BGM_Clip;public Sound BGM_Sound;public string BGMName; void PlaySound(EventUISound _){}void PlayRewardSound(EventRewardSound _){}void PlayFishingSound(EventFishingSound _){}void PlayMusic(EventBGMSound _){}void FadeOutEvent(FadeOutEvent _){}void PlaySoundByReference(AssetReferenceAudioClip _){}void PlayVoiceSoundByReference(AssetReferenceAudioVoiceClip _){}void OnChangeRodData(ChangeRodDataEvent _){}void OnSoundMute(SoundMuteEvent _){}void OnSoundStateEvent(OnSoundStateEvent _){} } public interface IOperation{bool Valid{get;set;}int Releases{get;set;}object Asset{get;}string Key{get;set;}} public class Operation:IOperation {public TaskCompletionSource Completion=new(); public bool Valid{get;set;}=true; public int Releases{get;set;}public object Asset=>Completion.Task.IsCompletedSuccessfully?Completion.Task.Result:null;public string Key{get;set;}} public struct AsyncOperationHandle{public Operation Op;public Task Task=>Op.Completion.Task;public T Result{get{if(!IsValid())throw new Exception("read released handle");return Op.Completion.Task.GetAwaiter().GetResult();}}public bool IsValid()=>Op!=null&&Op.Valid;} public static class Addressables { public static List All=new();public static Dictionary Pending=new();public static AsyncOperationHandle LoadAssetAsync(string key){var op=new Operation{Key=key};Pending[key]=op;All.Add(op);return new(){Op=op};} public static Operation Get(string key)=>(Operation)Pending[key];public static void Complete(string key,T value)=>Get(key).Completion.SetResult(value); public static void Release(AsyncOperationHandle h){if(!h.IsValid())throw new Exception("invalid/double handle release");h.Op.Valid=false;h.Op.Releases++;Probe.ReleasedHandles++;} public static void Release(object asset) {if(asset==null)return;var op=All.FirstOrDefault(o=>o.Valid&&ReferenceEquals(o.Asset,asset));if(op==null)throw new Exception("unowned/double object release");op.Valid=false;op.Releases++;Probe.ReleasedHandles++;} } public static class Assert{public static void IsNotNull(object value){if(value==null)throw new Exception("Assert null");}} public class Pool{public int Active;public void CreatePool(T _,int a,int b){Active++;Probe.PoolCreates++;if(Probe.ThrowPool)throw new Exception("pool failure");}public void DestroyPool(){Active=0;}} public partial class ServiceSubject { private int initializationVersion; public Dictionary SoundFadeTaskDic;public AsyncOperationHandle mixerHandle;public AsyncOperationHandle soundPrefabHandle; public AudioMixer mixer;public float bgmVol,fishingVol;public AudioMixerGroup bgmGroup,fishingGroup,uiGroup,voiceGroup;public AudioMixerSnapshot normal;public IDisposable lowpassEvtDisposable;public Pool poolService=new(); const string Bgm_Vol_Param_Name="bgmVol",Fishing_Vol_Param_Name="fishingVol"; AudioMixerGroup FindMixerGroup(string _) => new();void OnLowpassEffectEvt(LowpassEffectEvt _){} } public class IStageData{}public class SurveyService{}public class IConfig{public string Get(string key,string fallback)=>fallback;} public static class LoadingScreen{public static int Writes;public static void SetProgress(float _) => Writes++;} public static class Debug{public static int Warnings;public static void LogWarning(string _) => Warnings++;} public class SoundMgr{public Action Progress;public TaskCompletionSource Ready=new();public Task Init(Action progress){Progress=progress;return Ready.Task;}} namespace UnityEngine.AddressableAssets{public static class Addressables{public static AsyncOperationHandle InstantiateAsync(string _){var op=new Operation();op.Completion.SetResult(new());return new(){Op=op};}public static void ReleaseInstance(GameObject _) {}}} public class StageBase{public TaskCompletionSource StartReady=new();public TaskCompletionSource StopReady;public virtual Task StartAsync()=>StartReady.Task;public virtual Task Stop()=>StopReady?.Task??Task.CompletedTask;protected virtual void OnDestroy(){}} public partial class StageSubject{private bool stopping;public bool Destroyed,Applied,CatchCompleted;public IUserService UserService=new();private CompositeDisposable disposable=new();private IDisposable _autoRestart;public void DestroyStage(){Destroyed=true;OnDestroy();}public static bool operator ==(StageSubject a,StageSubject b)=>ReferenceEquals(a,b)||(ReferenceEquals(a,null)&&!ReferenceEquals(b,null)&&b.Destroyed)||(ReferenceEquals(b,null)&&!ReferenceEquals(a,null)&&a.Destroyed);public static bool operator !=(StageSubject a,StageSubject b)=>!(a==b);public override bool Equals(object o)=>ReferenceEquals(this,o);public override int GetHashCode()=>base.GetHashCode();}