Idle Mafia Macro/Source/src/Stages.cs
public override string ToString() { return "stage " + Stage + (Boss.Length > 0 ? ", " + Boss : "") + (HealthMax > 0 ? " (" + Health + " / " + HealthMax + ")" : ""); }static readonly Regex StageTitleRx = new Regex(@"^\s*STAGE\s*([0-9IlOoS|]{1,3})\s*$", RegexOptions.IgnoreCase);static readonly Regex StageTitleLooseRx = new Regex(@"^\s*[S5$][^\s\d]{2,6}\s*([0-9]{1,3})\s*$", RegexOptions.IgnoreCase);static readonly Regex StageAttackRx = new Regex(@"^\s*ATTACK\s*\(?\s*[1Il|]\s*STAMINA\s*\)?\s*$", RegexOptions.IgnoreCase);static readonly Regex StageHealthRx = new Regex(@"^\s*([0-9Oo][0-9Oo,.]*)\s*[/|Il]?\s*([0-9Oo][0-9Oo,.]*)\s*$");static readonly Regex StageDamageRx = new Regex(@"([0-9][0-9,.]*)\s*DAMAGE", RegexOptions.IgnoreCase);static readonly Regex StageHighestRx = new Regex(@"HIGHEST\s*STA[GC]E\s*([0-9IlOo]{1,3})", RegexOptions.IgnoreCase);static readonly Regex StageRowRx = new Regex(@"^\s*ST[A4][GC6]E\s*([0-9IlOoS|]{1,3})\s*$", RegexOptions.IgnoreCase);static readonly Regex StageResetRx = new Regex(@"RESETS\s*IN\s*([0-9]{1,2})\s*:\s*([0-9]{2})\s*:\s*([0-9]{2})", RegexOptions.IgnoreCase);static readonly Regex StageTokensRx = new Regex(@"([0-9OoIl][0-9OoIl,]*)\s*BOSS\s*TOKENS", RegexOptions.IgnoreCase);static readonly Regex YourStaminaRx = new Regex(@"^\s*([0-9Oo]{1,4})\s*[/|Il]?\s*([0-9Oo]{1,4})\s*STAMINA\s*$", RegexOptions.IgnoreCase);static readonly Regex YourHealthRx = new Regex(@"^\s*([0-9Oo][0-9Oo,.]{0,6})\s*[/|Il]?\s*([0-9Oo][0-9Oo,.]{0,6})\s*HEA[LIl1|]TH\s*$", RegexOptions.IgnoreCase);static readonly Regex StageLevelRx = new Regex(@"LEVEL\s*([0-9IlOo]{2,3})\b", RegexOptions.IgnoreCase);static readonly Regex StageRowLevelRx = new Regex(@"^\s*LEVEL\s*([0-9IlOo]{1,3})\s*$", RegexOptions.IgnoreCase);var spot = Rectangle.FromLTRB(area.Left, area.Top + area.Height / 10, area.Left + (int)(area.Width * 0.70), area.Top + area.Height * 35 / 100);title = red.Where(l => StageTitleRx.IsMatch(l.Text)).OrderByDescending(l => l.Box.Height).FirstOrDefault();if (title != null && int.TryParse(Parse.Digits(StageTitleRx.Match(title.Text).Groups[1].Value), out n)) break;var l2 = red.Where(l => StageTitleLooseRx.IsMatch(l.Text)).OrderByDescending(l => l.Box.Height).FirstOrDefault();if (l2 == null || !int.TryParse(StageTitleLooseRx.Match(l2.Text).Groups[1].Value, out n) || n <= 0) continue;var spot = Rectangle.Intersect(Rectangle.FromLTRB(b.X - 2 * b.Height, top, b.Right + 2 * b.Height, b.Bottom), area);var spot = Rectangle.Intersect(Rectangle.FromLTRB(d.CenterX - 13 * dh, d.Box.Y - 7 * dh, d.CenterX + 13 * dh, d.Box.Y - 4 * dh), area);foreach (var t in new[] { Tuple.Create(s + 1, Prep.None), Tuple.Create(s, Prep.WhiteText), Tuple.Create(s + 1, Prep.WhiteText), Tuple.Create(s + 2, Prep.None) })var hp = lines.Where(l => l.CenterX < mid && Parse.Key(l.Text).EndsWith("HEAITH") && Regex.IsMatch(l.Text, "[0-9]")).OrderBy(l => l.Box.Y).FirstOrDefault();var spot = Rectangle.Intersect(Rectangle.FromLTRB(hp.Box.X - 4 * hh, hp.Box.Bottom, hp.Box.Right + 4 * hh, hp.Box.Bottom + 3 * hh), area);foreach (var t in new[] { Tuple.Create(s + 1, Prep.WhiteText), Tuple.Create(s + 1, Prep.None), Tuple.Create(s + 2, Prep.WhiteText) })var m = Ocr.Read(f, spot, t.Item1, t.Item2).Select(l => YourStaminaRx.Match(l.Text)).FirstOrDefault(x => x.Success);if (m != null && int.TryParse(Parse.Digits(m.Groups[1].Value), out ya) && int.TryParse(Parse.Digits(m.Groups[2].Value), out yb) && ya <= yb)if (!m.Success || !int.TryParse(Parse.Digits(m.Groups[1].Value), out cur) || !int.TryParse(Parse.Digits(m.Groups[2].Value), out max) || max <= 0 || cur > max) return false;var title = main.Where(l => StageTitleRx.IsMatch(l.Text) && l.CenterY > area.Top + area.Height / 10).OrderByDescending(l => l.Box.Height).FirstOrDefault();if (title != null && int.TryParse(Parse.Digits(StageTitleRx.Match(title.Text).Groups[1].Value), out n)) st.Stage = n;st.StagesTab = topRow.Where(l => Parse.Key(l.Text) == "STAGES").OrderBy(l => l.Box.Y).FirstOrDefault();st.Cooldown = main.Any(l => Parse.Has(l.Text, "COOLDOWN") || Parse.Key(l.Text).StartsWith(Parse.Key("ATTACKING")));if (rm != null) st.ResetSeconds = int.Parse(rm.Groups[1].Value) * 3600 + int.Parse(rm.Groups[2].Value) * 60 + int.Parse(rm.Groups[3].Value);st.DefenseLine = main.Where(l => l.CenterX > mid && Parse.Key(l.Text).StartsWith("DEFENSE")).OrderBy(l => l.Box.Y).FirstOrDefault();var name = main.Where(l => l.Box.Bottom <= d.Box.Y && d.Box.Y - l.Box.Bottom < 14 * dh && Math.Abs(l.CenterX - d.CenterX) < 14 * dhvar health = main.Where(l => Math.Abs(l.CenterX - d.CenterX) < 14 * dh && l.Box.Bottom < d.Box.Y - 2 * dh && (name == null || l.Box.Y > name.Box.Y)var lv = main.Where(l => !Parse.Has(l.Text, "FAMILY") && (Parse.Has(l.Text, "REQUIRE") || Parse.Has(l.Text, "REACH") || Parse.Has(l.Text, "UNLOCK")))if (head != null) st.ListAt = new System.Drawing.Point(head.CenterX + head.Box.Width / 4, area.Top + (int)(area.Height * 0.62));var rows = lines.Where(l => l.CenterX >= split && StageRowRx.IsMatch(l.Text) && !StagesWordRx.IsMatch(l.Text) && (head == null || l.Box.Y > head.Box.Bottom)).ToList();var nums = rows.Select(l => { int k; return int.TryParse(Parse.Digits(StageRowRx.Match(l.Text).Groups[1].Value), out k) ? k : -1; }).Where(k => k > 0).ToList();st.Ready = lines.Where(l => l.CenterX >= split && Parse.Key(l.Text) == "READY" && (head == null || l.Box.Y > head.Box.Bottom + 2))var row = rows.Where(l => l.CenterX < r.Box.X && l.Box.Y <= r.CenterY && r.CenterY - l.CenterY < 4 * Math.Max(8, r.Box.Height))return row != null && int.TryParse(Parse.Digits(StageRowRx.Match(row.Text).Groups[1].Value), out k) ? k : -1;st.Readies = lines.Where(l => l.CenterX >= split && Parse.Key(l.Text) == "READY" && (head == null || l.Box.Y > head.Box.Bottom + 2))st.ListSig = string.Join("|", lines.Where(l => l.CenterX >= split && (head == null || l.Box.Y > head.Box.Bottom)).OrderBy(l => l.Box.Y).Select(l => l.Text.Trim() + "@" + l.Box.Y / 8));var ys = main.Where(l => l.CenterX < mid).Select(l => YourStaminaRx.Match(l.Text)).FirstOrDefault(m => m.Success);if (ys != null && int.TryParse(Parse.Digits(ys.Groups[1].Value), out ya) && int.TryParse(Parse.Digits(ys.Groups[2].Value), out yb) && ya <= yb)var yh = main.Where(l => l.CenterX < mid).Select(l => YourHealthRx.Match(l.Text)).FirstOrDefault(m => m.Success);if (yh != null && int.TryParse(Parse.Digits(yh.Groups[1].Value), out ya) && int.TryParse(Parse.Digits(yh.Groups[2].Value), out yb) && yb > 0 && ya <= yb)st.Said = string.Join(" | ", main.Where(l => l.CenterY > area.Top + area.Height / 10).Select(l => l.Text.Trim()));var top = lines.Where(l => StageRowLevelRx.IsMatch(l.Text) && l.Box.Y > st.ListTop).OrderBy(l => l.Box.Y).FirstOrDefault();if (int.TryParse(Parse.Digits(StageRowLevelRx.Match(top.Text).Groups[1].Value), out n) && n > 0) { st.Locked = top; st.LockedLevel = n; }return !Regex.IsMatch(text, @"\bLEVEL\b", RegexOptions.IgnoreCase) && Regex.Matches(text, "[A-Z]").Count <= Regex.Matches(text, "[a-z]").Count;public void StageAttack(BossStage st) { if (st != null && st.Attack != null && StageAttackRx.IsMatch(st.Attack.Text)) Press(st.Attack, 300); }public void StageNext(BossStage st) { if (st != null && st.Next != null && Parse.Key(st.Next.Text) == "NEXT") Press(st.Next, 1200); }public void StageReady(BossStage st) { if (st != null && st.Ready != null && Parse.Key(st.Ready.Text) == "READY") Press(st.Ready, 1200); }public void StageReady(OcrLine ready) { if (ready != null && Parse.Key(ready.Text) == "READY") Press(ready, 1200); }public void StagesListScroll(BossStage st, int notches) { if (st != null && !st.ListAt.IsEmpty) Scroll(st.ListAt.X, st.ListAt.Y, notches); }