namespace Supercell.Laser.Logic.Command.Home { using System.Linq; using Supercell.Laser.Logic.Data; using Supercell.Laser.Logic.Data.Helper; using Supercell.Laser.Logic.Home; using Supercell.Laser.Titan.DataStream; using Supercell.Laser.Titan.Debug; public class LogicPurchaseBrawlPassProgressCommand : Command { public int Unknown { get; set; } public override void Decode(ByteStream stream) { base.Decode(stream); Unknown = stream.ReadVInt(); } public override int Execute(HomeMode homeMode) { int before = homeMode.Home.BrawlPassTokens; // Find the milestone that contains current tokens OR the next one ahead var milestones = DataTables.Get(DataType.Milestone) .GetDatas() .OfType() .Where(m => m != null && m.Progress > 0) .OrderBy(m => m.ProgressStart) .ToList(); // Find current milestone (the one we're inside right now) MilestoneData current = milestones.LastOrDefault(m => m.ProgressStart <= before); if (current == null) { Debugger.Print($"[BrawlPass] No milestone found for tokens={before}"); return 0; } int target = current.ProgressStart + current.Progress; // If already at or past end of current milestone, advance to next if (before >= target) { MilestoneData next = milestones.FirstOrDefault(m => m.ProgressStart >= target); if (next == null) { Debugger.Print($"[BrawlPass] Already at max milestone, tokens={before}"); return 0; } target = next.ProgressStart + next.Progress; } if (!homeMode.Avatar.UseDiamonds(30)) { Debugger.Print($"[BrawlPass] Not enough diamonds for {homeMode.Avatar.Name}#{homeMode.Avatar.AccountId}"); return -1; } homeMode.Home.BrawlPassTokens = target; Debugger.Print($"[BrawlPass] {homeMode.Avatar.Name}#{homeMode.Avatar.AccountId}: {before} -> {target} (milestone {current.Name}, +{target - before} tokens, -30 gems)"); return 0; } public override int GetCommandType() => 536; } }