using System.Diagnostics.Contracts; void Initialise() { int StartingTokkul = 333000; int TargetGold = 2000000000; int TransmuteTicks = 2; Ore[] ores = { new Ore("Tin", 3, 1, 2, 0), new Ore("Iron", 22, 5, 11, 1), new Ore("Coal", 58, 15, 31, 2), new Ore("Mithril", 210, 56, 113, 3), new Ore("Adamantite", 520, 140, 280, 4), new Ore("Runite", 4160, 1120, 2240, 5) }; // ores5 // ores10 // ores50 List results = new List(); for (int i=0;i {r.SellOre}"); Console.WriteLine(); if (r.TransmutationTicks > 0) { Console.WriteLine($"Ticks: {r.TransmutationTicks:n0}"); Console.WriteLine($"Seconds: {r.TransmutationSeconds:n0}"); Console.WriteLine($"Hours: {r.TransmutationHours:n0}"); Console.WriteLine(); Console.WriteLine($"Cycles: {r.BuySellCycles:n0}"); Console.WriteLine($"Buy Clicks: {r.BuyClicks:n0}"); Console.WriteLine($"Sell Clicks: {r.SellClicks:n0}"); Console.WriteLine($"Total Clicks: {r.TotalClicks:n0}"); } else { Console.WriteLine("Unprofitable"); } Console.WriteLine("-------------------------------------------"); } Console.WriteLine(); foreach (Result r in results) { if (r.TransmutationTicks > 0) { Console.WriteLine($"{r.BuyOre} --> {r.SellOre} {r.TransmutationTicks} {r.TotalClicks} {r.BuySellCycles}"); } } } Result CalculateResult(Ore BuyOre, Ore SellOre, int StartingTokkul, int TargetGold, int BoughtPerClick, int TransmuteTicks) { int BuyIndex = BuyOre.TransmutationIndex; int SellIndex = SellOre.TransmutationIndex; int Transmutes = 0; int BuySellCycles = 0; int BuyClicks = 0; int SellClicks = 0; if (BuyOre.BuyPrice > SellOre.SellPrice) { return new Result(BuyOre.Name,SellOre.Name,-1,-1,-1,-1); } Console.WriteLine("----------------------------------------------------"); Console.WriteLine(BuyOre.Name + " --> " + SellOre.Name); uint CurrentTokkul = (uint)StartingTokkul; int BuyAmount; uint GoldValue; do { BuySellCycles++; // Buy Console.WriteLine($"I have {CurrentTokkul:n0} Tokkul"); int PotentialBuy = (int)Math.Floor((double)CurrentTokkul/(double)BuyOre.BuyPrice); int OresRequired = (int)Math.Ceiling((double)TargetGold/(double)SellOre.CoinsPrice); Console.WriteLine($"I can buy {PotentialBuy:n0}, and I need {OresRequired:n0}"); BuyAmount = Math.Clamp(PotentialBuy, 0, OresRequired); Console.WriteLine($"Bought {BuyAmount:n0} {BuyOre.Name} for {BuyAmount*BuyOre.BuyPrice:n0} Tokkul"); CurrentTokkul -= (uint)BuyAmount*(uint)BuyOre.BuyPrice; Console.WriteLine($"{CurrentTokkul:n0} Tokkul Remaining"); int BuySellClicks = (int)Math.Ceiling((double)BuyAmount/(double)BoughtPerClick); BuyClicks += BuySellClicks; // Transmute Transmutes += (int)Math.Ceiling((double)BuyAmount/10f)*(SellIndex-BuyIndex); // Sell GoldValue = (uint)SellOre.CoinsPrice*(uint)BuyAmount; Console.WriteLine($"My ores are worth {GoldValue:n0}gp"); SellClicks += BuySellClicks; if (GoldValue < TargetGold) { CurrentTokkul += (uint)BuyAmount*(uint)SellOre.SellPrice; Console.WriteLine($"Sold {BuyAmount:n0} {SellOre.Name}, I now have {CurrentTokkul:n0} Tokkul"); } else { break; } Console.WriteLine($"CLICKS: Bought {BuyClicks:n0} times, Sold {SellClicks:n0} times"); if (BuyAmount <= 0) { break; } } while (GoldValue < TargetGold || BuyAmount >= 0); return new Result(BuyOre.Name, SellOre.Name, Transmutes*TransmuteTicks, BuySellCycles, BuyClicks, SellClicks); } Initialise(); class Ore { public readonly string Name; public readonly int BuyPrice; public readonly int SellPrice; public readonly int CoinsPrice; public readonly int TransmutationIndex; public Ore(string _Name, int _BuyPrice, int _SellPrice, int _CoinsPrice, int _Index) { Name = _Name; BuyPrice = _BuyPrice; SellPrice = _SellPrice; CoinsPrice = _CoinsPrice; TransmutationIndex = _Index; } } class Result { public readonly string BuyOre; public readonly string SellOre; public readonly int TransmutationTicks; public readonly double TransmutationSeconds; public readonly double TransmutationHours; public readonly int BuySellCycles; public readonly int BuyClicks; public readonly int SellClicks; public readonly int TotalClicks; public Result(string _BuyOre, string _SellOre, int _TransmutationTicks, int _BuySellCycles, int _BuyClicks, int _SellClicks) { BuyOre = _BuyOre; SellOre = _SellOre; TransmutationTicks = _TransmutationTicks; TransmutationSeconds = (double)TransmutationTicks*(double)0.6f; TransmutationHours = TransmutationSeconds/(double)3600f; BuySellCycles = _BuySellCycles; BuyClicks = _BuyClicks; SellClicks = _SellClicks; TotalClicks = BuyClicks + SellClicks; } }