from pathlib import Path import json r=Path(__file__).parent before=(r/'before/FishingRewardPanel.cs').read_text(encoding='utf-8-sig') current=Path('Client/Assets/Scripts/UI/FishingReward/FishingRewardPanel.cs').read_text(encoding='utf-8-sig') def method(src,signature): start=src.index(signature);a=src.index('{',start);depth=1;i=a+1 while depth: depth += (src[i]=='{')-(src[i]=='}');i+=1 return src[start:i] def block(src): start=src.index('DropPackageList dropPackageList =');end=src.index(' add = cash;',start) return src[start:end] def formula(src,name): return 'public class '+name+' : FormulaBase { public int Run(){'+block(src)+'return cash;}'+method(src,'float SetProficiency(')+'}\n' text='''using System; foreach(var c in new[]{(10f,0.25f,10,0.5f,0.5f,0.2f,0.1f,122),(0f,0.25f,10,0.5f,0.5f,0.2f,0.1f,0),(10f,0f,1,1f,0f,0f,0f,10),(1f,0f,1,0.5f,0f,0f,0f,0)}){ var old=new OldFormula();var next=new NewFormula(); foreach(var x in new FormulaBase[]{old,next}){x._tables.TbDrop[0].DropList.DropCountList[1]=c.Item1;x.pointBonus=c.Item2;x.Magnification=c.Item3;x.fishingData.random=c.Item4;x.fishingData.WeightIncEvent=c.Item5;x.playerData.benefitsCashMag=c.Item6;GContext.container.Buff.Gold=c.Item7;} int a=old.Run(),b=next.Run();if(a!=c.Item8||b!=a)throw new Exception($"Formula {a}/{b} expected {c.Item8}");Console.WriteLine($"PASS original/current cash={b}"); } public class FormulaBase {public Tables _tables=new();public Fishing fishingData=new();public Player playerData=new();public float pointBonus,extraPointEvent;public int Magnification;protected float _fishScore;protected Text text_gold_num=new(),text_num_buff=new();} public class Tables {public Drop[] TbDrop={new()};}public class Drop{public DropPackageList DropList=new();}public class DropPackageList {public float[] DropCountList={20,10};} public class Fishing{public Fish curFishData=new(),fishItem=new();public float random,fishWeight,WeightIncEvent;public int MapId;public bool IsNewItemFish()=>false;} public class Fish{public int DropID,ID,Quality=2;}public class Player{public float benefitsCashMag,benefitsEventFishCashMag;} public class CollectingData{public float ExtraCashDrop()=>0;}public class BuffDataCenter{public float Gold;public float GetExtraGoldBuffValue(int m,int q)=>Gold;} public class FishingChallengeManager{public void AddScoreByQuality(int a,float b,int c){}} public class Container{public BuffDataCenter Buff=new();public T Resolve() where T:new()=>typeof(T)==typeof(BuffDataCenter)?(T)(object)Buff:new T();} public static class GContext{public static Container container=new();}public class Text{public Color color;}public struct Color{public static Color black,white;} public static class Mathf{public static int RoundToInt(float x)=>(int)MathF.Round(x,MidpointRounding.ToEven);} ''' (r/'FormulaTests.cs.txt').write_text(text+formula(before,'OldFormula')+formula(current,'NewFormula'),encoding='utf-8') (r/'FormulaTests.csproj').write_text('''Exenet9.0false$(MSBuildThisFileDirectory)../MinimalLoginTests/NuGet.Config''',encoding='utf-8') (r/'formula-source-check.json').write_text(json.dumps({'cashBlockUnchanged':block(before)==block(current),'proficiencyUnchanged':method(before,'float SetProficiency(')==method(current,'float SetProficiency('),'fishWeightUnchanged':method(before,'void SetFishWeight(')==method(current,'void SetFishWeight(')},indent=2))