Exemplo n.º 1
0
        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);
        }
Exemplo n.º 2
0
        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;
            }
        }
Exemplo n.º 3
0
        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);
        }
Exemplo n.º 4
0
        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 });
        }