private void DoTroopsBack() { string data = UpCall.PageQuery(VillageID, "build.php?gid=16&tt=1"); if (data == null) { MinimumDelay = 0; return; } Match m = Regex.Match(data, "<a href=\"karte\\.php\\?d=" + tpEvadePoint.Z + "\">[^<]*?</a>" + ".*?onclick=\"window\\.location\\.href = \'([^\']*?)\'", RegexOptions.Singleline); if (!m.Success) { evade_status = EvadeStatus.NoAtkDetected; MinimumDelay = nMinInterval; return; } string url = m.Groups[1].Value.Replace("amp;", ""); data = UpCall.PageQuery(VillageID, url); if (data == null) { MinimumDelay = 0; return; } MatchCollection mc = Regex.Matches(data, "<input type=\"hidden\" name=\"([^\"]*?)\" value=\"([^\"]*?)\">"); Dictionary<string, string> postData = new Dictionary<string, string>(); foreach (Match m1 in mc) { postData.Add(m1.Groups[1].Value, m1.Groups[2].Value); } for (int i = 0; i < ReinforceToop.Length; i++) { if (ReinforceToop[i] == 0) continue; string troopKey = String.Format("t[{0}]", i + 1); string troopNumber = ReinforceToop[i].ToString(); postData.Add(troopKey, troopNumber); } postData.Add("s1", "ok"); UpCall.PageQuery(VillageID, "build.php", postData); evade_status = EvadeStatus.TroopsBack; MinimumDelay = ReinforceTimeCost + RandomDelay(5, 10); }
private void CheckAttack() { var CV = UpCall.TD.Villages[VillageID]; UpCall.PageQuery(VillageID, "build.php?gid=16&tt=1"); latest_toop = null; foreach (TTInfo tt in CV.Troop.Troops) { AnalizeAttacker(tt); } if (latest_toop != null) { int latest_atk_delay = (int)latest_toop.FinishTime.Subtract(DateTime.Now).TotalSeconds; if (latest_atk_delay > nMinInterval + nLeadTime) { MinimumDelay = nMinInterval; evade_status = EvadeStatus.AtkDetected; } else if (latest_atk_delay > nLeadTime && latest_atk_delay <= nMinInterval + nLeadTime) { MinimumDelay = latest_atk_delay - nLeadTime; evade_status = EvadeStatus.ReadyForEvade; } else if (latest_atk_delay > 0 && latest_atk_delay <= nLeadTime) { MinimumDelay = 0; evade_status = EvadeStatus.ReadyForEvade; } else { UpCall.DebugLog("由于出现异常,重置回避攻击检查队列。", DebugLevel.II); latest_toop = null; MinimumDelay = nMinInterval; evade_status = EvadeStatus.NoAtkDetected; } } else { MinimumDelay = nMinInterval; evade_status = EvadeStatus.NoAtkDetected; } }
private void DoEvade() { string sendTroopsUrl = String.Format("build.php?id=39&tt=2&z={0}", tpEvadePoint.Z); string sendTroopForm = UpCall.PageQuery(VillageID, sendTroopsUrl); if (sendTroopForm == null || !sendTroopForm.Contains("<form method=\"POST\" name=\"snd\" action=\"build.php?id=39&tt=2\">")) { MinimumDelay = 0; return; } Dictionary<string, string> postData = RaidQueue.GetHiddenInputValues(sendTroopForm); postData.Add("c", "2"); postData.Add("x", tpEvadePoint.X.ToString()); postData.Add("y", tpEvadePoint.Y.ToString()); ReinforceToop = RaidQueue.GetMaxTroops(sendTroopForm); for (int i = 0; i < this.bTroopFilter.Length; i++) { if (bTroopFilter[i]) continue; ReinforceToop[i] = 0; } for (int i = 0; i < ReinforceToop.Length; i++) { string troopKey = String.Format("t{0}", i + 1); string troopNumber = ReinforceToop[i] == 0 ? "" : ReinforceToop[i].ToString(); postData.Add(troopKey, troopNumber); } string confirmUrl = "build.php?id=39&tt=2"; string confirmForm = UpCall.PageQuery(this.VillageID, confirmUrl, postData); if (confirmForm == null) { MinimumDelay = 0; return; } Match errorMatch = Regex.Match(confirmForm, "<p class=\"error\">(.+)</span>"); if (errorMatch.Success) { string error = String.Format( "Delete village {0}. Error: {1}", tpEvadePoint, errorMatch.Groups[1].Value); UpCall.DebugLog("部队未能发出,因为:" + error, DebugLevel.W); MinimumDelay = nMinInterval; return; } if (!confirmForm.Contains("<form method=\"post\" action=\"build.php?id=39&tt=2\">")) { MinimumDelay = 0; return; } TimeSpan timeCost = RaidQueue.GetOneWayTimeCost(confirmForm); if (timeCost == TimeSpan.MinValue) { MinimumDelay = nMinInterval; evade_status = EvadeStatus.NoAtkDetected; return; } postData = RaidQueue.GetHiddenInputValues(confirmForm); string result = this.UpCall.PageQuery(this.VillageID, confirmUrl, postData); if (result == null) { MinimumDelay = 0; return; } evade_status = EvadeStatus.Evaded; ReinforceTimeCost = (int)timeCost.TotalSeconds; MinimumDelay = ReinforceTimeCost + RandomDelay(5, 10); TTInfo troopInfo = new TTInfo() { Tribe = UpCall.TD.Tribe, Troops = ReinforceToop }; string message = String.Format( "部队回避 {0} ({1}) => {2} {3}", this.UpCall.TD.Villages[this.VillageID].Coord, this.VillageID, this.tpEvadePoint, troopInfo.FriendlyName); this.UpCall.DebugLog(message, DebugLevel.I); }
public void Action() { // 当前时刻还未到唤醒时刻 if (MinimumDelay > 0) return; if (evade_status == EvadeStatus.NoAtkDetected || evade_status == EvadeStatus.AtkDetected || evade_status == EvadeStatus.TroopsBack) { CheckAttack(); } else if (evade_status == EvadeStatus.ReadyForEvade) { DoEvade(); } else if (evade_status == EvadeStatus.Evaded || evade_status == EvadeStatus.ReadyForBack) { evade_status = EvadeStatus.ReadyForBack; DoTroopsBack(); } else { evade_status = EvadeStatus.NoAtkDetected; MinimumDelay = nMinInterval; } UpCall.TD.Dirty = true; UpCall.CallStatusUpdate(this, new Travian.StatusChanged() { ChangedData = Travian.ChangedType.Queue, VillageID = VillageID }); }