using System;using System.Threading.Tasks;using game.PlayerDataStorage; var panel=new ActualPanel();panel.Run();panel.Run(); if(panel.Applied!=1)throw new Exception("duplicate applies rewards"); if(panel.canvasGroup.alpha!=0)throw new Exception("pending reward already visible"); bool pendingBlocked=panel.canvasGroup.blocksRaycasts==false && panel.canvasGroup.interactable==false; PlayerKVGameplayLoop.Pending.SetResult(true);await Task.Delay(25); bool presented=panel.canvasGroup.alpha==1 && PlayerKVGameplayLoop.Shows==1; bool interactRestored=panel.canvasGroup.blocksRaycasts && panel.canvasGroup.interactable; var s2=new ActualPanel();s2.StartTail();bool kvListener=s2.playButton.onClick.Count==1 && !s2.NonKvOnly; s2.playButton.onClick.Invoke();bool kvClick=s2.HomeClicks==1; PlayerKVGameplayLoop.Enabled=false;var s3=new ActualPanel();s3.StartTail();bool pfListener=s3.playButton.onClick.Count==1 && s3.NonKvOnly; bool ok=presented && interactRestored && kvListener && kvClick && pfListener && pendingBlocked; Console.WriteLine($"{(ok?"PASS":"FAIL")} presentation restores interaction; KV listener registered; raycasts={panel.canvasGroup.blocksRaycasts}, kvListener={kvListener}, pfListener={pfListener}");return ok?0:1; public class Canvas {public float alpha;public bool blocksRaycasts,interactable;} public class ButtonEvent{System.Action h;public int Count=>h==null?0:1;public void AddListener(System.Action a)=>h+=a;public void Invoke()=>h?.Invoke();} public class Button{public ButtonEvent onClick=new();} public class Fish {public void SaveCaughtFishForKVLoop(int id){}} public class Player {public PlayerKVEditResult SaveFishingRewardForKVLoop()=>new();} namespace game.PlayerDataStorage { public class PlayerKVEditResult{} public static class PlayerKVGameplayLoop { public class FishingRewardAction{} public static bool Enabled=true;static FishingRewardAction action;public static int Shows;public static TaskCompletionSource Pending=new(); public static FishingRewardAction BindRewardPanel(object p) {if(action!=null)return null;return action=new();} public static bool RewardPanelCurrent(FishingRewardAction a,object p)=>a!=null && ReferenceEquals(a,action); public static IDisposable BeginRewardSegment(string name)=>new Scope(); public static Task ConfirmRewardAsync(FishingRewardAction a,PlayerKVEditResult p)=>Pending.Task; public static void PresentReward(FishingRewardAction a,Action show){Shows++;show();} public static void Fault(string message)=>throw new Exception(message); class Scope:IDisposable{public void Dispose(){}} }}